1 #include "AliHBTCorrectQInvCorrelFctn.h"
3 ///////////////////////////////////////////////////////
5 // AliHBTCorrectQInvCorrelFctn //
7 // Class for calculating Q Invariant correlation //
8 // taking to the account resolution of the //
9 // detector and coulomb effects. //
10 // Implemented on basis of STAR procedure //
11 // implemented and described by Michael A. Lisa //
13 // Piotr.Skowronski@cern.ch //
14 // http://alisoft.cern.ch/people/skowron/analyzer //
16 ///////////////////////////////////////////////////////
18 //Parameters fit from pi+ pi+ resolution analysis for pair with qinv<50MeV
20 // FCN=98.0971 FROM MIGRAD STATUS=CONVERGED 332 CALLS 333 TOTAL
21 // EDM=2.13364e-12 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 2.4 per cent
22 // EXT PARAMETER STEP FIRST
23 // NO. NAME VALUE ERROR SIZE DERIVATIVE
24 // 1 fThetaA 2.72546e-03 1.43905e-04 -0.00000e+00 5.54375e-02
25 // 2 fThetaB 1.87116e-04 5.11862e-05 0.00000e+00 3.66500e-01
26 // 3 fThetaAlpha -2.36868e+00 1.83230e-01 0.00000e+00 -7.01301e-05
28 // FCN=120.603 FROM MIGRAD STATUS=CONVERGED 117 CALLS 118 TOTAL
29 // EDM=2.5153e-12 STRATEGY= 1 ERROR MATRIX UNCERTAINTY 2.4 per cent
30 // EXT PARAMETER STEP FIRST
31 // NO. NAME VALUE ERROR SIZE DERIVATIVE
32 // 1 fPhiA 1.93913e-03 1.31059e-04 -0.00000e+00 -5.87280e-02
33 // 2 fPhiA 2.48687e-04 5.41251e-05 0.00000e+00 -1.87361e-01
34 // 3 fPhiAlpha -2.22649e+00 1.44503e-01 0.00000e+00 8.97538e-06
40 ClassImp(AliHBTCorrectQInvCorrelFctn)
42 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(const char* name,const char* title):
43 AliHBTOnePairFctn1D(name,title),
58 fRConvergenceTreshold(0.3),
59 fLambdaConvergenceTreshold(0.05)
63 /******************************************************************/
65 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(TH1D* measqinv,const char* name,const char* title):
66 AliHBTOnePairFctn1D(name,title,
67 measqinv->GetNbinsX(),
68 measqinv->GetXaxis()->GetXmax(),
69 measqinv->GetXaxis()->GetXmin()),
70 fMeasCorrelFctn(measqinv),
84 fRConvergenceTreshold(0.3),
85 fLambdaConvergenceTreshold(0.05)
89 /******************************************************************/
91 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(const char* name, const char* title,
92 Int_t nbins, Float_t maxXval, Float_t minXval):
93 AliHBTOnePairFctn1D(name,title,nbins,maxXval,minXval),
108 fRConvergenceTreshold(0.3),
109 fLambdaConvergenceTreshold(0.05)
113 /******************************************************************/
114 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(const AliHBTCorrectQInvCorrelFctn& in):
115 AliHBTOnePairFctn1D(in),
116 fMeasCorrelFctn(0x0),
130 fRConvergenceTreshold(0),
131 fLambdaConvergenceTreshold(0)
137 AliHBTCorrectQInvCorrelFctn::~AliHBTCorrectQInvCorrelFctn()
140 delete fMeasCorrelFctn;
141 delete fSmearedNumer;
142 delete fSmearedDenom;
146 /******************************************************************/
148 void AliHBTCorrectQInvCorrelFctn::BuildHistos(Int_t nbins, Float_t max, Float_t min)
150 AliHBTFunction1D::BuildHistos(nbins,max,min);
152 TString numstr = fName + " Smeared Numerator"; //title and name of the numerator histogram
153 TString denstr = fName + " Smeared Denominator";//title and name of the denominator histogram
155 fSmearedNumer = new TH1D(numstr.Data(),numstr.Data(),nbins,min,max);
156 fSmearedDenom = new TH1D(denstr.Data(),denstr.Data(),nbins,min,max);
157 fSmearedNumer->Sumw2();
158 fSmearedDenom->Sumw2();
160 if (fMeasCorrelFctn == 0x0)
162 numstr = fName + " Measured Numerator"; //title and name of the numerator histogram
163 denstr = fName + " Measured Denominator";//title and name of the denominator histogram
165 fMeasNumer = new TH1D(numstr.Data(),numstr.Data(),nbins,min,max);
166 fMeasDenom = new TH1D(denstr.Data(),denstr.Data(),nbins,min,max);
171 /******************************************************************/
173 void AliHBTCorrectQInvCorrelFctn::Init()
176 AliHBTOnePairFctn1D::Init();
178 fSmearedNumer->Reset();
179 fSmearedDenom->Reset();
180 if (fMeasNumer) fMeasNumer->Reset();
181 if (fMeasDenom) fMeasDenom->Reset();
185 /******************************************************************/
187 void AliHBTCorrectQInvCorrelFctn::ProcessSameEventParticles(AliHBTPair* pair)
189 //Processes particles that originates from the same event
190 if (fMeasNumer == 0x0) return;
191 pair = CheckPair(pair);
192 if( pair == 0x0) return;
193 fMeasNumer->Fill(pair->GetQInv());
195 /******************************************************************/
197 void AliHBTCorrectQInvCorrelFctn::ProcessDiffEventParticles(AliHBTPair* pair)
199 //Process different events
200 static AliHBTParticle part1, part2;
201 static AliHBTPair smearedpair(&part1,&part2);
203 pair = CheckPair(pair);
204 if( pair == 0x0) return;
205 Double_t cc = GetCoulombCorrection(pair);
206 Double_t qinv = pair->GetQInv();
208 //measured histogram -> if we are interested
209 //only if fMeasCorrelFctn is not specified by user
210 if (fMeasDenom) fMeasDenom->Fill(qinv,cc);
212 Smear(pair,smearedpair);
213 Double_t modelqinv = GetModelValue(qinv);
215 fNumerator->Fill(qinv,modelqinv*cc);
216 fDenominator->Fill(qinv,cc);
219 Double_t smearedqinv = smearedpair.GetQInv();
220 fSmearedNumer->Fill(smearedqinv,modelqinv);
221 Double_t smearedcc = GetCoulombCorrection(&smearedpair);
222 fSmearedDenom->Fill(smearedqinv,smearedcc);
225 /******************************************************************/
226 void AliHBTCorrectQInvCorrelFctn::Smear(AliHBTPair* pair,AliHBTPair& smeared)
229 Smear(pair->Particle1(),smeared.Particle1());
230 Smear(pair->Particle2(),smeared.Particle2());
233 /******************************************************************/
235 void AliHBTCorrectQInvCorrelFctn::Smear(AliHBTParticle* part, AliHBTParticle* smeared)
238 Double_t sin2theta = TMath::Sin(part->Theta());
239 sin2theta = sin2theta*sin2theta;
240 Double_t pt = part->Pt();
242 double dPtDivPt = gRandom->Gaus(0.0,fDPtOverPtRMS);
243 double dphi = gRandom->Gaus(0.0,fPhiA+fPhiB*TMath::Power(pt,fPhiAlpha));
244 double dtheta = gRandom->Gaus(0.0,fPhiA+fPhiB*TMath::Power(pt,fThetaAlpha));
246 Double_t smearedPx = part->Px()*(1.0+dPtDivPt) - part->Py()*dphi;
247 // fourmom.setX(px*(1.0+dPtDivPt) - py*dphi);
248 Double_t smearedPy = part->Py()*(1.0+dPtDivPt) - part->Px()*dphi;
249 // fourmom.setY(py*(1.0+dPtDivPt) + px*dphi);
250 Double_t smearedPz = part->Pz()*(1.0+dPtDivPt) - pt*dtheta/sin2theta;
251 // fourmom.setZ(pz*(1.0+dPtDivPt) - pT*dtheta/sin2theta);
253 Double_t mass2 = part->GetMass()*part->GetMass();
254 Double_t e = mass2 + smearedPx*smearedPx +
255 smearedPy*smearedPy +
258 smeared->SetMomentum(smearedPx,smearedPy,smearedPz,TMath::Sqrt(e));
260 /******************************************************************/
262 void AliHBTCorrectQInvCorrelFctn::SetInitialValues(Double_t lambda, Double_t r)
264 //Sets Initial Values
268 /******************************************************************/
269 void AliHBTCorrectQInvCorrelFctn::MakeMeasCF()
271 //makes measured correlation function
272 delete fMeasCorrelFctn;
273 fMeasCorrelFctn = 0x0;
275 if (fMeasNumer&&fMeasDenom)
277 Double_t measscale = Scale(fMeasNumer,fMeasDenom);
278 if (measscale == 0.0)
280 Error("GetResult","GetRatio for measured CF returned 0.0");
283 TString str = fName + "measured ratio";
284 fMeasCorrelFctn = (TH1D*)fMeasNumer->Clone(str.Data());
285 fMeasCorrelFctn->SetTitle(str.Data());
286 fMeasCorrelFctn->Divide(fMeasNumer,fMeasDenom,measscale);
290 TH1* AliHBTCorrectQInvCorrelFctn::GetResult()
292 //In case we don't have yet Measured Correlation Function
295 // N[meas] N[ideal]/D[ideal]
296 //C(Q) = ------- * -----------------
297 // D[meas] N[smear]/D[smear]
300 if (fMeasCorrelFctn == 0x0) MakeMeasCF();
302 if (fMeasCorrelFctn == 0x0)
305 "Measured Correlation Function is not defined and measured numeraor and/or denominator are/is null");
309 TH1D* ideal = (TH1D*)GetRatio(Scale());
312 Error("GetResult","Ratio of ideal histograms is null");
315 str = fName + " smeared ratio";
316 TH1D* smearedCF = (TH1D*)fSmearedNumer->Clone(str.Data());
317 smearedCF->SetTitle(str.Data());
318 Double_t smearedscale = Scale(fSmearedNumer,fSmearedDenom);
319 smearedCF->Divide(fSmearedNumer,fSmearedDenom,smearedscale);
321 str = fName + " product meas ideal CF";
322 TH1D* measideal = (TH1D*)ideal->Clone(str.Data());
323 measideal->Multiply(ideal,fMeasCorrelFctn);
325 str = fName + " Corrected Result";
326 TH1D* result = (TH1D*)fSmearedNumer->Clone(str.Data());
327 result->SetTitle(str.Data());
329 Double_t resultscale = Scale(measideal,smearedCF);
330 result->Divide(measideal,smearedCF,resultscale);
334 /******************************************************************/
336 void AliHBTCorrectQInvCorrelFctn::Fit()
338 //fits resuting histogram with function 1.0 + [0]*exp([1]*[1]*x*x/(-0.038936366329))
339 //where [0] is lambda
341 // 0.038936366329 - constant needed for units transformation eV(c=1,etc.) -> SI
343 Info("Fit","Before fFittedLambda = %f",fFittedLambda);
344 Info("Fit","Before fFittedR = %f",fFittedR);
345 TH1D* result = (TH1D*)GetResult();
348 Error("Fit","Can not get result");
351 TF1* fitfctn = new TF1("fitfctn","1.0 + [0]*exp([1]*[1]*x*x/(-0.038936366329))");
352 fitfctn->SetParameter(0,1.0);
353 fitfctn->SetParameter(1,6.0);
354 Float_t max = result->GetXaxis()->GetXmax();
355 Info("Fit","Max is %f",max);
356 result->Fit(fitfctn,"0","",0.008,max);
357 fFittedLambda = fitfctn->GetParameter(0);
358 fFittedR = fitfctn->GetParameter(1);
359 Info("Fit","After fFittedLambda = %f",fFittedLambda);
360 Info("Fit","After fFittedR = %f",fFittedR);
364 /******************************************************************/
366 Bool_t AliHBTCorrectQInvCorrelFctn::IsConverged()
368 //check if fitting was performed
371 Fit();//if not do fit first
374 Error("IsConverged","Fitting failed");
379 Double_t guessedR = TMath::Sqrt(fR2);
381 Info("IsConverged","Fitted lambda : %8f Fitted Radius : %8f",fFittedLambda,fFittedR);
382 Info("IsConverged","Guessed lambda : %8f Guessed Radius : %8f",fLambda,guessedR);
383 Info("IsConverged","Demanded lambda convergence: %8f Demanded Radius convergence: %8f",
384 fLambdaConvergenceTreshold,fRConvergenceTreshold);
386 if ( (TMath::Abs(fLambda-fFittedLambda)<fLambdaConvergenceTreshold) &&
387 (TMath::Abs(fFittedR-guessedR)<fRConvergenceTreshold) )
389 Info("IsConverged","Cnvergence reached");
394 Info("IsConverged","Cnvergence NOT reached");
398 /******************************************************************/
400 Double_t AliHBTCorrectQInvCorrelFctn::GetFittedRadius()
402 //Returns Fitted radius
403 if (fFittedR <= 0.0) Fit();
406 /******************************************************************/
408 Double_t AliHBTCorrectQInvCorrelFctn::GetFittedLambda()
410 //Returns Fitted Intercept paramter
411 if (fFittedR <= 0.0) Fit();
412 return fFittedLambda;
414 /******************************************************************/
416 void AliHBTCorrectQInvCorrelFctn::WriteAll()
418 //Writes function and all additional information
420 if (fMeasCorrelFctn) fMeasCorrelFctn->Write();
421 if (fMeasNumer ) fMeasNumer->Write();
422 if (fMeasDenom ) fMeasDenom->Write();
423 if (fSmearedNumer) fSmearedNumer->Write();
424 if (fSmearedDenom) fSmearedDenom->Write();
425 if (fSmearedNumer && fSmearedDenom)
427 TString str = fName + " smeared ratio";
428 TH1D* smearedCF = (TH1D*)fSmearedNumer->Clone(str.Data());
429 smearedCF->SetTitle(str.Data());
430 Double_t smearedscale = Scale(fSmearedNumer,fSmearedDenom);
431 smearedCF->Divide(fSmearedNumer,fSmearedDenom,smearedscale);