2 // Calculate the corrections in the forward regions
14 #include "AliForwardMCCorrectionsTask.h"
15 #include "AliForwardCorrectionManager.h"
16 #include "AliTriggerAnalysis.h"
17 #include "AliPhysicsSelection.h"
19 #include "AliHeader.h"
20 #include "AliGenEventHeader.h"
21 #include "AliESDEvent.h"
22 #include "AliAODHandler.h"
23 #include "AliMultiplicity.h"
24 #include "AliInputEventHandler.h"
26 #include "AliMCEvent.h"
27 #include "AliAODForwardMult.h"
28 #include "AliFMDStripIndex.h"
29 #include "AliFMDCorrSecondaryMap.h"
32 #include <TDirectory.h>
38 //====================================================================
39 AliForwardMCCorrectionsTask::AliForwardMCCorrectionsTask()
40 : AliBaseMCCorrectionsTask(),
53 //____________________________________________________________________
54 AliForwardMCCorrectionsTask::AliForwardMCCorrectionsTask(const char* name)
55 : AliBaseMCCorrectionsTask(name, &(AliForwardCorrectionManager::Instance())),
56 fTrackDensity("trackDensity"),
68 //____________________________________________________________________
69 AliBaseMCCorrectionsTask::VtxBin*
70 AliForwardMCCorrectionsTask::CreateVtxBin(Double_t low, Double_t high)
72 return new AliForwardMCCorrectionsTask::VtxBin(low,high, fEtaAxis);
75 //____________________________________________________________________
77 AliForwardMCCorrectionsTask::PreEvent()
79 // Clear our ESD object
84 //____________________________________________________________________
86 AliForwardMCCorrectionsTask::ProcessESD(const AliESDEvent& esd,
88 AliBaseMCCorrectionsTask::VtxBin& bin,
91 AliESDFMD* esdFMD = esd.GetFMDData();
93 fTrackDensity.Calculate(*esdFMD, mc, vz, fESDFMD, bin.fPrimary);
94 bin.fCounts->Fill(0.5);
96 AliForwardMCCorrectionsTask::VtxBin& vb =
97 static_cast<AliForwardMCCorrectionsTask::VtxBin&>(bin);
99 // And then bin the data in our vtxbin
100 for (UShort_t d=1; d<=3; d++) {
101 UShort_t nr = (d == 1 ? 1 : 2);
102 for (UShort_t q=0; q<nr; q++) {
103 Char_t r = (q == 0 ? 'I' : 'O');
104 UShort_t ns= (q == 0 ? 20 : 40);
105 UShort_t nt= (q == 0 ? 512 : 256);
106 TH2D* h = vb.fHists.Get(d,r);
108 for (UShort_t s=0; s<ns; s++) {
109 for (UShort_t t=0; t<nt; t++) {
110 Float_t mult = fESDFMD.Multiplicity(d,r,s,t);
112 if (mult == 0 || mult > 20) continue;
114 Float_t phi = fESDFMD.Phi(d,r,s,t) / 180 * TMath::Pi();
115 Float_t eta = fESDFMD.Eta(d,r,s,t);
116 h->Fill(eta,phi,mult);
123 //____________________________________________________________________
125 AliForwardMCCorrectionsTask::CreateCorrections(TList* results)
127 fSecCorr = new AliFMDCorrSecondaryMap;
128 fSecCorr->SetVertexAxis(fVtxAxis);
129 fSecCorr->SetEtaAxis(fEtaAxis);
130 results->Add(fSecCorr);
133 //____________________________________________________________________
135 AliForwardMCCorrectionsTask::FinalizeVtxBin(AliBaseMCCorrectionsTask::VtxBin*
139 AliForwardMCCorrectionsTask::VtxBin* vb =
140 static_cast<AliForwardMCCorrectionsTask::VtxBin*>(bin);
141 vb->Terminate(fList, fResults, iVz, fSecCorr);
146 //____________________________________________________________________
148 AliForwardMCCorrectionsTask::Print(Option_t* option) const
150 AliBaseMCCorrectionsTask::Print(option);
151 gROOT->IncreaseDirLevel();
152 fTrackDensity.Print(option);
153 gROOT->DecreaseDirLevel();
156 //====================================================================
157 AliForwardMCCorrectionsTask::VtxBin::VtxBin()
158 : AliBaseMCCorrectionsTask::VtxBin(),
162 //____________________________________________________________________
163 AliForwardMCCorrectionsTask::VtxBin::VtxBin(Double_t low,
166 : AliBaseMCCorrectionsTask::VtxBin(low, high, axis, 40),
173 //____________________________________________________________________
175 AliForwardMCCorrectionsTask::VtxBin::CreateOutputObjects(TList* l)
177 TList* d = AliBaseMCCorrectionsTask::VtxBin::CreateOutputObjects(l);
179 d->Add(fHists.fFMD1i);
180 d->Add(fHists.fFMD2i);
181 d->Add(fHists.fFMD2o);
182 d->Add(fHists.fFMD3i);
183 d->Add(fHists.fFMD3o);
188 //____________________________________________________________________
190 AliForwardMCCorrectionsTask::VtxBin::MakeBg(const TH2D* hits,
191 const TH2D* primary) const
193 TH2D* h = static_cast<TH2D*>(hits->Clone());
195 TString n(h->GetName());
196 n.ReplaceAll("_cache", "");
203 //____________________________________________________________________
205 AliForwardMCCorrectionsTask::VtxBin::Terminate(const TList* input,
208 AliFMDCorrSecondaryMap* map)
210 TList* out = new TList;
211 out->SetName(GetName());
215 TList* l = static_cast<TList*>(input->FindObject(GetName()));
217 AliError(Form("List %s not found in %s", GetName(), input->GetName()));
221 TH2D* fmd1i = static_cast<TH2D*>(l->FindObject("FMD1I_cache"));
222 TH2D* fmd2i = static_cast<TH2D*>(l->FindObject("FMD2I_cache"));
223 TH2D* fmd2o = static_cast<TH2D*>(l->FindObject("FMD2O_cache"));
224 TH2D* fmd3i = static_cast<TH2D*>(l->FindObject("FMD3I_cache"));
225 TH2D* fmd3o = static_cast<TH2D*>(l->FindObject("FMD3O_cache"));
226 TH2D* primO = static_cast<TH2D*>(l->FindObject("primary"));
227 if (!fmd1i || !fmd2i || !fmd2o || !fmd3i || !fmd3o || !primO) {
228 AliError(Form("Missing histogram(s): %p,%p,%p,%p,%p,%p",
229 fmd1i, fmd2i, fmd2o, fmd3i, fmd3o, primO));
233 // Half coverage in phi for inners
234 TH2D* primI = static_cast<TH2D*>(primO->Clone());
235 primI->SetDirectory(0);
238 TH2D* bg1i = MakeBg(fmd1i, primI);
239 TH2D* bg2i = MakeBg(fmd2i, primI);
240 TH2D* bg2o = MakeBg(fmd2o, primO);
241 TH2D* bg3i = MakeBg(fmd3i, primI);
242 TH2D* bg3o = MakeBg(fmd3o, primO);
243 map->SetCorrection(1, 'I', iVz, bg1i);
244 map->SetCorrection(2, 'I', iVz, bg2i);
245 map->SetCorrection(2, 'O', iVz, bg2o);
246 map->SetCorrection(3, 'I', iVz, bg3i);
247 map->SetCorrection(3, 'O', iVz, bg3o);