00001 #include <cstdlib>
00002 #include <cstdio>
00003
00004 #include "TROOT.h"
00005 #include "TFile.h"
00006 #include "TDirectory.h"
00007 #include "TTree.h"
00008 #include "TBranch.h"
00009
00010
00011 #include "EEfeeDataBlock.h"
00012 #include "EEfeeRawEvent.h"
00013 #include "EEmcEventHeader.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 static const int MaxCommentLen=1024;
00024
00025 static TFile *file = NULL ;
00026 static TTree *tree = NULL ;
00027
00028 static TBranch *beve = NULL ;
00029 static TBranch *bhead = NULL ;
00030
00031 static EEfeeDataBlock *b = NULL ;
00032 static EEfeeRawEvent *eve = NULL ;
00033 static EEmcEventHeader *ehead = NULL ;
00034
00035 static int evnum = 0;
00036 static int nAutoSave =10000;
00037 static char *filename = NULL;
00038
00039
00040 extern "C" void
00041 eemcfeerootopen_(long& run, long& runtime, char *chfile, int &nAuto, int len)
00042 {
00043 char *comment = new char[MaxCommentLen];
00044 char *basefile = new char[MaxCommentLen];
00045 const char *rootdir = getenv("MINIROOTDIR");
00046 if ( rootdir == NULL ) rootdir=".";
00047 filename = new char[(len<MaxCommentLen)?MaxCommentLen:len];
00048
00049
00050 if(strstr(chfile,"[BSND ALL]")!=NULL) {
00051 fprintf(stderr,"rootopen: on-line data <[BSND ALL]>\n");
00052 sprintf(basefile,"run%03ld",run);
00053 } else {
00054 memcpy(basefile,chfile,len);
00055 char *isp = strchr(basefile,' '); *isp = 0x00;
00056 fprintf(stderr,"rootopen: off-line data <%s>\n",basefile);
00057 char *idt = strchr(basefile,'.'); *idt = 0x00;
00058 }
00059 sprintf(filename,"%s/%s.ez.root",rootdir,basefile);
00060 sprintf(comment,"run:%05ld, time:%s ",run,ctime((time_t *)&runtime));
00061
00062 file = new TFile(filename,"RECREATE");
00063 tree = new TTree("ezstar","A tree with FEE events");
00064 eve = new EEfeeRawEvent();
00065 ehead = new EEmcEventHeader();
00066 b = new EEfeeDataBlock();
00067
00068 bhead = tree->Branch("head","EEmcEventHeader",&ehead,10000,99);
00069 beve = tree->Branch("eemc" ,"EEfeeRawEvent",&eve,10000,99);
00070
00071 ehead->clear();
00072 ehead->setRunNumber(run);
00073 ehead->setProcessingTime(time(0));
00074 ehead->setTimeStamp(runtime);
00075 ehead->setComment(comment);
00076 evnum=1;
00077
00078 nAutoSave=nAuto;
00079
00080 fprintf(stderr,"rootopen: file=%s\n",filename);
00081 fprintf(stderr,"rootopen: comment=%s\n",comment);
00082 fprintf(stderr,"rootopen: nAutoSave=%d\n",nAutoSave);
00083 fflush(stderr);
00084 if(basefile) delete [] basefile;
00085 if(comment ) delete [] comment;
00086 return;
00087 }
00088
00089
00090 extern "C" void
00091 eemcfeerootfill_(unsigned short& evtype, unsigned short& evtoken, unsigned short& size , unsigned short *e, int &eveID, int *ierr)
00092 {
00093 UShort_t *head = new UShort_t[EEfeeDataBlock::DefaultMaxHead];
00094 static int nTotErr=0;
00095
00096 *ierr=0;
00097 b->clear();
00098 eve->clear();
00099 eve->setID(++evnum);
00100
00101 if(evnum%10000==0)
00102 fprintf(stderr,"EVENT %6dk %6d 0x%04hx\r",evnum/10000,size,evtype);
00103
00104 #ifdef DEBUG
00105 fprintf(stderr,"\nEVENT %08d %06d 0x%04hx\n",evnum,size,evtype);
00106 #endif
00107
00108 #ifdef DEBUG
00109 int i=0;
00110 while(i<size) {
00111 for(int k=0; i<size && k<2 ; k++,i++) fprintf(stderr,"[%03d] 0x%04hx ",i,e[i]);
00112 fprintf(stderr,"\n");
00113 for(int k=0; i<size && k<4 ; k++,i++) fprintf(stderr,"[%03d/%02d]=0x%04hx ",i,k,e[i]);
00114 fprintf(stderr,"\n");
00115 for(int k=0; i<size && k<128; k++,i++);
00116 }
00117 fprintf(stderr,"i=%d\n",i);
00118 #endif
00119
00120 for(unsigned short *p = e; (p-e)<size; ) {
00121 b->clear();
00122 *p++;
00123 unsigned int wordcnt = *p++;
00124 *p++;
00125 *p++;
00126 unsigned short token = *p++;
00127 unsigned short cratrig = *p++;
00128 if(token!=evtoken) {
00129 nTotErr++;
00130 if(nTotErr%10000==0) {
00131 fprintf(stderr,"eemcfeerootfill: *** token mismatch, \n so far %d-th data blocks in %d events\n",nTotErr, eveID);
00132 fprintf(stderr," (event token=%hd crate token=%hd)\n",evtoken,token);
00133 }
00134 }
00135 if(wordcnt>4) wordcnt -= 4;
00136 head[EEfeeDataBlock::ERRFLG] = evtype;
00137 head[EEfeeDataBlock::WRDCNT] = wordcnt;
00138 head[EEfeeDataBlock::TOKEN] = token;
00139 head[EEfeeDataBlock::CRATE] = cratrig;
00140 b->setHead(head);
00141 b->setDataArray(p,wordcnt);
00142
00143 #if DEBUG
00144 b->print(0);
00145 #endif
00146 if(cratrig) eve->addFeeDataBlock(b);
00147 p += wordcnt;
00148 }
00149
00150
00151 ehead->setProcessingTime(time(0));
00152 ehead->setToken(evtoken);
00153 ehead->setEventNumber(eveID);
00154 tree->Fill();
00155
00156 if(evnum%nAutoSave==0) {
00157 tree->AutoSave();
00158 file->SaveSelf();
00159 printf("====> ezTree AutoSave done, nEve=%d\n",evnum);
00160 }
00161
00162
00163 *ierr=0;
00164 return;
00165 }
00166
00167
00168
00169 extern "C" void
00170 eemcfeerootclose_()
00171 {
00172 if(file) {
00173 file->Write();
00174 delete file;
00175 file=NULL;
00176 fprintf(stderr,"eemcfeerootclose: file %s written\n",filename);
00177 }
00178 fprintf(stderr,"eemcfeerootclose: OK (total events=%8d)\n",evnum);
00179 if(filename) delete [] filename;
00180 return;
00181 }