Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
56 f9daq 1
/*CMZ :          23/02/2008  09.47.19  by  Samo Korpar*/
2
/*CMZ :  0.02/00 04/07/2001  00.38.08  by  Samo Korpar*/
3
/*CMZ :  0.01/00 30/11/99  16.50.35  by  Samo Korpar*/
4
/*-- Author :    Samo Korpar   18/10/99*/
5
#include <stdlib.h>
6
#include <stdio.h>
7
#include <stdint.h>
8
#include <string.h>
9
#include <time.h>
10
 
11
 
12
/*KEEP,evdp,T=C++.*/
13
#include "evdp.h"
14
/*KEND.*/
15
 
16
#define swap_4(x) swap_long((int32_t *) x)
17
#define swap_2(x) swap_short((short *) x)
18
 
19
 
20
int isLE, isLOG;
21
char datafilename[300];
22
 
23
EVT_DATA evdata;
24
#define EVT_DATA_SIZE (sizeof(EVT_DATA))
25
LOG_header logh;
26
EVT_header evh;
27
EVT_trailer evt;
28
FILE *evfid;
29
FILE *oldfid;
30
 
31
int is_little_endian()
32
{
33
  int test=1;
34
 
35
  isLE = (int) *((char *) &test);
36
  return isLE;
37
}
38
 
39
void swap_short(short *shtosw)
40
{
41
  short stmp;
42
  char *b1 = (char *) shtosw, *b2 = (char *) &stmp;
43
 
44
  stmp=*shtosw;
45
  b1[0]=b2[1];
46
  b1[1]=b2[0];
47
  return;
48
}
49
 
50
void swap_long(int32_t *lotosw)
51
{
52
  int32_t ltmp;
53
  char *b1 = (char *) lotosw, *b2 = (char *) &ltmp;
54
 
55
  ltmp=*lotosw;
56
  b1[0]=b2[3];
57
  b1[1]=b2[2];
58
  b1[2]=b2[1];
59
  b1[3]=b2[0];
60
  return;
61
}
62
 
63
int open_data_file(char *dfn)
64
{
65
  if (dfn != NULL)
66
  {
67
    strcpy(datafilename, dfn);
68
    isLOG=0;
69
    if (strstr(datafilename, ".daq")!=NULL) isLOG=1;
70
  }
71
 
72
    if ((evfid=fopen(datafilename, "r"))==NULL) return 1;
73
  return 0;
74
}
75
 
76
int close_data_file()
77
{
78
    if (fclose(evfid)==EOF) return 1;
79
  return 0;
80
}
81
 
82
int reopen_data_file()
83
{
84
  {
85
    oldfid=evfid;
86
  }
87
  if (open_data_file((char *) NULL)) return 1;
88
  return 0;
89
}
90
 
91
int reclose_data_file()
92
{
93
  if (close_data_file()) return 1;
94
  {
95
    evfid=oldfid;
96
  }
97
  return 0;
98
}
99
 
100
int next_buf(int len, void *to)
101
{
102
      if (fread( to, 1, len, evfid) != len) return -1;
103
  return len;
104
}
105
 
106
int skip_buf(int len)
107
{
108
            if (fseek(evfid, len, SEEK_CUR)) return -1;
109
  return len;
110
}
111
 
112
int goto_event(int evgoto)
113
{
114
  int pos, fpos, bc;
115
 
116
  pos=0;
117
    rewind(evfid);
118
  while ( ++pos != evgoto )
119
  {
120
      if (fread((void *) &bc, 1, 4, evfid) == 4)
121
        {
122
        if (isLE) swap_4(&bc);
123
        if (fseek(evfid, bc-4, SEEK_CUR)) return pos-1;
124
        }
125
  }
126
  return pos;
127
}
128
 
