// Author: Uli Frankenfeld //*-- Copyright © ULI #include "AliL3StandardIncludes.h" #include "AliL3Logging.h" #include "AliL3TrackMerger.h" #include "AliL3Track.h" #include "AliL3TrackSegmentData.h" #include "AliL3Transform.h" #include "AliL3TrackArray.h" //_____________________________________________________________ // AliL3TrackMerger // // The L3 track segment merger // ClassImp(AliL3TrackMerger) AliL3TrackMerger::AliL3TrackMerger(){ //Default constructor Is2Global(kFALSE); fSlow = kFALSE; SetParameter(); fRowMin = 0; fRowMax = 0; } AliL3TrackMerger::AliL3TrackMerger(Int_t nsubsectors):AliL3Merger(nsubsectors){ //Constructor. fNSubSector = nsubsectors; Is2Global(kFALSE); fSlow = kFALSE; SetParameter(); fRowMin = new Int_t[nsubsectors]; fRowMax = new Int_t[nsubsectors]; } AliL3TrackMerger::~AliL3TrackMerger(){ //Destructor } void AliL3TrackMerger::SetRows(Int_t *row){ for(Int_t i=0;iGetNTracks(); const Int_t kNIn =tracksin->GetNTracks(); const Int_t kNMerged =mergedtrack->GetNTracks(); AliL3Track *tracks[2]; Bool_t merge = kTRUE; while(merge){ Int_t inmin=-1,outmin=-1; Double_t min=10; for(Int_t out=0;outGetCheckedTrack(out); if(!outertrack) continue; for(Int_t in=0;inGetCheckedTrack(in); if(!innertrack) continue; Double_t diff = TrackDiff(innertrack,outertrack); if(diff>=0&&diff=0&&outmin>=0){ AliL3Track *outertrack=tracksout->GetTrack(outmin); AliL3Track *innertrack=tracksin->GetTrack(inmin); tracks[0]=innertrack; tracks[1]=outertrack; SortTracks(tracks,2); MultiMerge(mergedtrack,tracks,2); outertrack->CalculatePoint(xval); innertrack->CalculatePoint(xval); PrintDiff(innertrack,outertrack); //FillNtuple(ntuple,innertrack,outertrack); tracksout->Remove(outmin); tracksin->Remove(inmin); // tracksout->Compress(); // tracksin->Compress(); } else merge = kFALSE; } LOG(AliL3Log::kInformational,"AliL3TrackMerger::SlowMerge","Result") <GetNTracks()-kNMerged<GetNTracks(); AliL3Track *tr[2]; for(Int_t in=0;inGetCheckedTrack(in); if(t){ t->CalculateHelix(); t->CalculatePoint(xval); } } for(Int_t out=0;outGetCheckedTrack(out); if(!outertrack) continue; for(Int_t in=0;inGetCheckedTrack(in); if(!innertrack) continue; if(outertrack->GetNHits()+innertrack->GetNHits()>nrow) continue; if(IsTrack(innertrack,outertrack)){ tr[0]=innertrack; tr[1]=outertrack; SortTracks(tr,2); if(tr[0]->GetLastPointX()GetFirstPointX()){ MultiMerge(tracks,tr,2); tracks->Remove(out); tracks->Remove(in); break; } } } } Int_t nmerged = tracks->GetNTracks()-kNIn; LOG(AliL3Log::kInformational,"AliL3TrackMerger::InterMerge","Result") <AddTracks(GetInTracks(0)); LOG(AliL3Log::kInformational,"AliL3TrackMerger::Merge","Result") <GetNPresent() <=0;i--){ AliL3TrackArray *tout = GetOutTracks(); if(i==subsec) tout = GetInTracks(subsec+1); AliL3TrackArray *tin = GetInTracks(i); Double_t xval = AliL3Transform::Row2X(fRowMax[i]); Double_t xmax = AliL3Transform::Row2X(fRowMax[i+1]); Double_t ymax = xval*tan(edge0); for(Int_t out=0;outGetNTracks();out++){ AliL3Track *outtrack=tout->GetCheckedTrack(out); if(!outtrack) continue; outtrack->CalculateHelix(); outtrack->CalculatePoint(xval); if(outtrack->IsPoint()&&fabs(outtrack->GetPointY())>ymax){ if(outtrack->GetNHits()<10) tout->Remove(out); } } // tout->Compress(); for(Int_t in=0;inGetNTracks();in++){ AliL3Track *intrack=(AliL3Track*)tin->GetTrack(in); intrack->CalculateHelix(); intrack->CalculatePoint(xval); } tin->QSort(); tout->QSort(); if(fSlow) SlowMerge(ttt,tin,tout,xval); else Merge(ttt,tin,tout); for(Int_t in=0;inGetNTracks();in++){ AliL3Track *intrack=(AliL3Track*)tin->GetCheckedTrack(in); if(!intrack) continue; if(intrack->CalculateEdgePoint(edge0)){ if(intrack->GetPointX()Remove(in); } } else if(intrack->CalculateEdgePoint(edge1)){ if(intrack->GetPointX()Remove(in); } } } /* for(Int_t in=0;inGetNTracks();in++){ AliL3Track *intrack=(AliL3Track*)tin->GetCheckedTrack(in); if(!intrack) continue; if(intrack->GetNHits()<10) continue; AddTrack(ttt,intrack); tin->Remove(in); } */ } // end subsector loop LOG(AliL3Log::kInformational,"AliL3TrackMerger::Merge","Result") <GetNPresent() <GetNTracks(); const Int_t kNIn =tracksin->GetNTracks(); const Int_t kNMerged =mergedtrack->GetNTracks(); Bool_t *ismatchedin = new Bool_t[kNIn]; for(Int_t in =0;inGetCheckedTrack(out); if(!outertrack) continue; for(Int_t in =0;inGetCheckedTrack(in); if(!innertrack) continue; if(outertrack==innertrack) continue; if(outertrack->GetCharge()!=innertrack->GetCharge()) continue; if(IsTrack(innertrack,outertrack)){ tracks[0]=innertrack; tracks[1]=outertrack; SortTracks(tracks,2); if(tracks[0]->GetLastPointX()GetFirstPointX()){ MultiMerge(mergedtrack,tracks,2); tracksout->Remove(out); tracksin->Remove(in); ismatchedin[in]=kTRUE; ismatchedout[out]=kTRUE; break; } } } } Int_t nmerged = mergedtrack->GetNTracks()-kNMerged; LOG(AliL3Log::kInformational,"AliL3TrackMerger::Merge","Result") <