#include "AliESDZDC.h"
#include "AliESDtrackCuts.h"
+#include "AliHelperPID.h"
////////////////////////////////////////////////////////////////////////
//
fSkipTrigger(kFALSE),
fInjectedSignals(kFALSE),
// pointers to UE classes
+fHelperPID(0x0),
fAnalyseUE(0x0),
fHistos(0x0),
fHistosMixed(0),
-fEfficiencyCorrection(0),
-fCorrectTriggers(kFALSE),
+fEfficiencyCorrectionTriggers(0),
+fEfficiencyCorrectionAssociated(0),
// handlers and events
fAOD(0x0),
fESD(0x0),
fOnlyOneEtaSide(0),
fPtMin(0.5),
fFilterBit(0xFF),
+fTrackStatus(0),
fSelectBit(AliVEvent::kMB|AliVEvent::kUserDefined),
fUseChargeHadrons(kFALSE),
-fSelectParticleSpecies(-1),
+fParticleSpeciesTrigger(-1),
+fParticleSpeciesAssociated(-1),
fSelectCharge(0),
fTriggerSelectCharge(0),
+fAssociatedSelectCharge(0),
fTriggerRestrictEta(-1),
fEtaOrdering(kFALSE),
fCutConversions(kFALSE),
// Initialize class with main algorithms, event and track selection.
fAnalyseUE = new AliAnalyseLeadingTrackUE();
fAnalyseUE->SetParticleSelectionCriteria(fFilterBit, fUseChargeHadrons, fTrackEtaCut, fPtMin);
+ fAnalyseUE->SetTrackStatus(fTrackStatus);
fAnalyseUE->SetDebug(fDebug);
fAnalyseUE->DefineESDCuts(fFilterBit);
fAnalyseUE->SetEventSelection(fSelectBit);
+ fAnalyseUE->SetHelperPID(fHelperPID);
+ if ((fParticleSpeciesTrigger != -1 || fParticleSpeciesAssociated != -1) && !fHelperPID)
+ AliFatal("HelperPID object should be set in the steering macro");
// Initialize output list of containers
if (fListOfHistos != NULL){
fHistos->SetSelectTriggerCharge(fTriggerSelectCharge);
fHistosMixed->SetSelectTriggerCharge(fTriggerSelectCharge);
+
+ fHistos->SetSelectAssociatedCharge(fAssociatedSelectCharge);
+ fHistosMixed->SetSelectAssociatedCharge(fAssociatedSelectCharge);
fHistos->SetTriggerRestrictEta(fTriggerRestrictEta);
fHistosMixed->SetTriggerRestrictEta(fTriggerRestrictEta);
fHistos->SetWeightPerEvent(fWeightPerEvent);
fHistosMixed->SetWeightPerEvent(fWeightPerEvent);
-
- if (fEfficiencyCorrection)
+
+ if (fEfficiencyCorrectionTriggers)
+ {
+ fHistos->SetEfficiencyCorrectionTriggers(fEfficiencyCorrectionTriggers);
+ fHistosMixed->SetEfficiencyCorrectionTriggers((THnF*) fEfficiencyCorrectionTriggers->Clone());
+ }
+ if (fEfficiencyCorrectionAssociated)
{
- fHistos->SetEfficiencyCorrection(fEfficiencyCorrection, fCorrectTriggers);
- fHistosMixed->SetEfficiencyCorrection((THnF*) fEfficiencyCorrection->Clone(), fCorrectTriggers);
+ fHistos->SetEfficiencyCorrectionAssociated(fEfficiencyCorrectionAssociated);
+ fHistosMixed->SetEfficiencyCorrectionAssociated((THnF*) fEfficiencyCorrectionAssociated->Clone());
}
// add histograms to list
fListOfHistos->Add(fHistos);
fListOfHistos->Add(fHistosMixed);
+ // add HelperPID to list
+ if (fHelperPID)
+ fListOfHistos->Add(fHelperPID);
fListOfHistos->Add(new TH2F("trackletsVsV0Cent", ";L1 clusters;v0 centrality", 100, -0.5, 9999.5, 101, 0, 101));
fListOfHistos->Add(new TH2F("processIDs", ";#Delta#phi;process id", 100, -0.5 * TMath::Pi(), 1.5 * TMath::Pi(), kPNoProcess + 1, -0.5, kPNoProcess + 0.5));
settingsTree->Branch("fOnlyOneEtaSide", &fOnlyOneEtaSide,"OnlyOneEtaSide/I");
settingsTree->Branch("fPtMin", &fPtMin, "PtMin/D");
settingsTree->Branch("fFilterBit", &fFilterBit,"FilterBit/I");
+ settingsTree->Branch("fTrackStatus", &fTrackStatus,"TrackStatus/I");
settingsTree->Branch("fSelectBit", &fSelectBit,"EventSelectionBit/I");
settingsTree->Branch("fUseChargeHadrons", &fUseChargeHadrons,"UseChHadrons/O");
- settingsTree->Branch("fSelectParticleSpecies", &fSelectParticleSpecies,"ParticleSpecies/I");
+ settingsTree->Branch("fParticleSpeciesTrigger", &fParticleSpeciesTrigger,"ParticleSpeciesTrigger/I");
+ settingsTree->Branch("fParticleSpeciesAssociated", &fParticleSpeciesAssociated,"ParticleSpeciesAssociated/I");
settingsTree->Branch("fSelectCharge", &fSelectCharge,"SelectCharge/I");
settingsTree->Branch("fTriggerSelectCharge", &fTriggerSelectCharge,"TriggerSelectCharge/I");
+ settingsTree->Branch("fAssociatedSelectCharge", &fAssociatedSelectCharge,"fAssociatedSelectCharge/I");
settingsTree->Branch("fTriggerRestrictEta", &fTriggerRestrictEta,"TriggerRestrictEta/D");
settingsTree->Branch("fEtaOrdering", &fEtaOrdering,"EtaOrdering/O");
settingsTree->Branch("fCutConversions", &fCutConversions,"CutConversions/O");
settingsTree->Branch("fSkipFastCluster", &fSkipFastCluster,"SkipFastCluster/O");
settingsTree->Branch("fWeightPerEvent", &fWeightPerEvent,"WeightPerEvent/O");
//fCustomBinning
- settingsTree->Branch("fCorrectTriggers", &fCorrectTriggers,"CorrectTriggers/O");
settingsTree->Fill();
fListOfHistos->Add(settingsTree);
// Get MC primaries
// triggers
- TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, -1, kTRUE);
+ TObjArray* tmpList = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
CleanUp(tmpList, mc, skipParticlesAbove);
TObjArray* tracksMC = CloneAndReduceTrackList(tmpList);
delete tmpList;
// associated
TObjArray* tracksCorrelateMC = tracksMC;
- if (fSelectParticleSpecies != -1)
+ if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
{
// TODO for MC this uses to PDG of the mother of the particle
- tracksCorrelateMC = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fSelectParticleSpecies, kTRUE);
+ tracksCorrelateMC = fAnalyseUE->GetAcceptedParticles(mc, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
CleanUp(tracksCorrelateMC, mc, skipParticlesAbove);
}
for (Int_t particleSpecies = 0; particleSpecies < 4; particleSpecies++)
{
TObjArray* primMCParticles = fAnalyseUE->GetAcceptedParticles(mc, 0x0, kTRUE, particleSpecies, kTRUE);
- TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE);
- TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE);
+ TObjArray* primRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE, kFALSE);
+ TObjArray* allRecoTracksMatched = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE, kFALSE);
+ TObjArray* primRecoTracksMatchedPID = 0;
+ TObjArray* allRecoTracksMatchedPID = 0;
+
+ if (fHelperPID)
+ {
+ primRecoTracksMatchedPID = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, particleSpecies, kTRUE, kTRUE);
+ allRecoTracksMatchedPID = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, particleSpecies, kTRUE, kTRUE);
+ }
CleanUp(primMCParticles, mc, skipParticlesAbove);
CleanUp(primRecoTracksMatched, mc, skipParticlesAbove);
CleanUp(allRecoTracksMatched, mc, skipParticlesAbove);
+ CleanUp(primRecoTracksMatchedPID, mc, skipParticlesAbove);
+ CleanUp(allRecoTracksMatchedPID, mc, skipParticlesAbove);
+
+ // select charges
+ if (fTriggerSelectCharge != 0)
+ {
+ SelectCharge(primMCParticles);
+ SelectCharge(primRecoTracksMatched);
+ SelectCharge(allRecoTracksMatched);
+ SelectCharge(primRecoTracksMatchedPID);
+ SelectCharge(allRecoTracksMatchedPID);
+ }
- fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, 0, particleSpecies, centrality, zVtx);
+ fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, primRecoTracksMatchedPID, allRecoTracksMatchedPID, 0, particleSpecies, centrality, zVtx);
// Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
CleanUp((TObjArray*) fakeParticles->At(0), mc, skipParticlesAbove);
CleanUp((TObjArray*) fakeParticles->At(1), mc, skipParticlesAbove);
- fHistos->FillTrackingEfficiency(0, 0, 0, (TObjArray*) fakeParticles->At(2), -1, centrality, zVtx);
+ fHistos->FillTrackingEfficiency(0, 0, 0, 0, 0, (TObjArray*) fakeParticles->At(2), 0, centrality, zVtx);
fHistos->FillFakePt(fakeParticles, centrality);
// Printf(">>>>> %d %d %d fakes", ((TObjArray*) fakeParticles->At(0))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(1))->GetEntriesFast(), ((TObjArray*) fakeParticles->At(2))->GetEntriesFast());
delete fakeParticles;
// Get MC primaries that match reconstructed track
// triggers
- TObjArray* tracksRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, -1, kTRUE);
+ TObjArray* tracksRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesTrigger, kTRUE);
CleanUp(tracksRecoMatchedPrim, mc, skipParticlesAbove);
// associated
TObjArray* tracksCorrelateRecoMatchedPrim = tracksRecoMatchedPrim;
- if (fSelectParticleSpecies != -1)
+ if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
{
- tracksCorrelateRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fSelectParticleSpecies, kTRUE);
+ tracksCorrelateRecoMatchedPrim = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kTRUE, fParticleSpeciesAssociated, kTRUE);
CleanUp(tracksCorrelateRecoMatchedPrim, mc, skipParticlesAbove);
}
// Get MC primaries + secondaries that match reconstructed track
// triggers
- TObjArray* tracksRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, -1, kTRUE);
+ TObjArray* tracksRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesTrigger, kTRUE);
CleanUp(tracksRecoMatchedAll, mc, skipParticlesAbove);
// associated
TObjArray* tracksCorrelateRecoMatchedAll = tracksRecoMatchedAll;
- if (fSelectParticleSpecies != -1)
+ if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
{
- tracksCorrelateRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fSelectParticleSpecies, kTRUE);
+ tracksCorrelateRecoMatchedAll = fAnalyseUE->GetAcceptedParticles(inputEvent, mc, kFALSE, fParticleSpeciesAssociated, kTRUE);
CleanUp(tracksCorrelateRecoMatchedAll, mc, skipParticlesAbove);
}
// Get RECO tracks
// triggers
- TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
+ TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
CleanUp(tracks, mc, skipParticlesAbove);
// associated
TObjArray* tracksCorrelate = tracks;
- if (fSelectParticleSpecies != -1)
+ if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
{
- tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fSelectParticleSpecies, kTRUE);
+ tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
CleanUp(tracksCorrelate, mc, skipParticlesAbove);
}
fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, tracksCorrelate, weight, kTRUE, kTRUE, bSign, fTwoTrackEfficiencyCut);
// apply correction efficiency, STEP 10
- if (fEfficiencyCorrection)
+ if (fEfficiencyCorrectionTriggers || fEfficiencyCorrectionAssociated)
{
- // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
+ // with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepCorrected, tracks, tracksCorrelate, weight, kTRUE, twoTrackCut, bSign, fTwoTrackEfficiencyCut, kTRUE);
}
-
+
// mixed event
if (fFillMixed)
{
fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepBiasStudy, tracks, pool2->GetEvent(jMix), 1.0 / pool2->GetCurrentNEvents(), (jMix == 0), kTRUE, bSign, fTwoTrackEfficiencyCut);
// apply correction efficiency, STEP 10
- if (fEfficiencyCorrection)
+ if (fEfficiencyCorrectionTriggers || fEfficiencyCorrectionAssociated)
{
// with or without two track efficiency depending on if fTwoTrackEfficiencyCut is set
Bool_t twoTrackCut = (fTwoTrackEfficiencyCut > 0);
if (centrality < 0 && !fCompareCentralities)
return;
- TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
+ TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesTrigger, kTRUE);
//Printf("Accepted %d tracks", tracks->GetEntries());
// check for outlier in centrality vs number of tracks (rough constants extracted from correlation histgram)
// correlate particles with...
TObjArray* tracksCorrelate = 0;
- if (fSelectParticleSpecies != -1)
- tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fSelectParticleSpecies, kTRUE);
+ if (fParticleSpeciesAssociated != fParticleSpeciesTrigger)
+ tracksCorrelate = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, fParticleSpeciesAssociated, kTRUE);
// reference multiplicity
Int_t referenceMultiplicity = -1;
referenceMultiplicity = AliESDtrackCuts::GetReferenceMultiplicity(fESD);
else if (fAOD)
referenceMultiplicity = tracks->GetEntriesFast(); // TODO to be replaced by the estimator once available in the AOD
+// referenceMultiplicity = fAOD->GetHeader()->GetRefMultiplicityComb05();
((TH2F*) fListOfHistos->FindObject("referenceMultiplicity"))->Fill(centrality, referenceMultiplicity);
{
// calls RemoveInjectedSignals, RemoveWeakDecays and RemoveDuplicates
+ if (!tracks)
+ return;
+
if (fInjectedSignals)
fAnalyseUE->RemoveInjectedSignals(tracks, mcObj, maxLabel);
if (fRemoveWeakDecays)
if (fRemoveDuplicates)
RemoveDuplicates(tracks);
}
+
+//____________________________________________________________________
+void AliAnalysisTaskPhiCorrelations::SelectCharge(TObjArray* tracks)
+{
+ // remove particles with charge not selected (depending on fTriggerSelectCharge)
+
+ if (!tracks)
+ return;
+
+ Int_t before = tracks->GetEntriesFast();
+
+ for (Int_t i=0; i<before; ++i)
+ {
+ AliVParticle* part = (AliVParticle*) tracks->At(i);
+
+ if (part->Charge() * fTriggerSelectCharge < -1)
+ {
+// Printf("Removing %d with charge %d", i, part->Charge());
+ TObject* object = tracks->RemoveAt(i);
+ if (tracks->IsOwner())
+ delete object;
+ }
+ }
+
+ tracks->Compress();
+
+ if (before > tracks->GetEntriesFast())
+ AliInfo(Form("Reduced from %d to %d", before, tracks->GetEntriesFast()));
+}