129
int get_nextev(FED_record *fdrp, unsigned short cid, int prmes)
130
{
131
  int nr,i;
132
 
133
  SLB_header slbh;
134
  SLB_trailer slbt;
135
 
136
  nr=0;
137
  if (isLOG)
138
    {
139
    if (next_buf(20, (void *) &logh) != 20) return 0;
140
    if (isLE)
141
      {
142
      swap_4(&logh.bc);
143
      swap_4(&logh.exp);
144
      swap_4(&logh.run);
145
      swap_4(&logh.evt);
146
      swap_4(&logh.dtm);
147
      }
148
    }
149
  if (next_buf(20, (void *) &evh) != 20) return 0;
150
  if (isLE)
151
    {
152
    swap_4(&evh.bc);
153
    swap_2(&evh.recid);
154
    swap_2(&evh.sp);
155
    swap_4(&evh.slt);
156
    swap_4(&evh.cm);
157
    swap_4(&evh.em);
158
    }
159
  if (prmes)
160
    printf("EVT: bc=%u, recid=0x%X, sp=0x%X, slt=%u, cm=0x%X, em=0x%X\n",
161
             evh.bc, evh.recid, evh.sp, evh.slt, evh.cm, evh.em);
162
  evh.bc-=20;
163
  while (evh.bc>4)
164
  {
165
    if (next_buf(16, (void *) &slbh) != 16) return 0;
166
    if (isLE)
167
    {
168
      swap_4(&slbh.bc);
169
      swap_2(&slbh.recid);
170
      swap_2(&slbh.fltev);
171
      swap_2(&slbh.compid);
172
      swap_2(&slbh.slbn);
173
      swap_4(&slbh.dest);
174
    }
175
    if (prmes)
176
      printf("  >SLB bc=%u, recid=0x%X, fltev=%d,"
177
             " compid=0x%X, slbn=%d, dest=0x%X\n", slbh.bc, slbh.recid,
178
             slbh.fltev, slbh.compid, slbh.slbn, slbh.dest);
179
    evh.bc-=slbh.bc;
180
    slbh.bc-=16;
181
 
182
    if (slbh.compid==0)
183
    {
184
      if (next_buf(EVT_DATA_SIZE, (void *) &evdata) != EVT_DATA_SIZE) return 0;
185
      slbh.bc-=EVT_DATA_SIZE;
186
      if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0;
187
      if (isLE)
188
      {
189
        swap_4(&evdata.run_number);
190
        swap_4(&evdata.event_time);
191
        swap_4(&evdata.event_status);
192
        swap_4(&evdata.flt_status);
193
        swap_4(&evdata.slp_node);
194
        swap_4(&evdata.slt_status);
195
        swap_4(&evdata.exp_number);
196
        swap_4(&evdata.farm_node);
197
        swap_4(&evdata.BX_long);
198
        swap_2(&evdata.BX_upper);
199
        swap_2(&evdata.FCS_tcode);
200
        swap_2(&evdata.physBX);
201
        swap_2(&evdata.FLT_BX);
202
        swap_2(&evdata.fltevt);
203
      }
204
    }
205
     else if (slbh.compid==cid)
206
    {
207
      while (slbh.bc>4)
208
      {
209
        if (next_buf(8, (void *) fdrp) != 8) return 0;
210
        if (isLE)
211
        {
212
          swap_2(&fdrp->bc);
213
          swap_2(&fdrp->fedid);
214
          swap_2(&fdrp->recid);
215
          swap_2(&fdrp->bxn);
216
        }
217
        if (prmes)
218
          printf("    >FED bc=%d, fedid=0x%X, recid=0x%X, bxn=%d\n",
219
                 fdrp->bc, fdrp->fedid, fdrp->recid, fdrp->bxn);
220
        slbh.bc-=fdrp->bc;
221
        fdrp->bc-=8;
222
        if (0x8000&fdrp->recid)
223
          {
224
          if (skip_buf(fdrp->bc) != fdrp->bc) return 0;
225
          }
226
         else
227
          {
228
          if (next_buf(fdrp->bc, (void *) fdrp->data) != fdrp->bc) return 0;
229
          nr++;
230
          fdrp++;
231
          }
232
 
233
/*        fdrp->bc-=8;
234
        switch (fdrp->recid)
235
        {
236
         case 0x1002:
237
          if (next_buf(128, (void *) fdrp->data) != 128) return 0;
238
          nr++;
239
          fdrp++;
240
          break;
241
         case 0x100a:
242
          if (next_buf(fdrp->bc, (void *) fdr.data) != fdrp->bc) return 0;
243
          memset((void *) fdrp->data, 0xff, 128);
244
          for (i=0;i<fdrp->bc;i+=2)
245
            fdrp->data[fdr.data[i]]=fdr.data[i+1];
246
          nr++;
247
          fdrp++;
248
          break;
249
         default:
250
          if (skip_buf(fdrp->bc) != fdrp->bc) return 0;
251
        }
252
*/
253
      }
254
    }
255
     else if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0;
256
 
257
/*
258
       else if (cid==0x400)
259
      {
260
      if (prmes)
261
      {
262
        while (slbh.bc>4)
263
        {
264
          if (next_buf(8, (void *) &fdr) != 8) return 0;
265
          if (isLE)
266
          {
267
            swap_2(&fdr.bc);
268
            swap_2(&fdr.fedid);
269
            swap_2(&fdr.recid);
270
            swap_2(&fdr.bxn);
271
          }
272
          otfid[nf]=fdr.fedid;
273
          printf("    >FED%d bc=%d, fedid=0x%X, recid=0x%X, bxn=%d",
274
                 ++nf, fdr.bc, fdr.fedid, fdr.recid, fdr.bxn);
275
          slbh.bc-=fdr.bc;
276
          fdr.bc-=8;
277
          if (next_buf(fdr.bc, (void *) fdr.data) != fdr.bc) return 0;
278
          for (i=0;i<fdr.bc;i+=4)
279
          {
280
            if (! (i%16)) printf("\n");
281
            printf("0x%02X 0x%02X 0x%02X 0x%02X ",
282
                   fdr.data[i], fdr.data[i+1], fdr.data[i+2], fdr.data[i+3]);
283
          }
284
          printf("\n");
285
        }
286
      }
287
       else
288
      {
289
        if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0;
290
      }
291
      }
292
       else if (cid==0x600)
293
      {
294
      if (prmes)
295
      {
296
        while (slbh.bc>4)
297
        {
298
          if (next_buf(8, (void *) &fdr) != 8) return 0;
299
          if (isLE)
300
          {
301
            swap_2(&fdr.bc);
302
            swap_2(&fdr.fedid);
303
            swap_2(&fdr.recid);
304
            swap_2(&fdr.bxn);
305
          }
306
            printf("    >FED bc=%d, fedid=0x%X, recid=0x%X, bxn=%d\n",
307
                   fdr.bc, fdr.fedid, fdr.recid, fdr.bxn);
308
          slbh.bc-=fdr.bc;
309
          fdr.bc-=8;
310
          if (skip_buf(fdr.bc) != fdr.bc ) return 0;
311
        }
312
      }
313
       else
314
      {
315
        if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0;
316
      }
317
*/
318
 
319
    if (next_buf( 4, (void *) &slbt) != 4) return 0;
320
    if (isLE)
321
      {
322
      swap_2(&slbt.recid);
323
      swap_2(&slbt.fltev);
324
      }
325
    if (prmes)
326
      printf("  >SLB recid=0x%X, fltev=%d\n", slbt.recid, slbt.fltev);
327
  }
328
  if (next_buf( 4, (void *) &evt) != 4) return 0;
329
  if (isLE) swap_4(&evt.slt);
330
  if (prmes)
331
  {
332
    printf("EVT: slt=%u, tcode=0x%x, flt_status=0x%x\n",
333
            evh.slt, evdata.FCS_tcode, evdata.flt_status);
334
  }
335
  if (prmes && isLOG)
336
    printf("LOG: bc=%u, exp=%u, run=%u, evt=%u, dtm=%s",
337
           logh.bc, logh.exp, logh.run, logh.evt, ctime((time_t *)&logh.dtm));
338
  return nr;
339
}
340
 
