1 /***************************************************************************
3 * $Id: AliFemtoBPLCMS3DCorrFctnEMCIC.cxx $
5 * Author: Nicolas Bock, Ohio State University, bock@mps.ohio-state.edu
6 ***************************************************************************
8 * Description: Calculates of the 3D Correlation Function, and also
9 * produces histograms to calculate Energy Momentum Conservation
10 * Induced Correlations (EMCICs)
12 * This Class produces the following histograms as function of Qinv
13 * (for both real and mixed pairs):
19 * The class is derived from AliFemtoBPLCMS3DCorrFctn, therefore it produces
20 * also the histograms in that class.
22 * NOTE: The EMCIC histograms are not averaged in this class, to obtain
23 * the average, the user needs to divide the real pair histograms by
24 * the numerator, and the mixed pair histograms by the denominator
26 ***************************************************************************
28 **************************************************************************/
30 //////////////////////////////////////////////////////////////////////////
32 // AliFemtoBPLCMS3DCorrFctn: a class to calculate 3D correlation //
33 // for pairs of identical particles. //
34 // It also stored the weighted qinv per bin histogram for the coulomb //
36 // In analysis the function should be first created in a macro, then //
37 // added to the analysis, and at the end of the macro the procedure to //
38 // write out histograms should be called. //
40 ///////////////////////////////////////////////////////////////////////////
42 #include "AliFemtoBPLCMS3DCorrFctnEMCIC.h"
43 #include "AliFemtoKTPairCut.h"
44 #include "AliFemtoAnalysisReactionPlane.h"
45 //#include "AliFemtoHisto.h"
50 ClassImp(AliFemtoBPLCMS3DCorrFctnEMCIC)
53 //____________________________
54 AliFemtoBPLCMS3DCorrFctnEMCIC::AliFemtoBPLCMS3DCorrFctnEMCIC(char* title, const int& nbins, const float& QLo, const float& QHi)
57 //fEnergyTotalReal(0),
58 // fEnergyMultReal(0),
71 char tTitNum[101] = "Num";
72 strncat(tTitNum,title, 100);
73 fNumerator = new TH3D(tTitNum,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
75 char tTitDen[101] = "Den";
76 strncat(tTitDen,title, 100);
77 fDenominator = new TH3D(tTitDen,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
79 //Setup EnergyTotalReal
80 /*char tTitNum1[100] = "ESumReal";
81 strncat(tTitNum1,title, 100);
82 fEnergyTotalReal = new TH3D(tTitNum1,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
84 //Setup EnergyMultReal
85 char tTitNum2[100] = "EMultReal";
86 strncat(tTitNum2,title, 100);
87 fEnergyMultReal = new TH3D(tTitNum2,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
90 char tTitNum3[100] = "PzMultReal";
91 strncat(tTitNum3,title, 100);
92 fPzMultReal = new TH3D(tTitNum3,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
95 char tTitNum4[100] = "PtMultReal";
96 strncat(tTitNum4,title, 100);
97 fPtMultReal = new TH3D(tTitNum4,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi); */
99 //Setup EnergyTotalMix
100 char tTitNum5[101] = "ESumMix";
101 strncat(tTitNum5,title, 100);
102 fEnergyTotalMix = new TH3D(tTitNum5,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
104 //Setup EnergyMultMix
105 char tTitNum6[101] = "EMultMix";
106 strncat(tTitNum6,title, 100);
107 fEnergyMultMix = new TH3D(tTitNum6,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
110 char tTitNum7[101] = "PzMultMix";
111 strncat(tTitNum7,title, 100);
112 fPzMultMix = new TH3D(tTitNum7,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
115 char tTitNum8[101] = "PtMultMix";
116 strncat(tTitNum8,title, 100);
117 fPtMultMix = new TH3D(tTitNum8,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
118 // To enable error bar calculation
120 /*fEnergyTotalReal->Sumw2();
121 fEnergyMultReal->Sumw2();
122 fPzMultReal->Sumw2();
123 fPtMultReal->Sumw2(); */
125 fDenominator->Sumw2();
126 fEnergyTotalMix->Sumw2();
127 fEnergyMultMix->Sumw2();
134 // Variable bin size constructor :
135 //qBins array of low-edges for each bin. This is an array of size nbins+1
136 AliFemtoBPLCMS3DCorrFctnEMCIC::AliFemtoBPLCMS3DCorrFctnEMCIC(char* title, const int& nbins, const float* qBins):
148 char tTitNum[101] = "Num";
149 strncat(tTitNum,title, 100);
150 fNumerator = new TH3D(tTitNum,title,nbins,qBins,nbins,qBins,nbins,qBins);
151 // set up denominator
152 char tTitDen[101] = "Den";
153 strncat(tTitDen,title, 100);
154 fDenominator = new TH3D(tTitDen,title,nbins,qBins,nbins,qBins,nbins,qBins);
156 //Setup EnergyTotalReal
157 /*char tTitNum1[100] = "ESumReal";
158 strncat(tTitNum1,title, 100);
159 fEnergyTotalReal = new TH3D(tTitNum1,title,nbins,qBins,nbins,qBins,nbins,qBins);
161 //Setup EnergyMultReal
162 char tTitNum2[100] = "EMultReal";
163 strncat(tTitNum2,title, 100);
164 fEnergyMultReal = new TH3D(tTitNum2,title,nbins,qBins,nbins,qBins,nbins,qBins);
167 char tTitNum3[100] = "PzMultReal";
168 strncat(tTitNum3,title, 100);
169 fPzMultReal = new TH3D(tTitNum3,title,nbins,qBins,nbins,qBins,nbins,qBins);
172 char tTitNum4[100] = "PtMultReal";
173 strncat(tTitNum4,title, 100);
174 fPtMultReal = new TH3D(tTitNum4,title,nbins,qBins,nbins,qBins,nbins,qBins); */
176 //Setup EnergyTotalMix
177 char tTitNum5[101] = "ESumMix";
178 strncat(tTitNum5,title, 100);
179 fEnergyTotalMix = new TH3D(tTitNum5,title,nbins,qBins,nbins,qBins,nbins,qBins);
181 //Setup EnergyMultMix
182 char tTitNum6[101] = "EMultMix";
183 strncat(tTitNum6,title, 100);
184 fEnergyMultMix = new TH3D(tTitNum6,title,nbins,qBins,nbins,qBins,nbins,qBins);
187 char tTitNum7[101] = "PzMultMix";
188 strncat(tTitNum7,title, 100);
189 fPzMultMix = new TH3D(tTitNum7,title,nbins,qBins,nbins,qBins,nbins,qBins);
192 char tTitNum8[101] = "PtMultMix";
193 strncat(tTitNum8,title, 100);
194 fPtMultMix = new TH3D(tTitNum8,title,nbins,qBins,nbins,qBins,nbins,qBins);
195 // To enable error bar calculation
197 /*fEnergyTotalReal->Sumw2();
198 fEnergyMultReal->Sumw2();
199 fPzMultReal->Sumw2();
200 fPtMultReal->Sumw2(); */
202 fDenominator->Sumw2();
203 fEnergyTotalMix->Sumw2();
204 fEnergyMultMix->Sumw2();
215 AliFemtoBPLCMS3DCorrFctnEMCIC::AliFemtoBPLCMS3DCorrFctnEMCIC(const AliFemtoBPLCMS3DCorrFctnEMCIC& aCorrFctn) :
216 AliFemtoCorrFctn(aCorrFctn),
217 /*fEnergyTotalReal(0),
230 fNumerator = new TH3D(*aCorrFctn.fNumerator);
231 fDenominator = new TH3D(*aCorrFctn.fDenominator);
232 /* fEnergyTotalReal = new TH3D(*aCorrFctn.fEnergyTotalReal);
233 fEnergyMultReal = new TH3D(*aCorrFctn.fEnergyMultReal);
234 fPzMultReal = new TH3D(*aCorrFctn.fPzMultReal);
235 fPtMultReal = new TH3D(*aCorrFctn.fPtMultReal); */
236 fEnergyTotalMix = new TH3D(*aCorrFctn.fEnergyTotalMix);
237 fEnergyMultMix = new TH3D(*aCorrFctn.fEnergyMultMix);
238 fPzMultMix = new TH3D(*aCorrFctn.fPzMultMix);
239 fPtMultMix = new TH3D(*aCorrFctn.fPtMultMix);
241 //____________________________
242 AliFemtoBPLCMS3DCorrFctnEMCIC::~AliFemtoBPLCMS3DCorrFctnEMCIC(){
244 /* delete fEnergyTotalReal;
245 delete fEnergyMultReal;
247 delete fPtMultReal; */
250 delete fEnergyTotalMix;
251 delete fEnergyMultMix;
255 //_________________________
256 AliFemtoBPLCMS3DCorrFctnEMCIC& AliFemtoBPLCMS3DCorrFctnEMCIC::operator=(const AliFemtoBPLCMS3DCorrFctnEMCIC& aCorrFctn)
258 // assignment operator
259 if (this == &aCorrFctn)
261 if (fNumerator) delete fNumerator;
262 fNumerator = new TH3D(*aCorrFctn.fNumerator);
263 if (fDenominator) delete fDenominator;
264 fDenominator = new TH3D(*aCorrFctn.fDenominator);
266 /* if (fEnergyTotalReal) delete fEnergyTotalReal;
267 fEnergyTotalReal = new TH3D(*aCorrFctn.fEnergyTotalReal);
268 if (fEnergyMultReal) delete fEnergyMultReal;
269 fEnergyMultReal = new TH3D(*aCorrFctn.fEnergyMultReal);
270 if (fPzMultReal) delete fPzMultReal;
271 fPzMultReal = new TH3D(*aCorrFctn.fPzMultReal);
272 if (fPtMultReal) delete fPtMultReal;
273 fPtMultReal = new TH3D(*aCorrFctn.fPtMultReal); */
274 if (fEnergyTotalMix) delete fEnergyTotalMix;
275 fEnergyTotalMix = new TH3D(*aCorrFctn.fEnergyTotalMix);
276 if (fEnergyMultMix) delete fEnergyMultMix;
277 fEnergyMultMix = new TH3D(*aCorrFctn.fEnergyMultMix);
278 if (fPzMultMix) delete fPzMultMix;
279 fPzMultMix = new TH3D(*aCorrFctn.fPzMultMix);
280 if (fPtMultMix) delete fPtMultMix;
281 fPtMultMix = new TH3D(*aCorrFctn.fPtMultMix);
283 fUseRPSelection = aCorrFctn.fUseRPSelection;
288 //_________________________
289 void AliFemtoBPLCMS3DCorrFctnEMCIC::WriteOutHistos(){
292 fDenominator->Write();
293 //fEnergyTotalReal->Write();
294 //fEnergyMultReal->Write();
295 //fPzMultReal->Write();
296 //fPtMultReal->Write();
297 fEnergyTotalMix->Write();
298 fEnergyMultMix->Write();
301 //cout << "write histos emcics" << endl;
303 //______________________________
304 TList* AliFemtoBPLCMS3DCorrFctnEMCIC::GetOutputList()
306 // Prepare the list of objects to be written to the output
307 TList *tOutputList = new TList();
308 cout << "Getting list from CFemcic" << endl;
309 tOutputList->Add(fNumerator);
310 tOutputList->Add(fDenominator);
311 /*tOutputList->Add(fEnergyTotalReal);
312 tOutputList->Add(fEnergyMultReal);
313 tOutputList->Add(fPzMultReal);
314 tOutputList->Add(fPtMultReal); */
315 tOutputList->Add(fEnergyTotalMix );
316 tOutputList->Add(fEnergyMultMix );
317 tOutputList->Add(fPzMultMix);
318 tOutputList->Add(fPtMultMix);
324 //____________________________
325 void AliFemtoBPLCMS3DCorrFctnEMCIC::AddRealPair( AliFemtoPair* pair){
326 // perform operations on real pairs
329 if (fUseRPSelection) {
330 AliFemtoKTPairCut *ktc = dynamic_cast<AliFemtoKTPairCut *>(fPairCut);
332 cout << "RP aware cut requested, but not connected to the CF" << endl;
333 if (!(fPairCut->Pass(pair))) return;
336 AliFemtoAnalysisReactionPlane *arp = dynamic_cast<AliFemtoAnalysisReactionPlane *> (HbtAnalysis());
338 cout << "RP aware cut requested, but not connected to the CF" << endl;
339 if (!(fPairCut->Pass(pair))) return;
341 else if (!(ktc->Pass(pair, arp->GetCurrentReactionPlane()))) return;
345 if (!(fPairCut->Pass(pair))) return;
348 double qOut = fabs(pair->QOutCMS());
349 double qSide = fabs( pair->QSideCMS());
350 double qLong = fabs(pair->QLongCMS());
352 fNumerator->Fill(qOut,qSide,qLong);
354 /*AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
355 AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
356 double tE1 = tMom1.e();
357 double tE2 = tMom2.e();
358 double tPz1 = tMom1.pz();
359 double tPz2 = tMom2.pz();
362 tPt1.Set(tMom1.px(),tMom1.py());
363 tPt2.Set(tMom2.px(),tMom2.py());
366 double tPt1DotPt2 = tPt1*tPt2;
368 fEnergyTotalReal->Fill(qOut,qSide,qLong,tE1+tE2);
369 fEnergyMultReal->Fill(qOut,qSide,qLong,tE1*tE2);
370 fPzMultReal->Fill(qOut,qSide,qLong,tPz1*tPz2);
371 fPtMultReal->Fill(qOut,qSide,qLong,tPt1DotPt2); */
375 //____________________________
376 void AliFemtoBPLCMS3DCorrFctnEMCIC::AddMixedPair( AliFemtoPair* pair){
377 // perform operations on mixed pairs
379 // if (!(fPairCut->Pass(pair))) return;
382 if (fUseRPSelection) {
383 AliFemtoKTPairCut *ktc = dynamic_cast<AliFemtoKTPairCut *>(fPairCut);
385 cout << "RP aware cut requested, but not connected to the CF" << endl;
386 if (!(fPairCut->Pass(pair))) return;
389 AliFemtoAnalysisReactionPlane *arp = dynamic_cast<AliFemtoAnalysisReactionPlane *> (HbtAnalysis());
391 cout << "RP aware cut requested, but not connected to the CF" << endl;
392 if (!(fPairCut->Pass(pair))) return;
394 else if (!(ktc->Pass(pair, arp->GetCurrentReactionPlane()))) return;
398 if (!(fPairCut->Pass(pair))) return;
402 double qOut = fabs(pair->QOutCMS());
403 double qSide = fabs(pair->QSideCMS());
404 double qLong = fabs(pair->QLongCMS());
406 fDenominator->Fill(qOut,qSide,qLong);
408 AliFemtoLorentzVector tMom1 = pair->Track1()->FourMomentum();
409 AliFemtoLorentzVector tMom2 = pair->Track2()->FourMomentum();
410 double tE1 = tMom1.e();
411 double tE2 = tMom2.e();
412 double tPz1 = tMom1.pz();
413 double tPz2 = tMom2.pz();
416 tPt1.Set(tMom1.px(),tMom1.py());
417 tPt2.Set(tMom2.px(),tMom2.py());
418 double tPt1DotPt2 = tPt1*tPt2;
420 fEnergyTotalMix->Fill(qOut,qSide,qLong,tE1+tE2);
421 fEnergyMultMix->Fill(qOut,qSide,qLong,tE1*tE2);
422 fPzMultMix->Fill(qOut,qSide,qLong,tPz1*tPz2);
423 fPtMultMix->Fill(qOut,qSide,qLong,tPt1DotPt2);
428 void AliFemtoBPLCMS3DCorrFctnEMCIC::SetUseRPSelection(unsigned short aRPSel)
430 fUseRPSelection = aRPSel;