1 //====================================================================
2 #include "AliMCTruthdNdetaTask.h"
9 #include <AliAnalysisManager.h>
10 #include <AliAODEvent.h>
11 #include <AliAODHandler.h>
12 #include <AliAODInputHandler.h>
13 #include "AliForwardUtil.h"
14 #include "AliAODForwardMult.h"
16 //____________________________________________________________________
17 AliMCTruthdNdetaTask::AliMCTruthdNdetaTask()
18 : AliBasedNdetaTask(),
26 //____________________________________________________________________
27 AliMCTruthdNdetaTask::AliMCTruthdNdetaTask(const char* /* name */)
28 : AliBasedNdetaTask("MCTruth"),
39 //____________________________________________________________________
40 AliBasedNdetaTask::CentralityBin*
41 AliMCTruthdNdetaTask::MakeCentralityBin(const char* name, Short_t l, Short_t h)
45 // Make a new centrality bin
48 // name Histogram names
53 // Newly allocated object (of our type)
55 return new AliMCTruthdNdetaTask::CentralityBin(name, l, h);
58 //____________________________________________________________________
60 AliMCTruthdNdetaTask::GetHistogram(const AliAODEvent& aod, Bool_t mc)
63 // Retrieve the histogram
67 // mc Whether to get the MC histogram or not
70 // Retrieved histogram or null
72 if (!fHasData) return 0;
75 TH2D* ret = GetPrimary(aod);
80 Int_t nY = ret->GetNbinsY();
81 // Need to fill under-/overflow bin with 1's
82 for (Int_t i = 1; i <= ret->GetNbinsX(); i++) {
83 ret->SetBinContent(i, 0, 1);
84 ret->SetBinContent(i, nY+1, 1);
89 //________________________________________________________________________
91 AliMCTruthdNdetaTask::Finalize()
94 // Called at end of event processing..
96 // This is called once in the master
101 AliInfo("The MC truth dN/deta task didn't get any data");
104 AliBasedNdetaTask::Finalize();
106 THStack* truth = new THStack("dndetaTruth", "dN/d#eta MC Truth");
107 THStack* truthRebin = new THStack(Form("dndetaTruth_rebin%02d", fRebin),
108 "dN/d#eta MC Truth");
110 TIter next(fListOfCentralities);
111 CentralityBin* bin = 0;
112 while ((bin = static_cast<CentralityBin*>(next()))) {
113 if (HasCentrality() && bin->IsAllBin()) continue;
115 TList* results = bin->GetResults();
116 if (!results) continue;
118 TH1* dndeta = static_cast<TH1*>(results->FindObject("dndetaTruth"));
120 static_cast<TH1*>(results->FindObject(Form("dndetaTruth_rebin%02d",
122 if (dndeta) truth->Add(dndeta);
123 if (dndetaRebin) truthRebin->Add(dndetaRebin);
125 // If available output rebinned stack
126 if (!truth->GetHists() ||
127 truth->GetHists()->GetEntries() <= 0) {
128 AliWarning("No MC truth histograms found");
132 if (truth) fResults->Add(truth);
134 // If available output rebinned stack
135 if (!truthRebin->GetHists() ||
136 truthRebin->GetHists()->GetEntries() <= 0) {
137 AliWarning("No rebinned MC truth histograms found");
141 if (truthRebin) fResults->Add(truthRebin);
145 //========================================================================
147 AliMCTruthdNdetaTask::CentralityBin::ProcessEvent(const AliAODForwardMult*
156 // Check the centrality class unless this is the 'all' bin
157 if (!primary) return false;
160 Double_t centrality = forward->GetCentrality();
161 if (centrality < fLow || centrality >= fHigh) return false;
164 if (!fSum) CreateSums(primary, 0);
166 fSumTruth = static_cast<TH2D*>(primary->Clone("truth"));
167 fSumTruth->SetDirectory(0);
169 fSums->Add(fSumTruth);
172 // translate real trigger mask to MC trigger mask
173 Int_t mask = AliAODForwardMult::kB;
174 if (triggerMask == AliAODForwardMult::kNSD) {
175 mask ^= AliAODForwardMult::kNSD;
176 mask = AliAODForwardMult::kMCNSD;
179 // Now use our normal check, but with the new mask, except ignore vertex
180 if (forward->CheckEvent(mask, -10000, -10000, 0, 0, 0)) {
181 fSumTruth->Add(primary);
183 // Store event count in left-most under- underflow bin
184 Int_t cnt = Int_t(fSumTruth->GetBinContent(0,0));
185 fSumTruth->SetBinContent(0,0, ++cnt);
188 // Now use our normal check with the full trigger mask and vertex
189 if (CheckEvent(forward, triggerMask, vzMin, vzMax))
190 fSum->Add(primary, isZero);
194 //________________________________________________________________________
196 AliMCTruthdNdetaTask::CentralityBin::End(TList* sums,
199 const TH2F* shapeCorr,
214 AliInfo(Form("At end with sums=%p, results=%p, scheme=%d, "
215 "shapeCorr=%p, trigEff=%f, symmetrice=%d, rebin=%d, "
216 "rootProj=%d, corrEmpty=%d, cutEdges=%d, triggerMask=0x%08x, "
218 sums, results, scheme, shapeCorr, trigEff, trigEff0, symmetrice,
219 rebin, rootProj, corrEmpty, cutEdges, triggerMask, marker,
220 GetMarkerStyle(kStar)));
223 AliBasedNdetaTask::CentralityBin::End(sums, results, scheme,
224 shapeCorr, trigEff, trigEff0,
226 rootProj, corrEmpty, cutEdges,
227 triggerMask, marker, color, mclist,
230 fSumTruth = static_cast<TH2D*>(fSums->FindObject("truth"));
234 Int_t n0 = Int_t(fSumTruth->GetBinContent(0,0));
235 Int_t n = (triggerMask == AliAODForwardMult::kNSD ?
236 Int_t(fTriggers->GetBinContent(AliAODForwardMult::kBinMCNSD)) :
237 Int_t(fTriggers->GetBinContent(AliAODForwardMult::kBinAll)));
238 DMSG(fDebug,0,"Normalising MC truth to %d (%d additions)", n, n0);
240 TH1D* dndetaTruth = fSumTruth->ProjectionX("dndetaTruth",1,
241 fSumTruth->GetNbinsY(),"e");
242 dndetaTruth->SetDirectory(0);
243 dndetaTruth->Scale(1./n, "width");
245 SetHistogramAttributes(dndetaTruth, GetColor(color)+1,
246 GetMarkerStyle(kCross),
247 "Monte-Carlo truth");
249 fOutput->Add(dndetaTruth);
250 fOutput->Add(Rebin(dndetaTruth, rebin, cutEdges));
252 TH1* dndeta = GetResult(0, false, "");
253 TH1* dndetaSym = symmetrice ? GetResult(0, true, "") : 0;
254 TH1* dndeta_rebin = rebin ? GetResult(rebin, false, "") : 0;
255 TH1* dndetaSym_rebin = symmetrice && rebin ? GetResult(rebin, true, "") : 0;
257 dndeta->SetTitle("Monte-Carlo truth (selected)");
259 dndetaSym->SetTitle("Monte-Carlo truth (selected,mirrored)");
261 dndeta_rebin->SetTitle("Monte-Carlo truth (selected)");
263 dndetaSym_rebin->SetTitle("Monte-Carlo truth (selected,mirrored)");
267 //________________________________________________________________________