///////////////////////////////////////////////////////////////////////////////
// //
// Time Projection Chamber //
-// Comparison macro for reconstructed tracks - ESDs V0s //
+// Comparison macro for reconstructed tracks //
// responsible:
// marian.ivanov@cern.ch //
//
-#include <stdio.h>
-#include <string.h>
//ROOT includes
#include "Rtypes.h"
//
//ALIROOT includes
//
#include "AliESDtrack.h"
+#include "AliTracker.h"
#include "AliTPCParam.h"
#include "AliTrackReference.h"
#include "AliTPCParamSR.h"
-#include "AliESD.h"
#include "AliESDfriend.h"
#include "AliESDtrack.h"
#include "AliTPCseed.h"
#include "AliITStrackMI.h"
-#include "AliTRDtrack.h"
-#include "AliHelix.h"
-#include "AliESDVertex.h"
-#include "AliExternalTrackParam.h"
-#include "AliESDkink.h"
-#include "AliESDv0.h"
-#include "AliV0.h"
-//
-#include "AliTreeDraw.h"
+#include "AliTRDtrackV1.h"
#include "AliMCInfo.h"
-#include "AliGenV0Info.h"
-#include "AliGenKinkInfo.h"
#include "AliESDRecInfo.h"
AliESDRecInfo::AliESDRecInfo(const AliESDRecInfo& recinfo):
- TObject()
+ TObject(),
+ fITSOn(0), // ITS refitted inward
+ fTRDOn(0), // ITS refitted inward
+ fDeltaP(0), //delta of momenta
+ fSign(0), // sign
+ fReconstructed(0), //flag if track was reconstructed
+ fFake(0), // fake track
+ fMultiple(0), // number of reconstructions
+ fTPCOn(0), // TPC refitted inward
+ fBestTOFmatch(0), //best matching between times
+ fESDtrack(0), // esd track
+ fTrackF(0), // friend track
+ fTPCtrack(0), // tpc track
+ fITStrack(0), // its track
+ fTRDtrack(0) // trd track
{
//
//
}
+AliESDRecInfo& AliESDRecInfo::operator=(const AliESDRecInfo& info) {
+ //
+ // Assignment operator
+ //
+ this->~AliESDRecInfo();
+ new (this) AliESDRecInfo(info);
+ return *this;
+}
+
+
+
AliESDRecInfo::~AliESDRecInfo()
{
//
if (fESDtrack) delete fESDtrack;
fESDtrack = (AliESDtrack*)track->Clone();
- if (0 &&track->GetFriendTrack()){
+ if (track->GetFriendTrack()){
if (fTrackF) delete fTrackF;
fTrackF = (AliESDfriendTrack*)track->GetFriendTrack()->Clone();
- if (fTrackF->GetCalibObject(0)){
- if (fTPCtrack) delete fTPCtrack;
- fTPCtrack = (AliTPCseed*)fTrackF->GetCalibObject(0)->Clone();
+ Int_t icalib=0;
+ TObject *cobject=0;
+ //
+ while (fTrackF->GetCalibObject(icalib)){
+ cobject=fTrackF->GetCalibObject(icalib);
+ if (dynamic_cast<AliTPCseed*>(cobject)){
+ if (fTPCtrack) delete fTPCtrack;
+ fTPCtrack = (AliTPCseed*)(dynamic_cast<AliTPCseed*>(cobject))->Clone();
+ } else if (dynamic_cast<AliTRDtrackV1*>(cobject)){
+ if (fTRDtrack) delete fTRDtrack;
+ fTRDtrack = (AliTRDtrackV1*)(dynamic_cast<AliTRDtrackV1*>(cobject))->Clone();
+ }
+ icalib++;
}
}
//
void AliESDRecInfo::Update(AliMCInfo* info,AliTPCParam * /*par*/, Bool_t reconstructed)
{
- //
//
//calculates derived variables
//
- //
UpdatePoints(fESDtrack);
- fBestTOFmatch=1000;
- AliTrackReference * ref = &(info->fTrackRef);
- fTPCinR0[0] = info->fTrackRef.X();
- fTPCinR0[1] = info->fTrackRef.Y();
- fTPCinR0[2] = info->fTrackRef.Z();
- fTPCinR0[3] = TMath::Sqrt(fTPCinR0[0]*fTPCinR0[0]+fTPCinR0[1]*fTPCinR0[1]);
- fTPCinR0[4] = TMath::ATan2(fTPCinR0[1],fTPCinR0[0]);
- //
- fTPCinP0[0] = ref->Px();
- fTPCinP0[1] = ref->Py();
- fTPCinP0[2] = ref->Pz();
- fTPCinP0[3] = ref->Pt();
- fTPCinP0[4] = ref->P();
- fDeltaP = (ref->P()-info->fParticle.P())/info->fParticle.P();
- //
- //
- if (fTPCinP0[3]>0.0000001){
- //
- fTPCAngle0[0] = TMath::ATan2(fTPCinP0[1],fTPCinP0[0]);
- fTPCAngle0[1] = TMath::ATan(fTPCinP0[2]/fTPCinP0[3]);
- }
- //
- //
- fITSinP0[0]=info->fParticle.Px();
- fITSinP0[1]=info->fParticle.Py();
- fITSinP0[2]=info->fParticle.Pz();
- fITSinP0[3]=info->fParticle.Pt();
- //
- fITSinR0[0]=info->fParticle.Vx();
- fITSinR0[1]=info->fParticle.Vy();
- fITSinR0[2]=info->fParticle.Vz();
- fITSinR0[3] = TMath::Sqrt(fITSinR0[0]*fITSinR0[0]+fITSinR0[1]*fITSinR0[1]);
- fITSinR0[4] = TMath::ATan2(fITSinR0[1],fITSinR0[0]);
- //
+ UpdateStatus(info,reconstructed);
+ UpdateITS(info);
+ UpdateTPC(info);
+ UpdateTOF(info);
+}
+
+
+void AliESDRecInfo::UpdateStatus(AliMCInfo* info, Bool_t reconstructed){
//
- if (fITSinP0[3]>0.0000001){
- fITSAngle0[0] = TMath::ATan2(fITSinP0[1],fITSinP0[0]);
- fITSAngle0[1] = TMath::ATan(fITSinP0[2]/fITSinP0[3]);
- }
+ // Interpret bit mask flags
//
for (Int_t i=0;i<4;i++) fStatus[i] =0;
fReconstructed = kFALSE;
fStatus[0]=0;
}
}
-
//
//
if ((fESDtrack->GetStatus()&AliESDtrack::kTRDrefit)>0){
}
if ((fESDtrack->GetStatus()&AliESDtrack::kTRDStop)>0){
fStatus[2] =10;
- }
+ }
+}
+void AliESDRecInfo::UpdateTOF(AliMCInfo* info){
//
- //TOF
- //
+ // Update TOF related comparison information
+ //
+ fBestTOFmatch=1000;
if (((fESDtrack->GetStatus()&AliESDtrack::kTOFout)>0)){
//
// best tof match
}else{
fStatus[3]=0;
}
+}
- if (fStatus[1]>0 &&info->fNTPCRef>0&&TMath::Abs(fTPCinP0[3])>0.0001){
- //TPC
- fESDtrack->GetInnerXYZ(fTPCinR1);
- fTPCinR1[3] = TMath::Sqrt(fTPCinR1[0]*fTPCinR1[0]+fTPCinR1[1]*fTPCinR1[1]);
- fTPCinR1[4] = TMath::ATan2(fTPCinR1[1],fTPCinR1[0]);
- fESDtrack->GetInnerPxPyPz(fTPCinP1);
- fTPCinP1[3] = TMath::Sqrt(fTPCinP1[0]*fTPCinP1[0]+fTPCinP1[1]*fTPCinP1[1]);
- fTPCinP1[4] = TMath::Sqrt(fTPCinP1[3]*fTPCinP1[3]+fTPCinP1[2]*fTPCinP1[2]);
- //
- //
- if (fTPCinP1[3]>0.000000000000001){
- fTPCAngle1[0] = TMath::ATan2(fTPCinP1[1],fTPCinP1[0]);
- fTPCAngle1[1] = TMath::ATan(fTPCinP1[2]/fTPCinP1[3]);
- }
- Double_t cov[15], param[5],x, alpha;
- fESDtrack->GetInnerExternalCovariance(cov);
- fESDtrack->GetInnerExternalParameters(alpha, x,param);
- if (x<50) return ;
- //
- fTPCDelta[0] = (fTPCinR0[4]-fTPCinR1[4])*fTPCinR1[3]; //delta rfi
- fTPCPools[0] = fTPCDelta[0]/TMath::Sqrt(cov[0]);
- fTPCDelta[1] = (fTPCinR0[2]-fTPCinR1[2]); //delta z
- fTPCPools[1] = fTPCDelta[1]/TMath::Sqrt(cov[2]);
- fTPCDelta[2] = (fTPCAngle0[0]-fTPCAngle1[0]);
- fTPCPools[2] = fTPCDelta[2]/TMath::Sqrt(cov[5]);
- fTPCDelta[3] = (TMath::Tan(fTPCAngle0[1])-TMath::Tan(fTPCAngle1[1]));
- fTPCPools[3] = fTPCDelta[3]/TMath::Sqrt(cov[9]);
- fTPCDelta[4] = (fTPCinP0[3]-fTPCinP1[3]);
- Double_t sign = (param[4]>0)? 1.:-1;
- fSign =sign;
- fTPCPools[4] = sign*(1./fTPCinP0[3]-1./fTPCinP1[3])/TMath::Sqrt(TMath::Abs(cov[14]));
+
+void AliESDRecInfo::UpdateITS(AliMCInfo* info){
+ //
+ // Update ITS related comparison information
+ //
+ fITSinP0[0]=info->fParticle.Px();
+ fITSinP0[1]=info->fParticle.Py();
+ fITSinP0[2]=info->fParticle.Pz();
+ fITSinP0[3]=info->fParticle.Pt();
+ //
+ fITSinR0[0]=info->fParticle.Vx();
+ fITSinR0[1]=info->fParticle.Vy();
+ fITSinR0[2]=info->fParticle.Vz();
+ fITSinR0[3] = TMath::Sqrt(fITSinR0[0]*fITSinR0[0]+fITSinR0[1]*fITSinR0[1]);
+ fITSinR0[4] = TMath::ATan2(fITSinR0[1],fITSinR0[0]);
+ //
+ //
+ if (fITSinP0[3]>0.0000001){
+ fITSAngle0[0] = TMath::ATan2(fITSinP0[1],fITSinP0[0]);
+ fITSAngle0[1] = TMath::ATan(fITSinP0[2]/fITSinP0[3]);
}
if (fITSOn){
// ITS
fESDtrack->GetExternalCovariance(cov);
//fESDtrack->GetConstrainedExternalCovariance(cov);
if (TMath::Abs(param[4])<0.0000000001) return;
-
+
fESDtrack->GetXYZ(fITSinR1);
fESDtrack->GetPxPyPz(fITSinP1);
fITSinP1[3] = TMath::Sqrt(fITSinP1[0]*fITSinP1[0]+fITSinP1[1]*fITSinP1[1]);
fITSDelta[4] = (fITSinP0[3]-fITSinP1[3]);
Double_t sign = (param[4]>0) ? 1:-1;
fSign = sign;
- fITSPools[4] = sign*(1./fITSinP0[3]-1./fITSinP1[3])/TMath::Sqrt(cov[14]);
+ fITSPools[4] = sign*(1./fITSinP0[3]-1./fITSinP1[3])/TMath::Sqrt(cov[14]);
+ }
+}
+
+void AliESDRecInfo::UpdateTPC(AliMCInfo* info){
+ //
+ //
+ // Update TPC related information
+ //
+ AliTrackReference * ref = &(info->fTrackRef);
+ fTPCinR0[0] = info->fTrackRef.X();
+ fTPCinR0[1] = info->fTrackRef.Y();
+ fTPCinR0[2] = info->fTrackRef.Z();
+ fTPCinR0[3] = TMath::Sqrt(fTPCinR0[0]*fTPCinR0[0]+fTPCinR0[1]*fTPCinR0[1]);
+ fTPCinR0[4] = TMath::ATan2(fTPCinR0[1],fTPCinR0[0]);
+ //
+ fTPCinP0[0] = ref->Px();
+ fTPCinP0[1] = ref->Py();
+ fTPCinP0[2] = ref->Pz();
+ fTPCinP0[3] = ref->Pt();
+ fTPCinP0[4] = ref->P();
+ fDeltaP = (ref->P()-info->fParticle.P())/info->fParticle.P();
+ //
+ //
+ if (fTPCinP0[3]>0.0000001){
+ //
+ fTPCAngle0[0] = TMath::ATan2(fTPCinP0[1],fTPCinP0[0]);
+ fTPCAngle0[1] = TMath::ATan(fTPCinP0[2]/fTPCinP0[3]);
+ }
+ //
+ if (fStatus[1]>0 &&info->fNTPCRef>0&&TMath::Abs(fTPCinP0[3])>0.0001){
+ //TPC
+ fESDtrack->GetInnerXYZ(fTPCinR1);
+ fTPCinR1[3] = TMath::Sqrt(fTPCinR1[0]*fTPCinR1[0]+fTPCinR1[1]*fTPCinR1[1]);
+ fTPCinR1[4] = TMath::ATan2(fTPCinR1[1],fTPCinR1[0]);
+ fESDtrack->GetInnerPxPyPz(fTPCinP1);
+ fTPCinP1[3] = TMath::Sqrt(fTPCinP1[0]*fTPCinP1[0]+fTPCinP1[1]*fTPCinP1[1]);
+ fTPCinP1[4] = TMath::Sqrt(fTPCinP1[3]*fTPCinP1[3]+fTPCinP1[2]*fTPCinP1[2]);
+ //
+ //
+ if (fTPCinP1[3]>0.000000000000001){
+ fTPCAngle1[0] = TMath::ATan2(fTPCinP1[1],fTPCinP1[0]);
+ fTPCAngle1[1] = TMath::ATan(fTPCinP1[2]/fTPCinP1[3]);
+ }
+ Double_t cov[15], param[5],x, alpha;
+ fESDtrack->GetInnerExternalCovariance(cov);
+ fESDtrack->GetInnerExternalParameters(alpha, x,param);
+ if (x<50) return ;
+ //
+ fTPCDelta[0] = (fTPCinR0[4]-fTPCinR1[4])*fTPCinR1[3]; //delta rfi
+ fTPCPools[0] = fTPCDelta[0]/TMath::Sqrt(cov[0]);
+ fTPCDelta[1] = (fTPCinR0[2]-fTPCinR1[2]); //delta z
+ fTPCPools[1] = fTPCDelta[1]/TMath::Sqrt(cov[2]);
+ fTPCDelta[2] = (fTPCAngle0[0]-fTPCAngle1[0]);
+ fTPCPools[2] = fTPCDelta[2]/TMath::Sqrt(cov[5]);
+ fTPCDelta[3] = (TMath::Tan(fTPCAngle0[1])-TMath::Tan(fTPCAngle1[1]));
+ fTPCPools[3] = fTPCDelta[3]/TMath::Sqrt(cov[9]);
+ fTPCDelta[4] = (fTPCinP0[3]-fTPCinP1[3]);
+ Double_t sign = (param[4]>0)? 1.:-1;
+ fSign =sign;
+ fTPCPools[4] = sign*(1./fTPCinP0[3]-1./fTPCinP1[3])/TMath::Sqrt(TMath::Abs(cov[14]));
}
-
}
+
+
+