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"
36 ClassImp(AliUEHistograms)
38 AliUEHistograms::AliUEHistograms() :
47 fCorrelationLeading2Phi(0),
48 fCorrelationMultiplicity(0),
50 fEventCountDifferential(0),
51 fVertexContributors(0)
55 fNumberDensitypT = new AliUEHist("NumberDensitypT");
56 fSumpT = new AliUEHist("SumpT");
57 fNumberDensityPhi = new AliUEHist("NumberDensityPhi");
59 // do not add this hists to the directory
60 Bool_t oldStatus = TH1::AddDirectoryStatus();
61 TH1::AddDirectory(kFALSE);
63 fCorrelationpT = new TH2F("fCorrelationpT", ";p_{T,lead} (MC);p_{T,lead} (RECO)", 200, 0, 50, 200, 0, 50);
64 fCorrelationEta = new TH2F("fCorrelationEta", ";#eta_{T,lead} (MC);#eta_{T,lead} (RECO)", 200, -1, 1, 200, -1, 1);
65 fCorrelationPhi = new TH2F("fCorrelationPhi", ";#phi_{T,lead} (MC);#phi_{T,lead} (RECO)", 200, 0, TMath::TwoPi(), 200, 0, TMath::TwoPi());
66 fCorrelationR = new TH2F("fCorrelationR", ";R;p_{T,lead} (MC)", 200, 0, 2, 200, 0, 50);
67 fCorrelationLeading2Phi = new TH2F("fCorrelationLeading2Phi", ";#Delta #phi;p_{T,lead} (MC)", 200, -TMath::Pi(), TMath::Pi(), 200, 0, 50);
68 fCorrelationMultiplicity = new TH2F("fCorrelationMultiplicity", ";MC tracks;Reco tracks", 100, -0.5, 99.5, 100, -0.5, 99.5);
70 fEventCount = new TH2F("fEventCount", ";step;event type;count", AliUEHist::fgkCFSteps+2, -2.5, -0.5 + AliUEHist::fgkCFSteps, 3, -0.5, 2.5);
71 fEventCount->GetYaxis()->SetBinLabel(1, "ND");
72 fEventCount->GetYaxis()->SetBinLabel(2, "SD");
73 fEventCount->GetYaxis()->SetBinLabel(3, "DD");
75 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);
76 fEventCountDifferential->GetZaxis()->SetBinLabel(1, "ND");
77 fEventCountDifferential->GetZaxis()->SetBinLabel(2, "SD");
78 fEventCountDifferential->GetZaxis()->SetBinLabel(3, "DD");
80 fVertexContributors = new TH1F("fVertexContributors", ";contributors;count", 100, -0.5, 99.5);
82 TH1::AddDirectory(oldStatus);
85 //_____________________________________________________________________________
86 AliUEHistograms::AliUEHistograms(const AliUEHistograms &c) :
95 fCorrelationLeading2Phi(0),
96 fCorrelationMultiplicity(0),
98 fEventCountDifferential(0),
99 fVertexContributors(0)
102 // AliUEHistograms copy constructor
105 ((AliUEHistograms &) c).Copy(*this);
108 //____________________________________________________________________
109 AliUEHistograms::~AliUEHistograms()
113 if (fNumberDensitypT)
115 delete fNumberDensitypT;
116 fNumberDensitypT = 0;
125 if (fNumberDensityPhi)
127 delete fNumberDensityPhi;
128 fNumberDensityPhi = 0;
133 delete fCorrelationpT;
139 delete fCorrelationEta;
145 delete fCorrelationPhi;
151 delete fCorrelationR;
155 if (fCorrelationLeading2Phi)
157 delete fCorrelationLeading2Phi;
158 fCorrelationLeading2Phi = 0;
161 if (fCorrelationMultiplicity)
163 delete fCorrelationMultiplicity;
164 fCorrelationMultiplicity = 0;
173 if (fEventCountDifferential)
175 delete fEventCountDifferential;
176 fEventCountDifferential = 0;
179 if (fVertexContributors)
181 delete fVertexContributors;
182 fVertexContributors = 0;
186 AliUEHist* AliUEHistograms::GetUEHist(Int_t id)
188 // returns AliUEHist object, useful for loops
192 case 0: return fNumberDensitypT; break;
193 case 1: return fSumpT; break;
194 case 2: return fNumberDensityPhi; break;
200 //____________________________________________________________________
201 Int_t AliUEHistograms::CountParticles(TList* list, Float_t ptMin)
203 // counts the number of particles in the list with a pT above ptMin
204 // TODO eta cut needed here?
207 for (Int_t j=0; j<list->GetEntries(); j++)
208 if (((AliVParticle*) list->At(j))->Pt() > ptMin)
214 //____________________________________________________________________
215 void AliUEHistograms::Fill(Int_t eventType, AliUEHist::CFStep step, AliVParticle* leading, TList* toward, TList* away, TList* min, TList* max)
217 // fills the UE event histograms
219 // 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
221 // if leading is not set, just fill event statistics
224 Int_t multiplicity = 0;
226 // TODO configurable?
227 Float_t ptMin = 0.15;
228 if (leading->Pt() > ptMin)
231 multiplicity += CountParticles(toward, ptMin);
232 multiplicity += CountParticles(away, ptMin);
233 multiplicity += CountParticles(min, ptMin);
234 multiplicity += CountParticles(max, ptMin);
236 FillRegion(AliUEHist::kToward, step, leading, toward, multiplicity);
237 FillRegion(AliUEHist::kAway, step, leading, away, multiplicity);
238 FillRegion(AliUEHist::kMin, step, leading, min, multiplicity);
239 FillRegion(AliUEHist::kMax, step, leading, max, multiplicity);
242 vars[0] = leading->Pt();
243 vars[1] = multiplicity;
244 fNumberDensitypT->GetEventHist()->Fill(vars, step);
245 fSumpT->GetEventHist()->Fill(vars, step);
246 fNumberDensityPhi->GetEventHist()->Fill(vars, step);
248 fEventCountDifferential->Fill(leading->Pt(), step, eventType);
251 FillEvent(eventType, step);
254 //____________________________________________________________________
255 void AliUEHistograms::FillRegion(AliUEHist::Region region, AliUEHist::CFStep step, AliVParticle* leading, TList* list, Int_t multiplicity)
257 // loops over AliVParticles in list and fills the given region at the given step
259 // See also Fill(...)
261 for (Int_t i=0; i<list->GetEntries(); i++)
263 AliVParticle* particle = (AliVParticle*) list->At(i);
266 vars[0] = particle->Eta();
267 vars[1] = particle->Pt();
268 vars[2] = leading->Pt();
269 vars[3] = multiplicity;
270 vars[4] = leading->Phi() - particle->Phi();
271 if (vars[4]>TMath::Pi()/2.)vars[4]-=TMath::TwoPi();
272 if (vars[4]< - 3.*TMath::Pi()/2.)vars[4]+=TMath::TwoPi();
274 fNumberDensitypT->GetTrackHist(region)->Fill(vars, step);
275 fSumpT->GetTrackHist(region)->Fill(vars, step, particle->Pt());
277 // fill all in toward region (is anyway as function of delta phi!)
278 fNumberDensityPhi->GetTrackHist(AliUEHist::kToward)->Fill(vars, step);
282 //____________________________________________________________________
283 void AliUEHistograms::Fill(AliVParticle* leadingMC, AliVParticle* leadingReco)
285 // fills the correlation histograms
289 fCorrelationpT->Fill(leadingMC->Pt(), leadingReco->Pt());
290 if (leadingMC->Pt() > 0.5)
292 fCorrelationEta->Fill(leadingMC->Eta(), leadingReco->Eta());
293 fCorrelationPhi->Fill(leadingMC->Phi(), leadingReco->Phi());
296 Float_t phiDiff = leadingMC->Phi() - leadingReco->Phi();
297 if (phiDiff > TMath::Pi())
298 phiDiff -= TMath::TwoPi();
299 if (phiDiff < -TMath::Pi())
300 phiDiff += TMath::TwoPi();
302 Float_t etaDiff = leadingMC->Eta() - leadingReco->Eta();
304 fCorrelationR->Fill(TMath::Sqrt(phiDiff * phiDiff + etaDiff * etaDiff), leadingMC->Pt());
305 fCorrelationLeading2Phi->Fill(phiDiff, leadingMC->Pt());
309 fCorrelationpT->Fill(1.0, leadingReco->Pt());
310 if (leadingReco->Pt() > 0.5)
312 fCorrelationEta->Fill(0.0, leadingReco->Eta());
313 fCorrelationPhi->Fill(0.0, leadingReco->Phi());
318 //____________________________________________________________________
319 void AliUEHistograms::FillTrackingEfficiency(TObjArray* mc, TObjArray* recoPrim, TObjArray* recoAll, Int_t particleType)
321 // fills the tracking efficiency objects
323 // mc: all primary MC particles
324 // recoPrim: reconstructed primaries (again MC particles)
325 // recoAll: reconstructed (again MC particles)
326 // particleType is: 0 for pion, 1 for kaon, 2 for proton, 3 for others
328 for (Int_t step=0; step<3; step++)
330 TObjArray* list = mc;
336 for (Int_t i=0; i<list->GetEntries(); i++)
338 AliVParticle* particle = (AliVParticle*) list->At(i);
340 vars[0] = particle->Eta();
341 vars[1] = particle->Pt();
342 vars[2] = particleType;
344 fNumberDensitypT->GetTrackHistEfficiency()->Fill(vars, step);
345 fSumpT->GetTrackHistEfficiency()->Fill(vars, step);
346 fNumberDensityPhi->GetTrackHistEfficiency()->Fill(vars, step);
351 //____________________________________________________________________
352 void AliUEHistograms::FillEvent(Int_t eventType, Int_t step)
354 // fills the number of events at the given step and the given enty type
356 // WARNING: This function is called from Fill, so only call it for steps where Fill is not called
358 fEventCount->Fill(step, eventType);
361 //____________________________________________________________________
362 void AliUEHistograms::SetEtaRange(Float_t etaMin, Float_t etaMax)
364 // sets eta min and max for all contained AliUEHist classes
366 fNumberDensitypT->SetEtaRange(etaMin, etaMax);
367 fSumpT->SetEtaRange(etaMin, etaMax);
368 fNumberDensityPhi->SetEtaRange(etaMin, etaMax);
371 //____________________________________________________________________
372 void AliUEHistograms::SetPtRange(Float_t ptMin, Float_t ptMax)
374 // sets pT min and max for all contained AliUEHist classes
376 fNumberDensitypT->SetPtRange(ptMin, ptMax);
377 fSumpT->SetPtRange(ptMin, ptMax);
378 fNumberDensityPhi->SetPtRange(ptMin, ptMax);
381 //____________________________________________________________________
382 void AliUEHistograms::SetContaminationEnhancement(TH1F* hist)
384 // sets the contamination enhancement histogram in all contained AliUEHist classes
386 fNumberDensitypT->SetContaminationEnhancement(hist);
387 fSumpT->SetContaminationEnhancement(hist);
388 fNumberDensityPhi->SetContaminationEnhancement(hist);
391 //____________________________________________________________________
392 void AliUEHistograms::SetCombineMinMax(Bool_t flag)
394 // sets pT min and max for all contained AliUEHist classes
396 fNumberDensitypT->SetCombineMinMax(flag);
397 fSumpT->SetCombineMinMax(flag);
398 fNumberDensityPhi->SetCombineMinMax(flag);
401 //____________________________________________________________________
402 void AliUEHistograms::Correct(AliUEHistograms* corrections)
404 // corrects the contained histograms by calling AliUEHist::Correct
406 fNumberDensitypT->Correct(corrections->fNumberDensitypT);
407 fSumpT->Correct(corrections->fSumpT);
408 fNumberDensityPhi->Correct(corrections->fNumberDensityPhi);
411 //____________________________________________________________________
412 AliUEHistograms &AliUEHistograms::operator=(const AliUEHistograms &c)
414 // assigment operator
417 ((AliUEHistograms &) c).Copy(*this);
422 //____________________________________________________________________
423 void AliUEHistograms::Copy(TObject& c) const
427 AliUEHistograms& target = (AliUEHistograms &) c;
429 if (fNumberDensitypT)
430 target.fNumberDensitypT = dynamic_cast<AliUEHist*> (fNumberDensitypT->Clone());
433 target.fSumpT = dynamic_cast<AliUEHist*> (fSumpT->Clone());
435 if (fNumberDensityPhi)
436 target.fNumberDensityPhi = dynamic_cast<AliUEHist*> (fNumberDensityPhi->Clone());
439 target.fCorrelationpT = dynamic_cast<TH2F*> (fCorrelationpT->Clone());
442 target.fCorrelationEta = dynamic_cast<TH2F*> (fCorrelationEta->Clone());
445 target.fCorrelationPhi = dynamic_cast<TH2F*> (fCorrelationPhi->Clone());
448 target.fCorrelationR = dynamic_cast<TH2F*> (fCorrelationR->Clone());
450 if (fCorrelationLeading2Phi)
451 target.fCorrelationLeading2Phi = dynamic_cast<TH2F*> (fCorrelationLeading2Phi->Clone());
453 if (fCorrelationMultiplicity)
454 target.fCorrelationMultiplicity = dynamic_cast<TH2F*> (fCorrelationMultiplicity->Clone());
457 target.fEventCount = dynamic_cast<TH2F*> (fEventCount->Clone());
459 if (fEventCountDifferential)
460 target.fEventCountDifferential = dynamic_cast<TH3F*> (fEventCountDifferential->Clone());
462 if (fVertexContributors)
463 target.fVertexContributors = dynamic_cast<TH1F*> (fVertexContributors->Clone());
466 //____________________________________________________________________
467 Long64_t AliUEHistograms::Merge(TCollection* list)
469 // Merge a list of AliUEHistograms objects with this (needed for
471 // Returns the number of merged objects (including this).
479 TIterator* iter = list->MakeIterator();
482 // collections of objects
483 const Int_t kMaxLists = 12;
484 TList* lists[kMaxLists];
486 for (Int_t i=0; i<kMaxLists; i++)
487 lists[i] = new TList;
490 while ((obj = iter->Next())) {
492 AliUEHistograms* entry = dynamic_cast<AliUEHistograms*> (obj);
496 lists[0]->Add(entry->fNumberDensitypT);
497 lists[1]->Add(entry->fSumpT);
498 lists[2]->Add(entry->fNumberDensityPhi);
499 lists[3]->Add(entry->fCorrelationpT);
500 lists[4]->Add(entry->fCorrelationEta);
501 lists[5]->Add(entry->fCorrelationPhi);
502 lists[6]->Add(entry->fCorrelationR);
503 lists[7]->Add(entry->fCorrelationLeading2Phi);
504 lists[8]->Add(entry->fCorrelationMultiplicity);
505 lists[9]->Add(entry->fEventCount);
506 lists[10]->Add(entry->fEventCountDifferential);
507 lists[11]->Add(entry->fVertexContributors);
512 fNumberDensitypT->Merge(lists[0]);
513 fSumpT->Merge(lists[1]);
514 fNumberDensityPhi->Merge(lists[2]);
515 fCorrelationpT->Merge(lists[3]);
516 fCorrelationEta->Merge(lists[4]);
517 fCorrelationPhi->Merge(lists[5]);
518 fCorrelationR->Merge(lists[6]);
519 fCorrelationLeading2Phi->Merge(lists[7]);
520 fCorrelationMultiplicity->Merge(lists[8]);
521 fEventCount->Merge(lists[9]);
522 fEventCountDifferential->Merge(lists[10]);
523 fVertexContributors->Merge(lists[11]);
525 for (Int_t i=0; i<kMaxLists; i++)
531 void AliUEHistograms::CopyReconstructedData(AliUEHistograms* from)
533 // copies those histograms extracted from ESD to this object
535 fNumberDensitypT->CopyReconstructedData(from->fNumberDensitypT);
536 fSumpT->CopyReconstructedData(from->fSumpT);
537 fNumberDensityPhi->CopyReconstructedData(from->fNumberDensityPhi);