7 #include "TClonesArray.h"
8 #include "TGeoManager.h"
10 #include "FairRootManager.h"
12 #include "FairRuntimeDb.h"
17 #include "TStopwatch.h"
22 TString hitBranch, Int_t innSensPP)
23 : FairTask(
"LMD Track Finding Task"),
43 InitStatus stat = kERROR;
49 FairRootManager *ioman = FairRootManager::Instance();
52 std::cout <<
"-E- PndLmdTrackFinderTask::Init: "
53 <<
"RootManager not instantiated!" << std::endl;
60 std::cout <<
"-W- PndLmdTrackFinderTask::Init: "
61 <<
"No fStripHitArray!" << std::endl;
70 std::cout <<
"-I- PndLmdTrackFinderTask: Initialisation successfull"
79 std::vector<std::vector<std::pair<Int_t, bool> > > &hitsd,
84 for (Int_t iHit = 0; iHit < nStripHits; iHit++) {
89 Int_t planeid = floor(
91 hitsd.at(planeid).push_back(make_pair(iHit,
false));
94 for (Int_t iPlane = 0; iPlane < 4; iPlane++) {
95 if (hitsd.at(iPlane).size() > 0) nPlanes++;
100 cout <<
"Hits: " << nStripHits <<
" in " << nPlanes <<
" plane(s)." << endl;
101 for (Int_t idet = 0; idet < 4; idet++)
102 cout <<
"Plane: " << idet <<
" DiscHits: " << hitsd.at(idet).size()
106 if (nPlanes > 2)
return true;
114 std::vector<std::vector<std::pair<Int_t, bool> > > &hitsd,
119 for (Int_t iHit = 0; iHit < nStripHits; iHit++) {
125 auto const &hit_info = lmd_geo_helper.getHitLocationInfo(sensid);
127 hitsd.at(hit_info.plane).push_back(make_pair(iHit,
false));
134 for (Int_t iPlane = 0; iPlane < 4; iPlane++) {
135 if (hitsd.at(iPlane).size() > 0) nPlanes++;
140 cout <<
"Hits: " << nStripHits <<
" in " << nPlanes <<
" plane(s)." << endl;
141 for (Int_t idet = 0; idet < 4; idet++)
142 cout <<
"Plane: " << idet <<
" DiscHits: " << hitsd.at(idet).size()
146 if (nPlanes > 2)
return true;
154 std::vector<std::vector<std::pair<Int_t, bool> > > &hitsd,
156 std::vector<Double_t> detZ;
159 for (Int_t iHit = 0; iHit < nStripHits; iHit++) {
162 for (
size_t idet = 0; idet < detZ.size(); idet++) {
166 if (
fabs(tmp - detZ.at(idet)) <
176 for (Int_t idet = detZ.size() - 1; idet >= 0; idet--) {
177 if (tmp < detZ.at(idet)) pos = idet;
183 for (
size_t i = pos + 1;
i < detZ.size();
i++) {
194 for (Int_t iHit = 0; iHit < nStripHits; iHit++) {
198 for (
size_t idet = 0; idet < detZ.size(); idet++) {
201 if (
fabs(z - detZ.at(idet)) < 9.) {
202 hitsd.at(idet).push_back(make_pair(iHit,
false));
210 cout <<
"Hits: " << nStripHits <<
" in " << detZ.size() <<
" plane(s)."
212 for (
size_t idet = 0; idet < detZ.size(); idet++)
213 cout <<
"Plane: " << idet <<
" DiscHits: " << hitsd.at(idet).size()
217 if (detZ.size() > 3)
return true;
225 std::vector<PndTrackCand> &tofill,
226 std::vector<std::vector<std::pair<Int_t, bool> > > &hitsd,
229 std::vector<TVector3> trackStart, trackVec;
230 std::vector<TVector3> trackStartd, trackVecd;
231 std::vector<Int_t> trackID2, trackID3;
234 TVector3 start, tmp,
vec, dstart, dvec;
236 if (hitsd.size() < 3)
return;
237 for (
size_t i = 0;
i < hitsd.at(1).size();
i++) {
238 if (hitsd.at(1).at(
i).second)
continue;
240 start.SetXYZ(hit1->GetX(), hit1->GetY(), hit1->GetZ());
241 dstart.SetXYZ(hit1->GetDx(), hit1->GetDy(), hit1->GetDz());
242 for (
size_t k = 0; k < hitsd.at(2).size(); k++) {
243 if (hitsd.at(2).at(k).second)
continue;
246 tmp.SetXYZ(hit2->GetX(), hit2->GetY(), hit2->GetZ());
248 dvec.SetXYZ(hit2->GetDx(), hit2->GetDy(), hit2->GetDz());
249 if (vec.Theta() > 0.03 && vec.Theta() < 0.05 && vec.Phi() > -0.25 &&
254 trackStart.push_back(start);
255 trackStartd.push_back(dstart);
256 trackVec.push_back(vec);
257 trackVecd.push_back(dvec);
262 trackID2.push_back(
i);
263 trackID3.push_back(k);
268 if (
fVerbose > 1) cout <<
"Pseudos L2L3: " << trackStart.size() << endl;
270 std::vector<Int_t> ids;
274 for (
size_t i = 0;
i < trackStart.size();
i++)
279 start = trackStart.at(
i);
280 dstart = trackStartd.at(
i);
281 vec = trackVec.at(
i);
282 dvec = trackVecd.at(
i);
283 ids.push_back(hitsd.at(1).at(trackID2.at(
i)).first);
284 ids.push_back(hitsd.at(2).at(trackID3.at(
i)).first);
285 std::vector<std::pair<Int_t, Int_t> > otherIDs;
287 for (Int_t idet = 3; idet < 4;
292 for (
size_t ihit = 0; ihit < hitsd.at(idet).size(); ihit++) {
295 Double_t scale = (hit->GetZ() - start.z()) / vec.z();
296 tmp = start + scale *
vec;
298 sqrt((tmp.x() - hit->GetX()) * (tmp.x() - hit->GetX()) +
299 (tmp.y() - hit->GetY()) * (tmp.y() - hit->GetY()));
300 if (distTmp < (idet * dXY)) {
303 ids.push_back(hitsd.at(idet).at(ihit).first);
304 otherIDs.push_back(make_pair(idet, ihit));
305 distClosest = distTmp;
308 if (distTmp < distClosest) {
311 ids.push_back(hitsd.at(idet).at(ihit).first);
312 otherIDs.push_back(make_pair(idet, ihit));
320 cout <<
" Track L2L3: " <<
i <<
"#Planes: " << ids.size() << endl;
323 if (ids.size() > 2) {
326 for (
size_t id = 0;
id < ids.size();
id++) {
328 myTCand->
AddHit(myHit->GetDetectorID(), ids.at(
id),
333 hitsd.at(1).at(trackID2.at(
i)).second =
true;
334 hitsd.at(2).at(trackID3.at(
i)).second =
true;
335 for (
size_t id = 0;
id < otherIDs.size();
id++) {
336 hitsd.at(otherIDs.at(
id).first).at(otherIDs.at(
id).second).second =
357 tofill.push_back(*(myTCand));
368 std::vector<PndTrackCand> &tofill,
369 std::vector<std::vector<std::pair<Int_t, bool> > > &hitsd,
372 std::vector<TVector3> trackStart, trackVec;
373 std::vector<TVector3> trackStartd, trackVecd;
374 std::vector<Int_t> trackID1, trackID3;
377 TVector3 start, tmp,
vec, dstart, dvec;
379 if (hitsd.size() < 3)
return;
380 for (
size_t i = 0;
i < hitsd.at(0).size();
i++) {
381 if (hitsd.at(0).at(
i).second)
continue;
383 start.SetXYZ(hit1->GetX(), hit1->GetY(), hit1->GetZ());
384 dstart.SetXYZ(hit1->GetDx(), hit1->GetDy(), hit1->GetDz());
385 for (
size_t k = 0; k < hitsd.at(2).size(); k++) {
386 if (hitsd.at(2).at(k).second)
continue;
389 tmp.SetXYZ(hit2->GetX(), hit2->GetY(), hit2->GetZ());
391 dvec.SetXYZ(hit2->GetDx(), hit2->GetDy(), hit2->GetDz());
392 if (vec.Theta() > 0.03 && vec.Theta() < 0.05 && vec.Phi() > -0.25 &&
397 trackStart.push_back(start);
398 trackStartd.push_back(dstart);
399 trackVec.push_back(vec);
400 trackVecd.push_back(dvec);
405 trackID1.push_back(
i);
406 trackID3.push_back(k);
411 if (
fVerbose > 1) cout <<
"Pseudos L1L3: " << trackStart.size() << endl;
413 std::vector<Int_t> ids;
417 for (
size_t i = 0;
i < trackStart.size();
i++)
422 start = trackStart.at(
i);
423 dstart = trackStartd.at(
i);
424 vec = trackVec.at(
i);
425 dvec = trackVecd.at(
i);
426 ids.push_back(hitsd.at(0).at(trackID1.at(
i)).first);
427 ids.push_back(hitsd.at(2).at(trackID3.at(
i)).first);
428 std::vector<std::pair<Int_t, Int_t> > otherIDs;
430 for (Int_t idet = 3; idet < 4;
435 for (
size_t ihit = 0; ihit < hitsd.at(idet).size(); ihit++) {
438 Double_t scale = (hit->GetZ() - start.z()) / vec.z();
439 tmp = start + scale *
vec;
441 sqrt((tmp.x() - hit->GetX()) * (tmp.x() - hit->GetX()) +
442 (tmp.y() - hit->GetY()) * (tmp.y() - hit->GetY()));
443 if (distTmp < (idet * dXY)) {
446 ids.push_back(hitsd.at(idet).at(ihit).first);
447 otherIDs.push_back(make_pair(idet, ihit));
448 distClosest = distTmp;
451 if (distTmp < distClosest) {
454 ids.push_back(hitsd.at(idet).at(ihit).first);
455 otherIDs.push_back(make_pair(idet, ihit));
463 cout <<
" Track L1L3: " <<
i <<
"#Planes: " << ids.size() << endl;
466 if (ids.size() > 2) {
469 for (
size_t id = 0;
id < ids.size();
id++) {
471 myTCand->
AddHit(myHit->GetDetectorID(), ids.at(
id),
476 hitsd.at(0).at(trackID1.at(
i)).second =
true;
477 hitsd.at(2).at(trackID3.at(
i)).second =
true;
478 for (
size_t id = 0;
id < otherIDs.size();
id++) {
479 hitsd.at(otherIDs.at(
id).first).at(otherIDs.at(
id).second).second =
500 tofill.push_back(*(myTCand));
510 std::vector<PndTrackCand> &tofill,
511 std::vector<std::vector<std::pair<Int_t, bool> > > &hitsd,
514 std::vector<TVector3> trackStart, trackVec;
515 std::vector<TVector3> trackStartd, trackVecd;
516 std::vector<Int_t> trackID1, trackID2;
519 TVector3 start, tmp,
vec, dstart, dvec;
521 if (hitsd.size() < 2)
return;
522 for (
size_t i = 0;
i < hitsd.at(0).size();
i++) {
524 start.SetXYZ(hit1->GetX(), hit1->GetY(), hit1->GetZ());
525 dstart.SetXYZ(hit1->GetDx(), hit1->GetDy(), hit1->GetDz());
526 for (
size_t k = 0; k < hitsd.at(1).size(); k++) {
529 tmp.SetXYZ(hit2->GetX(), hit2->GetY(), hit2->GetZ());
531 dvec.SetXYZ(hit2->GetDx(), hit2->GetDy(), hit2->GetDz());
532 if (vec.Theta() > 0.03 && vec.Theta() < 0.05 && vec.Phi() > -0.25 &&
536 trackStart.push_back(start);
537 trackStartd.push_back(dstart);
538 trackVec.push_back(vec);
539 trackVecd.push_back(dvec);
544 trackID1.push_back(
i);
545 trackID2.push_back(k);
550 if (
fVerbose > 1) cout <<
"Pseudos L1L2: " << trackStart.size() << endl;
552 std::vector<Int_t> ids;
556 for (
size_t i = 0;
i < trackStart.size();
i++)
561 start = trackStart.at(
i);
562 dstart = trackStartd.at(
i);
563 vec = trackVec.at(
i);
564 dvec = trackVecd.at(
i);
565 ids.push_back(hitsd.at(0).at(trackID1.at(
i)).first);
566 ids.push_back(hitsd.at(1).at(trackID2.at(
i)).first);
567 std::vector<std::pair<Int_t, Int_t> > otherIDs;
569 for (Int_t idet = 2; idet < 4; idet++) {
572 for (
size_t ihit = 0; ihit < hitsd.at(idet).size(); ihit++) {
575 Double_t scale = (hit->GetZ() - start.z()) / vec.z();
576 tmp = start + scale *
vec;
578 sqrt((tmp.x() - hit->GetX()) * (tmp.x() - hit->GetX()) +
579 (tmp.y() - hit->GetY()) * (tmp.y() - hit->GetY()));
580 if (distTmp < (idet * dXY)) {
583 ids.push_back(hitsd.at(idet).at(ihit).first);
584 otherIDs.push_back(make_pair(idet, ihit));
585 distClosest = distTmp;
588 if (distTmp < distClosest) {
591 ids.push_back(hitsd.at(idet).at(ihit).first);
592 otherIDs.push_back(make_pair(idet, ihit));
600 cout <<
" Track L1L2: " <<
i <<
"#Planes: " << ids.size() << endl;
603 if (ids.size() > 2) {
611 cout <<
" Track: " <<
i <<
"#Planes: " << ids.size() << endl;
614 for (
size_t id = 0;
id < ids.size();
id++) {
616 myTCand->
AddHit(myHit->GetDetectorID(), ids.at(
id),
621 hitsd.at(0).at(trackID1.at(
i)).second =
true;
622 hitsd.at(1).at(trackID2.at(
i)).second =
true;
623 for (
size_t id = 0;
id < otherIDs.size();
id++) {
624 hitsd.at(otherIDs.at(
id).first).at(otherIDs.at(
id).second).second =
671 tofill.push_back(*(myTCand));
681 TStopwatch *timer_exec =
new TStopwatch();
682 if (
fVerbose > 2) timer_exec->Start();
683 if (
fVerbose > 2) cout <<
"Evt started--------------" << endl << endl;
694 if (
fVerbose > 2) cout <<
"# Hits: \t" << nStripHits << endl << endl;
700 if (nStripHits < 2) {
702 cout <<
"Evt finsihed: too less hits-----" << endl << endl;
707 std::vector<std::vector<std::pair<int, bool> > > hitsd(4);
715 std::cout <<
"Algorithm is needed sensor type! Please, set it via "
716 "SetSensStripFlag(bool fS) or SetSensPixelFlag(bool fS)"
723 cout <<
"Evt finsihed: too less planes-----" << endl << endl;
728 cout <<
"HitMap size: " << hitsd.size() << endl;
729 if (hitsd.size() > 0) {
730 for (
size_t i = 0;
i < hitsd.at(0).size();
i++) {
733 cout <<
"Plane0 Hit=(" << hit->GetX() <<
", " << hit->GetY() <<
", "
734 << hit->GetZ() <<
")" << endl;
737 if (hitsd.size() > 1) {
738 for (
size_t i = 0;
i < hitsd.at(1).size();
i++) {
741 cout <<
"Plane1 Hit=(" << hit->GetX() <<
", " << hit->GetY() <<
", "
742 << hit->GetZ() <<
")" << endl;
745 if (hitsd.size() > 2) {
746 for (
size_t i = 0;
i < hitsd.at(2).size();
i++) {
749 cout <<
"Plane2 Hit=(" << hit->GetX() <<
", " << hit->GetY() <<
", "
750 << hit->GetZ() <<
")" << endl;
753 if (hitsd.size() > 3) {
754 for (
size_t i = 0;
i < hitsd.at(3).size();
i++) {
757 cout <<
"Plane3 Hit=(" << hit->GetX() <<
", " << hit->GetY() <<
", "
758 << hit->GetZ() <<
")" << endl;
763 std::vector<PndTrackCand> theCands;
773 for (
size_t t = 0;
t < theCands.size();
t++)
776 if (
fVerbose > 2) cout <<
"Evt finsihed--------------" << endl << endl;
779 Double_t rtime_exec = timer_exec->RealTime();
780 Double_t ctime_exec = timer_exec->CpuTime();
781 cout <<
"Real time for Exec:" << rtime_exec <<
" s, CPU time " << ctime_exec
790 return (2 /
TMath::Sqrt(p.Px() * p.Px() + p.Py() * p.Py()));
796 return (p.Mag() /
TMath::Sqrt(p.Px() * p.Px() + p.Py() * p.Py()));
ClassImp(PndLmdTrackFinderTask)
TVector3 GetPosition() const
TClonesArray * fStripHitArray
friend F32vec4 sqrt(const F32vec4 &a)
virtual void Exec(Option_t *opt)
static T Sqrt(const T &x)
static PndLmdGeometryHelper & getInstance()
TVector3 GetMomentum() const
PndLmdTrackFinderTask(Int_t inFinderMode=0, TString hitBranch="LMDHitsStrip", Int_t innSensPP=8)
virtual InitStatus ReInit()
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
virtual void SetParContainers()
void FindHitsIII(std::vector< PndTrackCand > &tofill, std::vector< std::vector< std::pair< Int_t, bool > > > &hitsd, Int_t nStripHits)
TClonesArray * fTrackCandArray
virtual ~PndLmdTrackFinderTask()
bool SortHitsByDet2(std::vector< std::vector< std::pair< Int_t, bool > > > &hitsd, Int_t nStripHits)
friend F32vec4 fabs(const F32vec4 &a)
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
Double_t GetTrackDip(PndMCTrack *myTrack)
void FindHitsI(std::vector< PndTrackCand > &tofill, std::vector< std::vector< std::pair< Int_t, bool > > > &hitsd, Int_t nStripHits)
Double_t GetTrackCurvature(PndMCTrack *myTrack)
void FindHitsII(std::vector< PndTrackCand > &tofill, std::vector< std::vector< std::pair< Int_t, bool > > > &hitsd, Int_t nStripHits)
Int_t GetSensorID() const
virtual InitStatus Init()
bool SortHitsByDet(std::vector< std::vector< std::pair< Int_t, bool > > > &hitsd, Int_t nStripHits)
bool SortHitsByZ(std::vector< std::vector< std::pair< Int_t, bool > > > &hitsd, Int_t nStripHits)