#include "AliESDMuonTrack.h"
#include "AliESDInputHandler.h"
#include "AliMCEventHandler.h"
+#include "AliCDBManager.h"
+#include "AliCentrality.h"
// ANALYSIS includes
#include "AliAnalysisDataSlot.h"
#include "AliAnalysisDataContainer.h"
#include "AliAnalysisManager.h"
-#include "AliCDBManager.h"
// MUON includes
#include "AliMUONCDB.h"
AliAnalysisTaskMuonFakes::AliAnalysisTaskMuonFakes() :
AliAnalysisTaskSE(),
fList(0x0),
+fList2(0x0),
fCanvases(0x0),
fTrackCounters(0x0),
fFakeTrackCounters(0x0),
fMatchedTrackCounters(0x0),
fEventCounters(0x0),
+fPairCounters(0x0),
fCurrentFileName(""),
fRequestedStationMask(0),
fRequest2ChInSameSt45(kFALSE),
fSigmaCut(-1.),
fUseLabel(kFALSE),
+fMatchTrig(kFALSE),
+fApplyAccCut(kFALSE),
fRecoParamLocation("alien://folder=/alice/simulation/2008/v4-15-Release/Full")
{
/// Default constructor.
AliAnalysisTaskMuonFakes::AliAnalysisTaskMuonFakes(const char *name) :
AliAnalysisTaskSE(name),
fList(0x0),
+fList2(0x0),
fCanvases(0x0),
fTrackCounters(0x0),
fFakeTrackCounters(0x0),
fMatchedTrackCounters(0x0),
fEventCounters(0x0),
+fPairCounters(0x0),
fCurrentFileName(""),
fRequestedStationMask(0),
fRequest2ChInSameSt45(kFALSE),
fSigmaCut(-1.),
fUseLabel(kFALSE),
+fMatchTrig(kFALSE),
+fApplyAccCut(kFALSE),
fRecoParamLocation("alien://folder=/alice/simulation/2008/v4-15-Release/Full")
{
/// Constructor.
DefineOutput(4,AliCounterCollection::Class());
// Output slot #5 writes into an AliCounterCollection container
DefineOutput(5,AliCounterCollection::Class());
+ // Output slot #6 writes into a TObjArray container
+ DefineOutput(6,TObjArray::Class());
+ // Output slot #7 writes into an AliCounterCollection container
+ DefineOutput(7,AliCounterCollection::Class());
}
//________________________________________________________________________
/// Destructor.
if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
delete fList;
+ delete fList2;
delete fTrackCounters;
delete fFakeTrackCounters;
delete fMatchedTrackCounters;
delete fEventCounters;
+ delete fPairCounters;
}
delete fCanvases;
}
{
/// Create histograms and counters.
+ // single track histograms
fList = new TObjArray(100);
fList->SetOwner();
fList->AddAtAndExpand(hNumberOfChamberHitF, kNumberOfChamberHitF);
// chi2
- TH1F *hChi2PerDof = new TH1F("hChi2PerDof", "track chi2/d.o.f.", 100, 0., 20.);
+ TH1F *hChi2PerDof = new TH1F("hChi2PerDof", "track chi2/d.o.f.", 200, 0., 20.);
fList->AddAtAndExpand(hChi2PerDof, kChi2PerDof);
- TH1F *hChi2PerDofM = new TH1F("hChi2PerDofM", "matched track chi2/d.o.f.", 100, 0., 20.);
+ TH1F *hChi2PerDofM = new TH1F("hChi2PerDofM", "matched track chi2/d.o.f.", 200, 0., 20.);
fList->AddAtAndExpand(hChi2PerDofM, kChi2PerDofM);
- TH1F *hChi2PerDofF = new TH1F("hChi2PerDofF", "fake track chi2/d.o.f.", 100, 0., 20.);
+ TH1F *hChi2PerDofF = new TH1F("hChi2PerDofF", "fake track chi2/d.o.f.", 200, 0., 20.);
fList->AddAtAndExpand(hChi2PerDofF, kChi2PerDofF);
// chi2 versus number of clusters
fList->AddAtAndExpand(hPtM, kPtM);
TH1F *hPtF = new TH1F("hPtF", "fake track Pt distribution (GeV/c)", 100, 0., 20.);
fList->AddAtAndExpand(hPtF, kPtF);
- TH1F *hEta = new TH1F("hEta", "Muon pseudo-rapidity distribution", 100, -10., 0.);
+ TH1F *hEta = new TH1F("hEta", "Muon pseudo-rapidity distribution", 200, -10., 0.);
fList->AddAtAndExpand(hEta , kEta );
- TH1F *hEtaM = new TH1F("hEtaM", "matched track pseudo-rapidity distribution", 100, -10., 0.);
+ TH1F *hEtaM = new TH1F("hEtaM", "matched track pseudo-rapidity distribution", 200, -10., 0.);
fList->AddAtAndExpand(hEtaM, kEtaM);
- TH1F *hEtaF = new TH1F("hEtaF", "fake track pseudo-rapidity distribution", 100, -10., 0.);
+ TH1F *hEtaF = new TH1F("hEtaF", "fake track pseudo-rapidity distribution", 200, -10., 0.);
fList->AddAtAndExpand(hEtaF, kEtaF);
TH1F *hPhi = new TH1F("hPhi", "Muon phi distribution", 100, -1., 9.);
fList->AddAtAndExpand(hPhi, kPhi);
fList->AddAtAndExpand(hPhiM, kPhiM);
TH1F *hPhiF = new TH1F("hPhiF", "fake track phi distribution", 100, -1., 9.);
fList->AddAtAndExpand(hPhiF, kPhiF);
- TH1F *hDCA = new TH1F("hDCA", "Muon DCA distribution", 125, 0., 500.);
+ TH1F *hDCA = new TH1F("hDCA", "Muon DCA distribution", 250, 0., 500.);
fList->AddAtAndExpand(hDCA, kDCA);
- TH1F *hDCAM = new TH1F("hDCAM", "matched track DCA distribution", 125, 0., 500.);
+ TH1F *hDCAM = new TH1F("hDCAM", "matched track DCA distribution", 250, 0., 500.);
fList->AddAtAndExpand(hDCAM, kDCAM);
- TH1F *hDCAF = new TH1F("hDCAF", "fake track DCA distribution", 125, 0., 500.);
+ TH1F *hDCAF = new TH1F("hDCAF", "fake track DCA distribution", 250, 0., 500.);
fList->AddAtAndExpand(hDCAF, kDCAF);
+ TH1F *hRAbs = new TH1F("hRAbs", "Muon R_{Abs} distribution", 200, 0., 100.);
+ fList->AddAtAndExpand(hRAbs, kRAbs);
+ TH1F *hRAbsM = new TH1F("hRAbsM", "matched track R_{Abs} distribution", 300, 0., 150.);
+ fList->AddAtAndExpand(hRAbsM, kRAbsM);
+ TH1F *hRAbsF = new TH1F("hRAbsF", "fake track R_{Abs} distribution", 200, 0., 100.);
+ fList->AddAtAndExpand(hRAbsF, kRAbsF);
+
+ // track pair histograms
+ fList2 = new TObjArray(100);
+ fList2->SetOwner();
+
+ // physics quantities of opposite-sign track pairs
+ TH1F* h = 0x0;
+ TString nameSuffix[4] = {"", "M", "F1", "F2"};
+ TString titlePrefix[4] = {"Dimuon", "matched-matched pair", "matched-fake pair", "fake-fake pair"};
+ for (Int_t i = 0; i < 4; i++) {
+ h = new TH1F(Form("h2Mass%s",nameSuffix[i].Data()), Form("%s mass distribution (GeV/c^{2})",titlePrefix[i].Data()), 300, 0., 15.);
+ fList2->AddAtAndExpand(h, k2Mass+i);
+ h = new TH1F(Form("h2P%s",nameSuffix[i].Data()), Form("%s P distribution (GeV/c)",titlePrefix[i].Data()), 100, 0., 200.);
+ fList2->AddAtAndExpand(h, k2P+i);
+ h = new TH1F(Form("h2Pt%s",nameSuffix[i].Data()), Form("%s Pt distribution (GeV/c)",titlePrefix[i].Data()), 100, 0., 20.);
+ fList2->AddAtAndExpand(h, k2Pt+i);
+ h = new TH1F(Form("h2Y%s",nameSuffix[i].Data()), Form("%s rapidity distribution",titlePrefix[i].Data()), 200, -10., 0.);
+ fList2->AddAtAndExpand(h, k2Y+i);
+ h = new TH1F(Form("h2Eta%s",nameSuffix[i].Data()), Form("%s pseudo-rapidity distribution",titlePrefix[i].Data()), 200, -10., 0.);
+ fList2->AddAtAndExpand(h, k2Eta+i);
+ h = new TH1F(Form("h2Phi%s",nameSuffix[i].Data()), Form("%s phi distribution",titlePrefix[i].Data()), 100, -1., 9.);
+ fList2->AddAtAndExpand(h, k2Phi+i);
+ }
// global counters of tracks:
// - reconstructible = number of reconstructible tracks
fTrackCounters->AddRubric("trig", "yes/no/unknown");
fTrackCounters->AddRubric("selected", "yes/no");
fTrackCounters->AddRubric("acc", "in/out/unknown");
+ TString centralityClasses = "5/10/15/20/25/30/35/40/45/50/55/60/65/70/75/80/85/90/95/100";
+ fTrackCounters->AddRubric("cent", centralityClasses.Data());
fTrackCounters->Init();
// detailled counters of fake tracks:
fFakeTrackCounters->AddRubric("trig", "yes/no/unknown");
fFakeTrackCounters->AddRubric("selected", "yes/no");
fFakeTrackCounters->AddRubric("acc", "in/out/unknown");
+ fFakeTrackCounters->AddRubric("cent", centralityClasses.Data());
fFakeTrackCounters->Init();
// counters of tracks matched by position or by using MC labels
fMatchedTrackCounters->AddRubric("trig", "yes/no");
fMatchedTrackCounters->AddRubric("selected", "yes/no");
fMatchedTrackCounters->AddRubric("acc", "in/out");
+ fMatchedTrackCounters->AddRubric("cent", centralityClasses.Data());
fMatchedTrackCounters->Init();
// global counters of events
fEventCounters->AddRubric("run", 1000000);
fEventCounters->AddRubric("trig", "any/yes");
fEventCounters->AddRubric("selected", "yes/no");
+ fEventCounters->AddRubric("cent", centralityClasses.Data());
fEventCounters->Init();
+ // global counters of track pairs:
+ // - reconstructible = number of reconstructible track pairs
+ // - reconstructed = number of reconstructed track pairs
+ // - matched = number of reconstructed track pairs fully matched with a simulated one (reconstructible or not)
+ // - 1fake = number of reconstructed track pairs made of one matched track and one fake
+ // - 2fakes = number of reconstructed track pairs fully fake
+ fPairCounters = new AliCounterCollection(GetOutputSlot(7)->GetContainer()->GetName());
+ fPairCounters->AddRubric("pair", "reconstructible/reconstructed/matched/1fake/2fakes");
+ fPairCounters->AddRubric("run", 1000000);
+ fPairCounters->AddRubric("trig", "0/1/2");
+ fPairCounters->AddRubric("selected", "yes/no");
+ fPairCounters->AddRubric("acc", "in/out/unknown");
+ fPairCounters->AddRubric("cent", centralityClasses.Data());
+ fPairCounters->Init();
+
// Disable printout of AliMCEvent
AliLog::SetClassDebugLevel("AliMCEvent",-1);
PostData(3, fFakeTrackCounters);
PostData(4, fMatchedTrackCounters);
PostData(5, fEventCounters);
+ PostData(6, fList2);
+ PostData(7, fPairCounters);
}
//________________________________________________________________________
return;
}
+ // current centrality class
+ TString centrality = "cent:";
+ Double_t centralityValue = esd->GetCentrality()->GetCentralityPercentile("V0M");
+ TObjArray* centralylimits = fTrackCounters->GetKeyWords("cent").Tokenize(",");
+ TObjString* limit = 0x0;
+ TIter nextLimit(centralylimits);
+ while ((limit = static_cast<TObjString*>(nextLimit()))) {
+ if (centralityValue < limit->String().Atoi()) {
+ centrality += limit->GetName();
+ break;
+ }
+ }
+ if (!limit) centrality += static_cast<TObjString*>(centralylimits->Last())->GetName();
+ delete centralylimits;
+
// Load MC event
AliMCEventHandler *mcH = 0;
if(MCEvent()) mcH = static_cast<AliMCEventHandler*>((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
AliMUONVTriggerTrackStore* triggerTrackRefStore = rc.TriggerableTracks(-1);
if (!muonTrackStore || !trackRefStore) return;
- // count the number of reconstructible tracks
+ // loop over trackRefs
+ Int_t nMuPlus[2] = {0, 0};
+ Int_t nMuMinus[2] = {0, 0};
TIter next(trackRefStore->CreateIterator());
AliMUONTrack* trackRef;
while ( ( trackRef = static_cast<AliMUONTrack*>(next()) ) ) {
- if (trackRef->IsValid(fRequestedStationMask, fRequest2ChInSameSt45)) {
- TString trig = (triggerTrackRefStore->FindObject(trackRef->GetUniqueID())) ? "trig:yes" : "trig:no";
- fTrackCounters->Count(Form("track:reconstructible/run:%d/%s/%s/acc:unknown", fCurrentRunNumber, trig.Data(), selected.Data()));
- }
+
+ // skip trackRefs that are not reconstructible
+ if (!trackRef->IsValid(fRequestedStationMask, fRequest2ChInSameSt45)) continue;
+
+ // trigger condition
+ Bool_t trigger = (triggerTrackRefStore->FindObject(trackRef->GetUniqueID()));
+ Int_t iTrig = trigger ? 1 : 0;
+ TString trig = trigger ? "trig:yes" : "trig:no";
+
+ // count muons
+ if (trackRef->GetTrackParamAtVertex()->GetCharge() > 0) nMuPlus[iTrig]++;
+ else nMuMinus[iTrig]++;
+
+ // fill global counters
+ fTrackCounters->Count(Form("track:reconstructible/run:%d/%s/%s/acc:unknown/%s", fCurrentRunNumber, trig.Data(), selected.Data(), centrality.Data()));
+
}
+ // fill global counters
+ fPairCounters->Count(Form("pair:reconstructible/run:%d/trig:0/%s/acc:unknown/%s", fCurrentRunNumber, selected.Data(), centrality.Data()), nMuPlus[0]*nMuMinus[0]);
+ fPairCounters->Count(Form("pair:reconstructible/run:%d/trig:1/%s/acc:unknown/%s", fCurrentRunNumber, selected.Data(), centrality.Data()), nMuPlus[1]*nMuMinus[0]+nMuPlus[0]*nMuMinus[1]);
+ fPairCounters->Count(Form("pair:reconstructible/run:%d/trig:2/%s/acc:unknown/%s", fCurrentRunNumber, selected.Data(), centrality.Data()), nMuPlus[1]*nMuMinus[1]);
+
// loop over ESD tracks
Int_t nTrackerTracks = 0;
Bool_t containTrack[2] = {kFALSE, kFALSE};
Bool_t containMatchedYetTrack[2] = {kFALSE, kFALSE};
AliMUONVTrackStore *fakeTrackStore = AliMUONESDInterface::NewTrackStore();
Int_t nTracks = (Int_t)esd->GetNumberOfMuonTracks() ;
- for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
+ for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
AliESDMuonTrack* esdTrack = esd->GetMuonTrack(iTrack);
// skip ghosts
if (!esdTrack->ContainTrackerData()) continue;
- nTrackerTracks++;
containTrack[0] = kTRUE;
// trigger condition
Bool_t trigger = esdTrack->ContainTriggerData();
- TString trig = "trig:";
- if (trigger) {
- trig += "yes";
- containTrack[1] = kTRUE;
- } else trig += "no";
+ TString trig = trigger ? "trig:yes" : "trig:no";
+ if (trigger) containTrack[1] = kTRUE;
// acceptance condition
- TString acc = "acc:";
- Double_t thetaTrackAbsEnd = TMath::ATan(esdTrack->GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
+ Double_t rAbs = esdTrack->GetRAtAbsorberEnd();
+ Double_t thetaTrackAbsEnd = TMath::ATan(rAbs/505.) * TMath::RadToDeg();
Double_t eta = esdTrack->Eta();
- if (thetaTrackAbsEnd >= 2. && thetaTrackAbsEnd <= 9. && eta >= -4. && eta <= -2.5) acc += "in";
- else acc += "out";
+ Bool_t inAcc = (thetaTrackAbsEnd >= 2. && thetaTrackAbsEnd <= 10. && eta >= -4. && eta <= -2.5);
+ TString acc = inAcc ? "acc:in" : "acc:out";
// fill global counters
- fTrackCounters->Count(Form("track:reconstructed/run:%d/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data()));
+ if ((!fMatchTrig || trigger) && (!fApplyAccCut || inAcc)) nTrackerTracks++;
+ fTrackCounters->Count(Form("track:reconstructed/run:%d/%s/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
// find the corresponding MUON track
AliMUONTrack* muonTrack = static_cast<AliMUONTrack*>(muonTrackStore->FindObject(esdTrack->GetUniqueID()));
Double_t dca = esdTrack->GetDCA();
// fill global histograms
- ((TH1F*)fList->UncheckedAt(kNumberOfClusters))->Fill(nClusters);
- ((TH1F*)fList->UncheckedAt(kNumberOfChamberHit))->Fill(nChamberHit);
- ((TH1F*)fList->UncheckedAt(kChi2PerDof))->Fill(normalizedChi2);
- ((TH1F*)fList->UncheckedAt(kP))->Fill(p);
- ((TH1F*)fList->UncheckedAt(kPt))->Fill(pT);
- ((TH1F*)fList->UncheckedAt(kEta))->Fill(eta);
- ((TH1F*)fList->UncheckedAt(kPhi))->Fill(phi);
- ((TH1F*)fList->UncheckedAt(kDCA))->Fill(dca);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNClusters))->Fill(nClusters,normalizedChi2);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNChamberHit))->Fill(nChamberHit,normalizedChi2);
+ if ((!fMatchTrig || trigger) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList->UncheckedAt(kNumberOfClusters))->Fill(nClusters);
+ ((TH1F*)fList->UncheckedAt(kNumberOfChamberHit))->Fill(nChamberHit);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDof))->Fill(normalizedChi2);
+ ((TH1F*)fList->UncheckedAt(kP))->Fill(p);
+ ((TH1F*)fList->UncheckedAt(kPt))->Fill(pT);
+ ((TH1F*)fList->UncheckedAt(kEta))->Fill(eta);
+ ((TH1F*)fList->UncheckedAt(kPhi))->Fill(phi);
+ ((TH1F*)fList->UncheckedAt(kDCA))->Fill(dca);
+ ((TH1F*)fList->UncheckedAt(kRAbs))->Fill(rAbs);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNClusters))->Fill(nClusters,normalizedChi2);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNChamberHit))->Fill(nChamberHit,normalizedChi2);
+ }
// try to match, by position, the reconstructed track with a simulated one
Int_t nMatchClustersByPosition = 0;
if (MCLabelByLabel >= 0 && MCLabelByPosition >= 0 && MCLabelByLabel != MCLabelByPosition) labelCase += "match other";
else if (MCLabelByLabel >= 0) labelCase += "match";
else labelCase += "not match";
- fMatchedTrackCounters->Count(Form("%s/%s/run:%d/%s/%s/%s", positionCase.Data(), labelCase.Data(), fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data()));
+ fMatchedTrackCounters->Count(Form("%s/%s/run:%d/%s/%s/%s/%s", positionCase.Data(), labelCase.Data(), fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
if ((MCLabelByLabel >= 0 && MCLabelByPosition < 0) || (MCLabelByLabel < 0 && MCLabelByPosition >= 0))
- fFakeTrackCounters->Count(Form("track:fake?/run:%d/file:%s/event:%d/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
- esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data()));
+ fFakeTrackCounters->Count(Form("track:fake?/run:%d/file:%s/event:%d/%s/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
+ esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
// take actions according to the matching result we are interested in
Int_t nMatchClusters = (fUseLabel) ? nMatchClustersByLabel : nMatchClustersByPosition;
if (matchedTrackRef) {
// fill global counters
- fTrackCounters->Count(Form("track:matched/run:%d/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data()));
+ fTrackCounters->Count(Form("track:matched/run:%d/%s/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
// track matched with a trackRef that is not reconstructible
if (!matchedTrackRef->IsValid(fRequestedStationMask, fRequest2ChInSameSt45)) {
if (trigger) containMatchedYetTrack[1] = kTRUE;
// fill global counters
- fTrackCounters->Count(Form("track:matchedyet/run:%d/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data()));
- fFakeTrackCounters->Count(Form("track:matchedyet/run:%d/file:%s/event:%d/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
- esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data()));
+ fTrackCounters->Count(Form("track:matchedyet/run:%d/%s/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
+ fFakeTrackCounters->Count(Form("track:matchedyet/run:%d/file:%s/event:%d/%s/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
+ esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
}
// fill histograms
- ((TH1F*)fList->UncheckedAt(kFractionOfMatchedClusters))->Fill(((Float_t) nMatchClusters) / ((Float_t) nClusters));
- ((TH1F*)fList->UncheckedAt(kNumberOfClustersMC))->Fill(matchedTrackRef->GetNClusters());
- ((TH1F*)fList->UncheckedAt(kNumberOfClustersM))->Fill(nClusters);
- ((TH1F*)fList->UncheckedAt(kNumberOfChamberHitM))->Fill(nChamberHit);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofM))->Fill(normalizedChi2);
- ((TH1F*)fList->UncheckedAt(kPM))->Fill(p);
- ((TH1F*)fList->UncheckedAt(kPtM))->Fill(pT);
- ((TH1F*)fList->UncheckedAt(kEtaM))->Fill(eta);
- ((TH1F*)fList->UncheckedAt(kPhiM))->Fill(phi);
- ((TH1F*)fList->UncheckedAt(kDCAM))->Fill(dca);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNClustersM))->Fill(nClusters,normalizedChi2);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNChamberHitM))->Fill(nChamberHit,normalizedChi2);
+ if ((!fMatchTrig || trigger) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList->UncheckedAt(kFractionOfMatchedClusters))->Fill(((Float_t) nMatchClusters) / ((Float_t) nClusters));
+ ((TH1F*)fList->UncheckedAt(kNumberOfClustersMC))->Fill(matchedTrackRef->GetNClusters());
+ ((TH1F*)fList->UncheckedAt(kNumberOfClustersM))->Fill(nClusters);
+ ((TH1F*)fList->UncheckedAt(kNumberOfChamberHitM))->Fill(nChamberHit);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofM))->Fill(normalizedChi2);
+ ((TH1F*)fList->UncheckedAt(kPM))->Fill(p);
+ ((TH1F*)fList->UncheckedAt(kPtM))->Fill(pT);
+ ((TH1F*)fList->UncheckedAt(kEtaM))->Fill(eta);
+ ((TH1F*)fList->UncheckedAt(kPhiM))->Fill(phi);
+ ((TH1F*)fList->UncheckedAt(kDCAM))->Fill(dca);
+ ((TH1F*)fList->UncheckedAt(kRAbsM))->Fill(rAbs);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNClustersM))->Fill(nClusters,normalizedChi2);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNChamberHitM))->Fill(nChamberHit,normalizedChi2);
+ }
+
+ // flag matched tracks
+ esdTrack->SetLabel(matchedTrackRef->GetUniqueID());
// remove already matched trackRefs
trackRefStore->Remove(*matchedTrackRef);
if (trigger) containFakeTrack[1] = kTRUE;
// fill global counters
- fTrackCounters->Count(Form("track:fake/run:%d/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data()));
- fFakeTrackCounters->Count(Form("track:fake/run:%d/file:%s/event:%d/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
- esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data()));
+ fTrackCounters->Count(Form("track:fake/run:%d/%s/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
+ fFakeTrackCounters->Count(Form("track:fake/run:%d/file:%s/event:%d/%s/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
+ esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
// fill histograms
- ((TH1F*)fList->UncheckedAt(kNumberOfClustersF))->Fill(nClusters);
- ((TH1F*)fList->UncheckedAt(kNumberOfChamberHitF))->Fill(nChamberHit);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofF))->Fill(normalizedChi2);
- ((TH1F*)fList->UncheckedAt(kPF))->Fill(p);
- ((TH1F*)fList->UncheckedAt(kPtF))->Fill(pT);
- ((TH1F*)fList->UncheckedAt(kEtaF))->Fill(eta);
- ((TH1F*)fList->UncheckedAt(kPhiF))->Fill(phi);
- ((TH1F*)fList->UncheckedAt(kDCAF))->Fill(dca);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNClustersF))->Fill(nClusters,normalizedChi2);
- ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNChamberHitF))->Fill(nChamberHit,normalizedChi2);
+ if ((!fMatchTrig || trigger) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList->UncheckedAt(kNumberOfClustersF))->Fill(nClusters);
+ ((TH1F*)fList->UncheckedAt(kNumberOfChamberHitF))->Fill(nChamberHit);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofF))->Fill(normalizedChi2);
+ ((TH1F*)fList->UncheckedAt(kPF))->Fill(p);
+ ((TH1F*)fList->UncheckedAt(kPtF))->Fill(pT);
+ ((TH1F*)fList->UncheckedAt(kEtaF))->Fill(eta);
+ ((TH1F*)fList->UncheckedAt(kPhiF))->Fill(phi);
+ ((TH1F*)fList->UncheckedAt(kDCAF))->Fill(dca);
+ ((TH1F*)fList->UncheckedAt(kRAbsF))->Fill(rAbs);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNClustersF))->Fill(nClusters,normalizedChi2);
+ ((TH1F*)fList->UncheckedAt(kChi2PerDofVsNChamberHitF))->Fill(nChamberHit,normalizedChi2);
+ }
+
+ // flag fake tracks
+ esdTrack->SetLabel(-1);
// store fake tracks
fakeTrackStore->Add(*muonTrack);
// fill histogram and global counters
((TH1F*)fList->UncheckedAt(kNumberOfTracks))->Fill(nTrackerTracks);
- if (containTrack[0]) fEventCounters->Count(Form("event:any/run:%d/trig:any/%s", fCurrentRunNumber, selected.Data()));
- if (containTrack[1]) fEventCounters->Count(Form("event:any/run:%d/trig:yes/%s", fCurrentRunNumber, selected.Data()));
- if (containFakeTrack[0]) fEventCounters->Count(Form("event:fake/run:%d/trig:any/%s", fCurrentRunNumber, selected.Data()));
- if (containFakeTrack[1]) fEventCounters->Count(Form("event:fake/run:%d/trig:yes/%s", fCurrentRunNumber, selected.Data()));
- if (containMatchedYetTrack[0]) fEventCounters->Count(Form("event:matchedyet/run:%d/trig:any/%s", fCurrentRunNumber, selected.Data()));
- if (containMatchedYetTrack[1]) fEventCounters->Count(Form("event:matchedyet/run:%d/trig:yes/%s", fCurrentRunNumber, selected.Data()));
+ if (containTrack[0]) fEventCounters->Count(Form("event:any/run:%d/trig:any/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
+ if (containTrack[1]) fEventCounters->Count(Form("event:any/run:%d/trig:yes/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
+ if (containFakeTrack[0]) fEventCounters->Count(Form("event:fake/run:%d/trig:any/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
+ if (containFakeTrack[1]) fEventCounters->Count(Form("event:fake/run:%d/trig:yes/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
+ if (containMatchedYetTrack[0]) fEventCounters->Count(Form("event:matchedyet/run:%d/trig:any/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
+ if (containMatchedYetTrack[1]) fEventCounters->Count(Form("event:matchedyet/run:%d/trig:yes/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
// count the number of not connected and additional fake tracks
if (fakeTrackStore->GetSize() > 0) {
// remove the most connected fake tracks
- Int_t nFreeMissingTracks = RemoveConnectedFakes(*fakeTrackStore, *trackRefStore);
+ Int_t nFreeMissingTracks = RemoveConnectedFakes(*fakeTrackStore, *trackRefStore, selected, centrality);
if (fakeTrackStore->GetSize() > 0) {
// fill global counters
- fEventCounters->Count(Form("event:notconnected/run:%d/trig:any/%s", fCurrentRunNumber, selected.Data()));
+ fEventCounters->Count(Form("event:notconnected/run:%d/trig:any/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
// check status of remaining fakes with respect to the matching with trigger
Bool_t containMatchedFake = kFALSE;
}
// fill global counters
- if (containMatchedFake) fEventCounters->Count(Form("event:notconnected/run:%d/trig:yes/%s", fCurrentRunNumber, selected.Data()));
+ if (containMatchedFake) fEventCounters->Count(Form("event:notconnected/run:%d/trig:yes/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
// remove the remaining free reconstructible tracks
Int_t nAdditionalTracks = fakeTrackStore->GetSize() - nFreeMissingTracks;
// fill histogram and global counters
((TH1F*)fList->UncheckedAt(kNumberOfAdditionalTracks))->Fill(nAdditionalTracks);
- fEventCounters->Count(Form("event:additional/run:%d/trig:any/%s", fCurrentRunNumber, selected.Data()));
+ fEventCounters->Count(Form("event:additional/run:%d/trig:any/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
if (!containUnmatchedFake) { // all matched
- fTrackCounters->Count(Form("track:additional/run:%d/trig:yes/%s/acc:unknown", fCurrentRunNumber, selected.Data()), nAdditionalTracks);
- fFakeTrackCounters->Count(Form("track:additional/run:%d/file:%s/event:%d/trig:yes/%s/acc:unknown", fCurrentRunNumber, fCurrentFileName.Data(), esd->GetEventNumberInFile(), selected.Data()), nAdditionalTracks);
- fEventCounters->Count(Form("event:additional/run:%d/trig:yes/%s", fCurrentRunNumber, selected.Data()));
+ fTrackCounters->Count(Form("track:additional/run:%d/trig:yes/%s/acc:unknown/%s", fCurrentRunNumber, selected.Data(), centrality.Data()), nAdditionalTracks);
+ fFakeTrackCounters->Count(Form("track:additional/run:%d/file:%s/event:%d/trig:yes/%s/acc:unknown/%s", fCurrentRunNumber, fCurrentFileName.Data(), esd->GetEventNumberInFile(), selected.Data(), centrality.Data()), nAdditionalTracks);
+ fEventCounters->Count(Form("event:additional/run:%d/trig:yes/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
} else if (!containMatchedFake) { // none matched
- fTrackCounters->Count(Form("track:additional/run:%d/trig:no/%s/acc:unknown", fCurrentRunNumber, selected.Data()), nAdditionalTracks);
- fFakeTrackCounters->Count(Form("track:additional/run:%d/file:%s/event:%d/trig:no/%s/acc:unknown", fCurrentRunNumber, fCurrentFileName.Data(), esd->GetEventNumberInFile(), selected.Data()), nAdditionalTracks);
+ fTrackCounters->Count(Form("track:additional/run:%d/trig:no/%s/acc:unknown/%s", fCurrentRunNumber, selected.Data(), centrality.Data()), nAdditionalTracks);
+ fFakeTrackCounters->Count(Form("track:additional/run:%d/file:%s/event:%d/trig:no/%s/acc:unknown/%s", fCurrentRunNumber, fCurrentFileName.Data(), esd->GetEventNumberInFile(), selected.Data(), centrality.Data()), nAdditionalTracks);
} else { // mixed
- fTrackCounters->Count(Form("track:additional/run:%d/trig:unknown/%s/acc:unknown", fCurrentRunNumber, selected.Data()), nAdditionalTracks);
- fFakeTrackCounters->Count(Form("track:additional/run:%d/file:%s/event:%d/trig:unknown/%s/acc:unknown", fCurrentRunNumber, fCurrentFileName.Data(), esd->GetEventNumberInFile(), selected.Data()), nAdditionalTracks);
- fEventCounters->Count(Form("event:additional/run:%d/trig:yes/%s", fCurrentRunNumber, selected.Data()));
+ fTrackCounters->Count(Form("track:additional/run:%d/trig:unknown/%s/acc:unknown/%s", fCurrentRunNumber, selected.Data(), centrality.Data()), nAdditionalTracks);
+ fFakeTrackCounters->Count(Form("track:additional/run:%d/file:%s/event:%d/trig:unknown/%s/acc:unknown/%s", fCurrentRunNumber, fCurrentFileName.Data(), esd->GetEventNumberInFile(), selected.Data(), centrality.Data()), nAdditionalTracks);
+ fEventCounters->Count(Form("event:additional/run:%d/trig:yes/%s/%s", fCurrentRunNumber, selected.Data(), centrality.Data()));
}
}
}
+ // clean memory
delete fakeTrackStore;
+ // double loop over ESD tracks, build pairs and fill histograms and counters according to their label
+ TLorentzVector vMu1, vMu2, vDiMu;
+ for (Int_t iTrack1 = 0; iTrack1 < nTracks; iTrack1++) {
+ AliESDMuonTrack* muonTrack1 = esd->GetMuonTrack(iTrack1);
+
+ // skip ghosts
+ if (!muonTrack1->ContainTrackerData()) continue;
+
+ // get track info
+ Bool_t trigger1 = muonTrack1->ContainTriggerData();
+ Double_t thetaAbs1 = TMath::ATan(muonTrack1->GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
+ Double_t eta1 = muonTrack1->Eta();
+ Bool_t acc1 = (thetaAbs1 >= 2. && thetaAbs1 <= 10. && eta1 >= -4. && eta1 <= -2.5);
+ Short_t charge1 = muonTrack1->Charge();
+ Int_t label1 = muonTrack1->GetLabel();
+ muonTrack1->LorentzP(vMu1);
+
+ for (Int_t iTrack2 = iTrack1+1; iTrack2 < nTracks; iTrack2++) {
+ AliESDMuonTrack* muonTrack2 = esd->GetMuonTrack(iTrack2);
+
+ // skip ghosts
+ if (!muonTrack2->ContainTrackerData()) continue;
+
+ // keep only opposite sign pairs
+ Short_t charge2 = muonTrack2->Charge();
+ if (charge1*charge2 > 0) continue;
+
+ // get track info
+ Bool_t trigger2 = muonTrack2->ContainTriggerData();
+ Double_t thetaAbs2 = TMath::ATan(muonTrack2->GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
+ Double_t eta2 = muonTrack2->Eta();
+ Bool_t acc2 = (thetaAbs2 >= 2. && thetaAbs2 <= 10. && eta2 >= -4. && eta2 <= -2.5);
+ Int_t label2 = muonTrack2->GetLabel();
+ muonTrack2->LorentzP(vMu2);
+
+ // compute kinematics of the pair
+ vDiMu = vMu1 + vMu2;
+ Float_t mass = vDiMu.M();
+ Float_t p = vDiMu.P();
+ Float_t pt = vDiMu.Pt();
+ Float_t y = vDiMu.Rapidity();
+ Float_t eta = vDiMu.Eta();
+ Float_t phi = vDiMu.Phi();
+ if (phi < 0) phi += 2.*TMath::Pi();
+
+ // trigger condition
+ TString trig = "trig:";
+ if (trigger1 && trigger2) trig += "2";
+ else if (trigger1 || trigger2) trig += "1";
+ else trig += "0";
+
+ // acceptance condition
+ Bool_t inAcc = (acc1 && acc2 && eta >= -4. && eta <= -2.5);
+ TString acc = inAcc ? "acc:in" : "acc:out";
+
+ // fill global histograms
+ if ((!fMatchTrig || (trigger1 && trigger2)) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList2->UncheckedAt(k2Mass))->Fill(mass);
+ ((TH1F*)fList2->UncheckedAt(k2P))->Fill(p);
+ ((TH1F*)fList2->UncheckedAt(k2Pt))->Fill(pt);
+ ((TH1F*)fList2->UncheckedAt(k2Y))->Fill(y);
+ ((TH1F*)fList2->UncheckedAt(k2Eta))->Fill(eta);
+ ((TH1F*)fList2->UncheckedAt(k2Phi))->Fill(phi);
+ }
+
+ TString pair = "pair:";
+
+ // fill histograms according to labels
+ if (label1 >= 0 && label2 >= 0) {
+
+ pair += "matched";
+
+ if ((!fMatchTrig || (trigger1 && trigger2)) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList2->UncheckedAt(k2MassM))->Fill(mass);
+ ((TH1F*)fList2->UncheckedAt(k2PM))->Fill(p);
+ ((TH1F*)fList2->UncheckedAt(k2PtM))->Fill(pt);
+ ((TH1F*)fList2->UncheckedAt(k2YM))->Fill(y);
+ ((TH1F*)fList2->UncheckedAt(k2EtaM))->Fill(eta);
+ ((TH1F*)fList2->UncheckedAt(k2PhiM))->Fill(phi);
+ }
+
+ } else if (label1 >= 0 || label2 >= 0) {
+
+ pair += "1fake";
+
+ if ((!fMatchTrig || (trigger1 && trigger2)) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList2->UncheckedAt(k2MassF1))->Fill(mass);
+ ((TH1F*)fList2->UncheckedAt(k2PF1))->Fill(p);
+ ((TH1F*)fList2->UncheckedAt(k2PtF1))->Fill(pt);
+ ((TH1F*)fList2->UncheckedAt(k2YF1))->Fill(y);
+ ((TH1F*)fList2->UncheckedAt(k2EtaF1))->Fill(eta);
+ ((TH1F*)fList2->UncheckedAt(k2PhiF1))->Fill(phi);
+ }
+
+ } else {
+
+ pair += "2fakes";
+
+ if ((!fMatchTrig || (trigger1 && trigger2)) && (!fApplyAccCut || inAcc)) {
+ ((TH1F*)fList2->UncheckedAt(k2MassF2))->Fill(mass);
+ ((TH1F*)fList2->UncheckedAt(k2PF2))->Fill(p);
+ ((TH1F*)fList2->UncheckedAt(k2PtF2))->Fill(pt);
+ ((TH1F*)fList2->UncheckedAt(k2YF2))->Fill(y);
+ ((TH1F*)fList2->UncheckedAt(k2EtaF2))->Fill(eta);
+ ((TH1F*)fList2->UncheckedAt(k2PhiF2))->Fill(phi);
+ }
+
+ }
+
+ // fill global counters
+ fPairCounters->Count(Form("pair:reconstructed/run:%d/%s/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
+ fPairCounters->Count(Form("%s/run:%d/%s/%s/%s/%s", pair.Data(), fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
+
+ }
+
+ }
+
// Post final data
PostData(1, fList);
PostData(2, fTrackCounters);
PostData(3, fFakeTrackCounters);
PostData(4, fMatchedTrackCounters);
PostData(5, fEventCounters);
+ PostData(6, fList2);
+ PostData(7, fPairCounters);
}
//________________________________________________________________________
// recover output objects
fList = static_cast<TObjArray*> (GetOutputData(1));
- if (!fList) return;
+ fList2 = static_cast<TObjArray*> (GetOutputData(6));
+ if (!fList || !fList2) return;
fTrackCounters = static_cast<AliCounterCollection*> (GetOutputData(2));
fFakeTrackCounters = static_cast<AliCounterCollection*> (GetOutputData(3));
fMatchedTrackCounters = static_cast<AliCounterCollection*> (GetOutputData(4));
fEventCounters = static_cast<AliCounterCollection*> (GetOutputData(5));
+ fPairCounters = static_cast<AliCounterCollection*> (GetOutputData(7));
// add canvas to compare histograms
- fCanvases = new TObjArray(1000);
+ fCanvases = new TObjArray(3);
fCanvases->SetOwner();
- TCanvas *cFakesSummary1 = new TCanvas("cFakesSummary1","cFakesSummary1",1200,600);
+ TCanvas *cFakesSummary1 = new TCanvas("cFakesSummary1","cFakesSummary1",900,900);
fCanvases->AddAtAndExpand(cFakesSummary1, 0);
TCanvas *cFakesSummary2 = new TCanvas("cFakesSummary2","cFakesSummary2",1200,600);
fCanvases->AddAtAndExpand(cFakesSummary2, 1);
+ TCanvas *cFakesSummary3 = new TCanvas("cFakesSummary3","cFakesSummary3",900,600);
+ fCanvases->AddAtAndExpand(cFakesSummary3, 2);
// display
- Int_t iHist1[8] = {kNumberOfClusters, kChi2PerDof, kP, kEta, kNumberOfChamberHit, kDCA, kPt, kPhi};
- cFakesSummary1->Divide(4,2);
- for (Int_t i=0; i<8; i++) {
+ Int_t iHist1[9] = {kNumberOfClusters, kNumberOfChamberHit, kChi2PerDof, kDCA, kRAbs, kEta, kP, kPt, kPhi};
+ cFakesSummary1->Divide(3,3);
+ for (Int_t i=0; i<9; i++) {
cFakesSummary1->cd(i+1);
cFakesSummary1->GetPad(i+1)->SetLogy();
((TH1F*)fList->UncheckedAt(iHist1[i]))->SetMinimum(0.5);
((TH2F*)fList->UncheckedAt(iHist2[i]+2))->DrawCopy("sames");
}
+ Int_t iHist3[6] = {k2Mass, k2P, k2Pt, k2Y, k2Eta, k2Phi};
+ cFakesSummary3->Divide(3,2);
+ for (Int_t i=0; i<6; i++) {
+ cFakesSummary3->cd(i+1);
+ cFakesSummary3->GetPad(i+1)->SetLogy();
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]))->SetMinimum(0.5);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]))->DrawCopy();
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+1))->SetLineColor(4);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+1))->DrawCopy("sames");
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+2))->Add((TH1F*)fList2->UncheckedAt(iHist3[i]+3));
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+2))->SetLineColor(2);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+2))->SetFillColor(2);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+2))->SetFillStyle(3017);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+2))->DrawCopy("sames");
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+3))->SetLineColor(6);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+3))->SetFillColor(6);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+3))->SetFillStyle(3018);
+ ((TH1F*)fList2->UncheckedAt(iHist3[i]+3))->DrawCopy("sames");
+ }
+
// print
if (fTrackCounters && fFakeTrackCounters && fMatchedTrackCounters && fEventCounters) {
printf("\nGlobal statistics of reconstructed tracks matched or not with the trigger:\n");
fEventCounters->Print("event/trig");
}
- printf("\nREMINDER: results are relevent provided that you use the same recoParams as for the reconstruction\n");
+ if (fPairCounters) {
+ printf("\nGlobal statistics of reconstructed track pairs matched or not with the trigger:\n");
+ fPairCounters->Print("pair/trig");
+ }
+
+ printf("\nREMINDER: results are relevent provided that you use the same recoParams as for the reconstruction\n\n");
}
//________________________________________________________________________
-Int_t AliAnalysisTaskMuonFakes::RemoveConnectedFakes(AliMUONVTrackStore &fakeTrackStore, AliMUONVTrackStore &trackRefStore)
+Int_t AliAnalysisTaskMuonFakes::RemoveConnectedFakes(AliMUONVTrackStore &fakeTrackStore, AliMUONVTrackStore &trackRefStore,
+ TString &selected, TString ¢rality)
{
/// loop over reconstructible TrackRef not associated with reconstructed track:
/// for each of them, find and remove the most connected the fake track, if any,
// acceptance condition
Double_t thetaTrackAbsEnd = TMath::ATan(esdTrack->GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
Double_t eta = esdTrack->Eta();
- TString acc = (thetaTrackAbsEnd >= 2. && thetaTrackAbsEnd <= 9. && eta >= -4. && eta <= -2.5) ? "acc:in" : "acc:out";
-
- // check physics selection
- TString selected = (fInputHandler && fInputHandler->IsEventSelected()) ? "selected:yes" : "selected:no";
+ TString acc = (thetaTrackAbsEnd >= 2. && thetaTrackAbsEnd <= 10. && eta >= -4. && eta <= -2.5) ? "acc:in" : "acc:out";
// fill histogram and counters
((TH1F*)fList->UncheckedAt(kFractionOfConnectedClusters))->Fill(fractionOfConnectedClusters);
- fTrackCounters->Count(Form("track:connected/run:%d/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data()));
- fFakeTrackCounters->Count(Form("track:connected/run:%d/file:%s/event:%d/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
- esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data()));
+ fTrackCounters->Count(Form("track:connected/run:%d/%s/%s/%s/%s", fCurrentRunNumber, trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
+ fFakeTrackCounters->Count(Form("track:connected/run:%d/file:%s/event:%d/%s/%s/%s/%s", fCurrentRunNumber, fCurrentFileName.Data(),
+ esd->GetEventNumberInFile(), trig.Data(), selected.Data(), acc.Data(), centrality.Data()));
// remove the most connected fake track
fakeTrackStore.Remove(*connectedFake);