00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <vector>
00018 #include <algorithm>
00019
00020 #include "TFile.h"
00021 #include "TH2F.h"
00022 #include "TObjArray.h"
00023
00024
00025 #include "TROOT.h"
00026 #include "TNtuple.h"
00027 #include "TTree.h"
00028
00029
00030 #include "StChain.h"
00031 #include "StEvent.h"
00032 #include "StEventTypes.h"
00033 #include "StHit.h"
00034 #include "StMeasuredPoint.h"
00035 #include "StEvent/StTriggerData.h"
00036 #include "StEvent/StL0Trigger.h"
00037
00038
00039 #include "StMuDSTMaker/COMMON/StMuDst.h"
00040 #include "StMuDSTMaker/COMMON/StMuEvent.h"
00041 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00042 #include "StMuDSTMaker/COMMON/StMuEmcCollection.h"
00043 #include "StMuDSTMaker/COMMON/StMuDst.h"
00044 #include "StMuDSTMaker/COMMON/StMuEmcUtil.h"
00045 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00046
00047
00048 #include "StEmcUtil/geometry/StEmcGeom.h"
00049 #include "StEmcUtil/projection/StEmcPosition.h"
00050
00051
00052 #include "StSpinPool/StSpinDbMaker/StSpinDbMaker.h"
00053
00054
00055 #include "StPrimaryVertex.h"
00056 #include "StPrimaryTrack.h"
00057 #include "StDedxPidTraits.h"
00058 #include "StTrackFitTraits.h"
00059 #include "StTrackDetectorInfo.h"
00060 #include "StTrackGeometry.h"
00061 #include "StTpcDedxPidAlgorithm.h"
00062 #include "StTriggerDetectorCollection.h"
00063 #include "StCtbTriggerDetector.h"
00064 #include "StZdcTriggerDetector.h"
00065 #include "StEventTypes.h"
00066 #include "StMemoryInfo.hh"
00067
00068 #include "StTrack.h"
00069 #include "StVertex.h"
00070 #include "StMaker.h"
00071
00072
00073 #include "StDetectorDbMaker/StDetectorDbTriggerID.h"
00074
00075
00076
00077
00078
00079
00080 #include "StEmcUtil/projection/StEmcPosition.h"
00081
00082
00083 #include "StTriggerUtilities/StTriggerSimuMaker.h"
00084 #include "StTriggerUtilities/Bbc/StBbcTriggerSimu.h"
00085 #include "StTriggerUtilities/Bemc/StBemcTriggerSimu.h"
00086 #include "StTriggerUtilities/L2Emulator/StL2TriggerSimu.h"
00087
00088
00089
00090
00091 #include "StThreeVectorF.hh"
00092 #include "StSkimPionMaker.h"
00093
00094
00095 #include "StBbcTriggerDetector.h"
00096
00097
00098 #include "TSkimPionEvent.h"
00099
00100 ClassImp(StSkimPionMaker);
00101
00102
00103 StSkimPionMaker::StSkimPionMaker(const char *name, Bool_t doTracks, const char *outfile):StMaker(name)
00104 {
00105
00106 mDoTracks = doTracks;
00107 mFileName = outfile;
00108
00109 mPi = 3.1416;
00110 mPi0Mass = 0.13498;
00111
00112 debug = false;
00113 fnummixed = 10;
00114
00115
00116 ievtot=0;
00117 iWrittenEvents = 0;
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 }
00128
00129
00130 StSkimPionMaker::~StSkimPionMaker()
00131 {
00132
00133 }
00134
00135
00136 Int_t StSkimPionMaker::Init()
00137 {
00138
00139
00140 if (debug) cout << "++++++++++++ StSkimPionMaker::Init()" << endl;
00141
00142 mTables = new StBemcTables();
00143
00144 mFile = new TFile(mFileName,"RECREATE");
00145
00146
00147 photonlist = new TObjArray();
00148
00149
00150 pi0Tree = new TTree("pi0Tree", "Pi0 Event Tree");
00151 pi0Event = new TSkimPionEvent();
00152 pi0Tree->Branch("EventBranch", "TSkimPionEvent", &pi0Event);
00153
00154
00155
00156 if (debug) cout << "StSkimPionMaker: Init done..." << endl;
00157
00158 return StMaker::Init();
00159 }
00160
00161
00162 Int_t StSkimPionMaker::InitRun(int runnumber)
00163 {
00164 return StMaker::InitRun(runnumber);
00165 }
00166
00167
00168 Int_t StSkimPionMaker::Make()
00169 {
00170
00171
00172
00173 ievtot++;
00174 if (debug)
00175 cout <<"+++++++++++++++++++++++++++++++++++++++++ event: "<<ievtot<<endl;
00176
00177
00178
00179
00180 mMuDst = (StMuDst*)GetInputDS("MuDst");
00181 if (!mMuDst) return 1;
00182
00183
00184
00185 StMuEvent* event = mMuDst->event();
00186
00187 if (!event)
00188 {
00189 if (debug) cout <<"++++++++++++ StSkimPionMaker::Make() Cannot get the event pointer"<<endl;
00190 return kStOK;
00191 }
00192
00193 runN = event->runNumber();
00194 eventN = event->eventNumber();
00195 fillN = (Int_t)event->runInfo().beamFillNumber(yellow);
00196
00197 pi0Event->SetRunNo((Int_t)runN);
00198 pi0Event->SetEventNo((Int_t)eventN);
00199 pi0Event->SetFillNo((Int_t)fillN);
00200
00201
00202 mField = event->magneticField()/10.;
00203
00204
00205
00206 if (fabs(mField)<0.01)
00207 {
00208 if (debug) cout << "BField read back as 0, setting default." << endl;
00209 mField = 0.497952;
00210 }
00211
00212
00213
00214
00215
00216
00217
00218 StTriggerSimuMaker* trigSim = dynamic_cast<StTriggerSimuMaker*>(GetMaker("StarTrigSimu"));
00219 if (trigSim) {
00220
00221 mBBCTrig = (trigSim->bbc)->triggerDecision(137611);
00222
00223 }
00224 else {
00225 if (debug) cout << "StFranksPi0Maker::Make() could not find SimuTrig \n";
00226 mBBCTrig = 0;
00227 }
00228
00229 pi0Event->SetBBCTrig(mBBCTrig);
00230
00231
00232
00233 StL0Trigger* trig=&(event->l0Trigger());
00234 Int_t mubx48=trig->bunchCrossingId();
00235 Int_t mubx7=trig->bunchCrossingId7bit(runN);
00236 pi0Event->SetSpinBit(trig->spinBits(runN));
00237 pi0Event->SetBunchX48(mubx48);
00238 pi0Event->SetBunchX7(mubx7);
00239
00240
00241 StSpinDbMaker* spDb = (StSpinDbMaker*)GetMaker("spinDb");
00242 if (spDb) {
00243 Int_t val = 0;
00244 if ((spDb->offsetBX48minusBX7(mubx48,mubx7)==0)&&(spDb->isValid())) val = 1;
00245 pi0Event->SetValidSpin(val);
00246 pi0Event->SetPolLong(spDb->isPolDirLong());
00247 pi0Event->SetMaskedXing(spDb->isMaskedUsingBX48(mubx48));
00248 pi0Event->SetDbSpinBit(spDb->spin4usingBX48(mubx48));
00249 }
00250 else {
00251 pi0Event->SetValidSpin(0);
00252 }
00253
00254 int softwaretrigs[2] = {0,0};
00255 int mcMB = 0;
00256 int mcHTTPL2 = 0;
00257 if ((trigSim->bbc)->triggerDecision(137611)) mcMB = 1;
00258 if (trigSim) {
00259
00260 if ((trigSim->isTrigger(137611)) || (trigSim->isTrigger(127611))) mcHTTPL2 = 1;
00261 }
00262
00263 else {
00264 if (debug) cout<<"SkimPionMaker::Make() could not find the trigger emulator"<<endl;
00265 mHiTowerAdc6Bit = 0;
00266 }
00267
00268 softwaretrigs[0] = mcMB;
00269 softwaretrigs[1] = mcHTTPL2;
00270
00271 pi0Event->SetHiTowerAdc6Bit(mHiTowerAdc6Bit);
00272
00273
00274 StThreeVectorF mcVertexPos;
00275
00276
00277
00278 int startriggers[4] = {117001, 137611, 5};
00279
00280 int trigs[3] = {0,0,0};
00281 int prescales[3] = {0,0,0};
00282
00283
00284
00285 for (int i=0; i<3; ++i) {
00286 if (event->triggerIdCollection().nominal().isTrigger(startriggers[i])) {
00287 trigs[i] = 1;
00288 if (debug) cout << "Trigger condition " << i << " satisfied..." << endl;
00289 }
00290 }
00291 if (event->triggerIdCollection().nominal().isTrigger(127611)) trigs[1] = 1;
00292
00293
00294
00295 StDetectorDbTriggerID& v = *(StDetectorDbTriggerID::instance());
00296 for (int i=0;i<3;++i) {
00297 prescales[i]=v.getTotalPrescaleByTrgId(startriggers[i]);
00298 }
00299 if (event->triggerIdCollection().nominal().isTrigger(127611)) prescales[1]=v.getTotalPrescaleByTrgId(127611);
00300
00301
00302 mb = trigs[0];
00303 httpl2 = trigs[1];
00304 httpl2_test = trigs[2];
00305
00306 pi0Event->SetTriggers(trigs);
00307 pi0Event->SetPrescales(prescales);
00308 pi0Event->SetSoftTriggers(softwaretrigs);
00309
00310
00311
00312
00313 if (!((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2))) {
00314
00315 pi0Event->Clear();
00316 return kStOk;
00317 }
00318
00319
00320 StThreeVectorF vPos;
00321 vPos = event->primaryVertexPosition();
00322
00323
00324
00325 StBbcTriggerDetector bbc = event->bbcTriggerDetector();
00326
00327
00328
00329 mBBCVertexZ = 0;
00330 pi0Event->SetBBCVertexZ(mBBCVertexZ);
00331
00332
00333 pi0Event->SetBBCTimeBin(bbc.onlineTimeDifference());
00334
00335
00336 if((vPos.z() == 0)||(TMath::Abs(vPos.z()) > 300)) {
00337 if (mBBCVertexZ == 0) mBBCVertexZ = 0.001;
00338 vPos.setZ(mBBCVertexZ);
00339 vPos.setX(0.);
00340 vPos.setY(0.);
00341 pi0Event->SetOnlyBBCVertex();
00342 }
00343
00344 StEvent *stevent = (StEvent*)this->GetInputDS("StEvent");
00345 if (!stevent) {
00346 if (debug) cout << "++++++++++++ StSkimPionMaker::Make: Can't get StEvent pointer" << endl;
00347 return kStOk;
00348 }
00349
00350 StEmcCollection* emccol = (StEmcCollection*)stevent->emcCollection();
00351 if (!emccol) {
00352 if (debug) cout <<"++++++++++++ StSkimPionMaker::Make() No EMC Collection"<<endl;
00353
00354 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00355 iWrittenEvents++;
00356 pi0Tree->Fill();
00357 }
00358 pi0Event->Clear();
00359 return kStOk;
00360 }
00361
00362 StEmcDetector* bemc = emccol->detector(kBarrelEmcTowerId);
00363 if (!bemc) {
00364 if (debug) cout <<"++++++++++++ StSkimPionMaker::Make() No BEMC detector"<<endl;
00365
00366 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00367 pi0Tree->Fill();
00368 iWrittenEvents++;
00369 }
00370 pi0Event->Clear();
00371 return kStOk;
00372 }
00373
00374 StSPtrVecEmcPoint& bEmcPoints = emccol->barrelPoints();
00375
00376
00377 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
00378
00379
00380 long numberOfPrimaryTracks = mMuDst->primaryTracks()->GetEntries();
00381
00382
00383
00384 pi0Event->SetVertex(vPos.x(),vPos.y(),vPos.z());
00385
00386 if (vPos.z()==0) {
00387 if (debug) cout <<"++++++++++++ StSkimPionMaker::Make() z_vertex==0"<<endl;
00388 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00389 pi0Tree->Fill();
00390 iWrittenEvents++;
00391 }
00392 pi0Event->Clear();
00393 return kStOk;
00394 }
00395
00396 if (!(vPos.z()>-100. && vPos.z()<100.))
00397 {
00398 if (debug) cout <<"++++++++++++ StSkimPionMaker::Make() z_vertex out of range!"<<endl;
00399 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00400 pi0Tree->Fill();
00401 iWrittenEvents++;
00402 }
00403 pi0Event->Clear();
00404 return kStOk;
00405 }
00406
00407
00408 StMuTrack* t;
00409 Float_t chargedPtSum = 0;
00410
00411 for (int i = 0; i < numberOfPrimaryTracks; i++) {
00412 t = mMuDst->primaryTracks(i);
00413 if ((t->nHits() > 15)&&(t->dca().mag() < 3.0)&&(t->eta() > -1.)&&(t->eta() < 1.))
00414 chargedPtSum += t->pt();
00415 }
00416
00417 pi0Event->SetChargedPtSum(chargedPtSum);
00418
00419
00420
00421
00422
00423
00424
00425 if (bEmcPoints.size()==0)
00426 {
00427 if (debug) cout <<"++++++++++++ StSkimPionMaker::Make() No BEMC points"<<endl;
00428 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00429 pi0Tree->Fill();
00430 iWrittenEvents++;
00431 }
00432 pi0Event->Clear();
00433 return kStOk;
00434 }
00435
00436
00437 if (debug) cout <<"--- Number of primary tracks in this event: "<<numberOfPrimaryTracks<<endl;
00438
00439 Int_t runnm = runN-5000000;
00440 if (debug) cout <<"--- event accepted... RUN_ID: "<<runN<<" ("<<runnm<<")"<<endl;
00441
00442
00443 if (!readPointList())
00444 {
00445 if (debug) cout <<"+++ ERROR read readPointList()"<<endl;
00446 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00447 pi0Tree->Fill();
00448 iWrittenEvents++;
00449 }
00450 pi0Event->Clear();
00451 return kStOk;
00452 }
00453
00454
00455
00456
00457
00458
00459
00460 if (mDoTracks) associateTracksWithEmcPoints(this);
00461
00462
00463 Float_t neutralEnergy = getNeutralEnergySum(photonlist);
00464
00465 pi0Event->SetNeutralEnergy(neutralEnergy);
00466
00467
00468
00469
00470
00471
00472 if (photonlist->GetEntries()>0 && bEmcPoints.size()<=100 && vPos.z()>-100 && vPos.z()<100) {
00473 if (debug) cout<< "--- new photon " << photonlist->GetEntries() << endl;
00474
00475
00476 getInvMass(0, photonlist, photonlist, vPos.z(), vPos, trigs, prescales);
00477 }
00478
00479
00480 if ((mb)||(httpl2)||(httpl2_test)||(mcHTTPL2)) {
00481 pi0Tree->Fill();
00482 iWrittenEvents++;
00483 }
00484
00485 pi0Event->Clear();
00486
00487
00488 photonlist->Clear();
00489 if (debug) cout <<"--- reset photon/charged_pion list done"<<endl;
00490
00491 return kStOK;
00492 }
00493
00494
00495
00496 Int_t StSkimPionMaker::Finish()
00497 {
00498 cout << "Events written to tree: " << iWrittenEvents << endl;
00499
00500 mFile->Write();
00501 mFile->Close();
00502 return kStOk;
00503 }
00504
00505
00506 StThreeVectorF StSkimPionMaker::getPoint(StEmcPoint *p, Int_t &id, Float_t &e, Float_t &pt, Int_t &n, Int_t &t, Float_t &eSMDe, Float_t &eSMDp, Float_t &eTower, Float_t &sSMDe, Float_t &sSMDp, Float_t &sTower)
00507 {
00508
00509
00510
00511 StMuEvent* event = mMuDst->event();
00512 if(!event)
00513 {
00514 cout << "++++++++++++ StSkimPionMaker::getPoint: Can't get Event pointer" << endl;
00515
00516 StThreeVectorF abortVector(-10000.,0.,0.);
00517 return abortVector;
00518 }
00519
00520
00521 StThreeVectorF MainVertexPosition;
00522 MainVertexPosition = event->primaryVertexPosition();
00523
00524 const StThreeVectorF& pointVector = p->position();
00525
00526
00527 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
00528 Int_t mod, eta, sub;
00529 emcGeom->getBin(pointVector.phi(), pointVector.pseudoRapidity(), mod, eta, sub);
00530 emcGeom->getId(mod, eta, sub, id);
00531
00532
00533 StPtrVecEmcCluster& towerClus=p->cluster(kBarrelEmcTowerId);
00534 StPtrVecEmcCluster& etaClus=p->cluster(kBarrelSmdEtaStripId);
00535 StPtrVecEmcCluster& phiClus=p->cluster(kBarrelSmdPhiStripId);
00536 Int_t nEtaHits=0;
00537 Int_t nPhiHits=0;
00538 Int_t nTowerHits = 0;
00539 Float_t towerEnergy = 0;
00540 Float_t etaEnergy=0.;
00541 Float_t phiEnergy=0.;
00542 Float_t etaWidth=0.;
00543 Float_t phiWidth=0.;
00544 Int_t tId[5];
00545 Float_t tEnergy[5];
00546 for (int k=0;k<5;k++) {
00547 tId[k] = 0;
00548 tEnergy[k] = 0;
00549 }
00550 Float_t fraction = 0;
00551
00552 if(towerClus.size() > 0) {
00553 StEmcCluster *clT=(StEmcCluster*)towerClus[0];
00554 StPtrVecEmcRawHit& hT=clT->hit();
00555 nTowerHits=hT.size();
00556 if (debug) cout<<"the number of towers is "<<nTowerHits<<endl;
00557 for (Int_t j=0; j<nTowerHits; j++) {
00558
00559 StEmcRawHit *rawHit = (StEmcRawHit*)hT[j];
00560 tId[j] = rawHit->softId(emcGeom->Detector());
00561
00562 if (tId[j] == 0) continue;
00563 tEnergy[j] = rawHit->energy();
00564
00565 }
00566 id = tId[0];
00567 towerEnergy = tEnergy[0];
00568 }
00569
00570 if(etaClus.size()>0){
00571 StEmcCluster *clE=(StEmcCluster*)etaClus[0];
00572 StPtrVecEmcRawHit& hE=clE->hit();
00573 nEtaHits=hE.size();
00574 etaEnergy=clE->energy();
00575 etaWidth=clE->sigmaEta();
00576 }
00577 if(phiClus.size()>0){
00578 StEmcCluster *clP=(StEmcCluster*)phiClus[0];
00579 StPtrVecEmcRawHit& hP=clP->hit();
00580 nPhiHits=hP.size();
00581 phiEnergy=clP->energy();
00582 phiWidth=clP->sigmaPhi();
00583 }
00584
00585
00586 e = p->energy();
00587
00588
00589 fraction = e/(tEnergy[0]+tEnergy[1]+tEnergy[2]+tEnergy[3]+tEnergy[4]);
00590
00591
00592
00593
00594
00595 Float_t theta = 0.;
00596 emcGeom->getTheta(mod, eta, theta);
00597 pt = e * sin(theta);
00598
00599
00600 n = p->nTracks();
00601
00602
00603 t=0;
00604 if (p->energyInDetector(StDetectorId(kBarrelEmcTowerId+2)))
00605 t++;
00606 if (p->energyInDetector(StDetectorId(kBarrelEmcTowerId+3)))
00607 t+=2;
00608
00609 eSMDe = etaEnergy;
00610 eSMDp = phiEnergy;
00611 eTower = towerEnergy;
00612 sSMDe = nEtaHits;
00613 sSMDp = nPhiHits;
00614 sTower = nTowerHits;
00615 if (debug) cout <<"++++++++++++ StSkimPionMaker::getPoint: tower, t, n, e, pt ---> "<<id<<" "<<t<<" "<<n<<" "<<e<<" "<<pt<< endl;
00616
00617 return pointVector;
00618 }
00619
00620
00621
00622
00623 Int_t StSkimPionMaker::doTrackPtHist(float eT, float threshold, TObjArray *photonlist)
00624 {
00625 if (debug) cout <<"++++++++++++ StSkimPionMaker::doTrackPtHist: entered"<<endl;
00626
00627 StEvent *event = (StEvent*)this->GetInputDS("StEvent");
00628 if (!event)
00629 {
00630 if (debug) cout << "StSkimPionMaker::doTrackPtHist: Can't get Event pointer" << endl;
00631 return kStOk;
00632 }
00633
00634
00635 int numberOfPrimaries= mMuDst->primaryTracks()->GetEntries();
00636 int numberOfGlobals= mMuDst->globalTracks()->GetEntries();
00637
00638 StMuTrack* track;
00639 StThreeVectorF trackMomentum;
00640
00641 for (int i = 0; i < numberOfGlobals; i++)
00642 {
00643 track = mMuDst->globalTracks(i);
00644 if (track && track->flag()>=0) {
00645 trackMomentum = track->p();
00646 }
00647
00648 }
00649
00650 if (debug) cout <<"++++++++++++ StSkimPionMaker::doTrackPtHist: got tracks, try to get points"<<endl;
00651
00652
00653 for (Int_t i=0; i<photonlist->GetEntries(); i++)
00654 {
00655 StEmcPoint *p = (StEmcPoint *) photonlist->At(i);
00656 const StThreeVectorF& pointVector = p->position();
00657
00658 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
00659
00660 Int_t mod, eta, sub;
00661 emcGeom->getBin(pointVector.phi(), pointVector.pseudoRapidity(), mod, eta, sub);
00662
00663
00664 Float_t e = p->energy();
00665
00666
00667 Float_t theta = 0.;
00668 emcGeom->getTheta(mod, eta, theta);
00669 Float_t pt = e * sin(theta);
00670 }
00671
00672 return kStOk;
00673 }
00674
00675
00676
00677 Float_t StSkimPionMaker::getHiTowerEt(StEmcCollection* emccol)
00678 {
00679
00680 if (debug) cout <<"++++++++++++ StSkimPionMaker::getHiTowerEt: entered"<<endl;
00681
00682
00683
00684
00685 StEmcDetector* bemc = emccol->detector(kBarrelEmcTowerId);
00686 if (!bemc)
00687 {
00688 if (debug) cout <<"++++++++++ StSkimPionMaker::getHiTowerEt(): No BEMC detector"<<endl;
00689 return 0;
00690 }
00691
00692 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
00693 Float_t hiTowerEt = 0;
00694 Float_t e, eT, theta;
00695
00696 for (UInt_t i=1; i<=bemc->numberOfModules(); i++)
00697 {
00698 StEmcModule* module = bemc->module(i);
00699 StSPtrVecEmcRawHit& hits = module->hits();
00700 StSPtrVecEmcRawHitIterator hIter;
00701
00702 for (hIter=hits.begin(); hIter!=hits.end(); hIter++)
00703 {
00704
00705 e = (*hIter)->energy();
00706 emcGeom->getTheta((*hIter)->module(),(*hIter)->eta(), theta);
00707 eT = e * sin(theta);
00708
00709 if (eT > hiTowerEt) hiTowerEt = eT;
00710 }
00711 }
00712 return hiTowerEt;
00713 }
00714
00716
00717
00718 Int_t StSkimPionMaker::associateTracksWithEmcPoints(StMaker* anyMaker)
00719 {
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730 if (debug) cout <<"++++++++++++ StSkimPionMaker::associateTracksWithEmcPoints: ENTERED"<<endl;
00731
00732 StEvent *event = (StEvent*)anyMaker->GetInputDS("StEvent");
00733 if (!event)
00734 {
00735 if (debug) cout << "++++++++++++ StSkimPionMaker::associateTracksWithEmcPoints: Can't get Event pointer" << endl;
00736 return kStOk;
00737 }
00738 StEmcCollection* emccol = (StEmcCollection*)event->emcCollection();
00739 if (!emccol)
00740 {
00741 if (debug) cout << "++++++++++++ StSkimPionMaker::associateTracksWithEmcPoints: No EMC Collection" << endl;
00742 return kStOk;
00743 }
00744 StSPtrVecEmcPoint& bEmcPoints = emccol->barrelPoints();
00745 if (bEmcPoints.size()==0)
00746 {
00747
00748 return kStOk;
00749 }
00750
00751
00752 for (StSPtrVecEmcPointIterator it=bEmcPoints.begin(); it!=bEmcPoints.end(); it++)
00753 (*it)->track().clear();
00754
00755
00756
00757
00758 Double_t bFld = mField;
00759
00760 Int_t mod, eta, sub;
00761 StEmcPosition* pos = new StEmcPosition();
00762 StThreeVectorD position, momentum;
00763 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
00764
00765 int numberOfPrimaries= mMuDst->primaryTracks()->GetEntries();
00766 int numberOfGlobals= mMuDst->globalTracks()->GetEntries();
00767
00768 StMuTrack* track;
00769 StTrack* dummyTrack = new StGlobalTrack();
00770 StThreeVectorF trackMomentum;
00771
00772 for (int i = 0; i < numberOfGlobals; i++)
00773 {
00774 track = mMuDst->globalTracks(i);
00775 if (track && track->flag()>=0) {
00776 Bool_t ok = pos->trackOnEmc(&position, &momentum, track, bFld);
00777 if (!ok) continue;
00778
00779
00780 emcGeom->getBin(position.phi(), position.pseudoRapidity(), mod, eta, sub);
00781
00782 for (StSPtrVecEmcPointIterator it=bEmcPoints.begin(); it!=bEmcPoints.end(); it++)
00783 {
00784 StPtrVecEmcCluster bEmcClusters = (*it)->cluster(kBarrelEmcTowerId);
00785
00786 for (StPtrVecEmcClusterIterator cIter=bEmcClusters.begin(); cIter!=bEmcClusters.end(); cIter++)
00787 {
00788 StPtrVecEmcRawHit& bEmcHits = (*cIter)->hit();
00789
00790 for (StPtrVecEmcRawHitIterator hIter=bEmcHits.begin(); hIter!=bEmcHits.end(); hIter++)
00791 {
00792
00793 if (mod == (Int_t)(*hIter)->module() &&
00794 eta == (Int_t)(*hIter)->eta() &&
00795 sub == (Int_t)(*hIter)->sub())
00796 {
00797
00798 (*it)->addTrack(dummyTrack);
00799 break;
00800 }
00801 }
00802 }
00803 }
00804
00805 }
00806 }
00807 delete pos;
00808 delete dummyTrack;
00809 return kStOk;
00810 }
00811
00812
00813 Float_t StSkimPionMaker::getNeutralEnergySum(TObjArray *photonlist)
00814 {
00815 Float_t eSum = 0;
00816 Int_t cntb=0;
00817 Int_t id1, n1, t1;
00818 Float_t e1, pt1;
00819 Float_t eSMDe1, eSMDp1;
00820 Float_t eTower1;
00821 Float_t sSMDe1, sSMDp1, sTower1;
00822
00823 for (Int_t i=0; i<photonlist->GetEntries(); i++)
00824 {
00825 StEmcPoint *p1 = (StEmcPoint *) photonlist->At(i);
00826 StThreeVectorF v1 = getPoint(p1, id1,e1,pt1,n1,t1, eSMDe1, eSMDp1, eTower1,sSMDe1, sSMDp1, sTower1);
00827 if ((n1 == 0)&&(id1 < 4801))
00828 eSum += e1;
00829 if (v1(0) == -10000.)
00830 eSum = 0;
00831 }
00832
00833 return eSum;
00834 }
00835
00836
00837 void StSkimPionMaker::getPhotonSpectra(TObjArray *photonlist, int runnm, float vertex_z, int bemc_hits)
00838 {
00839
00840
00841 if (debug) cout <<"++++++++++ StSkimPionMaker::GetPhotonSpectra: entered"<<endl;
00842
00843 Int_t cntb=0;
00844 Int_t id1, n1, t1;
00845 Float_t e1, pt1;
00846 Float_t eSMDe1, eSMDp1;
00847 Float_t eTower1;
00848 Float_t sSMDe1, sSMDp1, sTower1;
00849
00850 Float_t pt1_trg=0;
00851 Int_t id1_trg=0;
00852
00853 for (Int_t i=0; i<photonlist->GetEntries(); i++)
00854 {
00855 StEmcPoint *p1 = (StEmcPoint *) photonlist->At(i);
00856
00857
00858 StThreeVectorF v1 = getPoint(p1, id1,e1,pt1,n1,t1, eSMDe1, eSMDp1, eTower1,sSMDe1, sSMDp1, sTower1);
00859 if (v1(0) == -10000.)
00860 return;
00861
00862
00863 if (debug) cout << "Photon track association: " << n1 << endl;
00864
00865 if (n1==0)
00866 {
00867 if (pt1>pt1_trg)
00868 {
00869 pt1_trg = pt1;
00870 id1_trg = id1;
00871 }
00872
00873
00874 cntb++;
00875 }
00876 }
00877 return;
00878 }
00879
00880
00881 void StSkimPionMaker::getInvMass(int mode, TObjArray *photonlist1, TObjArray *photonlist2,
00882 float vertex_z, StThreeVectorF primaryVertex, int triggers[3], int prescales[3])
00883 {
00884 if (debug) cout <<"++++++++++ StSkimPionMaker::getInvMass: list1 "<<photonlist1->GetEntries()<<endl;
00885 if (debug) cout <<"++++++++++ StSkimPionMaker::getInvMass: list2 "<<photonlist2->GetEntries()<<endl;
00886
00887 Float_t chargedAssociation1 = 0;
00888 Float_t chargedAssociation2 = 0;
00889
00890
00891 for (Int_t i=0; i<photonlist1->GetEntries(); i++)
00892 {
00893 if (debug) cout <<"++++++++++ StSkimPionMaker::getInvMass: first loop (mode "<<mode<<")"<<endl;
00894 StEmcPoint *p1 = (StEmcPoint *) photonlist1->At(i);
00895
00896 Int_t id1, n1, t1;
00897 t1 = 0;
00898 Float_t e1, pt1;
00899 Float_t eSMDe1;
00900 Float_t eSMDp1;
00901 Float_t eTower1;
00902 Float_t sSMDe1, sSMDp1, sTower1;
00903
00904 StThreeVectorF v1 = getPoint(p1, id1,e1,pt1,n1,t1, eSMDe1, eSMDp1, eTower1,sSMDe1, sSMDp1, sTower1);
00905 if (v1(0) == -10000.)
00906 return;
00907 chargedAssociation1 = n1;
00908
00909
00910 Float_t hitdat[16];
00911 hitdat[0] = v1.x();
00912 hitdat[1] = v1.y();
00913 hitdat[2] = v1.z();
00914 hitdat[3] = id1;
00915 hitdat[4] = e1;
00916 hitdat[5] = pt1;
00917 hitdat[6] = n1;
00918 hitdat[7] = t1;
00919 hitdat[8] = eSMDe1;
00920 hitdat[9] = eSMDp1;
00921 hitdat[10] = eTower1;
00922 hitdat[11] = sSMDe1;
00923 hitdat[12] = sSMDp1;
00924 hitdat[13] = sTower1;
00925 hitdat[14] = v1.phi();
00926 hitdat[15] = v1.pseudoRapidity();
00927
00928 THit hitCand;
00929 hitCand.SetAll(hitdat);
00930 pi0Event->AddHit(hitCand);
00931
00932
00933
00934
00935 if (debug) cout <<"++++++++++ StSkimPionMaker::getInvMass: second loop (mode "<<mode<<")"<<endl;
00936
00937 Int_t j = 999;
00938 if (mode==0) j=i+1;
00939 if (mode==1) j=0;
00940
00941 for (Int_t k=j; k<photonlist2->GetEntries(); k++)
00942 {
00943 StEmcPoint *p2 = (StEmcPoint *) photonlist2->At(k);
00944
00945 Int_t id2, n2, t2;
00946 t2 = 0;
00947 Float_t e2, pt2;
00948 Float_t eSMDe2;
00949 Float_t eSMDp2;
00950 Float_t eTower2;
00951 Float_t sSMDe2, sSMDp2, sTower2;
00952
00953 StThreeVectorF v2 = getPoint(p2, id2,e2,pt2,n2,t2, eSMDe2, eSMDp2, eTower2,sSMDe2, sSMDp2, sTower2);
00954 if (v2(0) == -10000)
00955 return;
00956 chargedAssociation2 = n2;
00957
00958
00959
00960 if (t1>-99 && t2>-99)
00961 {
00962 if (debug) cout <<"++++++++++ StSkimPionMaker::getInvMass: get invariant mass for photon pair"<<endl;
00963
00964
00965
00966
00967
00968
00969 StThreeVectorF v1rel;
00970 StThreeVectorF v2rel;
00971 StThreeVectorF vdist = v1 - v2;
00972
00973 if (mode == 0) {
00974 v1rel = v1 - primaryVertex;
00975 v2rel = v2 - primaryVertex;
00976 }
00977 else {
00978 v1rel = v1;
00979 v2rel = v2;
00980 }
00981
00982 Float_t dist = vdist.mag();
00983 double mInvPi0;
00984 StThreeVectorF pPi0;
00985 Float_t asym;
00986 Float_t cosAng;
00987 Float_t phi1;
00988 Float_t phi2;
00989
00990 if (debug) cout << "Pi0 candidate: tower1: " << id1 << " tower2: " << id2 << " triggerTower: " << triggerTower << endl;
00991 getMass(v1rel,v2rel,e1,e2, mInvPi0,pPi0,asym,cosAng, phi1,phi2);
00992
00993
00994
00995
00996
00997 Float_t cdat[24];
00998 cdat[0]= pPi0.perp();
00999 cdat[1] = mInvPi0;
01000 cdat[2] = pPi0.pseudoRapidity();
01001 cdat[3] = pPi0.phi();
01002 cdat[4] = asym;
01003 cdat[5] = cosAng;
01004 cdat[6] = id1;
01005 cdat[7] = id2;
01006 cdat[8] = chargedAssociation1;
01007 cdat[9] = chargedAssociation2;
01008 cdat[10] = t1;
01009 cdat[11] = t2;
01010 cdat[12] = e1;
01011 cdat[13] = e2;
01012 cdat[14] = eTower1;
01013 cdat[15] = eTower2;
01014 cdat[16] = eSMDe1;
01015 cdat[17] = eSMDp1;
01016 cdat[18] = eSMDe2;
01017 cdat[19] = eSMDp2;
01018 cdat[20] = v1.pseudoRapidity();
01019 cdat[21] = v1.phi();
01020 cdat[22] = v2.pseudoRapidity();
01021 cdat[23] = v2.phi();
01022
01023 if ((mode==0)&&(cdat[0] > 0.5)) {
01024 TSkimPionCandidate piCand;
01025 piCand.SetAll(cdat);
01026 pi0Event->AddSkimPionCandidate(piCand);
01027 }
01028
01029 }
01030 }
01031 }
01032 return;
01033 }
01034
01035
01036
01037 Bool_t StSkimPionMaker::getMass(StThreeVectorF P1, StThreeVectorF P2, Float_t e1, Float_t e2, double &mInv, StThreeVectorF &pPi0, Float_t &asym, Float_t &cosAng, Float_t &phi1, Float_t &phi2)
01038 {
01039 if (debug) cout << "++++++++++++ StSkimPionMaker::getMass(): enter pi0 minv calcualtion..." << endl;
01040
01041 Double_t VecProd = P1.x()*P2.x() + P1.y()*P2.y() + P1.z()*P2.z();
01042 cosAng = VecProd/(P1.magnitude()*P2.magnitude());
01043
01044 double mInv2 = 2*e1*e2*(1-cosAng);
01045 if (mInv2>0)
01046 {
01047 mInv = TMath::Sqrt(mInv2);
01048 }
01049 else
01050 mInv = -999.0;
01051
01052 asym = fabs(e1-e2)/(e1+e2);
01053
01054
01055 phi1 = P1.phi();
01056 phi2 = P2.phi();
01057
01058 pPi0 = e1*P1/P1.mag() + e2*P2/P2.mag();
01059
01060 if (debug) cout <<"++++++++++++ StSkimPionMaker::getMass(): mInv, asym, pPi0: "<<mInv<<" "<<asym<<" "<<pPi0<<endl;
01061
01062 return kTRUE;
01063 }
01064
01065
01066
01067
01068 void StSkimPionMaker::getTowerHitInfo()
01069 {
01070 StEvent *event = (StEvent*)this->GetInputDS("StEvent");
01071 if (!event)
01072 {
01073 if (debug) cout << "++++++++++++ StSkimPionMaker::getTowerHitInfo(): Can't get Event pointer" << endl;
01074 return;
01075 }
01076 StEmcCollection* emccol = (StEmcCollection*)event->emcCollection();
01077 if (!emccol)
01078 {
01079 if (debug) cout << "++++++++++++ StSkimPionMaker::getTowerHitInfo(): No EMC Collection" << endl;
01080 return;
01081 }
01082 StSPtrVecEmcPoint& bEmcPoints = emccol->barrelPoints();
01083 if (bEmcPoints.size()==0)
01084 {
01085
01086 return;
01087 }
01088
01089 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
01090
01091
01092 StDetectorId id = static_cast<StDetectorId>(0+kBarrelEmcTowerId);
01093 StEmcDetector* detector = emccol->detector(id);
01094 if (detector)
01095 {
01096 for (UInt_t j=1; j<=120; j++)
01097 {
01098 StEmcModule* module = detector->module(j);
01099 if (module)
01100 {
01101 StSPtrVecEmcRawHit& rawHit = module->hits();
01102 for (Int_t k=0; k<(Int_t)rawHit.size(); k++)
01103 {
01104 int tid;
01105 emcGeom->getId(rawHit[k]->module(),rawHit[k]->eta(),rawHit[k]->sub(),tid);
01106 }
01107 }
01108 }
01109 }
01110 else
01111 if (debug) cout << "++++++++++ StSkimPionMaker::getTowerHitInfo(): no detector" << endl;
01112
01113 return;
01114 }
01115
01116
01117 Bool_t StSkimPionMaker::readPointList()
01118 {
01119
01120
01121
01122 StEvent *event = (StEvent*)this->GetInputDS("StEvent");
01123 if (!event)
01124 {
01125 if (debug) cout << "++++++++++++ StSkimPionMaker::readPointList(): Can't get Event pointer" << endl;
01126 return kStWarn;
01127 }
01128 StEmcCollection* emccol = (StEmcCollection*)event->emcCollection();
01129 if (!emccol)
01130 {
01131 if (debug) cout << "++++++++++++ StSkimPionMaker::readPointList(): No EMC Collection" << endl;
01132 return kStOk;
01133 }
01134 StSPtrVecEmcPoint& bEmcPoints = emccol->barrelPoints();
01135 if (bEmcPoints.size()==0)
01136 {
01137
01138 return kStOk;
01139 }
01140 if (debug) cout << "++++++++++++ StSkimPionMaker::readPointList(): Number of BEMC points: " << bEmcPoints.size() << endl;
01141
01142
01143
01144 StEmcPoint* point=0;
01145 for (StSPtrVecEmcPointIterator it=bEmcPoints.begin(); it!=bEmcPoints.end(); it++)
01146 {
01147 point = *it;
01148 photonlist->Add(point);
01149
01150 const StThreeVectorF& pointVector = point->position();
01151 }
01152
01153 if (debug) cout <<"++++++++++++ StSkimPionMaker::readPointList(): StEmcPoint point list: "<< photonlist->GetEntries() << endl;
01154
01155
01156 if (photonlist->GetEntries()<=0)
01157 {
01158 photonlist->Clear();
01159 return kStOk;
01160 }
01161 return true;
01162 }
01163