1 /***************************************************************************
5 * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
6 ***************************************************************************
8 * Description: part of STAR HBT Framework: AliFemtoMaker package
9 * 3D Bertsch-Pratt decomposition in the LCMS frame
11 ***************************************************************************
14 * Revision 1.1.1.1 2007/03/07 10:14:49 mchojnacki
15 * First version on CVS
17 * Revision 1.7 2003/01/31 19:20:54 magestro
18 * Cleared up simple compiler warnings on i386_linux24
20 * Revision 1.6 2002/06/07 22:51:38 lisa
21 * Widely used AliFemtoBPLCMS3DCorrFctn class now accumulates UNcorrected denominator and has a WriteOutHistos method
23 * Revision 1.5 2001/05/23 00:19:04 lisa
24 * Add in Smearing classes and methods needed for momentum resolution studies and correction
26 * Revision 1.4 2000/10/26 19:48:49 rcwells
27 * Added functionality for Coulomb correction of <qInv> in 3D correltions
29 * Revision 1.3 2000/09/14 18:36:53 lisa
30 * Added Qinv and ExitSep pair cuts and AliFemtoBPLCMS3DCorrFctn_SIM CorrFctn
32 * Revision 1.2 2000/08/23 19:43:43 lisa
33 * added alternate normalization algorithm to 3d CorrFctns in case normal one fails
35 * Revision 1.1 2000/08/17 20:48:39 lisa
36 * Adding correlationfunction in LCMS frame
39 **************************************************************************/
41 #include "CorrFctn/AliFemtoBPLCMS3DCorrFctn.h"
42 //#include "Infrastructure/AliFemtoHisto.h"
46 ClassImp(AliFemtoBPLCMS3DCorrFctn)
49 //____________________________
50 AliFemtoBPLCMS3DCorrFctn::AliFemtoBPLCMS3DCorrFctn(char* title, const int& nbins, const float& QLo, const float& QHi){
57 // fCorrection = 0; // pointer to Coulomb Correction object
59 fPairCut = 0; // added Sept2000 - CorrFctn-specific PairCut
61 // fSmearPair = 0; // no resolution correction unless user sets SmearPair
64 char TitNum[100] = "Num";
66 fNumerator = new TH3D(TitNum,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
68 char TitDen[100] = "Den";
70 fDenominator = new TH3D(TitDen,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
71 // set up uncorrected denominator
72 char TitDenUncoul[100] = "DenNoCoul";
73 strcat(TitDenUncoul,title);
74 // fUncorrectedDenominator = new TH3D(TitDenUncoul,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
76 char TitRat[100] = "Rat";
78 fRatio = new TH3D(TitRat,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
80 char TitQinv[100] = "Qinv";
81 strcat(TitQinv,title);
82 fQinvHisto = new TH3D(TitQinv,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
84 // to enable error bar calculation...
86 fDenominator->Sumw2();
87 // fUncorrectedDenominator->Sumw2();
90 // Following histos are for the momentum resolution correction
91 // they are filled only if a AliFemtoSmear object is plugged in
92 // here comes the "idea" numerator and denominator and ratio...
93 char TitNumID[100] = "IDNum";
94 strcat(TitNumID,title);
95 fIDNumHisto = new TH3D(TitNumID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
96 char TitDenID[100] = "IDDen";
97 strcat(TitDenID,title);
98 fIDDenHisto = new TH3D(TitDenID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
99 char TitRatID[100] = "IDRat";
100 strcat(TitRatID,title);
101 fIDRatHisto = new TH3D(TitRatID,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
103 fIDNumHisto->Sumw2();
104 fIDDenHisto->Sumw2();
105 fIDRatHisto->Sumw2();
108 // here comes the "smeared" numerator and denominator...
109 char TitNumSM[100] = "SMNum";
110 strcat(TitNumSM,title);
111 fSMNumHisto = new TH3D(TitNumSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
112 char TitDenSM[100] = "SMDen";
113 strcat(TitDenSM,title);
114 fSMDenHisto = new TH3D(TitDenSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
115 char TitRatSM[100] = "SMRat";
116 strcat(TitRatSM,title);
117 fSMRatHisto = new TH3D(TitRatSM,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
119 fSMNumHisto->Sumw2();
120 fSMDenHisto->Sumw2();
121 fSMRatHisto->Sumw2();
123 // here comes the correction factor (which is just ratio of ideal ratio to smeared ratio)
124 char TitCorrection[100] = "CorrectionFactor";
125 strcat(TitCorrection,title);
126 fCorrectionHisto = new TH3D(TitCorrection,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
127 fCorrectionHisto->Sumw2();
128 // here comes the fully corrected correlation function
129 char TitCorrCF[100] = "CorrectedCF";
130 strcat(TitCorrCF,title);
131 fCorrCFHisto = new TH3D(TitCorrCF,title,nbins,QLo,QHi,nbins,QLo,QHi,nbins,QLo,QHi);
132 fCorrCFHisto->Sumw2();
134 // user can (and should) override these defaults...
142 //____________________________
143 AliFemtoBPLCMS3DCorrFctn::~AliFemtoBPLCMS3DCorrFctn(){
154 delete fCorrectionHisto;
158 //_________________________
159 void AliFemtoBPLCMS3DCorrFctn::WriteOutHistos(){
162 fDenominator->Write();
163 // fUncorrectedDenominator->Write();
169 fIDNumHisto->Write();
170 fIDDenHisto->Write();
171 fIDRatHisto->Write();
173 fSMNumHisto->Write();
174 fSMDenHisto->Write();
175 fSMRatHisto->Write();
177 fCorrectionHisto->Write();
178 fCorrCFHisto->Write();
183 //_________________________
184 void AliFemtoBPLCMS3DCorrFctn::Finish(){
185 // here is where we should normalize, fit, etc...
186 double NumFact,DenFact;
187 if ((fNumRealsNorm !=0) && (fNumMixedNorm !=0)){
188 NumFact = double(fNumRealsNorm);
189 DenFact = double(fNumMixedNorm);
191 // can happen that the fNumRealsNorm and fNumMixedNorm = 0 if you do non-standard
192 // things like making a new CorrFctn and just setting the Numerator and Denominator
193 // from OTHER CorrFctns which you read in (like when doing parallel processing)
195 cout << "Warning! - no normalization constants defined - I do the best I can..." << endl;
196 int nbins = fNumerator->GetNbinsX();
197 int half_way = nbins/2;
198 NumFact = fNumerator->Integral(half_way,nbins,half_way,nbins,half_way,nbins);
199 DenFact = fDenominator->Integral(half_way,nbins,half_way,nbins,half_way,nbins);
202 fRatio->Divide(fNumerator,fDenominator,DenFact,NumFact);
203 // fQinvHisto->Divide(fUncorrectedDenominator);
204 fQinvHisto->Divide(fDenominator);
207 // now do all the resolution correction stuff..
208 if (fSmearPair){ // but only do it if we have been working with a SmearPair
209 fIDRatHisto->Divide(fIDNumHisto,fIDDenHisto);
210 fSMRatHisto->Divide(fSMNumHisto,fSMDenHisto);
211 fCorrectionHisto->Divide(fIDRatHisto,fSMRatHisto);
212 fCorrCFHisto->Multiply(fRatio,fCorrectionHisto);
218 //____________________________
219 AliFemtoString AliFemtoBPLCMS3DCorrFctn::Report(){
220 string stemp = "LCMS Frame Bertsch-Pratt 3D Correlation Function Report:\n";
222 sprintf(ctemp,"Number of entries in numerator:\t%E\n",fNumerator->GetEntries());
224 sprintf(ctemp,"Number of entries in denominator:\t%E\n",fDenominator->GetEntries());
226 sprintf(ctemp,"Number of entries in ratio:\t%E\n",fRatio->GetEntries());
228 sprintf(ctemp,"Normalization region in Qinv was:\t%E\t%E\n",fQinvNormLo,fQinvNormHi);
230 sprintf(ctemp,"Number of pairs in Normalization region was:\n");
232 sprintf(ctemp,"In numerator:\t%lu\t In denominator:\t%lu\n",fNumRealsNorm,fNumMixedNorm);
236 float radius = fCorrection->GetRadius();
237 sprintf(ctemp,"Coulomb correction used radius of\t%E\n",radius);
241 sprintf(ctemp,"No Coulomb Correction applied to this CorrFctn\n");
247 sprintf(ctemp,"Here is the PairCut specific to this CorrFctn\n");
249 stemp += fPairCut->Report();
252 sprintf(ctemp,"No PairCut specific to this CorrFctn\n");
257 AliFemtoString returnThis = stemp;
260 //____________________________
261 void AliFemtoBPLCMS3DCorrFctn::AddRealPair(const AliFemtoPair* pair){
264 if (!(fPairCut->Pass(pair))) return;
267 double Qinv = fabs(pair->qInv()); // note - qInv() will be negative for identical pairs...
268 if ((Qinv < fQinvNormHi) && (Qinv > fQinvNormLo)) fNumRealsNorm++;
269 double qOut = fabs(pair->qOutCMS());
270 double qSide = fabs(pair->qSideCMS());
271 double qLong = fabs(pair->qLongCMS());
273 fNumerator->Fill(qOut,qSide,qLong);
275 //____________________________
276 void AliFemtoBPLCMS3DCorrFctn::AddMixedPair(const AliFemtoPair* pair){
279 if (!(fPairCut->Pass(pair))) return;
282 // double CoulombWeight = (fCorrection ? fCorrection->CoulombCorrect(pair) : 1.0);
283 double CoulombWeight = 1.0;
285 double Qinv = fabs(pair->qInv()); // note - qInv() will be negative for identical pairs...
286 if ((Qinv < fQinvNormHi) && (Qinv > fQinvNormLo)) fNumMixedNorm++;
287 double qOut = fabs(pair->qOutCMS());
288 double qSide = fabs(pair->qSideCMS());
289 double qLong = fabs(pair->qLongCMS());
291 fDenominator->Fill(qOut,qSide,qLong,CoulombWeight);
292 // fUncorrectedDenominator->Fill(qOut,qSide,qLong,1.0);
293 fQinvHisto->Fill(qOut,qSide,qLong,Qinv);
296 // now for the momentum resolution stuff...
298 double CorrWeight = 1.0 +
299 fLambda*exp((-qOut*qOut*fRout2 -qSide*qSide*fRside2 -qLong*qLong*fRlong2)/0.038936366329);
300 CorrWeight *= CoulombWeight; // impt.
302 fIDNumHisto->Fill(qOut,qSide,qLong,CorrWeight);
303 fIDDenHisto->Fill(qOut,qSide,qLong,CoulombWeight);
305 fSmearPair->SetUnsmearedPair(pair);
306 double qOut_prime = fabs(fSmearPair->SmearedPair().qOutCMS());
307 double qSide_prime = fabs(fSmearPair->SmearedPair().qSideCMS());
308 double qLong_prime = fabs(fSmearPair->SmearedPair().qLongCMS());
310 fSMNumHisto->Fill(qOut_prime,qSide_prime,qLong_prime,CorrWeight);
312 double SmearedCoulombWeight = ( fCorrection ?
313 fCorrection->CoulombCorrect(&(fSmearPair->SmearedPair())) :
316 fSMDenHisto->Fill(qOut_prime,qSide_prime,qLong_prime,SmearedCoulombWeight);