2 // This class calculates the exclusive charged particle density
3 // in each for the 5 FMD rings.
6 // - 5 RingHistos objects - each with a number of vertex dependent
7 // 2D histograms of the inclusive charge particle density
10 // - 5 RingHistos objects - each with a number of vertex dependent
11 // 2D histograms of the exclusive charge particle density
14 // - AliFMDCorrSecondaryMap;
15 // - AliFMDCorrVertexBias
16 // - AliFMDCorrMergingEfficiency
18 #include "AliFMDMCCorrector.h"
19 #include <AliESDFMD.h>
23 #include "AliForwardCorrectionManager.h"
24 #include "AliFMDCorrSecondaryMap.h"
25 #include "AliFMDCorrVertexBias.h"
29 #include <TProfile2D.h>
31 ClassImp(AliFMDMCCorrector)
37 //____________________________________________________________________
38 AliFMDMCCorrector::~AliFMDMCCorrector()
43 // if (fComps) fComps->Clear();
44 // if (fFMD1i) delete fFMD1i;
45 // if (fFMD2i) delete fFMD2i;
46 // if (fFMD2o) delete fFMD2o;
47 // if (fFMD3i) delete fFMD3i;
48 // if (fFMD3o) delete fFMD3o;
51 //____________________________________________________________________
53 AliFMDMCCorrector::operator=(const AliFMDMCCorrector& o)
56 // Assignement operator
59 // o Object to assign from
62 // Reference to this object
64 if (&o == this) return *this;
65 AliFMDCorrector::operator=(o);
66 fSecondaryForMC = o.fSecondaryForMC;
70 //____________________________________________________________________
72 AliFMDMCCorrector::CorrectMC(AliForwardUtil::Histos& hists,
76 // Do the calculations
79 // hists Cache of histograms
85 if ((!fUseSecondaryMap || !fSecondaryForMC) && fUseVertexBias)
88 AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
90 UShort_t uvb = vtxbin;
91 for (UShort_t d=1; d<=3; d++) {
92 UShort_t nr = (d == 1 ? 1 : 2);
93 for (UShort_t q=0; q<nr; q++) {
94 Char_t r = (q == 0 ? 'I' : 'O');
95 TH2D* h = hists.Get(d,r);
98 if (fUseSecondaryMap && fSecondaryForMC) {
99 TH2D* bg = fcm.GetSecondaryMap()->GetCorrection(d,r,uvb);
101 AliWarning(Form("No secondary correction for FMDM%d%c in vertex bin %d",
105 // Divide by primary/total ratio
108 if (fUseVertexBias) {
109 TH2D* ef = fcm.GetVertexBias()->GetCorrection(r, uvb);
111 AliWarning(Form("No event vertex bias correction in vertex bin %d",
115 // Divide by the event selection efficiency
124 //____________________________________________________________________
126 AliFMDMCCorrector::SetupForData(const TAxis& eAxis)
129 // Initialize this object
132 // etaAxis Eta axis to use
134 AliFMDCorrector::SetupForData(eAxis);
136 fFMD1i = Make(1,'I',eAxis);
137 fFMD2i = Make(2,'I',eAxis);
138 fFMD2o = Make(2,'O',eAxis);
139 fFMD3i = Make(3,'I',eAxis);
140 fFMD3o = Make(3,'O',eAxis);
149 //____________________________________________________________________
151 AliFMDMCCorrector::Make(UShort_t d, Char_t r,
152 const TAxis& axis) const
155 // MAke comparison profiles
163 // Newly allocated profile object
165 TProfile2D* ret = new TProfile2D(Form("FMD%d%c_esd_vs_mc", d, r),
166 Form("ESD/MC signal for FMD%d%c", d, r),
170 (r == 'I' || r == 'i') ? 20 : 40,
172 ret->GetXaxis()->SetTitle("#eta");
173 ret->GetYaxis()->SetTitle("#varphi [degrees]");
174 ret->GetZaxis()->SetTitle("#LT primary density ESD/MC#GT");
175 ret->SetDirectory(0);
178 //____________________________________________________________________
180 AliFMDMCCorrector::Fill(UShort_t d, Char_t r, TH2* esd, TH2* mc)
183 // Fill comparison profiles
191 if (!esd || !mc) return;
194 case 1: p = fFMD1i; break;
195 case 2: p = (r == 'I' || r == 'i' ? fFMD2i : fFMD2o); break;
196 case 3: p = (r == 'I' || r == 'i' ? fFMD3i : fFMD3o); break;
200 for (Int_t iEta = 1; iEta <= esd->GetNbinsX(); iEta++) {
201 Double_t eta = esd->GetXaxis()->GetBinCenter(iEta);
202 for (Int_t iPhi = 1; iPhi <= esd->GetNbinsY(); iPhi++) {
203 Double_t phi = esd->GetYaxis()->GetBinCenter(iPhi);
204 Double_t mEsd = esd->GetBinContent(iEta,iPhi);
205 Double_t mMc = mc->GetBinContent(iEta,iPhi);
207 p->Fill(eta, phi, (mMc > 0 ? mEsd / mMc : 0));
212 //____________________________________________________________________
214 AliFMDMCCorrector::CompareResults(AliForwardUtil::Histos& esd,
215 AliForwardUtil::Histos& mc)
218 // Compare the result of analysing the ESD for
219 // the inclusive charged particle density to analysing
229 Fill(1, 'I', esd.Get(1,'I'), mc.Get(1,'I'));
230 Fill(2, 'I', esd.Get(2,'I'), mc.Get(2,'I'));
231 Fill(2, 'O', esd.Get(2,'O'), mc.Get(2,'O'));
232 Fill(3, 'I', esd.Get(3,'I'), mc.Get(3,'I'));
233 Fill(3, 'O', esd.Get(3,'O'), mc.Get(3,'O'));
238 //____________________________________________________________________
240 AliFMDMCCorrector::CreateOutputObjects(TList* dir)
243 // Output diagnostic histograms to directory
246 // dir List to write in
248 AliFMDCorrector::CreateOutputObjects(dir);
249 TList* d = static_cast<TList*>(dir->FindObject(GetName()));
252 fComps->SetName("esd_mc_comparison");
255 #define PFB(N,FLAG) \
257 AliForwardUtil::PrintName(N); \
258 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
261 //____________________________________________________________________
263 AliFMDMCCorrector::Print(Option_t* option) const
270 AliFMDCorrector::Print(option);
271 gROOT->IncreaseDirLevel();
272 PFB("Use sec. map on MC", fSecondaryForMC);
273 gROOT->DecreaseDirLevel();
276 //____________________________________________________________________