// $Id$ // Original: AliHLTTrackMerger.cxx,v 1.12 2005/06/14 10:55:21 cvetan //************************************************************************** //* This file is property of and copyright by the ALICE HLT Project * //* ALICE Experiment at CERN, All rights reserved. * //* * //* Primary Authors: Uli Frankenfeld, maintained by * //* Matthias Richter * //* for The ALICE HLT Project. * //* * //* Permission to use, copy, modify and distribute this software and its * //* documentation strictly for non-commercial purposes is hereby granted * //* without fee, provided that the above copyright notice appears in all * //* copies and that both the copyright notice and this permission notice * //* appear in the supporting documentation. The authors make no claims * //* about the suitability of this software for any purpose. It is * //* provided "as is" without express or implied warranty. * //************************************************************************** /// @file AliHLTTPCTrackMerger.cxx /// @author Uli Frankenfeld, maintained by Matthias Richter /// @date /// @brief The HLT TPC track segment merger /// #include "AliHLTTPCLogging.h" #include "AliHLTTPCTrackMerger.h" #include "AliHLTTPCTrack.h" #include "AliHLTTPCTrackSegmentData.h" #include "AliHLTTPCTransform.h" #include "AliHLTTPCTrackArray.h" #if __GNUC__ >= 3 using namespace std; #endif ClassImp(AliHLTTPCTrackMerger) AliHLTTPCTrackMerger::AliHLTTPCTrackMerger() : AliHLTTPCMerger(), fSubSector(0), fNSubSector(0), fRowMin(NULL), fRowMax(NULL), fSlow(0) { //Default constructor Is2Global(kFALSE); SetParameter(); } AliHLTTPCTrackMerger::AliHLTTPCTrackMerger(Int_t nsubsectors) : AliHLTTPCMerger(), fSubSector(0), fNSubSector(nsubsectors), fRowMin(new Int_t[nsubsectors]), fRowMax(new Int_t[nsubsectors]), fSlow(0) { //Constructor. InitMerger(nsubsectors); Is2Global(kFALSE); fSlow = kFALSE; SetParameter(); } AliHLTTPCTrackMerger::~AliHLTTPCTrackMerger() { //Destructor if (fRowMin) delete[] fRowMin; if (fRowMax) delete[] fRowMax; } void AliHLTTPCTrackMerger::SetRows(Int_t *row){ //Set the indeces of the first and last //TPC padrows // for(Int_t i=0;iGetNTracks(); const Int_t kNIn =tracksin->GetNTracks(); const Int_t kNMerged =mergedtrack->GetNTracks(); AliHLTTPCTrack *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){ AliHLTTPCTrack *outertrack=tracksout->GetTrack(outmin); AliHLTTPCTrack *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(AliHLTTPCLog::kInformational,"AliHLTTPCTrackMerger::SlowMerge","Result") <GetNTracks()-kNMerged<GetNTracks(); AliHLTTPCTrack *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(AliHLTTPCLog::kInformational,"AliHLTTPCTrackMerger::InterMerge","Result") <AddTracks(GetInTracks(0)); LOG(AliHLTTPCLog::kInformational,"AliHLTTPCTrackMerger::Merge","Result") <GetNPresent() <=0;i--){ AliHLTTPCTrackArray *tout = GetOutTracks(); if(i==subsec) tout = GetInTracks(subsec+1); AliHLTTPCTrackArray *tin = GetInTracks(i); Double_t xval = AliHLTTPCTransform::Row2X(fRowMax[i]); Double_t xmax = AliHLTTPCTransform::Row2X(fRowMax[i+1]); Double_t ymax = xval*tan(edge0); for(Int_t out=0;outGetNTracks();out++){ AliHLTTPCTrack *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++){ AliHLTTPCTrack *intrack=(AliHLTTPCTrack*)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++){ AliHLTTPCTrack *intrack=(AliHLTTPCTrack*)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++){ AliHLTTPCTrack *intrack=(AliHLTTPCTrack*)tin->GetCheckedTrack(in); if(!intrack) continue; if(intrack->GetNHits()<10) continue; AddTrack(ttt,intrack); tin->Remove(in); } */ } // end subsector loop LOG(AliHLTTPCLog::kInformational,"AliHLTTPCTrackMerger::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(AliHLTTPCLog::kInformational,"AliHLTTPCTrackMerger::Merge","Result") <