00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 #include <sys/types.h>
00227 #include <sys/stat.h>
00228 #include <sys/mman.h>
00229 #include <time.h>
00230 #include <fcntl.h>
00231 #include <stdlib.h>
00232 #include <sys/uio.h>
00233 #include <unistd.h>
00234 #include "EventReader.hh"
00235 #include <assert.h>
00236 #include <errno.h>
00237 #include "StMessMgr.h"
00238
00239
00240 using namespace OLDEVP;
00241
00242 void EventInfo::printEventInfo(FILE * fd)
00243 {
00244 static const char *detnams[] =
00245 {"TPC ","SVT ","TOF ","BTOW","FPD ","FTPC","EXT ","RICH","TRG ","L3 "
00246 ,"SC ","EXT2","PMD ","SSD ","ETOW","DAQ ","FP2 ","PP ","BSMD","ESMD"
00247 ,"EMC"};
00248
00249 char ts[128] ;
00250
00251 sprintf(ts,"%s",ctime((const time_t *)&UnixTime)) ;
00252 ts[24] = 0 ;
00253 LOG_INFO<<"=============== Event # "<<EventSeqNo<<" ============="<<endm;
00254 LOG_INFO<<"Ev len (wds) "<<EventLength<<endm;
00255 LOG_INFO<<"Creation Time: "<<ts<<endm;
00256 LOG_INFO<<"Trigger word "<< hex << (void *)TrigWord<<
00257 "\t\tTrigger Input word "<< hex << (void *)TrigInputWord<<endm;
00258 LOG_INFO<<"Token: "<<Token<<endm;
00259 LOG_INFO<<"Detectors present: ";
00260 unsigned const char* p=0; int i=0;
00261 for (p=&TPCPresent,i=0; p<=&EMCPresent;p++,i++) {
00262 if (*p) {
00263 LOG_INFO<<detnams[i]<<" ";
00264 }
00265 }
00266 LOG_INFO<<endm;
00267 LOG_INFO<<"==========================================="<<endm;
00268 }
00269 EventReader *getEventReader(int fd, long offset, int MMap)
00270 {
00271 EventReader *er = new EventReader();
00272 if (MMap) {
00273 er->InitEventReader(fd, offset, MMap);
00274 if(er->errorNo())
00275 {
00276 LOG_ERROR << er->errstr().c_str() << endm;
00277 LOG_ERROR << (er->err_string[er->errorNo()-1]) << endm;
00278 delete er;
00279 return NULL;
00280 }
00281 }
00282 else {
00283 er->InitEventReader(fd, offset);
00284 if(er->errorNo())
00285 {
00286 LOG_ERROR << er->errstr().c_str() << endm;
00287 LOG_ERROR << (er->err_string[er->errorNo()-1]) << endm;
00288 delete er;
00289 return NULL;
00290 }
00291 }
00292
00293
00294 return er;
00295 }
00296
00297 EventReader *getEventReader(int fd, long offset, const char *logfile, int MMap)
00298 {
00299 EventReader *er = new EventReader(logfile);
00300 if (MMap) {
00301 er->InitEventReader(fd, offset, MMap);
00302 }
00303 else {
00304 er->InitEventReader(fd, offset);
00305 }
00306 if(er->errorNo())
00307 {
00308 LOG_ERROR << er->errstr().c_str() << endm;
00309 LOG_ERROR << (er->err_string[er->errorNo()-1]) << endm;
00310 delete er;
00311 return NULL;
00312 }
00313 er->printEventInfo(er->logfd);
00314 return er;
00315 }
00316
00317 EventReader *getEventReader(char *event)
00318 {
00319 EventReader *er = new EventReader();
00320 er->InitEventReader(event);
00321 if(er->errorNo())
00322 {
00323 LOG_ERROR << er->errstr().c_str() << endm;
00324 LOG_ERROR << (er->err_string[er->errorNo()-1]) << endm;
00325 delete er;
00326 return NULL;
00327 }
00328
00329 return er;
00330 }
00331
00332 EventReader::EventReader()
00333 {
00334 DATAP = NULL;
00335 MMAPP = NULL;
00336 errnum = 0;
00337 runnum = 0;
00338 memset(errstr0, '\0', sizeof(errstr0));
00339 event_size = 0;
00340 fd = -1;
00341 next_event_offset = -1;
00342 verbose = 0;
00343 logfd = NULL;
00344 }
00345 EventReader::EventReader(const char *logfile)
00346 {
00347 DATAP = NULL;
00348 MMAPP = NULL;
00349 errnum = 0;
00350 runnum = 0;
00351 memset(errstr0, '\0', sizeof(errstr0));
00352 event_size = 0;
00353 fd = -1;
00354 next_event_offset = -1;
00355 verbose = 0;
00356 logfd = fopen(logfile,"a");
00357 if (logfd==NULL) {
00358 LOG_ERROR<<"EventReader::EventReader() logfile failure"<<endm;
00359 LOG_ERROR << strerror(errno) << ": " << logfile<< " !!!!!!!"<<endm;;
00360 assert(0);
00361 }
00362 LOG_INFO<<"opening logfile..."<<endm;
00363 }
00364
00365
00366 void EventReader::InitEventReader(int fdes, long offset, int MMap)
00367 {
00368 #define MX_MAP_SIZE 0x20000000
00369
00370 off_t FileLength;
00371
00372 if (verbose) {
00373 LOG_INFO<< "Initializing EventReader with a MAPPED file" << endm;
00374 }
00375
00376
00377 strcpy(err_string[0],"ERROR: FILE");
00378 strcpy(err_string[1],"ERROR: CRC");
00379 strcpy(err_string[2],"ERROR: SWAP");
00380 strcpy(err_string[3],"ERROR: BANK");
00381 strcpy(err_string[4],"ERROR: MEM");
00382 strcpy(err_string[5],"ERROR: NOT DATA BANK");
00383 strcpy(err_string[6],"ERROR: BAD ARG");
00384 strcpy(err_string[7],"ERROR: ENDR ENCOUNTERED");
00385 strcpy(err_string[8],"ERROR: BAD HEADER");
00386 strcpy(err_string[9],"INFO: MISSING BANK");
00387 strcpy(err_string[10],"INFO: END OF FILE");
00388
00389
00390 fd = fdes;
00391 struct stat buf;
00392
00393 if (fstat(fd,&buf)<0){
00394 LOG_ERROR << "DaqOpenTag"<< strerror(errno) <<endm;
00395 ERROR(ERR_FILE);
00396 }
00397 FileLength = buf.st_size;
00398
00399 next_event_offset = 0;
00400 Logical_Record lr;
00401
00402
00403 long pagesize = sysconf(_SC_PAGESIZE);
00404 if (verbose){
00405 LOG_INFO<<"pagesize = "<<(int)pagesize<<endm;;
00406 }
00407 int mmap_offset = (offset/pagesize)*pagesize;
00408
00409 if(mmap_offset < 0) ERROR(ERR_FILE);
00410
00411 int mapsize = buf.st_size - offset + pagesize;
00412
00413 if (mapsize<=0) {
00414 if (verbose) {
00415 LOG_ERROR<<"end of file encountered"<<endm;
00416 }
00417 ERROR(INFO_END_FILE) ;
00418 }
00419 if (mapsize>MX_MAP_SIZE) mapsize = MX_MAP_SIZE;
00420 event_size = mapsize ;
00421
00422 DATAP = NULL;
00423
00424 if((MMAPP = (char *)mmap(0, mapsize, PROT_READ | PROT_WRITE,
00425 MAP_PRIVATE, fd, mmap_offset)) == (caddr_t) -1) {
00426 LOG_ERROR<<strerror(errno)<<"mapping file request "
00427 <<hex<<(void*)mapsize<<" bytes"<<endm;
00428 ERROR(ERR_MEM);
00429 }
00430
00431
00432 DATAP = MMAPP + (offset-mmap_offset);
00433
00434 if (offset>=buf.st_size) {
00435 ERROR(ERR_FILE) ;
00436 }
00437
00438 while (strncmp(DATAP,"LRHD", 4) == 0) {
00439
00440 if (memcpy(&lr,DATAP,sizeof(lr))<0) {
00441 LOG_ERROR<< strerror(errno)<<": error in memcpy"<<endm;
00442 }
00443
00444 if (!lr.test_CRC()) ERROR(ERR_CRC);
00445
00446 if (lr.swap() < 0) ERROR(ERR_SWAP);
00447
00448 lr.header.CRC = 0;
00449
00450 char lcopy[10];
00451
00452 strncpy(lcopy,lr.RecordType,8);
00453 lcopy[8] = 0;
00454 if (verbose) {
00455 LOG_INFO<<"lr.RecordType: "<<lcopy<<endm;
00456 }
00457
00458 if(strncmp(lr.RecordType, "DATA", 4) != 0) {
00459
00460 next_event_offset += 4 * lr.RecordLength;
00461 if (verbose) {
00462 LOG_INFO<<"....skipping "<<(unsigned int)next_event_offset<<" bytes"<<endm;
00463 }
00464 DATAP += next_event_offset;
00465
00466
00467 }
00468 else {
00469
00470
00471 runnum = lr.header.RunNumber;
00472
00473 DATAP += sizeof(lr);
00474 next_event_offset += sizeof(lr);
00475 break;
00476 }
00477 }
00478
00479
00480
00481 if(strncmp(DATAP,"DATAP", 5) != 0)
00482 {
00483 if (verbose) {
00484 LOG_ERROR<<"failed to find DATAP at offset 0x"<<(unsigned int)next_event_offset<<endm;
00485 }
00486 ERROR(ERR_BANK);
00487 }
00488
00489
00490 Bank_DATAP *datap = (Bank_DATAP *)DATAP;
00491
00492
00493 if (!datap->test_CRC()) ERROR(ERR_CRC);
00494 if (datap->swap() < 0) ERROR(ERR_SWAP);
00495
00496 if (offset + 4*datap->EventLength > buf.st_size) {
00497 LOG_ERROR<<"event #"<<datap->EventNumber<<" continues beyond file boundary"<<endm;
00498 ERROR(ERR_FILE) ;
00499 }
00500
00501
00502 next_event_offset += 4*datap->EventLength;
00503 next_event_offset += offset;
00504
00505 }
00506
00507
00508 void EventReader::InitEventReader(int fdes, long offset)
00509 {
00510 long c_offset = offset;
00511 if (verbose) {
00512 LOG_INFO<< "Initializing EventReader with a file" << endm;
00513 }
00514
00515
00516 strcpy(err_string[0],"ERROR: FILE");
00517 strcpy(err_string[1],"ERROR: CRC");
00518 strcpy(err_string[2],"ERROR: SWAP");
00519 strcpy(err_string[3],"ERROR: BANK");
00520 strcpy(err_string[4],"ERROR: MEM");
00521 strcpy(err_string[5],"ERROR: NOT DATA BANK");
00522 strcpy(err_string[6],"ERROR: BAD ARG");
00523 strcpy(err_string[7],"ERROR: ENDR ENCOUNTERED");
00524 strcpy(err_string[8],"ERROR: BAD HEADER");
00525 strcpy(err_string[9],"INFO: MISSING BANK");
00526 strcpy(err_string[10],"INFO: END OF FILE");
00527
00528
00529 fd = fdes;
00530 int DATAPEVENTLENGTH=0;
00531
00532 char bank[9];
00533 memset(bank,'\0',sizeof(bank));
00534
00535 int ret = lseek(fd, offset, SEEK_SET);
00536 if(ret < 0) ERROR(ERR_FILE);
00537
00538 ret = read(fd,bank,8);
00539 if(ret < 0) ERROR(ERR_FILE);
00540
00541 ret = lseek(fd, offset, SEEK_SET);
00542 if(ret < 0) ERROR(ERR_FILE);
00543
00544
00545 Logical_Record lr;
00546
00547 while (strncmp(bank,"LRHD", 4) == 0) {
00548
00549
00550 ret = read(fd,&lr,sizeof(lr));
00551 if(ret < 0) ERROR(ERR_FILE);
00552 c_offset += sizeof(lr);
00553
00554
00555
00556
00557
00558
00559 if (!lr.test_CRC()) ERROR(ERR_CRC);
00560 if (lr.swap() < 0) ERROR(ERR_SWAP);
00561 lr.header.CRC = 0;
00562
00563
00564
00565 DATAPEVENTLENGTH = lr.RecordLength - sizeof(lr)/4;
00566
00567 runnum = lr.header.RunNumber;
00568
00569
00570
00571
00572
00573
00574 char lcopy[10];
00575 int offset = 0;
00576 strncpy(lcopy,lr.RecordType,8);
00577 lcopy[8] = 0;
00578 if (verbose) {
00579 LOG_INFO<<"lr.RecordType: "<<lcopy<<endm;
00580 }
00581
00582
00583
00584
00585
00586
00587 if(strncmp(lr.RecordType, "DATA", 4) != 0) {
00588
00589 offset = 4*lr.RecordLength-sizeof(lr);
00590
00591 if (verbose) {
00592 LOG_INFO<<"....skipping "<<offset<<" bytes"<<endm;
00593 }
00594 lseek(fd,offset,SEEK_CUR);
00595 c_offset += offset;
00596
00597 ret = read(fd,bank,8);
00598 lseek(fd,-8,SEEK_CUR);
00599
00600 if(ret < 0) ERROR(ERR_FILE);
00601
00602 if(ret == 0) ERROR(INFO_END_FILE);
00603 }
00604 else {
00605
00606
00607 ret = read(fd,bank,8);
00608 lseek(fd,-8,SEEK_CUR);
00609
00610 break;
00611 }
00612
00613 }
00614
00615 memset(bank,'\0',sizeof(bank));
00616 ret = read(fd,bank,8);
00617 if(ret < 0) ERROR(ERR_FILE);
00618
00619
00620 ret = lseek(fd,-8,SEEK_CUR);
00621
00622 offset += sizeof(lr);
00623
00624
00625 if(strncmp(bank,"DATAP", 5) != 0)
00626 {
00627 ERROR(ERR_BANK);
00628 }
00629
00630
00631 Bank_DATAP datap;
00632 ret = read(fd,&datap,sizeof(Bank_Header));
00633 if (datap.header.swap() < 0) ERROR(ERR_SWAP);
00634
00635 int len = 4*datap.header.BankLength;
00636
00637
00638
00639 ret = lseek(fd,-sizeof(Bank_Header),SEEK_CUR);
00640 if(ret < 0) ERROR(ERR_FILE);
00641 ret = read(fd,&datap,len);
00642 if(ret < 0) ERROR(ERR_FILE);
00643 ret = lseek(fd,-len,SEEK_CUR);
00644 if(ret < 0) ERROR(ERR_FILE);
00645
00646
00647 if (!datap.test_CRC()) ERROR(ERR_CRC);
00648 if (datap.swap() < 0) ERROR(ERR_SWAP);
00649
00650 if(datap.EventLength < DATAPEVENTLENGTH)
00651 datap.EventLength = DATAPEVENTLENGTH;
00652
00653 next_event_offset = c_offset + datap.EventLength * 4;
00654
00655
00656
00657
00658 struct stat statbuf;
00659 if(fstat(fd, &statbuf) < 0) ERROR(ERR_FILE);
00660
00661
00662
00663
00664 DATAP = (char *)malloc(datap.EventLength * 4);
00665 if(!DATAP) ERROR(ERR_MEM);
00666
00667 ret = read(fd, DATAP, datap.EventLength*4);
00668 if(ret < 0) ERROR(ERR_FILE);
00669
00670 if (!((Bank_DATAP *)DATAP)->test_CRC()) ERROR(ERR_CRC);
00671 if (((Bank_DATAP *)DATAP)->swap() < 0) ERROR(ERR_SWAP);
00672
00673
00674 datap.EventLength = DATAPEVENTLENGTH;
00675
00676 event_size = datap.EventLength;
00677
00678 }
00679
00680 void EventReader::InitEventReader(void *event)
00681 {
00682 if (verbose){
00683 LOG_INFO << "Creating EventReader with a pointer" << endm;
00684 }
00685
00686 if(strncmp((char *)event,"LRHD",4) == 0)
00687 {
00688 Logical_Record *lr=(Logical_Record *)event;
00689
00690
00691 if (!lr->test_CRC()) ERROR(ERR_CRC);
00692 if (lr->swap() < 0) ERROR(ERR_SWAP);
00693 lr->CRC = 0;
00694
00695
00696 runnum = lr->header.RunNumber;
00697
00698
00699
00700
00701 if(strncmp(lr->RecordType, "DATA", 4) != 0) ERROR(ERR_NOT_DATA_BANK);
00702
00703
00704 event = (void *)((char *)event + sizeof(Logical_Record));
00705 }
00706
00707 if(strncmp((char *)event,"DATAP", 5) != 0) ERROR(ERR_BANK);
00708 Bank_DATAP *datap = (Bank_DATAP *)event;
00709
00710
00711 if (!datap->test_CRC()) ERROR(ERR_CRC);
00712 if (datap->swap() < 0) ERROR(ERR_SWAP);
00713 datap->header.CRC = 0;
00714
00715
00716 DATAP = (char *)datap;
00717 event_size = datap->EventLength * 4;
00718 }
00719
00720 EventReader::~EventReader()
00721 {
00722
00723
00724 if(fd == -1)
00725 {
00726
00727 }
00728 else if(MMAPP != NULL)
00729 {
00730
00731 munmap(MMAPP,event_size);
00732 }
00733 else
00734 {
00735
00736 free(DATAP);
00737 }
00738 if (logfd!=NULL) fclose(logfd);
00739 }
00740
00741 int EventReader::system_present(Bank_DATAP *datap, int sys)
00742 {
00743 Pointer *pointer;
00744 datap->swap();
00745
00746 if(sys >= 10) {
00747 pointer = &datap->EXT_ID;
00748 if((pointer->offset == 0) || (pointer->length == 0)) {
00749 return 0;
00750 }
00751
00752 Bank_DATAPX *datapx = (Bank_DATAPX *)(((INT32 *)datap) + (pointer->offset));
00753 datapx->swap();
00754
00755 pointer = &datapx->EXT_DET[sys-10];
00756 if((pointer->offset == 0) || (pointer->length == 0)) {
00757 return 0;
00758 }
00759 }
00760 else {
00761 pointer = &datap->TPC;
00762 pointer += sys;
00763 if((pointer->offset == 0) || (pointer->length == 0)) {
00764 return 0;
00765 }
00766 }
00767 return 1;
00768 }
00769
00770 EventInfo EventReader::getEventInfo()
00771 {
00772 enum {
00773 TPC_SYSTEM = 0
00774 ,SVT_SYSTEM = 1
00775 ,TOF_SYSTEM = 2
00776 ,BTOW_SYSTEM = 3
00777 ,FPD_SYSTEM = 4
00778 ,FTP_SYSTEM = 5
00779 ,EXT_SYSTEM = 6
00780 ,RIC_SYSTEM = 7
00781 ,TRG_SYSTEM = 8
00782 ,L3_SYSTEM = 9
00783 ,SC_SYSTEM = 10
00784 ,EXT2_SYSTEM = 11
00785 ,PMD_SYSTEM = 12
00786 ,SSD_SYSTEM = 13
00787 ,ETOW_SYSTEM = 14
00788 ,DAQ_SYSTEM = 15
00789 ,FP2_SYSTEM = 16
00790 ,PP_SYSTEM = 17
00791 ,BSMD_SYSTEM = 18
00792 ,ESMD_SYSTEM = 19
00793 };
00794
00795
00796 EventInfo ei;
00797 memset(&ei,0,sizeof(EventInfo));
00798 Bank_DATAP *dp = (Bank_DATAP *)DATAP;
00799 if (dp) {
00800 ei.Token = dp->header.Token;
00801 ei.EventLength = dp->EventLength;
00802 ei.UnixTime = dp->Time;
00803 ei.EventSeqNo = dp->EventNumber;
00804 ei.TrigWord = dp->TriggerWord;
00805 ei.TrigInputWord = dp->TriggerInWord;
00806 int detpre = dp->DetectorPresence;
00807 ei.UnixTime = -1;
00808 ei.EventLength = -1;
00809 LOG_INFO<<"EventReader::getEventInfo detector presence = "<<detpre<<endm;
00810
00811 int sys = 0;
00812 for (unsigned char *p = &ei.TPCPresent; p<=&ei.ESMDPresent;p++) {
00813 if(system_present(dp, sys)) *p = 1;
00814 else *p = 0;
00815 sys++;
00816 }
00817 ei.EMCPresent = (ei.BTOWPresent|ei.ETOWPresent|ei.BSMDPresent|ei.ESMDPresent|ei.TRGPresent);
00818 } else {
00819 LOG_ERROR << "EventReader::getEventInfo: No DATAP exists" << endm;
00820 }
00821 return ei;
00822 }
00823
00824 void EventReader::printEventInfo(FILE * fd)
00825 {
00826 EventInfo ei = getEventInfo();
00827 ei.printEventInfo(fd);
00828 }
00829
00830 long EventReader::NextEventOffset()
00831 {
00832 return next_event_offset;
00833 }
00834
00835 int EventReader::MemUsed()
00836 {
00837 return event_size;
00838 }
00839
00840 void EventReader::setVerbose(int v)
00841 {
00842 verbose = v;
00843 }
00844
00845 char * EventReader::findBank(char *bankid)
00846 {
00847
00848 Bank_DATAP *pBankDATAP = (Bank_DATAP *)getDATAP();
00849 if (!pBankDATAP) {
00850 LOG_ERROR<<"DATAP not found: "<<__FILE__<<" "<<__LINE__<<endm;
00851 return NULL;
00852 }
00853 if (!pBankDATAP->test_CRC()) {
00854 LOG_ERROR<<"CRC error in DATAP: "<<__FILE__<<" "<<__LINE__<<endm;
00855 return NULL;
00856 }
00857 if (pBankDATAP->swap() < 0){
00858 LOG_ERROR<<"swap error in DATAP: "<<__FILE__<<" "<<__LINE__<<endm;
00859 return NULL;
00860 }
00861 pBankDATAP->header.CRC = 0;
00862
00863
00864
00865
00866
00867
00868
00869 int len = 10;
00870 int ext_len=22;
00871
00872 Pointer *ptr = &pBankDATAP->TPC;
00873
00874 Bank_Header *pBank=0;
00875 Bank_DATAPX *pBankDATAPX=0;
00876
00877 int i,j=0;
00878
00879 for (i=0; i<len; i++, ptr++) {
00880 if (ptr->length==0) continue;
00881 if ((unsigned int)ptr->length== 0xfeedf00d) continue;
00882 pBank = (Bank_Header *)(((INT32 *)pBankDATAP)+ (ptr->offset));
00883
00884
00885
00886 if(!strncmp("DATAPX",pBank->BankType,6)){
00887 pBankDATAPX = (Bank_DATAPX *)(((INT32 *)pBankDATAP)+ (ptr->offset));
00888 pBankDATAPX->swap();
00889 Pointer *ptr1 = &pBankDATAPX->EXT_DET[0];
00890 for(j=0; j < ext_len; j++, ptr1++){
00891 if (ptr1->length==0) continue;
00892 pBank = (Bank_Header *)(((INT32 *)pBankDATAPX)+ ptr1->offset);
00893 if(!strncmp(bankid,pBank->BankType,4)) break;
00894 }
00895 }
00896
00897 if(!strncmp(bankid,pBank->BankType,4)) break;
00898 }
00899 if (i==len) return NULL;
00900 if (!pBank) return NULL;
00901
00902 if(strncmp(pBank->BankType,bankid,4)) {
00903 LOG_ERROR<<"detector "<<bankid<<" not found in DATAP"<<endm;
00904 return NULL;
00905 }
00906 return (char *)pBank;
00907
00908 }
00909
00910 void EventReader::fprintError(int err, char *file, int line, char *userstring)
00911 {
00912 if (logfd==NULL) return;
00913 if (err<0 || err>MX_MESSAGE) return;
00914 fprintf(logfd,"%s %s::%d %s\n",err_string[err-1],file,line,userstring);
00915 fflush(logfd);
00916 }
00917
00920 #define PP printf(
00921 char EventReader::eventIsCorrupted(int herbFd,long offset) {
00922 char returnValue;
00923 offset+=60;
00924 strcpy(mLastBank,"???"); mWordIndex=-1;
00925 returnValue = BankOrItsDescendentsIsBad(herbFd,offset);
00926 if(returnValue) {
00927 PP"StDaqLib/EventReader::eventIsCorrupted: bank pointed to by data word %d of bank %s.\n",mWordIndex+1,mLastBank);
00928 }
00929 return returnValue;
00930 }
00931 char *EventReader::ConvertToString(unsigned long *input) {
00932 static char rv[20];
00933 char *cc,*dd;
00934 cc=(char*)input;
00935 dd=rv;
00936 while(isupper(*cc)||isdigit(*cc)||*cc=='_') *(dd++)=*(cc++); *dd=0;
00937 if(strlen(rv)>8) rv[8]=0;
00938 return rv;
00939 }
00940 void EventReader::WhereAreThePointers(int *beg,int *end,char *xx) {
00941 *beg=-123; *end=-123;
00942 assert(strcmp(xx, "TPCMZP"));
00943
00944
00945
00946
00947 if(xx[0]=='F'&&xx[1]=='T'&&xx[2]=='P') { *beg=0; *end= 0; return; }
00948
00949 if(!strcmp(xx, "DATAP")) { *beg=7; *end=26; }
00950 if(!strcmp(xx, "RICP")) { *beg=1; *end=36; }
00951 if(!strcmp(xx,"RICCRAMP")) { *beg=1; *end=16; }
00952 if(!strcmp(xx, "TRGP")) { *beg=1; *end= 2; }
00953 if(!strcmp(xx, "TPCP")) { *beg=1; *end=48; }
00954 if(!strcmp(xx, "TPCSECP")) { *beg=1; *end=24; }
00955 if(!strcmp(xx, "TPCRBP")) { *beg=1; *end= 6; }
00956 if(!strcmp(xx,"L3_SECTP")) { *beg=9; *end=14; }
00957 if(!strcmp(xx, "L3_SECP")) { *beg=6; *end=11; }
00958 if(!strcmp(xx, "L3_P")) { *beg=0; *end= 0; return; }
00959 if(!strcmp(xx, "SVTP")) { *beg=1; *end= 8; }
00960 if(!strcmp(xx, "SVTSECP")) { *beg=1; *end=24; }
00961 if(!strcmp(xx, "SVTRBP")) { *beg=1; *end= 6; }
00962 assert(strcmp(xx, "FTPMZP"));
00963 if(!strcmp(xx, "FTPP")) { *beg=1; *end=4; }
00964 if(!strcmp(xx, "FTPSECP")) { *beg=1; *end= 24; }
00965 if(!strcmp(xx, "FTPRBP")) { *beg=1; *end=6; }
00966
00967 if(!strcmp(xx, "FPDP")) { *beg=0; *end=0; }
00968 (*beg)--; (*end)--;
00969 if((*beg)<0||(*end)<0) {
00970
00971 *beg=0; *end=0; return;
00972 }
00973 if(*beg>=*end) assert(0);
00974 if((*end-*beg)%2!=1) assert(0);
00975 }
00976 void EventReader::Swap4(unsigned long *data) {
00977 char *hh,temp[4];
00978 hh=(char*)data;
00979 temp[0]=hh[3]; temp[1]=hh[2]; temp[2]=hh[1]; temp[3]=hh[0];
00980 *data=*((unsigned long*)temp);
00981 }
00982 #define DATA 400
00983
00984
00985 char EventReader::BankOrItsDescendentsIsBad(int herbFd,long currentOffset) {
00986 unsigned long header[10],data[DATA];
00987 char doTheByteSwap=FALSE,lastletter,bankname[25];
00988 int i,beg,end,numberOfDataWords,bytesRead;
00989
00990
00991
00992 if(lseek(herbFd,currentOffset,SEEK_SET)!=currentOffset) return TRUE;
00993
00994 bytesRead=read(herbFd,header,10*sizeof(unsigned long));
00995
00996 if(bytesRead!=10*sizeof(unsigned long)) return TRUE;
00997
00998
00999 strcpy(bankname,ConvertToString(header));
01000
01001 if(strlen(bankname)<3) return TRUE;
01002 lastletter=bankname[strlen(bankname)-1];
01003
01004 if(header[5]==0x01020304) doTheByteSwap=TRUE; else if(header[5]!=0x04030201) return TRUE;
01005
01006
01007
01008 if(lastletter!='P') return FALSE;
01009
01010 if(doTheByteSwap) for(i=0;i<10;i++) Swap4(header+i);
01011 assert(header[5]==0x04030201);
01012
01013 numberOfDataWords=header[2]-10;
01014 if(numberOfDataWords>DATA) { LOG_INFO<<numberOfDataWords<<" "<<DATA<<", bankname="<<bankname<<endm; }
01015 assert(numberOfDataWords<=DATA);
01016 if(!strcmp(bankname,"TPCMZP")) { beg=0; end=numberOfDataWords-1; }
01017 else if(!strcmp(bankname,"EMCP")) { beg=0; end=0; }
01018 else if(!strcmp(bankname,"PMDP")) { beg=0; end=0; }
01019 else WhereAreThePointers(&beg,&end,bankname);
01020 if(end>=numberOfDataWords&&numberOfDataWords>0) {
01021 PP"end=%d, numberOfDataWords=%d, bankname=%s.\n",end,numberOfDataWords,bankname);
01022 assert(end<numberOfDataWords);
01023 }
01024
01025 bytesRead=read(herbFd,data,numberOfDataWords*sizeof(unsigned long));
01026 if(bytesRead!=int(numberOfDataWords*sizeof(unsigned long))) return TRUE;
01027 if(doTheByteSwap) for(i=0;i<numberOfDataWords;i++) Swap4(data+i);
01028
01029 if(!strcmp(bankname,"TPCMZP")||!strcmp(bankname,"FTPMZP")) {
01030 if(data[5]!=0&&(data[1]==0||data[3]==0)) return TRUE;
01031 }
01032
01033 for(i=beg;i<end;i+=2) {
01034 if(data[i+1]==0) continue;
01035 if(data[i]==0) {
01036 PP"Bank '%s' (at offset %ld bytes in the .daq file) points to itself (data word %d counting from 1).\n",
01037 bankname,currentOffset,i+1);
01038 return TRUE;
01039 }
01040 strncpy(mLastBank,bankname,25);
01041 mWordIndex=i;
01042 if(BankOrItsDescendentsIsBad(herbFd,4*data[i]+currentOffset)) return TRUE;
01043 }
01044 return FALSE;
01045 }