/* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
#include <TChain.h>
+#include <TTree.h>
#include <TList.h>
-#include <TFile.h>
#include <TArrayI.h>
#include <TRandom.h>
+#include <TParticle.h>
#include "AliAnalysisTaskESDfilter.h"
#include "AliAnalysisManager.h"
#include "AliESDEvent.h"
+#include "AliStack.h"
#include "AliAODEvent.h"
+#include "AliMCEvent.h"
+#include "AliMCEventHandler.h"
#include "AliESDInputHandler.h"
#include "AliAODHandler.h"
+#include "AliAODMCParticle.h"
#include "AliAnalysisFilter.h"
#include "AliESDMuonTrack.h"
#include "AliESDVertex.h"
fKinkFilter(0x0),
fV0Filter(0x0),
fHighPthreshold(0),
- fPtshape(0x0)
+ fPtshape(0x0)
{
// Default constructor
}
if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
+
ConvertESDtoAOD();
}
void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
// ESD Filter analysis task executed for each event
+
AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
AliESD* old = esd->GetAliESDOld();
-
+
+ // Fetch Stack for debuggging if available
+ AliStack *pStack = 0;
+ AliMCEventHandler *mcH = 0;
+ if(MCEvent()){
+ pStack = MCEvent()->Stack();
+ mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
+ }
// set arrays and pointers
Float_t posF[3];
Double_t pos[3];
for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
- // loop over events and fill them
-
- // Multiplicity information needed by the header (to be revised!)
+ // loop over events and fill them
+
+ // Multiplicity information needed by the header (to be revised!)
Int_t nTracks = esd->GetNumberOfTracks();
// if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);
header->SetZDCN2Energy(esd->GetZDCN2Energy());
header->SetZDCP2Energy(esd->GetZDCP2Energy());
header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
+ Float_t diamxy[2]={esd->GetDiamondX(),esd->GetDiamondY()};
+ Float_t diamcov[3]; esd->GetDiamondCovXY(diamcov);
+ header->SetDiamond(diamxy,diamcov);
//
//
Int_t nV0s = esd->GetNumberOfV0s();
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;
AliAODVertex * primary = new(vertices[jVertices++])
AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
+ primary->SetName(vtx->GetName());
+ primary->SetTitle(vtx->GetTitle());
+
if (fDebug > 0) primary->Print();
// Create vertices starting from the most complex objects
selectInfo = fTrackFilter->IsSelected(esdTrack);
}
+ if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
vV0FromCascade->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
esdTrack->GetLabel(),
pid,
vV0FromCascade,
kTRUE, // check if this is right
- kFALSE, // check if this is right
+ vtx->UsesTrack(esdTrack->GetID()),
AliAODTrack::kSecondary,
selectInfo)
);
+ aodRefs->AddAt(aodTrack, posFromV0);
+
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
aodTrack->SetFlags(esdTrack->GetStatus());
esdTrack->GetESDpid(pid);
UInt_t selectInfo = 0;
if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
-
+ if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
vV0FromCascade->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
esdTrack->GetLabel(),
pid,
vV0FromCascade,
kTRUE, // check if this is right
- kFALSE, // check if this is right
+ vtx->UsesTrack(esdTrack->GetID()),
AliAODTrack::kSecondary,
selectInfo)
);
+ aodRefs->AddAt(aodTrack, negFromV0);
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
esdTrack->GetESDpid(pid);
UInt_t selectInfo = 0;
if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
-
+
+ if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
vcascade->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
esdTrack->GetLabel(),
pid,
vcascade,
kTRUE, // check if this is right
- kFALSE, // check if this is right
+ vtx->UsesTrack(esdTrack->GetID()),
AliAODTrack::kSecondary,
selectInfo)
);
+ aodRefs->AddAt(aodTrack, bachelor);
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
aodTrack->SetFlags(esdTrack->GetStatus());
// V0 selection
//
AliESDVertex *esdVtx = new AliESDVertex(*(esd->GetPrimaryVertex()));
-
AliESDtrack *esdV0Pos = esd->GetTrack(posFromV0);
AliESDtrack *esdV0Neg = esd->GetTrack(negFromV0);
TList v0objects;
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);
+ // list wants to access the pointer (delete it)
+ // again when going out of scope
+ delete v0objects.RemoveAt(3); // esdVtx created via copy construct
+ esdVtx = 0;
if (!selectV0)
continue;
}
else{
- delete v0objects.RemoveAt(3);
+ delete v0objects.RemoveAt(3); // esdVtx created via copy construct
+ esdVtx = 0;
}
v0->GetXYZ(pos[0], pos[1], pos[2]);
Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
- Double_t dcaV0ToPrimVertex = v0->GetD();
-
+ Double_t dcaV0ToPrimVertex = v0->GetD(esd->GetPrimaryVertex()->GetX(),esd->GetPrimaryVertex()->GetY(),esd->GetPrimaryVertex()->GetZ());
v0->GetPPxPyPz(p_pos_atv0[0],p_pos_atv0[1],p_pos_atv0[2]);
v0->GetNPxPyPz(p_neg_atv0[0],p_neg_atv0[1],p_neg_atv0[2]);
usedTrack[posFromV0] = kTRUE;
UInt_t selectInfo = 0;
if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
+ if(mcH)mcH->SelectParticle(esdV0Pos->GetLabel());
aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),
esdV0Pos->GetLabel(),
p_pos,
pid,
vV0,
kTRUE, // check if this is right
- kFALSE, // check if this is right
+ vtx->UsesTrack(esdV0Pos->GetID()),
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 (esdV0Pos->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
SetAODPID(esdV0Pos,aodTrack,detpid,timezero);
}
else {
- aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(posFromV0));
+ aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(posFromV0));
// if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
}
vV0->AddDaughter(aodTrack);
usedTrack[negFromV0] = kTRUE;
UInt_t selectInfo = 0;
if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
+ if(mcH)mcH->SelectParticle(esdV0Neg->GetLabel());
aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),
esdV0Neg->GetLabel(),
p_neg,
pid,
vV0,
kTRUE, // check if this is right
- kFALSE, // check if this is right
+ vtx->UsesTrack(esdV0Neg->GetID()),
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 (esdV0Neg->GetSign() > 0) nPosTracks++;
aodTrack->ConvertAliPIDtoAODPID();
SetAODPID(esdV0Neg,aodTrack,detpid,timezero);
}
else {
- aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(negFromV0));
+ aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(negFromV0));
// if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
}
vV0->AddDaughter(aodTrack);
esdTrackM->GetXYZ(pos);
esdTrackM->GetCovarianceXYZPxPyPz(covTr);
esdTrackM->GetESDpid(pid);
-
+ if(mcH)mcH->SelectParticle(esdTrackM->GetLabel());
mother =
new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
esdTrackM->GetLabel(),
pid,
primary,
kTRUE, // check if this is right
- kTRUE, // check if this is right
+ vtx->UsesTrack(esdTrack->GetID()),
AliAODTrack::kPrimary,
selectInfo);
+ aodRefs->AddAt(mother, imother);
+
if (esdTrackM->GetSign() > 0) nPosTracks++;
mother->SetFlags(esdTrackM->GetStatus());
mother->ConvertAliPIDtoAODPID();
esdTrackD->GetESDpid(pid);
selectInfo = 0;
if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
+ if(mcH)mcH->SelectParticle(esdTrackD->GetLabel());
daughter =
new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
esdTrackD->GetLabel(),
pid,
vkink,
kTRUE, // check if this is right
- kTRUE, // check if this is right
+ vtx->UsesTrack(esdTrack->GetID()),
AliAODTrack::kSecondary,
selectInfo);
-
+
+ aodRefs->AddAt(daughter, idaughter);
+
if (esdTrackD->GetSign() > 0) nPosTracks++;
daughter->SetFlags(esdTrackD->GetStatus());
daughter->ConvertAliPIDtoAODPID();
// Track selection
if (fTrackFilter) {
selectInfo = fTrackFilter->IsSelected(esdTrack);
- if (!selectInfo) continue;
+ if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
}
//
esdTrack->GetXYZ(pos);
esdTrack->GetCovarianceXYZPxPyPz(covTr);
esdTrack->GetESDpid(pid);
-
-
+ if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
primary->AddDaughter(aodTrack =
new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
esdTrack->GetLabel(),
pid,
primary,
kTRUE, // check if this is right
- kTRUE, // check if this is right
+ vtx->UsesTrack(esdTrack->GetID()),
AliAODTrack::kPrimary,
selectInfo)
- );
+ );
+ aodRefs->AddAt(aodTrack, nTrack);
+
if (esdTrack->GetSign() > 0) nPosTracks++;
aodTrack->SetFlags(esdTrack->GetStatus());
aodTrack->ConvertAliPIDtoAODPID();
Int_t nLabel = cluster->GetNLabels();
TArrayI* labels = cluster->GetLabels();
Int_t *label = 0;
- if (labels) label = (cluster->GetLabels())->GetArray();
+ if (labels){
+ label = (cluster->GetLabels())->GetArray();
+ for(int i = 0;i < labels->GetSize();++i){
+ if(mcH)mcH->SelectParticle(label[i]);
+ }
+ }
Float_t energy = cluster->E();
cluster->GetPosition(posF);
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
SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
- SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
+ if(mcH){
+ mcH->SelectParticle(mult->GetLabel(n, 0));
+ mcH->SelectParticle(mult->GetLabel(n, 1));
+ }
+ SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
}
}
} else {
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
if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
}
+void AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label){
+ if(!pStack)return;
+ label = TMath::Abs(label);
+ TParticle *part = pStack->Particle(label);
+ Printf("########################");
+ Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
+ part->Print();
+ TParticle* mother = part;
+ Int_t imo = part->GetFirstMother();
+ Int_t nprim = pStack->GetNprimary();
+ // while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
+ while((imo >= nprim)) {
+ mother = pStack->Particle(imo);
+ Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
+ mother->Print();
+ imo = mother->GetFirstMother();
+ }
+ Printf("########################");
+}