1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 /* $Id: AliUEHistograms.cxx 20164 2007-08-14 15:31:50Z morsch $ */
20 // encapsulates several AliUEHist objects for a full UE analysis plus additional control histograms
23 // Author: Jan Fiete Grosse-Oetringhaus, Sara Vallero
25 #include "AliUEHistograms.h"
27 #include "AliCFContainer.h"
28 #include "AliVParticle.h"
29 #include "AliAODTrack.h"
37 #include "TLorentzVector.h"
39 ClassImp(AliUEHistograms)
41 const Int_t AliUEHistograms::fgkUEHists = 3;
43 AliUEHistograms::AliUEHistograms(const char* name, const char* histograms, const char* binning) :
52 fCorrelationLeading2Phi(0),
53 fCorrelationMultiplicity(0),
57 fEventCountDifferential(0),
58 fVertexContributors(0),
59 fCentralityDistribution(0),
60 fCentralityCorrelation(0),
62 fControlConvResoncances(0),
63 fEfficiencyCorrectionTriggers(0),
64 fEfficiencyCorrectionAssociated(0),
66 fTriggerSelectCharge(0),
67 fAssociatedSelectCharge(0),
68 fTriggerRestrictEta(-1),
70 fCutConversions(kFALSE),
71 fCutResonances(kFALSE),
72 fRejectResonanceDaughters(-1),
74 fWeightPerEvent(kFALSE),
76 fTwoTrackCutMinRadius(0.8),
82 // the string histograms defines which histograms are created:
83 // 1 = NumberDensitypT
85 // 3 = NumberDensityPhi
86 // 4 = NumberDensityPhiCentrality (other multiplicity for Pb)
88 AliLog::SetClassDebugLevel("AliCFContainer", -1);
89 AliLog::SetClassDebugLevel("AliCFGridSparse", -3);
91 fTwoTrackDistancePt[0] = 0;
92 fTwoTrackDistancePt[1] = 0;
94 TString histogramsStr(histograms);
96 TString defaultBinningStr;
97 defaultBinningStr = "eta: -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0\n"
98 "p_t_assoc: 0.5, 0.75, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 8.0\n"
99 "p_t_leading: 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0, 16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 20.5, 21.0, 21.5, 22.0, 22.5, 23.0, 23.5, 24.0, 24.5, 25.0, 25.5, 26.0, 26.5, 27.0, 27.5, 28.0, 28.5, 29.0, 29.5, 30.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 38.5, 39.0, 39.5, 40.0, 40.5, 41.0, 41.5, 42.0, 42.5, 43.0, 43.5, 44.0, 44.5, 45.0, 45.5, 46.0, 46.5, 47.0, 47.5, 48.0, 48.5, 49.0, 49.5, 50.0\n"
100 "p_t_leading_course: 0.5, 1.0, 2.0, 3.0, 4.0, 6.0, 8.0\n"
101 "p_t_eff: 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0\n"
102 "vertex_eff: -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10\n"
105 if (histogramsStr.Contains("4") || histogramsStr.Contains("5") || histogramsStr.Contains("6")) // Dphi Corr
107 if (histogramsStr.Contains("C"))
108 defaultBinningStr += "multiplicity: 0, 20, 40, 60, 80, 100.1\n"; // course
110 defaultBinningStr += "multiplicity: 0, 1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100.1\n";
112 if (histogramsStr.Contains("5"))
113 defaultBinningStr += "vertex: -7, -5, -3, -1, 1, 3, 5, 7\n";
115 defaultBinningStr += "vertex: -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10\n";
117 if (histogramsStr.Contains("R"))
118 defaultBinningStr += "delta_phi: -1.570796, -1.483530, -1.396263, -1.308997, -1.221730, -1.134464, -1.047198, -0.959931, -0.872665, -0.785398, -0.698132, -0.610865, -0.523599, -0.436332, -0.349066, -0.261799, -0.174533, -0.087266, 0.0, 0.087266, 0.174533, 0.261799, 0.349066, 0.436332, 0.523599, 0.610865, 0.698132, 0.785398, 0.872665, 0.959931, 1.047198, 1.134464, 1.221730, 1.308997, 1.396263, 1.483530, 1.570796, 1.658063, 1.745329, 1.832596, 1.919862, 2.007129, 2.094395, 2.181662, 2.268928, 2.356194, 2.443461, 2.530727, 2.617994, 2.705260, 2.792527, 2.879793, 2.967060, 3.054326, 3.141593, 3.228859, 3.316126, 3.403392, 3.490659, 3.577925, 3.665191, 3.752458, 3.839724, 3.926991, 4.014257, 4.101524, 4.188790, 4.276057, 4.363323, 4.450590, 4.537856, 4.625123, 4.712389\n" // this binning starts at -pi/2 and is modulo 3
119 "delta_eta: -2.4, -2.3, -2.2, -2.1, -2.0, -1.9, -1.8, -1.7, -1.6, -1.5, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,2.1, 2.2, 2.3, 2.4\n"
121 else // for TTR studies
122 defaultBinningStr += "delta_phi: -1.570796, -1.483530, -1.396263, -1.308997, -1.221730, -1.134464, -1.047198, -0.959931, -0.872665, -0.785398, -0.698132, -0.610865, -0.523599, -0.436332, -0.349066, -0.261799, -0.174533, -0.087266, -0.043633, -0.021817, 0.0, 0.021817, 0.043633, 0.087266, 0.174533, 0.261799, 0.349066, 0.436332, 0.523599, 0.610865, 0.698132, 0.785398, 0.872665, 0.959931, 1.047198, 1.134464, 1.221730, 1.308997, 1.396263, 1.483530, 1.570796, 1.658063, 1.745329, 1.832596, 1.919862, 2.007129, 2.094395, 2.181662, 2.268928, 2.356194, 2.443461, 2.530727, 2.617994, 2.705260, 2.792527, 2.879793, 2.967060, 3.054326, 3.141593, 3.228859, 3.316126, 3.403392, 3.490659, 3.577925, 3.665191, 3.752458, 3.839724, 3.926991, 4.014257, 4.101524, 4.188790, 4.276057, 4.363323, 4.450590, 4.537856, 4.625123, 4.712389\n"
123 "delta_eta: -2.0, -1.9, -1.8, -1.7, -1.6, -1.5, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, -0.05, -0.025, 0, 0.025, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0\n"
127 defaultBinningStr += "multiplicity: -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 200.0\n"
128 "delta_phi: -1.570796, -1.483530, -1.396263, -1.308997, -1.221730, -1.134464, -1.047198, -0.959931, -0.872665, -0.785398, -0.698132, -0.610865, -0.523599, -0.436332, -0.349066, -0.261799, -0.174533, -0.087266, 0.0, 0.087266, 0.174533, 0.261799, 0.349066, 0.436332, 0.523599, 0.610865, 0.698132, 0.785398, 0.872665, 0.959931, 1.047198, 1.134464, 1.221730, 1.308997, 1.396263, 1.483530, 1.570796, 1.658063, 1.745329, 1.832596, 1.919862, 2.007129, 2.094395, 2.181662, 2.268928, 2.356194, 2.443461, 2.530727, 2.617994, 2.705260, 2.792527, 2.879793, 2.967060, 3.054326, 3.141593, 3.228859, 3.316126, 3.403392, 3.490659, 3.577925, 3.665191, 3.752458, 3.839724, 3.926991, 4.014257, 4.101524, 4.188790, 4.276057, 4.363323, 4.450590, 4.537856, 4.625123, 4.712389\n"
129 "vertex: -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10\n"
132 // combine customBinning with defaultBinningStr -> use customBinning where available and otherwise defaultBinningStr
133 TString customBinning(binning);
136 TObjArray* lines = defaultBinningStr.Tokenize("\n");
137 for (Int_t i=0; i<lines->GetEntriesFast(); i++)
139 TString line(lines->At(i)->GetName());
140 TString tag = line(0, line.Index(":")+1);
141 if (!customBinning.BeginsWith(tag) && !customBinning.Contains(TString("\n") + tag))
142 binningStr += line + "\n";
144 Printf("Using custom binning for %s", tag.Data());
147 binningStr += customBinning;
149 if (histogramsStr.Contains("1"))
150 fNumberDensitypT = new AliUEHist("NumberDensitypT", binningStr);
151 if (histogramsStr.Contains("2"))
152 fSumpT = new AliUEHist("SumpT", binningStr);
154 if (histogramsStr.Contains("3"))
155 fNumberDensityPhi = new AliUEHist("NumberDensityPhi", binningStr);
156 else if (histogramsStr.Contains("4"))
157 fNumberDensityPhi = new AliUEHist("NumberDensityPhiCentrality", binningStr);
158 else if (histogramsStr.Contains("5") || histogramsStr.Contains("6"))
159 fNumberDensityPhi = new AliUEHist("NumberDensityPhiCentralityVtx", binningStr);
161 // do not add this hists to the directory
162 Bool_t oldStatus = TH1::AddDirectoryStatus();
163 TH1::AddDirectory(kFALSE);
165 if (!histogramsStr.Contains("4") && !histogramsStr.Contains("5") && !histogramsStr.Contains("6"))
167 fCorrelationpT = new TH2F("fCorrelationpT", ";p_{T,lead} (MC);p_{T,lead} (RECO)", 200, 0, 50, 200, 0, 50);
168 fCorrelationEta = new TH2F("fCorrelationEta", ";#eta_{lead} (MC);#eta_{T,lead} (RECO)", 200, -1, 1, 200, -1, 1);
169 fCorrelationPhi = new TH2F("fCorrelationPhi", ";#varphi_{lead} (MC);#varphi_{T,lead} (RECO)", 200, 0, TMath::TwoPi(), 200, 0, TMath::TwoPi());
173 fCorrelationpT = new TH2F("fCorrelationpT", ";Centrality;p_{T} (RECO)", 100, 0, 100.001, 200, 0, 50);
174 fCorrelationEta = new TH2F("fCorrelationEta", ";Centrality;#eta (RECO)", 100, 0, 100.001, 200, -5, 5);
175 fCorrelationPhi = new TH2F("fCorrelationPhi", ";Centrality;#varphi (RECO)", 100, 0, 100.001, 200, 0, TMath::TwoPi());
178 fCorrelationR = new TH2F("fCorrelationR", ";R;p_{T,lead} (MC)", 200, 0, 2, 200, 0, 50);
179 fCorrelationLeading2Phi = new TH2F("fCorrelationLeading2Phi", ";#Delta #varphi;p_{T,lead} (MC)", 200, -TMath::Pi(), TMath::Pi(), 200, 0, 50);
180 fCorrelationMultiplicity = new TH2F("fCorrelationMultiplicity", ";MC tracks;Reco tracks", 100, -0.5, 99.5, 100, -0.5, 99.5);
181 fYields = new TH3F("fYields", ";centrality;pT;eta", 100, 0, 100, 40, 0, 20, 100, -1, 1);
182 fInvYield2 = new TH2F("fInvYield2", ";centrality;pT;1/pT dNch/dpT", 100, 0, 100, 80, 0, 20);
184 if (!histogramsStr.Contains("4") && !histogramsStr.Contains("5") && !histogramsStr.Contains("6"))
186 fEventCount = new TH2F("fEventCount", ";step;event type;count", AliUEHist::fgkCFSteps+2, -2.5, -0.5 + AliUEHist::fgkCFSteps, 3, -0.5, 2.5);
187 fEventCount->GetYaxis()->SetBinLabel(1, "ND");
188 fEventCount->GetYaxis()->SetBinLabel(2, "SD");
189 fEventCount->GetYaxis()->SetBinLabel(3, "DD");
193 fEventCount = new TH2F("fEventCount", ";step;centrality;count", AliUEHist::fgkCFSteps+2, -2.5, -0.5 + AliUEHist::fgkCFSteps, fNumberDensityPhi->GetEventHist()->GetNBins(1), fNumberDensityPhi->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray());
196 fEventCountDifferential = new TH3F("fEventCountDifferential", ";p_{T,lead};step;event type", 100, 0, 50, AliUEHist::fgkCFSteps, -0.5, -0.5 + AliUEHist::fgkCFSteps, 3, -0.5, 2.5);
197 fEventCountDifferential->GetZaxis()->SetBinLabel(1, "ND");
198 fEventCountDifferential->GetZaxis()->SetBinLabel(2, "SD");
199 fEventCountDifferential->GetZaxis()->SetBinLabel(3, "DD");
201 fVertexContributors = new TH1F("fVertexContributors", ";contributors;count", 100, -0.5, 99.5);
203 if (fNumberDensityPhi)
205 fCentralityDistribution = new TH1F("fCentralityDistribution", ";centrality;count", fNumberDensityPhi->GetEventHist()->GetNBins(1), fNumberDensityPhi->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray());
206 fCentralityCorrelation = new TH2F("fCentralityCorrelation", ";centrality;multiplicity", 404, 0, 101, 200, 0, 4000);
209 fITSClusterMap = new TH3F("fITSClusterMap", "; its cluster map; centrality; pT", 256, -0.5, 255.5, 20, 0, 100.001, 100, 0, 20);
211 fControlConvResoncances = new TH2F("fControlConvResoncances", ";id;delta mass", 3, -0.5, 2.5, 100, -0.1, 0.1);
213 TH1::AddDirectory(oldStatus);
216 //_____________________________________________________________________________
217 AliUEHistograms::AliUEHistograms(const AliUEHistograms &c) :
218 TNamed(fName, fTitle),
221 fNumberDensityPhi(0),
226 fCorrelationLeading2Phi(0),
227 fCorrelationMultiplicity(0),
231 fEventCountDifferential(0),
232 fVertexContributors(0),
233 fCentralityDistribution(0),
234 fCentralityCorrelation(0),
236 fControlConvResoncances(0),
237 fEfficiencyCorrectionTriggers(0),
238 fEfficiencyCorrectionAssociated(0),
240 fTriggerSelectCharge(0),
241 fAssociatedSelectCharge(0),
242 fTriggerRestrictEta(-1),
243 fEtaOrdering(kFALSE),
244 fCutConversions(kFALSE),
245 fCutResonances(kFALSE),
246 fRejectResonanceDaughters(-1),
248 fWeightPerEvent(kFALSE),
250 fTwoTrackCutMinRadius(0.8),
255 // AliUEHistograms copy constructor
258 fTwoTrackDistancePt[0] = 0;
259 fTwoTrackDistancePt[1] = 0;
261 ((AliUEHistograms &) c).Copy(*this);
264 //____________________________________________________________________
265 AliUEHistograms::~AliUEHistograms()
272 void AliUEHistograms::DeleteContainers()
274 if (fNumberDensitypT)
276 delete fNumberDensitypT;
277 fNumberDensitypT = 0;
286 if (fNumberDensityPhi)
288 delete fNumberDensityPhi;
289 fNumberDensityPhi = 0;
294 delete fCorrelationpT;
300 delete fCorrelationEta;
306 delete fCorrelationPhi;
312 delete fCorrelationR;
316 if (fCorrelationLeading2Phi)
318 delete fCorrelationLeading2Phi;
319 fCorrelationLeading2Phi = 0;
322 if (fCorrelationMultiplicity)
324 delete fCorrelationMultiplicity;
325 fCorrelationMultiplicity = 0;
346 if (fEventCountDifferential)
348 delete fEventCountDifferential;
349 fEventCountDifferential = 0;
352 if (fVertexContributors)
354 delete fVertexContributors;
355 fVertexContributors = 0;
358 if (fCentralityDistribution)
360 delete fCentralityDistribution;
361 fCentralityDistribution = 0;
364 if (fCentralityCorrelation)
366 delete fCentralityCorrelation;
367 fCentralityCorrelation = 0;
372 delete fITSClusterMap;
376 for (Int_t i=0; i<2; i++)
377 if (fTwoTrackDistancePt[i])
379 delete fTwoTrackDistancePt[i];
380 fTwoTrackDistancePt[i] = 0;
383 if (fControlConvResoncances)
385 delete fControlConvResoncances;
386 fControlConvResoncances = 0;
389 if (fEfficiencyCorrectionTriggers)
391 delete fEfficiencyCorrectionTriggers;
392 fEfficiencyCorrectionTriggers = 0;
395 if (fEfficiencyCorrectionAssociated)
397 delete fEfficiencyCorrectionAssociated;
398 fEfficiencyCorrectionAssociated = 0;
402 AliUEHist* AliUEHistograms::GetUEHist(Int_t id)
404 // returns AliUEHist object, useful for loops
408 case 0: return fNumberDensitypT; break;
409 case 1: return fSumpT; break;
410 case 2: return fNumberDensityPhi; break;
416 //____________________________________________________________________
417 Int_t AliUEHistograms::CountParticles(TList* list, Float_t ptMin)
419 // counts the number of particles in the list with a pT above ptMin
420 // TODO eta cut needed here?
423 for (Int_t j=0; j<list->GetEntries(); j++)
424 if (((AliVParticle*) list->At(j))->Pt() > ptMin)
430 //____________________________________________________________________
431 void AliUEHistograms::Fill(Int_t eventType, Float_t zVtx, AliUEHist::CFStep step, AliVParticle* leading, TList* toward, TList* away, TList* min, TList* max)
433 // fills the UE event histograms
435 // this function needs the leading (track or jet or ...) and four lists of AliVParticles which contain the particles/tracks to be filled in the four regions
437 // if leading is not set, just fill event statistics
440 Int_t multiplicity = 0;
442 // TODO configurable?
443 Float_t ptMin = 0.15;
444 if (leading->Pt() > ptMin)
447 multiplicity += CountParticles(toward, ptMin);
448 multiplicity += CountParticles(away, ptMin);
449 multiplicity += CountParticles(min, ptMin);
450 multiplicity += CountParticles(max, ptMin);
452 FillRegion(AliUEHist::kToward, zVtx, step, leading, toward, multiplicity);
453 FillRegion(AliUEHist::kAway, zVtx, step, leading, away, multiplicity);
454 FillRegion(AliUEHist::kMin, zVtx, step, leading, min, multiplicity);
455 FillRegion(AliUEHist::kMax, zVtx, step, leading, max, multiplicity);
458 vars[0] = leading->Pt();
459 vars[1] = multiplicity;
461 for (Int_t i=0; i<fgkUEHists; i++)
463 GetUEHist(i)->GetEventHist()->Fill(vars, step);
465 fEventCountDifferential->Fill(leading->Pt(), step, eventType);
468 FillEvent(eventType, step);
471 //____________________________________________________________________
472 void AliUEHistograms::FillRegion(AliUEHist::Region region, Float_t zVtx, AliUEHist::CFStep step, AliVParticle* leading, TList* list, Int_t multiplicity)
474 // loops over AliVParticles in list and fills the given region at the given step
476 // See also Fill(...)
478 for (Int_t i=0; i<list->GetEntries(); i++)
480 AliVParticle* particle = (AliVParticle*) list->At(i);
483 vars[0] = particle->Eta();
484 vars[1] = particle->Pt();
485 vars[2] = leading->Pt();
486 vars[3] = multiplicity;
487 vars[4] = leading->Phi() - particle->Phi();
488 if (vars[4] > 1.5 * TMath::Pi())
489 vars[4] -= TMath::TwoPi();
490 if (vars[4] < -0.5 * TMath::Pi())
491 vars[4] += TMath::TwoPi();
494 if (fNumberDensitypT)
495 fNumberDensitypT->GetTrackHist(region)->Fill(vars, step);
498 fSumpT->GetTrackHist(region)->Fill(vars, step, particle->Pt());
500 // fill all in toward region (is anyway as function of delta phi!)
501 if (fNumberDensityPhi)
502 fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->Fill(vars, step);
506 //____________________________________________________________________
507 void AliUEHistograms::Fill(AliVParticle* leadingMC, AliVParticle* leadingReco)
509 // fills the correlation histograms
513 fCorrelationpT->Fill(leadingMC->Pt(), leadingReco->Pt());
514 if (leadingMC->Pt() > 0.5)
516 fCorrelationEta->Fill(leadingMC->Eta(), leadingReco->Eta());
517 fCorrelationPhi->Fill(leadingMC->Phi(), leadingReco->Phi());
520 Float_t phiDiff = leadingMC->Phi() - leadingReco->Phi();
521 if (phiDiff > TMath::Pi())
522 phiDiff -= TMath::TwoPi();
523 if (phiDiff < -TMath::Pi())
524 phiDiff += TMath::TwoPi();
526 Float_t etaDiff = leadingMC->Eta() - leadingReco->Eta();
528 fCorrelationR->Fill(TMath::Sqrt(phiDiff * phiDiff + etaDiff * etaDiff), leadingMC->Pt());
529 fCorrelationLeading2Phi->Fill(phiDiff, leadingMC->Pt());
533 fCorrelationpT->Fill(1.0, leadingReco->Pt());
534 if (leadingReco->Pt() > 0.5)
536 fCorrelationEta->Fill(0.0, leadingReco->Eta());
537 fCorrelationPhi->Fill(0.0, leadingReco->Phi());
542 //____________________________________________________________________
543 void AliUEHistograms::FillCorrelations(Double_t centrality, Float_t zVtx, AliUEHist::CFStep step, TObjArray* particles, TObjArray* mixed, Float_t weight, Bool_t firstTime, Bool_t twoTrackEfficiencyCut, Float_t bSign, Float_t twoTrackEfficiencyCutValue, Bool_t applyEfficiency)
545 // fills the fNumberDensityPhi histogram
547 // this function need a list of AliVParticles which contain the particles/tracks to be filled
549 // if mixed is non-0, mixed events are filled, the trigger particle is from particles, the associated from mixed
550 // if weight < 0, then the pt of the associated particle is filled as weight
552 Bool_t fillpT = kFALSE;
556 if (twoTrackEfficiencyCut && !fTwoTrackDistancePt[0])
558 // do not add this hists to the directory
559 Bool_t oldStatus = TH1::AddDirectoryStatus();
560 TH1::AddDirectory(kFALSE);
562 fTwoTrackDistancePt[0] = new TH3F("fTwoTrackDistancePt[0]", ";#Delta#eta;#Delta#varphi^{*}_{min};#Delta p_{T}", 100, -0.15, 0.15, 100, -0.05, 0.05, 20, 0, 10);
563 fTwoTrackDistancePt[1] = (TH3F*) fTwoTrackDistancePt[0]->Clone("fTwoTrackDistancePt[1]");
565 TH1::AddDirectory(oldStatus);
568 // Eta() is extremely time consuming, therefore cache it for the inner loop here:
569 TObjArray* input = (mixed) ? mixed : particles;
570 TArrayF eta(input->GetEntriesFast());
571 for (Int_t i=0; i<input->GetEntriesFast(); i++)
572 eta[i] = ((AliVParticle*) input->UncheckedAt(i))->Eta();
574 // if particles is not set, just fill event statistics
577 Int_t jMax = particles->GetEntriesFast();
579 jMax = mixed->GetEntriesFast();
581 TH1* triggerWeighting = 0;
584 TAxis* axis = fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->GetGrid(0)->GetGrid()->GetAxis(2);
585 triggerWeighting = new TH1F("triggerWeighting", "", axis->GetNbins(), axis->GetXbins()->GetArray());
587 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
589 AliVParticle* triggerParticle = (AliVParticle*) particles->UncheckedAt(i);
592 Float_t triggerEta = triggerParticle->Eta();
594 if (fTriggerRestrictEta > 0 && TMath::Abs(triggerEta) > fTriggerRestrictEta)
597 if (fOnlyOneEtaSide != 0)
599 if (fOnlyOneEtaSide * triggerEta < 0)
603 if (fTriggerSelectCharge != 0)
604 if (triggerParticle->Charge() * fTriggerSelectCharge < 0)
607 triggerWeighting->Fill(triggerParticle->Pt());
611 // identify K, Lambda candidates and flag those particles
612 // a TObject bit is used for this
613 const UInt_t kResonanceDaughterFlag = 1 << 14;
614 if (fRejectResonanceDaughters > 0)
616 Double_t resonanceMass = -1;
617 Double_t massDaughter1 = -1;
618 Double_t massDaughter2 = -1;
619 const Double_t interval = 0.02;
621 switch (fRejectResonanceDaughters)
623 case 1: resonanceMass = 1.2; massDaughter1 = 0.1396; massDaughter2 = 0.9383; break; // method test
624 case 2: resonanceMass = 0.4976; massDaughter1 = 0.1396; massDaughter2 = massDaughter1; break; // k0
625 case 3: resonanceMass = 1.115; massDaughter1 = 0.1396; massDaughter2 = 0.9383; break; // lambda
626 default: AliFatal(Form("Invalid setting %d", fRejectResonanceDaughters));
629 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
630 particles->UncheckedAt(i)->ResetBit(kResonanceDaughterFlag);
632 for (Int_t i=0; i<jMax; i++)
633 mixed->UncheckedAt(i)->ResetBit(kResonanceDaughterFlag);
635 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
637 AliVParticle* triggerParticle = (AliVParticle*) particles->UncheckedAt(i);
639 for (Int_t j=0; j<jMax; j++)
641 if (!mixed && i == j)
644 AliVParticle* particle = 0;
646 particle = (AliVParticle*) particles->UncheckedAt(j);
648 particle = (AliVParticle*) mixed->UncheckedAt(j);
650 // check if both particles point to the same element (does not occur for mixed events, but if subsets are mixed within the same event)
651 if (mixed && triggerParticle->IsEqual(particle))
654 if (triggerParticle->Charge() * particle->Charge() > 0)
657 Float_t mass = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerParticle->Eta(), triggerParticle->Phi(), particle->Pt(), particle->Eta(), particle->Phi(), massDaughter1, massDaughter2);
659 if (TMath::Abs(mass - resonanceMass*resonanceMass) < interval*5)
661 mass = GetInvMassSquared(triggerParticle->Pt(), triggerParticle->Eta(), triggerParticle->Phi(), particle->Pt(), particle->Eta(), particle->Phi(), massDaughter1, massDaughter2);
663 if (mass > (resonanceMass-interval)*(resonanceMass-interval) && mass < (resonanceMass+interval)*(resonanceMass+interval))
665 triggerParticle->SetBit(kResonanceDaughterFlag);
666 particle->SetBit(kResonanceDaughterFlag);
668 // Printf("Flagged %d %d %f", i, j, TMath::Sqrt(mass));
675 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
677 AliVParticle* triggerParticle = (AliVParticle*) particles->UncheckedAt(i);
680 Float_t triggerEta = triggerParticle->Eta();
682 if (fTriggerRestrictEta > 0 && TMath::Abs(triggerEta) > fTriggerRestrictEta)
685 if (fOnlyOneEtaSide != 0)
687 if (fOnlyOneEtaSide * triggerEta < 0)
691 if (fTriggerSelectCharge != 0)
692 if (triggerParticle->Charge() * fTriggerSelectCharge < 0)
695 if (fRejectResonanceDaughters > 0)
696 if (triggerParticle->TestBit(kResonanceDaughterFlag))
698 // Printf("Skipped i=%d", i);
702 for (Int_t j=0; j<jMax; j++)
704 if (!mixed && i == j)
707 AliVParticle* particle = 0;
709 particle = (AliVParticle*) particles->UncheckedAt(j);
711 particle = (AliVParticle*) mixed->UncheckedAt(j);
713 // check if both particles point to the same element (does not occur for mixed events, but if subsets are mixed within the same event)
714 if (mixed && triggerParticle->IsEqual(particle))
718 if (particle->Pt() >= triggerParticle->Pt())
721 if (fAssociatedSelectCharge != 0)
722 if (particle->Charge() * fAssociatedSelectCharge < 0)
725 if (fSelectCharge > 0)
728 if (fSelectCharge == 1 && particle->Charge() * triggerParticle->Charge() > 0)
732 if (fSelectCharge == 2 && particle->Charge() * triggerParticle->Charge() < 0)
738 if (triggerEta < 0 && eta[j] < triggerEta)
740 if (triggerEta > 0 && eta[j] > triggerEta)
744 if (fRejectResonanceDaughters > 0)
745 if (particle->TestBit(kResonanceDaughterFlag))
747 // Printf("Skipped j=%d", j);
752 if (fCutConversions && particle->Charge() * triggerParticle->Charge() < 0)
754 Float_t mass = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.510e-3, 0.510e-3);
758 mass = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.510e-3, 0.510e-3);
760 fControlConvResoncances->Fill(0.0, mass);
762 if (mass < 0.04*0.04)
768 if (fCutResonances && particle->Charge() * triggerParticle->Charge() < 0)
770 Float_t mass = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.1396);
772 const Float_t kK0smass = 0.4976;
774 if (TMath::Abs(mass - kK0smass*kK0smass) < 0.1)
776 mass = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.1396);
778 fControlConvResoncances->Fill(1, mass - kK0smass*kK0smass);
780 if (mass > (kK0smass-0.02)*(kK0smass-0.02) && mass < (kK0smass+0.02)*(kK0smass+0.02))
786 if (fCutResonances && particle->Charge() * triggerParticle->Charge() < 0)
788 Float_t mass1 = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.9383);
789 Float_t mass2 = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.9383, 0.1396);
791 const Float_t kLambdaMass = 1.115;
793 if (TMath::Abs(mass1 - kLambdaMass*kLambdaMass) < 0.1)
795 mass1 = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.9383);
797 fControlConvResoncances->Fill(2, mass1 - kLambdaMass*kLambdaMass);
799 if (mass1 > (kLambdaMass-0.02)*(kLambdaMass-0.02) && mass1 < (kLambdaMass+0.02)*(kLambdaMass+0.02))
802 if (TMath::Abs(mass2 - kLambdaMass*kLambdaMass) < 0.1)
804 mass2 = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.9383, 0.1396);
806 fControlConvResoncances->Fill(2, mass2 - kLambdaMass*kLambdaMass);
808 if (mass2 > (kLambdaMass-0.02)*(kLambdaMass-0.02) && mass2 < (kLambdaMass+0.02)*(kLambdaMass+0.02))
813 if (twoTrackEfficiencyCut)
815 // the variables & cuthave been developed by the HBT group
816 // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700
818 Float_t phi1 = triggerParticle->Phi();
819 Float_t pt1 = triggerParticle->Pt();
820 Float_t charge1 = triggerParticle->Charge();
822 Float_t phi2 = particle->Phi();
823 Float_t pt2 = particle->Pt();
824 Float_t charge2 = particle->Charge();
826 Float_t deta = triggerEta - eta[j];
829 if (TMath::Abs(deta) < twoTrackEfficiencyCutValue * 2.5 * 3)
831 // check first boundaries to see if is worth to loop and find the minimum
832 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, fTwoTrackCutMinRadius, bSign);
833 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
835 const Float_t kLimit = twoTrackEfficiencyCutValue * 3;
837 Float_t dphistarminabs = 1e5;
838 Float_t dphistarmin = 1e5;
839 if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0)
841 for (Double_t rad=fTwoTrackCutMinRadius; rad<2.51; rad+=0.01)
843 Float_t dphistar = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign);
845 Float_t dphistarabs = TMath::Abs(dphistar);
847 if (dphistarabs < dphistarminabs)
849 dphistarmin = dphistar;
850 dphistarminabs = dphistarabs;
854 fTwoTrackDistancePt[0]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
856 if (dphistarminabs < twoTrackEfficiencyCutValue && TMath::Abs(deta) < twoTrackEfficiencyCutValue)
858 // Printf("Removed track pair %d %d with %f %f %f %f %f %f %f %f %f", i, j, deta, dphistarminabs, phi1, pt1, charge1, phi2, pt2, charge2, bSign);
862 fTwoTrackDistancePt[1]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
868 vars[0] = triggerEta - eta[j];
869 vars[1] = particle->Pt();
870 vars[2] = triggerParticle->Pt();
871 vars[3] = centrality;
872 vars[4] = triggerParticle->Phi() - particle->Phi();
873 if (vars[4] > 1.5 * TMath::Pi())
874 vars[4] -= TMath::TwoPi();
875 if (vars[4] < -0.5 * TMath::Pi())
876 vars[4] += TMath::TwoPi();
880 weight = particle->Pt();
882 Double_t useWeight = weight;
885 if (fEfficiencyCorrectionAssociated)
888 // associated particle
889 effVars[0] = fEfficiencyCorrectionAssociated->GetAxis(0)->FindBin(eta[j]);
890 effVars[1] = fEfficiencyCorrectionAssociated->GetAxis(1)->FindBin(vars[1]); //pt
891 effVars[2] = fEfficiencyCorrectionAssociated->GetAxis(2)->FindBin(vars[3]); //centrality
892 effVars[3] = fEfficiencyCorrectionAssociated->GetAxis(3)->FindBin(vars[5]); //zVtx
894 // Printf("%d %d %d %d %f", effVars[0], effVars[1], effVars[2], effVars[3], fEfficiencyCorrectionAssociated->GetBinContent(effVars));
896 useWeight *= fEfficiencyCorrectionAssociated->GetBinContent(effVars);
898 if (fEfficiencyCorrectionTriggers)
902 effVars[0] = fEfficiencyCorrectionTriggers->GetAxis(0)->FindBin(triggerEta);
903 effVars[1] = fEfficiencyCorrectionTriggers->GetAxis(1)->FindBin(vars[2]); //pt
904 effVars[2] = fEfficiencyCorrectionTriggers->GetAxis(2)->FindBin(vars[3]); //centrality
905 effVars[3] = fEfficiencyCorrectionTriggers->GetAxis(3)->FindBin(vars[5]); //zVtx
906 useWeight *= fEfficiencyCorrectionTriggers->GetBinContent(effVars);
912 Int_t weightBin = triggerWeighting->GetXaxis()->FindBin(vars[2]);
913 // Printf("Using weight %f", triggerWeighting->GetBinContent(weightBin));
914 useWeight /= triggerWeighting->GetBinContent(weightBin);
917 // fill all in toward region and do not use the other regions
918 fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->Fill(vars, step, useWeight);
920 // Printf("%.2f %.2f --> %.2f", triggerEta, eta[j], vars[0]);
925 // once per trigger particle
927 vars[0] = triggerParticle->Pt();
928 vars[1] = centrality;
931 Double_t useWeight = 1;
932 if (fEfficiencyCorrectionTriggers && applyEfficiency)
937 effVars[0] = fEfficiencyCorrectionTriggers->GetAxis(0)->FindBin(triggerEta);
938 effVars[1] = fEfficiencyCorrectionTriggers->GetAxis(1)->FindBin(vars[0]); //pt
939 effVars[2] = fEfficiencyCorrectionTriggers->GetAxis(2)->FindBin(vars[1]); //centrality
940 effVars[3] = fEfficiencyCorrectionTriggers->GetAxis(3)->FindBin(vars[2]); //zVtx
941 useWeight *= fEfficiencyCorrectionTriggers->GetBinContent(effVars);
944 if (TMath::Abs(triggerEta) < 0.8 && triggerParticle->Pt() > 0)
945 fInvYield2->Fill(centrality, triggerParticle->Pt(), useWeight / triggerParticle->Pt());
949 // leads effectively to a filling of one entry per filled trigger particle pT bin
950 Int_t weightBin = triggerWeighting->GetXaxis()->FindBin(vars[0]);
951 // Printf("Using weight %f", triggerWeighting->GetBinContent(weightBin));
952 useWeight /= triggerWeighting->GetBinContent(weightBin);
955 fNumberDensityPhi->GetEventHist()->Fill(vars, step, useWeight);
958 fCorrelationpT->Fill(centrality, triggerParticle->Pt());
959 fCorrelationEta->Fill(centrality, triggerEta);
960 fCorrelationPhi->Fill(centrality, triggerParticle->Phi());
961 fYields->Fill(centrality, triggerParticle->Pt(), triggerEta);
963 /* if (dynamic_cast<AliAODTrack*>(triggerParticle))
964 fITSClusterMap->Fill(((AliAODTrack*) triggerParticle)->GetITSClusterMap(), centrality, triggerParticle->Pt());*/
968 if (triggerWeighting)
970 delete triggerWeighting;
971 triggerWeighting = 0;
975 fCentralityDistribution->Fill(centrality);
976 fCentralityCorrelation->Fill(centrality, particles->GetEntriesFast());
977 FillEvent(centrality, step);
980 //____________________________________________________________________
981 void AliUEHistograms::FillTrackingEfficiency(TObjArray* mc, TObjArray* recoPrim, TObjArray* recoAll, TObjArray* recoPrimPID, TObjArray* recoAllPID, TObjArray* fake, Int_t particleType, Double_t centrality, Double_t zVtx)
983 // fills the tracking efficiency objects
985 // mc: all primary MC particles
986 // recoPrim: reconstructed primaries (again MC particles)
987 // recoAll: reconstructed (again MC particles)
988 // recoPrim: reconstructed primaries with checks on PID (again MC particles)
989 // recoAll: reconstructed with checks on PID (again MC particles)
990 // particleType is: 0 for pion, 1 for kaon, 2 for proton, 3 for others
992 for (Int_t step=0; step<6; step++)
994 TObjArray* list = mc;
1009 for (Int_t i=0; i<list->GetEntriesFast(); i++)
1011 AliVParticle* particle = (AliVParticle*) list->UncheckedAt(i);
1013 vars[0] = particle->Eta();
1014 vars[1] = particle->Pt();
1015 vars[2] = particleType;
1016 vars[3] = centrality;
1019 for (Int_t j=0; j<fgkUEHists; j++)
1021 GetUEHist(j)->GetTrackHistEfficiency()->Fill(vars, step);
1026 //____________________________________________________________________
1027 void AliUEHistograms::FillFakePt(TObjArray* fake, Double_t centrality)
1029 TObjArray* tracksReco = (TObjArray*) fake->At(0);
1030 TObjArray* tracksMC = (TObjArray*) fake->At(1);
1032 if (tracksReco->GetEntriesFast() != tracksMC->GetEntriesFast())
1033 AliFatal(Form("Inconsistent arrays: %d vs %d", tracksReco->GetEntriesFast(), tracksMC->GetEntriesFast()));
1035 for (Int_t i=0; i<tracksReco->GetEntriesFast(); i++)
1037 AliVParticle* particle1 = (AliVParticle*) tracksReco->At(i);
1038 AliVParticle* particle2 = (AliVParticle*) tracksMC->At(i);
1040 vars[0] = particle1->Pt();
1041 vars[1] = particle2->Pt();
1042 vars[2] = centrality;
1043 for (Int_t j=0; j<fgkUEHists; j++)
1045 GetUEHist(j)->GetMCRecoPtCorrelation()->Fill(vars[0],vars[1],vars[2]);
1049 //____________________________________________________________________
1050 void AliUEHistograms::FillEvent(Int_t eventType, Int_t step)
1052 // fills the number of events at the given step and the given enty type
1054 // WARNING: This function is called from Fill, so only call it for steps where Fill is not called
1056 fEventCount->Fill(step, eventType);
1059 //____________________________________________________________________
1060 void AliUEHistograms::FillEvent(Double_t centrality, Int_t step)
1062 // fills the number of events at the given step and the given centrality
1064 // WARNING: This function is called from Fill, so only call it for steps where Fill is not called
1066 fEventCount->Fill(step, centrality);
1069 //____________________________________________________________________
1070 void AliUEHistograms::SetEtaRange(Float_t etaMin, Float_t etaMax)
1072 // sets eta min and max for all contained AliUEHist classes
1074 for (Int_t i=0; i<fgkUEHists; i++)
1076 GetUEHist(i)->SetEtaRange(etaMin, etaMax);
1079 //____________________________________________________________________
1080 void AliUEHistograms::SetPtRange(Float_t ptMin, Float_t ptMax)
1082 // sets pT min and max for all contained AliUEHist classes
1084 for (Int_t i=0; i<fgkUEHists; i++)
1086 GetUEHist(i)->SetPtRange(ptMin, ptMax);
1089 //____________________________________________________________________
1090 void AliUEHistograms::SetPartSpecies(Int_t species)
1092 // sets PartSpecie for all contained AliUEHist classes
1094 for (Int_t i=0; i<fgkUEHists; i++)
1096 GetUEHist(i)->SetPartSpecies(species);
1099 //____________________________________________________________________
1100 void AliUEHistograms::SetZVtxRange(Float_t min, Float_t max)
1102 // sets pT min and max for all contained AliUEHist classes
1104 for (Int_t i=0; i<fgkUEHists; i++)
1106 GetUEHist(i)->SetZVtxRange(min, max);
1109 //____________________________________________________________________
1110 void AliUEHistograms::SetContaminationEnhancement(TH1F* hist)
1112 // sets the contamination enhancement histogram in all contained AliUEHist classes
1114 for (Int_t i=0; i<fgkUEHists; i++)
1116 GetUEHist(i)->SetContaminationEnhancement(hist);
1119 //____________________________________________________________________
1120 void AliUEHistograms::SetCombineMinMax(Bool_t flag)
1122 // sets pT min and max for all contained AliUEHist classes
1124 for (Int_t i=0; i<fgkUEHists; i++)
1126 GetUEHist(i)->SetCombineMinMax(flag);
1129 //____________________________________________________________________
1130 void AliUEHistograms::SetTrackEtaCut(Float_t value)
1132 // sets track eta cut for all contained AliUEHist classes
1134 for (Int_t i=0; i<fgkUEHists; i++)
1136 GetUEHist(i)->SetTrackEtaCut(value);
1139 //____________________________________________________________________
1140 void AliUEHistograms::SetWeightPerEvent(Bool_t flag)
1142 // sets fWeightPerEvent for all contained AliUEHist classes
1144 fWeightPerEvent = flag;
1146 for (Int_t i=0; i<fgkUEHists; i++)
1148 GetUEHist(i)->SetWeightPerEvent(fWeightPerEvent);
1151 //____________________________________________________________________
1152 void AliUEHistograms::Correct(AliUEHistograms* corrections)
1154 // corrects the contained histograms by calling AliUEHist::Correct
1156 for (Int_t i=0; i<fgkUEHists; i++)
1158 GetUEHist(i)->Correct(corrections->GetUEHist(i));
1161 //____________________________________________________________________
1162 AliUEHistograms &AliUEHistograms::operator=(const AliUEHistograms &c)
1164 // assigment operator
1169 ((AliUEHistograms &) c).Copy(*this);
1174 //____________________________________________________________________
1175 void AliUEHistograms::Copy(TObject& c) const
1179 AliUEHistograms& target = (AliUEHistograms &) c;
1181 if (fNumberDensitypT)
1182 target.fNumberDensitypT = dynamic_cast<AliUEHist*> (fNumberDensitypT->Clone());
1185 target.fSumpT = dynamic_cast<AliUEHist*> (fSumpT->Clone());
1187 if (fNumberDensityPhi)
1188 target.fNumberDensityPhi = dynamic_cast<AliUEHist*> (fNumberDensityPhi->Clone());
1191 target.fCorrelationpT = dynamic_cast<TH2F*> (fCorrelationpT->Clone());
1193 if (fCorrelationEta)
1194 target.fCorrelationEta = dynamic_cast<TH2F*> (fCorrelationEta->Clone());
1196 if (fCorrelationPhi)
1197 target.fCorrelationPhi = dynamic_cast<TH2F*> (fCorrelationPhi->Clone());
1200 target.fCorrelationR = dynamic_cast<TH2F*> (fCorrelationR->Clone());
1202 if (fCorrelationLeading2Phi)
1203 target.fCorrelationLeading2Phi = dynamic_cast<TH2F*> (fCorrelationLeading2Phi->Clone());
1205 if (fCorrelationMultiplicity)
1206 target.fCorrelationMultiplicity = dynamic_cast<TH2F*> (fCorrelationMultiplicity->Clone());
1209 target.fYields = dynamic_cast<TH3F*> (fYields->Clone());
1212 target.fInvYield2 = dynamic_cast<TH2F*> (fInvYield2->Clone());
1215 target.fEventCount = dynamic_cast<TH2F*> (fEventCount->Clone());
1217 if (fEventCountDifferential)
1218 target.fEventCountDifferential = dynamic_cast<TH3F*> (fEventCountDifferential->Clone());
1220 if (fVertexContributors)
1221 target.fVertexContributors = dynamic_cast<TH1F*> (fVertexContributors->Clone());
1223 if (fCentralityDistribution)
1224 target.fCentralityDistribution = dynamic_cast<TH1F*> (fCentralityDistribution->Clone());
1226 if (fCentralityCorrelation)
1227 target.fCentralityCorrelation = dynamic_cast<TH2F*> (fCentralityCorrelation->Clone());
1230 target.fITSClusterMap = dynamic_cast<TH3F*> (fITSClusterMap->Clone());
1232 if (fControlConvResoncances)
1233 target.fControlConvResoncances = dynamic_cast<TH2F*> (fControlConvResoncances->Clone());
1235 for (Int_t i=0; i<2; i++)
1236 if (fTwoTrackDistancePt[i])
1237 target.fTwoTrackDistancePt[i] = dynamic_cast<TH3F*> (fTwoTrackDistancePt[i]->Clone());
1239 if (fEfficiencyCorrectionTriggers)
1240 target.fEfficiencyCorrectionTriggers = dynamic_cast<THnF*> (fEfficiencyCorrectionTriggers->Clone());
1242 if (fEfficiencyCorrectionAssociated)
1243 target.fEfficiencyCorrectionAssociated = dynamic_cast<THnF*> (fEfficiencyCorrectionAssociated->Clone());
1245 target.fSelectCharge = fSelectCharge;
1246 target.fTriggerSelectCharge = fTriggerSelectCharge;
1247 target.fAssociatedSelectCharge = fAssociatedSelectCharge;
1248 target.fTriggerRestrictEta = fTriggerRestrictEta;
1249 target.fEtaOrdering = fEtaOrdering;
1250 target.fCutConversions = fCutConversions;
1251 target.fCutResonances = fCutResonances;
1252 target.fOnlyOneEtaSide = fOnlyOneEtaSide;
1253 target.fWeightPerEvent = fWeightPerEvent;
1254 target.fRunNumber = fRunNumber;
1255 target.fMergeCount = fMergeCount;
1256 target.fWeightPerEvent = fWeightPerEvent;
1257 target.fPtOrder = fPtOrder;
1258 target.fTwoTrackCutMinRadius = fTwoTrackCutMinRadius;
1261 //____________________________________________________________________
1262 Long64_t AliUEHistograms::Merge(TCollection* list)
1264 // Merge a list of AliUEHistograms objects with this (needed for
1266 // Returns the number of merged objects (including this).
1271 if (list->IsEmpty())
1274 TIterator* iter = list->MakeIterator();
1277 // collections of objects
1278 const Int_t kMaxLists = 20;
1279 TList* lists[kMaxLists];
1281 for (Int_t i=0; i<kMaxLists; i++)
1282 lists[i] = new TList;
1285 while ((obj = iter->Next())) {
1287 AliUEHistograms* entry = dynamic_cast<AliUEHistograms*> (obj);
1291 if (entry->fNumberDensitypT)
1292 lists[0]->Add(entry->fNumberDensitypT);
1294 lists[1]->Add(entry->fSumpT);
1295 if (entry->fNumberDensityPhi)
1296 lists[2]->Add(entry->fNumberDensityPhi);
1297 lists[3]->Add(entry->fCorrelationpT);
1298 lists[4]->Add(entry->fCorrelationEta);
1299 lists[5]->Add(entry->fCorrelationPhi);
1300 lists[6]->Add(entry->fCorrelationR);
1301 lists[7]->Add(entry->fCorrelationLeading2Phi);
1302 lists[8]->Add(entry->fCorrelationMultiplicity);
1303 lists[9]->Add(entry->fEventCount);
1304 lists[10]->Add(entry->fEventCountDifferential);
1305 lists[11]->Add(entry->fVertexContributors);
1306 lists[12]->Add(entry->fCentralityDistribution);
1307 lists[13]->Add(entry->fITSClusterMap);
1308 if (entry->fTwoTrackDistancePt[0])
1309 lists[14]->Add(entry->fTwoTrackDistancePt[0]);
1310 if (entry->fTwoTrackDistancePt[1])
1311 lists[15]->Add(entry->fTwoTrackDistancePt[1]);
1312 if (entry->fCentralityCorrelation)
1313 lists[16]->Add(entry->fCentralityCorrelation);
1315 lists[17]->Add(entry->fYields);
1316 if (entry->fInvYield2)
1317 lists[18]->Add(entry->fInvYield2);
1318 if (entry->fControlConvResoncances)
1319 lists[19]->Add(entry->fControlConvResoncances);
1321 fMergeCount += entry->fMergeCount;
1326 if (fNumberDensitypT)
1327 fNumberDensitypT->Merge(lists[0]);
1329 fSumpT->Merge(lists[1]);
1330 if (fNumberDensityPhi)
1331 fNumberDensityPhi->Merge(lists[2]);
1332 fCorrelationpT->Merge(lists[3]);
1333 fCorrelationEta->Merge(lists[4]);
1334 fCorrelationPhi->Merge(lists[5]);
1335 fCorrelationR->Merge(lists[6]);
1336 fCorrelationLeading2Phi->Merge(lists[7]);
1337 fCorrelationMultiplicity->Merge(lists[8]);
1338 fEventCount->Merge(lists[9]);
1339 fEventCountDifferential->Merge(lists[10]);
1340 fVertexContributors->Merge(lists[11]);
1341 fCentralityDistribution->Merge(lists[12]);
1342 fITSClusterMap->Merge(lists[13]);
1343 if (fTwoTrackDistancePt[0] && lists[14]->GetEntries() > 0)
1344 fTwoTrackDistancePt[0]->Merge(lists[14]);
1345 if (fTwoTrackDistancePt[1] && lists[15]->GetEntries() > 0)
1346 fTwoTrackDistancePt[1]->Merge(lists[15]);
1347 if (fCentralityCorrelation)
1348 fCentralityCorrelation->Merge(lists[16]);
1349 if (fYields && lists[17]->GetEntries() > 0)
1350 fYields->Merge(lists[17]);
1351 if (fInvYield2 && lists[18]->GetEntries() > 0)
1352 fInvYield2->Merge(lists[18]);
1353 if (fControlConvResoncances && lists[19]->GetEntries() > 0)
1354 fControlConvResoncances->Merge(lists[19]);
1356 for (Int_t i=0; i<kMaxLists; i++)
1362 void AliUEHistograms::CopyReconstructedData(AliUEHistograms* from)
1364 // copies those histograms extracted from ESD to this object
1366 for (Int_t i=0; i<fgkUEHists; i++)
1368 GetUEHist(i)->CopyReconstructedData(from->GetUEHist(i));
1371 void AliUEHistograms::DeepCopy(AliUEHistograms* from)
1373 // copies the entries of this object's members from the object <from> to this object
1375 for (Int_t i=0; i<fgkUEHists; i++)
1376 if (GetUEHist(i) && from->GetUEHist(i))
1377 GetUEHist(i)->DeepCopy(from->GetUEHist(i));
1380 void AliUEHistograms::ExtendTrackingEfficiency(Bool_t verbose)
1382 // delegates to AliUEHists
1384 for (Int_t i=0; i<fgkUEHists; i++)
1386 GetUEHist(i)->ExtendTrackingEfficiency(verbose);
1389 void AliUEHistograms::Scale(Double_t factor)
1391 // scales all contained histograms by the given factor
1393 for (Int_t i=0; i<fgkUEHists; i++)
1395 GetUEHist(i)->Scale(factor);
1398 list.Add(fCorrelationpT);
1399 list.Add(fCorrelationEta);
1400 list.Add(fCorrelationPhi);
1401 list.Add(fCorrelationR);
1402 list.Add(fCorrelationLeading2Phi);
1403 list.Add(fCorrelationMultiplicity);
1405 list.Add(fInvYield2);
1406 list.Add(fEventCount);
1407 list.Add(fEventCountDifferential);
1408 list.Add(fVertexContributors);
1409 list.Add(fCentralityDistribution);
1410 list.Add(fCentralityCorrelation);
1411 list.Add(fITSClusterMap);
1412 list.Add(fTwoTrackDistancePt[0]);
1413 list.Add(fTwoTrackDistancePt[1]);
1414 list.Add(fControlConvResoncances);
1416 for (Int_t i=0; i<list.GetEntries(); i++)
1417 ((TH1*) list.At(i))->Scale(factor);
1420 void AliUEHistograms::Reset()
1422 // delegates to AliUEHists
1424 for (Int_t i=0; i<fgkUEHists; i++)
1426 GetUEHist(i)->Reset();