00001
00002
00003
00004
00005
00006
00007 #include <TH1.h>
00008 #include <TH2.h>
00009 #include <TTree.h>
00010 #include <TString.h>
00011 #include <StMessMgr.h>
00012 #include <StThreeVectorF.hh>
00013
00014
00015
00016 #include <StMuDSTMaker/COMMON/StMuDstMaker.h>
00017 #include <StMuDSTMaker/COMMON/StMuDst.h>
00018 #include <StMuDSTMaker/COMMON/StMuEvent.h>
00019
00020 #include "StEmcUtil/database/StBemcTables.h"
00021 #include "StEmcUtil/geometry/StEmcGeom.h"
00022
00023 #include "StEEmcUtil/database/StEEmcDb.h"
00024 #include "StEEmcUtil/database/EEmcDbItem.h"
00025 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00026 #include "StEEmcUtil/StEEmcSmd/EEmcSmdGeom.h"
00027
00028
00029 #include "StSpinPool/StJets/StJet.h"
00030 #include "StSpinPool/StJets/StJets.h"
00031 #include "StJetMaker/StJetMaker.h"
00032 #include "StSpinPool/StSpinDbMaker/StSpinDbMaker.h"
00033 #include "StJetMaker/StJetReader.h"
00034 #include "StJetMaker/StJetSkimEventMaker.h"
00035
00036 #include "WeventDisplay.h"
00037 #include "St2011WMaker.h"
00038
00039 ClassImp(St2011WMaker)
00040
00041
00042
00043 St2011WMaker::St2011WMaker(const char *name):StMaker(name){
00044 char muDstMakerName[]="MuDst";
00045 mMuDstMaker=(StMuDstMaker*)GetMaker(muDstMakerName);
00046
00047 if(!mMuDstMaker) {
00048 mTreeChain=new TChain("mWtree","W candidate events");
00049 index=0;
00050 }
00051
00052
00053 assert(mMuDstMaker || mTreeChain);
00054
00055 mJetReaderMaker = (StJetReader*)GetMaker("JetReader");
00056 if(!mJetReaderMaker && mTreeChain) {
00057 mJetTreeChain=new TChain("jet","Jet Tree");
00058 indexJet=0;
00059 }
00060
00061 if(!mJetTreeChain && !mJetReaderMaker)
00062 LOG_WARN<<GetName()<<Form("::constructor() NO JETS , W-algo is not working properly, continue")<<endm;
00063
00064
00065 par_l2bwTrgID=parE_l2ewTrgID=0;
00066
00067 setHList(0);
00068 setMC(0);
00069 nInpEve= nTrigEve= nAccEve=0;
00070
00071
00072 par_l0emulAdcThresh=30;
00073 par_l2emulSeedThresh=5.0;
00074 par_l2emulClusterThresh=12.0;
00075
00076
00077 par_minPileupVert=3;
00078 par_vertexZ=100;
00079
00080
00081 par_kSigPed=3;
00082 par_AdcThres=8;
00083 par_maxADC=200.;
00084
00085
00086 par_clustET=14.;
00087 par_clustFrac24=0.95;
00088 par_nearTotEtFrac=0.88;
00089 par_delR3D=7.;
00090 par_leptonEta=1.0;
00091 par_ptBalance=14.;
00092
00093 par_nFitPts=15;
00094 par_nHitFrac=0.51;
00095 par_trackRin=90; par_trackRout=160;
00096 par_trackPt=10.;
00097 par_highET=28.;
00098
00099
00100 parE_trackEtaMin=0.7;
00101 parE_clustET=14.;
00102 parE_clustFrac24=0.90;
00103 parE_nearTotEtFrac=0.85;
00104 parE_delR3D=10.;
00105 parE_leptonEtaLow=1.1;
00106 parE_leptonEtaHigh=2.0;
00107 parE_ptBalance=14.;
00108
00109 parE_nFitPts=5;
00110 parE_nHitFrac=0.51;
00111 parE_trackRin=120; parE_trackRout=70;
00112 parE_trackPt=7.;
00113 parE_nSmdStrip=20;
00114 parE_highET=25.;
00115
00116
00117 par_nearDeltaR=0.7;
00118 par_awayDeltaPhi=0.7;
00119
00120 setEtowScale(1.0);
00121 setBtowScale(1.0);
00122
00123 mRunNo=0;
00124
00125
00126 par_DsmThres=31;
00127 parE_DsmThres=31;
00128 par_maxDisplEve=1;
00129
00130 use_gains_file = 0;
00131
00132 }
00133
00134
00135
00136
00137 Int_t
00138 St2011WMaker::Init(){
00139 assert(HList);
00140 initHistos();
00141 initEHistos();
00142
00143 if(mMuDstMaker) {
00144
00145 mBarrelTables = new StBemcTables();
00146 mDbE = (StEEmcDb*)GetDataSet("StEEmcDb");
00147 assert(mDbE);
00148
00149 if (use_gains_file == 1) {
00150 fstream f1; f1.open(gains_file,ios::in);
00151 cout << "Opening gains file " << gains_file << endl;
00152 char str[200];
00153 while (f1 >> str) {
00154 int softID = atoi(str);
00155 f1 >> str; gains_BTOW[softID] = atof(str);
00156 f1 >> str; f1 >> str;
00157 }
00158 }
00159 }
00160 else {
00161
00162 wEve=new Wevent2011();
00163 mTreeChain-> SetBranchAddress("wEve",&wEve);
00164 }
00165
00166 mBtowGeom = StEmcGeom::instance("bemc");
00167 mBSmdGeom[kBSE] = StEmcGeom::instance("bsmde");
00168 mBSmdGeom[kBSP] = StEmcGeom::instance("bsmdp");
00169 geomE= new EEmcGeomSimple();
00170 geoSmd= EEmcSmdGeom::instance();
00171 initGeom();
00172
00173 wDisaply= new WeventDisplay(this,par_maxDisplEve);
00174
00175 if(isMC) par_minPileupVert=1;
00176
00177
00178 for(int isec=0;isec<mxTpcSec;isec++) {
00179 int sec=isec+1;
00180 float Rin=par_trackRin,Rout=par_trackRout;
00181 float RinE=parE_trackRin,RoutE=parE_trackRout;
00182
00183
00184
00185
00186 mTpcFilter[isec].setCuts(par_nFitPts,par_nHitFrac,Rin,Rout);
00187 mTpcFilter[isec].init("sec",sec,HList);
00188 mTpcFilterE[isec].setCuts(parE_nFitPts,parE_nHitFrac,RinE,RoutE);
00189 mTpcFilterE[isec].init("secEemcTr",sec,HList);
00190 }
00191
00192
00193 if(mMuDstMaker) {
00194 mTreeFile=new TFile(mTreeName,"recreate");
00195 mTreeFile->cd();
00196
00197 wEve=new Wevent2011();
00198 mWtree=new TTree("mWtree","W candidate Events");
00199 mWtree->Branch("wEve","Wevent2011",&wEve);
00200 }
00201
00202 return StMaker::Init();
00203 }
00204
00205
00206
00207 Int_t
00208 St2011WMaker::InitRun(int runNo){
00209 LOG_INFO<<Form("::InitRun(%d) start",runNo)<<endm;
00210 if(!isMC) assert(mRunNo==0);
00211 if(mMuDstMaker) {
00212 mBarrelTables->loadTables(this );
00213 mRunNo=runNo;
00214 }
00215 else {
00216 mRunNo=wEve->runNo;
00217 }
00218
00219
00220 LOG_INFO<<Form("::InitRun(%d) done\n Barrel W-algo params: trigID L2BW=%d isMC=%d\n TPC: nPileupVert>%d, vertex |Z|<%.1fcm, primEleTrack: nFit>%d, hitFrac>%.2f Rin<%.1fcm, Rout>%.1fcm, PT>%.1fGeV/c\n BTOW ADC: kSigPed=%d AdcThr>%d maxAdc>%.0f clustET>%.1f GeV ET2x2/ET4x4>%0.2f ET2x2/nearTotET>%0.2f\n dist(track-clust)<%.1fcm, nearDelR<%.1f\n W selection highET>%.1f awayDelPhi<%.1frad ptBalance>%.1fGeV |leptonEta|<%.1f",
00221 mRunNo, par_l2bwTrgID,isMC,
00222 par_minPileupVert,par_vertexZ,
00223 par_nFitPts,par_nHitFrac, par_trackRin, par_trackRout, par_trackPt,
00224 par_kSigPed, par_AdcThres,par_maxADC,par_clustET,par_clustFrac24,par_nearTotEtFrac,
00225 par_delR3D,par_nearDeltaR,
00226 par_highET,par_awayDeltaPhi,par_ptBalance,par_leptonEta
00227 )<<endm;
00228
00229 cout<<Form("\n Endcap W-algo params: trigID: L2EW=%d isMC=%d\n TPC: nPileupVert>%d, vertex |Z|<%.1fcm, primEleTrack: nFit>%d, hitFrac>%.2f Rin<%.1fcm, Rout>%.1fcm, PT>%.1fGeV/c\n ETOW ADC: kSigPed=%d AdcThr>%d maxAdc>%.0f clustET>%.1f GeV ET2x1/ET4x4>%0.2f ET2x1/nearTotET>%0.2f\n dist(track-clust)<%.1fcm, nearDelR<%.1f\n W selection highET>%.1f awayDelPhi<%.1frad ptBalance>%.1fGeV ",
00230 parE_l2ewTrgID,isMC,
00231 par_minPileupVert,par_vertexZ,
00232 parE_nFitPts,parE_nHitFrac,parE_trackRin,parE_trackRout,parE_trackPt,
00233 par_kSigPed,par_AdcThres,par_maxADC,parE_clustET,parE_clustFrac24,parE_nearTotEtFrac,
00234 parE_delR3D,par_nearDeltaR,
00235 par_highET,par_awayDeltaPhi,parE_ptBalance
00236 )<<endl;
00237 cout<<Form("\n EtowScaleFact=%.2f BtowScaleFacor=%.2f" ,par_etowScale, par_btowScale)<<endl;
00238
00239 return kStOK;
00240 }
00241
00242
00243
00244 Int_t
00245 St2011WMaker::Finish(){
00246 if(mMuDstMaker){
00247 LOG_INFO<<endl<<"Output tree file "<<mTreeName<<endl<<endl;
00248 mTreeFile->Write();
00249 mTreeFile->Close();
00250 }
00251 return StMaker::Finish();
00252 }
00253
00254
00255
00256 Int_t
00257 St2011WMaker::FinishRun(int runNo){
00258 LOG_INFO<<Form("::FinishRun(%d)",runNo)<<endm;
00259 return kStOK;
00260 }
00261
00262
00263
00264 void
00265 St2011WMaker::Clear(const Option_t*){
00266 wEve->clear();
00267 }
00268
00269
00270
00271 Int_t
00272 St2011WMaker::Make(){
00273 nInpEve++;
00274 if(mMuDstMaker){
00275 wEve->id=mMuDstMaker->muDst()->event()->eventId();
00276 wEve->runNo=mMuDstMaker->muDst()->event()->runId();
00277 wEve->zdcRate=mMuDstMaker->muDst()->event()->runInfo().zdcCoincidenceRate();
00278 const char *afile = mMuDstMaker->GetFile();
00279
00280 if(nInpEve%200==1) printf("\n-----in---- %s, nEve: inp=%d trig=%d accpt=%d daqFile=%s\n", GetName(),nInpEve,nTrigEve, nAccEve,afile);
00281
00282 hA[0]->Fill("inp",1.);
00283 hE[0]->Fill("inp",1.);
00284
00285 int btowStat=accessBTOW();
00286 int etowStat=accessETOW();
00287
00288 int btrig=accessBarrelTrig();
00289 int etrig=accessEndcapTrig();
00290
00291 if( btrig && etrig ) return kStOK;
00292
00293 nTrigEve++;
00294
00295 if(accessVertex()) {
00296 fillTowHit(false);
00297 return kStOK;
00298 }
00299
00300 fillTowHit(true);
00301
00302 if( accessTracks()) return kStOK;
00303
00304 accessBSMD();
00305 accessESMD();
00306 accessEPRS();
00307
00308 mWtree->Fill();
00309
00310 if(wEve->l2bitET && wEve->bemc.tileIn[0]==1) hA[0]->Fill("B-in",1.0);
00311 if(wEve->l2EbitET && wEve->etow.etowIn==1) hE[0]->Fill("E-in",1.0);
00312 if(wEve->l2bitET && !btowStat) hA[0]->Fill("B200",1.0);
00313 if(wEve->l2EbitET && !etowStat) hE[0]->Fill("E200",1.0);
00314
00315 if( btowStat && etowStat ) return kStOK;
00316
00317 if(mJetReaderMaker) {
00318 mJets = getJets(mJetTreeBranch);
00319 for (int i_jet=0; i_jet< nJets; ++i_jet){
00320 StJet* jet = getJet(i_jet);
00321 float jet_pt = jet->Pt();
00322 float jet_eta = jet->Eta();
00323 float jet_phi = jet->Phi();
00324 hA[117]->Fill(jet_eta,jet_phi);
00325 hA[118]->Fill(jet_pt);
00326 }
00327 }
00328 }
00329 else {
00330 if(getEvent(index++,indexJet++)==kStEOF) return kStEOF;
00331 if(mJetTreeChain) {
00332 mJets = getJetsTreeAnalysis(mJetTreeBranch);
00333 for (int i_jet=0; i_jet< nJets; ++i_jet){
00334 StJet* jet = getJet(i_jet);
00335 float jet_pt = jet->Pt();
00336 float jet_eta = jet->Eta();
00337 float jet_phi = jet->Phi();
00338 hA[117]->Fill(jet_eta,jet_phi);
00339 hA[118]->Fill(jet_pt);
00340 }
00341 }
00342 }
00343
00344
00345 extendTrack2Barrel();
00346 int bmatch=matchTrack2BtowCluster();
00347
00348
00349 extendTrack2Endcap();
00350 int ematch=matchTrack2EtowCluster();
00351
00352 if(bmatch && ematch) return kStOK;
00353
00354 nAccEve++;
00355
00356
00357
00358 findNearJet();
00359 findAwayJet();
00360
00361 if(mJetReaderMaker || mJetTreeChain) {
00362 findPtBalance();
00363 if(!bmatch) tag_Z_boson();
00364 }
00365
00366
00367 if(!ematch) analyzeESMD();
00368
00369 if(!bmatch) find_W_boson();
00370 if(!ematch) findEndcap_W_boson();
00371 if(nAccEve<2 ||nAccEve%1000==1 ) wEve->print(0x0,isMC);
00372
00373 return kStOK;
00374 }
00375
00376
00377
00378
00379 void
00380 St2011WMaker::initGeom(){
00381
00382
00383 memset(mapBtowIJ2ID,0,sizeof(mapBtowIJ2ID));
00384 for(int softID=1; softID<=mxBtow; softID++) {
00385
00386 int m,e,s;
00387 mBtowGeom->getBin(softID,m,e,s);
00388 float etaF,phiF;
00389 mBtowGeom->getEta(m,e,etaF);
00390 mBtowGeom->getPhi(m,s,phiF);
00391
00392 int iEta, iPhi;
00393 assert(L2algoEtaPhi2IJ(etaF,phiF,iEta, iPhi)==0);
00394 int IJ=iEta+ iPhi*mxBTetaBin;
00395 assert(mapBtowIJ2ID[IJ ]==0);
00396 mapBtowIJ2ID[IJ ]=softID;
00397
00398 Float_t x,y,z;
00399 assert( mBtowGeom->getXYZ(softID,x,y,z)==0);
00400 positionBtow[softID-1]=TVector3(x,y,z);
00401 }
00402
00403
00404 for(int iep=0;iep<mxBSmd;iep++) {
00405 for(int softID=1; softID<=mxBStrips; softID++) {
00406 Float_t x,y,z;
00407 assert( mBSmdGeom[iep]->getXYZ(softID,x,y,z)==0);
00408 positionBsmd[iep][softID-1]=TVector3(x,y,z);
00409 }
00410 }
00411
00412
00413 for(int isec=0;isec<mxEtowSec;isec++){
00414 for(int isub=0;isub<mxEtowSub;isub++){
00415 for(int ieta=0;ieta<mxEtowEta;ieta++){
00416 positionEtow[isec*mxEtowSub+isub][ieta]=geomE->getTowerCenter(isec,isub,ieta);
00417 }
00418 }
00419 }
00420
00421 }
00422
00423
00424
00425
00426 int
00427 St2011WMaker::L2algoEtaPhi2IJ(float etaF,float phiF,int &iEta, int &iPhi) {
00428 if( phiF<0) phiF+=2*C_PI;
00429 if(fabs(etaF)>=0.99) return -1;
00430 int kEta=1+(int)((etaF+1.)/0.05);
00431 iPhi=24-(int)( phiF/C_PI*60.);
00432 if(iPhi<0) iPhi+=120;
00433
00434 iEta=kEta-1;
00435
00436 if(iEta<0 || iEta>=mxBTetaBin) return -2;
00437 if(iPhi<0 || iPhi>=mxBTphiBin) return -3;
00438 return 0;
00439 }
00440
00441
00442
00443
00444 TClonesArray*
00445 St2011WMaker::getJets(TString branchName){
00446 if(mJetReaderMaker ==0) {
00447 nJets=-1; return 0;
00448 }
00449 assert(mJetReaderMaker->getStJets(branchName)->eventId()==wEve->id);
00450 assert(mJetReaderMaker->getStJets(branchName)->runId()==wEve->runNo);
00451 nJets = mJetReaderMaker->getStJets(branchName)->nJets();
00452 return mJetReaderMaker->getStJets(branchName)->jets();
00453
00454 }
00455
00456
00457
00458 TClonesArray*
00459 St2011WMaker::getJetsTreeAnalysis(TString branchName){
00460 if(mJetTreeChain==0){
00461 nJets=-1; return 0;
00462 }
00463
00464
00465
00466 StJets* jetTmp=getStJetsCopy(branchName);
00467 while(jetTmp->eventId()!=wEve->id || jetTmp->runId()!=wEve->runNo) {
00468 mJetTreeChain->GetEntry(indexJet++);
00469 jetTmp=getStJetsCopy(branchName);
00470 }
00471
00472
00473
00474 assert(jetTmp->eventId()==wEve->id);
00475 assert(jetTmp->runId()==wEve->runNo);
00476 nJets = jetTmp->nJets();
00477 return jetTmp->jets();
00478 }
00479
00480
00481 StJets*
00482 St2011WMaker::getStJetsCopy(TString branchName){
00483 TBranch* branch = mJetTreeChain->GetBranch(branchName);
00484 return branch ? *(StJets**)branch->GetAddress() : 0;
00485 }
00486
00487
00488 Int_t St2011WMaker::getEvent(Int_t i, Int_t ijet)
00489 {
00490 Int_t stat=mTreeChain->GetEntry(i);
00491 Int_t statJet=mJetTreeChain->GetEntry(ijet);
00492 if (!stat && !statJet) return kStEOF;
00493 return kStOK;
00494 }
00495
00496
00497 void St2011WMaker::chainFile( const Char_t *file )
00498 {
00499
00500 TString fname=file;
00501 cout<<"Chain W tree files"<<endl;
00502 if ( !fname.Contains("tree.root") ) return;
00503 cout << "+ " << fname << endl;
00504 mTreeChain->Add(fname);
00505 }
00506
00507
00508 void St2011WMaker::chainJetFile( const Char_t *file )
00509 {
00510
00511 TString fname=file;
00512 cout<<"Chain jet tree files"<<endl;
00513 if ( !fname.Contains("jets_") ) return;
00514 cout << "+ " << fname << endl;
00515 mJetTreeChain->Add(fname);
00516 }
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530