]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/CaloTrackCorrBase/AliNeutralMesonSelection.cxx
Update from Prabhat - DptDpt Corr
[u/mrichter/AliRoot.git] / PWG / CaloTrackCorrBase / AliNeutralMesonSelection.cxx
CommitLineData
1c5acb87 1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
1c5acb87 15
16//_________________________________________________________________________
17// Class that contains methods to select candidate pairs to neutral meson
18// 2 main selections, invariant mass around pi0 (also any other mass),
19// apperture angle to distinguish from combinatorial.
20//-- Author: Gustavo Conesa (INFN-LNF)
21
22// --- ROOT system ---
23#include <TLorentzVector.h>
24#include <TH2.h>
25#include <TList.h>
3f150b4b 26#include <TString.h>
27
1c5acb87 28//---- AliRoot system ----
29#include "AliNeutralMesonSelection.h"
1c5acb87 30
31ClassImp(AliNeutralMesonSelection)
32
33
b960c7eb 34//______________________________________________________
1c5acb87 35 AliNeutralMesonSelection::AliNeutralMesonSelection() :
3f150b4b 36 TObject(), fAsymmetryCut(1),
37 fUseAsymmetryCut(0), fM(0),
38 fInvMassMaxCut(0.), fInvMassMinCut(0.),
39 fLeftBandMinCut(0.), fLeftBandMaxCut(0.),
40 fRightBandMinCut(0.), fRightBandMaxCut(0.),
41 fAngleMaxParam(), fUseAngleCut(0),
42 fKeepNeutralMesonHistos(0), fParticle(""),
43 // histograms
44 fhAnglePairNoCut(0), fhAnglePairOpeningAngleCut(0),
45 fhAnglePairAsymmetryCut(0), fhAnglePairAllCut(0),
46 fhInvMassPairNoCut(0), fhInvMassPairOpeningAngleCut(0),
47 fhInvMassPairAsymmetryCut(0), fhInvMassPairAllCut(0),
48 fhAsymmetryNoCut(0), fhAsymmetryOpeningAngleCut(0),
49 fhAsymmetryAllCut(0),
50 // histogram ranges and bins
9542ac75 51 fHistoNEBins(0), fHistoEMax(0.), fHistoEMin(0.),
9542ac75 52 fHistoNAngleBins(0), fHistoAngleMax(0.), fHistoAngleMin(0.),
53 fHistoNIMBins(0), fHistoIMMax(0.), fHistoIMMin(0.)
477d6cee 54{
1c5acb87 55 //Default Ctor
56
1c5acb87 57 //Initialize parameters
58 InitParameters();
59}
1c5acb87 60
b960c7eb 61//_________________________________________________________
1c5acb87 62TList * AliNeutralMesonSelection::GetCreateOutputObjects()
63{
477d6cee 64 // Create histograms to be saved in output file and
65 // store them in outputContainer of the analysis class that calls this class.
66
67 TList * outputContainer = new TList() ;
68 outputContainer->SetName("MesonDecayHistos") ;
9542ac75 69
fad7739b 70 if(fKeepNeutralMesonHistos){
71
72 outputContainer->SetOwner(kFALSE);
73
74 fhAnglePairNoCut = new TH2F
75 ("AnglePairNoCut",
76 "Angle between all #gamma pair vs E_{#pi^{0}}",fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNAngleBins,fHistoAngleMin,fHistoAngleMax);
77 fhAnglePairNoCut->SetYTitle("Angle (rad)");
78 fhAnglePairNoCut->SetXTitle("E_{ #pi^{0}} (GeV)");
9542ac75 79
80 fhAsymmetryNoCut = new TH2F
81 ("AsymmetryNoCut","Asymmetry of all #gamma pair vs E_{#pi^{0}}",
3bfcb597 82 fHistoNEBins,fHistoEMin,fHistoEMax,100,0,1);
9542ac75 83 fhAsymmetryNoCut->SetYTitle("Asymmetry");
84 fhAsymmetryNoCut->SetXTitle("E_{ #pi^{0}} (GeV)");
85
86 fhInvMassPairNoCut = new TH2F
87 ("InvMassPairNoCut","Invariant Mass of all #gamma pair vs E_{#pi^{0}}",
3bfcb597 88 fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNIMBins,fHistoIMMin,fHistoIMMax);
9542ac75 89 fhInvMassPairNoCut->SetYTitle("Invariant Mass (GeV/c^{2})");
90 fhInvMassPairNoCut->SetXTitle("E_{ #pi^{0}} (GeV)");
91
92 outputContainer->Add(fhAnglePairNoCut) ;
93 outputContainer->Add(fhAsymmetryNoCut) ;
94 outputContainer->Add(fhInvMassPairNoCut) ;
95
96 if(fUseAngleCut) {
97 fhAnglePairOpeningAngleCut = new TH2F
98 ("AnglePairOpeningAngleCut",
99 "Angle between all #gamma pair (opening angle) vs E_{#pi^{0}}"
100 ,fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNAngleBins,fHistoAngleMin,fHistoAngleMax);
101 fhAnglePairOpeningAngleCut->SetYTitle("Angle (rad)");
102 fhAnglePairOpeningAngleCut->SetXTitle("E_{ #pi^{0}} (GeV)");
103
104 fhAsymmetryOpeningAngleCut = new TH2F
105 ("AsymmetryOpeningAngleCut",
106 "Asymmetry of #gamma pair (angle cut) vs E_{#pi^{0}}",
3bfcb597 107 fHistoNEBins,fHistoEMin,fHistoEMax,100,0,1);
9542ac75 108 fhAsymmetryOpeningAngleCut->SetYTitle("Asymmetry");
109 fhAsymmetryOpeningAngleCut->SetXTitle(" E_{#pi^{0}}(GeV)");
110
111 fhInvMassPairOpeningAngleCut = new TH2F
112 ("InvMassPairOpeningAngleCut",
113 "Invariant Mass of #gamma pair (angle cut) vs E_{#pi^{0}}",
3bfcb597 114 fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNIMBins,fHistoIMMin,fHistoIMMax);
9542ac75 115 fhInvMassPairOpeningAngleCut->SetYTitle("Invariant Mass (GeV/c^{2})");
116 fhInvMassPairOpeningAngleCut->SetXTitle(" E_{#pi^{0}}(GeV)");
117
118 outputContainer->Add(fhAnglePairOpeningAngleCut) ;
119 outputContainer->Add(fhAsymmetryOpeningAngleCut) ;
120 outputContainer->Add(fhInvMassPairOpeningAngleCut) ;
121 }
122
123 if(fUseAsymmetryCut) {
124 fhAnglePairAsymmetryCut = new TH2F
125 ("AnglePairAsymmetryCut",
126 "Angle between all #gamma pair (opening angle + asymetry cut) vs E_{#pi^{0}}"
127 ,fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNAngleBins,fHistoAngleMin,fHistoAngleMax);
128 fhAnglePairAsymmetryCut->SetYTitle("Angle (rad)");
129 fhAnglePairAsymmetryCut->SetXTitle("E_{ #pi^{0}} (GeV)");
130
131 fhInvMassPairAsymmetryCut = new TH2F
132 ("InvMassPairAsymmetryCut",
133 "Invariant Mass of #gamma pair (opening angle + asymmetry) vs E_{#pi^{0}}",
3bfcb597 134 fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNIMBins,fHistoIMMin,fHistoIMMax);
9542ac75 135 fhInvMassPairAsymmetryCut->SetYTitle("Invariant Mass (GeV/c^{2})");
136 fhInvMassPairAsymmetryCut->SetXTitle("E_{#pi^{0}}(GeV)");
137
138 outputContainer->Add(fhAnglePairAsymmetryCut) ;
139 outputContainer->Add(fhInvMassPairAsymmetryCut) ;
140
141 }
142
fad7739b 143 fhAnglePairAllCut = new TH2F
144 ("AnglePairAllCut",
9542ac75 145 "Angle between all #gamma pair (opening angle + asymmetry + inv mass cut) vs E_{#pi^{0}}"
fad7739b 146 ,fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNAngleBins,fHistoAngleMin,fHistoAngleMax);
147 fhAnglePairAllCut->SetYTitle("Angle (rad)");
148 fhAnglePairAllCut->SetXTitle("E_{ #pi^{0}} (GeV)");
9542ac75 149
fad7739b 150 fhInvMassPairAllCut = new TH2F
151 ("InvMassPairAllCut",
9542ac75 152 "Invariant Mass of #gamma pair (opening angle + asymmetry + invmass cut) vs E_{#pi^{0}}",
3bfcb597 153 fHistoNEBins,fHistoEMin,fHistoEMax,fHistoNIMBins,fHistoIMMin,fHistoIMMax);
fad7739b 154 fhInvMassPairAllCut->SetYTitle("Invariant Mass (GeV/c^{2})");
155 fhInvMassPairAllCut->SetXTitle("E_{#pi^{0}}(GeV)");
156
9542ac75 157 fhAsymmetryAllCut = new TH2F
158 ("AsymmetryAllCut",
159 "Asymmetry of #gamma pair (opening angle+invmass cut) vs E_{#pi^{0}}",
3bfcb597 160 fHistoNEBins,fHistoEMin,fHistoEMax,100,0,1);
9542ac75 161 fhAsymmetryAllCut->SetYTitle("Asymmetry");
162 fhAsymmetryAllCut->SetXTitle("E_{#pi^{0}}(GeV)");
163
164 outputContainer->Add(fhAnglePairAllCut) ;
165 outputContainer->Add(fhAsymmetryAllCut) ;
166 outputContainer->Add(fhInvMassPairAllCut) ;
167
fad7739b 168 }
9542ac75 169
477d6cee 170 return outputContainer;
9542ac75 171
1c5acb87 172}
173
b960c7eb 174//_____________________________________________
1c5acb87 175void AliNeutralMesonSelection::InitParameters()
176{
477d6cee 177
1c5acb87 178 //Initialize the parameters of the analysis.
1c5acb87 179 fAngleMaxParam.Set(4) ;
9542ac75 180 fAngleMaxParam.Reset(0.);
1c5acb87 181
3bfcb597 182 SetParticle("Pi0");
1c5acb87 183
3bfcb597 184 //Histogrammes settings
185 fHistoNEBins = 200 ;
186 fHistoEMax = 50 ;
a5fb4114 187 fHistoEMin = 0. ;
1c5acb87 188
3bfcb597 189 fHistoNAngleBins = 200 ;
190 fHistoAngleMax = 0.5 ;
1c5acb87 191 fHistoAngleMin = 0. ;
192
1c5acb87 193}
194
8a2dbbff 195//______________________________________________________________________________
196Bool_t AliNeutralMesonSelection::IsAngleInWindow(Float_t angle, Float_t e) const
a5fb4114 197{
198
199 // Check if the opening angle of the candidate pairs is inside
200 // our selection window
3bfcb597 201 // Attention, only valid for Pi0, if needed for Eta need to revise max angle function or change parameters
9542ac75 202
1c5acb87 203 Double_t max = fAngleMaxParam.At(0)*TMath::Exp(fAngleMaxParam.At(1)*e)
204 +fAngleMaxParam.At(2)+fAngleMaxParam.At(3)*e;
205 Double_t arg = (e*e-2*fM*fM)/(e*e);
206 Double_t min = 100. ;
207 if(arg>0.)
7287751b 208 min = TMath::ACos(arg)+fShiftMinAngle[0]+fShiftMinAngle[1]*e;
3bfcb597 209
9542ac75 210 if((angle<max)&&(angle>=min)) return kTRUE ;
211 else return kFALSE ;
212
1c5acb87 213}
214
b960c7eb 215//_________________________________________________________________
216Bool_t AliNeutralMesonSelection::SelectPair(TLorentzVector gammai,
217 TLorentzVector gammaj,
218 TString calo)
1c5acb87 219{
220
221 //Search for the neutral pion within selection cuts
1c5acb87 222
9542ac75 223 // Double_t pt = (gammai+gammaj).Pt();
1c5acb87 224 Double_t phi = (gammai+gammaj).Phi();
225 if(phi < 0)
226 phi+=TMath::TwoPi();
b960c7eb 227
1c5acb87 228 Double_t invmass = (gammai+gammaj).M();
229 Double_t angle = gammaj.Angle(gammai.Vect());
230 Double_t e = (gammai+gammaj).E();
9542ac75 231 Double_t asy = TMath::Abs((gammai-gammaj).E())/(gammai+gammaj).E();
232
1c5acb87 233 //Fill histograms with no cuts applied.
b960c7eb 234 if(fKeepNeutralMesonHistos)
235 {
fad7739b 236 fhAnglePairNoCut ->Fill(e,angle);
237 fhInvMassPairNoCut->Fill(e,invmass);
9542ac75 238 fhAsymmetryNoCut ->Fill(e,asy);
fad7739b 239 }
9542ac75 240
1c5acb87 241 //Cut on the aperture of the pair
b960c7eb 242 if(fUseAngleCut)
243 {
244 if(IsAngleInWindow(angle,e))
245 {
246 if(fKeepNeutralMesonHistos )
247 {
9542ac75 248 fhAnglePairOpeningAngleCut ->Fill(e,angle);
249 fhInvMassPairOpeningAngleCut->Fill(e,invmass);
250 fhAsymmetryOpeningAngleCut ->Fill(e,asy);
251 }
252 //AliDebug(2,Form("Angle cut: pt %f, phi %f",pt,phi));
253 } else return kFALSE;
254 }
255
256 // Asymmetry cut
b960c7eb 257 if(fUseAsymmetryCut)
258 {
259 if(fAsymmetryCut > asy)
260 {
261 if(fKeepNeutralMesonHistos)
262 {
9542ac75 263 fhInvMassPairAsymmetryCut->Fill(e,invmass);
264 fhAnglePairAsymmetryCut ->Fill(e,angle);
265 }
266 } else return kFALSE;
267 }
1c5acb87 268
9542ac75 269
270 //Cut on the invariant mass of the pair
3bfcb597 271
272 Float_t invmassmaxcut = fInvMassMaxCut;
80515912 273 Float_t invmassRightBandMinCut = fRightBandMinCut;
274 Float_t invmassRightBandMixCut = fRightBandMaxCut;
275
b960c7eb 276 if(calo=="EMCAL" && e > 6.)
277 { // for EMCAL, pi0s, mass depends strongly with energy for e > 6, loose max cut
3bfcb597 278
279 invmassmaxcut = (fInvMassMaxCutParam[0]+fInvMassMaxCut)+fInvMassMaxCutParam[1]*e+fInvMassMaxCutParam[2]*e*e;
80515912 280 invmassRightBandMinCut = (fInvMassMaxCutParam[0]+fRightBandMinCut)+fInvMassMaxCutParam[1]*e+fInvMassMaxCutParam[2]*e*e;
281 invmassRightBandMixCut = (fInvMassMaxCutParam[0]+fRightBandMaxCut)+fInvMassMaxCutParam[1]*e+fInvMassMaxCutParam[2]*e*e;
282
3bfcb597 283 //printf("e %f, max cut %f, p00 %f,p0 %f,p1 %f,p2 %f\n",
284 // e,invmassmaxcut,fInvMassMaxCut,fInvMassMaxCutParam[0],fInvMassMaxCutParam[1],fInvMassMaxCutParam[2]);
285 }
286
3f150b4b 287 // normal case, invariant mass selection around pi0/eta peak
288 if( !fParticle.Contains("SideBand") )
289 {
290 if( invmass > fInvMassMinCut && invmass < invmassmaxcut )
291 {
292 if(fKeepNeutralMesonHistos)
293 {
294 fhInvMassPairAllCut->Fill(e,invmass);
295 fhAnglePairAllCut ->Fill(e,angle);
296 fhAsymmetryAllCut ->Fill(e,asy);
297 }
298
299 //AliDebug(2,Form("IM cut: pt %f, phi %f",pt,phi));
300 return kTRUE;
301
302 }//(invmass>0.125) && (invmass<0.145)
303 else
b960c7eb 304 {
3f150b4b 305 return kFALSE;
306 }
307 }// normal selection
308
309 else // select a band around pi0/eta
310 {
311 if((invmass > fLeftBandMinCut && invmass < fLeftBandMaxCut ) ||
80515912 312 (invmass > invmassRightBandMinCut && invmass < invmassRightBandMixCut))
3f150b4b 313 {
314 if(fKeepNeutralMesonHistos)
315 {
316 fhInvMassPairAllCut->Fill(e,invmass);
317 fhAnglePairAllCut ->Fill(e,angle);
318 fhAsymmetryAllCut ->Fill(e,asy);
319 }
320
321 //AliDebug(2,Form("IM cut: pt %f, phi %f",pt,phi));
322 return kTRUE;
323
324 }//(invmass>0.125) && (invmass<0.145)
325 else
326 {
327 return kFALSE;
328 }
329 }
1c5acb87 330
331}
332
b960c7eb 333//_______________________________________________________________
334void AliNeutralMesonSelection::SetParticle(TString particleName)
335{
3bfcb597 336 // Set some default parameters for selection of pi0 or eta
3f150b4b 337
338 fParticle = particleName ;
3bfcb597 339
3f150b4b 340 if(particleName.Contains("Pi0"))
b960c7eb 341 {
342 fHistoNIMBins = 150 ;
343 fHistoIMMax = 0.3 ;
344 fHistoIMMin = 0. ;
3bfcb597 345
b960c7eb 346 fM = 0.135 ; // GeV
347 fInvMassMaxCut = 0.16 ; // GeV
348 fInvMassMinCut = 0.11 ; // GeV
3bfcb597 349
3f150b4b 350 fLeftBandMinCut = 0.05 ; // GeV
351 fLeftBandMaxCut = 0.09 ; // GeV
352 fRightBandMinCut = 0.160 ; // GeV
353 fRightBandMaxCut = 0.165 ; // GeV
354
3bfcb597 355 fInvMassMaxCutParam[0] = 0.0 ;
356 fInvMassMaxCutParam[1] =-7.e-5 ;
357 fInvMassMaxCutParam[2] = 8.e-5 ;
358
b960c7eb 359 fShiftMinAngle[0] =-0.03 ;
360 fShiftMinAngle[1] = 0.0025;
7287751b 361
362 fAngleMaxParam.AddAt( 0.8, 0) ;
363 fAngleMaxParam.AddAt(-1, 1) ;
364 fAngleMaxParam.AddAt( 0.09, 2) ; //for pi0 shift, for eta maybe 0.09
365 fAngleMaxParam.AddAt(-2.e-3,3) ;
3bfcb597 366
3f150b4b 367 }
368 else if(particleName.Contains("Eta"))
b960c7eb 369 {
370 fHistoNIMBins = 200 ; // GeV
371 fHistoIMMax = 0.75 ; // GeV
372 fHistoIMMin = 0.35 ; // GeV
373
374 fM = 0.547 ; // GeV
375 fInvMassMaxCut = 0.590 ; // GeV
376 fInvMassMinCut = 0.510 ; // GeV
3bfcb597 377
3f150b4b 378 fLeftBandMinCut = 0.450 ; // GeV
379 fLeftBandMaxCut = 0.500 ; // GeV
380 fRightBandMinCut = 0.600 ; // GeV
381 fRightBandMaxCut = 0.650 ; // GeV
7287751b 382
3f150b4b 383 fInvMassMaxCutParam[0] = 0.00 ;
384 fInvMassMaxCutParam[1] = 0.00 ;
385 fInvMassMaxCutParam[2] = 0.00 ;
386
387 fShiftMinAngle[0] =-0.03 ;
388 fShiftMinAngle[0] = 0.00 ;
3bfcb597 389
7287751b 390 fAngleMaxParam.AddAt( 0.80, 0) ; // Same as pi0
391 fAngleMaxParam.AddAt(-0.25, 1) ; // Same as pi0
392 fAngleMaxParam.AddAt( 0.12, 2) ; // Shifted with respect to pi0
393 fAngleMaxParam.AddAt(-5.e-4, 3) ; // Same as pi0
3bfcb597 394
395 }
396 else
397 printf("AliAnaNeutralMesonSelection::SetParticle(%s) *** Particle NOT defined (Pi0 or Eta), Pi0 settings by default *** \n",particleName.Data());
398
399
400}
401
b960c7eb 402//______________________________________________________________
1c5acb87 403void AliNeutralMesonSelection::Print(const Option_t * opt) const
404{
405
406 //Print some relevant parameters set for the analysis
407 if(! opt)
408 return;
409
a3aebfff 410 printf("**** Print %s %s ****\n", GetName(), GetTitle() ) ;
1c5acb87 411
3f150b4b 412 printf("Particle %s, mass : %f \n", fParticle.Data(), fM );
1c5acb87 413 printf("Invariant mass limits : %f < m < %f \n", fInvMassMinCut , fInvMassMinCut );
9542ac75 414
415 printf("Use asymmetry cut? : %d ; A < %f \n", fUseAngleCut, fAsymmetryCut );
416
417 printf("Use angle cut? : %d \n", fUseAngleCut );
3f150b4b 418 if(fUseAngleCut)
419 {
9542ac75 420 printf("Angle selection param: \n");
421 printf("p0 : %f\n", fAngleMaxParam.At(0));
422 printf("p1 : %f\n", fAngleMaxParam.At(1));
423 printf("p2 : %f\n", fAngleMaxParam.At(2));
424 printf("p3 : %f\n", fAngleMaxParam.At(3));
7287751b 425 printf("Min angle shift : p0 = %1.3f, p1 = %1.3f,\n", fShiftMinAngle[0],fShiftMinAngle[1]);
9542ac75 426 }
427
1c5acb87 428 printf("Keep Neutral Meson Histos = %d\n",fKeepNeutralMesonHistos);
429
3f150b4b 430 if(fKeepNeutralMesonHistos)
431 {
a5fb4114 432 printf("Histograms: %3.1f < E < %3.1f, Nbin = %d\n", fHistoEMin, fHistoEMax, fHistoNEBins);
477d6cee 433 printf("Histograms: %3.1f < angle < %3.1f, Nbin = %d\n", fHistoAngleMin, fHistoAngleMax, fHistoNAngleBins);
3bfcb597 434 printf("Histograms: %3.1f < IM < %3.1f, Nbin = %d\n", fHistoIMMin, fHistoIMMax, fHistoNIMBins);
1c5acb87 435 }
477d6cee 436
1c5acb87 437}