6 #include "TClonesArray.h"
8 #include "TGeoManager.h"
10 #include "FairRootManager.h"
12 #include "FairRuntimeDb.h"
17 #include "TStopwatch.h"
42 for (
int i = 0;
i < hits.size();
i++){
44 fHitsPerLayer[hits[
i].GetSensorID()].push_back(make_pair(hits[
i],
false));
51 std::vector< std::vector<int> > result;
52 for (
int firstL = 0; firstL <
fHitsPerLayer[firstLayer].size; firstL++){
53 for (
int secondL = 0; secondL <
fHitsPerLayer[secondLayer].size; secondL++){
54 std::vector<int> singleCombi(4,-1);
55 singleCombi[firstLayer] = firstL;
56 singleCombi[seondLayer] = secondL;
57 result.push_back(singleCombi);
63 StraightLineParams PndMQStraightLineTrackFinder::GetLineParameters(std::vector<int> startCombi)
66 TVector3 first, second;
67 bool firstFound =
false;
68 for (
int i = 0;
i < startCombi.size();
i++)
70 if (startCombi[
i] > -1){
71 if (firstFound ==
false){
80 result.
direction = (second - first).Unit();
88 TVector3 PndMQStraightLineTrackFinder::PropagateToXYPlane(
StraightLineParams line, Double
z)
99 return (first - second).Mag();
102 PndTrackCand PndMQStraightLineTrackFinder::FindTrack(std::vector<int> startCombi){
110 for (
int i = 0;
i < startCombi.size();
i++){
117 void PndMQStraightLineTrackFinder::FindHitsII(std::vector<PndTrackCand> &tofill, std::vector< std::vector< std::pair<Int_t,bool> > > &hitsd, Int_t nStripHits)
120 std::vector<TVector3> trackStart, trackVec;
121 std::vector<TVector3> trackStartd, trackVecd;
122 std::vector< Int_t > trackID1, trackID3;
125 TVector3 start, tmp,
vec, dstart, dvec;
127 if(hitsd.size()<3)
return;
128 for (Int_t
i=0;
i<hitsd.at(0).size();
i++)
130 if(hitsd.at(0).at(
i).second)
continue;
132 start.SetXYZ(hit1->GetX(), hit1->GetY(), hit1->GetZ());
133 dstart.SetXYZ(hit1->GetDx(), hit1->GetDy(), hit1->GetDz());
134 for (Int_t k=0; k<hitsd.at(2).size(); k++)
136 if(hitsd.at(2).at(k).second)
continue;
138 tmp.SetXYZ(hit2->GetX(), hit2->GetY(), hit2->GetZ());
140 dvec.SetXYZ(hit2->GetDx(), hit2->GetDy(), hit2->GetDz());
141 if(vec.Theta()>0.03 && vec.Theta()<0.05 && vec.Phi()>-0.25 && vec.Phi()<0.25){
144 trackStart.push_back(start);
145 trackStartd.push_back(dstart);
146 trackVec.push_back(vec);
147 trackVecd.push_back(dvec);
150 trackID1.push_back(
i);
151 trackID3.push_back(k);
156 if(
fVerbose>1) cout <<
"Pseudos L1L3: "<< trackStart.size() <<endl;
158 std::vector<Int_t> ids;
161 for (Int_t
i=0;
i<trackStart.size();
i++)
166 start = trackStart.at(
i);
167 dstart = trackStartd.at(
i);
168 vec = trackVec.at(
i);
169 dvec = trackVecd.at(
i);
170 ids.push_back(hitsd.at(0).at(trackID1.at(
i)).first);
171 ids.push_back(hitsd.at(2).at(trackID3.at(
i)).first);
172 std::vector< std::pair<Int_t,Int_t> > otherIDs;
174 for (Int_t idet=3; idet < 4; idet++){
177 for (Int_t ihit=0; ihit<hitsd.at(idet).size(); ihit++)
180 Double_t scale = (hit->GetZ()-start.z())/vec.z();
181 tmp = start + scale*
vec;
182 Double_t distTmp =
sqrt((tmp.x()-hit->GetX())*(tmp.x()-hit->GetX()) + (tmp.y()-hit->GetY())*(tmp.y()-hit->GetY()));
183 if( distTmp<(idet*dXY) ){
186 ids.push_back(hitsd.at(idet).at(ihit).first);
187 otherIDs.push_back( make_pair (idet,ihit) );
191 if(distTmp<distClosest){
194 ids.push_back(hitsd.at(idet).at(ihit).first);
195 otherIDs.push_back( make_pair (idet,ihit) );
202 if(
fVerbose>2) cout <<
" Track L1L3: "<<
i <<
"#Planes: " << ids.size() <<endl;
208 for (Int_t
id=0;
id<ids.size();
id++){
212 if ( !fStripClusterArray || !fStripDigiArray){
222 hitsd.at(0).at(trackID1.at(
i)).second=
true;
223 hitsd.at(2).at(trackID3.at(
i)).second=
true;
224 for(Int_t
id=0;
id<otherIDs.size();
id++){
225 hitsd.at(otherIDs.at(
id).first).at(otherIDs.at(
id).second).second=
true;
243 tofill.push_back(*(myTCand));
253 void PndMQStraightLineTrackFinder::FindHitsI(std::vector<PndTrackCand> &tofill, std::vector< std::vector< std::pair<Int_t,bool> > > &hitsd, Int_t nStripHits)
256 std::vector<TVector3> trackStart, trackVec;
257 std::vector<TVector3> trackStartd, trackVecd;
258 std::vector< Int_t > trackID1, trackID2;
261 TVector3 start, tmp,
vec, dstart, dvec;
263 if(hitsd.size()<2)
return;
264 for (Int_t
i=0;
i<hitsd.at(0).size();
i++)
267 start.SetXYZ(hit1->GetX(), hit1->GetY(), hit1->GetZ());
268 dstart.SetXYZ(hit1->GetDx(), hit1->GetDy(), hit1->GetDz());
269 for (Int_t k=0; k<hitsd.at(1).size(); k++)
272 tmp.SetXYZ(hit2->GetX(), hit2->GetY(), hit2->GetZ());
274 dvec.SetXYZ(hit2->GetDx(), hit2->GetDy(), hit2->GetDz());
277 trackStart.push_back(start);
278 trackStartd.push_back(dstart);
279 trackVec.push_back(vec);
280 trackVecd.push_back(dvec);
283 trackID1.push_back(
i);
284 trackID2.push_back(k);
289 if(
fVerbose>1) cout <<
"Pseudos L1L2: "<< trackStart.size() <<endl;
291 std::vector<Int_t> ids;
294 for (Int_t
i=0;
i<trackStart.size();
i++)
299 start = trackStart.at(
i);
300 dstart = trackStartd.at(
i);
301 vec = trackVec.at(
i);
302 dvec = trackVecd.at(
i);
303 ids.push_back(hitsd.at(0).at(trackID1.at(
i)).first);
304 ids.push_back(hitsd.at(1).at(trackID2.at(
i)).first);
305 std::vector< std::pair<Int_t,Int_t> > otherIDs;
307 for (Int_t idet=2; idet < 4; idet++){
310 for (Int_t ihit=0; ihit<hitsd.at(idet).size(); ihit++)
313 Double_t scale = (hit->GetZ()-start.z())/vec.z();
314 tmp = start + scale*
vec;
315 Double_t distTmp =
sqrt((tmp.x()-hit->GetX())*(tmp.x()-hit->GetX()) + (tmp.y()-hit->GetY())*(tmp.y()-hit->GetY()));
316 if( distTmp<(idet*dXY) ){
319 ids.push_back(hitsd.at(idet).at(ihit).first);
320 otherIDs.push_back( make_pair (idet,ihit) );
324 if(distTmp<distClosest){
327 ids.push_back(hitsd.at(idet).at(ihit).first);
328 otherIDs.push_back( make_pair (idet,ihit) );
335 if(
fVerbose>2) cout <<
" Track L1L2: "<<
i <<
"#Planes: " << ids.size() <<endl;
344 if(
fVerbose>2) cout <<
" Track: "<<
i <<
"#Planes: " << ids.size() <<endl;
347 for (Int_t
id=0;
id<ids.size();
id++){
352 myTCand->
AddHit(FairRootManager::Instance()->GetBranchId(fHitBranchStrip),ids.at(
id),myHit->
GetPosition().Mag());
357 hitsd.at(0).at(trackID1.at(
i)).second=
true;
358 hitsd.at(1).at(trackID2.at(
i)).second=
true;
359 for(Int_t
id=0;
id<otherIDs.size();
id++){
360 hitsd.at(otherIDs.at(
id).first).at(otherIDs.at(
id).second).second=
true;
401 tofill.push_back(*(myTCand));
411 void PndMQStraightLineTrackFinder::Exec(Option_t*)
413 TStopwatch *timer_exec =
new TStopwatch();
415 if(
fVerbose>2) cout <<
"Evt " << FairRootManager::Instance()->GetEntryNr() <<
" started--------------"<<endl<<endl;
421 if ( ! fTrackCandArray )
422 Fatal(
"Exec",
"No trackCandArray");
423 fTrackCandArray->Clear();
425 Int_t nStripHits = fHitArray->GetEntriesFast();
426 if(
fVerbose>2) cout <<
"# Hits: \t"<< nStripHits <<endl<<endl;
427 bool usedFlag[nStripHits];
428 for(Int_t seti=0; seti<nStripHits; seti++)
429 usedFlag[seti]=
false;
432 if(
fVerbose>2) cout <<
"Evt finsihed: too less hits-----"<<endl<<endl;
437 std::vector< std::vector< std::pair<int,bool> > > hitsd(4);
439 if(flagStipSens) resSortHits = SortHitsByDet(hitsd, nStripHits);
441 if(flagPixelSens) resSortHits = SortHitsByDet2(hitsd, nStripHits);
443 std::cout<<
"Algorithm is needed sensor type! Please, set it via SetSensStripFlag(bool fS) or SetSensPixelFlag(bool fS)"<<std::endl;
448 if(
fVerbose>2) cout <<
"Evt finsihed: too less planes-----"<<endl<<endl;
454 cout<<
"HitMap size: "<< hitsd.size() <<endl;
456 for (Int_t
i=0;
i<hitsd.at(0).size();
i++){
458 cout<<
"Plane0 Hit=("<<hit->GetX()<<
", "<<hit->GetY()<<
", "<<hit->GetZ()<<
")"<<endl;
462 for (Int_t
i=0;
i<hitsd.at(1).size();
i++){
464 cout<<
"Plane1 Hit=("<<hit->GetX()<<
", "<<hit->GetY()<<
", "<<hit->GetZ()<<
")"<<endl;
468 for (Int_t
i=0;
i<hitsd.at(2).size();
i++){
470 cout<<
"Plane2 Hit=("<<hit->GetX()<<
", "<<hit->GetY()<<
", "<<hit->GetZ()<<
")"<<endl;
474 for (Int_t
i=0;
i<hitsd.at(3).size();
i++){
476 cout<<
"Plane3 Hit=("<<hit->GetX()<<
", "<<hit->GetY()<<
", "<<hit->GetZ()<<
")"<<endl;
481 std::vector<PndTrackCand> theCands;
484 FindHitsI(theCands, hitsd, nStripHits);
486 FindHitsII(theCands, hitsd, nStripHits);
487 FindHitsIII(theCands, hitsd, nStripHits);
491 for(
int t=0; t<theCands.size(); t++)
494 if(
fVerbose>2) cout <<
"Evt finsihed--------------"<<endl<<endl;
497 Double_t rtime_exec = timer_exec->RealTime();
498 Double_t ctime_exec = timer_exec->CpuTime();
499 cout <<
"Real time for Exec:" << rtime_exec <<
" s, CPU time " << ctime_exec <<
" s" << endl;
508 return (2/
TMath::Sqrt(p.Px()*p.Px() + p.Py()*p.Py()));
515 return (p.Mag()/
TMath::Sqrt(p.Px()*p.Px() + p.Py()*p.Py()));
TVector3 GetPosition() const
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
std::vector< PndTrackCand > FindTracks(std::vector< PndSdsHit > hits)
Class for digitised strip hits.
TVector3 GetMomentum() const
std::vector< std::vector< int > > GetStartCombination(int firstLayer, int secondLayer)
Int_t GetDigiIndex(Int_t i) const
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
virtual ~PndMQStraightLineTrackFinder()
void SortHitsToLayers(std::vector< PndSdsHit > hits)
PndMQStraightLineTrackFinder()
Double_t GetTrackDip(PndMCTrack *myTrack)
Int_t GetClusterIndex() const
std::vector< std::vector< std::pair< PndSdsHit, bool > > > fHitsPerLayer
double DistanceOfPoints(TVector3 first, TVector3 second)
Double_t GetTrackCurvature(PndMCTrack *myTrack)