FairRoot/PandaRoot
PndMvdIdealTrackFinderTask.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndMvdIdealTrackFinderTask source file -----
3 // -------------------------------------------------------------------------
4 
5 
6 #include "TClonesArray.h"
7 #include "TArrayD.h"
8 #include "TGeoManager.h"
9 
10 #include "FairRootManager.h"
11 #include "FairRun.h"
12 #include "FairRuntimeDb.h"
13 
15 
16 #include "PndSdsDigiPixel.h"
17 #include "PndSdsDigiStrip.h"
18 // #include "PndMvdPixelCluster.h"
19 
20 
21 // ----- Default constructor -------------------------------------------
23  FairTask("MVD Ideal Track Finding Task"),
24  fHitBranchStrip("MVDHitsStrip"),
25  fHitBranchPixel("MVDHitsPixel"),
26  fClusterBranchStrip("MVDStripClusterCand"),
27  fClusterBranchPixel("MVDPixelClusterCand"),
28  fDigiBranchStrip("MVDStripDigis"),
29  fDigiBranchPixel("MVDPixelDigis"),
30  fMcBranch("MVDPoint"),
31  fTrackBranch("MCTrack"),
32  fStripHitArray(NULL),
33  fPixelHitArray(NULL),
34  fStripClusterArray(NULL),
35  fPixelClusterArray(NULL),
36  fStripDigiArray(NULL),
37  fPixelDigiArray(NULL),
38  fMcArray(NULL),
39  fTrackArray(NULL),
40  fTrackCandArray(NULL),
41  fTrackCandMap()
42 {
43 }
44 
45 
46 // -------------------------------------------------------------------------
47 
48 
49 // ----- Destructor ----------------------------------------------------
51 {
52 }
53 // -------------------------------------------------------------------------
54 
55 // ----- Initialization of Parameter Containers -------------------------
57 {
58  // Get Base Container
59 /*
60  FairRun* ana = FairRun::Instance();
61  FairRuntimeDb* rtdb=ana->GetRuntimeDb();
62  fGeoPar = (PndMvdGeoPar*)(rtdb->getContainer("PndMvdGeoPar"));
63 */
64 }
65 
67 {
68 
69  InitStatus stat=kSUCCESS;
70  return stat;
71 
72  /*
73  FairRun* ana = FairRun::Instance();
74  FairRuntimeDb* rtdb=ana->GetRuntimeDb();
75  fGeoPar=(PndMvdGeoPar*)(rtdb->getContainer("PndMvdGeoPar"));
76 
77  return kSUCCESS;
78  */
79 }
80 
81 // ----- Public method Init --------------------------------------------
83 {
84 
85  FairRootManager* ioman = FairRootManager::Instance();
86 
87  if ( ! ioman )
88  {
89  std::cout << "-E- PndMvdIdealTrackFinderTask::Init: "
90  << "RootManager not instantiated!" << std::endl;
91  return kFATAL;
92  }
93 
94  // Get input array
95  fStripHitArray = (TClonesArray*) ioman->GetObject(fHitBranchStrip);
96  if ( !fStripHitArray){
97  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No fStripHitArray!" << std::endl;
98  return kERROR;
99  }
100 
101  fPixelHitArray = (TClonesArray*) ioman->GetObject(fHitBranchPixel);
102  if ( !fPixelHitArray){
103  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No fPixelHitArray!" << std::endl;
104  return kERROR;
105  }
106 
107  fStripClusterArray = (TClonesArray*) ioman->GetObject(fClusterBranchStrip);
108  if ( !fStripClusterArray){
109  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No StripclusterArray!" << std::endl;
110  return kERROR;
111  }
112  fPixelClusterArray = (TClonesArray*) ioman->GetObject(fClusterBranchPixel);
113  if ( !fPixelClusterArray){
114  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No PixelclusterArray!" << std::endl;
115  return kERROR;
116  }
117 
118 
119  fStripDigiArray = (TClonesArray*) ioman->GetObject(fDigiBranchStrip);
120  if ( !fStripDigiArray){
121  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No StripdigiArray!" << std::endl;
122  return kERROR;
123  }
124 
125  fPixelDigiArray = (TClonesArray*) ioman->GetObject(fDigiBranchPixel);
126  if ( !fPixelDigiArray){
127  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No PixeldigiArray!" << std::endl;
128  return kERROR;
129  }
130 
131  fMcArray = (TClonesArray*) ioman->GetObject(fMcBranch);
132  if ( !fMcArray){
133  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No mcArray!" << std::endl;
134  return kERROR;
135  }
136 
137  fTrackArray = (TClonesArray*) ioman->GetObject(fTrackBranch);
138  if ( !fTrackArray){
139  std::cout << "-W- PndMvdIdealTrackFinderTask::Init: " << "No trackArray!" << std::endl;
140  return kERROR;
141  }
142 
143  fTrackCandArray = new TClonesArray("PndTrackCand");
144  ioman->Register("MVDIdealTrackCand", "MVD", fTrackCandArray, kTRUE);
145 
146  std::cout << "-I- PndMvdIdealTrackFinderTask: Initialisation successfull" << std::endl;
147  return kSUCCESS;
148 }
149 // -------------------------------------------------------------------------
150 
151 
152 
153 // ----- Public method Exec --------------------------------------------
155 {
156 
157  // Reset output array
158  if ( ! fTrackCandArray )
159  Fatal("Exec", "No trackCandArray");
160  fTrackCandArray->Delete();
161 
162  Int_t nStripHits = fStripHitArray->GetEntriesFast();
163  Int_t nPixelHits = fPixelHitArray->GetEntriesFast();
164 //TODO: Thi becomes easier now, with the FairHit::GetRefIndex()
165  //pixel part
166  for (Int_t iHit = 0; iHit < nPixelHits; iHit++){
167  PndSdsHit* myHit = (PndSdsHit*)(fPixelHitArray->At(iHit));
168  PndSdsCluster* myCluster = (PndSdsCluster*)(fPixelClusterArray->At(myHit->GetClusterIndex()));
169  PndSdsDigiPixel* apixeldigi = (PndSdsDigiPixel*)fPixelDigiArray->At(myCluster->GetDigiIndex(0));
170  if (apixeldigi->GetIndex(0) == -1) continue; // sort out noise
171  PndSdsMCPoint* myPoint = (PndSdsMCPoint*)(fMcArray->At(apixeldigi->GetIndex(0)));
172 
173  AddAndExpand(myPoint->GetTrackID(),apixeldigi->GetDetID(),iHit, myHit);
174 
175  }
176  //strip part
177  for (Int_t iHit = 0; iHit < nStripHits; iHit++){
178  PndSdsHit* myHit = (PndSdsHit*)(fStripHitArray->At(iHit));
179  PndSdsCluster* myCluster = (PndSdsCluster*)(fStripClusterArray->At(myHit->GetClusterIndex()));
180  PndSdsDigiStrip* astripdigi = (PndSdsDigiStrip*)fStripDigiArray->At(myCluster->GetDigiIndex(0));
181  if (astripdigi->GetIndex(0) == -1) continue; // sort out noise
182  PndSdsMCPoint* myPoint = (PndSdsMCPoint*)(fMcArray->At(astripdigi->GetIndex(0)));
183 
184  AddAndExpand(myPoint->GetTrackID(),astripdigi->GetDetID(),iHit, myHit);
185  }
186 
187  if(fVerbose>0) PrintResult();
188 
189  Int_t i = 0;
190  for (std::map<Int_t,PndTrackCand*>::const_iterator kIt=fTrackCandMap.begin(); kIt != fTrackCandMap.end(); kIt++){
191  Double_t eventTime = FairRootManager::Instance()->GetEventTime();
192  kIt->second->SetTimeStamp(eventTime);
193  new((*fTrackCandArray)[i]) PndTrackCand(*(kIt->second));
194  }
196 }
197 
198 void PndMvdIdealTrackFinderTask::AddAndExpand(Int_t trackID, Int_t detnum, Int_t iHit,PndSdsHit* theHit){
199  if (fTrackCandMap[trackID] == 0){
200  PndTrackCand *myTCand = new PndTrackCand();
201  //PndMCTrack* myMCTrack = (PndMCTrack*)fTrackArray->At(trackID); //[R.K.03/2017] unused variable
202 // myTCand->setCurv(GetTrackCurvature(myMCTrack));
203 // myTCand->setDip(GetTrackDip(myMCTrack));
204 // myTCand->setInverted(false);
205  //int pdg = myMCTrack->GetPdgCode(); //[R.K.02/2017] Unused variable?
206  //double charge; //[R.K.02/2017] Unused variable?
207  //if(pdg<100000000){ //[R.K.02/2017] Unused variable?
208  //charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge()/3.; //[R.K.02/2017] Unused variable?
209  //} //[R.K.02/2017] Unused variable?
210  //else{ //[R.K.02/2017] Unused variable?
211  //charge = 0.; //[R.K.02/2017] Unused variable?
212  //} //[R.K.02/2017] Unused variable?
213 // myTCand->setTrackSeed(
214 // myMCTrack->GetStartVertex(),
215 // myMCTrack->GetMomentum(),
216 // charge/myMCTrack->GetMomentum().Mag()
217 // );
218  myTCand->setMcTrackId(trackID);
219  fTrackCandMap[trackID] = myTCand;
220  }
221 
222  fTrackCandMap[trackID]->AddHit(detnum,iHit,theHit->GetPosition().Mag());
223 }
224 
226 {
227  TVector3 p = myTrack->GetMomentum();
228  return (2/TMath::Sqrt(p.Px()*p.Px() + p.Py()*p.Py()));
229 }
230 
232 {
233  TVector3 p= myTrack->GetMomentum();
234  return (p.Mag()/TMath::Sqrt(p.Px()*p.Px() + p.Py()*p.Py()));
235 }
236 
238 {
239  std::cout << "**** TrackFinding *****" << std::endl;
240  Int_t nStripHits = fStripHitArray->GetEntriesFast();
241  for (std::map<Int_t, PndTrackCand*>::const_iterator kIt=fTrackCandMap.begin();
242  kIt != fTrackCandMap.end(); kIt++){
243  std::cout << "TrackID: " << kIt->first << std::endl;
244  PndTrackCand* trackCand = kIt->second;
245  unsigned int detId, hitId;
246  for (unsigned int i = 0; i < trackCand->GetNHits(); i++){
247  detId=trackCand->GetSortedHit(i).GetDetId();
248  hitId=trackCand->GetSortedHit(i).GetHitId();
249  PndSdsHit* myHit;
250  if(hitId<(UInt_t)nStripHits) myHit = (PndSdsHit*)(fStripHitArray->At(hitId));
251  else myHit = (PndSdsHit*)(fPixelHitArray->At(hitId - nStripHits));
252  std::cout << "Detector no. " << detId <<": "<< *myHit;
253  }
254  }
255  std::cout << std::endl;
256 }
257 
259 {
260  for (std::map<Int_t,PndTrackCand*>::const_iterator kIt=fTrackCandMap.begin();
261  kIt != fTrackCandMap.end(); kIt++){
262  delete(kIt->second);
263  }
264  fTrackCandMap.clear();
265 }
267 
void AddAndExpand(Int_t trackID, Int_t detnum, Int_t iHit, PndSdsHit *theHit)
Double_t p
Definition: anasim.C:58
int fVerbose
Definition: poormantracks.C:24
Int_t i
Definition: run_full.C:25
TVector3 GetPosition() const
Definition: PndSdsHit.h:93
Class to store the Digis which belong to one cluster This class holds the information which Digi belo...
Definition: PndSdsCluster.h:19
Double_t GetTrackCurvature(PndMCTrack *myTrack)
static T Sqrt(const T &x)
Definition: PndCAMath.h:37
Int_t GetIndex(int i=0) const
Definition: PndSdsDigi.h:63
PndTrackCandHit GetSortedHit(UInt_t i)
Definition: PndTrackCand.h:54
void setMcTrackId(int i)
Definition: PndTrackCand.h:72
Class for digitised strip hits.
TVector3 GetMomentum() const
Definition: PndMCTrack.h:78
std::map< Int_t, PndTrackCand * > fTrackCandMap
Double_t GetTrackDip(PndMCTrack *myTrack)
Int_t GetDigiIndex(Int_t i) const
Definition: PndSdsCluster.h:40
Double_t
Int_t GetDetID() const
Definition: PndSdsDigi.h:61
UInt_t GetNHits() const
Definition: PndTrackCand.h:59
ClassImp(PndAnaContFact)
Data class to store the digi output of a pixel module.
Int_t GetClusterIndex() const
Definition: PndSdsHit.h:94
virtual void Exec(Option_t *opt)
Int_t GetHitId() const
Int_t GetDetId() const