* provided "as is" without express or implied warranty. *
**************************************************************************/
-/** @file AliHLTGlobalTrackMerger.cxx
- @author Jacek Otwinowski
- @date
- @brief The HLT global merger base class
-*/
+// @file AliHLTGlobalTrackMerger.cxx
+// @author Jacek Otwinowski
+// @date
+// @brief The HLT global merger base class
+//
-#include "AliHLTTPCTransform.h"
-#include "AliHLTTPCTrack.h"
-#include "AliHLTTPCTrackSegmentData.h"
-#include "AliHLTTPCTransform.h"
-#include "AliHLTTPCTrackArray.h"
+//#include "AliTPCReconstructor.h"
-#include "AliTPCReconstructor.h"
-
-#include "AliTRDtrackV1.h"
#include "AliESDEvent.h"
#include "AliESDVertex.h"
+#include "AliESDtrack.h"
#include "AliTracker.h"
#include "TTreeStream.h"
// V(0.,0.,0.), sigmaVx=sigmaVy=5.e-3 [cm], sigmaVz=5.3 [cm]
fVertex = new AliESDVertex;
- if (AliTPCReconstructor::StreamLevel()>0) {
- fDebugStreamer = new TTreeSRedirector("debugGlobalMerger.root");
- }
+ // if (AliTPCReconstructor::StreamLevel()>0) {
+ // fDebugStreamer = new TTreeSRedirector("debugGlobalMerger.root");
+ // }
}
if(fDebugStreamer) delete fDebugStreamer; fDebugStreamer =0;
}
-//_____________________________________________________________________________
-Bool_t AliHLTGlobalTrackMerger::LoadTracks(TClonesArray *aTRDTracks, AliESDEvent *esdEvent)
-{
- // load TRD tracks
- if(!aTRDTracks) return kFALSE;
-
- Int_t entries = aTRDTracks->GetEntriesFast();
- for(Int_t i=0; i<entries; ++i) {
- AliTRDtrackV1 *track = (AliTRDtrackV1*)aTRDTracks->At(i);
- if(!track) continue;
-
- FillTRDESD(track,AliESDtrack::kTRDin,esdEvent);
- }
-
-return kTRUE;
-}
-
-//_____________________________________________________________________________
-Bool_t AliHLTGlobalTrackMerger::LoadTracks(AliHLTTPCTrackArray *aTPCTracks, AliESDEvent *esdEvent)
-{
- // load TPC tracks
- if(!aTPCTracks) return kFALSE;
-
- for (Int_t i=0; i<aTPCTracks->GetNTracks();++i) {
- AliHLTTPCTrack* track=(*aTPCTracks)[i];
- if(!track) continue;
-
- // convert to the AliKalmanTrack
- Int_t local=track->Convert2AliKalmanTrack();
- if(local<0) continue;
-
- FillTPCESD(track,AliESDtrack::kTPCin,esdEvent);
- }
-
-return kTRUE;
-}
-
-//_____________________________________________________________________________
-void AliHLTGlobalTrackMerger::FillTPCESD(AliHLTTPCTrack *tpcTrack, ULong_t flags, AliESDEvent* esdEvent)
-{
- // create AliESDtracks from AliHLTTPCTracks
- // and add them to AliESDEvent
-
- if(!tpcTrack) return;
- if(!esdEvent) return;
-
- AliESDtrack iotrack;
- iotrack.UpdateTrackParams(tpcTrack,flags);
-
- Float_t points[4]={tpcTrack->GetFirstPointX(),tpcTrack->GetFirstPointY(),tpcTrack->GetLastPointX(),tpcTrack->GetLastPointY()};
- if(tpcTrack->GetSector() == -1){ // Set first and last points for global tracks
- Double_t s = TMath::Sin( tpcTrack->GetAlpha() );
- Double_t c = TMath::Cos( tpcTrack->GetAlpha() );
- points[0] = tpcTrack->GetFirstPointX()*c + tpcTrack->GetFirstPointY()*s;
- points[1] = -tpcTrack->GetFirstPointX()*s + tpcTrack->GetFirstPointY()*c;
- points[2] = tpcTrack->GetLastPointX() *c + tpcTrack->GetLastPointY() *s;
- points[3] = -tpcTrack->GetLastPointX() *s + tpcTrack->GetLastPointY() *c;
- }
- iotrack.SetTPCPoints(points);
-
- esdEvent->AddTrack(&iotrack);
-}
-
-//_____________________________________________________________________________
-void AliHLTGlobalTrackMerger::FillTRDESD(AliTRDtrackV1* trdTrack, ULong_t flags, AliESDEvent* esdEvent)
-{
- // create AliESDtracks from AliTRDtrackV1
- // and add them to AliESDEvent
-
- if(!trdTrack) return;
- if(!esdEvent) return;
-
- AliESDtrack iotrack;
- iotrack.UpdateTrackParams(trdTrack,flags);
- esdEvent->AddTrack(&iotrack);
-}
-
//_____________________________________________________________________________
Bool_t AliHLTGlobalTrackMerger::Merge(AliESDEvent* esdEvent)
{
// 1. propagate TPC track to the radius between TPC and TRD
// 2. propagate TRD track to the same radius between TPC and TRD
// 3. matches TPC and TRD tracks at the radius
- // 4. propagate matched TPC and TRD track to the merging radius (first measured TPC point - x coordinate)
+ // 4. propagate matched TRD track to the merging radius (first measured TPC point - x coordinate)
// 5. merge TPC and TRD track parameters at the merging radius
// 6. create AliESDtrack from merged tracks
// 7. add AliESDtrack to AliESDEvent
Bool_t isOk = kFALSE;
Bool_t isMatched = kFALSE;
AliESDtrack *track=0;
+ AliExternalTrackParam *extTPCTrack = 0;
Int_t nTracks = esdEvent->GetNumberOfTracks();
HLTWarning("nTracks %d",nTracks);
// TPC tracks
if((track->GetStatus()&AliESDtrack::kTPCin)==0) continue;
AliESDtrack *tpcTrack = track;
-
nTracksTPC++;
+ // create external tpc track param (needed to propagate to matching radius)
+ if ((extTPCTrack = new AliExternalTrackParam(*tpcTrack)) == 0) continue;
+
kMergeRadius = tpcTrack->GetTPCPoints(0); // [cm] merging at first measured TPC point
HLTInfo("-------------------------------------------------------------------------------------");
- HLTInfo("-----tpc track before matching: alpha %f, x %f, y, %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
+ //HLTInfo("-----tpc track before matching: alpha %f, x %f, y, %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
+ HLTInfo("-----ext tpc track before matching: alpha %f, x %f, y, %f, z %f, snp %f, tgl %f, 1pt %f",extTPCTrack->GetAlpha(),extTPCTrack->GetX(),extTPCTrack->GetY(),extTPCTrack->GetZ(),extTPCTrack->GetSnp(),extTPCTrack->GetTgl(),extTPCTrack->GetSigned1Pt());
// propagate tracks to the matching radius
- isOk = AliTracker::PropagateTrackTo(tpcTrack,kMatchRadius,tpcTrack->GetMass(),kMaxStep,kFALSE);
+ //isOk = AliTracker::PropagateTrackTo(tpcTrack,kMatchRadius,tpcTrack->GetMass(),kMaxStep,kFALSE);
+ isOk = AliTracker::PropagateTrackTo(extTPCTrack,kMatchRadius,tpcTrack->GetMass(),kMaxStep,kFALSE);
if(!isOk) continue;
- HLTInfo("-----tpc track at matching radius: alpha %f, x %f, y, %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
+ HLTInfo("-----ext tpc track at matching radius: alpha %f, x %f, y, %f, z %f, snp %f, tgl %f, 1pt %f",extTPCTrack->GetAlpha(),extTPCTrack->GetX(),extTPCTrack->GetY(),extTPCTrack->GetZ(),extTPCTrack->GetSnp(),extTPCTrack->GetTgl(),extTPCTrack->GetSigned1Pt());
Int_t nTracksTRD =0;
for(Int_t jTrack = 0; jTrack<nTracks; ++jTrack)
// TRD tracks
if((track->GetStatus()&AliESDtrack::kTRDin)==0) continue;
AliESDtrack *trdTrack = track;
-
nTracksTRD++;
- HLTInfo("1-----trd track before matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
+ HLTInfo("-----trd track before matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
isOk = AliTracker::PropagateTrackTo(trdTrack,kMatchRadius,trdTrack->GetMass(),kMaxStep,kFALSE);
if(!isOk) continue;
- HLTInfo("1-----trd track at matching radius: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
+ HLTInfo("-----trd track at matching radius: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
// match TPC and TRD tracks
- isMatched = MatchTracks(tpcTrack,trdTrack);
+ //isMatched = MatchTracks(tpcTrack,trdTrack);
+ isMatched = MatchTracks(extTPCTrack,trdTrack);
if(!isMatched) continue;
- HLTInfo("2-----tpc track after matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
- HLTInfo("2-----trd track after matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
-
- // propagate tracks to the merging radius
- isOk = AliTracker::PropagateTrackTo(tpcTrack,kMergeRadius,tpcTrack->GetMass(),kMaxStep,kFALSE);
- if(!isOk) continue;
+ //HLTInfo("-----tpc track after matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
+ HLTInfo("-----ext tpc track after matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",extTPCTrack->GetAlpha(),extTPCTrack->GetX(),extTPCTrack->GetY(),extTPCTrack->GetZ(),extTPCTrack->GetSnp(),extTPCTrack->GetTgl(),extTPCTrack->GetSigned1Pt());
+ HLTInfo("-----trd track after matching: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
+ // propagate TRD tracks to the merging radius
+ //isOk = AliTracker::PropagateTrackTo(tpcTrack,kMergeRadius,tpcTrack->GetMass(),kMaxStep,kFALSE);
+ //if(!isOk) continue;
isOk = AliTracker::PropagateTrackTo(trdTrack,kMergeRadius,trdTrack->GetMass(),kMaxStep,kFALSE);
if(!isOk) continue;
- HLTInfo("3-----tpc before merging: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
- HLTInfo("3-----trd before merging: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
+ HLTInfo("-----tpc before merging: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",tpcTrack->GetAlpha(),tpcTrack->GetX(),tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt());
+ HLTInfo("-----trd before merging: alpha %f, x %f, y %f, z %f, snp %f, tgl %f, 1pt %f",trdTrack->GetAlpha(),trdTrack->GetX(),trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt());
// merge TPC and TRD tracks
// create AliESDtrack and add it to AliESDevent
Bool_t isMerged = MergeTracks(tpcTrack,trdTrack,esdEvent);
if(!isMerged)
HLTInfo("No merged tracks");
-
}
HLTInfo("nTracksTRD %d",nTracksTRD);
+
+ // delete external TPC track
+ if(extTPCTrack) delete extTPCTrack; extTPCTrack=0;
}
HLTInfo("nTracksTPC %d",nTracksTPC);
if(!tpcTrack) return kFALSE;
if(!trdTrack) return kFALSE;
- /*
- Double_t tpcParam[5] = {tpcTrack->GetY(),tpcTrack->GetZ(),tpcTrack->GetSnp(),tpcTrack->GetTgl(),tpcTrack->GetSigned1Pt()};
- Double_t trdParam[5] = {trdTrack->GetY(),trdTrack->GetZ(),trdTrack->GetSnp(),trdTrack->GetTgl(),trdTrack->GetSigned1Pt()};
-
- const Double_t* tpcCv = tpcTrack->GetCovariance();
- const Double_t* trdCv = trdTrack->GetCovariance();
-
- Double_t tpcCovar[15] = {tpcCv[0],tpcCv[1],tpcCv[2],tpcCv[3],tpcCv[4],tpcCv[5],tpcCv[6],tpcCv[7],tpcCv[8],tpcCv[9],tpcCv[10],tpcCv[11],tpcCv[12],tpcCv[13], tpcCv[14] } ;
-
- Double_t trdCovar[15] = {trdCv[0],trdCv[1],trdCv[2],trdCv[3],trdCv[4],trdCv[5],trdCv[6],trdCv[7],trdCv[8],trdCv[9],trdCv[10],trdCv[11],trdCv[12],trdCv[13], trdCv[14] } ;
-
-
- Bool_t isNotOK = SmoothTracks(tpcParam, tpcCovar, tpcTrack->GetChi2(), 5,
- trdParam, trdCovar, trdTrack->GetChi2(), 5,
- trackParam, trackCovar, trackChi2, trackNDF,5);
- */
-
Double_t trackParam[5], trackCovar[15];
Double_t trackChi2;
Int_t trackNDF;
}
//_____________________________________________________________________________
-Bool_t AliHLTGlobalTrackMerger::MatchTracks(AliESDtrack *trackTPC, AliESDtrack *trackTRD)
+Bool_t AliHLTGlobalTrackMerger::MatchTracks(AliExternalTrackParam *trackTPC, const AliESDtrack *trackTRD)
{
// match TPC and TRD tracks
// return kTRUE in case of matching
if(!trackTPC) return kFALSE;
if(!trackTRD) return kFALSE;
- Double_t x_tpc=trackTPC->GetX();
- Double_t y_tpc=trackTPC->GetY();
- Double_t z_tpc=trackTPC->GetZ();
- Double_t snp_tpc=trackTPC->GetSnp();
- Double_t tgl_tpc=trackTPC->GetTgl();
- Double_t signed1Pt_tpc=trackTPC->GetSigned1Pt();
+ Double_t xTpc=trackTPC->GetX();
+ Double_t yTpc=trackTPC->GetY();
+ Double_t zTpc=trackTPC->GetZ();
+ Double_t snpTpc=trackTPC->GetSnp();
+ Double_t tglTpc=trackTPC->GetTgl();
+ Double_t signed1PtTpc=trackTPC->GetSigned1Pt();
- Double_t x_trd=trackTRD->GetX();
- Double_t y_trd=trackTRD->GetY();
- Double_t z_trd=trackTRD->GetZ();
- Double_t snp_trd=trackTRD->GetSnp();
- Double_t tgl_trd=trackTRD->GetTgl();
- Double_t signed1Pt_trd=trackTRD->GetSigned1Pt();
+ Double_t xTrd=trackTRD->GetX();
+ Double_t yTrd=trackTRD->GetY();
+ Double_t zTrd=trackTRD->GetZ();
+ Double_t snpTrd=trackTRD->GetSnp();
+ Double_t tglTrd=trackTRD->GetTgl();
+ Double_t signed1PtTrd=trackTRD->GetSigned1Pt();
// debug stream
- if (AliTPCReconstructor::StreamLevel()>0) {
- //TTreeSRedirector &cstream = *fDebugStreamer;
- *fDebugStreamer<<"match"<<
- "x_tpc="<<x_tpc<<
- "y_tpc="<<y_tpc<<
- "z_tpc="<<z_tpc<<
- "snp_tpc="<<snp_tpc<<
- "tgl_tpc="<<tgl_tpc<<
- "signed1Pt_tpc="<<signed1Pt_tpc<<
- "x_trd="<<x_trd<<
- "y_trd="<<y_trd<<
- "z_trd="<<z_trd<<
- "snp_trd="<<snp_trd<<
- "tgl_trd="<<tgl_trd<<
- "signed1Pt_trd="<<signed1Pt_trd<<
- "\n";
- }
-
- if (TMath::Abs(y_tpc-y_trd) > fMaxY) return kFALSE;
- if (TMath::Abs(z_tpc-z_trd) > fMaxZ) return kFALSE;
- if (TMath::Abs(snp_tpc-snp_trd) > fMaxSnp) return kFALSE;
- if (TMath::Abs(tgl_tpc-tgl_trd) > fMaxTgl) return kFALSE;
- if (TMath::Abs(signed1Pt_tpc-signed1Pt_trd) > fMaxSigned1Pt) return kFALSE;
+ // if (AliTPCReconstructor::StreamLevel()>0) {
+ // //TTreeSRedirector &cstream = *fDebugStreamer;
+ // *fDebugStreamer<<"match"<<
+ // "xTpc="<<xTpc<<
+ // "yTpc="<<yTpc<<
+ // "zTpc="<<zTpc<<
+ // "snpTpc="<<snpTpc<<
+ // "tglTpc="<<tglTpc<<
+ // "signed1PtTpc="<<signed1PtTpc<<
+ // "xTrd="<<xTrd<<
+ // "yTrd="<<yTrd<<
+ // "zTrd="<<zTrd<<
+ // "snpTrd="<<snpTrd<<
+ // "tglTrd="<<tglTrd<<
+ // "signed1PtTrd="<<signed1PtTrd<<
+ // "\n";
+ // }
+
+ if (TMath::Abs(xTpc-xTrd) > 0) {/* get rid of warning*/;}
+ if (TMath::Abs(yTpc-yTrd) > fMaxY) return kFALSE;
+ if (TMath::Abs(zTpc-zTrd) > fMaxZ) return kFALSE;
+ if (TMath::Abs(snpTpc-snpTrd) > fMaxSnp) return kFALSE;
+ if (TMath::Abs(tglTpc-tglTrd) > fMaxTgl) return kFALSE;
+ if (TMath::Abs(signed1PtTpc-signed1PtTrd) > fMaxSigned1Pt) return kFALSE;
return kTRUE;
}
//_____________________________________________________________________________
void AliHLTGlobalTrackMerger::MultSSQ( const Double_t *A, const Double_t *B, Double_t *C, Int_t N )
{
+ // no clue
for( Int_t ind=0, i=0; i<N; ++i ){
for( Int_t j=0; j<N; ++j, ++ind ){
C[ind] = 0;
x = 1 / x;
for( Int_t step=1; step<=N-j; ik+=++step ){ // ik==Ai1
Double_t sum = 0;
- for( Double_t *jk=j1; jk!=jj; sum += (*(jk++)) * (*(ik++)) );
+ for( Double_t *jk=j1; jk!=jj; sum += (*(jk++)) * (*(ik++)) ) {}
*ik = (*ik - sum) * x; // ik == Aij
}
}else{
}
//_____________________________________________________________________________
-void AliHLTGlobalTrackMerger::PropagateTracksToDCA(AliESDEvent *esdEvent)
+void AliHLTGlobalTrackMerger::PropagateTracksToDCA(const AliESDEvent *esdEvent)
{
// try to propagate all tracks to DCA to primary vertex
if(!esdEvent) return;