10 #include "FairRootManager.h" 
   11 #include "FairRunAna.h" 
   12 #include "FairRuntimeDb.h" 
   13 #include "FairBaseParSet.h" 
   14 #include "FairTrackParam.h" 
   15 #include "FairRootManager.h" 
   25 #include "TClonesArray.h" 
   26 #include "TGeoManager.h" 
   27 #include "TMatrixFSym.h" 
   53   FairRootManager* ioman = FairRootManager::Instance();
 
   55     cout << 
"-E- "<< GetName() <<
"::Init: " 
   56          << 
"RootManager not instantised!" << endl;
 
   61   FairRunAna* ana = FairRunAna::Instance();
 
   63     cout << 
"-E- "<< GetName() <<
"::Init :" 
   64          <<
" no FairRunAna object!" << endl;
 
   68   FairRuntimeDb* 
rtdb = ana->GetRuntimeDb();
 
   70     cout << 
"-E- "<< GetName() <<
"::Init :" 
   71          <<
" no runtime database!" << endl;
 
   78     cout << 
"-E- "<< GetName() <<
"::Init: No MCTrack array!" 
   86     cout << 
"-E- "<< GetName() <<
"::Init: No MCPoint array!" 
   91     cout <<
"fMCPointArray #: "<< 
fMCPointArray->GetEntriesFast() << endl;
 
   98   std::cout << 
