/* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
#include <TChain.h>
-#include <TFile.h>
+#include <TTree.h>
+#include <TList.h>
#include <TArrayI.h>
#include <TRandom.h>
fKinkFilter(0x0),
fV0Filter(0x0),
fHighPthreshold(0),
- fPtshape(0x0)
+ fPtshape(0x0)
{
// Default constructor
}
Double_t timezero = 0; //TO BE FIXED
AliAODv0 *aodV0 = 0x0;
- // RefArray to take into account the tracks associated to V0s
- TRefArray *v0DaughterTracks = NULL;
- if (nTracks>0) v0DaughterTracks = new TRefArray(nTracks);
+ // RefArray to store the mapping between esd track number and newly created AOD-Track
+ TRefArray *aodRefs = NULL;
+ if (nTracks > 0) aodRefs = new TRefArray(nTracks);
// Array to take into account the tracks already added to the AOD
Bool_t * usedTrack = NULL;
esdTrack->GetXYZ(pos);
esdTrack->GetCovarianceXYZPxPyPz(covTr);
esdTrack->GetESDpid(pid);
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
+ UInt_t selectInfo = 0;
+ if (fTrackFilter) {
+ selectInfo = fTrackFilter->IsSelected(esdTrack);
+ }
vV0FromCascade->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
AliAODTrack::kSecondary,
selectInfo)
);
+ aodRefs->AddAt(aodTrack, posFromV0);
+
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
aodTrack->SetFlags(esdTrack->GetStatus());
esdTrack->GetXYZ(pos);
esdTrack->GetCovarianceXYZPxPyPz(covTr);
esdTrack->GetESDpid(pid);
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
+ UInt_t selectInfo = 0;
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
vV0FromCascade->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
AliAODTrack::kSecondary,
selectInfo)
);
+ aodRefs->AddAt(aodTrack, negFromV0);
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
esdTrack->GetXYZ(pos);
esdTrack->GetCovarianceXYZPxPyPz(covTr);
esdTrack->GetESDpid(pid);
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
+ UInt_t selectInfo = 0;
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
vcascade->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
AliAODTrack::kSecondary,
selectInfo)
);
+ aodRefs->AddAt(aodTrack, bachelor);
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
aodTrack->SetFlags(esdTrack->GetStatus());
// Add the primary track of the cascade (if any)
} // end of the loop on cascades
-
+
+ //
// V0s
+ //
for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
if (usedV0[nV0]) continue; // skip if already added to the AOD
AliESDv0 *v0 = esd->GetV0(nV0);
+ Int_t posFromV0 = v0->GetPindex();
+ Int_t negFromV0 = v0->GetNindex();
+ if (posFromV0 < 0 || negFromV0 < 0) continue;
+
+ // V0 selection
+ //
+ AliESDVertex *esdVtx = new AliESDVertex(*(esd->GetPrimaryVertex()));
+ AliESDtrack *esdV0Pos = esd->GetTrack(posFromV0);
+ AliESDtrack *esdV0Neg = esd->GetTrack(negFromV0);
+ TList v0objects;
+ v0objects.AddAt(v0, 0);
+ v0objects.AddAt(esdV0Pos, 1);
+ v0objects.AddAt(esdV0Neg, 2);
+ v0objects.AddAt(esdVtx, 3);
+ UInt_t selectV0 = 0;
+ if (fV0Filter) {
+ selectV0 = fV0Filter->IsSelected(&v0objects);
+ // this is a little awkward but otherwise the
+ // list wants to access the pointer again when going out of scope
+ delete v0objects.RemoveAt(3);
+ if (!selectV0)
+ continue;
+ }
+ else{
+ delete v0objects.RemoveAt(3);
+ }
+
v0->GetXYZ(pos[0], pos[1], pos[2]);
if (!old) {
AliAODVertex::kV0);
primary->AddDaughter(vV0);
- Int_t posFromV0 = v0->GetPindex();
- Int_t negFromV0 = v0->GetNindex();
Float_t dcaPosToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
Float_t dcaNegToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
// Add the positive tracks from the V0
- if (posFromV0>-1){
- AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
- esdTrack->GetPxPyPz(p_pos);
- esdTrack->GetXYZ(pos);
- esdTrack->GetCovarianceXYZPxPyPz(covTr);
- esdTrack->GetESDpid(pid);
- esdTrack->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
- if (!usedTrack[posFromV0]) {
+
+ esdV0Pos->GetPxPyPz(p_pos);
+ esdV0Pos->GetXYZ(pos);
+ esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
+ esdV0Pos->GetESDpid(pid);
+ esdV0Pos->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
+ if (!usedTrack[posFromV0]) {
usedTrack[posFromV0] = kTRUE;
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
- aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
+ UInt_t selectInfo = 0;
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
+ aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),
+ esdV0Pos->GetLabel(),
p_pos,
kTRUE,
pos,
kFALSE,
covTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
+ (Short_t)esdV0Pos->GetSign(),
+ esdV0Pos->GetITSClusterMap(),
pid,
vV0,
kTRUE, // check if this is right
kFALSE, // check if this is right
AliAODTrack::kSecondary,
selectInfo);
- v0DaughterTracks->AddAt(aodTrack,posFromV0);
+ aodRefs->AddAt(aodTrack,posFromV0);
// if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
- if (esdTrack->GetSign() > 0) nPosTracks++;
+ if (esdV0Pos->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
- aodTrack->SetFlags(esdTrack->GetStatus());
- SetAODPID(esdTrack,aodTrack,detpid,timezero);
- }
- else {
- aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(posFromV0));
+ aodTrack->SetFlags(esdV0Pos->GetStatus());
+ SetAODPID(esdV0Pos,aodTrack,detpid,timezero);
+ }
+ else {
+ aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(posFromV0));
// if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
- }
- vV0->AddDaughter(aodTrack);
}
-
+ vV0->AddDaughter(aodTrack);
+
// Add the negative tracks from the V0
- if (negFromV0>-1){
- AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
- esdTrack->GetPxPyPz(p_neg);
- esdTrack->GetXYZ(pos);
- esdTrack->GetCovarianceXYZPxPyPz(covTr);
- esdTrack->GetESDpid(pid);
- esdTrack->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
-
- if (!usedTrack[negFromV0]) {
+ esdV0Neg->GetPxPyPz(p_neg);
+ esdV0Neg->GetXYZ(pos);
+ esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
+ esdV0Neg->GetESDpid(pid);
+ esdV0Neg->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
+
+ if (!usedTrack[negFromV0]) {
usedTrack[negFromV0] = kTRUE;
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
- aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
+ UInt_t selectInfo = 0;
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
+ aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),
+ esdV0Neg->GetLabel(),
p_neg,
kTRUE,
pos,
kFALSE,
covTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
+ (Short_t)esdV0Neg->GetSign(),
+ esdV0Neg->GetITSClusterMap(),
pid,
vV0,
kTRUE, // check if this is right
kFALSE, // check if this is right
AliAODTrack::kSecondary,
selectInfo);
-
- v0DaughterTracks->AddAt(aodTrack,negFromV0);
+
+ aodRefs->AddAt(aodTrack,negFromV0);
// if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
- if (esdTrack->GetSign() > 0) nPosTracks++;
+ if (esdV0Neg->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
- aodTrack->SetFlags(esdTrack->GetStatus());
- SetAODPID(esdTrack,aodTrack,detpid,timezero);
- }
- else {
- aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(negFromV0));
+ aodTrack->SetFlags(esdV0Neg->GetStatus());
+ SetAODPID(esdV0Neg,aodTrack,detpid,timezero);
+ }
+ else {
+ aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(negFromV0));
// if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
- }
- vV0->AddDaughter(aodTrack);
}
- dcaDaughterToPrimVertex[0] =
- TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
- +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
+ vV0->AddDaughter(aodTrack);
+ dcaDaughterToPrimVertex[0] =
+ TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
+ +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
dcaDaughterToPrimVertex[1] =
- TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
- +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
+ TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
+ +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
// add it to the V0 array as well
aodV0 = new(V0s[jV0s++])
- AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos_atv0, p_neg_atv0, dcaDaughterToPrimVertex); // to be refined
+ AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos_atv0, p_neg_atv0, dcaDaughterToPrimVertex); // to be refined
// set the aod v0 on-the-fly status
aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
-// if (fDebug > 0)
-// printf("-------------------Bo: In the v0 loop: onFlyStatus=%d,dcaV0Daughters=%.3f dcaV0ToPrimVertex=%.3f dcaDaughterToPrimVertex=[%.3f,%.3f]\n",
-// aodV0->GetOnFlyStatus(), aodV0->DcaV0Daughters(), aodV0->DcaV0ToPrimVertex(),
-// aodV0->DcaPosToPrimVertex(),aodV0->DcaNegToPrimVertex());
}
V0s.Expand(jV0s);
// end of the loop on V0s
continue;
}
- // Add the mother track
+ // Add the mother track if it passed primary track selection cuts
AliAODTrack * mother = NULL;
+ UInt_t selectInfo = 0;
+ if (fTrackFilter) {
+ selectInfo = fTrackFilter->IsSelected(esd->GetTrack(imother));
+ if (!selectInfo) continue;
+ }
+
if (!usedTrack[imother]) {
usedTrack[imother] = kTRUE;
esdTrackM->GetXYZ(pos);
esdTrackM->GetCovarianceXYZPxPyPz(covTr);
esdTrackM->GetESDpid(pid);
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrackM);
+
mother =
new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
esdTrackM->GetLabel(),
kTRUE, // check if this is right
AliAODTrack::kPrimary,
selectInfo);
+ aodRefs->AddAt(mother, imother);
+
if (esdTrackM->GetSign() > 0) nPosTracks++;
mother->SetFlags(esdTrackM->GetStatus());
mother->ConvertAliPIDtoAODPID();
esdTrackD->GetXYZ(pos);
esdTrackD->GetCovarianceXYZPxPyPz(covTr);
esdTrackD->GetESDpid(pid);
- UInt_t selectInfo = fTrackFilter->IsSelected(esdTrackD);
+ selectInfo = 0;
+ if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
daughter =
new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
esdTrackD->GetLabel(),
kTRUE, // check if this is right
AliAODTrack::kSecondary,
selectInfo);
-
+
+ aodRefs->AddAt(daughter, idaughter);
+
if (esdTrackD->GetSign() > 0) nPosTracks++;
daughter->SetFlags(esdTrackD->GetStatus());
daughter->ConvertAliPIDtoAODPID();
esdTrack->GetCovarianceXYZPxPyPz(covTr);
esdTrack->GetESDpid(pid);
- Float_t impactXY, impactZ;
-
- esdTrack->GetImpactParameters(impactXY,impactZ);
-
- if (impactXY<3) {
- // track inside the beam pipe
- primary->AddDaughter(aodTrack =
- new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
- p,
- kTRUE,
- pos,
- kFALSE,
- covTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
- pid,
- primary,
- kTRUE, // check if this is right
- kTRUE, // check if this is right
- AliAODTrack::kPrimary,
- selectInfo)
- );
- if (esdTrack->GetSign() > 0) nPosTracks++;
- aodTrack->SetFlags(esdTrack->GetStatus());
- aodTrack->ConvertAliPIDtoAODPID();
- SetAODPID(esdTrack,aodTrack,detpid,timezero);
- }
- else {
- // outside the beam pipe: orphan track
- // Don't write them anymore!
- continue;
- /*
- aodTrack =
- new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
- esdTrack->GetLabel(),
- p,
- kTRUE,
- pos,
- kFALSE,
- covTr,
- (Short_t)esdTrack->GetSign(),
- esdTrack->GetITSClusterMap(),
- pid,
- NULL,
- kFALSE, // check if this is right
- kFALSE, // check if this is right
- AliAODTrack::kOrphan,
- selectInfo);
- if (esdTrack->GetSign() > 0) nPosTracks++;
- aodTrack->SetFlags(esdTrack->GetStatus());
- aodTrack->ConvertAliPIDtoAODPID();
- */
- }
+ primary->AddDaughter(aodTrack =
+ new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
+ esdTrack->GetLabel(),
+ p,
+ kTRUE,
+ pos,
+ kFALSE,
+ covTr,
+ (Short_t)esdTrack->GetSign(),
+ esdTrack->GetITSClusterMap(),
+ pid,
+ primary,
+ kTRUE, // check if this is right
+ kTRUE, // check if this is right
+ AliAODTrack::kPrimary,
+ selectInfo)
+ );
+ aodRefs->AddAt(aodTrack, nTrack);
+
+ if (esdTrack->GetSign() > 0) nPosTracks++;
+ aodTrack->SetFlags(esdTrack->GetStatus());
+ aodTrack->ConvertAliPIDtoAODPID();
+ SetAODPID(esdTrack,aodTrack,detpid,timezero);
} // end of loop on tracks
// Update number of AOD tracks in header at the end of track loop (M.G.)
TArrayI* matchedT = cluster->GetTracksMatched();
if (matchedT && cluster->GetTrackMatched() >= 0) {
for (Int_t im = 0; im < matchedT->GetSize(); im++) {
- caloCluster->AddTrackMatched((esd->GetTrack(im)));
+ Int_t iESDtrack = matchedT->At(im);;
+ if (aodRefs->At(iESDtrack) != 0) {
+ caloCluster->AddTrackMatched((AliAODTrack*)aodRefs->At(iESDtrack));
+ }
}
}
-
+
}
caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
// end of loop on calo clusters
delete [] usedTrack;
delete [] usedV0;
delete [] usedKink;
- delete v0DaughterTracks;
+ delete aodRefs;
return;
}
+
void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
{
//
aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
}
+
void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
{
// Terminate analysis