]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/AliForwardMCMultiplicityTask.cxx
New script to generate overview index. Javascript code to
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliForwardMCMultiplicityTask.cxx
CommitLineData
7984e5f7 1//
2// Calculate the multiplicity in the forward regions event-by-event
3//
4// Inputs:
5// - AliESDEvent
6// - Kinematics
7// - Track references
8//
9// Outputs:
10// - AliAODForwardMult
11//
12// Histograms
13//
14// Corrections used
15//
285e7b27 16#include "AliForwardMCMultiplicityTask.h"
17#include "AliTriggerAnalysis.h"
18#include "AliPhysicsSelection.h"
19#include "AliLog.h"
285e7b27 20#include "AliESDEvent.h"
21#include "AliAODHandler.h"
22#include "AliMultiplicity.h"
23#include "AliInputEventHandler.h"
24#include "AliForwardCorrectionManager.h"
25#include "AliAnalysisManager.h"
26#include <TH1.h>
27#include <TDirectory.h>
28#include <TTree.h>
29#include <TROOT.h>
285e7b27 30
31//====================================================================
32AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask()
33 : AliForwardMultiplicityBase(),
285e7b27 34 fESDFMD(),
285e7b27 35 fMCESDFMD(),
36 fMCHistos(),
37 fMCAODFMD(),
5bb5d1f6 38 fMCRingSums(),
4cbdf467 39 fPrimary(0),
285e7b27 40 fEventInspector(),
285e7b27 41 fSharingFilter(),
42 fDensityCalculator(),
43 fCorrections(),
44 fHistCollector(),
8449e3e0 45 fEventPlaneFinder()
285e7b27 46{
7984e5f7 47 //
48 // Constructor
49 //
285e7b27 50}
51
52//____________________________________________________________________
53AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const char* name)
54 : AliForwardMultiplicityBase(name),
285e7b27 55 fESDFMD(),
285e7b27 56 fMCESDFMD(),
57 fMCHistos(),
58 fMCAODFMD(kTRUE),
5bb5d1f6 59 fMCRingSums(),
4cbdf467 60 fPrimary(0),
285e7b27 61 fEventInspector("event"),
285e7b27 62 fSharingFilter("sharing"),
63 fDensityCalculator("density"),
64 fCorrections("corrections"),
65 fHistCollector("collector"),
8449e3e0 66 fEventPlaneFinder("eventplane")
285e7b27 67{
7984e5f7 68 //
69 // Constructor
70 //
71 // Parameters:
72 // name Name of task
73 //
f71c22f5
CHC
74 fPrimary = new TH2D("primary", "MC Primaries", 1,0,1,20,0,TMath::TwoPi());
75 fPrimary->SetXTitle("#eta");
76 fPrimary->SetYTitle("#varphi [radians]");
77 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
78 fPrimary->Sumw2();
79 fPrimary->SetStats(0);
80 fPrimary->SetDirectory(0);
285e7b27 81}
82
285e7b27 83//____________________________________________________________________
84void
8449e3e0 85AliForwardMCMultiplicityTask::SetOnlyPrimary(Bool_t use)
285e7b27 86{
8449e3e0 87 fSharingFilter.GetTrackDensity().SetUseOnlyPrimary(use);
88 fCorrections.SetSecondaryForMC(!use);
285e7b27 89}
8449e3e0 90
5bb5d1f6 91//____________________________________________________________________
92void
8449e3e0 93AliForwardMCMultiplicityTask::CreateBranches(AliAODHandler* ah)
5bb5d1f6 94{
8449e3e0 95 //
96 // Create output objects
97 //
98 //
99 AliForwardMultiplicityBase::CreateBranches(ah);
100
101 TObject* mcobj = &fMCAODFMD;
f71c22f5 102 ah->AddBranch("AliAODForwardMult", &mcobj);
8449e3e0 103 ah->AddBranch("TH2D", &fPrimary);
5bb5d1f6 104}
105
8449e3e0 106
285e7b27 107//____________________________________________________________________
8449e3e0 108void
c8b1a7db 109AliForwardMCMultiplicityTask::InitMembers(const TAxis& eta, const TAxis& vertex)
285e7b27 110{
7984e5f7 111 //
112 // Initialise the sub objects and stuff. Called on first event
113 //
114 //
c8b1a7db 115 AliForwardMultiplicityBase::InitMembers(eta, vertex);
1174780f 116
c8b1a7db 117 fMCHistos.Init(eta);
118 fMCAODFMD.Init(eta);
119 fMCRingSums.Init(eta);
120
121 AliForwardUtil::Histos::RebinEta(fPrimary, eta);
122 DMSG(fDebug,0,"Primary histogram rebinned to %d,%f,%f eta axis %d,%f,%f",
123 fPrimary->GetXaxis()->GetNbins(),
124 fPrimary->GetXaxis()->GetXmin(),
125 fPrimary->GetXaxis()->GetXmax(),
126 eta.GetNbins(),
127 eta.GetXmin(),
128 eta.GetXmax());
285e7b27 129
5bb5d1f6 130
131 TList* mcRings = new TList;
132 mcRings->SetName("mcRingSums");
133 mcRings->SetOwner();
134 fList->Add(mcRings);
135
136 mcRings->Add(fMCRingSums.Get(1, 'I'));
137 mcRings->Add(fMCRingSums.Get(2, 'I'));
138 mcRings->Add(fMCRingSums.Get(2, 'O'));
139 mcRings->Add(fMCRingSums.Get(3, 'I'));
140 mcRings->Add(fMCRingSums.Get(3, 'O'));
141 fMCRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
142 fMCRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
143 fMCRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
144 fMCRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
145 fMCRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
285e7b27 146}
147
285e7b27 148//____________________________________________________________________
c8b1a7db 149Bool_t
150AliForwardMCMultiplicityTask::PreEvent()
151{
152 if (fFirstEvent)
153 fEventInspector.ReadProductionDetails(MCEvent());
154 // Clear stuff
155 fHistos.Clear();
156 fESDFMD.Clear();
157 fAODFMD.Clear();
158 fAODEP.Clear();
159 fMCHistos.Clear();
160 fMCESDFMD.Clear();
161 fMCAODFMD.Clear();
162 fPrimary->Reset();
163 return true;
164}
165//____________________________________________________________________
166Bool_t
167AliForwardMCMultiplicityTask::Event(AliESDEvent& esd)
285e7b27 168{
7984e5f7 169 //
170 // Process each event
171 //
172 // Parameters:
173 // option Not used
174 //
175
f7cfc454 176 // Read production details
f7cfc454 177
285e7b27 178 // Get the input data
e1f47419 179 AliMCEvent* mcEvent = MCEvent();
c8b1a7db 180 if (!mcEvent) return false;
285e7b27 181
5bb5d1f6 182 Bool_t lowFlux = kFALSE;
183 UInt_t triggers = 0;
184 UShort_t ivz = 0;
5ca83fee 185 TVector3 ip(1024, 1024, 0);
21d778b1 186 Double_t cent = -1;
5bb5d1f6 187 UShort_t nClusters = 0;
c8b1a7db 188 UInt_t found = fEventInspector.Process(&esd, triggers, lowFlux,
5ca83fee 189 ivz, ip, cent, nClusters);
e1f47419 190 UShort_t ivzMC = 0;
191 Double_t vzMC = 0;
192 Double_t phiR = 0;
193 Double_t b = 0;
241cca4d 194 Double_t cMC = 0;
e308a636 195 Int_t npart = 0;
196 Int_t nbin = 0;
e1f47419 197 // UInt_t foundMC =
241cca4d 198 fEventInspector.ProcessMC(mcEvent, triggers, ivzMC, vzMC, b, cMC,
e308a636 199 npart, nbin, phiR);
73b32206 200 fEventInspector.CompareResults(ip.Z(), vzMC, cent, cMC, b, npart, nbin);
1dbfc345 201
e333578d 202 //Store all events
148c39de 203 MarkEventForStore();
e333578d 204
205 Bool_t isAccepted = true;
206 if (found & AliFMDEventInspector::kNoEvent) isAccepted = false; // return;
207 if (found & AliFMDEventInspector::kNoTriggers) isAccepted = false; // return;
148c39de 208 //MarkEventForStore();
b30dee70 209 // Always set the B trigger - each MC event _is_ a collision
210 triggers |= AliAODForwardMult::kB;
285e7b27 211 // Set trigger bits, and mark this event for storage
212 fAODFMD.SetTriggerBits(triggers);
e308a636 213 fAODFMD.SetSNN(fEventInspector.GetEnergy());
214 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
e58000b7 215 fAODFMD.SetCentrality(cent);
5bb5d1f6 216 fAODFMD.SetNClusters(nClusters);
e308a636 217
218 fMCAODFMD.SetTriggerBits(triggers);
219 fMCAODFMD.SetSNN(fEventInspector.GetEnergy());
220 fMCAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
221 fMCAODFMD.SetCentrality(cent);
5bb5d1f6 222 fMCAODFMD.SetNClusters(nClusters);
e58000b7 223
e1f47419 224 // Disable this check on SPD - will bias data
225 // if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
e333578d 226 if (found & AliFMDEventInspector::kNoFMD) isAccepted = false; // return;
227 if (found & AliFMDEventInspector::kNoVertex) isAccepted = false; // return;
228
229 if (isAccepted) {
5ca83fee 230 fAODFMD.SetIpZ(ip.Z());
231 fMCAODFMD.SetIpZ(ip.Z());
e333578d 232 }
233 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
285e7b27 234
235 // We we do not want to use low flux specific code, we disable it here.
236 if (!fEnableLowFlux) lowFlux = false;
148c39de 237
238
285e7b27 239
240 // Get FMD data
c8b1a7db 241 AliESDFMD* esdFMD = esd.GetFMDData();
e1f47419 242
285e7b27 243 // Apply the sharing filter (or hit merging or clustering if you like)
c8b1a7db 244 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD,ip.Z())){
285e7b27 245 AliWarning("Sharing filter failed!");
c8b1a7db 246 return false;
285e7b27 247 }
c8b1a7db 248 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, ip.Z(),fMCESDFMD,fPrimary)){
285e7b27 249 AliWarning("MC Sharing filter failed!");
c8b1a7db 250 return false;
285e7b27 251 }
dd556bcd 252
253 // Store some MC parameters in corners of histogram :-)
254 fPrimary->SetBinContent(0, 0, vzMC);
255 fPrimary->SetBinContent(fPrimary->GetNbinsX()+1,0, phiR);
256 fPrimary->SetBinContent(fPrimary->GetNbinsX()+1,fPrimary->GetNbinsY(),cMC);
257
258
c8b1a7db 259 if (!isAccepted)
260 // Exit on MC event w/o trigger, vertex, data - since there's no more
261 // to be done for MC
262 return false;
1dbfc345 263
148c39de 264 //MarkEventForStore();
285e7b27 265 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
266
285e7b27 267 // Calculate the inclusive charged particle density
5934a3e3 268 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) {
285e7b27 269 AliWarning("Density calculator failed!");
c8b1a7db 270 return false;
285e7b27 271 }
272 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
273 AliWarning("MC Density calculator failed!");
c8b1a7db 274 return false;
285e7b27 275 }
276 fDensityCalculator.CompareResults(fHistos, fMCHistos);
277
2b556440 278 if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
c8b1a7db 279 if (!fEventPlaneFinder.FindEventplane(&esd, fAODEP,
280 &(fAODFMD.GetHistogram()), &fHistos))
2b556440 281 AliWarning("Eventplane finder failed!");
282 }
283
285e7b27 284 // Do the secondary and other corrections.
285 if (!fCorrections.Correct(fHistos, ivz)) {
286 AliWarning("Corrections failed");
c8b1a7db 287 return false;
285e7b27 288 }
289 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
290 AliWarning("MC Corrections failed");
c8b1a7db 291 return false;
285e7b27 292 }
293 fCorrections.CompareResults(fHistos, fMCHistos);
294
5bb5d1f6 295 if (!fHistCollector.Collect(fHistos, fRingSums,
8449e3e0 296 ivz, fAODFMD.GetHistogram(),
297 fAODFMD.GetCentrality())) {
285e7b27 298 AliWarning("Histogram collector failed");
c8b1a7db 299 return false;
285e7b27 300 }
5bb5d1f6 301 if (!fHistCollector.Collect(fMCHistos, fMCRingSums,
c8b1a7db 302 ivz, fMCAODFMD.GetHistogram(), -1, true)) {
285e7b27 303 AliWarning("MC Histogram collector failed");
c8b1a7db 304 return false;
285e7b27 305 }
c8b1a7db 306#if 0
29132080 307 // Copy underflow bins to overflow bins - always full phi coverage
bfab35d9 308 TH2& hMC = fMCAODFMD.GetHistogram();
29132080 309 Int_t nEta = hMC.GetNbinsX();
310 Int_t nY = hMC.GetNbinsY();
311 for (Int_t iEta = 1; iEta <= nEta; iEta++) {
312 hMC.SetBinContent(iEta, nY+1, hMC.GetBinContent(iEta, 0));
313 }
c8b1a7db 314#endif
285e7b27 315
316 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
317 fHData->Add(&(fAODFMD.GetHistogram()));
318
c8b1a7db 319 return true;
285e7b27 320}
321
322//____________________________________________________________________
323void
8449e3e0 324AliForwardMCMultiplicityTask::EstimatedNdeta(const TList* input,
325 TList* output) const
285e7b27 326{
8449e3e0 327 AliForwardMultiplicityBase::EstimatedNdeta(input, output);
328 MakeRingdNdeta(input, "mcRingSums", output, "mcRingResults", 24);
285e7b27 329}
330
285e7b27 331
8449e3e0 332
285e7b27 333//
334// EOF
335//