341
int dump_cmp(FILE *fout, unsigned short cid)
342
{
343
  int pos;
344
  int evbc, slbbc, compid;
345
  char evbf[10000];
346
 
347
  LOG_header *loghb;
348
  EVT_header *evhb;
349
 
350
  SLB_header *slbh;
351
 
352
 
353
  if (isLOG)
354
    {
355
    if (skip_buf(20) != 20) return 0;
356
    }
357
 
358
  pos=0;
359
  evhb=(EVT_header *) &evbf[pos];
360
  if (next_buf(20, (void *) evhb) != 20) return 0;
361
  pos+=20;
362
  evbc=evhb->bc;
363
  if (isLE) swap_4(&evbc);
364
  evbc-=20;
365
 
366
  while (evbc>4)
367
  {
368
    slbh=(SLB_header *) &evbf[pos];
369
    if (next_buf(16, (void *) slbh) != 16) return 0;
370
    slbbc=slbh->bc;
371
    compid=slbh->compid;
372
    if (isLE)
373
    {
374
      swap_4(&slbbc);
375
      swap_2(&compid);
376
    }
377
    evbc-=slbbc;
378
    slbbc-=16;
379
 
380
    if ((compid==cid)||(compid==0x0))
381
    {
382
      pos+=16;
383
      if (next_buf(slbbc, (void *) &evbf[pos]) != slbbc) return 0;
384
      pos+=slbbc;
385
    }
386
     else
387
    {
388
      if (skip_buf(slbbc) != slbbc) return 0;
389
    }
390
  }
391
 
392
  if (next_buf( 4, (void *) &evbf[pos]) != 4) return 0;
393
  pos+=4;
394
  evhb->bc=pos;
395
  if (isLE) swap_4(&evhb->bc);
396
  if (fwrite((void *) evbf, 1, pos, fout) != pos) return 0;
397
  return 1;
398
}