Blame |
Last modification |
View Log
| RSS feed
/*CMZ : 23/02/2008 09.47.19 by Samo Korpar*/
/*CMZ : 0.02/00 04/07/2001 00.38.08 by Samo Korpar*/
/*CMZ : 0.01/00 30/11/99 16.50.35 by Samo Korpar*/
/*-- Author : Samo Korpar 18/10/99*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
/*KEEP,evdp,T=C++.*/
#include "evdp.h"
/*KEND.*/
#define swap_4(x) swap_long((int32_t *) x)
#define swap_2(x) swap_short((short *) x)
int isLE
, isLOG
;
char datafilename
[300];
EVT_DATA evdata
;
#define EVT_DATA_SIZE (sizeof(EVT_DATA))
LOG_header logh
;
EVT_header evh
;
EVT_trailer evt
;
FILE
*evfid
;
FILE
*oldfid
;
int is_little_endian
()
{
int test
=1;
isLE
= (int) *((char *) &test
);
return isLE
;
}
void swap_short
(short *shtosw
)
{
short stmp
;
char *b1
= (char *) shtosw
, *b2
= (char *) &stmp
;
stmp
=*shtosw
;
b1
[0]=b2
[1];
b1
[1]=b2
[0];
return;
}
void swap_long
(int32_t *lotosw
)
{
int32_t ltmp
;
char *b1
= (char *) lotosw
, *b2
= (char *) <mp
;
ltmp
=*lotosw
;
b1
[0]=b2
[3];
b1
[1]=b2
[2];
b1
[2]=b2
[1];
b1
[3]=b2
[0];
return;
}
int open_data_file
(char *dfn
)
{
if (dfn
!= NULL
)
{
strcpy(datafilename
, dfn
);
isLOG
=0;
if (strstr(datafilename
, ".daq")!=NULL
) isLOG
=1;
}
if ((evfid
=fopen(datafilename
, "r"))==NULL
) return 1;
return 0;
}
int close_data_file
()
{
if (fclose(evfid
)==EOF
) return 1;
return 0;
}
int reopen_data_file
()
{
{
oldfid
=evfid
;
}
if (open_data_file
((char *) NULL
)) return 1;
return 0;
}
int reclose_data_file
()
{
if (close_data_file
()) return 1;
{
evfid
=oldfid
;
}
return 0;
}
int next_buf
(int len
, void *to
)
{
if (fread( to
, 1, len
, evfid
) != len
) return -1;
return len
;
}
int skip_buf
(int len
)
{
if (fseek(evfid
, len
, SEEK_CUR
)) return -1;
return len
;
}
int goto_event
(int evgoto
)
{
int pos
, fpos
, bc
;
pos
=0;
rewind(evfid
);
while ( ++pos
!= evgoto
)
{
if (fread((void *) &bc
, 1, 4, evfid
) == 4)
{
if (isLE
) swap_4
(&bc
);
if (fseek(evfid
, bc
-4, SEEK_CUR
)) return pos
-1;
}
}
return pos
;
}
int get_nextev
(FED_record
*fdrp
, unsigned short cid
, int prmes
)
{
int nr
,i
;
SLB_header slbh
;
SLB_trailer slbt
;
nr
=0;
if (isLOG
)
{
if (next_buf
(20, (void *) &logh
) != 20) return 0;
if (isLE
)
{
swap_4
(&logh.
bc);
swap_4
(&logh.
exp);
swap_4
(&logh.
run);
swap_4
(&logh.
evt);
swap_4
(&logh.
dtm);
}
}
if (next_buf
(20, (void *) &evh
) != 20) return 0;
if (isLE
)
{
swap_4
(&evh.
bc);
swap_2
(&evh.
recid);
swap_2
(&evh.
sp);
swap_4
(&evh.
slt);
swap_4
(&evh.
cm);
swap_4
(&evh.
em);
}
if (prmes
)
printf("EVT: bc=%u, recid=0x%X, sp=0x%X, slt=%u, cm=0x%X, em=0x%X\n",
evh.
bc, evh.
recid, evh.
sp, evh.
slt, evh.
cm, evh.
em);
evh.
bc-=20;
while (evh.
bc>4)
{
if (next_buf
(16, (void *) &slbh
) != 16) return 0;
if (isLE
)
{
swap_4
(&slbh.
bc);
swap_2
(&slbh.
recid);
swap_2
(&slbh.
fltev);
swap_2
(&slbh.
compid);
swap_2
(&slbh.
slbn);
swap_4
(&slbh.
dest);
}
if (prmes
)
printf(" >SLB bc=%u, recid=0x%X, fltev=%d,"
" compid=0x%X, slbn=%d, dest=0x%X\n", slbh.
bc, slbh.
recid,
slbh.
fltev, slbh.
compid, slbh.
slbn, slbh.
dest);
evh.
bc-=slbh.
bc;
slbh.
bc-=16;
if (slbh.
compid==0)
{
if (next_buf
(EVT_DATA_SIZE
, (void *) &evdata
) != EVT_DATA_SIZE
) return 0;
slbh.
bc-=EVT_DATA_SIZE
;
if (skip_buf
(slbh.
bc-4) != slbh.
bc-4 ) return 0;
if (isLE
)
{
swap_4
(&evdata.
run_number);
swap_4
(&evdata.
event_time);
swap_4
(&evdata.
event_status);
swap_4
(&evdata.
flt_status);
swap_4
(&evdata.
slp_node);
swap_4
(&evdata.
slt_status);
swap_4
(&evdata.
exp_number);
swap_4
(&evdata.
farm_node);
swap_4
(&evdata.
BX_long);
swap_2
(&evdata.
BX_upper);
swap_2
(&evdata.
FCS_tcode);
swap_2
(&evdata.
physBX);
swap_2
(&evdata.
FLT_BX);
swap_2
(&evdata.
fltevt);
}
}
else if (slbh.
compid==cid
)
{
while (slbh.
bc>4)
{
if (next_buf
(8, (void *) fdrp
) != 8) return 0;
if (isLE
)
{
swap_2
(&fdrp
->bc
);
swap_2
(&fdrp
->fedid
);
swap_2
(&fdrp
->recid
);
swap_2
(&fdrp
->bxn
);
}
if (prmes
)
printf(" >FED bc=%d, fedid=0x%X, recid=0x%X, bxn=%d\n",
fdrp
->bc
, fdrp
->fedid
, fdrp
->recid
, fdrp
->bxn
);
slbh.
bc-=fdrp
->bc
;
fdrp
->bc
-=8;
if (0x8000&fdrp
->recid
)
{
if (skip_buf
(fdrp
->bc
) != fdrp
->bc
) return 0;
}
else
{
if (next_buf
(fdrp
->bc
, (void *) fdrp
->data
) != fdrp
->bc
) return 0;
nr
++;
fdrp
++;
}
/* fdrp->bc-=8;
switch (fdrp->recid)
{
case 0x1002:
if (next_buf(128, (void *) fdrp->data) != 128) return 0;
nr++;
fdrp++;
break;
case 0x100a:
if (next_buf(fdrp->bc, (void *) fdr.data) != fdrp->bc) return 0;
memset((void *) fdrp->data, 0xff, 128);
for (i=0;i<fdrp->bc;i+=2)
fdrp->data[fdr.data[i]]=fdr.data[i+1];
nr++;
fdrp++;
break;
default:
if (skip_buf(fdrp->bc) != fdrp->bc) return 0;
}
*/
}
}
else if (skip_buf
(slbh.
bc-4) != slbh.
bc-4 ) return 0;
/*
else if (cid==0x400)
{
if (prmes)
{
while (slbh.bc>4)
{
if (next_buf(8, (void *) &fdr) != 8) return 0;
if (isLE)
{
swap_2(&fdr.bc);
swap_2(&fdr.fedid);
swap_2(&fdr.recid);
swap_2(&fdr.bxn);
}
otfid[nf]=fdr.fedid;
printf(" >FED%d bc=%d, fedid=0x%X, recid=0x%X, bxn=%d",
++nf, fdr.bc, fdr.fedid, fdr.recid, fdr.bxn);
slbh.bc-=fdr.bc;
fdr.bc-=8;
if (next_buf(fdr.bc, (void *) fdr.data) != fdr.bc) return 0;
for (i=0;i<fdr.bc;i+=4)
{
if (! (i%16)) printf("\n");
printf("0x%02X 0x%02X 0x%02X 0x%02X ",
fdr.data[i], fdr.data[i+1], fdr.data[i+2], fdr.data[i+3]);
}
printf("\n");
}
}
else
{
if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0;
}
}
else if (cid==0x600)
{
if (prmes)
{
while (slbh.bc>4)
{
if (next_buf(8, (void *) &fdr) != 8) return 0;
if (isLE)
{
swap_2(&fdr.bc);
swap_2(&fdr.fedid);
swap_2(&fdr.recid);
swap_2(&fdr.bxn);
}
printf(" >FED bc=%d, fedid=0x%X, recid=0x%X, bxn=%d\n",
fdr.bc, fdr.fedid, fdr.recid, fdr.bxn);
slbh.bc-=fdr.bc;
fdr.bc-=8;
if (skip_buf(fdr.bc) != fdr.bc ) return 0;
}
}
else
{
if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0;
}
*/
if (next_buf
( 4, (void *) &slbt
) != 4) return 0;
if (isLE
)
{
swap_2
(&slbt.
recid);
swap_2
(&slbt.
fltev);
}
if (prmes
)
printf(" >SLB recid=0x%X, fltev=%d\n", slbt.
recid, slbt.
fltev);
}
if (next_buf
( 4, (void *) &evt
) != 4) return 0;
if (isLE
) swap_4
(&evt.
slt);
if (prmes
)
{
printf("EVT: slt=%u, tcode=0x%x, flt_status=0x%x\n",
evh.
slt, evdata.
FCS_tcode, evdata.
flt_status);
}
if (prmes
&& isLOG
)
printf("LOG: bc=%u, exp=%u, run=%u, evt=%u, dtm=%s",
logh.
bc, logh.
exp, logh.
run, logh.
evt, ctime((time_t
*)&logh.
dtm));
return nr
;
}
int dump_cmp
(FILE
*fout
, unsigned short cid
)
{
int pos
;
int evbc
, slbbc
, compid
;
char evbf
[10000];
LOG_header
*loghb
;
EVT_header
*evhb
;
SLB_header
*slbh
;
if (isLOG
)
{
if (skip_buf
(20) != 20) return 0;
}
pos
=0;
evhb
=(EVT_header
*) &evbf
[pos
];
if (next_buf
(20, (void *) evhb
) != 20) return 0;
pos
+=20;
evbc
=evhb
->bc
;
if (isLE
) swap_4
(&evbc
);
evbc
-=20;
while (evbc
>4)
{
slbh
=(SLB_header
*) &evbf
[pos
];
if (next_buf
(16, (void *) slbh
) != 16) return 0;
slbbc
=slbh
->bc
;
compid
=slbh
->compid
;
if (isLE
)
{
swap_4
(&slbbc
);
swap_2
(&compid
);
}
evbc
-=slbbc
;
slbbc
-=16;
if ((compid
==cid
)||(compid
==0x0))
{
pos
+=16;
if (next_buf
(slbbc
, (void *) &evbf
[pos
]) != slbbc
) return 0;
pos
+=slbbc
;
}
else
{
if (skip_buf
(slbbc
) != slbbc
) return 0;
}
}
if (next_buf
( 4, (void *) &evbf
[pos
]) != 4) return 0;
pos
+=4;
evhb
->bc
=pos
;
if (isLE
) swap_4
(&evhb
->bc
);
if (fwrite((void *) evbf
, 1, pos
, fout
) != pos
) return 0;
return 1;
}