1 ///////////////////////////////////////////////////////////////////////////
3 // AliFemtoBPLCMS3DCorrFctn: a class to calculate 3D correlation //
4 // for pairs of identical particles. //
5 // It also stored the weighted qinv per bin histogram for the coulomb //
7 // In analysis the function should be first created in a macro, then //
8 // added to the analysis, and at the end of the macro the procedure to //
9 // write out histograms should be called. //
11 ///////////////////////////////////////////////////////////////////////////
13 #include "AliFemtoBPLCMS3DCorrFctn.h"
14 //#include "AliFemtoHisto.h"
18 ClassImp(AliFemtoBPLCMS3DCorrFctn)
21 //____________________________
22 AliFemtoBPLCMS3DCorrFctn::AliFemtoBPLCMS3DCorrFctn(char* title, const int& nbins, const float& QLo, const float& QHi)
52 // fCorrection = 0; // pointer to Coulomb Correction object
54 fPairCut = 0; // added Sept2000 - CorrFctn-specific PairCut
56 // fSmearPair = 0; // no resolution correction unless user sets SmearPair
59 char tTitNum[100] = "Num";
60 strcat(tTitNum,title);
61 fNumerator = new TH3D(tTitNum,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
63 char tTitDen[100] = "Den";
64 strcat(tTitDen,title);
65 fDenominator = new TH3D(tTitDen,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
66 // set up uncorrected denominator
67 char tTitDenUncoul[100] = "DenNoCoul";
68 strcat(tTitDenUncoul,title);
69 // fUncorrectedDenominator = new TH3D(tTitDenUncoul,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
71 char tTitRat[100] = "Rat";
72 strcat(tTitRat,title);
73 fRatio = new TH3D(tTitRat,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
75 char tTitQinv[100] = "Qinv";
76 strcat(tTitQinv,title);
77 fQinvHisto = new TH3D(tTitQinv,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
79 // to enable error bar calculation...
81 fDenominator->Sumw2();
82 // fUncorrectedDenominator->Sumw2();
85 // Following histos are for the momentum resolution correction
86 // they are filled only if a AliFemtoSmear object is plugged in
87 // here comes the "idea" numerator and denominator and ratio...
88 char tTitNumID[100] = "IDNum";
89 strcat(tTitNumID,title);
90 fIDNumHisto = new TH3D(tTitNumID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
91 char tTitDenID[100] = "IDDen";
92 strcat(tTitDenID,title);
93 fIDDenHisto = new TH3D(tTitDenID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
94 char tTitRatID[100] = "IDRat";
95 strcat(tTitRatID,title);
96 fIDRatHisto = new TH3D(tTitRatID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
100 fIDRatHisto->Sumw2();
103 // here comes the "smeared" numerator and denominator...
104 char tTitNumSM[100] = "SMNum";
105 strcat(tTitNumSM,title);
106 fSMNumHisto = new TH3D(tTitNumSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
107 char tTitDenSM[100] = "SMDen";
108 strcat(tTitDenSM,title);
109 fSMDenHisto = new TH3D(tTitDenSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
110 char tTitRatSM[100] = "SMRat";
111 strcat(tTitRatSM,title);
112 fSMRatHisto = new TH3D(tTitRatSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
114 fSMNumHisto->Sumw2();
115 fSMDenHisto->Sumw2();
116 fSMRatHisto->Sumw2();
118 // here comes the correction factor (which is just ratio of ideal ratio to smeared ratio)
119 char tTitCorrection[100] = "CorrectionFactor";
120 strcat(tTitCorrection,title);
121 fCorrectionHisto = new TH3D(tTitCorrection,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
122 fCorrectionHisto->Sumw2();
123 // here comes the fully corrected correlation function
124 char tTitCorrCF[100] = "CorrectedCF";
125 strcat(tTitCorrCF,title);
126 fCorrCFHisto = new TH3D(tTitCorrCF,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
127 fCorrCFHisto->Sumw2();
129 // user can (and should) override these defaults...
137 AliFemtoBPLCMS3DCorrFctn::AliFemtoBPLCMS3DCorrFctn(const AliFemtoBPLCMS3DCorrFctn& aCorrFctn) :
161 fIDNumHisto = new TH3D(*aCorrFctn.fIDNumHisto);
162 fIDDenHisto = new TH3D(*aCorrFctn.fIDDenHisto);
163 fIDRatHisto = new TH3D(*aCorrFctn.fIDRatHisto);
164 fSMNumHisto = new TH3D(*aCorrFctn.fSMNumHisto);
165 fSMDenHisto = new TH3D(*aCorrFctn.fSMDenHisto);
166 fSMRatHisto = new TH3D(*aCorrFctn.fSMRatHisto);
167 fCorrectionHisto = new TH3D(*aCorrFctn.fCorrectionHisto);
168 fCorrCFHisto = new TH3D(*aCorrFctn.fCorrCFHisto);
169 fNumerator = new TH3D(*aCorrFctn.fNumerator);
170 fDenominator = new TH3D(*aCorrFctn.fDenominator);
171 fRatio = new TH3D(*aCorrFctn.fRatio);
172 fQinvHisto = new TH3D(*aCorrFctn.fQinvHisto);
173 fLambda = aCorrFctn.fLambda;
174 fRout2 = aCorrFctn.fRout2;
175 fRside2 = aCorrFctn.fRside2;
176 fRlong2 = aCorrFctn.fRlong2;
177 fPairCut = aCorrFctn.fPairCut;
178 fQinvNormLo = aCorrFctn.fQinvNormLo;
179 fQinvNormHi = aCorrFctn.fQinvNormHi;
180 fNumRealsNorm = aCorrFctn.fNumRealsNorm;
181 fNumMixedNorm = aCorrFctn.fNumMixedNorm;
183 //____________________________
184 AliFemtoBPLCMS3DCorrFctn::~AliFemtoBPLCMS3DCorrFctn(){
196 delete fCorrectionHisto;
199 //_________________________
200 AliFemtoBPLCMS3DCorrFctn& AliFemtoBPLCMS3DCorrFctn::operator=(const AliFemtoBPLCMS3DCorrFctn& aCorrFctn)
202 // assignment operator
203 if (this == &aCorrFctn)
205 if (fIDNumHisto) delete fIDNumHisto;
206 fIDNumHisto = new TH3D(*aCorrFctn.fIDNumHisto);
207 if (fIDDenHisto) delete fIDDenHisto;
208 fIDDenHisto = new TH3D(*aCorrFctn.fIDDenHisto);
209 if (fIDRatHisto) delete fIDRatHisto;
210 fIDRatHisto = new TH3D(*aCorrFctn.fIDRatHisto);
211 if (fSMNumHisto) delete fSMNumHisto;
212 fSMNumHisto = new TH3D(*aCorrFctn.fSMNumHisto);
213 if (fSMDenHisto) delete fSMDenHisto;
214 fSMDenHisto = new TH3D(*aCorrFctn.fSMDenHisto);
215 if (fSMRatHisto) delete fSMRatHisto;
216 fSMRatHisto = new TH3D(*aCorrFctn.fSMRatHisto);
218 if (fCorrectionHisto) delete fCorrectionHisto;
219 fCorrectionHisto = new TH3D(*aCorrFctn.fCorrectionHisto);
220 if (fCorrCFHisto) delete fCorrCFHisto;
221 fCorrCFHisto = new TH3D(*aCorrFctn.fCorrCFHisto);
222 if (fNumerator) delete fNumerator;
223 fNumerator = new TH3D(*aCorrFctn.fNumerator);
224 if (fDenominator) delete fDenominator;
225 fDenominator = new TH3D(*aCorrFctn.fDenominator);
226 if (fRatio) delete fRatio;
227 fRatio = new TH3D(*aCorrFctn.fRatio);
228 if (fQinvHisto) delete fQinvHisto;
229 fQinvHisto = new TH3D(*aCorrFctn.fQinvHisto);
231 fLambda = aCorrFctn.fLambda;
232 fRout2 = aCorrFctn.fRout2;
233 fRside2 = aCorrFctn.fRside2;
234 fRlong2 = aCorrFctn.fRlong2;
235 fPairCut = aCorrFctn.fPairCut;
236 fQinvNormLo = aCorrFctn.fQinvNormLo;
237 fQinvNormHi = aCorrFctn.fQinvNormHi;
238 fNumRealsNorm = aCorrFctn.fNumRealsNorm;
239 fNumMixedNorm = aCorrFctn.fNumMixedNorm;
244 //_________________________
245 void AliFemtoBPLCMS3DCorrFctn::WriteOutHistos(){
246 // Write out all histograms to file
248 fDenominator->Write();
249 // fUncorrectedDenominator->Write();
255 fIDNumHisto->Write();
256 fIDDenHisto->Write();
257 fIDRatHisto->Write();
259 fSMNumHisto->Write();
260 fSMDenHisto->Write();
261 fSMRatHisto->Write();
263 fCorrectionHisto->Write();
264 fCorrCFHisto->Write();
269 //_________________________
270 void AliFemtoBPLCMS3DCorrFctn::Finish(){
271 // here is where we should normalize, fit, etc...
272 double tNumFact,tDenFact;
273 if ((fNumRealsNorm !=0) && (fNumMixedNorm !=0)){
274 tNumFact = double(fNumRealsNorm);
275 tDenFact = double(fNumMixedNorm);
277 // can happen that the fNumRealsNorm and fNumMixedNorm = 0 if you do non-standard
278 // things like making a new CorrFctn and just setting the Numerator and Denominator
279 // from OTHER CorrFctns which you read in (like when doing parallel processing)
281 cout << "Warning! - no normalization constants defined - I do the best I can..." << endl;
282 int nbins = fNumerator->GetNbinsX();
283 int half_way = nbins/2;
284 tNumFact = fNumerator->Integral(half_way,nbins,half_way,nbins,half_way,nbins);
285 tDenFact = fDenominator->Integral(half_way,nbins,half_way,nbins,half_way,nbins);
288 fRatio->Divide(fNumerator,fDenominator,tDenFact,tNumFact);
289 // fQinvHisto->Divide(fUncorrectedDenominator);
290 fQinvHisto->Divide(fDenominator);
293 // now do all the resolution correction stuff..
294 if (fSmearPair){ // but only do it if we have been working with a SmearPair
295 fIDRatHisto->Divide(fIDNumHisto,fIDDenHisto);
296 fSMRatHisto->Divide(fSMNumHisto,fSMDenHisto);
297 fCorrectionHisto->Divide(fIDRatHisto,fSMRatHisto);
298 fCorrCFHisto->Multiply(fRatio,fCorrectionHisto);
304 //____________________________
305 AliFemtoString AliFemtoBPLCMS3DCorrFctn::Report(){
306 // Construct the report
307 string stemp = "LCMS Frame Bertsch-Pratt 3D Correlation Function Report:\n";
309 sprintf(ctemp,"Number of entries in numerator:\t%E\n",fNumerator->GetEntries());
311 sprintf(ctemp,"Number of entries in denominator:\t%E\n",fDenominator->GetEntries());
313 sprintf(ctemp,"Number of entries in ratio:\t%E\n",fRatio->GetEntries());
315 sprintf(ctemp,"Normalization region in Qinv was:\t%E\t%E\n",fQinvNormLo,fQinvNormHi);
317 sprintf(ctemp,"Number of pairs in Normalization region was:\n");
319 sprintf(ctemp,"In numerator:\t%lu\t In denominator:\t%lu\n",fNumRealsNorm,fNumMixedNorm);
323 float radius = fCorrection->GetRadius();
324 sprintf(ctemp,"Coulomb correction used radius of\t%E\n",radius);
328 sprintf(ctemp,"No Coulomb Correction applied to this CorrFctn\n");
334 sprintf(ctemp,"Here is the PairCut specific to this CorrFctn\n");
336 stemp += fPairCut->Report();
339 sprintf(ctemp,"No PairCut specific to this CorrFctn\n");
344 AliFemtoString returnThis = stemp;
347 //____________________________
348 void AliFemtoBPLCMS3DCorrFctn::AddRealPair( AliFemtoPair* pair){
349 // perform operations on real pairs
351 if (!(fPairCut->Pass(pair))) return;
354 double tQinv = fabs(pair->QInv()); // note - qInv() will be negative for identical pairs...
355 if ((tQinv < fQinvNormHi) && (tQinv > fQinvNormLo)) fNumRealsNorm++;
356 double qOut = fabs(pair->QOutCMS());
357 double qSide = fabs(pair->QSideCMS());
358 double qLong = fabs(pair->QLongCMS());
360 fNumerator->Fill(qOut,qSide,qLong);
362 //____________________________
363 void AliFemtoBPLCMS3DCorrFctn::AddMixedPair( AliFemtoPair* pair){
364 // perform operations on mixed pairs
366 if (!(fPairCut->Pass(pair))) return;
369 // double CoulombWeight = (fCorrection ? fCorrection->CoulombCorrect(pair) : 1.0);
370 double tCoulombWeight = 1.0;
372 double tQinv = fabs(pair->QInv()); // note - qInv() will be negative for identical pairs...
373 if ((tQinv < fQinvNormHi) && (tQinv > fQinvNormLo)) fNumMixedNorm++;
374 double qOut = fabs(pair->QOutCMS());
375 double qSide = fabs(pair->QSideCMS());
376 double qLong = fabs(pair->QLongCMS());
378 fDenominator->Fill(qOut,qSide,qLong,tCoulombWeight);
379 // fUncorrectedDenominator->Fill(qOut,qSide,qLong,1.0);
380 fQinvHisto->Fill(qOut,qSide,qLong,tQinv);
383 // now for the momentum resolution stuff...
385 double CorrWeight = 1.0 +
386 fLambda*exp((-qOut*qOut*fRout2 -qSide*qSide*fRside2 -qLong*qLong*fRlong2)/0.038936366329);
387 CorrWeight *= CoulombWeight; // impt.
389 fIDNumHisto->Fill(qOut,qSide,qLong,CorrWeight);
390 fIDDenHisto->Fill(qOut,qSide,qLong,CoulombWeight);
392 fSmearPair->SetUnsmearedPair(pair);
393 double qOut_prime = fabs(fSmearPair->SmearedPair().qOutCMS());
394 double qSide_prime = fabs(fSmearPair->SmearedPair().qSideCMS());
395 double qLong_prime = fabs(fSmearPair->SmearedPair().qLongCMS());
397 fSMNumHisto->Fill(qOut_prime,qSide_prime,qLong_prime,CorrWeight);
399 double SmearedCoulombWeight = ( fCorrection ?
400 fCorrection->CoulombCorrect(&(fSmearPair->SmearedPair())) :
403 fSMDenHisto->Fill(qOut_prime,qSide_prime,qLong_prime,SmearedCoulombWeight);