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