"-I- "<< GetName() <<
": Intialization successfull" << std::endl;
 
  104                                      TClonesArray* trackCandArray) {
 
  109     cout << endl << endl<< endl << endl;
 
  110     cout << 
"=======================================================" << endl;
 
  111     cout << 
"-I-        Event No: " <<  
fNofEvents << endl;
 
  112     cout << 
"=======================================================" << endl;
 
  115     cout <<
"-I- "<< GetName() <<
"::DoFind "<< endl;
 
  116     cout << 
"-------------------------------------------------------" << endl;
 
  117     cout << 
"     ### Start DoFind" << endl;
 
  118     cout << 
"-------------------------------------------------------" << endl;
 
  123     cout << 
"-E- PndGemTrackFinderIdeal::DoFind: " 
  124          << 
"MCTrack array missing! " << endl;
 
  129     cout << 
"-E- "<< GetName() <<
"::DoFind: " 
  130          << 
"MCPoint array missing! " << endl;
 
  135     cout << 
"-E- "<< GetName() <<
"::DoFind: " 
  136          << 
"Hit arrays missing! "<< endl;
 
  141   Int_t nNoMCTrack   = 0;
 
  143   Int_t nNoGemPoint  = 0;
 
  148   FairMCPoint*  mcPoint  = NULL;
 
  156   Int_t mcTrackIndex = 0;  
 
  157   Int_t trackIndex = 0;    
 
  161   std::map<Int_t, Int_t> hitMap;
 
  162   std::map<Int_t, Double_t> trackPMap;
 
  163   std::map<Int_t, Int_t>::iterator itHitMap;
 
  167     cout <<
"# MC Tracks: "<< 
fMCTrackArray->GetEntriesFast() << endl;
 
  169     cout <<
"# MC Points: "<< 
fMCPointArray->GetEntriesFast() << endl;
 
  173   Int_t nGemHits = hitArray->GetEntriesFast();
 
  174   if(
fVerbose > 2) cout <<
"# GemHits: "<< nGemHits << endl;
 
  176   for(Int_t iHit = 0; iHit < nGemHits; iHit++){
 
  178     gemHit = (
PndGemHit*) hitArray->At(iHit);
 
  179     if(gemHit->GetDetectorID() > relDetID) {
 
  180       if(NULL == gemHit ) 
continue;
 
  183       ptIndex = gemHit->GetRefIndex();
 
  185       if ( ptIndex == -1 ) 
continue;
 
  189       if(NULL == mcPoint) 
continue;
 
  192       mcTrackIndex = mcPoint->GetTrackID();
 
  194       trackPMap[mcTrackIndex] = 
TMath::Sqrt(mcPoint->GetPx()*mcPoint->GetPx()+
 
  195                                             mcPoint->GetPy()*mcPoint->GetPy()+
 
  196                                             mcPoint->GetPz()*mcPoint->GetPz());
 
  199       hitMap[mcTrackIndex] += 1;
 
  205   map<Int_t, Int_t> trackMap;
 
  213     cout <<
"# of MC Tracks (nMCTracks): " << nMCTracks << endl;
 
  216   for(Int_t iMCTrack = 0; iMCTrack < nMCTracks; iMCTrack++) {
 
  218     if( !mcTrack ) 
continue;
 
  226         cout <<
"MC track #: "<< iMCTrack
 
  235       cout << iMCTrack << 
": #GemPoints in MCTrack: "<< mcTrack->
GetNPoints(
kGEM) << 
" -> " << hitMap[iMCTrack] << endl;
 
  237     if ( !hitMap[iMCTrack] ) 
continue;
 
  239     gemTrackCand = 
new((*trackCandArray)[nTracks]) 
PndTrackCand();
 
  242     for(Int_t iHit = 0; iHit < nGemHits; iHit++) {
 
  243       gemHit = (
PndGemHit*) hitArray->At(iHit);
 
  249       ptIndex = gemHit->GetRefIndex();
 
  250       if(ptIndex < 0) 
continue;           
 
  258       mcTrackIndex = mcPoint->GetTrackID();
 
  260       if(mcTrackIndex < 0 || mcTrackIndex > nMCTracks) {
 
  261         cout << 
"-E- "<< GetName() <<
"::DoFind: " 
  262              << 
"MCTrack index out of range. " << mcTrackIndex << 
" " 
  263              << nMCTracks << endl;
 
  267       if ( mcTrackIndex != iMCTrack ) 
continue;
 
  269       gemTrackCand->
AddHit(FairRootManager::Instance()->GetBranchId(
"GEMHit"),
 
  273         cout << 
"GEM hit " << iHit << 
" from GEM point " 
  274              << ptIndex << 
" (" << mcTrackIndex << 
") " 
  275              << 
"added to GEM track " << trackIndex << endl;
 
  279     gemTrackCand->
Sort();
 
  289     ptIndex = gemHit->GetRefIndex();
 
  292     gemHit->Position(pos);
 
  293     mcPoint->Momentum(mom);
 
  299     if(pdg<100000000) charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge()/3.;
 
  303     FairTrackParP           firstPar(pos,mom,
 
  304                                      TVector3(0.5, 0.5, 0.5),
 
  310     FairTrackParP           lastPar (pos,mom,
 
  311                                      TVector3(0.5, 0.5, 0.5),
 
  318     gemTrack = 
new((*trackArray)[nTracks]) 
PndTrack(firstPar, lastPar, *gemTrackCand);
 
  322     trackMap[iMCTrack] = nTracks;
 
  329     cout << 
"-------------------------------------------------------" << endl;
 
  330     cout << 
"-I-      "<< GetName() <<
": Event summary      -I-" << endl;
 
  331     cout << 
"-------------------------------------------------------" << endl;
 
  332     cout << 
"Total Gem hits:  " << nGemHits << endl;
 
  333     cout << 
"MC tracks total: " << nMCTracks << 
", accepted: " 
  334          << nMCacc << 
", reconstructable: " << nTracks << endl;
 
  335     if(nNoGemHit)   cout << 
"GemHits not found   : " << nNoGemHit   << endl;
 
  336     if(nNoGemPoint) cout << 
"GemPoints not found : " << nNoGemPoint << endl;
 
  337     if(nNoMCTrack)  cout << 
"MCTracks not found  : " << nNoMCTrack  << endl;
 
  338     if(nNoTrack)    cout << 
"GemTracks not found : " << nNoTrack    << endl;
 
  339     cout << 
"------------------------------------------------------" << endl;
 
void SetRefIndex(TString branch, Int_t i)
TClonesArray * trackArray
virtual Int_t DoFind(TClonesArray *hitArray, TClonesArray *trackArray, TClonesArray *trackCandArray)
Int_t GetNPoints(DetectorId detId) const 
static T Sqrt(const T &x)
PndTrackCandHit GetSortedHit(UInt_t i)
Int_t fNofEvents
event counter 
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
Ideal track finding algorithm. 
virtual ~PndGemTrackFinderIdeal()
friend F32vec4 fabs(const F32vec4 &a)
TClonesArray * fMCPointArray
TVector3 GetPosition() const 
TClonesArray * fMCTrackArray
TVector3 GetStartVertex() const 
Int_t GetMotherID() const