00001 #include "St_trg_Maker.h"
00002 #include "StDaqLib/TRG/trgStructures2003.h"
00003 #include "St_DataSetIter.h"
00004 #include "StDAQMaker/StDAQReader.h"
00005 #include "StDAQMaker/StTRGReader.h"
00006 #include "tables/St_dst_L0_Trigger_Table.h"
00007 #include "tables/St_dst_L1_Trigger_Table.h"
00008 #include "tables/St_dst_L2_Trigger_Table.h"
00009 #include "tables/St_dst_TrgDet_Table.h"
00010 #include "tables/St_ctu_raw_Table.h"
00011 #if 0
00012 #include "tables/St_mwc_raw_Table.h"
00013 #endif
00014 #include "tables/St_dst_TrgDet_Table.h"
00015 #define PREPOST 11
00016
00017 void St_trg_Maker::SecondDstDaq2003(St_dst_L0_Trigger *dst2) {
00018 int i;
00019
00020 dst_L0_Trigger_st *tt = dst2->GetTable();
00021 tt->TrgToken = mS2003->EvtDesc.TrgToken;
00022 tt->TriggerActionWd = mActionWord;
00023 tt->DSMInput = mS2003->EvtDesc.DSMInput;
00024 tt->DSMAddress = mS2003->EvtDesc.DSMAddress;
00025 tt->TriggerWd = mS2003->EvtDesc.TriggerWord;
00026 tt->DetectorBusy = mS2003->EvtDesc.modifiedBusyStatus;
00027 tt->addBits = mS2003->EvtDesc.addBits;
00028 for(i=0;i<32;i++) tt->CPA[i]=mS2003->TrgSum.DSMdata.CPA[i];
00029 tt->MWC_CTB_mul = mS2003->TrgSum.DSMdata.lastDSM[2];
00030 tt->MWC_CTB_dipole = 0;
00031 tt->MWC_CTB_topology = 0;
00032 tt->MWC_CTB_moment = 0;
00033 }
00034
00036 void St_trg_Maker::CtbMwcDaq2003(St_dst_TrgDet *dst1) {
00037 int npre,npost,pp,tray,slat;
00038 dst_TrgDet_st *tt = dst1->GetTable();
00039
00040 tt->bunchXing_lo=mS2003->EvtDesc.bunchXing_lo;
00041 tt->bunchXing_hi=(mS2003->EvtDesc.bunchXing_hi)&(0xFFFF);
00042 npre=mS2003->EvtDesc.npre;
00043 npost=mS2003->EvtDesc.npost;
00044 tt->npre=npre;
00045 tt->npost=npost;
00046 for(pp=0;pp<1+npre+npost;pp++) {
00047 assert(pp<PREPOST);
00048
00049 for(slat=0;slat<2;slat++) {
00050 for(tray=0;tray<120;tray++) {
00051 tt->nCtb[tray][slat][pp]=mS2003->rawTriggerDet[pp].CTB[ctbmap[tray][slat]];
00052 tt->timeCtb[tray][slat][pp]=0;
00053 }
00054 }
00055 #if 0
00056
00057 int i,subsector,sector;
00058 for(sector=0;sector<24;sector++) {
00059 for(subsector=0;subsector<4;subsector++) {
00060 tt->nMwc[sector][subsector][pp]=mS2003->rawTriggerDet[pp].MWC[mwcmap[sector][subsector]];
00061 }
00062 }
00063 for(i=0;i<16;i++) tt->ctbaux[i][pp]=mS2003->rawTriggerDet[pp].CTB[auxctbmap[i]];
00064 for(i=0;i<32;i++) tt->mwcaux[i][pp]=mS2003->rawTriggerDet[pp].MWC[auxmwcmap[i]];
00065 #endif
00066 }
00067 }
00068
00069 Int_t St_trg_Maker::SanityCheck2003() {
00070 unsigned short x;
00071 x=mS2003->TrgSum.L1SumBytes; assert(x==0x0084||x==0x8400);
00072 x=mS2003->TrgSum.L2SumBytes; assert(x==0x0084||x==0x8400);
00073 return kStOK;
00074 }
00075
00077 #ifdef LATER_THAN_YEAR_2000 // Year 2000 trgStructures.h does not have BEMC.
00078 #define BYTESPERDSM 16 //The number of output bytes the 20 signals are packed into
00079 typedef unsigned char byte;
00080
00081 int tower_map[10] = {0,1,2,3,4,5,6,7,8,9};
00082 int swapByteOrder[16] = {7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8};
00083
00084
00085
00086
00087
00088
00090 int AA_dsm_to_patch[5] = {0,0,15,16,17};
00091 int pp_dsm_to_patch[7] = {0,0,15,28,16,29,17};
00093
00094
00095 void St_trg_Maker::Emc2003(St_dst_TrgDet *dst1) {
00096 dst_TrgDet_st *tt = dst1->GetTable();
00097
00098 int NUMDSM;
00099
00100
00101
00102 EventReader *er=fVictorPrelim->getEventReader();
00103 EventInfo info=er->getEventInfo();
00104 unsigned int UnixTime=info.UnixTime;
00105 struct tm *time=gmtime((time_t*) &UnixTime);
00106 int year=1900+time->tm_year;
00107 int month=1+time->tm_mon;
00108 int day=time->tm_mday;
00109 char text1[80];
00110 sprintf(text1,"%04d%02d%02d",year,month,day);
00111 unsigned int date=atoi(text1);
00112 if (date < 20011201) {
00113 NUMDSM = 5;
00114 } else {
00115 NUMDSM = 7;
00116 }
00117 byte dsmval[NUMDSM][BYTESPERDSM];
00118 byte val[BYTESPERDSM];
00119 byte hi_tower,tower_sum;
00120 int i,j,k,index,nt,patch,sort;
00121
00122 for (i=0; i<NUMDSM ; i++) {
00123 for (j=0; j < BYTESPERDSM; j++) {
00124 index = (i*16) + j;
00125 dsmval[i][j] = mS2003->rawTriggerDet[0].BEMC[index];
00126
00127
00128 }
00129 }
00130
00131 for (i=2; i<NUMDSM; i++) {
00132
00133 if (date < 20011201) {
00134 patch = AA_dsm_to_patch[i];
00135 } else {
00136 patch = pp_dsm_to_patch[i];
00137 }
00138 for (j=0; j<BYTESPERDSM; j++) {
00139 k = swapByteOrder[j];
00140 val[k] = dsmval[i][j];
00141 }
00142 nt = 0;
00143
00144 for (index=0; index<5; index++) {
00145 k=index*3;
00146
00147 hi_tower = (val[k] & 0x3f);
00148 tower_sum = ((val[k]>>6) & 0x3) + ((val[k+1] & 0xF)<<2);
00149
00150 sort = tower_map[nt] + 10*patch;
00151 assert(sort>=0&&sort<300);
00152 tt->emcHiTower[sort] = hi_tower;
00153 tt->emcTrigPatch[sort] = tower_sum;
00154
00155
00156 nt += 1;
00157
00158 hi_tower = ((val[k+1]>>4) & 0xF) + ((val[k+2] & 0x3)<<4);
00159 tower_sum = ((val[k+2]>>2) & 0x3F);
00160
00161 sort = tower_map[nt] + 10*patch;
00162 assert(sort>=0&&sort<300);
00163 tt->emcHiTower[sort] = hi_tower;
00164 tt->emcTrigPatch[sort] = tower_sum;
00165 nt += 1;
00166
00167
00168 }
00169 }
00170 }
00171 #endif // LATER_THAN_YEAR_2000
00173
00174
00175
00176
00177 int St_trg_Maker::Daq2003(St_DataSet *herb,St_dst_TrgDet *dst1,St_dst_L0_Trigger *dst2,
00178 St_dst_L1_Trigger *dst3,St_dst_L2_Trigger *dst4) {
00179
00180 char *oo,*ptr,isLaser=0,isPhysics=0,isPulser=0,thisEventOk=0;
00181 fVictorPrelim=(StDAQReader*)(herb->GetObject()); assert(fVictorPrelim);
00182 fVictor=fVictorPrelim->getTRGReader(); assert(fVictor);
00183
00184
00185 assert(fVictor->thereIsTriggerData());
00186
00187
00188
00189
00190
00191 ptr=(char*)(fVictor->getData());
00192 assert(ptr);
00193 mS2003=(TrgDataType2003*)ptr;
00194 mActionWord=
00195 ( (unsigned short)(mS2003->EvtDesc.actionWdTrgCommand) * 16 * 16 * 16 ) +
00196 ( (unsigned short)(mS2003->EvtDesc.actionWdDaqCommand) * 16 * 16 ) +
00197 ( mS2003->EvtDesc.actionWdDetectorBitMask & 0x00ff );
00198
00199
00200
00201
00202
00203
00204
00205 LOG_INFO << Form("Daq2003 : ActionWrdCommand is 0x%0x TriggerWord 0x%0x",
00206 mS2003->EvtDesc.actionWdTrgCommand,
00207 mS2003->EvtDesc.TriggerWord) << endm;
00208
00209
00210 if( (((mActionWord)&0xf000)==0x9000 ) &&
00211 (((mActionWord)&0x0001)==0x0001 )
00212
00213 ) isLaser=7;
00214
00215
00216 if(mActionWord>>12==4) isPhysics=7;
00217 if(mS2003->EvtDesc.TriggerWord==0xf101) isPulser=7;
00218
00219 if((m_Mode )==0) thisEventOk=7;
00220 if((m_Mode&1)&&isPhysics) thisEventOk=7;
00221 if((m_Mode&2)&&isLaser) thisEventOk=7;
00222 if((m_Mode&4)&&isPulser) thisEventOk=7;
00223
00224
00225 oo = "unknown";
00226 if(isPhysics) oo="Physics";
00227 if(isLaser) oo="Laser";
00228 if(isPulser) oo="Pulser";
00229
00230 LOG_INFO <<Form("Daq2003 : %s event. TrgActionWd=0x%x. TriggerWd=0x%0x. Returning %s. m_Mode=%d.\n",
00231 oo,mActionWord,
00232 mS2003->EvtDesc.TriggerWord,
00233 thisEventOk?"kStOK":"kStErr",
00234 m_Mode) << endm;
00235
00236 if (!thisEventOk) return kStErr;
00237
00238
00239 VpdDaq2003(dst1);
00240 ZdcDaq2003(dst1);
00241 BbcDaq2003(dst1);
00242 CtbMwcDaq2003(dst1);
00243 SecondDstDaq2003(dst2);
00244 TakeCareOfL1andL2Daq2003(dst3,dst4);
00245 #ifdef LATER_THAN_YEAR_2000 // Year 2000 trgStructures.h does not have BEMC.
00246 Emc2003(dst1);
00247 #endif
00248
00249
00250
00251 cout << "St_trg_Maker:: Daq2003 : Event has been accepted" << endl;
00252 return kStOK;
00253 }
00254
00255
00256 void St_trg_Maker::TakeCareOfL1andL2Daq2003(St_dst_L1_Trigger *dst3,St_dst_L2_Trigger *dst4) {
00257 int i;
00258 dst_L1_Trigger_st *tt1 = dst3->GetTable();
00259 dst_L2_Trigger_st *tt2 = dst4->GetTable();
00260 for(i=0;i<32;i++) {
00261 tt1->L1_result[i] = mS2003->TrgSum.L1Result[i];
00262 tt2->L2_result[i] = mS2003->TrgSum.L2Result[i];
00263 }
00264 }
00265 void St_trg_Maker::VpdDaq2003(St_dst_TrgDet *dst1) {
00266 int i;
00267 dst_TrgDet_st *tt = dst1->GetTable();
00268 for(i=0;i<48;i++) {
00269 tt->adcVPD[i]=0;
00270 tt->timeVPD[i]=0;
00271 }
00272 tt->TimeEastVpd=0;
00273 tt->TimeWestVpd=0;
00274 tt->vertexZ=0;
00275 }
00276 void St_trg_Maker::ZdcDaq2003(St_dst_TrgDet *dst1) {
00277 int i;
00278 dst_TrgDet_st *tt = dst1->GetTable();
00279 for(i=0;i<8;i++) tt->lastDSM[i]=mS2003->TrgSum.DSMdata.lastDSM[i];
00280 for(i=0;i<16;i++) {
00281 tt->adcZDC[i]=mS2003->rawTriggerDet[0].ZDC[i];
00282 tt->tdcZDC[i]=0;
00283 tt->BCdata[i]=mS2003->TrgSum.DSMdata.BCdata[i];
00284 }
00285 tt->adcZDCEast=mS2003->rawTriggerDet[0].ZDC[13];
00286 tt->adcZDCWest=mS2003->rawTriggerDet[0].ZDC[10];
00287 tt->adcZDCsum=mS2003->rawTriggerDet[0].ZDC[13]+mS2003->rawTriggerDet[0].ZDC[10];
00288 }
00289
00290
00292 void St_trg_Maker::BbcDaq2003(St_dst_TrgDet *dst1) {
00293 int i;
00294 dst_TrgDet_st *tt = dst1->GetTable();
00295 for(i=0; i < 80 ;i++) {
00296 tt->BBC[i] = (unsigned short) mS2003->rawTriggerDet[0].BBC[i];
00297
00298 }
00299 }
00300
00301 void St_trg_Maker::dumpDataToScreenAndExit2003() {
00302
00303 exit(2);
00304 }
00305
00306