00001
00353 #include "StMiniMcMaker.h"
00354 #include "TFile.h"
00355 #include "TTree.h"
00356 #include "TBranch.h"
00357 #include "TMath.h"
00358 #include "TRandom.h"
00359
00360
00361
00362 #include "Stiostream.h"
00363 #include <assert.h>
00364
00365 #include "StMessMgr.h"
00366 #include "PhysicalConstants.h"
00367 #include "StPhysicalHelix.hh"
00368 #include "SystemOfUnits.h"
00369 #include "StIOMaker/StIOMaker.h"
00370 #include "StParticleDefinition.hh"
00371 #include "StMatrixF.hh"
00372 #include "StChainOpt.h"
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 #include "StEventTypes.h"
00386 #include "StMcEventTypes.hh"
00387 #include "StMcEvent.hh"
00388 #include "StuRefMult.hh"
00389 #include "StTpcDedxPidAlgorithm.h"
00390 #include "StuProbabilityPidAlgorithm.h"
00391
00392 #include "StEmcUtil/geometry/StEmcGeom.h"
00393 #include "StEmcUtil/projection/StEmcPosition.h"
00394
00395 #include "StMiniMcHelper.h"
00396
00397 #include <vector>
00398 #include <map>
00399 #include "StTrack.h"
00400 #include "StGlobalTrack.h"
00401 #include "StDcaGeometry.h"
00402 #include "StContainers.h"
00403 #include "StTrackDetectorInfo.h"
00404 #include "StEnumerations.h"
00405 #include "StHit.h"
00406 #include "THelixTrack.h"
00407
00408 static int StMiniMcMakerErrorCount=0;
00409
00410
00411
00412 void dominatrackInfo(const StTrack*, short& dominatrackKey, short&, float&);
00413
00414
00415
00416 bool hitCmp(const StTpcHit* p1,const StTpcHit* p2)
00417 {
00418 return (p1->position().perp()<p2->position().perp());
00419 }
00420
00421
00422 bool StMcCalorimeterHitCompdE(const StMcCalorimeterHit* const &lhs,const StMcCalorimeterHit* const &rhs) {
00423 return (lhs->dE() > rhs->dE());
00424 }
00425
00426
00427 bool StEmcRawHitCompEne(const StEmcRawHit* lhs, const StEmcRawHit* rhs) {
00428 return (lhs->energy() > rhs->energy());
00429 }
00430
00431
00432 float scaleFactor(double Eta, int hitType=0) {
00433
00434
00435
00436
00437 float P0[]={14.69,559.7,0.1185e6,0.1260e6};
00438 float P1[]={-0.1022,-109.9,-0.3292e5,-0.1395e5};
00439 float P2[]={0.7484,-97.81,0.3113e5,0.1971e5};
00440
00441 float x=fabs(Eta);
00442 return P0[hitType]+P1[hitType]*x+P2[hitType]*x*x;
00443 }
00444
00445 ClassImp(StMiniMcMaker)
00446
00447
00448
00449
00450 StMiniMcMaker::StMiniMcMaker(const Char_t *name, const Char_t *title)
00451 :
00452 StMaker(name,title),
00453 mMiniMcEvent(0),
00454 mIOMaker(0),
00455 mMiniMcTree(0),
00456 mMiniMcDST(0),
00457 mInFileName(),
00458 mInFilePrefix(),
00459 mOutFileName(),
00460 mOutDir("./"),
00461 mParameterFileName(),
00462 mRcEvent(0),
00463 mMcEvent(0),
00464 mRcHitMap(0),
00465 mRcTrackMap(0),
00466 mMcTrackMap(0),
00467 mRcVertexPos(0),
00468 mMcVertexPos(0),
00469 mTpcDedxAlgo(0),
00470 mPidAlgo(0),
00471 mEmcIndex(4801),
00472 mGhost(kTRUE),
00473 mMinPt(0),mMaxPt(99999),
00474 mNSplit(0),mNRc(0),mNGhost(0),mNContam(0),
00475 mNMatched(0),mNMatGlob(0)
00476
00477 {
00478
00479
00480
00481
00482 }
00483
00484
00485 StMiniMcMaker::~StMiniMcMaker()
00486 {
00487
00488 }
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498 void StMiniMcMaker::Clear(Option_t* opt)
00499 {
00500 StMaker::Clear();
00501 }
00502
00503
00504
00505
00506
00507 Int_t StMiniMcMaker::Finish()
00508 {
00509 cout << "###StMiniMcMaker::Finish()" << endl;
00510
00511 closeFile();
00512
00513 cout << "\treconstr. = " << mNRc << endl
00514 << "\tmatched = " << mNMatched << endl
00515 << "\tsplit = " << mNSplit << endl
00516 << "\tcontam. = " << mNContam << endl
00517 << "\tghost = " << mNGhost << endl
00518 << "\tmat global = " << mNMatGlob << endl;
00519
00520 if (Debug()) cout << "deleting mMiniMcEvent" << endl;
00521 delete mMiniMcEvent; mMiniMcEvent = 0;
00522
00523
00524
00525
00526 if (Debug()) cout << "deleting mMiniMcDST" << endl;
00527 delete mMiniMcDST;
00528 mMiniMcDST = 0;
00529
00530 return StMaker::Finish();
00531 }
00532
00533
00534
00535
00536
00537 Int_t StMiniMcMaker::InitRun(int runID)
00538 {
00539 cout << "###StMiniMcMaker::InitRun()" << endl;
00540
00541 cout << "\tpt cut : " << mMinPt << " , " << mMaxPt << endl;
00542 Int_t stat=0;
00543
00544
00545
00546
00547 if (!mMiniMcEvent) {
00548 if(Debug()) cout << "\tStMiniMcMaker::InitRun Creating StMiniMcEvent..." << endl;
00549 mMiniMcEvent = new StMiniMcEvent();
00550 }
00551 else {
00552 if (Debug()) cout << "\tStMiniMcMaker::InitRun StMiniMcEvent Already created" << endl;
00553 }
00554 if(mGhost) {
00555 cout << "\tGhost loop is turned on." << endl;
00556 }
00557
00558
00559
00560
00561 if (!mTpcDedxAlgo)
00562 mTpcDedxAlgo = new StTpcDedxPidAlgorithm;
00563
00564
00565
00566
00567 stat = openFile();
00568
00569 return stat + StMaker::InitRun(runID);
00570
00571 }
00572
00573
00574 Int_t StMiniMcMaker::Init()
00575 {
00576
00577 cout << "###StMiniMcMaker::Init()" << endl;
00578
00579 cout << "\tpt cut : " << mMinPt << " , " << mMaxPt << endl;
00580
00581 if (mInFileName == "") {
00582 const StChainOpt *chain = GetChainOpt();
00583 assert(chain);
00584 mInFileName = chain->GetFileOut();
00585 }
00586 return StMaker::Init();
00587 }
00588
00589
00590
00591
00592
00593
00594 Int_t StMiniMcMaker::Make()
00595 {
00596 if(Debug()) cout << "###StMiniMcMaker::Make()" << endl;
00597
00598
00599
00600
00601
00602 mRcEvent = (StEvent*) GetDataSet("StEvent");
00603 if(!mRcEvent) return kStOk;
00604 mMcEvent = (StMcEvent*) GetDataSet("StMcEvent");
00605 if(!mMcEvent) return kStErr;
00606
00607
00608
00609
00610 Bool_t assOk = initAssociation();
00611 if(!assOk) {
00612 gMessMgr->Warning() << "Association problems " << endm;
00613
00614 }
00615
00616
00617
00618 Bool_t vtxOk = initVertex();
00619 if(!vtxOk) {
00620 cout << "\t\t----No primary vertex---- " << endl;
00621 return kStOk;
00622 }
00623
00624
00625
00626 buildEmcIndexArray();
00627
00628
00629
00630 if (m_Mode == 1) trackLoopIdT();
00631 else trackLoop();
00632
00633 if (Debug()) mMiniMcEvent->Print();
00634
00635 AppendMCDaughterTrack();
00636
00637
00638
00639
00640 if (Debug()) mMiniMcEvent->Print();
00641 mMiniMcTree->Fill();
00642 mMiniMcEvent->Clear();
00643
00644 return kStOk;
00645 }
00646
00647
00648
00649
00650
00651
00652 Bool_t StMiniMcMaker::initAssociation()
00653 {
00654 StAssociationMaker* assoc = 0;
00655 assoc = (StAssociationMaker*) GetMaker("StAssociationMaker");
00656
00657
00658
00659 if (assoc) {
00660 mRcHitMap = assoc->rcTpcHitMap();
00661 mRcTrackMap = assoc->rcTrackMap();
00662 mMcTrackMap = assoc->mcTrackMap();
00663 }
00664 return (assoc && mRcHitMap && mRcTrackMap && mMcTrackMap);
00665 }
00666
00667
00668
00669
00670
00671
00672 Bool_t StMiniMcMaker::initVertex()
00673 {
00674
00675 if(!mRcEvent->numberOfPrimaryVertices()) {
00676 cout << "\tno primary vertex from stevent" << endl;
00677 return kFALSE;
00678 }
00679 if(!mMcEvent->primaryVertex()){
00680 cout << "\tno primary vertex from stmcevent" << endl;
00681 return kFALSE;
00682 }
00683 mMainVtx = -1;
00684 int maxTks = -1;
00685 for (int i=0;i<(int)mRcEvent->numberOfPrimaryVertices();i++) {
00686 int numTks = mRcEvent->primaryVertex(i)->numberOfDaughters();
00687 if (maxTks > numTks) continue;
00688 maxTks = numTks;mMainVtx = i;
00689 }
00690 if (maxTks <= 0) {
00691 cout << "\tEmpty primary vertex from stevent" << endl;
00692 return kFALSE;
00693 }
00694
00695
00696
00697 mRcVertexPos = &mRcEvent->primaryVertex(mMainVtx)->position();
00698 mMcVertexPos = &mMcEvent->primaryVertex()->position();
00699
00700 if(Debug()){
00701 cout
00702 << "----------vertex info---------------------\n"
00703 << "Position of primary vertex from StEvent: \n"
00704 << *mRcVertexPos << endl;
00705 cout
00706 << "Position of primary vertex from StMcEvent: "<<endl
00707 << *mMcVertexPos << endl;
00708 cout << "N daughters, StEvent : " << mRcEvent->primaryVertex(mMainVtx)->daughters().size() << endl;
00709 cout << "N daughters, StMcEvent : " << mMcEvent->primaryVertex()->daughters().size() << endl;
00710 }
00711
00712
00713
00714
00715 return !((isnan(mRcVertexPos->x()) || isnan(mRcVertexPos->y())));
00716 }
00717
00718
00719
00720
00721
00722 void StMiniMcMaker::trackLoop()
00723 {
00724 if(Debug()) cout << "##StMiniMcMaker::trackLoop()" << endl;
00725
00726 Int_t nMatched(0), nAcceptedRaw(0),nAccepted(0),
00727 nMerged(0), nSplit(0), nContam(0), nGhost(0), nMatGlob(0), nContamNew(0),
00728 nRcGoodGlobal20(0), nRcGlobal(0), nMcGoodGlobal20(0),
00729 nMcNch(0), nMcHminus(0), nMcFtpcWNch(0), nMcFtpcENch(0);
00730
00731
00732 RCFOUNDMAP rcFoundMap;
00733 MCFOUNDMAP mcFoundMap;
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759 std::vector<int> enteredGlobalTracks;
00760 const StPtrVecMcTrack& allmcTracks = mMcEvent->tracks();
00761 cout << "size of mcEvent->tracks() : " << allmcTracks.size() << endl;
00762
00763 StMcTrackConstIterator allMcTrkIter = allmcTracks.begin();
00764 for ( ; allMcTrkIter != allmcTracks.end(); ++allMcTrkIter) {
00765 const StMcTrack* mcGlobTrack = *allMcTrkIter;
00766 if(!acceptRaw(mcGlobTrack)) continue;
00767 if(accept(mcGlobTrack) || mcGlobTrack->ftpcHits().size()>=5) {
00768 if (Debug()>1) {
00769 cout << "accepted mc global track, key " << mcGlobTrack->key() << endl;
00770 }
00771
00772
00773 StTrackPairInfo* candTrackPair = findBestMatchedGlobal(mcGlobTrack);
00774
00775 if (candTrackPair) {
00776
00777
00778 const StGlobalTrack* glTrack = candTrackPair->partnerTrack();
00779
00780 if (Debug()>1) {
00781 cout << "global match " << endl;
00782 cout << "mc, rc pt " << mcGlobTrack->pt() << ", " << glTrack->geometry()->momentum().perp() << endl;
00783 }
00784
00785 if (find(enteredGlobalTracks.begin(),enteredGlobalTracks.end(),glTrack->key())!=enteredGlobalTracks.end()) continue;
00786 StMiniMcPair* miniMcPair = new StMiniMcPair;
00787 Int_t commonHits =
00788 candTrackPair->commonTpcHits()%100+
00789 ((candTrackPair->commonSvtHits()%10)*100)+
00790 ((candTrackPair->commonSsdHits()%10)*1000);
00791 fillTrackPairInfo(miniMcPair, mcGlobTrack,
00792 0, glTrack,
00793 commonHits, mRcTrackMap->count(glTrack),
00794 mMcTrackMap->count(mcGlobTrack), 0,
00795 kTRUE);
00796 mMiniMcEvent->addTrackPair(miniMcPair,MATGLOB);
00797 delete miniMcPair;
00798 enteredGlobalTracks.push_back(glTrack->key());
00799 nMatGlob++;
00800
00801 }
00802 }
00803 }
00804
00805
00806
00807
00808
00809
00810 const StPtrVecMcTrack& mcTracks = mMcEvent->primaryVertex()->daughters();
00811
00812 cout << "size of MC primary tracks : " << mcTracks.size() << endl;
00813
00814 StMcTrackConstIterator mcTrkIter = mcTracks.begin();
00815 for( ; mcTrkIter != mcTracks.end(); mcTrkIter++){
00816 const StMcTrack* mcTrack = *mcTrkIter;
00817
00818
00819 if(!mcTrack) { cout << "No mc track? " << endl; continue; }
00820
00821
00822 if(!acceptRaw(mcTrack)) continue;
00823
00824 nAcceptedRaw++;
00825
00826 if(fabs(mcTrack->pseudoRapidity())<.5 && isPrimaryTrack(mcTrack) && mcTrack->particleDefinition()){
00827 if(mcTrack->particleDefinition()->charge()!=0) nMcNch++;
00828 if(mcTrack->particleDefinition()->charge()<0) nMcHminus++;
00829 }
00830 if(mcTrack->particleDefinition() && mcTrack->particleDefinition()->charge()!=0 && isPrimaryTrack(mcTrack) ) {
00831 if(mcTrack->pseudoRapidity()<-2.8 && mcTrack->pseudoRapidity()>-3.8) nMcFtpcENch++;
00832 if(mcTrack->pseudoRapidity()>2.8 && mcTrack->pseudoRapidity()<3.8) nMcFtpcWNch++;
00833 }
00834
00835 if(acceptGood20(mcTrack)) nMcGoodGlobal20++;
00836
00837 Int_t nAssocGl = mMcTrackMap->count(mcTrack);
00838 Int_t nAssocPr = 0;
00839
00840
00841
00842
00843 if(accept(mcTrack)){
00844
00845 nAccepted++;
00846
00847
00848
00849 if(!mcFoundMap.count(mcTrack->key())){
00850
00851
00852
00853
00854
00855
00856 PAIRVEC candPair = findMatchedRc(mcTrack);
00857 nAssocPr = candPair.size();
00858
00859 if(candPair.size()>0){
00860
00861
00862
00863 PAIRVEC::iterator iterBestMatchPair
00864 = max_element(candPair.begin(),candPair.end(),pairCmp);
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880 const StGlobalTrack* glTrack = (*iterBestMatchPair)->partnerTrack();
00881 const StPrimaryTrack* prTrack = isPrimaryTrack(glTrack);
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896 PAIRVEC mcMergedPair;
00897
00898 pair<rcTrackMapIter,rcTrackMapIter> rcBounds
00899 = mRcTrackMap->equal_range(glTrack);
00900 rcTrackMapIter rcMapIter = rcBounds.first;
00901
00902
00903
00904 UInt_t nAssocMc = mRcTrackMap->count(glTrack);
00905 std::vector<UInt_t> nAssocGlVec;
00906 std::vector<UInt_t> nAssocPrVec;
00907
00908
00909
00910
00911 for( ; rcMapIter != rcBounds.second; rcMapIter++){
00912 StTrackPairInfo* assocPair = (*rcMapIter).second;
00913 const StMcTrack* mcCandTrack = assocPair->partnerMcTrack();
00914
00915
00916
00917
00918 if(!acceptRaw(mcCandTrack) || !accept(mcCandTrack)) continue;
00919
00920
00921
00922
00923
00924 PAIRVEC rcCandPair = findMatchedRc(mcCandTrack);
00925
00926 PAIRVEC::iterator iterRcBestPair =
00927 max_element(rcCandPair.begin(),rcCandPair.end(),pairCmp);
00928
00929
00930
00931 if((*iterRcBestPair)->partnerTrack() == glTrack){
00932
00933 nAssocGlVec.push_back(mMcTrackMap->count(mcCandTrack));
00934 nAssocPrVec.push_back(rcCandPair.size());
00935
00936 mcMergedPair.push_back(assocPair);
00937 }
00938 }
00939
00940
00941
00942
00943
00944 sort(mcMergedPair.begin(),mcMergedPair.end(),sortCmp);
00945
00946
00947
00948
00949
00950 if(Debug()==2 && mcMergedPair.size()>1) {
00951 cout << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << endl;
00952 cout << "MERGED" << endl;
00953 }
00954
00955 Bool_t foundBest = kFALSE;
00956 Bool_t isBestContam = kFALSE;
00957
00958 for(unsigned int i=0; i<mcMergedPair.size(); i++){
00959 const StMcTrack* mergedMcTrack = (mcMergedPair[i])->partnerMcTrack();
00960 UInt_t mergedCommonHits = (mcMergedPair[i])->commonTpcHits();
00961
00962 if(Debug()==2 && mcMergedPair.size()>1) {
00963 TString hello = (foundBest) ? "yes" : "no";
00964 cout << "-----------" << " foundBest? " << hello.Data() << endl;
00965 checkMerged(mergedMcTrack, mergedCommonHits,prTrack);
00966 }
00967
00968
00969 if(!isPrimaryTrack(mergedMcTrack)){
00970 if(i==0) isBestContam = kTRUE;
00971 continue;
00972 }
00973
00974 if(!foundBest){
00975
00976 if(acceptPt(glTrack) || acceptPt(prTrack)){
00977 StMiniMcPair* miniMcPair = new StMiniMcPair;
00978 Int_t commonHits = mergedCommonHits%100+
00979 ((mcMergedPair[i]->commonSvtHits()%10)*100)+
00980 ((mcMergedPair[i]->commonSsdHits()%10)*1000);
00981 fillTrackPairInfo(miniMcPair, mergedMcTrack,
00982 prTrack, glTrack,
00983 commonHits, nAssocMc,
00984 nAssocGlVec[i], nAssocPrVec[i],
00985 isBestContam);
00986 mMiniMcEvent->addTrackPair(miniMcPair,MATCHED);
00987 delete miniMcPair;
00988 }
00989 rcFoundMap[prTrack->key()]=1;
00990 nMatched++;
00991 foundBest = kTRUE;
00992 }
00993 else{
00994
00995 if(acceptPt(glTrack) || acceptPt(prTrack)){
00996 StMiniMcPair* miniMcPair = new StMiniMcPair;
00997 Int_t commonHits =
00998 mergedCommonHits+
00999 ((mcMergedPair[i]->commonSvtHits()%10)*100)+
01000 ((mcMergedPair[i]->commonSsdHits()%10)*1000);
01001 fillTrackPairInfo(miniMcPair,mergedMcTrack,prTrack,glTrack,
01002 commonHits, nAssocMc,nAssocGlVec[i],
01003 nAssocPrVec[i]);
01004 mMiniMcEvent->addTrackPair(miniMcPair,MERGED);
01005 delete miniMcPair;
01006 }
01007 if(Debug()==2 && acceptDebug(mergedMcTrack))
01008 cout << "YES! satisfies cuts" << endl;
01009
01010 nMerged++;
01011
01012 }
01013
01014
01015
01016
01017 mcFoundMap[mergedMcTrack->key()]=1;
01018
01019 }
01020 if(Debug()==2 && mcMergedPair.size()>1)
01021 cout << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" << endl;
01022 }
01023 }
01024 }
01025
01026
01027
01028
01029
01030
01031
01032 if(acceptRaw(mcTrack)){
01033 StTinyMcTrack tinyMcTrack;
01034 fillMcTrackInfo(&tinyMcTrack,mcTrack,nAssocGl,nAssocPr);
01035 mMiniMcEvent->addMcTrack(&tinyMcTrack);
01036 }
01037 }
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047 Int_t nUncorrectedGlobals(0);
01048 StSPtrVecTrackNode& trackNode = mRcEvent->trackNodes();
01049 int nTracks = trackNode.size();
01050 for (int i=0; i < nTracks; i++) {
01051 StTrackNode *node = trackNode[i];
01052 if (!node) continue;
01053 StTrack *glTrack = node->track(global);
01054 if (! glTrack) continue;
01055 if(acceptGlobals(glTrack)) nUncorrectedGlobals++;
01056 }
01057
01058 Int_t nGoodTrackEta(0), nFtpcWUncorrected(0), nFtpcEUncorrected(0);
01059
01060 const StSPtrVecPrimaryTrack& prTracks =
01061 mRcEvent->primaryVertex(mMainVtx)->daughters();
01062
01063 for(UInt_t i=0; i<prTracks.size(); i++){
01064 StPrimaryTrack* prTrack = prTracks[i];
01065
01066
01067
01068
01069 if(!ok(prTrack)) continue;
01070
01071 const StGlobalTrack* glTrack
01072 = static_cast<const StGlobalTrack*>(prTrack->node()->track(global));
01073
01074
01075
01076
01077
01078 if(acceptCentrality(prTrack)) nGoodTrackEta++;
01079 nRcGlobal++;
01080 if(acceptGood20(glTrack)) nRcGoodGlobal20++;
01081
01082
01083
01084
01085 if(acceptFTPC(prTrack) && prTrack->geometry()->momentum().pseudoRapidity() < 0. ) nFtpcEUncorrected++;
01086 if(acceptFTPC(prTrack) && prTrack->geometry()->momentum().pseudoRapidity() > 0. ) nFtpcWUncorrected++;
01087
01088
01089
01090
01091 if(!acceptPt(glTrack) && !acceptPt(prTrack)) continue;
01092
01093
01094
01095
01096 if(!accept(glTrack) || !accept(prTrack)) continue;
01097
01098
01099 mNRc++;
01100
01101 UInt_t nAssocGl=0, nAssocPr=0;
01102 UInt_t nAssocMc = mRcTrackMap->count(glTrack);
01103
01104
01105
01106
01107
01108 if(mRcTrackMap->count(glTrack) && !rcFoundMap.count(prTrack->key())){
01109
01110
01111
01112
01113 pair<rcTrackMapIter,rcTrackMapIter> rcBounds
01114 = mRcTrackMap->equal_range(glTrack);
01115
01116 PAIRVEC candPair;
01117
01118 rcTrackMapIter rcMapIter = rcBounds.first;
01119
01120 for( ; rcMapIter != rcBounds.second; rcMapIter++){
01121 StTrackPairInfo* assocPair = (*rcMapIter).second;
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132 candPair.push_back(assocPair);
01133
01134 }
01135
01136
01137 if(candPair.size()){
01138
01139 PAIRVEC::iterator iterBestMatchPair
01140 = max_element(candPair.begin(),candPair.end(),pairCmp);
01141
01142 const StMcTrack* mcTrack = (*iterBestMatchPair)->partnerMcTrack();
01143 UInt_t commonHits = (*iterBestMatchPair)->commonTpcHits();
01144
01145 nAssocGl = mMcTrackMap->count(mcTrack);
01146
01147
01148
01149
01150 PAIRVEC matchPair = findMatchedRc(mcTrack);
01151 nAssocPr = matchPair.size();
01152
01153
01154
01155
01156
01157 if(isPrimaryTrack(mcTrack)){
01158 StMiniMcPair* miniMcPair = new StMiniMcPair;
01159 Int_t cHits =
01160 commonHits%100+
01161 (((*iterBestMatchPair)->commonSvtHits()%10)*100)+
01162 (((*iterBestMatchPair)->commonSsdHits()%10)*1000);
01163 fillTrackPairInfo(miniMcPair,mcTrack,prTrack,glTrack,
01164 cHits, nAssocMc, nAssocGl, nAssocPr);
01165 mMiniMcEvent->addTrackPair(miniMcPair,SPLIT);
01166 delete miniMcPair;
01167 nSplit++;
01168
01169
01170
01171
01172 if(Debug()==2) checkSplit(mcTrack,glTrack,commonHits);
01173 }
01174 else{
01175 StContamPair* contamPair = new StContamPair;
01176 Int_t cHits =
01177 commonHits%100+
01178 (((*iterBestMatchPair)->commonSvtHits()%10)*100)+
01179 (((*iterBestMatchPair)->commonSsdHits()%10)*1000);
01180 fillTrackPairInfo(contamPair,mcTrack,
01181 prTrack,glTrack,cHits,
01182 nAssocMc,nAssocGl,nAssocPr);
01183 mMiniMcEvent->addContamPair(contamPair);
01184 delete contamPair;
01185 if(Debug()>=2) checkContam(mcTrack,glTrack,commonHits);
01186 nContam++;
01187 }
01188 }
01189 else{
01190 cout << "ERROR- no match for rc track when determining split/contaminations? " << endl;
01191 exit(1);
01192 }
01193
01194 }
01195
01196
01197
01198 else if(mGhost && mRcTrackMap->count(glTrack)==0){
01199 StMiniMcPair* miniMcPair = new StMiniMcPair;
01200 fillRcTrackInfo(miniMcPair,
01201 prTrack,glTrack,nAssocMc);
01202 mMiniMcEvent->addTrackPair(miniMcPair,GHOST);
01203 delete miniMcPair;
01204 nGhost++;
01205 if(Debug()) {
01206 cout << "#############" << endl;
01207 cout << "GHOST!" << endl;
01208 cout << "pr pt: " << prTrack->geometry()->momentum().perp() << endl
01209 << "TPC fit hits : " << glTrack->fitTraits().numberOfFitPoints(kTpcId)
01210 << "SVT fit hits : " << glTrack->fitTraits().numberOfFitPoints(kSvtId)
01211 << endl;
01212 }
01213 }
01214 }
01215
01216
01217
01218
01219 fillEventInfo(nGoodTrackEta,nRcGlobal,nRcGoodGlobal20,
01220 nAcceptedRaw,
01221 nMcGoodGlobal20,nMcNch,nMcHminus,
01222 nMcFtpcENch, nMcFtpcWNch,nFtpcEUncorrected,nFtpcWUncorrected,
01223 nUncorrectedGlobals);
01224
01225
01226
01227
01228
01229 cout << "\tall rc tracks: " << prTracks.size() << endl;
01230 cout << "\tn good eta : " << nGoodTrackEta << endl;
01231 cout << "\tcentrality : " << mMiniMcEvent->centrality() << endl;
01232 cout << "\tuncorrected : " << mMiniMcEvent->nUncorrectedPrimaries() << endl;
01233 cout << "\tall mc tracks: " << mcTracks.size() << endl;
01234 cout << "\taccepted raw : " << nAcceptedRaw << endl;
01235 cout << "\taccepted mc : " << nAccepted << endl;
01236 cout << "\tmatched rc gl: " << nMatGlob << endl;
01237 cout << "\tmatched rc pr: " << nMatched << endl;
01238 cout << "\tmerged rc : " << nMerged << endl;
01239 cout << "\tsplit rc : " << nSplit << endl;
01240 if(mGhost) {
01241 cout << "\tghost rc : " << nGhost << endl;
01242 cout << "\tcontam rc : " << nContam << endl;
01243 cout << "\tcontam new : " << nContamNew << endl;
01244 }
01245
01246
01247 mNSplit += nSplit; mNGhost+= nGhost; mNContam += nContam;
01248 mNMatched += nMatched;
01249 mNMatGlob += nMatGlob;
01250 }
01251
01252 struct MyHolder_t { const StTrack *gl;const StTrack *pr;int hits; float qa;};
01253 void StMiniMcMaker::trackLoopIdT()
01254 {
01255
01256
01257 typedef std::map< int,const StTinyMcTrack*> McTinyMap_t;
01258 typedef std::pair<int,const StTinyMcTrack*> McTrackPair_t;
01259 typedef McTinyMap_t::const_iterator McTinyMapIter_t;
01260
01261
01262
01263 typedef std::multimap< int,MyHolder_t> StTrackMap_t;
01264 typedef std::pair<int,MyHolder_t> StTrackPair_t;
01265 typedef StTrackMap_t::const_iterator StTrackMapIter_t;
01266
01267 Int_t nAcceptedRaw(0),nAccepted(0),
01268 nRcGoodGlobal20(0), nRcGlobal(0), nMcGoodGlobal20(0),
01269 nMcNch(0), nMcHminus(0), nMcFtpcWNch(0), nMcFtpcENch(0);
01270 Int_t nGoodTrackEta(0), nFtpcWUncorrected(0), nFtpcEUncorrected(0);
01271 Int_t nUncorrectedGlobals(0);
01272
01273 const StVertex *myVertex = mRcEvent->primaryVertex(mMainVtx);
01274
01275 const StPtrVecMcTrack& mcTracks = mMcEvent->tracks();
01276 int NMcTracks = mcTracks.size();
01277 cout << "size of mcEvent->tracks() : " << NMcTracks << endl;
01278
01279
01280 StTrackMap_t glMap,prMap;
01281 StSPtrVecTrackNode& trackNode = mRcEvent->trackNodes();
01282 int nTracks = trackNode.size(),myKey;
01283 for (int i=0; i < nTracks; i++) {
01284 StTrackNode *node = trackNode[i];
01285 if (!node) continue;
01286 StTrack *glTrack = node->track(global);
01287 if (! glTrack) continue;
01288 if(acceptGlobals(glTrack)) nUncorrectedGlobals++;
01289
01290 nRcGlobal++;
01291 if(acceptGood20(glTrack)) nRcGoodGlobal20++;
01292
01293 StPrimaryTrack *prTrack = (StPrimaryTrack*)node->track(primary);
01294 if (prTrack && prTrack->vertex()!=myVertex) prTrack=0;
01295 MyHolder_t h; h.gl = glTrack;h.pr = prTrack;
01296 dominatTkInfo(glTrack,myKey ,h.hits,h.qa);
01297 glMap.insert(StTrackPair_t(myKey,h));
01298 if (!prTrack) continue;
01299 prMap.insert(StTrackPair_t(myKey,h));
01300
01301 if(acceptCentrality(prTrack)) nGoodTrackEta++;
01302 if(acceptFTPC(prTrack) && prTrack->geometry()->momentum().pseudoRapidity() < 0. ) nFtpcEUncorrected++;
01303 if(acceptFTPC(prTrack) && prTrack->geometry()->momentum().pseudoRapidity() > 0. ) nFtpcWUncorrected++;
01304 }
01305
01306
01307 McTinyMap_t mcTinyMap ;
01308 for (int k = 0; k < NMcTracks; k++) {
01309 const StMcTrack* mcTrack = mcTracks[k];
01310 if (! mcTrack->geantId()) continue;
01311 int tkKey = mcTrack->key(); if (!tkKey) continue;
01312 if(!acceptRaw(mcTrack)) continue;
01313 nAcceptedRaw++;
01314 if(!accept(mcTrack)) continue;
01315 nAccepted++;
01316 if(acceptGood20(mcTrack)) nMcGoodGlobal20++;
01317 if(fabs(mcTrack->pseudoRapidity())<.5 && isPrimaryTrack(mcTrack) && mcTrack->particleDefinition()){
01318 if(mcTrack->particleDefinition()->charge()!=0) nMcNch++;
01319 if(mcTrack->particleDefinition()->charge() <0) nMcHminus++;
01320 }
01321 if(mcTrack->particleDefinition() && mcTrack->particleDefinition()->charge()!=0 && isPrimaryTrack(mcTrack) ) {
01322 if(mcTrack->pseudoRapidity()<-2.8 && mcTrack->pseudoRapidity()>-3.8) nMcFtpcENch++;
01323 if(mcTrack->pseudoRapidity()> 2.8 && mcTrack->pseudoRapidity()< 3.8) nMcFtpcWNch++;
01324 }
01325 int nAssocGl = glMap.count(tkKey);
01326 int nAssocPr = prMap.count(tkKey);
01327 StTinyMcTrack *tinyMcTrack = mMiniMcEvent->addMcTrack(0);
01328 fillMcTrackInfo(tinyMcTrack,mcTrack,nAssocGl,nAssocPr);
01329 mcTinyMap[tkKey] = tinyMcTrack;
01330 }
01331
01332
01333
01334 for (StTrackMapIter_t it =glMap.begin(); it!= glMap.end();++it) {
01335 int tkKey = (*it).first;
01336 const MyHolder_t &h = (*it).second;
01337 StMiniMcPair *miniMcPair = mMiniMcEvent->addTrackPair(0,MATCHED);
01338 const StTinyMcTrack *tinyMcTrack = mcTinyMap[tkKey];
01339
01340 if (tinyMcTrack) *((StTinyMcTrack*)miniMcPair) = *tinyMcTrack;
01341 fillRcTrackInfo(miniMcPair,h.pr,h.gl,0);
01342 miniMcPair->setDominatrack(tkKey);
01343 miniMcPair->setDominCommonHit(h.hits);
01344 miniMcPair->setAvgQuality(h.qa);
01345 miniMcPair->setNCommonHit(h.hits);
01346 }
01347
01348 fillEventInfo(nGoodTrackEta,nRcGlobal,nRcGoodGlobal20,
01349 nAcceptedRaw,nMcGoodGlobal20,nMcNch ,nMcHminus,
01350 nMcFtpcENch ,nMcFtpcWNch ,nFtpcEUncorrected,nFtpcWUncorrected,
01351 nUncorrectedGlobals);
01352 }
01353 #if 0
01354
01355 void StMiniMcMaker::trackLoopIdT()
01356 {
01357 if(Debug()) cout << "##StMiniMcMaker::trackLoopIdT()" << endl;
01358 Short_t dominatrackKey, dominatrackHits;
01359 Float_t avgQuality;
01360 Int_t nAcceptedRaw(0),nAccepted(0),
01361 nRcGoodGlobal20(0), nRcGlobal(0), nMcGoodGlobal20(0),
01362 nMcNch(0), nMcHminus(0), nMcFtpcWNch(0), nMcFtpcENch(0);
01363 Int_t nGoodTrackEta(0), nFtpcWUncorrected(0), nFtpcEUncorrected(0);
01364
01365 std::vector<int> enteredGlobalTracks;
01366 const StPtrVecMcTrack& mcTracks = mMcEvent->tracks();
01367 UInt_t NMcTracks = mcTracks.size();
01368 cout << "size of mcEvent->tracks() : " << NMcTracks << endl;
01369 map<Long_t,const StMcTrack*> mcMap;
01370
01371 mcMap[0] = 0;
01372
01373 for (UInt_t k = 0; k < NMcTracks; k++) {
01374 const StMcTrack* mcTrack = mcTracks[k];
01375 if (! mcTrack->geantId()) continue;
01376 Int_t nAssocGl = mMcTrackMap->count(mcTrack);
01377 if (Debug() > 1) {
01378 mcTrack->Print("desc"); mcTrack->Print("all");
01379 pair<mcTrackMapIter,mcTrackMapIter> mcBounds = mMcTrackMap->equal_range(mcTrack);
01380 mcTrackMapIter mcMapIter = mcBounds.first;
01381 for ( ; mcMapIter != mcBounds.second; ++mcMapIter){
01382 StTrackPairInfo* assocPair = (*mcMapIter).second;
01383 const StGlobalTrack* globTrack = assocPair->partnerTrack();
01384 cout << * assocPair << endl;
01385 cout << "globTrack FitPoints Tpc/FtpcE/W = " << globTrack->fitTraits().numberOfFitPoints(kTpcId)
01386 << "/" << globTrack->fitTraits().numberOfFitPoints(kFtpcEastId)
01387 << "/" << globTrack->fitTraits().numberOfFitPoints(kFtpcWestId) << endl;
01388 }
01389 }
01390 Int_t nAssocPr = 0;
01391 if(acceptRaw(mcTrack)) nAcceptedRaw++;
01392 StTinyMcTrack *tinyMcTrack = mMiniMcEvent->addMcTrack(0);
01393 fillMcTrackInfo(tinyMcTrack,mcTrack,nAssocGl,nAssocPr);
01394 if(fabs(mcTrack->pseudoRapidity())<.5 && isPrimaryTrack(mcTrack) && mcTrack->particleDefinition()){
01395 if(mcTrack->particleDefinition()->charge()!=0) nMcNch++;
01396 if(mcTrack->particleDefinition()->charge()<0) nMcHminus++;
01397 }
01398 if(mcTrack->particleDefinition() && mcTrack->particleDefinition()->charge()!=0 && isPrimaryTrack(mcTrack) ) {
01399 if(mcTrack->pseudoRapidity()<-2.8 && mcTrack->pseudoRapidity()>-3.8) nMcFtpcENch++;
01400 if(mcTrack->pseudoRapidity()>2.8 && mcTrack->pseudoRapidity()<3.8) nMcFtpcWNch++;
01401 }
01402 if(acceptGood20(mcTrack)) nMcGoodGlobal20++;
01403 if(accept(mcTrack)) nAccepted++;
01404 mcMap[mcTrack->key()] = mcTrack;
01405
01406 }
01407 StSPtrVecTrackNode& trackNode = mRcEvent->trackNodes();
01408 UInt_t nTracks = trackNode.size();
01409 StTrackNode *node=0;
01410 for (unsigned int i=0; i < nTracks; i++) {
01411 node = trackNode[i];
01412 if (!node) continue;
01413 const StGlobalTrack *glTrack = static_cast<const StGlobalTrack *>(node->track(global));
01414 if (! glTrack) continue;
01415 StPrimaryTrack *prTrack = static_cast<StPrimaryTrack*>(node->track(primary));
01416
01417
01418
01419
01420 dominatrackInfo(glTrack, dominatrackKey , dominatrackHits, avgQuality);
01421 Long_t Key = dominatrackKey;
01422 const StMcTrack* mcTrack = mcMap[Key];
01423 StMiniMcPair *miniMcPair = mMiniMcEvent->addTrackPair(0,MATCHED);
01424 Int_t nAssocGl = mMcTrackMap->count(mcTrack);
01425 Int_t nAssocPr = 0;
01426 Int_t nAssocMc = mRcTrackMap->count(glTrack);
01427
01428
01429
01430 if(acceptRaw(mcTrack)) nAcceptedRaw++;
01431 nRcGlobal++;
01432 if(acceptGood20(glTrack)) nRcGoodGlobal20++;
01433
01434
01435
01436
01437 if(prTrack) {
01438 if (acceptCentrality(prTrack)) nGoodTrackEta++;
01439 if(acceptFTPC(prTrack) && prTrack->geometry()->momentum().pseudoRapidity() < 0. ) nFtpcEUncorrected++;
01440 if(acceptFTPC(prTrack) && prTrack->geometry()->momentum().pseudoRapidity() > 0. ) nFtpcWUncorrected++;
01441 }
01442 if (mcTrack) {
01443 if(fabs(mcTrack->pseudoRapidity())<.5 && isPrimaryTrack(mcTrack) && mcTrack->particleDefinition()){
01444 if(mcTrack->particleDefinition()->charge()!=0) nMcNch++;
01445 if(mcTrack->particleDefinition()->charge()<0) nMcHminus++;
01446 }
01447 if(mcTrack->particleDefinition() && mcTrack->particleDefinition()->charge()!=0 && isPrimaryTrack(mcTrack) ) {
01448 if(mcTrack->pseudoRapidity()<-2.8 && mcTrack->pseudoRapidity()>-3.8) nMcFtpcENch++;
01449 if(mcTrack->pseudoRapidity()>2.8 && mcTrack->pseudoRapidity()<3.8) nMcFtpcWNch++;
01450 }
01451 if(acceptGood20(mcTrack)) nMcGoodGlobal20++;
01452 }
01453 pair<rcTrackMapIter,rcTrackMapIter> rcBounds = mRcTrackMap->equal_range(glTrack);
01454 rcTrackMapIter rcMapIter = rcBounds.first;
01455 StTrackPairInfo *candTrackPair = 0;
01456 Int_t i = 0;
01457 for( ; rcMapIter != rcBounds.second; rcMapIter++, i++){
01458 StTrackPairInfo *assocPair = (*rcMapIter).second;
01459 const StMcTrack* mcCandTrack = assocPair->partnerMcTrack();
01460 if (mcCandTrack == mcTrack) {
01461 candTrackPair = assocPair;
01462 }
01463 }
01464 Int_t commonHits = 0;
01465 if (mcTrack) {
01466 fillMcTrackInfo(miniMcPair,mcTrack,nAssocGl,nAssocPr);
01467 if (candTrackPair) commonHits = candTrackPair->commonTpcHits()+((candTrackPair->commonSvtHits())*100);
01468 }
01469 if(prTrack || glTrack) fillRcTrackInfo(miniMcPair,prTrack,glTrack,nAssocMc);
01470 miniMcPair->setDominatrack(Key);
01471 miniMcPair->setDominCommonHit(dominatrackHits);
01472 miniMcPair->setAvgQuality(avgQuality);
01473 miniMcPair->setNCommonHit(commonHits);
01474 miniMcPair->setIsBestContam(i == 1);
01475 }
01476 fillEventInfo(nGoodTrackEta,nRcGlobal,nRcGoodGlobal20,
01477 nAcceptedRaw,
01478 nMcGoodGlobal20,nMcNch,nMcHminus,
01479 nMcFtpcENch, nMcFtpcWNch,nFtpcEUncorrected,nFtpcWUncorrected);
01480 }
01481 #endif//0
01482
01483 void StMiniMcMaker::buildEmcIndexArray()
01484 {
01485 if (Debug()>1) cout << "StMiniMcMaker::buildEmcIndexArray" << endl;
01486
01487
01488
01489
01490
01491
01492
01493
01494 for (int softIdNum=1; softIdNum<4801; ++softIdNum) mEmcIndex[softIdNum]=0;
01495
01496 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom(1);
01497 if (! mRcEvent->emcCollection()) return;
01498 StEmcDetector* bemcDet = mRcEvent->emcCollection()->detector(kBarrelEmcTowerId);
01499 if (! bemcDet) return;
01500 if (Debug()>1) {
01501 cout << "emcGeom " << emcGeom << endl;
01502 cout << "bemcDet " << bemcDet << endl;
01503 }
01504
01505
01506 for (size_t iMod=1; iMod<=bemcDet->numberOfModules(); ++iMod) {
01507 StSPtrVecEmcRawHit& modHits = bemcDet->module(iMod)->hits();
01508 if (Debug()>1) {
01509 cout << "Module " << iMod << endl;
01510 cout << "Hits in Module " << modHits.size() << endl;
01511 }
01512 for (size_t iHit=0; iHit<modHits.size(); ++iHit) {
01513 StEmcRawHit* rawHit = modHits[iHit];
01514 unsigned int softId = rawHit->softId(1);
01515 if (Debug()>2) {
01516 cout << "iHit " << iHit << endl;
01517 cout << "soft Id " << softId << endl;
01518 cout << "ene, mod, eta, sub " << rawHit->energy()
01519 << ", " << rawHit->module()
01520 << ", " << rawHit->eta()
01521 << ", " << rawHit->sub()
01522 << endl;
01523 }
01524
01525
01526
01527 if (!emcGeom->checkId(softId)) {
01528 mEmcIndex[softId] = rawHit;
01529 }
01530 }
01531 }
01532 return;
01533 }
01534
01535
01536
01537
01538
01539
01540 Int_t StMiniMcMaker::openFile()
01541 {
01542 cout << "###StMiniMcMaker::openFile()" << endl;
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554 cout << "Infilename = " << mInFileName << endl;
01555 if (mInFileName == "") {
01556 TFile *tfile = GetTFile();
01557 assert(tfile);
01558 tfile->cd();
01559 } else {
01560 TString outFileName(mInFileName);
01561
01562 short indx1 = outFileName.First('.');
01563 short indx2 = outFileName.Last('.');
01564 if (indx1!=indx2) outFileName.Remove(indx1+1,(indx2-indx1));
01565 outFileName.Insert(indx1+1,"minimc.");
01566 outFileName.Prepend(mOutDir);
01567
01568 closeFile();
01569 cout << "Opening File " << outFileName << endl;
01570 mMiniMcDST = new TFile(outFileName.Data(),"RECREATE");
01571
01572 if(!mMiniMcDST || !mMiniMcDST->IsOpen()){
01573 gMessMgr->Error() << "Cannot create = " << outFileName << endm;
01574 return kStErr;
01575 }
01576
01577 cout << "\toutfile = " << outFileName << endl;
01578 mOutFileName = outFileName;
01579
01580
01581
01582 }
01583 if(Debug()) cout << "##Creating the top level tree..." << endl;
01584 mMiniMcTree = new TTree("StMiniMcTree","StMiniMcTree");
01585 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,01,05)
01586 mMiniMcTree->SetBranchStyle(0);
01587 #endif
01588 Int_t bufSZ = 64000;
01589 mMiniMcTree->Branch("StMiniMcEvent","StMiniMcEvent",&mMiniMcEvent, bufSZ,1);
01590 mMiniMcTree->SetAutoSave(10000000);
01591
01592 cout << "##...done" << endl;
01593
01594 return kStOk;
01595 }
01596
01597
01598
01599 Int_t StMiniMcMaker::closeFile()
01600 {
01601 cout << "###StMiniMcMaker::closeFile()" << endl;
01602 cout << "\tWriting " << mOutFileName << endl;
01603
01604 if(mMiniMcDST && mMiniMcDST->IsOpen()){
01605 mMiniMcDST->cd();
01606 mMiniMcTree->Write();
01607 mMiniMcDST->Write();
01608 mMiniMcDST->Close();
01609 delete mMiniMcDST; mMiniMcDST=0;
01610 }
01611 mMiniMcTree=0;
01612 cout << "\t...done\n";
01613
01614 return kStOk;
01615 }
01616
01617
01618 void StMiniMcMaker::fillEventInfo(Int_t nGoodTrackEta, Int_t nRcGlobal, Int_t nRcGoodGlobal20,
01619 Int_t nMcGlobal, Int_t nMcGoodGlobal20,
01620 Int_t nMcNch, Int_t nMcHminus, Int_t nMcFtpcENch, Int_t nMcFtpcWNch, Int_t nFtpcEUncorrected,
01621 Int_t nFtpcWUncorrected, Int_t nUncorrectedGlobals)
01622 {
01623 mMiniMcEvent->setEventId((Int_t) mRcEvent->id());
01624 mMiniMcEvent->setRunId((Int_t) mRcEvent->runId());
01625 mMiniMcEvent->setOriginMult((Int_t)mRcEvent->primaryVertex(mMainVtx)->numberOfDaughters());
01626 mMiniMcEvent->setCentralMult(nGoodTrackEta);
01627
01628 mMiniMcEvent->setImpact (mMcEvent->impactParameter() );
01629 mMiniMcEvent->setImpactPhi (mMcEvent->phiReactionPlane() );
01630 mMiniMcEvent->setTimeOffset (mMcEvent->triggerTimeOffset());
01631
01632 mMiniMcEvent->setNMcNch(nMcNch);
01633 mMiniMcEvent->setNMcFtpcWNch(nMcFtpcWNch);
01634 mMiniMcEvent->setNMcFtpcENch(nMcFtpcENch);
01635 mMiniMcEvent->setNMcHminus(nMcHminus);
01636
01637 mMiniMcEvent->setNMcGlobal(nMcGlobal);
01638 mMiniMcEvent->setNMcGoodGlobal20(nMcGoodGlobal20);
01639
01640 mMiniMcEvent->setNRcGlobal(nRcGlobal);
01641 mMiniMcEvent->setNRcGoodGlobal20(nRcGoodGlobal20);
01642
01643 mMiniMcEvent->setNUncorrectedNegativePrimaries(uncorrectedNumberOfNegativePrimaries(*mRcEvent));
01644 mMiniMcEvent->setNUncorrectedPrimaries(uncorrectedNumberOfPrimaries(*mRcEvent));
01645
01646 mMiniMcEvent->setNUncorrectedGlobals(nUncorrectedGlobals);
01647
01648 mMiniMcEvent->setNFtpcWUncorrectedPrimaries(nFtpcWUncorrected);
01649 mMiniMcEvent->setNFtpcEUncorrectedPrimaries(nFtpcEUncorrected);
01650
01651 mMiniMcEvent->setCentrality(getIndex((size_t) mMiniMcEvent->nUncorrectedPrimaries()));
01652 mMiniMcEvent->setMcMult(mMcEvent->numberOfPrimaryTracks());
01653
01654 mMiniMcEvent->setVertexX(mRcVertexPos->x());
01655 mMiniMcEvent->setVertexY(mRcVertexPos->y());
01656 mMiniMcEvent->setVertexZ(mRcVertexPos->z());
01657 StMatrixF C(mRcEvent->primaryVertex(mMainVtx)->covariantMatrix());
01658 Float_t cov[6] = {C(1,1),C(2,1),C(2,2),C(3,1),C(3,2),C(3,3)};
01659 mMiniMcEvent->setVertexCovMatrix(cov);
01660 mMiniMcEvent->setMcVertexX(mMcVertexPos->x());
01661 mMiniMcEvent->setMcVertexY(mMcVertexPos->y());
01662 mMiniMcEvent->setMcVertexZ(mMcVertexPos->z());
01663
01664 if (mRcEvent->runInfo()) {
01665 mMiniMcEvent->setMagField(static_cast<Float_t>(mRcEvent->runInfo()->magneticField()));
01666 mMiniMcEvent->setBackgroundRate(mRcEvent->runInfo()->backgroundRate());
01667 mMiniMcEvent->setCenterOfMassEnergy(mRcEvent->runInfo()->centerOfMassEnergy());
01668 mMiniMcEvent->setBeamMassNumberEast(mRcEvent->runInfo()->beamMassNumber(east));
01669 mMiniMcEvent->setBeamMassNumberWest(mRcEvent->runInfo()->beamMassNumber(west));
01670 }
01671
01672 Float_t ctb = -1., zdce = -1, zdcw = -1;
01673
01674 StTriggerDetectorCollection *triggers
01675 = mRcEvent->triggerDetectorCollection();
01676 if (triggers) {
01677 StCtbTriggerDetector &CTB = triggers->ctb();
01678 StZdcTriggerDetector &ZDC = triggers->zdc();
01679
01680 for (UInt_t slat=0; slat<CTB.numberOfSlats(); slat++) {
01681 for (UInt_t tray=0; tray<CTB.numberOfTrays();tray++) {
01682 ctb += CTB.mips(tray,slat,0);
01683 }
01684 }
01685
01686 zdce = ZDC.adcSum(east);
01687 zdcw = ZDC.adcSum(west);
01688 }
01689
01690 mMiniMcEvent->setCtb(ctb);
01691 mMiniMcEvent->setZdcE(zdce);
01692 mMiniMcEvent->setZdcW(zdcw);
01693
01694 }
01695
01696
01697 void StMiniMcMaker::fillTrackPairInfo( StMiniMcPair* miniMcPair,
01698 const StMcTrack* mcTrack,
01699 const StTrack* prTrack,
01700 const StTrack* glTrack,
01701 Int_t commonHits,
01702 Int_t nAssocMc, Int_t nAssocGl,
01703 Int_t nAssocPr, Bool_t isBestContam)
01704 {
01705
01706 if(mcTrack) fillMcTrackInfo(miniMcPair,mcTrack,nAssocGl,nAssocPr);
01707
01708 if(prTrack || glTrack) fillRcTrackInfo(miniMcPair,prTrack,glTrack,nAssocMc);
01709
01710
01711 miniMcPair->setNCommonHit(commonHits);
01712 miniMcPair->setIsBestContam(isBestContam);
01713
01714 short aeonFlux(-999),aeonFluxHits(0);
01715 float aeonFluxQuality(-999);
01716 if (prTrack) dominatrackInfo(prTrack,aeonFlux,aeonFluxHits,aeonFluxQuality);
01717 else if (glTrack) dominatrackInfo(glTrack,aeonFlux,aeonFluxHits,aeonFluxQuality);
01718 miniMcPair->setDominatrack(aeonFlux);
01719 miniMcPair->setDominCommonHit(aeonFluxHits);
01720 miniMcPair->setAvgQuality(aeonFluxQuality);
01721
01722
01723 StContamPair* contamPair = dynamic_cast<StContamPair*>(miniMcPair);
01724 if(contamPair){
01725 const StMcTrack* mcTParent = mcTrack->parent();
01726
01727 if (mcTParent){
01728 contamPair->setParentGeantId(mcTrack->parent()->geantId());
01729 contamPair->setPtMcParent(mcTrack->parent()->momentum().perp());
01730 contamPair->setEtaMcParent(mcTrack->parent()->pseudoRapidity());
01731 contamPair->setGeantProcess(mcTrack->startVertex()->geantProcess());
01732
01733 contamPair->setStartX(mcTrack->startVertex()->position().x());
01734 contamPair->setStartY(mcTrack->startVertex()->position().y());
01735 contamPair->setStartZ(mcTrack->startVertex()->position().z());
01736
01737 Int_t parentParentGeantId=0;
01738 Float_t parentParentPt=0;
01739
01740 if(mcTrack->parent()->parent() &&
01741 mcTrack->parent()->parent()->geantId()>0){
01742 parentParentGeantId = mcTrack->parent()->parent()->geantId();
01743 parentParentPt = mcTrack->parent()->parent()->momentum().perp();
01744 }
01745 contamPair->setParentParentGeantId(parentParentGeantId);
01746 contamPair->setPtMcParentParent(parentParentPt);
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766
01767
01768
01769
01770
01771 } else {
01772 StMiniMcMakerErrorCount++;
01773 if ( StMiniMcMakerErrorCount < 50){
01774 cout << "StMiniMcMaker::fillTrackPairInfo: WARNING mcTrack->parent() is NULL !! "
01775 << " If this comes from a normal simulation or embeding, please report !!"
01776 << " This is known to happen in pilup mode ONLY ... " << endl;
01777 }
01778 }
01779 }
01780
01781 }
01782
01783
01784 void StMiniMcMaker::fillRcTrackInfo(StTinyRcTrack* tinyRcTrack,
01785 const StTrack* prTrack,
01786 const StTrack* glTrack,
01787 Int_t nAssocMc)
01788 {
01789 if (!glTrack) {
01790 cout << "Error StMiniMcMaker::fillRcTrackInfo, glTrack pointer is zero " << glTrack << endl;
01791 return;
01792 }
01793 const StGlobalTrack *global = (StGlobalTrack*)glTrack;
01794 const StDcaGeometry* dcaGeo = global->dcaGeometry();
01795 tinyRcTrack->setValidGl();
01796 tinyRcTrack->setRecoKey(glTrack->key());
01797 tinyRcTrack->setDca00(1000.);
01798 if (dcaGeo ) {
01799 tinyRcTrack->setDca00(dcaGeo->impact());
01800 tinyRcTrack->setDca(1);
01801 StThreeVectorF glMom = dcaGeo->momentum();
01802 THelixTrack glHelix = dcaGeo->thelix();
01803
01804
01805 enum { kImpImp=0,
01806 kZImp, kZZ,
01807 kPsiImp, kPsiZ, kPsiPsi,
01808 kPtiImp, kPtiZ, kPtiPsi, kPtiPti,
01809 kTanImp, kTanZ, kTanPsi, kTanPti, kTanTan};
01810 const float *dcaErr=dcaGeo->errMatrix();
01811
01812
01813
01814
01815
01816
01817
01818 double pt = glMom.perp();
01819 tinyRcTrack->setPtGl(pt);
01820 tinyRcTrack->setPzGl(glMom.z());
01821 tinyRcTrack->setEtaGl(glMom.pseudoRapidity());
01822 tinyRcTrack->setPhiGl(glMom.phi());
01823 tinyRcTrack->setCurvGl(dcaGeo->curvature());
01824 tinyRcTrack->setTanLGl(dcaGeo->tanDip());
01825 tinyRcTrack->setSeedQuality(glTrack->seedQuality());
01826 float errorGl[5] = {dcaErr[kImpImp],dcaErr[kZZ],dcaErr[kPsiPsi]
01827 ,dcaErr[kPtiPti]*pow(pt,4)
01828 ,dcaErr[kTanTan]};
01829 for (int j=0;j<5;j++) {errorGl[j] = sqrt(errorGl[j]);}
01830 tinyRcTrack->setErrGl(errorGl);
01831 double vtx[3]={mRcVertexPos[0][0],mRcVertexPos[0][1],mRcVertexPos[0][2]};
01832 double dcaXY,dcaZ;
01833 double s = glHelix.Dca(vtx,dcaXY,dcaZ,0);
01834 tinyRcTrack->setDcaXYGl(dcaXY);
01835 tinyRcTrack->setDcaZGl(dcaZ);
01836 tinyRcTrack->setDcaGl(sqrt(dcaXY*dcaXY+dcaZ*dcaZ));
01837 double mcv[3]={mMcVertexPos[0][0],mMcVertexPos[0][1],mMcVertexPos[0][2]};
01838 s = glHelix.Dca(mcv,dcaXY,dcaZ,0);
01839 tinyRcTrack->setDcaXYGlMcV(dcaXY);
01840 tinyRcTrack->setDcaZGlMcV(dcaZ);
01841 } else {
01842 tinyRcTrack->setDca(0);
01843 const StThreeVectorF& glMom = glTrack->geometry()->momentum();
01844
01845 const StPhysicalHelixD& glHelix = glTrack->geometry()->helix();
01846
01847
01848
01849 double pt = glMom.perp();
01850 tinyRcTrack->setPtGl(pt);
01851 tinyRcTrack->setPzGl(glMom.z());
01852 tinyRcTrack->setEtaGl(glMom.pseudoRapidity());
01853 tinyRcTrack->setPhiGl(glMom.phi());
01854 tinyRcTrack->setCurvGl(glTrack->geometry()->curvature());
01855 tinyRcTrack->setTanLGl(tan(glTrack->geometry()->dipAngle()));
01856 tinyRcTrack->setSeedQuality(glTrack->seedQuality());
01857 StMatrixF gCM = glTrack->fitTraits().covariantMatrix();
01858
01859 Float_t errorGl[5] = {gCM[0][0]*pow(M_PI/180,2)
01860 ,gCM[1][1]
01861 ,gCM[3][3]*pow(M_PI/180,2)
01862 ,gCM[4][4]*pow(pt,4)
01863 ,gCM[2][2]};
01864 for (int j=0;j<5;j++) {errorGl[j] = sqrt(errorGl[j]);}
01865 tinyRcTrack->setErrGl(errorGl);
01866
01867
01868
01869
01870
01871
01872
01873
01874 tinyRcTrack->setDcaGl(glTrack->impactParameter());
01875 tinyRcTrack->setDcaXYGl(computeXY(mRcVertexPos,glTrack));
01876
01877 tinyRcTrack->setDcaXYGl(computeXY(mRcVertexPos,glTrack));
01878 tinyRcTrack->setDcaZGlMcV(dcaz(glHelix,*mMcVertexPos,glTrack));
01879 tinyRcTrack->setDcaXYGlMcV(computeXY(mMcVertexPos,glTrack));
01880 }
01881
01882 StDedxPidTraits* pid = findDedxPidTraits(glTrack);
01883 float meanDedx = (pid) ? pid->mean() : -999;
01884 tinyRcTrack->setDedx(meanDedx);
01885 short nDedxPts = (pid) ? pid->numberOfPoints() : 0;
01886 tinyRcTrack->setDedxPts(nDedxPts);
01887
01888
01889
01890
01891
01892 PAIRHIT hits = findFirstLastHit(glTrack);
01893 PAIRHIT fitHits = findFirstLastFitHit(glTrack);
01894
01895 if(hits.first){
01896
01897 tinyRcTrack->setFirstZ(hits.first->position().z());
01898 tinyRcTrack->setLastZ(hits.second->position().z());
01899 tinyRcTrack->setFirstPadrow(hits.first->padrow());
01900 tinyRcTrack->setLastPadrow(hits.second->padrow());
01901 tinyRcTrack->setFirstSector(hits.first->sector());
01902 tinyRcTrack->setLastSector(hits.second->sector());
01903 }
01904 else if ( glTrack->detectorInfo()->numberOfPoints()==0) {
01905
01906 cout << "Error: no hits?" << endl;
01907 cout << "Tpc points : " << glTrack->detectorInfo()->numberOfPoints(kTpcId) << endl;
01908 cout << "Svt points : " << glTrack->detectorInfo()->numberOfPoints(kTpcId) << endl;
01909 cout << "Ftpc points E: " << glTrack->detectorInfo()->numberOfPoints(kFtpcEastId) << endl;
01910 cout << "Ftpc points W: " << glTrack->detectorInfo()->numberOfPoints(kFtpcWestId) << endl;
01911 }
01912 if (fitHits.first) {
01913 tinyRcTrack->setFirstFitPadrow(fitHits.first->padrow());
01914 tinyRcTrack->setLastFitPadrow(fitHits.second->padrow());
01915 }
01916 else if ( glTrack->fitTraits().numberOfFitPoints()==0) {
01917 cout << "Error: no hit with usedInFit()>0" << endl;
01918 cout << "Tpc fit pts :" << glTrack->fitTraits().numberOfFitPoints(kTpcId) << endl;
01919 cout << "Svt fit pts :" << glTrack->fitTraits().numberOfFitPoints(kSvtId) << endl;
01920 cout << "Ftpc fit pts E:" << glTrack->fitTraits().numberOfFitPoints(kFtpcEastId) << endl;
01921 cout << "Ftpc fit pts C:" << glTrack->fitTraits().numberOfFitPoints(kFtpcWestId) << endl;
01922 }
01923
01924 tinyRcTrack->setFitPts(glTrack->fitTraits().numberOfFitPoints(kTpcId));
01925 tinyRcTrack->setFitSvt(glTrack->fitTraits().numberOfFitPoints(kSvtId));
01926 tinyRcTrack->setFitSsd(glTrack->fitTraits().numberOfFitPoints(kSsdId));
01927 size_t ftpcFitPts = 0;
01928 if (tinyRcTrack->etaGl()>1.8)
01929 ftpcFitPts = glTrack->fitTraits().numberOfFitPoints(kFtpcWestId);
01930 if (tinyRcTrack->etaGl()<-1.8)
01931 ftpcFitPts = glTrack->fitTraits().numberOfFitPoints(kFtpcEastId);
01932 tinyRcTrack->setFitFtpc(ftpcFitPts);
01933 tinyRcTrack->setAllPts(glTrack->detectorInfo()->numberOfPoints(kTpcId));
01934 tinyRcTrack->setCharge(glTrack->geometry()->charge());
01935
01936 tinyRcTrack->setNAssocMc(nAssocMc);
01937 tinyRcTrack->setNPossible(glTrack->numberOfPossiblePoints(kTpcId));
01938
01939 if (prTrack) {
01940 tinyRcTrack->setValidPr();
01941
01942
01943 const StThreeVectorF& prMom = prTrack->geometry()->momentum();
01944 const StPhysicalHelixD& prHelix = prTrack->geometry()->helix();
01945
01946 double pt = prMom.perp();
01947 tinyRcTrack->setPtPr(pt);
01948 tinyRcTrack->setPzPr(prMom.z());
01949 tinyRcTrack->setEtaPr(prMom.pseudoRapidity());
01950 tinyRcTrack->setPhiPr(prMom.phi());
01951 tinyRcTrack->setCurvPr(prTrack->geometry()->curvature());
01952 tinyRcTrack->setTanLPr(tan(prTrack->geometry()->dipAngle()));
01953 tinyRcTrack->setChi2Pr(prTrack->fitTraits().chi2());
01954 tinyRcTrack->setFlag(prTrack->flag());
01955 tinyRcTrack->setDcaPr(prTrack->impactParameter());
01956 tinyRcTrack->setDcaXYPr(computeXY(mRcVertexPos,prTrack));
01957
01958 tinyRcTrack->setDcaZPr(dcaz(prHelix,*mRcVertexPos));
01959 tinyRcTrack->setDcaXYPrMcV(computeXY(mMcVertexPos,prTrack));
01960 tinyRcTrack->setDcaZPrMcV(dcaz(prHelix,*mMcVertexPos));
01961 tinyRcTrack->setFitPts(prTrack->fitTraits().numberOfFitPoints(kTpcId));
01962 tinyRcTrack->setFitSvt(prTrack->fitTraits().numberOfFitPoints(kSvtId));
01963 tinyRcTrack->setFitSsd(prTrack->fitTraits().numberOfFitPoints(kSsdId));
01964 StMatrixF pCM = prTrack->fitTraits().covariantMatrix();
01965 Float_t errorPr[5] = {pCM[0][0]*pow(M_PI/180,2)
01966 ,pCM[1][1]
01967 ,pCM[3][3]*pow(M_PI/180,2)
01968 ,pCM[4][4]*pow(pt,4)
01969 ,pCM[2][2]};
01970 for (int j=0;j<5;j++) {errorPr[j] = sqrt(errorPr[j]);}
01971 tinyRcTrack->setErrPr(errorPr);
01972 size_t ftpcFitPts = 0;
01973 if (tinyRcTrack->etaGl()>1.8)
01974 ftpcFitPts = prTrack->fitTraits().numberOfFitPoints(kFtpcWestId);
01975 if (tinyRcTrack->etaGl()<-1.8)
01976 ftpcFitPts = prTrack->fitTraits().numberOfFitPoints(kFtpcEastId);
01977 tinyRcTrack->setFitFtpc(ftpcFitPts);
01978
01979 }
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990 StEmcPosition emcPos;
01991 StThreeVectorD *pos = new StThreeVectorD(0,0,0);
01992 StThreeVectorD *mom = new StThreeVectorD(0,0,0);
01993 double magField = mRcEvent->runInfo()->magneticField();
01994
01995 if (Debug()>2) {
01996 cout << "fillRcTrack, EMC information" << endl;
01997 cout << "Extrapolating to BEMC using B Field = " << magField*kilogauss/tesla << " tesla" << endl;
01998
01999
02000
02001
02002
02003 }
02004
02005
02006
02007
02008 bool projOk;
02009
02010 if (prTrack) {
02011 projOk = emcPos.trackOnEmc(pos,mom,prTrack,magField*kilogauss/tesla);
02012 }
02013 else {
02014 projOk = emcPos.trackOnEmc(pos,mom,glTrack,magField*kilogauss/tesla);
02015 }
02016 if (projOk) {
02017
02018
02019 int softIdProj;
02020 std::vector<StEmcRawHit*> towersOfTrack;
02021 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
02022 emcGeom->getId(pos->phi(),pos->pseudoRapidity(),softIdProj);
02023 for(int idEta=-1; idEta<2; ++idEta) {
02024 for (int idPhi=-1; idPhi<2; ++idPhi) {
02025 int towerId = emcPos.getNextTowerId(softIdProj,idEta,idPhi);
02026 if ( towerId == 0 )
02027 {
02028 continue;
02029 }
02030 if (!emcGeom->checkId(towerId)) {
02031
02032
02033
02034
02035 StEmcRawHit* emcHit = mEmcIndex[towerId];
02036 if (emcHit!=0) {
02037 towersOfTrack.push_back(emcHit);
02038 }
02039 }
02040 }
02041 }
02042 if (Debug()>1) {
02043 cout << "Outer Helix " << glTrack->outerGeometry()->helix() << endl;
02044 cout << "Track Projects to tower " << softIdProj << endl;
02045 cout << "Track hits at R= " << pos->perp() << " eta,phi: " << pos->pseudoRapidity() << ", " << pos->phi() << endl;
02046 cout << "Track Has " << towersOfTrack.size() << " total candidate towers" << endl;
02047 }
02048 if (towersOfTrack.size()>0) {
02049
02050
02051 sort(towersOfTrack.begin(),towersOfTrack.end(),StEmcRawHitCompEne);
02052
02053
02054 size_t maxTowers=3;
02055 if (towersOfTrack.size()<maxTowers) maxTowers=towersOfTrack.size();
02056 for (size_t iTow=0; iTow<maxTowers; ++iTow) {
02057 tinyRcTrack->setEmcTowerAdc(towersOfTrack[iTow]->adc(),iTow);
02058 tinyRcTrack->setEmcEnergyRcHit(towersOfTrack[iTow]->energy(),iTow);
02059 tinyRcTrack->setEmcSoftIdHiTowerRc(towersOfTrack[iTow]->softId(1),iTow);
02060 }
02061
02062 }
02063 else {
02064 for (size_t iTow=0; iTow<0; ++iTow) {
02065 tinyRcTrack->setEmcTowerAdc(-9,iTow);
02066 tinyRcTrack->setEmcEnergyRcHit(-9,iTow);
02067 tinyRcTrack->setEmcSoftIdHiTowerRc(-9,iTow);
02068 }
02069
02070 }
02071 if (Debug()>1) {
02072 cout << "rc track, key " << tinyRcTrack->recoKey() << endl;
02073 cout << "n Tpc Fit Pts " << tinyRcTrack->fitPts() << endl;
02074 cout << "3 bemc hit ene " << tinyRcTrack->emcEnergyRcHit(0)
02075 << ", " << tinyRcTrack->emcEnergyRcHit(1)
02076 << ", " << tinyRcTrack->emcEnergyRcHit(2) << endl;
02077 cout << "3 HiTow SoftId Rc " << tinyRcTrack->emcSoftIdHiTowerRc(0)
02078 << ", " << tinyRcTrack->emcSoftIdHiTowerRc(1)
02079 << ", " << tinyRcTrack->emcSoftIdHiTowerRc(2) << endl;
02080 float etaTow, phiTow;
02081 emcGeom->getEtaPhi(tinyRcTrack->emcSoftIdHiTowerRc(0),etaTow,phiTow);
02082 cout << "Hi Tow eta, phi Rc " << etaTow << ", " << phiTow << endl;
02083
02084 }
02085 }
02086 return;
02087 }
02088
02089
02090 void StMiniMcMaker::fillMcTrackInfo(StTinyMcTrack* tinyMcTrack,
02091 const StMcTrack* mcTrack,
02092 Int_t nAssocGl, Int_t nAssocPr)
02093 {
02094 if (mcTrack) {
02095 tinyMcTrack->setValid();
02096 const StThreeVectorF& mcMom = mcTrack->momentum();
02097
02098 tinyMcTrack->setKey(mcTrack->key());
02099 tinyMcTrack->setPrimary(mcTrack->IsPrimary());
02100 tinyMcTrack->setPtMc(mcMom.perp());
02101 tinyMcTrack->setPzMc(mcMom.z());
02102 tinyMcTrack->setEtaMc(mcMom.pseudoRapidity());
02103 tinyMcTrack->setPhiMc(mcMom.phi());
02104 tinyMcTrack->setNHitMc(mcTrack->tpcHits().size());
02105 tinyMcTrack->setNSvtHitMc(mcTrack->svtHits().size());
02106 tinyMcTrack->setNSsdHitMc(mcTrack->ssdHits().size());
02107 tinyMcTrack->setNFtpcHitMc(mcTrack->ftpcHits().size());
02108 tinyMcTrack->setGeantId(mcTrack->geantId());
02109 tinyMcTrack->setPdgId(mcTrack->pdgId());
02110 short chargeMc = -9999;
02111 if (mcTrack->particleDefinition()) chargeMc = static_cast<short>(mcTrack->particleDefinition()->charge());
02112 tinyMcTrack->setChargeMc(chargeMc);
02113
02114 tinyMcTrack->setNAssocGl(nAssocGl);
02115 tinyMcTrack->setNAssocPr(nAssocPr);
02116
02117 float stopR=(mcTrack->stopVertex()) ? mcTrack->stopVertex()->position().perp() : 999;
02118 tinyMcTrack->setStopR(stopR);
02119
02120
02121 tinyMcTrack->setKey(mcTrack->key());
02122 if (mcTrack->parent()!=0) {
02123 tinyMcTrack->setParentKey(mcTrack->parent()->key());
02124 tinyMcTrack->setParentGeantId(mcTrack->parent()->geantId());
02125 }
02126 tinyMcTrack->setPtMc(mcMom.perp());
02127 tinyMcTrack->setPzMc(mcMom.z());
02128 tinyMcTrack->setEtaMc(mcMom.pseudoRapidity());
02129 tinyMcTrack->setPhiMc(mcMom.phi());
02130 tinyMcTrack->setNHitMc(mcTrack->tpcHits().size());
02131 tinyMcTrack->setNSvtHitMc(mcTrack->svtHits().size());
02132 tinyMcTrack->setNFtpcHitMc(mcTrack->ftpcHits().size());
02133 tinyMcTrack->setNBemcHitMc(mcTrack->bemcHits().size());
02134 tinyMcTrack->setNBprsHitMc(mcTrack->bprsHits().size());
02135 tinyMcTrack->setNBsmdeHitMc(mcTrack->bsmdeHits().size());
02136 tinyMcTrack->setNBsmdpHitMc(mcTrack->bsmdpHits().size());
02137 tinyMcTrack->setNEemcHitMc(mcTrack->eemcHits().size());
02138 tinyMcTrack->setNBprsHitMc(mcTrack->bprsHits().size());
02139 tinyMcTrack->setNBsmdeHitMc(mcTrack->bsmdeHits().size());
02140 tinyMcTrack->setNBsmdpHitMc(mcTrack->bsmdpHits().size());
02141 tinyMcTrack->setGeantId(mcTrack->geantId());
02142
02143 tinyMcTrack->setNAssocGl(nAssocGl);
02144 tinyMcTrack->setNAssocPr(nAssocPr);
02145
02146
02147
02148
02149
02150
02151
02152
02153 StPtrVecMcCalorimeterHit bemcHits = mcTrack->bemcHits();
02154 if (bemcHits.size()>0) {
02155 std::vector<StMcCalorimeterHit*> bemcHitsSorted(bemcHits.size());
02156 int hiEnergyHitSoftId(-999);
02157 double sumEnergy(0);
02158 copy(bemcHits.begin(),bemcHits.end(),bemcHitsSorted.begin());
02159 sort(bemcHitsSorted.begin(),bemcHitsSorted.end(),StMcCalorimeterHitCompdE);
02160 if (Debug()>2) {
02161 cout << "fillMcTrackInfo() Check sorting of dE for StMcCalorimeterHits" << endl;
02162 }
02163 StEmcGeom* emcGeom = StEmcGeom::getEmcGeom("bemc");
02164 for (StMcCalorimeterHitIterator bhi=bemcHitsSorted.begin();
02165 bhi!=bemcHitsSorted.end();
02166 ++bhi) {
02167 StMcCalorimeterHit* bh = *bhi;
02168 float eta;
02169 emcGeom->getEta(bh->module(),bh->eta(),eta);
02170 sumEnergy += (*bhi)->dE()*scaleFactor(eta);
02171 if (Debug()>2) cout << bh->dE()*scaleFactor(eta) << endl;
02172 }
02173
02174 size_t maxHits = 3;
02175 if (bemcHitsSorted.size()<maxHits) maxHits=bemcHitsSorted.size();
02176 for (size_t iCalHit=0; iCalHit<maxHits; ++iCalHit) {
02177 float eta;
02178 emcGeom->getEta(bemcHitsSorted[iCalHit]->module(),bemcHitsSorted[iCalHit]->eta(),eta);
02179 tinyMcTrack->setEmcEnergyMcHit(bemcHitsSorted[iCalHit]->dE()*scaleFactor(eta),iCalHit);
02180 emcGeom->getId(bemcHitsSorted[iCalHit]->module(),
02181 bemcHitsSorted[iCalHit]->eta(),
02182 bemcHitsSorted[iCalHit]->sub(),hiEnergyHitSoftId);
02183 tinyMcTrack->setEmcSoftIdHiTowerMc(static_cast<Short_t>(hiEnergyHitSoftId),iCalHit);
02184 }
02185
02186 for (size_t iCalHit2=maxHits; iCalHit2<3; ++iCalHit2) {
02187 tinyMcTrack->setEmcEnergyMcHit(-9,iCalHit2);
02188 tinyMcTrack->setEmcSoftIdHiTowerMc(-9,iCalHit2);
02189
02190 }
02191 tinyMcTrack->setEmcEnergyMcSum(sumEnergy);
02192
02193 if (Debug()>1) {
02194 cout << "mc track, geant Id " << tinyMcTrack->geantId() << endl;
02195 cout << "parent geantId " << tinyMcTrack->parentGeantId() << endl;
02196 cout << "n Tpc Hits " << tinyMcTrack->nHitMc() << endl;
02197 cout << "n Bemc Hits " << tinyMcTrack->nBemcHitMc() << endl;
02198 cout << "3 bemc hit ene " << tinyMcTrack->emcEnergyMcHit(0)
02199 << ", " << tinyMcTrack->emcEnergyMcHit(1)
02200 << ", " << tinyMcTrack->emcEnergyMcHit(2) << endl;
02201 cout << "MC 3 Hi SoftIds " << tinyMcTrack->emcSoftIdHiTowerMc(0)
02202 << ", " << tinyMcTrack->emcSoftIdHiTowerMc(1)
02203 << ", " << tinyMcTrack->emcSoftIdHiTowerMc(2) << endl;
02204 cout << "emc energy sum " << tinyMcTrack->emcEnergyMcSum() << endl;
02205 cout << "MC trk momentum " << tinyMcTrack->pMc() << endl;
02206 cout << "MC eta, phi " << tinyMcTrack->etaMc() << ", " << tinyMcTrack->phiMc() << endl;
02207 float etaTow, phiTow;
02208 emcGeom->getEtaPhi(tinyMcTrack->emcSoftIdHiTowerMc(0),etaTow,phiTow);
02209 cout << "MC HiTow eta,phi " << etaTow << ", " << phiTow << endl;
02210 if (mEmcIndex[tinyMcTrack->emcSoftIdHiTowerMc(0)]) {
02211 StEmcRawHit* rawHit = mEmcIndex[tinyMcTrack->emcSoftIdHiTowerMc(0)];
02212 cout << "RC Ene for id " << rawHit->energy()
02213 << " m= " << rawHit->module()
02214 << " e= " << rawHit->eta()
02215 << " s= " << rawHit->sub()
02216 << endl;
02217
02218 }
02219 else {
02220 cout << "Soft Id Mc " << tinyMcTrack->emcSoftIdHiTowerMc(0) << " has no StEmcRawHit" << endl;
02221 }
02222 }
02223
02224 }
02225
02226 }
02227 return;
02228 }
02229
02230
02231
02232
02233 StTrackPairInfo* StMiniMcMaker::findBestMatchedGlobal(const StMcTrack* mcTrack)
02234 {
02235 pair<mcTrackMapIter,mcTrackMapIter> mcBounds = mMcTrackMap->equal_range((const StMcTrack*)mcTrack);
02236 StTrackPairInfo* candTrackPair = 0;
02237 const StGlobalTrack* candTrack = 0;
02238 mcTrackMapIter mcMapIter = mcBounds.first;
02239 for ( ; mcMapIter != mcBounds.second; ++mcMapIter){
02240 StTrackPairInfo* assocPair = (*mcMapIter).second;
02241 const StGlobalTrack* globTrack = assocPair->partnerTrack();
02242 if (Debug() > 1) {
02243 cout << * assocPair << endl;
02244 cout << "globTrack FitPoints Tpc/FtpcE/W = " << globTrack->fitTraits().numberOfFitPoints(kTpcId)
02245 << "/" << globTrack->fitTraits().numberOfFitPoints(kFtpcEastId)
02246 << "/" << globTrack->fitTraits().numberOfFitPoints(kFtpcWestId) << endl;
02247 }
02248 if (!globTrack || globTrack->flag()<=0) continue;
02249 if (globTrack->fitTraits().numberOfFitPoints(kTpcId)>=10 ||
02250 globTrack->fitTraits().numberOfFitPoints(kFtpcEastId)>=5 ||
02251 globTrack->fitTraits().numberOfFitPoints(kFtpcWestId)>=5) {
02252 if (!candTrackPair) {
02253 candTrackPair = assocPair;
02254 candTrack = globTrack;
02255 }
02256 else if (globTrack->fitTraits().numberOfFitPoints(kTpcId) > candTrack->fitTraits().numberOfFitPoints(kTpcId)) {
02257 candTrackPair = assocPair;
02258 candTrack = globTrack;
02259 }
02260 else if (globTrack->fitTraits().numberOfFitPoints(kFtpcEastId) > candTrack->fitTraits().numberOfFitPoints(kFtpcEastId)) {
02261 candTrackPair = assocPair;
02262 candTrack = globTrack;
02263 }
02264 else if (globTrack->fitTraits().numberOfFitPoints(kFtpcWestId) > candTrack->fitTraits().numberOfFitPoints(kFtpcWestId)) {
02265 candTrackPair = assocPair;
02266 candTrack = globTrack;
02267 }
02268
02269 }
02270 }
02271 return candTrackPair;
02272 }
02273
02274 PAIRVEC StMiniMcMaker::findMatchedRc(const StMcTrack* mcTrack)
02275 {
02276
02277
02278
02279 pair<mcTrackMapIter,mcTrackMapIter> mcBounds = mMcTrackMap->equal_range((const StMcTrack*)mcTrack);
02280
02281 PAIRVEC candPair;
02282
02283 mcTrackMapIter mcMapIter = mcBounds.first;
02284 for( ; mcMapIter != mcBounds.second; mcMapIter++){
02285 StTrackPairInfo* assocPair = (*mcMapIter).second;
02286
02287 const StGlobalTrack* glTrack = assocPair->partnerTrack();
02288
02289
02290
02291
02292 const StPrimaryTrack* prTrack=0;
02293 if(!(prTrack = isPrimaryTrack(glTrack))) continue;
02294
02295
02296
02297
02298
02299
02300
02301
02302
02303
02304
02305 if(!accept(glTrack) || !accept(prTrack)) continue;
02306
02307
02308
02309
02310
02311
02312
02313
02314
02315
02316 candPair.push_back(assocPair);
02317
02318 }
02319
02320 return candPair;
02321 }
02322
02323
02324 PAIRHIT StMiniMcMaker::findFirstLastHit(const StTrack* track)
02325 {
02326 const StPtrVecHit& hits = track->detectorInfo()->hits(kTpcId);
02327 std::vector<const StTpcHit*> vec;
02328
02329
02330 for(UInt_t i=0; i<hits.size(); i++){
02331 const StTpcHit* hit = dynamic_cast<const StTpcHit*>(hits[i]);
02332 if(!hit) continue;
02333 vec.push_back(hit);
02334 }
02335 sort(vec.begin(),vec.end(),hitCmp);
02336 if (vec.size()) {
02337 return PAIRHIT(vec[0],vec[vec.size()-1]);
02338 }
02339 else {
02340 const StTpcHit* empty = 0;
02341 return PAIRHIT(empty,empty);
02342 }
02343 }
02344
02345
02346 PAIRHIT StMiniMcMaker::findFirstLastFitHit(const StTrack* track)
02347 {
02348 const StPtrVecHit& hits = track->detectorInfo()->hits(kTpcId);
02349 std::vector<const StTpcHit*> vec;
02350
02351
02352 for(UInt_t i=0; i<hits.size(); i++){
02353 const StTpcHit* hit = dynamic_cast<const StTpcHit*>(hits[i]);
02354 if(!hit) continue;
02355 if(!hit->usedInFit()) continue;
02356 vec.push_back(hit);
02357 }
02358 sort(vec.begin(),vec.end(),hitCmp);
02359 if (vec.size()) {
02360 return PAIRHIT(vec[0],vec[vec.size()-1]);
02361 }
02362 else {
02363 const StTpcHit* empty = 0;
02364 return PAIRHIT(empty,empty);
02365 }
02366 }
02367
02368
02369
02370
02371
02372 Bool_t StMiniMcMaker::acceptRaw(const StMcTrack* mcTrack)
02373 {
02374 return (mcTrack);
02375
02376
02377
02378
02379
02380
02381
02382 }
02383
02384
02385
02386
02387 Bool_t StMiniMcMaker::accept(const StMcTrack* mcTrack)
02388 {
02389 return (mcTrack && mcTrack->tpcHits().size() >= 10);
02390 }
02391
02392
02393
02394 Bool_t StMiniMcMaker::accept(const StTrack* rcTrack)
02395 {
02396 UInt_t nFitPoint = rcTrack->fitTraits().numberOfFitPoints(kTpcId);
02397 return ( rcTrack &&
02398 rcTrack->impactParameter() < 3. &&
02399 nFitPoint>=3 &&
02400 rcTrack->flag()>0 &&
02401 rcTrack->geometry()->momentum().perp() < 40 );
02402 }
02403
02404
02405
02406 Bool_t StMiniMcMaker::isSameSign(const StTrack* rcTrack,const StMcTrack* mcTrack)
02407 {
02408 return (rcTrack->geometry()->charge()*
02409 mcTrack->particleDefinition()->charge()>0);
02410 }
02411
02412
02413
02414 Bool_t StMiniMcMaker::acceptPt(const StTrack* track)
02415 {
02416 return (track->geometry()->momentum().perp()>=mMinPt &&
02417 track->geometry()->momentum().perp()<=mMaxPt);
02418 }
02419
02420
02421
02422 Bool_t StMiniMcMaker::acceptPt(const StMcTrack *track)
02423 {
02424 return (track->momentum().perp()>=mMinPt &&
02425 track->momentum().perp()<=mMaxPt);
02426 }
02427
02428
02429 Bool_t StMiniMcMaker::acceptDebug(const StMcTrack* track)
02430 {
02431 return (track->momentum().pseudoRapidity() <= .1
02432 && track->momentum().pseudoRapidity() >= 0 &&
02433 (track->geantId()==9 || track->geantId()==12 || track->geantId()==15));
02434
02435 }
02436
02437
02438
02439 Bool_t StMiniMcMaker::acceptCentrality(const StTrack* track)
02440 {
02441 return (fabs(track->geometry()->momentum().pseudoRapidity())<.75);
02442 }
02443
02444
02445
02446 Bool_t StMiniMcMaker::acceptUncorrected(const StTrack* track)
02447 {
02448 return (
02449 track->geometry()->charge()<0 &&
02450 track->fitTraits().numberOfFitPoints(kTpcId)>=10 &&
02451 fabs(track->geometry()->momentum().pseudoRapidity())<=0.5 &&
02452 track->geometry()->helix().distance(*mRcVertexPos)<3
02453 );
02454 }
02455
02456
02457 Bool_t StMiniMcMaker::acceptGlobals(const StTrack* track)
02458 {
02459 return (
02460 track->fitTraits().numberOfFitPoints(kTpcId)>=10 &&
02461 fabs(track->geometry()->momentum().pseudoRapidity())<=0.5 &&
02462 track->geometry()->helix().distance(*mRcVertexPos)<3
02463 );
02464 }
02465
02466
02467 Bool_t StMiniMcMaker::acceptFTPC(const StTrack* prTrack)
02468 {
02469 if(!prTrack) return false;
02470 const StTrack* glTrack=prTrack->node()->track(global);
02471
02472 return (prTrack &&
02473 glTrack->geometry()->helix().distance(*mRcVertexPos)<3&&
02474 prTrack->geometry()->momentum().perp() < 3 &&
02475 glTrack->fitTraits().numberOfFitPoints(kTpcId) >=5 &&
02476 fabs(prTrack->geometry()->momentum().pseudoRapidity())>=2.8 &&
02477 fabs(prTrack->geometry()->momentum().pseudoRapidity())<3.8
02478 );
02479 }
02480
02481
02482
02483 Bool_t StMiniMcMaker::ok(const StTrack* track)
02484 {
02485 return (track && track->flag()>0);
02486 }
02487
02488
02489 Bool_t StMiniMcMaker::acceptGood20(const StTrack* track)
02490 {
02491 UInt_t nFitPoint = track->fitTraits().numberOfFitPoints(kTpcId);
02492 return (track && nFitPoint >= 20);
02493 }
02494
02495
02496
02497 Bool_t StMiniMcMaker::acceptGood20(const StMcTrack* track)
02498 {
02499 return (track && track->tpcHits().size() >= 20);
02500 }
02501
02502
02503
02504 const StPrimaryTrack* StMiniMcMaker::isPrimaryTrack(const StTrack* glTrack)
02505 {
02506 if(!glTrack) return 0;
02507 return dynamic_cast<const StPrimaryTrack*>(glTrack->node()->track(primary));
02508 }
02509
02510
02511
02512 Bool_t StMiniMcMaker::isPrimaryTrack(const StMcTrack* mcTrack)
02513 {
02514
02515 return(mcTrack->startVertex() == mMcEvent->primaryVertex());
02516
02517 }
02518
02519
02520
02521 Float_t StMiniMcMaker::computeXY(const StThreeVectorF* pos, const StTrack* track)
02522 {
02523
02524
02525
02526
02527
02528 double xCenter = track->geometry()->helix().xcenter();
02529 double yCenter = track->geometry()->helix().ycenter();
02530 double radius = 1.0/track->geometry()->helix().curvature();
02531
02532 double dPosCenter
02533 = TMath::Sqrt( (pos->x()-xCenter) * (pos->x()-xCenter) +
02534 (pos->y()-yCenter) * (pos->y()-yCenter));
02535
02536 return (Float_t) ( radius - dPosCenter );
02537 }
02538
02539
02540
02541 #if 0
02542 pair<Float_t,Float_t>
02543 StMiniMcMaker::computeProj(const StThreeVectorF* pos, const StTrack* track)
02544 {
02545
02546
02547
02548
02549 Double_t s = track->geometry()->helix().pathLength(*pos);
02550
02551 StThreeVectorD dcaPos = track->geometry()->helix().at(s);
02552
02553 StThreeVectorD distance = dcaPos - *pos;
02554
02555 return pair<Float_t,Float_t>((Float_t) distance.perp(),
02556 (Float_t)distance.z());
02557 }
02558 #endif //0
02559
02560
02561 Float_t StMiniMcMaker::computeZDca(const StThreeVectorF* point, const StTrack* track)
02562 {
02563 const StPhysicalHelixD& helix = track->geometry()->helix();
02564 pairD path = helix.pathLength(point->perp());
02565
02566 const StThreeVectorD& pos1 = helix.at(path.first);
02567 const StThreeVectorD& pos2 = helix.at(path.second);
02568 const StThreeVectorD dis1 = *point - pos1;
02569 const StThreeVectorD dis2 = *point - pos2;
02570
02571 double dcaZ = (dis1.mag() < dis2.mag()) ? dis1.z() : dis2.z();
02572 if(isnan(dcaZ)) return 999;
02573 return dcaZ;
02574 }
02575
02576 StDedxPidTraits* StMiniMcMaker::findDedxPidTraits(const StTrack* track)
02577 {
02578 StDedxPidTraits* pid=0;
02579 StPtrVecTrackPidTraits traits = track->pidTraits(kTpcId);
02580
02581 for (UInt_t i = 0; i < traits.size(); i++) {
02582 pid = dynamic_cast<StDedxPidTraits*>(traits[i]);
02583 if (pid && pid->method() == kTruncatedMeanId) break;
02584 }
02585 return pid;
02586 }
02587
02588
02589
02590 void StMiniMcMaker::checkMerged(const StMcTrack* mergedMcTrack, Int_t mergedCommonHits,
02591 const StTrack* track)
02592 {
02593
02594 if(!isPrimaryTrack(mergedMcTrack))
02595 cout << "NOT a MC PRIMARY track" << endl;
02596
02597 cout << "rc key : " << track->key() << endl;
02598 cout << "rc pr pt : "
02599 << track->geometry()->momentum().perp() << endl;
02600 cout << "rc pr flag : " << track->flag() << endl;
02601 cout << "rc pr dca : "
02602 << track->geometry()->helix().distance(*mRcVertexPos) << endl;
02603 cout << "mc key : " << mergedMcTrack->key() << endl;
02604 cout << "mc evt gen : " << mergedMcTrack->eventGenLabel() << endl;
02605 cout << "mc pt : "
02606 << mergedMcTrack->momentum().perp() << endl;
02607 cout << "mc eta: " << mergedMcTrack->momentum().pseudoRapidity() << endl;
02608 cout << "mc hits : "
02609 << mergedMcTrack->tpcHits().size() << endl;
02610 cout << "geant : " << mergedMcTrack->geantId() << endl;
02611 cout << "common hits : "
02612 << mergedCommonHits << endl;
02613 cout << "rc all hits : "
02614 << track->detectorInfo()->numberOfPoints(kTpcId) << endl;
02615 cout << "rc fit hits : "
02616 << track->fitTraits().numberOfFitPoints(kTpcId) << endl;
02617
02618 }
02619
02620
02621
02622 void StMiniMcMaker::checkSplit(const StMcTrack* mcTrack, const StTrack* glTrack,
02623 Int_t commonHits)
02624 {
02625
02626
02627 PAIRVEC testPair = findMatchedRc(mcTrack);
02628 sort(testPair.begin(), testPair.end(), sortCmp);
02629
02630 cout << "#######################################" << endl;
02631 cout << "CHECK SPLIT:" << endl;
02632 cout << "mc pt : "
02633 << mcTrack->momentum().perp() << endl;
02634 cout << "mc key: "
02635 << mcTrack->key() << endl;
02636 if (mcTrack->particleDefinition()) {
02637 cout << "mc charge: "
02638 << mcTrack->particleDefinition()->charge() << endl;
02639 }
02640 cout << "mc eta : "
02641 << mcTrack->momentum().pseudoRapidity() << endl;
02642 cout << "mc pts: "
02643 << mcTrack->tpcHits().size() << endl;
02644 cout << "gl pt : "
02645 << glTrack->geometry()->momentum().perp() << endl;
02646 cout << "all hits : "
02647 << glTrack->detectorInfo()->numberOfPoints(kTpcId) << endl;
02648 cout << "fit pts : "
02649 << glTrack->fitTraits().numberOfFitPoints(kTpcId)<< endl;
02650 cout << "common hits : " << commonHits << endl;
02651
02652
02653
02654
02655 if(testPair.size() == 1) {
02656 cout << "ERROR in split. not really a split track. "
02657 << "maybe due to pt cut?" << endl;
02658 cout << "mc start vertex : " << mcTrack->startVertex()->position() << endl;
02659
02660 }
02661 cout << ">>Here are the rc tracks" << endl;
02662 for(unsigned int i=0; i<testPair.size(); i++){
02663 cout << "i: " << i << endl;
02664 const StGlobalTrack* testGlTrack = testPair[i]->partnerTrack();
02665 cout << "pt rc : "
02666 << testGlTrack->geometry()->momentum().perp() << endl;
02667 cout << "all hits : "
02668 << testGlTrack-> detectorInfo()->numberOfPoints(kTpcId) << endl;
02669 cout << "fit pts : "
02670 << testGlTrack->fitTraits().numberOfFitPoints(kTpcId)<< endl;
02671 cout << "common hits : "
02672 << testPair[i]->commonTpcHits() << endl;
02673 }
02674 cout << "#######################################" << endl;
02675
02676 }
02677
02678
02679
02680 void StMiniMcMaker::checkContam(const StMcTrack* mcTrack, const StGlobalTrack* glTrack,
02681 Int_t commonHits)
02682 {
02683
02684 cout << "############## " << endl;
02685 cout << "CHECK CONTAM " << endl;
02686
02687 if(mcTrack->startVertex() == mMcEvent->primaryVertex()){
02688 cout << "\tERROR mc track is a primary!\n" << endl;
02689 }
02690 const StPrimaryTrack* prTrack=isPrimaryTrack(glTrack);
02691 cout << "common hits : " << commonHits << endl
02692 << "rc key : " << prTrack->key() << endl
02693 << "mc key : " << mcTrack->key() << endl
02694 << "pr pt : " << prTrack->geometry()->momentum().perp() << endl
02695 << "mc pt : " << mcTrack->momentum().perp() << endl
02696 << "fit pts : " << glTrack->fitTraits().numberOfFitPoints(kTpcId)
02697 << endl
02698 << "all pts : "<< glTrack->detectorInfo()->numberOfPoints(kTpcId)<< endl
02699 << "gl dca xy : " << computeXY(mRcVertexPos,glTrack) << endl;
02700 cout << ">>Here are all the mc tracks matched to this rc track" << endl;
02701
02702 pair<rcTrackMapIter,rcTrackMapIter> rcBounds
02703 = mRcTrackMap->equal_range(glTrack);
02704
02705 rcTrackMapIter rcMapIter = rcBounds.first;
02706
02707 for( ; rcMapIter != rcBounds.second; rcMapIter++){
02708 StTrackPairInfo* assocPair = (*rcMapIter).second;
02709 const StMcTrack* mcCandTrack = assocPair->partnerMcTrack();
02710
02711 cout << "common hits=" << assocPair->commonTpcHits()
02712 << ", is mc primary=" << (isPrimaryTrack(mcTrack)?"yes":"no")
02713 << ", mc key=" << mcCandTrack->key()
02714 << ", hits=" << mcCandTrack->tpcHits().size() << endl;
02715 }
02716 cout << ">>Here are the rc tracks matched to this mc track" << endl;
02717
02718 PAIRVEC testPair = findMatchedRc(mcTrack);
02719 sort(testPair.begin(), testPair.end(), sortCmp);
02720
02721 for(unsigned int i=0; i<testPair.size(); i++){
02722 cout << "i: " << i << endl;
02723 const StGlobalTrack* testGlTrack = testPair[i]->partnerTrack();
02724
02725 cout << "common hits=" << testPair[i]->commonTpcHits()
02726 << ", rc key=" << testGlTrack->key() << endl;
02727 }
02728
02729 }
02730
02731
02732 size_t StMiniMcMaker::getIndex(size_t mult)
02733 {
02734
02735
02736
02737
02738
02739 if (mult >= 510) return 0;
02740 if (mult >= 431) return 1;
02741 if (mult >= 312) return 2;
02742 if (mult >= 217) return 3;
02743 if (mult >= 146) return 4;
02744 if (mult >= 94 ) return 5;
02745 if (mult >= 56 ) return 6;
02746 if (mult >= 30 ) return 7;
02747 if (mult >= 14 ) return 8;
02748 return 9;
02749 }
02750
02751
02752 void StMiniMcMaker::AppendMCDaughterTrack()
02753 {
02754 if (Debug())
02755 cout << "##StMiniMcMaker::AppendMCDaughterTrack()"<< endl;
02756
02757
02758 const StPtrVecMcTrack& allmcTracks = mMcEvent->tracks();
02759 cout << "size of mcEvent->tracks() : "<< allmcTracks.size() << endl;
02760
02761 Int_t nAppendMC(0);
02762 StMcTrackConstIterator allMcTrkIter = allmcTracks.begin();
02763 for (; allMcTrkIter != allmcTracks.end(); ++allMcTrkIter) {
02764 const StMcTrack* mcGlobTrack = *allMcTrkIter;
02765 if (isPrimaryTrack(mcGlobTrack)) continue;
02766 if (!acceptRaw(mcGlobTrack)) continue;
02767
02768 if (Debug()>1)
02769 cout << "accepted mc global track, key "<< mcGlobTrack->key() << endl;
02770
02771
02772 StTinyMcTrack tinyMcTrack;
02773 fillMcTrackInfo(&tinyMcTrack, mcGlobTrack, 0, 0);
02774 mMiniMcEvent->addMcTrack(&tinyMcTrack);
02775 nAppendMC++;
02776
02777
02778 }
02779
02780 cout << "\tappended mc tracks: "<< nAppendMC << endl;
02781 }
02782
02783
02784 void StMiniMcMaker::dominatTkInfo(const StTrack* recTrack,int &dominatrackKey ,int& dominatrackHits,float& avgQuality) {
02785
02786
02787
02788
02789
02790 int DetectorList[kMaxDetectorId]={0};
02791 typedef std::map< int,float> myMap_t;
02792 typedef std::pair<int,float> myPair_t;
02793 typedef myMap_t::const_iterator myIter_t;
02794 myMap_t idTruths;
02795
02796 const StPtrVecHit &recHits = recTrack->detectorInfo()->hits();
02797
02798 int nHits = recHits.size();
02799 for (int hi=0;hi<nHits; hi++) {
02800 const StHit* rHit = recHits[hi];
02801 int id = rHit->idTruth(); if (!id) continue;
02802 int qa = rHit->qaTruth(); if (!qa) qa = 1;
02803 idTruths[id]+=qa;
02804 }
02805 int tkBest=0; float qaBest=0,qaSum=0;
02806 for (myIter_t it=idTruths.begin(); it!=idTruths.end();++it) {
02807 qaSum+=(*it).second;
02808 if ((*it).second<qaBest) continue;
02809 tkBest=(*it).first; qaBest=(*it).second;
02810 }
02811 dominatrackKey = tkBest; avgQuality = 100*qaBest/(qaSum+1e-10);
02812 for (int hi=0;hi<nHits; hi++) {
02813 const StHit* rHit = recHits[hi];
02814 if (rHit->idTruth()!=tkBest) continue;
02815 DetectorList[rHit->detector()]++;
02816 }
02817 if (DetectorList[kTpcId] > 99) DetectorList[kTpcId] = 99;
02818 if (DetectorList[kSvtId] > 9) DetectorList[kSvtId] = 9;
02819 if (DetectorList[kSsdId] > 9) DetectorList[kSsdId] = 9;
02820 dominatrackHits = DetectorList[kTpcId] + 100*(DetectorList[kSvtId] + 10*DetectorList[kSsdId]);
02821 return;
02822 }
02823
02824
02825
02826
02827
02828
02829
02830
02831
02832
02833
02834
02835
02836
02837
02838
02839
02840
02841
02842
02843
02844
02845
02846
02847
02848
02849
02850
02851
02852
02853
02854
02855
02856
02857
02858
02859
02860
02861
02862
02863
02864
02865
02866
02867
02868
02869
02870
02871
02872
02873
02874
02875
02876
02877
02878
02879
02880
02881
02882
02883
02884
02885
02886
02887
02888
02889
02890
02891
02892
02893
02894
02895
02896
02897
02898
02899
02900
02901
02902
02903
02904
02905
02906
02907
02908
02909
02910
02911
02912
02913
02914