00001
00002
00003
00004
00005 #include <TFile.h>
00006 #include <TH1.h>
00007 #include <TH2.h>
00008 #include <StMessMgr.h>
00009
00010 #include "MuEzSmdCalMaker.h"
00011
00012 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00013 #include "StMuDSTMaker/COMMON/StMuDst.h"
00014 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00015
00016 #include "StMuDSTMaker/EZTREE/EztEventHeader.h"
00017 #include "StMuDSTMaker/EZTREE/EztTrigBlob.h"
00018 #include "StMuDSTMaker/EZTREE/EztEmcRawData.h"
00019 #include "StMuDSTMaker/EZTREE/StTriggerDataMother.h"
00020
00021 #include "StTriggerData2005.h"
00022
00023 #include "StEEmcUtil/database/StEEmcDb.h"
00024 #include "StEEmcUtil/database/EEmcDbItem.h"
00025
00026 ClassImp(MuEzSmdCalMaker)
00027
00028
00029
00030 MuEzSmdCalMaker::MuEzSmdCalMaker( const char* self ,const char* muDstMakerName) : StMaker(self){
00031 mMuDstMaker = (StMuDstMaker*)GetMaker(muDstMakerName);
00032 assert(mMuDstMaker);
00033
00034 trgAkio=0;
00035 nAcceptEve=nTrigEve=nCorrEve=0;
00036 setHList(0);
00037 setTrigIdFilter(0);
00038 setMaxCtbSum(0);
00039 setEZtree();
00040 }
00041
00042
00043
00044 void MuEzSmdCalMaker::setSector(int sec){
00045 EEsmdCal::setSector(sec);
00046 TString name=GetName();
00047 name+="-";
00048 name+=sec;
00049
00050 SetName(name);
00051 }
00052
00053
00054
00055 MuEzSmdCalMaker::~MuEzSmdCalMaker(){
00056 delete trgAkio;
00057 }
00058
00059
00060
00061 void
00062 MuEzSmdCalMaker::saveHisto(TString fname){
00063 TString outName=fname+".hist.root";
00064 TFile f( outName,"recreate");
00065 assert(f.IsOpen());
00066 printf("%d histos are written to '%s' ...\n",HList->GetEntries(),outName.Data());
00067
00068 HList->Write();
00069 f.Close();
00070
00071 }
00072
00073
00074
00075 Int_t
00076 MuEzSmdCalMaker::Init(){
00077
00078 assert(HList);
00079 eeDb = (StEEmcDb*)this->GetDataSet("StEEmcDb");
00080 assert(eeDb);
00081 EEsmdCal::init();
00082
00083 gMessMgr->Message("","I") <<GetName()<<"::Init() filter trigID="<<trigID<<" maxCtbSum="<<maxCtbSum<<endm;
00084 return StMaker::Init();
00085 }
00086
00087
00088
00089 Int_t
00090 MuEzSmdCalMaker::InitRun(int runNo){
00091 if(runNo==0) {
00092 gMessMgr->Message("","W")<<GetName()<<"::InitRun("<<runNo<<") ??? changed to 555, it s OK for M-C - perhaps, JB"<<endm;
00093 runNo=555;
00094 }
00095
00096 initRun(runNo);
00097
00098 return kStOK;
00099 }
00100
00101
00102
00103 Int_t
00104 MuEzSmdCalMaker::Finish(){
00105 finish(1);
00106 gMessMgr->Message("","I") <<GetName()<<"::Finish()\n inputEve="<<nInpEve<<" trigFilterEve="<<nTrigEve<<" nCorrEve="<<nCorrEve<<" nAcceptEve="<<nAcceptEve<<endm;
00107 return kStOK;
00108 }
00109
00110
00111
00112 void
00113 MuEzSmdCalMaker::Clear(const Option_t*){
00114 eHead=0;
00115 eETow=0;
00116 eESmd=0;
00117 eTrig=0;
00118
00119 }
00120
00121
00122
00123 Int_t
00124 MuEzSmdCalMaker::Make(){
00125 clear();
00126 nInpEve++;
00127
00128
00129 if(useEZtree) return MakeEZtree();
00130
00131 return MakeRegular();
00132 }
00133
00134
00135
00136 Int_t
00137 MuEzSmdCalMaker::MakeEZtree(){
00138
00139 eHead= mMuDstMaker->muDst()->eztHeader();
00140 if(eHead==0) {
00141 gMessMgr->Message("","E") <<GetName()<<"::Make() no EztEventHeader, skip event "<<endm; return kStOK;
00142 }
00143
00144 if(nInpEve==1) eHead->print();
00145
00146 if(trigID ) {
00147 if (! mMuDstMaker->muDst()->event()->triggerIdCollection().nominal().isTrigger(trigID)) return kStOK;
00148 }
00149 nTrigEve++;
00150
00151 eETow=mMuDstMaker->muDst()->eztETow();
00152 eESmd=mMuDstMaker->muDst()->eztESmd();
00153 eTrig=mMuDstMaker->muDst()->eztTrig();
00154
00155 if(!eETow || !eESmd || !eTrig) return kStOK;
00156
00157
00158
00159
00160
00161
00162
00163 StMuEvent *muEve = mMuDstMaker -> muDst() -> event();
00164 assert(muEve);
00165 StEventInfo &info=muEve->eventInfo();
00166 int runId=info.runId();
00167
00168
00169
00170 void *blob=eTrig->trgd->GetArray();
00171
00172 StTriggerData2005 trgAkio5( (const TrgDataType2005 *)blob,runId);
00173 if(eETow->doTowerHeadCorruptionTest(trgAkio5.token())||
00174 eESmd->doMapmtHeadCorruptionTest(trgAkio5.token())
00175 ) {
00176 nCorrEve++;
00177 return kStOK;
00178 }
00179
00180 int ctbSum=trgAkio5.ctbSum();
00181 if(maxCtbSum>0 && (ctbSum>maxCtbSum || ctbSum<maxCtbSum/2.)) return kStOK;
00182 nAcceptEve++;
00183
00184
00185
00186
00187
00188 unpackMuEzt(eETow);
00189 unpackMuEzt(eESmd);
00190
00191 findSectorMip();
00192
00193 return kStOK;
00194 }
00195
00196
00197
00198 Int_t
00199 MuEzSmdCalMaker::MakeRegular(){
00200 gMessMgr->Message("","D") <<GetName()<<"::MakeRegular() is called , useEZtree="<<useEZtree<<endm;
00201
00202 #if 0
00203 vector<unsigned int> trgL=mMuDstMaker->muDst()->event()->triggerIdCollection().nominal().triggerIds();
00204 printf("trigL len=%d\n",trgL.size());
00205 int ii;
00206 for(ii=0;ii<trgL.size();ii++) printf("ii=%d trigID=%d\n",ii,trgL[ii]);
00207 #endif
00208
00209 if(trigID ) {
00210 if (! mMuDstMaker->muDst()->event()->triggerIdCollection().nominal().isTrigger(trigID)) return kStOK;
00211 }
00212 nTrigEve++;
00213
00214
00215 memset(killT,false,sizeof(killT));
00216
00217
00218 unpackMuTails();
00219 unpackMuSmd();
00220 nAcceptEve++;
00221
00222
00223
00224 findSectorMip();
00225
00226 return kStOK;
00227 }
00228
00229
00230
00231
00232 void
00233 MuEzSmdCalMaker::tileReMap( int &iT,int &sec , char &sub , int &eta){
00234 assert(1==2);
00235 if(sec==1 ) {
00236 if (iT==99 ) { ;
00237 } else if( iT==2 && sub=='A' && eta==11 ) {
00238 iT=2; sub='B'; eta=2;
00239 } else if( iT==2 && sub=='B' && eta==2 ) {
00240 iT=2; sub='A'; eta=11;
00241 } else if( iT==0 && sub=='A' && eta==4 ) {
00242 iT=0; sub='A'; eta=5;
00243 } else if( iT==0 && sub=='A' && eta==5 ) {
00244 iT=0; sub='A'; eta=4;
00245 }
00246 }
00247 return;
00248 }
00249
00250
00251
00252 int
00253 MuEzSmdCalMaker:: stripReMap(const EEmcDbItem *x){
00254 assert(1==2);
00255 int str=x->strip;
00256 if(x->sec==8 && x->plane=='V' ) {
00257 switch( x->strip) {
00258
00259 case 209: str=216; break;
00260 case 210: str=215; break;
00261 case 211: str=214; break;
00262 case 212: str=213; break;
00263 case 213: str=212; break;
00264 case 214: str=211; break;
00265 case 215: str=210; break;
00266 case 216: str=280; break;
00267 case 280: str=209; break;
00268
00269
00270 case 265: str=272; break;
00271 case 266: str=271; break;
00272 case 267: str=270; break;
00273 case 268: str=269; break;
00274 case 269: str=268; break;
00275 case 270: str=267; break;
00276 case 271: str=266; break;
00277 case 272: str=265; break;
00278 }
00279 }
00280
00281 return str;
00282 }
00283
00284
00285
00286 void
00287 MuEzSmdCalMaker::unpackMuEzt(EztEmcRawData *eRaw){
00288 int n1=0,n2=0,n3=0;
00289
00290 if(eRaw==0) return ;
00291 int icr;
00292 for(icr=0;icr<eRaw->getNBlocks();icr++) {
00293 if(eRaw->isCrateVoid(icr)) continue;
00294 assert(!eRaw ->getCorruption(icr));
00295
00296 int crateID=eRaw->getCrateID(icr);
00297 int chan;
00298 const UShort_t* data=eRaw->data(icr);
00299 for(chan=0;chan<eRaw->sizeData(icr);chan++) {
00300 const EEmcDbItem *x=eeDb->getByCrate(crateID,chan);
00301 if(x==0) continue;
00302 if(x->sec!=sectID && crateID>6 ) break;
00303 if(x->fail ) continue;
00304 if(x->stat & killStat) continue;
00305
00306 float rawAdc=data[chan];
00307 float adc=rawAdc-x->ped;
00308
00309 if(x->isSMD()) {
00310
00311 if(rawAdc>x->thr) n3++;
00312 int iuv=x->plane-'U';
00313 int istr=x->strip -1;
00314
00315
00316
00317 assert(iuv>=0 && iuv<MaxSmdPlains);
00318 assert(istr>=0 && istr<MaxSmdStrips);
00319 smdAdc[iuv][istr]=adc;
00320 if(x->gain<=0)continue;
00321
00322 smdEne[iuv][istr]=adc/x->gain;
00323
00324 } else {
00325
00326 int iT=-1;
00327 if(x->name[2]=='T'){
00328 iT=0;
00329 } else{
00330 iT=x->name[2]-'P'+1;
00331 }
00332 assert(iT>=0 && iT<mxTile);
00333 bool aboveThr=rawAdc>x->thr;
00334 if(iT==1 || iT==2) {
00335 if( adc<=thrMipPresAdc || adc>(thrMipPresAdc+100) ) aboveThr=false;
00336 } else if (iT==3) {
00337 if( adc<=(thrMipPresAdc/2.) || adc>(thrMipPresAdc/2.+100) ) aboveThr=false;
00338 }
00339
00340
00341 int sec=x->sec;
00342 char sub=x->sub;
00343 int eta=x->eta;
00344
00345
00346
00347 int iphi=(sec-1)*MaxSubSec+(sub-'A');
00348 int ieta=eta-1;
00349 assert(iphi>=0 && iphi<MaxPhiBins);
00350 assert(ieta>=0 && ieta<MaxEtaBins);
00351 tileAdc[iT][ieta][iphi]=adc;
00352 tileThr[iT][ieta][iphi]=aboveThr;
00353 killT[iT][ieta][iphi]=false;
00354 if(aboveThr) {
00355 if(iT==0)
00356 n1++;
00357 else
00358 n2++;
00359 }
00360
00361 if(x->gain<=0) continue;
00362 tileEne[iT][ieta][iphi]=adc/x->gain;
00363 }
00364 }
00365 }
00366
00367 }
00368
00369
00370
00371 void
00372 MuEzSmdCalMaker::unpackMuTails(){
00373
00374
00375 StMuEmcCollection* emc = mMuDstMaker->muDst()->muEmcCollection();
00376 if (!emc) {
00377 gMessMgr->Warning() <<"No EMC data for this event"<<endm; return;
00378 }
00379
00380 int i ;
00381
00382
00383 for (i=0; i< emc->getNEndcapTowerADC(); i++) {
00384 int sec,eta,sub,rawAdc;
00385 emc->getEndcapTowerADC(i,rawAdc,sec,sub,eta);
00386 if(sec!=sectID) continue;
00387
00388 const EEmcDbItem *x=eeDb->getTile(sec,'A'+sub-1,eta,'T');
00389 assert(x);
00390 if(x->fail || x->stat & killStat) {
00391 killTail(x,0);
00392 continue;
00393 }
00394 float adc=rawAdc-x->ped;
00395
00396
00397
00398
00399 bool aboveThr=rawAdc>x->thr;
00400
00401 int iT=0;
00402 recordTail( x,adc,aboveThr,iT);
00403
00404 }
00405
00406
00407 int pNh= emc->getNEndcapPrsHits();
00408 for (i=0; i < pNh; i++) {
00409 int pre, sec,eta,sub;
00410
00411 StMuEmcHit *hit=emc->getEndcapPrsHit(i,sec,sub,eta,pre);
00412 float rawAdc=hit->getAdc();
00413
00414 const EEmcDbItem *x=eeDb-> getTile(sec,sub-1+'A', eta, pre-1+'P');
00415 assert(x);
00416 if(sec!=sectID) continue;
00417 int iT=pre;
00418 assert(iT>=0 && iT<mxTile);
00419 if(x->fail || x->stat & killStat) {
00420 killTail(x,iT);
00421 continue;
00422 }
00423
00424 float adc=rawAdc-x->ped;
00425
00426 bool aboveThr=rawAdc > x->thr;
00427
00428 if( adc<=thrMipPresAdc || adc>(thrMipPresAdc+100) ) aboveThr=false;
00429 if(iT==33){
00430 if( adc<=(thrMipPresAdc/2.) || adc>(thrMipPresAdc/2.+100) ) aboveThr=false;
00431 }
00432
00433 recordTail( x,adc,aboveThr,iT);
00434 }
00435
00436 return ;
00437 }
00438
00439
00440
00441 void
00442 MuEzSmdCalMaker::unpackMuSmd(){
00443
00444
00445 StMuEmcCollection* emc = mMuDstMaker->muDst()->muEmcCollection();
00446 if (!emc) {
00447 gMessMgr->Warning() <<"No EMC data for this event"<<endm; return;
00448 }
00449
00450
00451 char uv='U';
00452 for(uv='U'; uv <='V'; uv++) {
00453 int sec,strip;
00454 int nh= emc->getNEndcapSmdHits(uv);
00455 int i;
00456 for (i=0; i < nh; i++) {
00457 StMuEmcHit *hit=emc->getEndcapSmdHit(uv,i,sec,strip);
00458 float rawAdc=hit->getAdc();
00459 const EEmcDbItem *x=eeDb->getByStrip(sec,uv,strip);
00460 assert(x);
00461 if(sec!=sectID) continue;
00462
00463 if(x->fail ) continue;
00464 if(x->stat & killStat) continue;
00465 float adc=rawAdc-x->ped;
00466
00467 int iuv=x->plane-'U';
00468 int istr=x->strip -1;
00469
00470 assert(iuv>=0 && iuv<MaxSmdPlains);
00471 assert(istr>=0 && istr<MaxSmdStrips);
00472 smdAdc[iuv][istr]=adc;
00473 if(x->gain<=0)continue;
00474
00475 smdEne[iuv][istr]=adc/x->gain;
00476 }
00477 }
00478 }
00479
00480
00481
00482 void
00483 MuEzSmdCalMaker::recordTail( const EEmcDbItem *x, float adc, bool aboveThr, int iT) {
00484 int sec=x->sec;
00485 char sub=x->sub;
00486 int eta=x->eta;
00487
00488 #if 0
00489 if(strstr(x->name,"C10")) {
00490 printf("\nadc=%f iT=%d abTthr=%d \n",adc,iT,aboveThr); x->print();
00491 }
00492 #endif
00493
00494
00495
00496 int iphi=(sec-1)*MaxSubSec+(sub-'A');
00497 int ieta=eta-1;
00498 assert(iphi>=0 && iphi<MaxPhiBins);
00499 assert(ieta>=0 && ieta<MaxEtaBins);
00500 tileAdc[iT][ieta][iphi]=adc;
00501 tileThr[iT][ieta][iphi]=aboveThr;
00502 killT[iT][ieta][iphi]=false;
00503
00504 if(x->gain<=0) return;
00505 tileEne[iT][ieta][iphi]=adc/x->gain;
00506 }
00507
00508
00509
00510
00511 void
00512 MuEzSmdCalMaker::killTail( const EEmcDbItem *x, int iT) {
00513 int sec=x->sec;
00514 char sub=x->sub;
00515 int eta=x->eta;
00516
00517 int iphi=(sec-1)*MaxSubSec+(sub-'A');
00518 int ieta=eta-1;
00519 assert(iphi>=0 && iphi<MaxPhiBins);
00520 assert(ieta>=0 && ieta<MaxEtaBins);
00521 killT[iT][ieta][iphi]=true;
00522 }
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550