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 binningStr = AliUEHist::CombineBinning(defaultBinningStr, TString(binning));
135 if (histogramsStr.Contains("1"))
136 fNumberDensitypT = new AliUEHist("NumberDensitypT", binningStr);
137 if (histogramsStr.Contains("2"))
138 fSumpT = new AliUEHist("SumpT", binningStr);
140 if (histogramsStr.Contains("3"))
141 fNumberDensityPhi = new AliUEHist("NumberDensityPhi", binningStr);
142 else if (histogramsStr.Contains("4"))
143 fNumberDensityPhi = new AliUEHist("NumberDensityPhiCentrality", binningStr);
144 else if (histogramsStr.Contains("5") || histogramsStr.Contains("6"))
145 fNumberDensityPhi = new AliUEHist("NumberDensityPhiCentralityVtx", binningStr);
147 // do not add this hists to the directory
148 Bool_t oldStatus = TH1::AddDirectoryStatus();
149 TH1::AddDirectory(kFALSE);
151 if (!histogramsStr.Contains("4") && !histogramsStr.Contains("5") && !histogramsStr.Contains("6"))
153 fCorrelationpT = new TH2F("fCorrelationpT", ";p_{T,lead} (MC);p_{T,lead} (RECO)", 200, 0, 50, 200, 0, 50);
154 fCorrelationEta = new TH2F("fCorrelationEta", ";#eta_{lead} (MC);#eta_{T,lead} (RECO)", 200, -1, 1, 200, -1, 1);
155 fCorrelationPhi = new TH2F("fCorrelationPhi", ";#varphi_{lead} (MC);#varphi_{T,lead} (RECO)", 200, 0, TMath::TwoPi(), 200, 0, TMath::TwoPi());
159 fCorrelationpT = new TH2F("fCorrelationpT", ";Centrality;p_{T} (RECO)", 100, 0, 100.001, 200, 0, 50);
160 fCorrelationEta = new TH2F("fCorrelationEta", ";Centrality;#eta (RECO)", 100, 0, 100.001, 200, -5, 5);
161 fCorrelationPhi = new TH2F("fCorrelationPhi", ";Centrality;#varphi (RECO)", 100, 0, 100.001, 200, 0, TMath::TwoPi());
164 fCorrelationR = new TH2F("fCorrelationR", ";R;p_{T,lead} (MC)", 200, 0, 2, 200, 0, 50);
165 fCorrelationLeading2Phi = new TH2F("fCorrelationLeading2Phi", ";#Delta #varphi;p_{T,lead} (MC)", 200, -TMath::Pi(), TMath::Pi(), 200, 0, 50);
166 fCorrelationMultiplicity = new TH2F("fCorrelationMultiplicity", ";MC tracks;Reco tracks", 100, -0.5, 99.5, 100, -0.5, 99.5);
167 fYields = new TH3F("fYields", ";centrality;pT;eta", 100, 0, 100, 40, 0, 20, 100, -1, 1);
168 fInvYield2 = new TH2F("fInvYield2", ";centrality;pT;1/pT dNch/dpT", 100, 0, 100, 80, 0, 20);
170 if (!histogramsStr.Contains("4") && !histogramsStr.Contains("5") && !histogramsStr.Contains("6"))
172 fEventCount = new TH2F("fEventCount", ";step;event type;count", AliUEHist::fgkCFSteps+2, -2.5, -0.5 + AliUEHist::fgkCFSteps, 3, -0.5, 2.5);
173 fEventCount->GetYaxis()->SetBinLabel(1, "ND");
174 fEventCount->GetYaxis()->SetBinLabel(2, "SD");
175 fEventCount->GetYaxis()->SetBinLabel(3, "DD");
179 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());
182 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);
183 fEventCountDifferential->GetZaxis()->SetBinLabel(1, "ND");
184 fEventCountDifferential->GetZaxis()->SetBinLabel(2, "SD");
185 fEventCountDifferential->GetZaxis()->SetBinLabel(3, "DD");
187 fVertexContributors = new TH1F("fVertexContributors", ";contributors;count", 100, -0.5, 99.5);
189 if (fNumberDensityPhi)
191 fCentralityDistribution = new TH1F("fCentralityDistribution", ";centrality;count", fNumberDensityPhi->GetEventHist()->GetNBins(1), fNumberDensityPhi->GetEventHist()->GetAxis(1, 0)->GetXbins()->GetArray());
192 fCentralityCorrelation = new TH2F("fCentralityCorrelation", ";centrality;multiplicity", 404, 0, 101, 200, 0, 4000);
195 fITSClusterMap = new TH3F("fITSClusterMap", "; its cluster map; centrality; pT", 256, -0.5, 255.5, 20, 0, 100.001, 100, 0, 20);
197 fControlConvResoncances = new TH2F("fControlConvResoncances", ";id;delta mass", 3, -0.5, 2.5, 100, -0.1, 0.1);
199 TH1::AddDirectory(oldStatus);
202 //_____________________________________________________________________________
203 AliUEHistograms::AliUEHistograms(const AliUEHistograms &c) :
204 TNamed(fName, fTitle),
207 fNumberDensityPhi(0),
212 fCorrelationLeading2Phi(0),
213 fCorrelationMultiplicity(0),
217 fEventCountDifferential(0),
218 fVertexContributors(0),
219 fCentralityDistribution(0),
220 fCentralityCorrelation(0),
222 fControlConvResoncances(0),
223 fEfficiencyCorrectionTriggers(0),
224 fEfficiencyCorrectionAssociated(0),
226 fTriggerSelectCharge(0),
227 fAssociatedSelectCharge(0),
228 fTriggerRestrictEta(-1),
229 fEtaOrdering(kFALSE),
230 fCutConversions(kFALSE),
231 fCutResonances(kFALSE),
232 fRejectResonanceDaughters(-1),
234 fWeightPerEvent(kFALSE),
236 fTwoTrackCutMinRadius(0.8),
241 // AliUEHistograms copy constructor
244 fTwoTrackDistancePt[0] = 0;
245 fTwoTrackDistancePt[1] = 0;
247 ((AliUEHistograms &) c).Copy(*this);
250 //____________________________________________________________________
251 AliUEHistograms::~AliUEHistograms()
258 void AliUEHistograms::DeleteContainers()
260 if (fNumberDensitypT)
262 delete fNumberDensitypT;
263 fNumberDensitypT = 0;
272 if (fNumberDensityPhi)
274 delete fNumberDensityPhi;
275 fNumberDensityPhi = 0;
280 delete fCorrelationpT;
286 delete fCorrelationEta;
292 delete fCorrelationPhi;
298 delete fCorrelationR;
302 if (fCorrelationLeading2Phi)
304 delete fCorrelationLeading2Phi;
305 fCorrelationLeading2Phi = 0;
308 if (fCorrelationMultiplicity)
310 delete fCorrelationMultiplicity;
311 fCorrelationMultiplicity = 0;
332 if (fEventCountDifferential)
334 delete fEventCountDifferential;
335 fEventCountDifferential = 0;
338 if (fVertexContributors)
340 delete fVertexContributors;
341 fVertexContributors = 0;
344 if (fCentralityDistribution)
346 delete fCentralityDistribution;
347 fCentralityDistribution = 0;
350 if (fCentralityCorrelation)
352 delete fCentralityCorrelation;
353 fCentralityCorrelation = 0;
358 delete fITSClusterMap;
362 for (Int_t i=0; i<2; i++)
363 if (fTwoTrackDistancePt[i])
365 delete fTwoTrackDistancePt[i];
366 fTwoTrackDistancePt[i] = 0;
369 if (fControlConvResoncances)
371 delete fControlConvResoncances;
372 fControlConvResoncances = 0;
375 if (fEfficiencyCorrectionTriggers)
377 delete fEfficiencyCorrectionTriggers;
378 fEfficiencyCorrectionTriggers = 0;
381 if (fEfficiencyCorrectionAssociated)
383 delete fEfficiencyCorrectionAssociated;
384 fEfficiencyCorrectionAssociated = 0;
388 AliUEHist* AliUEHistograms::GetUEHist(Int_t id)
390 // returns AliUEHist object, useful for loops
394 case 0: return fNumberDensitypT; break;
395 case 1: return fSumpT; break;
396 case 2: return fNumberDensityPhi; break;
402 //____________________________________________________________________
403 Int_t AliUEHistograms::CountParticles(TList* list, Float_t ptMin)
405 // counts the number of particles in the list with a pT above ptMin
406 // TODO eta cut needed here?
409 for (Int_t j=0; j<list->GetEntries(); j++)
410 if (((AliVParticle*) list->At(j))->Pt() > ptMin)
416 //____________________________________________________________________
417 void AliUEHistograms::Fill(Int_t eventType, Float_t zVtx, AliUEHist::CFStep step, AliVParticle* leading, TList* toward, TList* away, TList* min, TList* max)
419 // fills the UE event histograms
421 // 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
423 // if leading is not set, just fill event statistics
426 Int_t multiplicity = 0;
428 // TODO configurable?
429 Float_t ptMin = 0.15;
430 if (leading->Pt() > ptMin)
433 multiplicity += CountParticles(toward, ptMin);
434 multiplicity += CountParticles(away, ptMin);
435 multiplicity += CountParticles(min, ptMin);
436 multiplicity += CountParticles(max, ptMin);
438 FillRegion(AliUEHist::kToward, zVtx, step, leading, toward, multiplicity);
439 FillRegion(AliUEHist::kAway, zVtx, step, leading, away, multiplicity);
440 FillRegion(AliUEHist::kMin, zVtx, step, leading, min, multiplicity);
441 FillRegion(AliUEHist::kMax, zVtx, step, leading, max, multiplicity);
444 vars[0] = leading->Pt();
445 vars[1] = multiplicity;
447 for (Int_t i=0; i<fgkUEHists; i++)
449 GetUEHist(i)->GetEventHist()->Fill(vars, step);
451 fEventCountDifferential->Fill(leading->Pt(), step, eventType);
454 FillEvent(eventType, step);
457 //____________________________________________________________________
458 void AliUEHistograms::FillRegion(AliUEHist::Region region, Float_t zVtx, AliUEHist::CFStep step, AliVParticle* leading, TList* list, Int_t multiplicity)
460 // loops over AliVParticles in list and fills the given region at the given step
462 // See also Fill(...)
464 for (Int_t i=0; i<list->GetEntries(); i++)
466 AliVParticle* particle = (AliVParticle*) list->At(i);
469 vars[0] = particle->Eta();
470 vars[1] = particle->Pt();
471 vars[2] = leading->Pt();
472 vars[3] = multiplicity;
473 vars[4] = leading->Phi() - particle->Phi();
474 if (vars[4] > 1.5 * TMath::Pi())
475 vars[4] -= TMath::TwoPi();
476 if (vars[4] < -0.5 * TMath::Pi())
477 vars[4] += TMath::TwoPi();
480 if (fNumberDensitypT)
481 fNumberDensitypT->GetTrackHist(region)->Fill(vars, step);
484 fSumpT->GetTrackHist(region)->Fill(vars, step, particle->Pt());
486 // fill all in toward region (is anyway as function of delta phi!)
487 if (fNumberDensityPhi)
488 fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->Fill(vars, step);
492 //____________________________________________________________________
493 void AliUEHistograms::Fill(AliVParticle* leadingMC, AliVParticle* leadingReco)
495 // fills the correlation histograms
499 fCorrelationpT->Fill(leadingMC->Pt(), leadingReco->Pt());
500 if (leadingMC->Pt() > 0.5)
502 fCorrelationEta->Fill(leadingMC->Eta(), leadingReco->Eta());
503 fCorrelationPhi->Fill(leadingMC->Phi(), leadingReco->Phi());
506 Float_t phiDiff = leadingMC->Phi() - leadingReco->Phi();
507 if (phiDiff > TMath::Pi())
508 phiDiff -= TMath::TwoPi();
509 if (phiDiff < -TMath::Pi())
510 phiDiff += TMath::TwoPi();
512 Float_t etaDiff = leadingMC->Eta() - leadingReco->Eta();
514 fCorrelationR->Fill(TMath::Sqrt(phiDiff * phiDiff + etaDiff * etaDiff), leadingMC->Pt());
515 fCorrelationLeading2Phi->Fill(phiDiff, leadingMC->Pt());
519 fCorrelationpT->Fill(1.0, leadingReco->Pt());
520 if (leadingReco->Pt() > 0.5)
522 fCorrelationEta->Fill(0.0, leadingReco->Eta());
523 fCorrelationPhi->Fill(0.0, leadingReco->Phi());
528 //____________________________________________________________________
529 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)
531 // fills the fNumberDensityPhi histogram
533 // this function need a list of AliVParticles which contain the particles/tracks to be filled
535 // if mixed is non-0, mixed events are filled, the trigger particle is from particles, the associated from mixed
536 // if weight < 0, then the pt of the associated particle is filled as weight
538 Bool_t fillpT = kFALSE;
542 if (twoTrackEfficiencyCut && !fTwoTrackDistancePt[0])
544 // do not add this hists to the directory
545 Bool_t oldStatus = TH1::AddDirectoryStatus();
546 TH1::AddDirectory(kFALSE);
548 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);
549 fTwoTrackDistancePt[1] = (TH3F*) fTwoTrackDistancePt[0]->Clone("fTwoTrackDistancePt[1]");
551 TH1::AddDirectory(oldStatus);
554 // Eta() is extremely time consuming, therefore cache it for the inner loop here:
555 TObjArray* input = (mixed) ? mixed : particles;
556 TArrayF eta(input->GetEntriesFast());
557 for (Int_t i=0; i<input->GetEntriesFast(); i++)
558 eta[i] = ((AliVParticle*) input->UncheckedAt(i))->Eta();
560 // if particles is not set, just fill event statistics
563 Int_t jMax = particles->GetEntriesFast();
565 jMax = mixed->GetEntriesFast();
567 TH1* triggerWeighting = 0;
570 TAxis* axis = fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->GetGrid(0)->GetGrid()->GetAxis(2);
571 triggerWeighting = new TH1F("triggerWeighting", "", axis->GetNbins(), axis->GetXbins()->GetArray());
573 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
575 AliVParticle* triggerParticle = (AliVParticle*) particles->UncheckedAt(i);
578 Float_t triggerEta = triggerParticle->Eta();
580 if (fTriggerRestrictEta > 0 && TMath::Abs(triggerEta) > fTriggerRestrictEta)
583 if (fOnlyOneEtaSide != 0)
585 if (fOnlyOneEtaSide * triggerEta < 0)
589 if (fTriggerSelectCharge != 0)
590 if (triggerParticle->Charge() * fTriggerSelectCharge < 0)
593 triggerWeighting->Fill(triggerParticle->Pt());
597 // identify K, Lambda candidates and flag those particles
598 // a TObject bit is used for this
599 const UInt_t kResonanceDaughterFlag = 1 << 14;
600 if (fRejectResonanceDaughters > 0)
602 Double_t resonanceMass = -1;
603 Double_t massDaughter1 = -1;
604 Double_t massDaughter2 = -1;
605 const Double_t interval = 0.02;
607 switch (fRejectResonanceDaughters)
609 case 1: resonanceMass = 1.2; massDaughter1 = 0.1396; massDaughter2 = 0.9383; break; // method test
610 case 2: resonanceMass = 0.4976; massDaughter1 = 0.1396; massDaughter2 = massDaughter1; break; // k0
611 case 3: resonanceMass = 1.115; massDaughter1 = 0.1396; massDaughter2 = 0.9383; break; // lambda
612 default: AliFatal(Form("Invalid setting %d", fRejectResonanceDaughters));
615 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
616 particles->UncheckedAt(i)->ResetBit(kResonanceDaughterFlag);
618 for (Int_t i=0; i<jMax; i++)
619 mixed->UncheckedAt(i)->ResetBit(kResonanceDaughterFlag);
621 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
623 AliVParticle* triggerParticle = (AliVParticle*) particles->UncheckedAt(i);
625 for (Int_t j=0; j<jMax; j++)
627 if (!mixed && i == j)
630 AliVParticle* particle = 0;
632 particle = (AliVParticle*) particles->UncheckedAt(j);
634 particle = (AliVParticle*) mixed->UncheckedAt(j);
636 // check if both particles point to the same element (does not occur for mixed events, but if subsets are mixed within the same event)
637 if (mixed && triggerParticle->IsEqual(particle))
640 if (triggerParticle->Charge() * particle->Charge() > 0)
643 Float_t mass = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerParticle->Eta(), triggerParticle->Phi(), particle->Pt(), particle->Eta(), particle->Phi(), massDaughter1, massDaughter2);
645 if (TMath::Abs(mass - resonanceMass*resonanceMass) < interval*5)
647 mass = GetInvMassSquared(triggerParticle->Pt(), triggerParticle->Eta(), triggerParticle->Phi(), particle->Pt(), particle->Eta(), particle->Phi(), massDaughter1, massDaughter2);
649 if (mass > (resonanceMass-interval)*(resonanceMass-interval) && mass < (resonanceMass+interval)*(resonanceMass+interval))
651 triggerParticle->SetBit(kResonanceDaughterFlag);
652 particle->SetBit(kResonanceDaughterFlag);
654 // Printf("Flagged %d %d %f", i, j, TMath::Sqrt(mass));
661 for (Int_t i=0; i<particles->GetEntriesFast(); i++)
663 AliVParticle* triggerParticle = (AliVParticle*) particles->UncheckedAt(i);
666 Float_t triggerEta = triggerParticle->Eta();
668 if (fTriggerRestrictEta > 0 && TMath::Abs(triggerEta) > fTriggerRestrictEta)
671 if (fOnlyOneEtaSide != 0)
673 if (fOnlyOneEtaSide * triggerEta < 0)
677 if (fTriggerSelectCharge != 0)
678 if (triggerParticle->Charge() * fTriggerSelectCharge < 0)
681 if (fRejectResonanceDaughters > 0)
682 if (triggerParticle->TestBit(kResonanceDaughterFlag))
684 // Printf("Skipped i=%d", i);
688 for (Int_t j=0; j<jMax; j++)
690 if (!mixed && i == j)
693 AliVParticle* particle = 0;
695 particle = (AliVParticle*) particles->UncheckedAt(j);
697 particle = (AliVParticle*) mixed->UncheckedAt(j);
699 // check if both particles point to the same element (does not occur for mixed events, but if subsets are mixed within the same event)
700 if (mixed && triggerParticle->IsEqual(particle))
704 if (particle->Pt() >= triggerParticle->Pt())
707 if (fAssociatedSelectCharge != 0)
708 if (particle->Charge() * fAssociatedSelectCharge < 0)
711 if (fSelectCharge > 0)
714 if (fSelectCharge == 1 && particle->Charge() * triggerParticle->Charge() > 0)
718 if (fSelectCharge == 2 && particle->Charge() * triggerParticle->Charge() < 0)
724 if (triggerEta < 0 && eta[j] < triggerEta)
726 if (triggerEta > 0 && eta[j] > triggerEta)
730 if (fRejectResonanceDaughters > 0)
731 if (particle->TestBit(kResonanceDaughterFlag))
733 // Printf("Skipped j=%d", j);
738 if (fCutConversions && particle->Charge() * triggerParticle->Charge() < 0)
740 Float_t mass = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.510e-3, 0.510e-3);
744 mass = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.510e-3, 0.510e-3);
746 fControlConvResoncances->Fill(0.0, mass);
748 if (mass < 0.04*0.04)
754 if (fCutResonances && particle->Charge() * triggerParticle->Charge() < 0)
756 Float_t mass = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.1396);
758 const Float_t kK0smass = 0.4976;
760 if (TMath::Abs(mass - kK0smass*kK0smass) < 0.1)
762 mass = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.1396);
764 fControlConvResoncances->Fill(1, mass - kK0smass*kK0smass);
766 if (mass > (kK0smass-0.02)*(kK0smass-0.02) && mass < (kK0smass+0.02)*(kK0smass+0.02))
772 if (fCutResonances && particle->Charge() * triggerParticle->Charge() < 0)
774 Float_t mass1 = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.9383);
775 Float_t mass2 = GetInvMassSquaredCheap(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.9383, 0.1396);
777 const Float_t kLambdaMass = 1.115;
779 if (TMath::Abs(mass1 - kLambdaMass*kLambdaMass) < 0.1)
781 mass1 = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.1396, 0.9383);
783 fControlConvResoncances->Fill(2, mass1 - kLambdaMass*kLambdaMass);
785 if (mass1 > (kLambdaMass-0.02)*(kLambdaMass-0.02) && mass1 < (kLambdaMass+0.02)*(kLambdaMass+0.02))
788 if (TMath::Abs(mass2 - kLambdaMass*kLambdaMass) < 0.1)
790 mass2 = GetInvMassSquared(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), particle->Pt(), eta[j], particle->Phi(), 0.9383, 0.1396);
792 fControlConvResoncances->Fill(2, mass2 - kLambdaMass*kLambdaMass);
794 if (mass2 > (kLambdaMass-0.02)*(kLambdaMass-0.02) && mass2 < (kLambdaMass+0.02)*(kLambdaMass+0.02))
799 if (twoTrackEfficiencyCut)
801 // the variables & cuthave been developed by the HBT group
802 // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700
804 Float_t phi1 = triggerParticle->Phi();
805 Float_t pt1 = triggerParticle->Pt();
806 Float_t charge1 = triggerParticle->Charge();
808 Float_t phi2 = particle->Phi();
809 Float_t pt2 = particle->Pt();
810 Float_t charge2 = particle->Charge();
812 Float_t deta = triggerEta - eta[j];
815 if (TMath::Abs(deta) < twoTrackEfficiencyCutValue * 2.5 * 3)
817 // check first boundaries to see if is worth to loop and find the minimum
818 Float_t dphistar1 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, fTwoTrackCutMinRadius, bSign);
819 Float_t dphistar2 = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, 2.5, bSign);
821 const Float_t kLimit = twoTrackEfficiencyCutValue * 3;
823 Float_t dphistarminabs = 1e5;
824 Float_t dphistarmin = 1e5;
825 if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0)
827 for (Double_t rad=fTwoTrackCutMinRadius; rad<2.51; rad+=0.01)
829 Float_t dphistar = GetDPhiStar(phi1, pt1, charge1, phi2, pt2, charge2, rad, bSign);
831 Float_t dphistarabs = TMath::Abs(dphistar);
833 if (dphistarabs < dphistarminabs)
835 dphistarmin = dphistar;
836 dphistarminabs = dphistarabs;
840 fTwoTrackDistancePt[0]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
842 if (dphistarminabs < twoTrackEfficiencyCutValue && TMath::Abs(deta) < twoTrackEfficiencyCutValue)
844 // 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);
848 fTwoTrackDistancePt[1]->Fill(deta, dphistarmin, TMath::Abs(pt1 - pt2));
854 vars[0] = triggerEta - eta[j];
855 vars[1] = particle->Pt();
856 vars[2] = triggerParticle->Pt();
857 vars[3] = centrality;
858 vars[4] = triggerParticle->Phi() - particle->Phi();
859 if (vars[4] > 1.5 * TMath::Pi())
860 vars[4] -= TMath::TwoPi();
861 if (vars[4] < -0.5 * TMath::Pi())
862 vars[4] += TMath::TwoPi();
866 weight = particle->Pt();
868 Double_t useWeight = weight;
871 if (fEfficiencyCorrectionAssociated)
874 // associated particle
875 effVars[0] = fEfficiencyCorrectionAssociated->GetAxis(0)->FindBin(eta[j]);
876 effVars[1] = fEfficiencyCorrectionAssociated->GetAxis(1)->FindBin(vars[1]); //pt
877 effVars[2] = fEfficiencyCorrectionAssociated->GetAxis(2)->FindBin(vars[3]); //centrality
878 effVars[3] = fEfficiencyCorrectionAssociated->GetAxis(3)->FindBin(vars[5]); //zVtx
880 // Printf("%d %d %d %d %f", effVars[0], effVars[1], effVars[2], effVars[3], fEfficiencyCorrectionAssociated->GetBinContent(effVars));
882 useWeight *= fEfficiencyCorrectionAssociated->GetBinContent(effVars);
884 if (fEfficiencyCorrectionTriggers)
888 effVars[0] = fEfficiencyCorrectionTriggers->GetAxis(0)->FindBin(triggerEta);
889 effVars[1] = fEfficiencyCorrectionTriggers->GetAxis(1)->FindBin(vars[2]); //pt
890 effVars[2] = fEfficiencyCorrectionTriggers->GetAxis(2)->FindBin(vars[3]); //centrality
891 effVars[3] = fEfficiencyCorrectionTriggers->GetAxis(3)->FindBin(vars[5]); //zVtx
892 useWeight *= fEfficiencyCorrectionTriggers->GetBinContent(effVars);
898 Int_t weightBin = triggerWeighting->GetXaxis()->FindBin(vars[2]);
899 // Printf("Using weight %f", triggerWeighting->GetBinContent(weightBin));
900 useWeight /= triggerWeighting->GetBinContent(weightBin);
903 // fill all in toward region and do not use the other regions
904 fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->Fill(vars, step, useWeight);
906 // Printf("%.2f %.2f --> %.2f", triggerEta, eta[j], vars[0]);
911 // once per trigger particle
913 vars[0] = triggerParticle->Pt();
914 vars[1] = centrality;
917 Double_t useWeight = 1;
918 if (fEfficiencyCorrectionTriggers && applyEfficiency)
923 effVars[0] = fEfficiencyCorrectionTriggers->GetAxis(0)->FindBin(triggerEta);
924 effVars[1] = fEfficiencyCorrectionTriggers->GetAxis(1)->FindBin(vars[0]); //pt
925 effVars[2] = fEfficiencyCorrectionTriggers->GetAxis(2)->FindBin(vars[1]); //centrality
926 effVars[3] = fEfficiencyCorrectionTriggers->GetAxis(3)->FindBin(vars[2]); //zVtx
927 useWeight *= fEfficiencyCorrectionTriggers->GetBinContent(effVars);
930 if (TMath::Abs(triggerEta) < 0.8 && triggerParticle->Pt() > 0)
931 fInvYield2->Fill(centrality, triggerParticle->Pt(), useWeight / triggerParticle->Pt());
935 // leads effectively to a filling of one entry per filled trigger particle pT bin
936 Int_t weightBin = triggerWeighting->GetXaxis()->FindBin(vars[0]);
937 // Printf("Using weight %f", triggerWeighting->GetBinContent(weightBin));
938 useWeight /= triggerWeighting->GetBinContent(weightBin);
941 fNumberDensityPhi->GetEventHist()->Fill(vars, step, useWeight);
944 fCorrelationpT->Fill(centrality, triggerParticle->Pt());
945 fCorrelationEta->Fill(centrality, triggerEta);
946 fCorrelationPhi->Fill(centrality, triggerParticle->Phi());
947 fYields->Fill(centrality, triggerParticle->Pt(), triggerEta);
949 /* if (dynamic_cast<AliAODTrack*>(triggerParticle))
950 fITSClusterMap->Fill(((AliAODTrack*) triggerParticle)->GetITSClusterMap(), centrality, triggerParticle->Pt());*/
954 if (triggerWeighting)
956 delete triggerWeighting;
957 triggerWeighting = 0;
961 fCentralityDistribution->Fill(centrality);
962 fCentralityCorrelation->Fill(centrality, particles->GetEntriesFast());
963 FillEvent(centrality, step);
966 //____________________________________________________________________
967 void AliUEHistograms::FillTrackingEfficiency(TObjArray* mc, TObjArray* recoPrim, TObjArray* recoAll, TObjArray* recoPrimPID, TObjArray* recoAllPID, TObjArray* fake, Int_t particleType, Double_t centrality, Double_t zVtx)
969 // fills the tracking efficiency objects
971 // mc: all primary MC particles
972 // recoPrim: reconstructed primaries (again MC particles)
973 // recoAll: reconstructed (again MC particles)
974 // recoPrim: reconstructed primaries with checks on PID (again MC particles)
975 // recoAll: reconstructed with checks on PID (again MC particles)
976 // particleType is: 0 for pion, 1 for kaon, 2 for proton, 3 for others
978 for (Int_t step=0; step<6; step++)
980 TObjArray* list = mc;
995 for (Int_t i=0; i<list->GetEntriesFast(); i++)
997 AliVParticle* particle = (AliVParticle*) list->UncheckedAt(i);
999 vars[0] = particle->Eta();
1000 vars[1] = particle->Pt();
1001 vars[2] = particleType;
1002 vars[3] = centrality;
1005 for (Int_t j=0; j<fgkUEHists; j++)
1007 GetUEHist(j)->GetTrackHistEfficiency()->Fill(vars, step);
1012 //____________________________________________________________________
1013 void AliUEHistograms::FillFakePt(TObjArray* fake, Double_t centrality)
1015 TObjArray* tracksReco = (TObjArray*) fake->At(0);
1016 TObjArray* tracksMC = (TObjArray*) fake->At(1);
1018 if (tracksReco->GetEntriesFast() != tracksMC->GetEntriesFast())
1019 AliFatal(Form("Inconsistent arrays: %d vs %d", tracksReco->GetEntriesFast(), tracksMC->GetEntriesFast()));
1021 for (Int_t i=0; i<tracksReco->GetEntriesFast(); i++)
1023 AliVParticle* particle1 = (AliVParticle*) tracksReco->At(i);
1024 AliVParticle* particle2 = (AliVParticle*) tracksMC->At(i);
1026 vars[0] = particle1->Pt();
1027 vars[1] = particle2->Pt();
1028 vars[2] = centrality;
1029 for (Int_t j=0; j<fgkUEHists; j++)
1031 GetUEHist(j)->GetMCRecoPtCorrelation()->Fill(vars[0],vars[1],vars[2]);
1035 //____________________________________________________________________
1036 void AliUEHistograms::FillEvent(Int_t eventType, Int_t step)
1038 // fills the number of events at the given step and the given enty type
1040 // WARNING: This function is called from Fill, so only call it for steps where Fill is not called
1042 fEventCount->Fill(step, eventType);
1045 //____________________________________________________________________
1046 void AliUEHistograms::FillEvent(Double_t centrality, Int_t step)
1048 // fills the number of events at the given step and the given centrality
1050 // WARNING: This function is called from Fill, so only call it for steps where Fill is not called
1052 fEventCount->Fill(step, centrality);
1055 //____________________________________________________________________
1056 void AliUEHistograms::SetEtaRange(Float_t etaMin, Float_t etaMax)
1058 // sets eta min and max for all contained AliUEHist classes
1060 for (Int_t i=0; i<fgkUEHists; i++)
1062 GetUEHist(i)->SetEtaRange(etaMin, etaMax);
1065 //____________________________________________________________________
1066 void AliUEHistograms::SetPtRange(Float_t ptMin, Float_t ptMax)
1068 // sets pT min and max for all contained AliUEHist classes
1070 for (Int_t i=0; i<fgkUEHists; i++)
1072 GetUEHist(i)->SetPtRange(ptMin, ptMax);
1075 //____________________________________________________________________
1076 void AliUEHistograms::SetPartSpecies(Int_t species)
1078 // sets PartSpecie for all contained AliUEHist classes
1080 for (Int_t i=0; i<fgkUEHists; i++)
1082 GetUEHist(i)->SetPartSpecies(species);
1085 //____________________________________________________________________
1086 void AliUEHistograms::SetZVtxRange(Float_t min, Float_t max)
1088 // sets pT min and max for all contained AliUEHist classes
1090 for (Int_t i=0; i<fgkUEHists; i++)
1092 GetUEHist(i)->SetZVtxRange(min, max);
1095 //____________________________________________________________________
1096 void AliUEHistograms::SetContaminationEnhancement(TH1F* hist)
1098 // sets the contamination enhancement histogram in all contained AliUEHist classes
1100 for (Int_t i=0; i<fgkUEHists; i++)
1102 GetUEHist(i)->SetContaminationEnhancement(hist);
1105 //____________________________________________________________________
1106 void AliUEHistograms::SetCombineMinMax(Bool_t flag)
1108 // sets pT min and max for all contained AliUEHist classes
1110 for (Int_t i=0; i<fgkUEHists; i++)
1112 GetUEHist(i)->SetCombineMinMax(flag);
1115 //____________________________________________________________________
1116 void AliUEHistograms::SetTrackEtaCut(Float_t value)
1118 // sets track eta cut for all contained AliUEHist classes
1120 for (Int_t i=0; i<fgkUEHists; i++)
1122 GetUEHist(i)->SetTrackEtaCut(value);
1125 //____________________________________________________________________
1126 void AliUEHistograms::SetWeightPerEvent(Bool_t flag)
1128 // sets fWeightPerEvent for all contained AliUEHist classes
1130 fWeightPerEvent = flag;
1132 for (Int_t i=0; i<fgkUEHists; i++)
1134 GetUEHist(i)->SetWeightPerEvent(fWeightPerEvent);
1137 //____________________________________________________________________
1138 void AliUEHistograms::Correct(AliUEHistograms* corrections)
1140 // corrects the contained histograms by calling AliUEHist::Correct
1142 for (Int_t i=0; i<fgkUEHists; i++)
1144 GetUEHist(i)->Correct(corrections->GetUEHist(i));
1147 //____________________________________________________________________
1148 AliUEHistograms &AliUEHistograms::operator=(const AliUEHistograms &c)
1150 // assigment operator
1155 ((AliUEHistograms &) c).Copy(*this);
1160 //____________________________________________________________________
1161 void AliUEHistograms::Copy(TObject& c) const
1165 AliUEHistograms& target = (AliUEHistograms &) c;
1167 if (fNumberDensitypT)
1168 target.fNumberDensitypT = dynamic_cast<AliUEHist*> (fNumberDensitypT->Clone());
1171 target.fSumpT = dynamic_cast<AliUEHist*> (fSumpT->Clone());
1173 if (fNumberDensityPhi)
1174 target.fNumberDensityPhi = dynamic_cast<AliUEHist*> (fNumberDensityPhi->Clone());
1177 target.fCorrelationpT = dynamic_cast<TH2F*> (fCorrelationpT->Clone());
1179 if (fCorrelationEta)
1180 target.fCorrelationEta = dynamic_cast<TH2F*> (fCorrelationEta->Clone());
1182 if (fCorrelationPhi)
1183 target.fCorrelationPhi = dynamic_cast<TH2F*> (fCorrelationPhi->Clone());
1186 target.fCorrelationR = dynamic_cast<TH2F*> (fCorrelationR->Clone());
1188 if (fCorrelationLeading2Phi)
1189 target.fCorrelationLeading2Phi = dynamic_cast<TH2F*> (fCorrelationLeading2Phi->Clone());
1191 if (fCorrelationMultiplicity)
1192 target.fCorrelationMultiplicity = dynamic_cast<TH2F*> (fCorrelationMultiplicity->Clone());
1195 target.fYields = dynamic_cast<TH3F*> (fYields->Clone());
1198 target.fInvYield2 = dynamic_cast<TH2F*> (fInvYield2->Clone());
1201 target.fEventCount = dynamic_cast<TH2F*> (fEventCount->Clone());
1203 if (fEventCountDifferential)
1204 target.fEventCountDifferential = dynamic_cast<TH3F*> (fEventCountDifferential->Clone());
1206 if (fVertexContributors)
1207 target.fVertexContributors = dynamic_cast<TH1F*> (fVertexContributors->Clone());
1209 if (fCentralityDistribution)
1210 target.fCentralityDistribution = dynamic_cast<TH1F*> (fCentralityDistribution->Clone());
1212 if (fCentralityCorrelation)
1213 target.fCentralityCorrelation = dynamic_cast<TH2F*> (fCentralityCorrelation->Clone());
1216 target.fITSClusterMap = dynamic_cast<TH3F*> (fITSClusterMap->Clone());
1218 if (fControlConvResoncances)
1219 target.fControlConvResoncances = dynamic_cast<TH2F*> (fControlConvResoncances->Clone());
1221 for (Int_t i=0; i<2; i++)
1222 if (fTwoTrackDistancePt[i])
1223 target.fTwoTrackDistancePt[i] = dynamic_cast<TH3F*> (fTwoTrackDistancePt[i]->Clone());
1225 if (fEfficiencyCorrectionTriggers)
1226 target.fEfficiencyCorrectionTriggers = dynamic_cast<THnF*> (fEfficiencyCorrectionTriggers->Clone());
1228 if (fEfficiencyCorrectionAssociated)
1229 target.fEfficiencyCorrectionAssociated = dynamic_cast<THnF*> (fEfficiencyCorrectionAssociated->Clone());
1231 target.fSelectCharge = fSelectCharge;
1232 target.fTriggerSelectCharge = fTriggerSelectCharge;
1233 target.fAssociatedSelectCharge = fAssociatedSelectCharge;
1234 target.fTriggerRestrictEta = fTriggerRestrictEta;
1235 target.fEtaOrdering = fEtaOrdering;
1236 target.fCutConversions = fCutConversions;
1237 target.fCutResonances = fCutResonances;
1238 target.fOnlyOneEtaSide = fOnlyOneEtaSide;
1239 target.fWeightPerEvent = fWeightPerEvent;
1240 target.fRunNumber = fRunNumber;
1241 target.fMergeCount = fMergeCount;
1242 target.fWeightPerEvent = fWeightPerEvent;
1243 target.fPtOrder = fPtOrder;
1244 target.fTwoTrackCutMinRadius = fTwoTrackCutMinRadius;
1247 //____________________________________________________________________
1248 Long64_t AliUEHistograms::Merge(TCollection* list)
1250 // Merge a list of AliUEHistograms objects with this (needed for
1252 // Returns the number of merged objects (including this).
1257 if (list->IsEmpty())
1260 TIterator* iter = list->MakeIterator();
1263 // collections of objects
1264 const Int_t kMaxLists = 20;
1265 TList* lists[kMaxLists];
1267 for (Int_t i=0; i<kMaxLists; i++)
1268 lists[i] = new TList;
1271 while ((obj = iter->Next())) {
1273 AliUEHistograms* entry = dynamic_cast<AliUEHistograms*> (obj);
1277 if (entry->fNumberDensitypT)
1278 lists[0]->Add(entry->fNumberDensitypT);
1280 lists[1]->Add(entry->fSumpT);
1281 if (entry->fNumberDensityPhi)
1282 lists[2]->Add(entry->fNumberDensityPhi);
1283 lists[3]->Add(entry->fCorrelationpT);
1284 lists[4]->Add(entry->fCorrelationEta);
1285 lists[5]->Add(entry->fCorrelationPhi);
1286 lists[6]->Add(entry->fCorrelationR);
1287 lists[7]->Add(entry->fCorrelationLeading2Phi);
1288 lists[8]->Add(entry->fCorrelationMultiplicity);
1289 lists[9]->Add(entry->fEventCount);
1290 lists[10]->Add(entry->fEventCountDifferential);
1291 lists[11]->Add(entry->fVertexContributors);
1292 lists[12]->Add(entry->fCentralityDistribution);
1293 lists[13]->Add(entry->fITSClusterMap);
1294 if (entry->fTwoTrackDistancePt[0])
1295 lists[14]->Add(entry->fTwoTrackDistancePt[0]);
1296 if (entry->fTwoTrackDistancePt[1])
1297 lists[15]->Add(entry->fTwoTrackDistancePt[1]);
1298 if (entry->fCentralityCorrelation)
1299 lists[16]->Add(entry->fCentralityCorrelation);
1301 lists[17]->Add(entry->fYields);
1302 if (entry->fInvYield2)
1303 lists[18]->Add(entry->fInvYield2);
1304 if (entry->fControlConvResoncances)
1305 lists[19]->Add(entry->fControlConvResoncances);
1307 fMergeCount += entry->fMergeCount;
1312 if (fNumberDensitypT)
1313 fNumberDensitypT->Merge(lists[0]);
1315 fSumpT->Merge(lists[1]);
1316 if (fNumberDensityPhi)
1317 fNumberDensityPhi->Merge(lists[2]);
1318 fCorrelationpT->Merge(lists[3]);
1319 fCorrelationEta->Merge(lists[4]);
1320 fCorrelationPhi->Merge(lists[5]);
1321 fCorrelationR->Merge(lists[6]);
1322 fCorrelationLeading2Phi->Merge(lists[7]);
1323 fCorrelationMultiplicity->Merge(lists[8]);
1324 fEventCount->Merge(lists[9]);
1325 fEventCountDifferential->Merge(lists[10]);
1326 fVertexContributors->Merge(lists[11]);
1327 fCentralityDistribution->Merge(lists[12]);
1328 fITSClusterMap->Merge(lists[13]);
1329 if (fTwoTrackDistancePt[0] && lists[14]->GetEntries() > 0)
1330 fTwoTrackDistancePt[0]->Merge(lists[14]);
1331 if (fTwoTrackDistancePt[1] && lists[15]->GetEntries() > 0)
1332 fTwoTrackDistancePt[1]->Merge(lists[15]);
1333 if (fCentralityCorrelation)
1334 fCentralityCorrelation->Merge(lists[16]);
1335 if (fYields && lists[17]->GetEntries() > 0)
1336 fYields->Merge(lists[17]);
1337 if (fInvYield2 && lists[18]->GetEntries() > 0)
1338 fInvYield2->Merge(lists[18]);
1339 if (fControlConvResoncances && lists[19]->GetEntries() > 0)
1340 fControlConvResoncances->Merge(lists[19]);
1342 for (Int_t i=0; i<kMaxLists; i++)
1348 void AliUEHistograms::CopyReconstructedData(AliUEHistograms* from)
1350 // copies those histograms extracted from ESD to this object
1352 for (Int_t i=0; i<fgkUEHists; i++)
1354 GetUEHist(i)->CopyReconstructedData(from->GetUEHist(i));
1357 void AliUEHistograms::DeepCopy(AliUEHistograms* from)
1359 // copies the entries of this object's members from the object <from> to this object
1361 for (Int_t i=0; i<fgkUEHists; i++)
1362 if (GetUEHist(i) && from->GetUEHist(i))
1363 GetUEHist(i)->DeepCopy(from->GetUEHist(i));
1366 void AliUEHistograms::ExtendTrackingEfficiency(Bool_t verbose)
1368 // delegates to AliUEHists
1370 for (Int_t i=0; i<fgkUEHists; i++)
1372 GetUEHist(i)->ExtendTrackingEfficiency(verbose);
1375 void AliUEHistograms::Scale(Double_t factor)
1377 // scales all contained histograms by the given factor
1379 for (Int_t i=0; i<fgkUEHists; i++)
1381 GetUEHist(i)->Scale(factor);
1384 list.Add(fCorrelationpT);
1385 list.Add(fCorrelationEta);
1386 list.Add(fCorrelationPhi);
1387 list.Add(fCorrelationR);
1388 list.Add(fCorrelationLeading2Phi);
1389 list.Add(fCorrelationMultiplicity);
1391 list.Add(fInvYield2);
1392 list.Add(fEventCount);
1393 list.Add(fEventCountDifferential);
1394 list.Add(fVertexContributors);
1395 list.Add(fCentralityDistribution);
1396 list.Add(fCentralityCorrelation);
1397 list.Add(fITSClusterMap);
1398 list.Add(fTwoTrackDistancePt[0]);
1399 list.Add(fTwoTrackDistancePt[1]);
1400 list.Add(fControlConvResoncances);
1402 for (Int_t i=0; i<list.GetEntries(); i++)
1403 ((TH1*) list.At(i))->Scale(factor);
1406 void AliUEHistograms::Reset()
1408 // delegates to AliUEHists
1410 for (Int_t i=0; i<fgkUEHists; i++)
1412 GetUEHist(i)->Reset();