#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
\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
+ \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
+ \r
ConvertESDtoAOD();\r
}\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
// 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
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