00001
00002
00003
00004
00030 #include <iostream>
00031 #include <sstream>
00032
00033 #include "TList.h"
00034 #include "TMap.h"
00035 #include "TFile.h"
00036 #include "TTree.h"
00037 #include "TH1F.h"
00038
00039 #include "StChain.h"
00040 #include "St_DataSetIter.h"
00041
00042 #include "StIOMaker/StIOMaker.h"
00043
00044 #include "StThreeVectorF.hh"
00045 #include "StThreeVectorD.hh"
00046 #include "StPhysicalHelixD.hh"
00047
00048 #include "StEvent/StTrackTopologyMap.h"
00049 #include "StEvent/StRunInfo.h"
00050
00051 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00052 #include "StMuDSTMaker/COMMON/StMuDst.h"
00053 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00054 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00055 #include "StMuDSTMaker/COMMON/StMuEmcCollection.h"
00056
00057 #include "StEEmcUtil/EEmcGeom/EEmcGeomDefs.h"
00058 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00059
00060 #include "StEEmcUtil/StEEmcSmd/StEEmcSmdGeom.h"
00061
00062 #include "StEEmcUtil/database/StEEmcDb.h"
00063 #include "StEEmcUtil/database/EEmcDbItem.h"
00064 #include "StEEmcUtil/EEfeeRaw/EEname2Index.h"
00065
00066 #include "EEmcTower.h"
00067 #include "EEmcTTMatch.h"
00068 #include "EEmcTTMMaker.h"
00069
00070
00071 #if !defined(ST_NO_NAMESPACES)
00072 using std::map;
00073 using std::ostream;
00074 using std::ostringstream;
00075 #endif
00076
00077
00078 ClassImp(EEmcTTMMaker);
00079
00080
00081
00082 const Int_t EEmcTTMMaker::kDefMaxCTBsum = 1000;
00083 const Int_t EEmcTTMMaker::kDefMinTrackHits = 5;
00084 const Double_t EEmcTTMMaker::kDefMinTrackLength = 20.0;
00085 const Double_t EEmcTTMMaker::kDefMinTrackPt = 0.1;
00086
00087 const Double_t EEmcTTMMaker::kDefMinTrackEta = 0.0;
00088 const Double_t EEmcTTMMaker::kDefMaxTrackEta = 2.2;
00089
00090 const Double_t EEmcTTMMaker::kDefDeltaPhiCut = 0.7;
00091 const Double_t EEmcTTMMaker::kDefDeltaEtaCut = 0.7;
00092
00093
00094 EEmcTTMMaker::EEmcTTMMaker(
00095 const char* self ,
00096 StMuDstMaker *mumaker
00097 )
00098 : StMaker(self),mMuDstMaker(mumaker),mEEmcDb(0),mGeom(EEmcGeomSimple::Instance()) {
00099
00100 if( mMuDstMaker == NULL )
00101 Fatal("EEmcTTMMaker","invalid StMuDstMaker");
00102
00103
00104
00105
00106
00107
00108
00109
00110 mFileName = TString(GetName());
00111 mFileName.ToLower();
00112 mFileName += ".ndst.root";
00113 mFile=NULL;
00114
00115 ResetZPositionsArray();
00116 AddZPosition("pres",kEEmcZPRE1+0.1);
00117 AddZPosition("post",kEEmcZPOST-0.1);
00118 AddZPosition("smd" ,kEEmcZSMD);
00119
00120
00121 mMaxCTBsum = kDefMaxCTBsum;
00122 mMinTrackHits = kDefMinTrackHits;
00123 mMinTrackLength = kDefMinTrackLength;
00124 mMinTrackPt = kDefMinTrackPt;
00125 mMinTrackEta = kDefMinTrackEta;
00126 mMaxTrackEta = kDefMaxTrackEta;
00127
00128
00129 mPhiFac = kDefDeltaPhiCut;
00130 mEtaFac = kDefDeltaEtaCut;
00131
00132
00133 mTrackList = new TList;
00134 mTowerList = new TList;
00135 mMatchList = new TList;
00136
00137 mTowerList->SetOwner();
00138 mMatchList->SetOwner();
00139
00140 mEvInfo = NULL;
00141 mEvSumm = NULL;
00142 mEvTrig = NULL;
00143
00144 mTreeOut = false;
00145
00146 ResetStats();
00147
00148 }
00149
00150
00152 EEmcTTMMaker::~EEmcTTMMaker() {
00153 if( mTree !=NULL ) delete mTree;
00154 if( mFile !=NULL ) delete mFile;
00155
00156
00157 if( mMatchList!=NULL ) delete mMatchList;
00158 if( mTrackList!=NULL ) delete mTrackList;
00159 if( mTowerList!=NULL ) delete mTowerList;
00160 }
00161
00162
00163
00165 Int_t
00166 EEmcTTMMaker::Init() {
00167 mEEmcDb = (StEEmcDb*)this->GetDataSet("StEEmcDb");
00168 if(!mEEmcDb)
00169 Fatal("EEmcTTMMaker","invalid StEEmcDbMaker");
00170
00171 ResetStats();
00172
00173 mFile = new TFile(mFileName, "RECREATE"); if(!mFile) return kStErr;
00174 mTree = new TTree("ttm","TPC track to EEmc tower matches"); if(!mTree) return kStErr;
00175
00176 mTree->Branch("matches","TList",&mMatchList,32768,0);
00177
00178 mTree->Branch("info" ,"StEventInfo" ,&mEvInfo ,32768,0);
00179 mTree->Branch("summary" ,"StEventSummary" ,&mEvSumm ,32768,0);
00180 mTree->Branch("trigger" ,"StMuTriggerIdCollection",&mEvTrig ,32768,0);
00181
00182
00183 mFile->mkdir("histos");
00184 mFile->cd("histos");
00185
00186
00187
00188 hTrackNHits = new TH1F("hTrankNHits","hits/track" ,100, 0.0,100 );
00189 hTrackLen = new TH1F("hTrackLen" ,"track length [cm]" ,500, 0.0,500.0);
00190 hTrackPt = new TH1F("hTrackPt" ,"p_T [GeV]" ,500, 0.0, 5.0);
00191 hTrackPtot = new TH1F("hTrackPtot" ,"p_tot [GeV]" ,500, 0.0, 5.0);
00192
00193 hTrackDCA[0] = new TH1F("hTrackDCAX" , "x_vtxdca [cm]" ,200,- 50.0, 50.0);
00194 hTrackDCA[1] = new TH1F("hTrackDCAY" , "y_vtxdca [cm]" ,200, -50.0, 50.0);
00195 hTrackDCA[2] = new TH1F("hTrackDCAZ" , "z_vtxdca [cm]" ,200, -5.0, 5.0);
00196
00197 mFile->cd("");
00198
00199
00200
00201 return StMaker::Init();
00202 }
00203
00204
00206 Int_t
00207 EEmcTTMMaker::Make(){
00208
00209 mNEvents++;
00210
00211 mTrackList->Clear();
00212 mTowerList->Clear();
00213 mMatchList->Clear();
00214
00215
00216 StMuDst *muDst = mMuDstMaker->muDst();
00217
00218
00219 if(muDst==NULL) {
00220 Warning("Make","%s error, muDST maker data missing",GetName());
00221 return kStErr;
00222 }
00223
00224 if(mEEmcDb->valid()<=0) {
00225 Warning("Make","%s: missing EEMC Db records",GetName());
00226 return kStErr;
00227 }
00228
00229
00230 StMuEvent* muEvent = muDst->event();
00231 if (!muEvent) {
00232 Warning("Make","%s: no MuEvent data for this event",GetName());
00233 return kStErr;
00234 }
00235
00236 if( muEvent->ctbMultiplicity() > mMaxCTBsum ) return kStOK;
00237
00238
00239 TObjArray *tracks = muDst->primaryTracks();
00240 if (!tracks) {
00241 Warning("Make","%s: no tracks for this event",GetName());
00242 return kStErr;
00243 }
00244
00245 StMuEmcCollection *emc = muDst->muEmcCollection();
00246 if (!emc) {
00247 Info("Make","%s: no EMC data for this event",GetName());
00248 return kStErr;
00249 }
00250
00251 if(emc->getNEndcapTowerADC()<=0) {
00252 Info("Make","%s: no EEMC tower data for this event",GetName());
00253 return kStErr;
00254 }
00255
00256 StEventInfo &evinfo = muEvent->eventInfo();
00257 StEventSummary &evsumm = muEvent->eventSummary();
00258 StMuTriggerIdCollection &evtrig = muEvent->triggerIdCollection();
00259
00260 mEvInfo = &evinfo;
00261 mEvSumm = &evsumm;
00262 mEvTrig = &evtrig;
00263
00264
00265 TIter nextTrack(tracks);
00266 StMuTrack *track = NULL;
00267
00268 while ( (track = (StMuTrack *)nextTrack()) ) {
00269 StThreeVectorF p =track->p();
00270 StThreeVectorF dca=track->dca();
00271
00272
00273 hTrackNHits->Fill(track->nHitsFit());
00274 hTrackLen ->Fill(track->lengthMeasured());
00275 hTrackPt ->Fill(track->pt());
00276 hTrackPtot ->Fill(p.mag());
00277
00278 hTrackDCA[0] ->Fill(dca.x());
00279 hTrackDCA[1] ->Fill(dca.y());
00280 hTrackDCA[2] ->Fill(dca.z());
00281
00282 if ( ! AcceptTrack(track) ) continue;
00283 mTrackList->Add(track);
00284 }
00285
00286
00287 if( mTrackList->IsEmpty() ) {
00288 #if DEBUG
00289 Info("Make","no good tracks for this event");
00290 #endif
00291 return kStOK ;
00292 }
00293
00294
00295 int ntrack = 0;
00296 for (Int_t i=0; i< emc->getNEndcapTowerADC(); i++) {
00297
00298 int adc,sec,sub,eta;
00299 float adcped,edep;
00300
00301 emc->getEndcapTowerADC(i,adc,sec,sub,eta);
00302 if (adc<=0) continue;
00303
00304
00305 const EEmcDbItem *dbi = mEEmcDb->getT(sec,sub+'@',eta);
00306
00307 if(dbi==NULL) continue;
00308
00309 sec--; sub--; eta--;
00310
00311 adcped = float(adc) - dbi->ped;
00312 edep = (dbi->gain>0.0) ? adcped/dbi->gain : 0.0;
00313 if(adcped<0.0) continue;
00314
00315
00316 EEmcTower *eemcHit = new EEmcTower(sec,sub,eta,adcped,edep);
00317 EEmcTTMatch *eemcMatch = new EEmcTTMatch();
00318 mTowerList->Add(eemcHit);
00319 eemcMatch->Add(eemcHit);
00320
00321 double phi0 = mGeom.getPhiMean(sec,sub);
00322 double eta0 = mGeom.getEtaMean(eta);
00323 double phiHW = mGeom.getPhiHalfWidth();
00324 double etaHW = mGeom.getEtaHalfWidth(eta);
00325 double dphi = 0.0;
00326 double deta = 0.0;
00327
00328 TIter nextTrack(mTrackList);
00329 while( (track=(StMuTrack *)nextTrack()) != NULL ) {
00330 TVector3 r;
00331
00332
00333 bool matched=false;
00334 map<double,TString>::const_iterator zpos=mZ.begin();
00335 for(unsigned int k=0; zpos!=mZ.end() ; ++zpos,k++) {
00336 double z = zpos->first;
00337 matched=false;
00338 if( ! EEmcTTMatch::ExtrapolateToZ(track,z,r) ) break;
00339
00340 dphi = fmod(phi0 - r.Phi(),TMath::TwoPi());
00341 deta = (eta0 - r.Eta() );
00342 if( ! MatchTrack(dphi,deta,phiHW,etaHW) ) break;
00343 matched=true;
00344 }
00345 if(!matched) continue;
00346 eemcMatch->Add(track);
00347 ntrack++;
00348 }
00349 if( eemcMatch->Matches() > 0 )
00350 mMatchList->Add(eemcMatch);
00351 else
00352 delete eemcMatch;
00353 }
00354 if(mTreeOut && ntrack>0) mTree->Fill();
00355 mNMatched += ntrack;
00356 return kStOK;
00357 }
00358
00359
00360 void
00361 EEmcTTMMaker::Clear(Option_t *option ) {
00362
00363
00364
00365
00366
00367
00368 StMaker::Clear();
00369 }
00370
00371
00373 Int_t
00374 EEmcTTMMaker::Finish () {
00375 if(mTreeOut && mTree!=NULL) mFile->Write();
00376 return kStOK;
00377 }
00378
00379
00380
00383 Bool_t
00384 EEmcTTMMaker::AcceptTrack(const StMuTrack *track) {
00385 if(! track->topologyMap().trackTpcOnly() ) return kFALSE;
00386 if( track->type() != 1 ) return kFALSE;
00387 if( track->flag() <= 0 ) return kFALSE;
00388 if( track->nHitsFit() < mMinTrackHits ) return kFALSE;
00389 if( track->length() < mMinTrackLength ) return kFALSE;
00390 if( track->pt() < mMinTrackPt ) return kFALSE;
00391 if( track->eta() < mMinTrackEta ) return kFALSE;
00392 if( track->eta() > mMaxTrackEta ) return kFALSE;
00393 return kTRUE;
00394 }
00395
00396
00403 Bool_t
00404 EEmcTTMMaker::MatchTrack(
00405 const double dphi ,
00406 const double deta,
00407 const double phihw,
00408 const double etahw)
00409 {
00410
00411 if( mPhiFac*phihw < fabs(dphi) ) return kFALSE;
00412 if( mEtaFac*etahw < fabs(deta) ) return kFALSE;
00413 return kTRUE;
00414 }
00415
00416
00417
00418
00419
00420
00421
00422
00425 ostream&
00426 EEmcTTMMaker::Summary(ostream &out ) const
00427 {
00428 out << "<EEmcTTMMaker:Summary>\n";
00429 out << " <Maker Name=\"" << GetName() << "\" />\n";
00430
00431 out.setf(ios_base::fixed,ios_base::floatfield);
00432 out.precision(2);
00433
00434 out << " <CutsSummary>\n";
00435 cout.precision(2);
00436
00437 out << " max CTB sum allowed " << mMaxCTBsum << "\n\n";
00438
00439 out << " min hits/track required " << mMinTrackHits << "\n";
00440 out << " min track length required " << mMinTrackLength << "\n";
00441 out << " min track transverse momentum required " << mMinTrackPt << "\n";
00442 out << " min track pseudorapidity at origin required " << mMinTrackEta << "\n";
00443 out << " max track pseudorapidity at origin required " << mMaxTrackEta << "\n\n";
00444
00445 out << " tracks are matched at the following depths:\n";
00446 map<double,TString>::const_iterator zpos;
00447 int k=0;
00448 for(zpos=mZ.begin(); zpos!=mZ.end() ; ++zpos)
00449 out << " " << ++k << ". z=" << zpos->first << " \"" << zpos->second << "\"\n";
00450
00451 out << " max track to tower center dist. " << mPhiFac << " x tower half-width (phi)\n";
00452 out << " max track to tower center dist. " << mEtaFac << " x tower half-width (eta)\n";
00453 out << " </CutsSummary>\n";
00454
00455 if(mNEvents>0) {
00456 out << " <Statistics>\n";
00457 out << " *** Statistics:\n";
00458 out << " total # of events " << mNEvents << "\n";
00459 out << " # of matched tracks " << mNMatched << "\n";
00460 out << " # of matched tracks/event " << float(mNMatched)/mNEvents << "\n";
00461 out << " </Statistics>\n";
00462 }
00463 out << "</EEmcTTMMaker:Summary>\n";
00464 out.setf(ios_base::fmtflags(0),ios_base::floatfield);
00465 return out;
00466 }
00467
00468
00469
00470
00471
00472 ostream& operator<<(ostream &out, const EEmcTTMMaker &ttm) {
00473 return ttm.Summary(out);
00474 }
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
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
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579