00001
00002
00003
00004
00005
00006
00007 #include <list>
00008 #include "TFile.h"
00009 #include "TTree.h"
00010 #include "StAnaPars.h"
00011 #include "StjTPCMuDst.h"
00012 #include "StjTPCRandomMuDst.h"
00013 #include "StjBEMCMuDst.h"
00014 #include "StjEEMCMuDst.h"
00015 #include "StjMCMuDst.h"
00016 #include "StjTPCNull.h"
00017 #include "StjBEMCNull.h"
00018 #include "StjEEMCNull.h"
00019 #include "StjAbstractTowerEnergyCorrectionForTracks.h"
00020 #include "StjeTrackListToStMuTrackFourVecList.h"
00021 #include "StjeTowerEnergyListToStMuTrackFourVecList.h"
00022 #include "StjMCParticleToStMuTrackFourVec.h"
00023 #include "StJetFinder/StJetFinder.h"
00024 #include "StSpinPool/StJetEvent/StJetEventTypes.h"
00025 #include "StMuTrackFourVec.h"
00026 #include "StMuTrackEmu.h"
00027 #include "StMuTowerEmu.h"
00028 #include "StMcTrackEmu.h"
00029 #include "StEmcUtil/geometry/StEmcGeom.h"
00030 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00031 #include "StEEmcUtil/database/StEEmcDb.h"
00032
00033 #include "StJetMaker2009.h"
00034
00035 ClassImp(StJetMaker2009);
00036
00037 void StJetMaker2009::Clear(Option_t* option)
00038 {
00039 for (size_t iBranch = 0; iBranch < mJetBranches.size(); ++iBranch) {
00040 StJetBranch* jetbranch = mJetBranches[iBranch];
00041 jetbranch->event->Clear(option);
00042 }
00043
00044 StMaker::Clear(option);
00045 }
00046
00047 int StJetMaker2009::Init()
00048 {
00049 assert(!mFileName.IsNull());
00050
00051 mFile = TFile::Open(mFileName,"recreate");
00052 assert(mFile);
00053
00054 mTree = new TTree("jet","jetTree");
00055
00056 for (size_t iBranch = 0; iBranch < mJetBranches.size(); ++iBranch) {
00057 StJetBranch* jetbranch = mJetBranches[iBranch];
00058 jetbranch->jetfinder->Init();
00059 mTree->Branch(jetbranch->name,"StJetEvent",&jetbranch->event);
00060 }
00061
00062 mTree->BranchRef();
00063
00064 StEEmcDb* eemcDb = (StEEmcDb*)GetDataSet("StEEmcDb");
00065 eemcDb->setThreshold(3);
00066
00067 return StMaker::Init();
00068 }
00069
00070 int StJetMaker2009::Make()
00071 {
00072
00073 for (size_t iBranch = 0; iBranch < mJetBranches.size(); ++iBranch) {
00074 StJetBranch* jetbranch = mJetBranches[iBranch];
00075
00076
00077 jetbranch->event->mRunId = GetRunNumber();
00078 jetbranch->event->mEventId = GetEventNumber();
00079 jetbranch->event->mDatime = GetDateTime();
00080
00081 if (jetbranch->anapars->useTpc) {
00082 StjTPCRandomMuDst tpc((StMuDstMaker*)0,
00083 jetbranch->anapars->randomSelectorProb,
00084 jetbranch->anapars->randomSelectorAt,
00085 jetbranch->anapars->randomSelectorSeed);
00086
00087
00088 int savedVertexIndex = tpc.currentVertexIndex();
00089
00090
00091 int nvertices = 0;
00092
00093
00094 for (int iVertex = 0; iVertex < tpc.numberOfVertices(); ++iVertex) {
00095 tpc.setVertexIndex(iVertex);
00096
00097
00098 StjPrimaryVertex vertex = tpc.getVertex();
00099
00100
00101 if (vertex.ranking() <= 0) continue;
00102
00103
00104 ++nvertices;
00105
00106 StjTrackList trackList = jetbranch->anapars->tpcCuts()(tpc.getTrackList());
00107
00108
00109 StjTowerEnergyList bemcEnergyList;
00110
00111 if (jetbranch->anapars->useBemc) {
00112 StjBEMCMuDst bemc;
00113 bemcEnergyList = jetbranch->anapars->bemcCuts()(bemc.getEnergyList());
00114 }
00115
00116
00117 StjTowerEnergyList eemcEnergyList;
00118
00119 if (jetbranch->anapars->useEemc) {
00120 StjEEMCMuDst eemc;
00121 eemcEnergyList = jetbranch->anapars->eemcCuts()(eemc.getEnergyList());
00122 }
00123
00124
00125 StjTowerEnergyList energyList;
00126
00127 copy(bemcEnergyList.begin(),bemcEnergyList.end(),back_inserter(energyList));
00128 copy(eemcEnergyList.begin(),eemcEnergyList.end(),back_inserter(energyList));
00129
00130
00131 energyList = jetbranch->anapars->correctTowerEnergyForTracks()(energyList,trackList);
00132
00133
00134 FourList tpc4pList = StjeTrackListToStMuTrackFourVecList()(trackList);
00135 FourList energy4pList = StjeTowerEnergyListToStMuTrackFourVecList()(energyList);
00136
00137
00138 StProtoJet::FourVecList particles;
00139
00140 copy(tpc4pList.begin(),tpc4pList.end(),back_inserter(particles));
00141 copy(energy4pList.begin(),energy4pList.end(),back_inserter(particles));
00142
00143
00144 StJetFinder::JetList protojets;
00145 jetbranch->jetfinder->findJets(protojets,particles);
00146
00147
00148 protojets = jetbranch->anapars->jetCuts()(protojets);
00149
00150
00151 StJetVertex* jetvertex = jetbranch->event->newVertex();
00152 copyVertex(vertex,jetvertex);
00153
00154
00155 for (StJetFinder::JetList::const_iterator iProtoJet = protojets.begin(); iProtoJet != protojets.end(); ++iProtoJet)
00156 addJet(*iProtoJet,jetbranch->event,jetvertex);
00157
00158
00159 for (StProtoJet::FourVecList::const_iterator i = particles.begin(); i != particles.end(); ++i)
00160 delete *i;
00161 }
00162
00163
00164
00165 if (!nvertices) {
00166
00167 StjTowerEnergyList bemcEnergyList;
00168
00169 if (jetbranch->anapars->useBemc) {
00170 StjBEMCMuDst bemc;
00171 bemc.setVertex(0,0,0);
00172 bemcEnergyList = jetbranch->anapars->bemcCuts()(bemc.getEnergyList());
00173 }
00174
00175
00176 StjTowerEnergyList eemcEnergyList;
00177
00178 if (jetbranch->anapars->useEemc) {
00179 StjEEMCMuDst eemc;
00180 eemcEnergyList = jetbranch->anapars->eemcCuts()(eemc.getEnergyList());
00181 }
00182
00183
00184 StjTowerEnergyList energyList;
00185
00186 copy(bemcEnergyList.begin(),bemcEnergyList.end(),back_inserter(energyList));
00187 copy(eemcEnergyList.begin(),eemcEnergyList.end(),back_inserter(energyList));
00188
00189
00190 FourList energy4pList = StjeTowerEnergyListToStMuTrackFourVecList()(energyList);
00191
00192
00193 StProtoJet::FourVecList particles;
00194
00195 copy(energy4pList.begin(),energy4pList.end(),back_inserter(particles));
00196
00197
00198 StJetFinder::JetList protojets;
00199 jetbranch->jetfinder->findJets(protojets,particles);
00200
00201
00202 protojets = jetbranch->anapars->jetCuts()(protojets);
00203
00204
00205 StJetVertex* jetvertex = jetbranch->event->newVertex();
00206 jetvertex->mPosition.SetXYZ(0,0,0);
00207
00208
00209 for (StJetFinder::JetList::const_iterator iProtoJet = protojets.begin(); iProtoJet != protojets.end(); ++iProtoJet)
00210 addJet(*iProtoJet,jetbranch->event,jetvertex);
00211
00212
00213 for (StProtoJet::FourVecList::const_iterator i = particles.begin(); i != particles.end(); ++i)
00214 delete *i;
00215 }
00216
00217
00218 tpc.setVertexIndex(savedVertexIndex);
00219
00220 }
00221
00222 if (jetbranch->anapars->useMonteCarlo) {
00223 StjMCMuDst mc(this);
00224 StjPrimaryVertex mcvertex = mc.getMCVertex();
00225 StjMCParticleList mcparticles = jetbranch->anapars->mcCuts()(mc.getMCParticleList());
00226 StProtoJet::FourVecList particles;
00227 transform(mcparticles.begin(),mcparticles.end(),back_inserter(particles),StjMCParticleToStMuTrackFourVec());
00228
00229
00230 StJetFinder::JetList protojets;
00231 jetbranch->jetfinder->findJets(protojets,particles);
00232
00233
00234 protojets = jetbranch->anapars->jetCuts()(protojets);
00235
00236
00237 StJetVertex* jetvertex = jetbranch->event->newVertex();
00238 copyVertex(mcvertex,jetvertex);
00239
00240
00241 for (StJetFinder::JetList::const_iterator iProtoJet = protojets.begin(); iProtoJet != protojets.end(); ++iProtoJet)
00242 addJet(*iProtoJet,jetbranch->event,jetvertex);
00243
00244
00245 for (StProtoJet::FourVecList::const_iterator i = particles.begin(); i != particles.end(); ++i)
00246 delete *i;
00247 }
00248
00249 }
00250
00251 mTree->Fill();
00252
00253 return kStOk;
00254 }
00255
00256 int StJetMaker2009::Finish()
00257 {
00258 mFile->Write();
00259 mFile->Close();
00260
00261 return kStOk;
00262 }
00263
00264
00265
00266 void StJetMaker2009::addBranch(const char* name, StAnaPars* anapars, StJetPars* jetpars)
00267 {
00268 mJetBranches.push_back(new StJetBranch(name,anapars,jetpars));
00269 }
00270
00271 void StJetMaker2009::setJetFile(const char* filename)
00272 {
00273 mFileName = filename;
00274 }
00275
00276
00277
00278 TTree* StJetMaker2009::tree()
00279 {
00280 return mTree;
00281 }
00282
00283 StJetEvent* StJetMaker2009::event(const char* branchname)
00284 {
00285 TBranch* branch = mTree->GetBranch(branchname);
00286 if (branch) return *(StJetEvent**)branch->GetAddress();
00287 return 0;
00288 }
00289
00290 void StJetMaker2009::addJet(const StProtoJet& protojet, StJetEvent* event, StJetVertex* vertex)
00291 {
00292 StJetCandidate* jet = event->newJet(vertex->position(),TLorentzVector(protojet.px(),protojet.py(),protojet.pz(),protojet.e()));
00293 vertex->addJet(jet);
00294 jet->setVertex(vertex);
00295
00296
00297 const StProtoJet::FourVecList& particles = protojet.list();
00298 for (StProtoJet::FourVecList::const_iterator iParticle = particles.begin(); iParticle != particles.end(); ++iParticle) {
00299 const StMuTrackFourVec* particle = dynamic_cast<const StMuTrackFourVec*>(*iParticle);
00300
00301 if (const StMuTrackEmu* t = particle->track()) {
00302 StJetTrack* track = event->newTrack();
00303 copyTrack(t,track);
00304 jet->addTrack(track)->setJet(jet);
00305 }
00306
00307 if (const StMuTowerEmu* t = particle->tower()) {
00308 StJetTower* tower = event->newTower();
00309 copyTower(t,vertex,tower);
00310 jet->addTower(tower)->setJet(jet);
00311 }
00312
00313 if (const StMcTrackEmu* t = particle->mctrack()) {
00314 StJetParticle* part = event->newParticle();
00315 copyParticle(t,part);
00316 jet->addParticle(part)->setJet(jet);
00317 }
00318 }
00319
00320
00321 float sumTowerPt = jet->sumTowerPt();
00322 float sumTrackPt = jet->sumTrackPt();
00323 jet->mRt = sumTowerPt/(sumTowerPt+sumTrackPt);
00324 }
00325
00326 void StJetMaker2009::copyVertex(const StjPrimaryVertex& vertex, StJetVertex* jetvertex)
00327 {
00328 jetvertex->mPosition = vertex.position();
00329 jetvertex->mPosError = vertex.posError();
00330 jetvertex->mVertexFinderId = vertex.vertexFinderId();
00331 jetvertex->mRanking = vertex.ranking();
00332 jetvertex->mNTracksUsed = vertex.nTracksUsed();
00333 jetvertex->mNBTOFMatch = vertex.nBTOFMatch();
00334 jetvertex->mNCTBMatch = vertex.nCTBMatch();
00335 jetvertex->mNBEMCMatch = vertex.nBEMCMatch();
00336 jetvertex->mNEEMCMatch = vertex.nEEMCMatch();
00337 jetvertex->mNCrossCentralMembrane = vertex.nCrossCentralMembrane();
00338 jetvertex->mSumTrackPt = vertex.sumTrackPt();
00339 jetvertex->mMeanDip = vertex.meanDip();
00340 jetvertex->mChiSquared = vertex.chiSquared();
00341 jetvertex->mRefMultPos = vertex.refMultPos();
00342 jetvertex->mRefMultNeg = vertex.refMultNeg();
00343 jetvertex->mRefMultFtpcWest = vertex.refMultFtpcWest();
00344 jetvertex->mRefMultFtpcEast = vertex.refMultFtpcEast();
00345 }
00346
00347 void StJetMaker2009::copyTrack(const StMuTrackEmu* t, StJetTrack* track)
00348 {
00349 track->mId = t->id();
00350 track->mDetectorId = t->detectorId();
00351 track->mFlag = t->flag();
00352 track->mCharge = t->charge();
00353 track->mNHits = t->nHits();
00354 track->mNHitsFit = t->nHitsFit();
00355 track->mNHitsPoss = t->nHitsPoss();
00356 track->mNHitsDedx = t->nHitsDedx();
00357 track->mDedx = t->dEdx();
00358 track->mBeta = t->beta();
00359 track->mFirstPoint = t->firstPoint();
00360 track->mLastPoint = t->lastPoint();
00361 track->mExitTowerId = t->exitTowerId();
00362 track->mExitDetectorId = t->exitDetectorId();
00363 track->mExitPoint.SetPtEtaPhi(t->bemcRadius(),t->etaext(),t->phiext());
00364 track->mDca.SetXYZ(t->dcaX(),t->dcaY(),t->dcaZ());
00365 track->mDcaD = t->dcaD();
00366 track->mChi2 = t->chi2();
00367 track->mChi2Prob = t->chi2prob();
00368 TVector3 mom(t->px(),t->py(),t->pz());
00369 track->mPt = mom.Pt();
00370 track->mEta = mom.Eta();
00371 track->mPhi = mom.Phi();
00372 }
00373
00374 void StJetMaker2009::copyTower(const StMuTowerEmu* t, const StJetVertex* jetvertex, StJetTower* tower)
00375 {
00376 tower->mId = t->id();
00377 tower->mDetectorId = t->detectorId();
00378 tower->mAdc = t->adc();
00379 tower->mPedestal = t->pedestal();
00380 tower->mRms = t->rms();
00381 tower->mStatus = t->status();
00382
00383
00384
00385
00386 TVector3 mom(t->px(),t->py(),t->pz());
00387 float energy = mom.Mag();
00388
00389 switch (t->detectorId()) {
00390 case kBarrelEmcTowerId:
00391 mom.SetPtEtaPhi(StEmcGeom::instance("bemc")->Radius(),mom.Eta(),mom.Phi());
00392 break;
00393 case kEndcapEmcTowerId:
00394 mom.SetMag(EEmcGeomSimple::Instance().getZMean()/mom.Unit().z());
00395 break;
00396 }
00397
00398 mom -= jetvertex->position();
00399 mom.SetMag(energy);
00400
00401 tower->mPt = mom.Pt();
00402 tower->mEta = mom.Eta();
00403 tower->mPhi = mom.Phi();
00404 }
00405
00406 void StJetMaker2009::copyParticle(const StMcTrackEmu* t, StJetParticle* particle)
00407 {
00408 particle->mId = t->id();
00409 particle->mPt = t->pt();
00410 particle->mEta = t->eta();
00411 particle->mPhi = t->phi();
00412 particle->mM = t->m();
00413 particle->mE = t->e();
00414 particle->mPdg = t->pdg();
00415 particle->mStatus = t->status();
00416 }