00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "StHiMicroMaker.h"
00033
00034 #include "TMath.h"
00035 #include "TRandom.h"
00036
00037 #include "StHighptPool/StHiMicroEvent/StHiMicroEvent.h"
00038 #include "Helper.h"
00039
00040 #include "StIOMaker/StIOMaker.h"
00041 #include "StThreeVectorF.hh"
00042 #include "StThreeVectorD.hh"
00043 #include "StEventTypes.h"
00044 #include "StMessMgr.h"
00045 #include "SystemOfUnits.h"
00046 #include "StTpcDedxPidAlgorithm.h"
00047 #include "StuProbabilityPidAlgorithm.h"
00048 #include "StPhysicalHelixD.hh"
00049 #include "StuRefMult.hh"
00050 #define PR(x) cout << "##### StHiMicroMaker: " << (#x) << " = " << (x) << endl;
00051
00052
00053
00054 inline bool sortCmp(StTpcHit* p1, StTpcHit* p2){
00055 return p1->position().perp()<p2->position().perp();
00056 }
00057
00058
00059
00060
00061
00062 StHiMicroMaker::StHiMicroMaker(const Char_t *makerName)
00063 : StMaker(makerName), mNEvent(0), mNAcceptedEvent(0),
00064 mNAcceptedTrack(0),
00065 mVertexZCut(200), mHitLoop(0)
00066 {
00067 }
00068
00069
00070
00071
00072 StHiMicroMaker::~StHiMicroMaker()
00073 {
00074
00075 }
00076
00077
00078
00079
00080
00081 Int_t StHiMicroMaker::InitRun(int runID) {
00082 if (mDebug) gMessMgr->Info() << "StHiMicroMaker: InitRun()" << endm;
00083 PR(runID);
00084
00085 mIOMaker = (StIOMaker*)GetMaker("IO");
00086
00087 if(mIOMaker) mInFileName = strrchr(mIOMaker->GetFile(),'/')+1;
00088
00089 if(mDebug) cout << "##Creating StHiMicroEvent..." << endl;
00090 mHiMicroEvent = new StHiMicroEvent;
00091
00092 Int_t stat = openFile();
00093
00094 return stat + StMaker::Init();
00095
00096
00097 }
00098
00099 Int_t
00100 StHiMicroMaker::Init()
00101 {
00102
00103 cout << "###StHiMicroMaker::Init():\n";
00104
00105 const char* set = (mDebug) ? "ON" : "OFF";
00106 cout << "\tDebug is " << set << endl;
00107
00108
00109
00110 if(mSaveAllEvents) { cout << "\t<I> Saving event info for events without a primary vertex!!" << endl; }
00111
00112 return StMaker::Init();
00113
00114 }
00115
00116
00117
00118
00119
00120 void
00121 StHiMicroMaker::Clear(Option_t *opt)
00122 {
00123 StMaker::Clear();
00124 }
00125
00126
00127
00128
00129 Int_t
00130 StHiMicroMaker::Finish()
00131 {
00132
00133 cout << "###StHiMicroMaker::Finish()\n";
00134 cout << "\tTotal " << mNEvent << " events." << endl;
00135 cout << "\tProcessed " << mNAcceptedEvent << " events." << endl;
00136 cout << "\tTracks : " << mNAcceptedTrack << endl << endl;
00137 closeFile();
00138
00139 return StMaker::Finish();
00140 }
00141
00142
00143
00144
00145
00146 Int_t
00147 StHiMicroMaker::Make()
00148 {
00149 mNEvent++;
00150
00151
00152
00153
00154 TString curFileName;
00155 if(mIOMaker) curFileName = strrchr(mIOMaker->GetFile(),'/')+1;
00156 if(mInFileName!=curFileName){
00157 if(mDebug) {
00158 cout << "##New file found : " << curFileName << endl;
00159 cout << "##Replacing " << mInFileName << endl;
00160 }
00161 closeFile();
00162 mInFileName = curFileName;
00163 openFile();
00164 }
00165
00166
00167
00168
00169 StEvent* event;
00170 event = (StEvent *) GetInputDS("StEvent");
00171
00172 if (!event) return kStOK;
00173
00174
00175
00176
00177
00178
00179 if (accept(event)) {
00180
00181 mNAcceptedEvent++;
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 fillEvent(event);
00194
00195
00196
00197 mDSTTree->Fill();
00198
00199 } else {
00200
00201 if(mSaveAllEvents) {
00202 fillEvent(event);
00203 mDSTTree->Fill();
00204 }
00205 }
00206
00207 mHiMicroEvent->Clear();
00208 return kStOK;
00209 }
00210
00211
00212 void
00213 StHiMicroMaker::fillEvent(StEvent* stEvent)
00214 {
00215
00216
00217
00218 if (stEvent->primaryVertex()) {
00219 mHiMicroEvent->SetVertexZ(stEvent->primaryVertex()->position().z());
00220 mHiMicroEvent->SetVertexX(stEvent->primaryVertex()->position().x());
00221 mHiMicroEvent->SetVertexY(stEvent->primaryVertex()->position().y());
00222 mHiMicroEvent->SetOriginMult(stEvent->primaryVertex()->numberOfDaughters());
00223 } else {
00224 mHiMicroEvent->SetVertexZ(999.);
00225 mHiMicroEvent->SetVertexX(999.);
00226 mHiMicroEvent->SetVertexY(999.);
00227 mHiMicroEvent->SetOriginMult(0);
00228 }
00229
00230
00231 if(stEvent->runInfo()){
00232 mHiMicroEvent->SetCenterOfMassEnergy(stEvent->runInfo()->centerOfMassEnergy());
00233 mHiMicroEvent->SetMagneticField(stEvent->runInfo()->magneticField());
00234 mHiMicroEvent->SetBeamMassNumberEast(stEvent->runInfo()->beamMassNumber(east));
00235 mHiMicroEvent->SetBeamMassNumberWest(stEvent->runInfo()->beamMassNumber(west));
00236 }
00237 else{
00238 gMessMgr->Info() << "StHiMicroMaker: no Run Info, reverting to year 1 settings "
00239 << endm;
00240 mHiMicroEvent->SetCenterOfMassEnergy(130);
00241 mHiMicroEvent->SetMagneticField(4.98);
00242 mHiMicroEvent->SetBeamMassNumberEast(197);
00243 mHiMicroEvent->SetBeamMassNumberWest(197);
00244 }
00245
00246 mHiMicroEvent->SetNUncorrectedNegativePrimaries(uncorrectedNumberOfNegativePrimaries(*stEvent));
00247 mHiMicroEvent->SetNUncorrectedPrimaries(uncorrectedNumberOfPrimaries(*stEvent));
00248
00249
00250
00251 mHiMicroEvent->SetCentMult(mHiMicroEvent->NUncorrectedPrimaries());
00252 mHiMicroEvent->SetCentrality(mHiMicroEvent->NUncorrectedPrimaries());
00253
00254 mHiMicroEvent->SetRunId((Int_t) stEvent->runId());
00255 mHiMicroEvent->SetEventId((Int_t) stEvent->id());
00256
00257
00258
00259
00260 StTrack *track;
00261 StSPtrVecTrackNode& theNodes = stEvent->trackNodes();
00262 long allcnt = 0; long goodcnt = 0; long goodFlagcnt = 0;
00263 long goodAcnt = 0; long goodBcnt = 0; long goodCcnt = 0;
00264 long goodDcnt = 0; long goodEcnt = 0;
00265
00266 for (unsigned int i=0; i<theNodes.size(); i++) {
00267 allcnt += theNodes[i]->entries(global);
00268 track = theNodes[i]->track(global);
00269
00270 if (goodGlobal(track)) goodcnt++;
00271 if (goodGlobalA(track)) goodAcnt++;
00272 if (goodGlobalB(track)) goodBcnt++;
00273 if (goodGlobalC(track)) goodCcnt++;
00274 if (goodGlobalD(track)) goodDcnt++;
00275 if (goodGlobalE(track)) goodEcnt++;
00276 if (goodGlobalFlag(track)) goodFlagcnt++;
00277 }
00278 mHiMicroEvent->SetNAllGlobals(allcnt);
00279 mHiMicroEvent->SetNGoodGlobals(goodcnt);
00280 mHiMicroEvent->SetNFlagGlobals(goodFlagcnt);
00281 mHiMicroEvent->SetNGoodGlobalsA(goodAcnt);
00282 mHiMicroEvent->SetNGoodGlobalsB(goodBcnt);
00283 mHiMicroEvent->SetNGoodGlobalsC(goodCcnt);
00284 mHiMicroEvent->SetNGoodGlobalsD(goodDcnt);
00285 mHiMicroEvent->SetNGoodGlobalsE(goodEcnt);
00286
00287
00288 StL0Trigger* pTrigger = stEvent->l0Trigger();
00289 if(pTrigger){
00290 mHiMicroEvent->SetL0TriggerWord(pTrigger->triggerWord());
00291 }
00292 StL3Trigger* pL3Trigger = stEvent->l3Trigger();
00293 if(pL3Trigger){
00294 mHiMicroEvent->SetL3UnbiasedTrigger(pL3Trigger->l3EventSummary()->unbiasedTrigger());
00295 mHiMicroEvent->SetL3RichTrigger(false);
00296
00297
00298 const StPtrVecL3AlgorithmInfo& algoInfo = pL3Trigger->l3EventSummary()->algorithmsAcceptingEvent();
00299 for (UInt_t i = 0; i < algoInfo.size(); i++) {
00300 if(algoInfo[i]->id() == 4) mHiMicroEvent->SetL3RichTrigger(true);
00301 }
00302 }
00303
00304
00305
00306 Float_t ctb = -1., zdce = -1, zdcw = -1, zdcVertexZ = 999.;
00307
00308 StTriggerDetectorCollection *triggers
00309 = stEvent->triggerDetectorCollection();
00310 if (triggers) {
00311 StCtbTriggerDetector &CTB = triggers->ctb();
00312 StZdcTriggerDetector &ZDC = triggers->zdc();
00313
00314 for (UInt_t slat=0; slat<CTB.numberOfSlats(); slat++) {
00315 for (UInt_t tray=0; tray<CTB.numberOfTrays();tray++) {
00316 ctb += CTB.mips(tray,slat,0);
00317 }
00318 }
00319
00320 zdce = ZDC.adcSum(east);
00321 zdcw = ZDC.adcSum(west);
00322 zdcVertexZ = ZDC.vertexZ();
00323 }
00324
00325 mHiMicroEvent->SetCTB(ctb);
00326 mHiMicroEvent->SetZDCe(zdce);
00327 mHiMicroEvent->SetZDCw(zdcw);
00328 mHiMicroEvent->SetZDCVertexZ(zdcVertexZ);
00329
00330 cout << "###StHiMicroMaker::fillEvent" << endl;
00331 cout << "\tvertex z : " << mHiMicroEvent->VertexZ() << endl;
00332 cout << "\tZDC vertex z : " << mHiMicroEvent->ZDCVertexZ() << endl;
00333 cout << "\tmultiplicity : " << mHiMicroEvent->OriginMult() << endl;
00334 cout << "\tuncorrected h- : " << mHiMicroEvent->NUncorrectedNegativePrimaries() << endl;
00335 cout << "\tuncorrected Nch : " << mHiMicroEvent->NUncorrectedPrimaries() << endl;
00336 cout << "\tNch centrality : " << mHiMicroEvent->Centrality() << endl;
00337
00338 }
00339
00340 Int_t
00341 StHiMicroMaker::fillTracks(StEvent* stEvent)
00342 {
00343
00344
00345
00346
00347 Int_t nGoodTrackEta(0);
00348 Int_t nHi(0);
00349
00350
00351
00352
00353
00354
00355 StHiMicroTrack* hiMicroTrack = new StHiMicroTrack;
00356 StHiMicroHit* hiMicroHit = new StHiMicroHit;
00357
00358
00359
00360
00361
00362 StTpcDedxPidAlgorithm tpcDedxAlgo;
00363
00364
00365
00366
00367
00368 StSPtrVecPrimaryTrack& prTracks = stEvent->primaryVertex(0)->daughters();
00369
00370 for(UInt_t i=0; i<prTracks.size(); i++){
00371 StPrimaryTrack* prTrack = prTracks[i];
00372 if(!prTrack) {
00373 cout << "No primary?" << endl;
00374 continue;
00375 }
00376
00377
00378
00379 StGlobalTrack* glTrack =
00380 dynamic_cast<StGlobalTrack*>(prTracks[i]->node()->track(global));
00381 if(!glTrack) {
00382 cout << "Error! no global information?" << endl;
00383 continue;
00384 }
00385
00386
00387
00388
00389 if(acceptCentrality(prTrack)) nGoodTrackEta++;
00390
00391
00392
00393
00394 if(!accept(glTrack) && !accept(prTrack)) continue;
00395
00396 nHi++;
00397 if(mDebug){
00398 cout << "Accepted track" << endl;
00399 dump(prTrack,glTrack);
00400 }
00401
00402
00403
00404
00405 const StPtrVecHit& hhits = glTrack->detectorInfo()->hits(kTpcId);
00406 Float_t firstZ(0),lastZ(0);
00407 Short_t innerPadList(0);
00408 Int_t firstPadrow(0), lastPadrow(0), outerPadList(0);
00409 UInt_t firstSector(0), lastSector(0);
00410 Double_t crossAngle(999);
00411
00412 vector<StTpcHit*> vec;
00413 int countHits=0;
00414
00415 for(UInt_t i=0; i<hhits.size(); i++){
00416 StTpcHit* hit = (StTpcHit*)hhits[i];
00417 if(!hit) continue;
00418 countHits++;
00419 vec.push_back(hit);
00420 }
00421 sort(vec.begin(),vec.end(),sortCmp);
00422 if(vec.size()){
00423 firstZ=vec[0]->position().z(); lastZ=vec[vec.size()-1]->position().z();
00424 firstPadrow=vec[0]->padrow(); lastPadrow=vec[vec.size()-1]->padrow();
00425
00426
00427
00428
00429 Short_t inner = 0;
00430 Int_t outer = 0;
00431 Int_t SET_ON;
00432 for (UInt_t i=0; i < vec.size(); i++) {
00433
00434 Int_t val = vec[i]->padrow();
00435 if (val < 14) {
00436 SET_ON = 1 << val;
00437 inner = inner | SET_ON;
00438 } else {
00439 SET_ON = 1 << val-14;
00440 outer = outer | SET_ON;
00441 }
00442 innerPadList=inner; outerPadList=outer;
00443 }
00444 firstSector=vec[0]->sector(); lastSector=vec[vec.size()-1]->sector();
00445
00446 }
00447 else{
00448 if(mDebug)
00449 cout << "\tno hits" << endl;
00450
00451 }
00452
00453
00454
00455
00456 const StThreeVectorF& prMom = prTrack->geometry()->momentum();
00457 const StThreeVectorF& glMom = glTrack->geometry()->momentum();
00458 const StPhysicalHelixD& prHelix = prTrack->geometry()->helix();
00459 const StPhysicalHelixD& glHelix = glTrack->geometry()->helix();
00460
00461
00462
00463
00464 hiMicroTrack->SetCurvPr(prTrack->geometry()->curvature());
00465 hiMicroTrack->SetCurvGl(glTrack->geometry()->curvature());
00466 hiMicroTrack->SetPtPr(prMom.perp());
00467 hiMicroTrack->SetEtaPr(prMom.pseudoRapidity());
00468 hiMicroTrack->SetPhiPr(prMom.phi());
00469 hiMicroTrack->SetDipAnglePr(prTrack->geometry()->dipAngle());
00470
00471 hiMicroTrack->SetPtGl(glMom.perp());
00472 hiMicroTrack->SetEtaGl(glMom.pseudoRapidity());
00473 hiMicroTrack->SetPhiGl(glMom.phi());
00474 hiMicroTrack->SetDipAngleGl(glTrack->geometry()->dipAngle());
00475
00476
00477
00478
00479 Float_t dcaXYGl = computeXY(stEvent->primaryVertex()->position(),
00480 glTrack);
00481
00482 Float_t dcaXYPr = computeXY(stEvent->primaryVertex()->position(),
00483 prTrack);
00484
00485 hiMicroTrack->SetDcaGl(glHelix.distance(stEvent->primaryVertex(0)->position()));
00486 hiMicroTrack->SetDcaPr(prHelix.distance(stEvent->primaryVertex(0)->position()));
00487
00488 hiMicroTrack->SetDcaXYGl(dcaXYGl);
00489 hiMicroTrack->SetDcaXYPr(dcaXYPr);
00490
00491 hiMicroTrack->SetDcaZGl(dcaz(glHelix,
00492 stEvent->primaryVertex()->position(),glTrack));
00493
00494 hiMicroTrack->SetChi2(prTrack->fitTraits().chi2());
00495
00496
00497
00498
00499 StDedxPidTraits* pid=0;
00500 StPtrVecTrackPidTraits traits = prTrack->pidTraits(kTpcId);
00501
00502 for (UInt_t i = 0; i < traits.size(); i++) {
00503 pid = dynamic_cast<StDedxPidTraits*>(traits[i]);
00504 if (pid && pid->method() == kTruncatedMeanId) break;
00505 }
00506
00507 hiMicroTrack->SetDedx((pid) ? pid->mean() : 0);
00508 hiMicroTrack->SetDedxPts((pid) ? pid->numberOfPoints() : 0);
00509
00510 hiMicroTrack->SetFitPts(glTrack->fitTraits().numberOfFitPoints(kTpcId));
00511 hiMicroTrack->SetAllPts(glTrack->detectorInfo()->numberOfPoints(kTpcId));
00512 hiMicroTrack->SetMaxPossPts(glTrack->numberOfPossiblePoints());
00513 hiMicroTrack->SetFlag(glTrack->flag());
00514 hiMicroTrack->SetCharge(glTrack->geometry()->charge());
00515
00516 hiMicroTrack->SetFirstZ(firstZ);
00517 hiMicroTrack->SetLastZ(lastZ);
00518 hiMicroTrack->SetFirstPadrow(firstPadrow);
00519 hiMicroTrack->SetInnerPadList(innerPadList);
00520 hiMicroTrack->SetOuterPadList(outerPadList);
00521 hiMicroTrack->SetLastPadrow(lastPadrow);
00522 hiMicroTrack->SetFirstSector(firstSector);
00523 hiMicroTrack->SetLastSector(lastSector);
00524
00525 hiMicroTrack->SetCrossingAngle(crossAngle);
00526
00527
00528
00529
00530
00531 mHiMicroEvent->AddTrack(hiMicroTrack);
00532
00533
00534
00535
00536 if (!mHitLoop) continue;
00537
00538 const StPtrVecHit& hits = prTrack->detectorInfo()->hits(kTpcId);
00539 for(UInt_t iHit=0 ; iHit<hits.size(); iHit++){
00540 const StTpcHit* hit = dynamic_cast<StTpcHit*> (hits[iHit]);
00541 if(!hit){
00542 cout << "Not a tpc hit?" << endl;
00543 continue;
00544 }
00545 if (!hit->usedInFit()) continue;
00546
00547
00548
00549 hiMicroHit->SetPtPr(hiMicroTrack->PtPr());
00550 hiMicroHit->SetPtGl(hiMicroTrack->PtGl());
00551 hiMicroHit->SetEta(hiMicroTrack->EtaPr());
00552 hiMicroHit->SetPhi(hiMicroTrack->PhiPr());
00553 hiMicroHit->SetFitPts(hiMicroTrack->FitPts());
00554 hiMicroHit->SetSDcaGl(hiMicroTrack->DcaGl());
00555 hiMicroHit->SetDipAngle(hiMicroTrack->DipAnglePr());
00556 hiMicroHit->SetExitZ(hiMicroTrack->LastZ());
00557 hiMicroHit->SetCharge(hiMicroTrack->Charge());
00558
00559
00560
00561 hiMicroHit->SetR(hit->position().perp());
00562 hiMicroHit->SetZ(hit->position().z());
00563 hiMicroHit->SetPadRow( (Int_t) hit->padrow());
00564 hiMicroHit->SetSector( (Int_t) hit->sector());
00565
00566
00567
00568 Double_t sGl = glHelix.pathLength(hit->position());
00569 Double_t sPr = prHelix.pathLength(hit->position());
00570
00571 StThreeVectorF glHitPos(glHelix.at(sGl));
00572 StThreeVectorF prHitPos(prHelix.at(sPr));
00573
00574 hiMicroHit->SetZResGl(hit->position().z() - glHitPos.z());
00575 hiMicroHit->SetZResPr(hit->position().z() - prHitPos.z());
00576
00577 Float_t resXYGl = computeXY(hit->position(),glTrack);
00578 Float_t resXYPr = computeXY(hit->position(),prTrack);
00579 hiMicroHit->SetXYResGl(resXYGl);
00580 hiMicroHit->SetXYResPr(resXYPr);
00581
00582
00583
00584
00585 mHiMicroEvent->AddHit(hiMicroHit);
00586 }
00587
00588 }
00589
00590 if(hiMicroTrack) delete hiMicroTrack;
00591 cout << "\t hi pt tracks : " << nHi << endl;
00592 mNAcceptedTrack += nHi;
00593
00594 return nGoodTrackEta;
00595
00596 }
00597
00598 void
00599 StHiMicroMaker::dump(StTrack* prTrack,StTrack* glTrack)
00600 {
00601 cout << "\tptGl="
00602 << glTrack->geometry()->momentum().perp()
00603 << ",etaGl="
00604 << glTrack->geometry()->momentum().pseudoRapidity()
00605 << ",fitpts="
00606 << glTrack->fitTraits().numberOfFitPoints(kTpcId)
00607 << ",allpts="
00608 << glTrack->detectorInfo()->numberOfPoints(kTpcId)<<endl
00609 << "\t\t ptPr=" <<prTrack->geometry()->momentum().perp()
00610 << ", etaPr="
00611 << glTrack->geometry()->momentum().pseudoRapidity() <<endl;
00612 }
00613
00614
00615 Int_t
00616 StHiMicroMaker::openFile()
00617 {
00618 cout << "###StHiMicroMaker::openFile()" << endl;
00619
00620
00621
00622
00623 TString outFileName(mInFileName);
00624
00625
00626
00627
00628
00629 char cTemp[100];
00630 strcpy(cTemp,outFileName.Data());
00631
00632 cout << "We think the filename is " << outFileName.Data() << endl;
00633 TString replace;
00634 if(strstr(cTemp,"dst.root")) replace=".dst.root";
00635 else if(strstr(cTemp,"event.root")) replace=".event.root";
00636 else { cout << "unknown extension " << endl; exit(1); }
00637
00638
00639
00640 cout << replace << endl;
00641
00642 outFileName.ReplaceAll(replace.Data(),".himicro.root");
00643
00644 cout << outFileName << endl;
00645
00646 outFileName.Prepend(mOutDir + "/");
00647
00648
00649 mDSTFile = new TFile(outFileName.Data(),"RECREATE");
00650
00651 if(!mDSTFile){
00652 gMessMgr->Error()
00653 << "Cannot create = " << outFileName << endm;
00654 return kStErr;
00655 }
00656
00657 cout << "\toutfile = " << outFileName << endl;
00658
00659
00660
00661
00662 if(mDebug)
00663 cout << "##Creating the top level tree..." << endl;
00664 mDSTTree = new TTree("StHiMicroTree","StHiMicroTree");
00665 if(!mDSTTree){
00666 gMessMgr->Error()
00667 << "Cannot create mDSTTree" << endm;
00668 return kStErr;
00669 }
00670 if(mDebug)cout << "##...done" << endl;
00671
00672
00673
00674 mDSTTree->SetAutoSave(10000000);
00675
00676
00677 Int_t bufSZ = 64000;
00678 mDSTTree->Branch("StHiMicroEvent","StHiMicroEvent",
00679 &mHiMicroEvent, bufSZ,1);
00680 return kStOk;
00681 }
00682
00683
00684 Int_t
00685 StHiMicroMaker::closeFile()
00686 {
00687 cout << "###StHiMicroMaker::closeFile()" << endl;
00688
00689 cout << "##Writing " << mInFileName << endl;
00690
00691 if(mDSTFile && mDSTFile->IsOpen()){
00692 mDSTFile->Write();
00693 mDSTFile->Close();
00694 }
00695
00696 cout << "##...done\n";
00697
00698
00699 return kStOk;
00700 }
00701
00702
00703 Float_t
00704 StHiMicroMaker::computeXY(const StThreeVectorF& pos, const StTrack* track)
00705 {
00706
00707
00708
00709
00710
00711 double xCenter = track->geometry()->helix().xcenter();
00712 double yCenter = track->geometry()->helix().ycenter();
00713 double radius = 1.0/track->geometry()->helix().curvature();
00714
00715 double dPosCenter
00716 = TMath::Sqrt( (pos.x()-xCenter) * (pos.x()-xCenter) +
00717 (pos.y()-yCenter) * (pos.y()-yCenter));
00718
00719 return (Float_t) radius - dPosCenter;
00720 }
00721
00722
00723
00724
00725
00726
00727 double StHiMicroMaker::dcaz(const StPhysicalHelixD& helix, const StThreeVectorF& point,
00728 const StTrack* track)
00729 {
00730 double z0 = helix.origin().z();
00731 double phi = atan2(point.y()-helix.ycenter(),
00732 point.x()-helix.xcenter());
00733 int h = helix.h();
00734 double dphi = h*(phi-helix.phase());
00735
00736
00737 dphi = (fabs(dphi) < M_PI ) ? dphi :
00738 ((dphi<0) ? 2*M_PI + dphi : 2*M_PI - dphi);
00739
00740 double arclength= (1./helix.curvature()) * dphi;
00741
00742 double dcaZ = (point.z() - (z0 + arclength*tan(helix.dipAngle())));
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762 return dcaZ;
00763
00764 }
00765
00766 double
00767 StHiMicroMaker::dcaz(const StPhysicalHelixD& helix, const StThreeVectorF& point)
00768 {
00769 pairD path = helix.pathLength(point.perp());
00770
00771 const StThreeVectorD& pos1 = helix.at(path.first);
00772 const StThreeVectorD& pos2 = helix.at(path.second);
00773 const StThreeVectorD dis1 = point - pos1;
00774 const StThreeVectorD dis2 = point - pos2;
00775
00776 double dcaZ = (dis1.mag() < dis2.mag()) ? dis1.z() : dis2.z();
00777 if(isnan(dcaZ)) return 999;
00778 return dcaZ;
00779 }
00780
00781
00782
00783
00784
00785
00786 bool StHiMicroMaker::accept(StEvent* stEvent)
00787 {
00788
00789 return (stEvent->primaryVertex());
00790 }
00791
00792
00793
00794
00795 bool StHiMicroMaker::accept(StTrack* track)
00796 {
00797
00798 return (track && track->flag() > 0 &&
00799 track->geometry()->momentum().perp()>=1.5);
00800 }
00801
00802
00803
00804 bool StHiMicroMaker::acceptCentrality(StTrack *track)
00805 {
00806 return (track && track->flag() > 0 && track->fitTraits().numberOfFitPoints(kTpcId) >= 10 &&
00807 fabs(track->geometry()->momentum().pseudoRapidity())<.5);
00808
00809
00810
00811 }
00812
00813
00814
00815 bool StHiMicroMaker::goodGlobal(StTrack *track)
00816 {
00817 return (track && track->flag() > 0 && track->geometry()->charge() != 0 &&
00818 track->fitTraits().numberOfFitPoints(kTpcId) >= 25);
00819
00820 }
00821
00822 bool StHiMicroMaker::goodGlobalA(StTrack *track)
00823 {
00824 return (track && track->flag() > 0 && track->geometry()->charge() != 0 &&
00825 track->fitTraits().numberOfFitPoints(kTpcId) >= 10);
00826
00827 }
00828
00829 bool StHiMicroMaker::goodGlobalB(StTrack *track)
00830 {
00831 return (track && track->flag() > 0 && track->geometry()->charge() != 0 &&
00832 track->fitTraits().numberOfFitPoints(kTpcId) >= 15);
00833
00834 }
00835
00836 bool StHiMicroMaker::goodGlobalC(StTrack *track)
00837 {
00838 return (track && track->flag() > 0 && track->geometry()->charge() != 0 &&
00839 track->fitTraits().numberOfFitPoints(kTpcId) >= 20);
00840
00841 }
00842
00843 bool StHiMicroMaker::goodGlobalD(StTrack *track)
00844 {
00845 return (track && track->flag() > 0 && track->geometry()->charge() != 0 &&
00846 track->fitTraits().numberOfFitPoints(kTpcId) >= 30);
00847
00848 }
00849
00850 bool StHiMicroMaker::goodGlobalE(StTrack *track)
00851 {
00852 return (track && track->geometry()->charge() != 0 &&
00853 track->fitTraits().numberOfFitPoints(kTpcId) >= 25);
00854
00855 }
00856
00857 bool StHiMicroMaker::goodGlobalFlag(StTrack *track)
00858 {
00859 return (track && track->flag() > 0 );
00860
00861 }
00862
00863 ClassImp(StHiMicroMaker)