#include "AliAnalysisTaskESDfilter.h"\r
#include "AliAnalysisManager.h"\r
#include "AliESDEvent.h"\r
+#include "AliESDRun.h"\r
#include "AliStack.h"\r
#include "AliAODEvent.h"\r
#include "AliMCEvent.h"\r
fV0Filter(0x0),\r
fCascadeFilter(0x0),\r
fHighPthreshold(0),\r
- fPtshape(0x0)\r
+ fPtshape(0x0),\r
+ fEnableFillAOD(kTRUE)\r
{\r
// Default constructor\r
}\r
fV0Filter(0x0),\r
fCascadeFilter(0x0),\r
fHighPthreshold(0),\r
- fPtshape(0x0)\r
+ fPtshape(0x0),\r
+ fEnableFillAOD(kTRUE)\r
{\r
// Constructor\r
}\r
\r
void AliAnalysisTaskESDfilter::UserCreateOutputObjects()\r
{\r
-// Create the output container\r
+ //\r
+ // Create Output Objects conenct filter to outputtree\r
+ // \r
+ if(OutputTree()){\r
OutputTree()->GetUserInfo()->Add(fTrackFilter);\r
+ }\r
+ else{\r
+ AliError("No OutputTree() for adding the track filter");\r
+ }\r
}\r
\r
void AliAnalysisTaskESDfilter::Init()\r
//\r
\r
Long64_t ientry = Entry();\r
- if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);\r
- if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");\r
- if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");\r
+ \r
+ if (fDebug > 0) {\r
+ printf("Filter: Analysing event # %5d\n", (Int_t) ientry);\r
+ if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");\r
+ if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");\r
+ }\r
+ // Filters must explicitely enable AOD filling in their UserExec (AG)\r
+ if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) AliFatal("Cannot run ESD filter without an output event handler");\r
+ if(fEnableFillAOD) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);\r
\r
ConvertESDtoAOD();\r
}\r
\r
\r
// loop over events and fill them\r
- \r
// Multiplicity information needed by the header (to be revised!)\r
Int_t nTracks = esd->GetNumberOfTracks();\r
+ for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);\r
+\r
// if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);\r
\r
Int_t nPosTracks = 0;\r
-// for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) \r
-// if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;\r
\r
// Update the header\r
\r
AliAODHeader* header = AODEvent()->GetHeader();\r
-\r
+ \r
header->SetRunNumber(esd->GetRunNumber());\r
+ header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection\r
if (old) {\r
header->SetBunchCrossNumber(0);\r
header->SetOrbitNumber(0);\r
header->SetPeriodNumber(0);\r
header->SetEventType(0);\r
- header->SetMuonMagFieldScale(-999.); // FIXME\r
- header->SetCentrality(-999.); // FIXME\r
+ header->SetMuonMagFieldScale(-999.);\r
+ header->SetCentrality(-999.); \r
} else {\r
header->SetBunchCrossNumber(esd->GetBunchCrossNumber());\r
header->SetOrbitNumber(esd->GetOrbitNumber());\r
header->SetEventType(esd->GetEventType());\r
header->SetCentrality(-999.); // FIXME\r
}\r
- \r
+ // Trigger\r
+ header->SetFiredTriggerClasses(esd->GetFiredTriggerClasses());\r
header->SetTriggerMask(esd->GetTriggerMask()); \r
header->SetTriggerCluster(esd->GetTriggerCluster());\r
+ \r
+\r
header->SetMagneticField(esd->GetMagneticField());\r
header->SetMuonMagFieldScale(esd->GetCurrentDip()/6000.);\r
header->SetZDCN1Energy(esd->GetZDCN1Energy());\r
header->SetZDCN2Energy(esd->GetZDCN2Energy());\r
header->SetZDCP2Energy(esd->GetZDCP2Energy());\r
header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));\r
+\r
+ \r
Float_t diamxy[2]={esd->GetDiamondX(),esd->GetDiamondY()};\r
Float_t diamcov[3]; esd->GetDiamondCovXY(diamcov);\r
header->SetDiamond(diamxy,diamcov);\r
+ header->SetDiamondZ(esd->GetDiamondZ(),esd->GetSigma2DiamondZ());\r
//\r
//\r
Int_t nV0s = esd->GetNumberOfV0s();\r
Int_t nCascades = esd->GetNumberOfCascades();\r
Int_t nKinks = esd->GetNumberOfKinks();\r
Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;\r
+ Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex\r
+ Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();\r
+ nVertices+=nPileSPDVertices;\r
+ nVertices+=nPileTrkVertices;\r
Int_t nJets = 0;\r
Int_t nCaloClus = esd->GetNumberOfCaloClusters();\r
Int_t nFmdClus = 0;\r
primary->SetName(vtx->GetName());\r
primary->SetTitle(vtx->GetTitle());\r
\r
+ TString vtitle = vtx->GetTitle();\r
+ if (!vtitle.Contains("VertexerTracks")) \r
+ primary->SetNContributors(vtx->GetNContributors());\r
+\r
if (fDebug > 0) primary->Print();\r
\r
+\r
+ // Add SPD "main" vertex \r
+ const AliESDVertex *vtxS = esd->GetPrimaryVertexSPD();\r
+ vtxS->GetXYZ(pos); // position\r
+ vtxS->GetCovMatrix(covVtx); //covariance matrix\r
+ AliAODVertex * mVSPD = new(vertices[jVertices++])\r
+ AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);\r
+ mVSPD->SetName(vtxS->GetName());\r
+ mVSPD->SetTitle(vtxS->GetTitle());\r
+ mVSPD->SetNContributors(vtxS->GetNContributors()); \r
+\r
+ // Add SPD pileup vertices\r
+ for(Int_t iV=0; iV<nPileSPDVertices-1; iV++){\r
+ const AliESDVertex *vtxP = esd->GetPileupVertexSPD(iV);\r
+ vtxP->GetXYZ(pos); // position\r
+ vtxP->GetCovMatrix(covVtx); //covariance matrix\r
+ AliAODVertex * pVSPD = new(vertices[jVertices++])\r
+ AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);\r
+ pVSPD->SetName(vtxP->GetName());\r
+ pVSPD->SetTitle(vtxP->GetTitle());\r
+ pVSPD->SetNContributors(vtxP->GetNContributors()); \r
+ }\r
+\r
+ // Add TRK pileup vertices\r
+ for(Int_t iV=0; iV<nPileTrkVertices; iV++){\r
+ const AliESDVertex *vtxP = esd->GetPileupVertexTracks(iV);\r
+ vtxP->GetXYZ(pos); // position\r
+ vtxP->GetCovMatrix(covVtx); //covariance matrix\r
+ AliAODVertex * pVTRK = new(vertices[jVertices++])\r
+ AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);\r
+ pVTRK->SetName(vtxP->GetName());\r
+ pVTRK->SetTitle(vtxP->GetTitle());\r
+ pVTRK->SetNContributors(vtxP->GetNContributors());\r
+ }\r
+\r
// Create vertices starting from the most complex objects\r
Double_t chi2 = 0.;\r
\r
vtx->UsesTrack(esdCascadeBach->GetID()),\r
AliAODTrack::kSecondary,\r
selectInfo);\r
+ aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));\r
aodTrackRefs->AddAt(aodTrack,idxBachFromCascade);\r
- \r
+ \r
if (esdCascadeBach->GetSign() > 0) nPosTracks++;\r
aodTrack->ConvertAliPIDtoAODPID();\r
aodTrack->SetFlags(esdCascadeBach->GetStatus());\r
vtx->UsesTrack(esdCascadePos->GetID()),\r
AliAODTrack::kSecondary,\r
selectInfo);\r
+ aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));\r
aodTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);\r
- \r
+\r
if (esdCascadePos->GetSign() > 0) nPosTracks++;\r
aodTrack->ConvertAliPIDtoAODPID();\r
aodTrack->SetFlags(esdCascadePos->GetStatus());\r
vtx->UsesTrack(esdCascadeNeg->GetID()),\r
AliAODTrack::kSecondary,\r
selectInfo);\r
- \r
+ aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));\r
aodTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);\r
\r
if (esdCascadeNeg->GetSign() > 0) nPosTracks++;\r
vtx->UsesTrack(esdV0Pos->GetID()),\r
AliAODTrack::kSecondary,\r
selectInfo);\r
+ aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));\r
aodTrackRefs->AddAt(aodTrack,posFromV0);\r
// if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());\r
if (esdV0Pos->GetSign() > 0) nPosTracks++;\r
vtx->UsesTrack(esdV0Neg->GetID()),\r
AliAODTrack::kSecondary,\r
selectInfo);\r
+ aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));\r
\r
aodTrackRefs->AddAt(aodTrack,negFromV0);\r
// if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());\r
vtx->UsesTrack(esdTrack->GetID()),\r
AliAODTrack::kPrimary,\r
selectInfo);\r
+ mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());\r
+ mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());\r
+ mother->SetChi2perNDF(Chi2perNDF(esdTrackM));\r
+\r
aodTrackRefs->AddAt(mother, imother);\r
\r
if (esdTrackM->GetSign() > 0) nPosTracks++;\r
vtx->UsesTrack(esdTrack->GetID()),\r
AliAODTrack::kSecondary,\r
selectInfo);\r
- \r
+ daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());\r
+ daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());\r
aodTrackRefs->AddAt(daughter, idaughter);\r
\r
if (esdTrackD->GetSign() > 0) nPosTracks++;\r
AliAODTrack::kPrimary, \r
selectInfo)\r
);\r
+ aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());\r
+ aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());\r
+ aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));\r
+\r
aodTrackRefs->AddAt(aodTrack, nTrack);\r
+\r
\r
if (esdTrack->GetSign() > 0) nPosTracks++;\r
aodTrack->SetFlags(esdTrack->GetStatus());\r
\r
AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);\r
\r
- Int_t id = cluster->GetID();\r
- Int_t nLabel = cluster->GetNLabels();\r
- TArrayI* labels = cluster->GetLabels();\r
- Int_t *label = 0;\r
- if (labels){\r
- label = (cluster->GetLabels())->GetArray();\r
- for(int i = 0;i < labels->GetSize();++i){\r
- if(mcH)mcH->SelectParticle(label[i]);\r
- }\r
- } \r
+ Int_t id = cluster->GetID();\r
+ Int_t nLabel = cluster->GetNLabels();\r
+ Int_t *labels = cluster->GetLabels();\r
+ if(labels){ \r
+ for(int i = 0;i < nLabel;++i){\r
+ if(mcH)mcH->SelectParticle(labels[i]);\r
+ }\r
+ } \r
\r
Float_t energy = cluster->E();\r
cluster->GetPosition(posF);\r
- Char_t ttype = AliAODCluster::kUndef; \r
-\r
- if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {\r
- ttype=AliAODCluster::kPHOSNeutral;\r
- } \r
- else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {\r
- ttype = AliAODCluster::kEMCALClusterv1;\r
- }\r
\r
- \r
AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,\r
nLabel,\r
- label,\r
+ labels,\r
energy,\r
posF,\r
NULL,\r
- ttype);\r
+ cluster->GetType(),0);\r
\r
caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),\r
- cluster->GetClusterDisp(),\r
+ cluster->GetDispersion(),\r
cluster->GetM20(), cluster->GetM02(),\r
cluster->GetEmcCpvDistance(), \r
cluster->GetNExMax(),cluster->GetTOF()) ;\r
\r
- caloCluster->SetPIDFromESD(cluster->GetPid());\r
+ caloCluster->SetPIDFromESD(cluster->GetPID());\r
caloCluster->SetNCells(cluster->GetNCells());\r
caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());\r
caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());\r
\r
TArrayI* matchedT = cluster->GetTracksMatched();\r
- if (nTracks>0 && matchedT && cluster->GetTrackMatched() >= 0) { \r
+ if (nTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) { \r
for (Int_t im = 0; im < matchedT->GetSize(); im++) {\r
Int_t iESDtrack = matchedT->At(im);;\r
if (aodTrackRefs->At(iESDtrack) != 0) {\r
\r
AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());\r
aodEMcells.CreateContainer(nEMcell);\r
- aodEMcells.SetType(AliAODCaloCells::kEMCAL);\r
+ aodEMcells.SetType(AliAODCaloCells::kEMCALCell);\r
for (Int_t iCell = 0; iCell < nEMcell; iCell++) { \r
aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));\r
}\r
\r
AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());\r
aodPHcells.CreateContainer(nPHcell);\r
- aodPHcells.SetType(AliAODCaloCells::kPHOS);\r
+ aodPHcells.SetType(AliAODCaloCells::kPHOSCell);\r
for (Int_t iCell = 0; iCell < nPHcell; iCell++) { \r
aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));\r
}\r
// Save PID object for candidate electrons\r
Bool_t pidSave = kFALSE;\r
if (fTrackFilter) {\r
- Bool_t selectInfo = fTrackFilter->IsSelected("Electrons");\r
+ Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");\r
if (selectInfo) pidSave = kTRUE;\r
}\r
\r
}// end else\r
\r
if (pidSave) {\r
+ if(!aodtrack->GetDetPid()){// prevent memory leak when calling SetAODPID twice for the same track\r
detpid = new AliAODPid();\r
SetDetectorRawSignals(detpid,esdtrack,timezero, bfield);\r
aodtrack->SetDetPID(detpid);\r
+ }\r
}\r
}\r
\r
AliInfo("no ESD track found. .....exiting");\r
return;\r
}\r
+ // TPC momentum\r
+ const AliExternalTrackParam *in=track->GetInnerParam();\r
+ if (in) {\r
+ aodpid->SetTPCmomentum(in->GetP());\r
+ }else{\r
+ aodpid->SetTPCmomentum(-1.);\r
+ }\r
+\r
\r
aodpid->SetITSsignal(track->GetITSsignal());\r
aodpid->SetTPCsignal(track->GetTPCsignal());\r
- //n TRD planes = 6\r
\r
+ //n TRD planes = 6\r
Int_t nslices = track->GetNumberOfTRDslices()*6;\r
Double_t *trdslices = new Double_t[nslices];\r
for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {\r
- for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);\r
- }\r
-\r
+ for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);\r
+ }\r
+ \r
+//TRD momentum\r
+ for(Int_t iPl=0;iPl<6;iPl++){\r
+ Double_t trdmom=track->GetTRDmomentum(iPl);\r
+ aodpid->SetTRDmomentum(iPl,trdmom);\r
+ }\r
\r
aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);\r
Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);\r
\r
}\r
\r
+Double_t AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)\r
+{\r
+ // Calculate chi2 per ndf for track\r
+ Int_t nClustersTPC = track->GetTPCNcls();\r
+\r
+ if ( nClustersTPC > 5) {\r
+ return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));\r
+ } else {\r
+ return (-1.);\r
+ }\r
+ }\r
+\r
+\r
+\r
void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)\r
{\r
// Terminate analysis\r