11 TVector3
pos(0.0,0.0,0.0);
12 TVector3 dpos(0.1,0.1,0.1);
13 FairHit* ZeroHit =
new FairHit(-1, pos, dpos, -1);
14 fHits.push_back(ZeroHit);
30 for (
size_t i = 0;
i < hits.size();
i++){
34 if (myHit->GetEntryNr().GetIndex() < 0){
35 myID = FairLink(branchId, startSize + i);
38 myID = myHit->GetEntryNr();
47 for (
int i = 0;
i < hits->GetEntries();
i++){
48 FairHit* myHit = (FairHit*)(hits->At(
i));
49 fHits.push_back(myHit);
51 if (myHit->GetEntryNr().GetIndex() < 0){
52 myID = FairLink(-1, -1, branchId, startSize +
i, 1);
55 myID = myHit->GetEntryNr();
64 std::set<int> tooClose;
65 std::set<int>::iterator iter;
66 for (
size_t trackId = 0; trackId < Tracks.size(); trackId++){
68 if (Tracks[trackId].size() != 3)
69 std::cout <<
"-E- PndRiemannTrackFinder::FindTracks: Start points: " << Tracks[trackId].size()
70 <<
" in Track: " << trackId << std::endl;
72 std::set<Int_t> StartTrack = Tracks[trackId];
75 iter = StartTrack.begin();
76 std::cout <<
"------------------------------------" << std::endl;
77 std::cout <<
"Start Plane from Points: " << *iter <<
" "
78 << *(++iter) <<
" " << *(++iter) << std::endl;
81 if (
fVerbose > 1) std::cout <<
"Track exists already!" << std::endl;
85 iter = StartTrack.end();
86 int startHit = *(--iter);
87 iter = StartTrack.begin();
88 for (
size_t testHit = startHit+1; testHit <
fHits.size(); testHit++){
95 if (
fVerbose > 1) std::cout <<
"Point " << testHit ;
98 StartTrack.insert(testHit);
104 TVectorD orig = actTrack.
orig();
105 if (
fVerbose > 1) std::cout <<
"actHit added: " << testHit <<
" r: " << actTrack.
r()
106 <<
" orig: " << orig[0] <<
" " << orig[1] << std::endl;
112 for (iter = hits.begin(); iter != hits.end(); iter++){
115 StartTrack.insert(*iter);
124 TVectorD orig = actTrack.
orig();
125 iter = StartTrack.begin();
126 std::cout <<
"Track added! " << *iter <<
" " << *(++iter)
127 <<
" " << *(++iter) <<
" r: " << actTrack.
r()
128 <<
" orig: " << orig[0] <<
" " << orig[1]
129 <<
" sz-m: " << actTrack.
getSZm() <<
" sz-t: " << actTrack.
getSZt()
130 <<
" dip: " << actTrack.
dip()
135 std::cout <<
"Hits in Track: ";
136 for (iter = StartTrack.begin(); iter != StartTrack.end(); iter++)
140 TVectorD myOrig = actTrack.
orig();
141 std::cout <<
" numHits: " << actTrack.
getNumHits() << std::endl;
142 std::cout <<
" curv: " << 1/actTrack.
r() <<
"+/-" << actTrack.
dR()/(actTrack.
r() * actTrack.
r())
143 <<
" dip: " << actTrack.
dip() <<
"+/-" << actTrack.
dDip()
144 <<
" orig: " << myOrig[0] <<
"+/-" << actTrack.
dX()
145 <<
" " << myOrig[1] <<
"+/-" << actTrack.
dY() << std::endl;
150 for (
unsigned int n = 0;
n <
fTracks.size();
n++){
154 for (
unsigned int p = 0;
p < TrackHits.size();
p++){
178 std::set<int> actCandidates;
179 std::vector<std::set<int> > Tracks;
180 std::set<int> tooCloseFirst;
181 std::set<int> tooCloseSecond;
182 std::set<int>::iterator iter;
184 if (
fHits.size() > 3){
185 for (
size_t first = 0; first <
fHits.size()-3; first++){
186 tooCloseFirst.clear();
187 for (
size_t second = first+1; second <
fHits.size()-2; second++){
188 tooCloseSecond.clear();
189 if (
CheckHitDistance(first, second) !=
true){ tooCloseFirst.insert(second);
continue;}
191 for (
size_t third = second+1; third <
fHits.size()-1; third++){
192 if (
fVerbose > 1) std::cout <<
"Checking Points: " << first <<
" " << second <<
" " << third << std::endl;
193 if (
CheckHitDistance(first, third)!=
true){tooCloseFirst.insert(third);
continue;}
194 if (
CheckHitDistance(second, third)!=
true){tooCloseSecond.insert(third);
continue;}
199 actCandidates.clear();
200 actCandidates.insert(first);
201 actCandidates.insert(second);
202 actCandidates.insert(third);
213 if (
CheckSZ(actTrack)!=
true)
continue;
214 TVectorT<double> orig = actTrack.
orig();
215 if (
fVerbose > 1) std::cout <<
"Base plane from Points: " << first <<
" " << second <<
" " << third <<
" r: " << actTrack.
r() <<
" orig: " << orig[0] <<
" " << orig[1] << std::endl;
216 Tracks.push_back(actCandidates);
217 std::set<int> combHits = tooCloseFirst;
218 combHits.insert(tooCloseSecond.begin(), tooCloseSecond.end());
226 std::cout <<
"Start Tracks are: " << std::endl;
227 for (
size_t i = 0;
i < Tracks.size();
i++){
228 std::set<int> aTrack = Tracks[
i];
229 for (iter = aTrack.begin(); iter != aTrack.end();iter++){
230 std::cout << *iter <<
" ";
232 std::cout << std::endl;
243 if (
fVerbose > 1) std::cout <<
"Hits: " << hit1 <<
" " << hit2 <<
" too close " << dist << std::endl;
253 if (
fVerbose > 1) std::cout <<
"sz-Fit does not match, Chi2: " <<
fMaxSZChi2 << std::endl;
263 std::set<int>::iterator iter;
265 std::set<int>::iterator zeroPos = hitIds.end();
266 for (iter = hitIds.begin(); iter != hitIds.end(); iter++){
271 if (zeroPos != hitIds.end()) {
272 if (zeroPos != --hitIds.end()) {
273 myHit =
fHits[*(++zeroPos)];
275 myHit =
fHits[*(--zeroPos)];
278 myHit =
fHits[*hitIds.begin()];
280 TVector3 point1, point2, result;
282 myHit->Position(point1);
283 testHit->Position(point2);
284 if ((point1 * point2) < 0){
286 if (
fVerbose > 1) std::cout <<
"ZeroPassing!" << std::endl;
295 for (std::set<int>::iterator iter = aHits.begin(); iter != aHits.end(); iter++)
307 FairHit* first =
fHits[hit1];
308 FairHit* second =
fHits[hit2];
310 if (first->GetDetectorID() != 1 || first->GetDetectorID() != 2)
314 std::cout << hit1 <<
" " << hit2 <<
" in Same Sensor: " << ((
PndSdsHit*)first)->GetSensorID() << std::endl;
322 for (std::set<int>::iterator iter = hitIds.begin(); iter != hitIds.end(); iter++){
324 if (
fVerbose > 1) std::cout <<
"-I- PndRiemannTrackFinder::CheckHitInTrack - Hit: " << hit <<
" already in track!" << std::endl;
333 double dist = track->
dist(hit);
334 double szDist = track->
szDist(hit);
337 if (
fVerbose > 1) std::cout <<
": dist " << dist <<
" szDist " << szDist <<
" szChi2 " << szChi2 << std::endl;
344 if (
fVerbose > 1) std::cout <<
" SZ Chi2 too big! Cut at: " <<
fMaxSZChi2<< std::endl;
348 if (
fVerbose > 1) std::cout <<
" SZ Dist too big! Cut at: " <<
fMaxSZDist << std::endl;
356 std::vector<int> RemainingTracks;
357 std::vector<int> SelectedTracks;
358 std::vector<int> TracksToMerge;
361 RemainingTracks.push_back(
i);
363 int remainingTracksSize = RemainingTracks.size();
364 if (
fVerbose > 1) std::cout <<
"RemainingTracks: " << RemainingTracks.size() << std::endl;
365 while(remainingTracksSize != 0){
367 remainingTracksSize=RemainingTracks.size();
368 if (
fVerbose > 1) std::cout <<
"RemainingTracks: " << RemainingTracks.size() << std::endl;
369 if (SelectedTracks.size() > 1){
371 std::vector<PndTrackCand> tempTrCnd;
372 std::vector<int> tempST;
373 std::vector<int> tempKillAfter;
375 for(
size_t k=0;k<SelectedTracks.size();k++){
376 tempTrCnd.push_back(
fTrackCand[SelectedTracks[k]]);
380 int tempSize=tempTrCnd.size();
381 bool checkMerge=
true;
384 for(
int j=0;j<tempSize;j++){
388 tempTrCnd.push_back(newCand);
389 tempST.push_back(tempTrCnd.size()-1);
390 if (TracksToMerge.size()>1) counter++;
394 else checkMerge=
false;
396 for(
size_t k=0;k<tempKillAfter.size();k++){
397 for(
size_t i=0;
i<tempST.size();
i++){
398 if (tempST[
i]==tempKillAfter[k]){
404 for(
size_t k=0;k<tempST.size();k++){
414 std::vector<int> result;
417 result.push_back(TrackInd);
419 int tracksToTestSize = TracksToTest.size();
421 std::cout << std::endl;
422 std::cout <<
"TrackInd: " << TrackInd <<
" tracksToTest: " << tracksToTestSize << std::endl;
425 for (
int i = 0;
i < tracksToTestSize;
i++){
428 if ((
fabs(2*(testCurv - checkCurv)/(testCurv + checkCurv)) < curvDiff) &&
429 (
fabs(2*(testDip - checkDip)/(testDip + checkDip )) < dipDiff))
431 result.push_back(TracksToTest[
i]);
433 tracksToTestSize = TracksToTest.size();
437 if (
fVerbose > 1 && result.size() > 1){
438 std::cout <<
"Tracks with similar parameters: curv: " << testCurv <<
439 " dip: " << testDip << std::endl;
440 for(
size_t j = 0; j < result.size(); j++){
450 std::vector<int> result;
451 std::map<std::pair<unsigned int,unsigned int>,
int > hitCount;
452 int TrackInd = TracksToTest[0];
456 result.push_back(TrackInd);
458 unsigned int detId, hitId;
463 std::pair<unsigned int, unsigned int> hitPair(detId, hitId);
464 hitCount[hitPair] = 1;
466 int tracksToTestSize = TracksToTest.size();
467 for (
int j = 0; j < tracksToTestSize; j++){
471 unsigned int myTrackDetId, myTrackHitId;
472 for (
size_t k = 0; k < myTrack.
GetNHits(); k++){
475 std::pair<unsigned int, unsigned int> testPair(myTrackDetId, myTrackHitId);
476 if (hitCount[testPair] > 0){
477 hitCount[testPair]++;
482 result.push_back(TracksToTest[j]);
483 tempKillAfter.push_back(TracksToTest[j]);
487 std::cout <<
"Tracks with similar hits: " << std::endl;
488 for (
size_t m = 0;
m < result.size();
m++){
489 tempTrCnd[result[
m]].Print();
497 int trackListSize = TrackList.size();
498 for(
int i = 0;
i < trackListSize;
i++){
499 if (TrackList[
i] == TrackInd){
500 TrackList.erase(TrackList.begin()+
i);
501 trackListSize = TrackList.size();
508 bool oneNumberEqual =
false;
513 for (std::set<int>::iterator k = hitsInTrack.begin(); (k != hitsInTrack.end()&&(result ==
true)); k++){
517 oneNumberEqual =
true;
518 else oneNumberEqual =
false;
520 result &= oneNumberEqual;
521 oneNumberEqual =
false;
523 if (result ==
true) {
525 std::cout <<
"Track exists already!" << std::endl;
527 std::cout <<
" " << *l;
528 std::cout << std::endl;
539 TVector3 vH1, vH2, result;
550 for (std::set<int>::iterator iter = hitsInUse.begin(); iter != hitsInUse.end(); iter++){
565 std::map<std::pair<unsigned int, unsigned int>,
int >
hits;
566 for (
size_t i = 0;
i < tracks.size();
i++){
569 unsigned int detId, hitId;
570 for (
size_t j = 0; j < myTrackCand.
GetNHits(); j++){
573 hits[std::pair<unsigned int, unsigned int>(detId, hitId)]++;
576 for (
std::map<std::pair<unsigned int, unsigned int>,
int >::const_iterator it = hits.begin(); it!= hits.end(); it++){
577 std::pair<unsigned int, unsigned int> dethit = it->first;
578 result.
AddHit(dethit.first, dethit.second,0);
std::vector< std::set< int > > fHitsTooClose
matrix of TrackNr and hits which are too close to one of the three starting points ...
std::vector< std::pair< double, double > > fCurvAndDipOfCand
Curvature and dip of fPndTrackCand.
bool CheckSZ(PndRiemannTrack aTrack)
Tests the results of the sz fit.
unsigned int getNumHits()
int HitTooClose(std::set< Int_t > hitsInUse, FairHit *newHit, double threshold)
returns if and which hit was too close to the hit which is tested
double calcSZChi2(PndRiemannHit *hit)
double fMaxSZChi2
Maximum allowed Chi2 in an sz fit.
std::vector< PndRiemannTrack > fTracks
Resulting Riemann Tracks.
bool TrackExists(std::set< Int_t > hitsInTrack)
void FindTracks()
Main function to start the riemann track finding.
std::map< int, FairLink > fMapHitToID
map to convert the list of hits back into a FairLink
std::vector< int > FindTracksWithSimilarParameters(int TrackInd, std::vector< int > &TracksToTest, double curvDiff, double dipDiff)
PndTrackCandHit GetSortedHit(UInt_t i)
std::map< FairLink, int > fMapIDtoHit
map to convert the list of detID/hitID hits into the list of hits for track finding ...
double szDist(PndRiemannHit *hit)
PndTrackCand CreateOneTrackCand(std::vector< int > tracks, std::vector< PndTrackCand > tempTrCnd)
void RemoveTrack(int TrackInd, std::vector< int > &TrackList)
double dist(PndRiemannHit *hit)
std::vector< FairHit * > fHits
Vector of all FairHits used for track finding (fitting)
int fMinNumberOfHits
Minimum number of hits in track necessary for a match.
std::vector< PndTrackCand > fTrackCand
List of track candidates.
void AddHits(std::vector< FairHit * > hits, Int_t branchId)
Replaces the existing array of hits with a new one.
std::vector< PndTrackCand > fMergedTrackCand
PndConstField * fMagField
ClassImp(PndRiemannTrackFinder)
double fDipDiff
TrackMerger parameter.
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
std::vector< std::set< Int_t > > GetStartTracks()
void refit(bool withErrorCalc=true)
double fMaxPlaneDist
Distance cut between new point and riemann plane.
double HitDistance(FairHit *h1, FairHit *h2)
Calculates the distance between two hits.
bool CheckHitInSameSensor(int hit1, int hit2)
Tests if hits in the same sensor are selected.
bool CheckHitDistance(int hit1, int hit2)
Tests if the distance is larger than fMinPointDistance.
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 fMinPointDist
Minimum distance between two points to use them as point for the base plane.
PndRiemannTrack CreateRiemannTrack(std::set< Int_t > aHits)
Creates a PndRiemannTrack from an array of indices of Hits.
bool CheckZeroPassing(std::set< int > hitIds, int hit)
If the track contains (0,0) all points have to go forward or all have to go backward.
void szFit(bool withErrorCalc=true)
void addHit(PndRiemannHit &hit)
double fCurvDiff
TrackMerger parameter.
virtual ~PndRiemannTrackFinder()
std::vector< std::set< Int_t > > fHitsInTracks
Vector of indizes which hits where used in which track.
bool CheckRiemannHit(PndRiemannTrack *track, PndRiemannHit *hit)
std::vector< int > FindTracksWithSimilarHits(std::vector< int > &TracksToTest, std::vector< PndTrackCand > tempTrCnd, std::vector< int > &tempKillAfter)
---------—added by me
double fMaxSZDist
Distance cut between s-z coordinate of a new point and the sz-fit of the hits in the track...
bool CheckHitInTrack(std::set< int > hitIds, int hit)
Check if this HitId is used in the track already.