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://aliweb.cern.ch/people/skowron/analyzer //
16 ///////////////////////////////////////////////////////
19 // root [19] rms->Fit(f,"","",0.1,2)
20 // FCN=7.0017 FROM MIGRAD STATUS=CONVERGED 126 CALLS 127 TOTAL
21 // EDM=2.28804e-15 STRATEGY= 1 ERROR MATRIX ACCURATE
22 // EXT PARAMETER STEP FIRST
23 // NO. NAME VALUE ERROR SIZE DERIVATIVE
24 // 1 p0 5.78220e-03 3.14576e-05 4.97822e-09 -1.90059e-05
25 // 2 p1 3.98063e-05 1.61877e-06 1.04380e-10 1.91454e-04
26 // 3 p2 -2.78008e+00 2.13581e-02 1.66031e-06 3.16574e-06
27 // 4 p3 5.07594e-04 4.79619e-05 1.29793e-08 -2.29242e-05
31 // root [17] rms->Fit(f,"","",0.15,2.5)
32 // Warning in <TH1D::Fit>: Abnormal termination of minimization.
33 // FCN=33.4898 FROM MIGRAD STATUS=FAILED 91 CALLS 92 TOTAL
34 // EDM=1.19154e-15 STRATEGY= 1 ERR MATRIX APPROXIMATE
35 // EXT PARAMETER APPROXIMATE STEP FIRST
36 // NO. NAME VALUE ERROR SIZE DERIVATIVE
37 // 1 p0 5.87693e-04 5.04254e-06 2.49187e-09 5.84546e-04
38 // 2 p1 2.16488e-06 3.68880e-07 6.41507e-11 -7.36564e-02
39 // 3 p2 -3.10218e+00 1.01695e-01 2.00177e-05 7.54285e-07
40 // 4 p3 -1.79892e-05 5.44067e-06 2.15870e-09 4.11441e-04
45 // root [14] rms->Fit(f,"","",0.1,3)
46 // FCN=8.9981 FROM MIGRAD STATUS=CONVERGED 79 CALLS 80 TOTAL
47 // EDM=3.03049e-17 STRATEGY= 1 ERR MATRIX NOT POS-DEF
48 // EXT PARAMETER APPROXIMATE STEP FIRST
49 // NO. NAME VALUE ERROR SIZE DERIVATIVE
50 // 1 p0 -1.68773e-02 2.67644e-05 8.04770e-09 4.48079e-05
51 // 2 p1 1.78440e-02 2.65467e-05 8.50867e-09 6.43012e-05
52 // 3 p2 -5.26559e-02 5.06308e-04 2.28595e-07 -1.63963e-05
53 // 4 p3 2.00940e-04 1.14440e-05 3.98737e-09 1.78198e-05
60 #include <AliAODParticle.h>
63 ClassImp(AliHBTCorrectedCorrelFctn)
65 AliHBTCorrectedCorrelFctn::AliHBTCorrectedCorrelFctn():
66 fDPtOverPtA(5.78220e-03),
67 fDPtOverPtB(3.98063e-05),
68 fDPtOverPtAlpha(-2.78008),
69 fDPtOverPtC(5.07594e-04),
72 fThetaAlpha(-3.10218e+00),
73 fThetaC(-1.79892e-05),
76 fPhiAlpha(-5.26559e-02),
82 /******************************************************************/
83 void AliHBTCorrectedCorrelFctn::Smear(AliHBTPair* pair,AliHBTPair& smeared)
86 Smear(pair->Particle1(),smeared.Particle1());
87 Smear(pair->Particle2(),smeared.Particle2());
90 /******************************************************************/
92 void AliHBTCorrectedCorrelFctn::Smear(AliVAODParticle* part, AliVAODParticle* smeared)
95 Double_t sin2theta = TMath::Sin(part->Theta());
96 sin2theta = sin2theta*sin2theta;
97 Double_t pt = part->Pt();
99 Double_t sigmapt = fDPtOverPtA + fDPtOverPtB*TMath::Power(pt,fDPtOverPtAlpha) + fDPtOverPtC*pt;
100 Double_t dPtDivPt = gRandom->Gaus(0.0,sigmapt);
101 Double_t dphi = gRandom->Gaus(0.0,fPhiA+fPhiB*TMath::Power(pt,fPhiAlpha) + fPhiC*pt);
102 Double_t dtheta = gRandom->Gaus(0.0,fPhiA+fPhiB*TMath::Power(pt,fThetaAlpha) +fThetaC*pt);
104 Double_t smearedPx = part->Px()*(1.0+dPtDivPt) - part->Py()*dphi;
105 // fourmom.setX(px*(1.0+dPtDivPt) - py*dphi);
106 Double_t smearedPy = part->Py()*(1.0+dPtDivPt) - part->Px()*dphi;
107 // fourmom.setY(py*(1.0+dPtDivPt) + px*dphi);
108 Double_t smearedPz = part->Pz()*(1.0+dPtDivPt) - pt*dtheta/sin2theta;
109 // fourmom.setZ(pz*(1.0+dPtDivPt) - pT*dtheta/sin2theta);
111 Double_t mass2 = part->Mass()*part->Mass();
112 Double_t e = mass2 + smearedPx*smearedPx +
113 smearedPy*smearedPy +
116 smeared->SetMomentum(smearedPx,smearedPy,smearedPz,TMath::Sqrt(e));
119 /****************************************************************/
120 /****************************************************************/
121 /****************************************************************/
124 ClassImp(AliHBTCorrectQInvCorrelFctn)
126 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(const char* name,const char* title):
127 AliHBTOnePairFctn1D(name,title),
128 fMeasCorrelFctn(0x0),
137 fRConvergenceTreshold(0.3),
138 fLambdaConvergenceTreshold(0.05)
142 /******************************************************************/
144 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(TH1D* measqinv,const char* name,const char* title):
145 AliHBTOnePairFctn1D(name,title,
146 measqinv->GetNbinsX(),
147 measqinv->GetXaxis()->GetXmax(),
148 measqinv->GetXaxis()->GetXmin()),
149 fMeasCorrelFctn(measqinv),
158 fRConvergenceTreshold(0.3),
159 fLambdaConvergenceTreshold(0.05)
163 /******************************************************************/
165 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(const char* name, const char* title,
166 Int_t nbins, Float_t maxXval, Float_t minXval):
167 AliHBTOnePairFctn1D(name,title,nbins,maxXval,minXval),
168 AliHBTCorrectedCorrelFctn(),
169 fMeasCorrelFctn(0x0),
178 fRConvergenceTreshold(0.3),
179 fLambdaConvergenceTreshold(0.05)
183 /******************************************************************/
184 AliHBTCorrectQInvCorrelFctn::AliHBTCorrectQInvCorrelFctn(const AliHBTCorrectQInvCorrelFctn& in):
185 AliHBTOnePairFctn1D(in),
186 AliHBTCorrectedCorrelFctn(),
187 fMeasCorrelFctn(0x0),
196 fRConvergenceTreshold(0),
197 fLambdaConvergenceTreshold(0)
203 AliHBTCorrectQInvCorrelFctn::~AliHBTCorrectQInvCorrelFctn()
206 delete fMeasCorrelFctn;
207 delete fSmearedNumer;
208 delete fSmearedDenom;
212 /******************************************************************/
214 void AliHBTCorrectQInvCorrelFctn::BuildHistos(Int_t nbins, Float_t max, Float_t min)
216 AliHBTFunction1D::BuildHistos(nbins,max,min);
218 TString numstr = fName + " Smeared Numerator"; //title and name of the numerator histogram
219 TString denstr = fName + " Smeared Denominator";//title and name of the denominator histogram
221 fSmearedNumer = new TH1D(numstr.Data(),numstr.Data(),nbins,min,max);
222 fSmearedDenom = new TH1D(denstr.Data(),denstr.Data(),nbins,min,max);
223 fSmearedNumer->Sumw2();
224 fSmearedDenom->Sumw2();
226 if (fMeasCorrelFctn == 0x0)
228 numstr = fName + " Measured Numerator"; //title and name of the numerator histogram
229 denstr = fName + " Measured Denominator";//title and name of the denominator histogram
231 fMeasNumer = new TH1D(numstr.Data(),numstr.Data(),nbins,min,max);
232 fMeasDenom = new TH1D(denstr.Data(),denstr.Data(),nbins,min,max);
237 /******************************************************************/
239 void AliHBTCorrectQInvCorrelFctn::Init()
242 AliHBTOnePairFctn1D::Init();
244 fSmearedNumer->Reset();
245 fSmearedDenom->Reset();
246 if (fMeasNumer) fMeasNumer->Reset();
247 if (fMeasDenom) fMeasDenom->Reset();
251 /******************************************************************/
253 void AliHBTCorrectQInvCorrelFctn::ProcessSameEventParticles(AliHBTPair* pair)
255 //Processes particles that originates from the same event
256 if (fMeasNumer == 0x0) return;
257 pair = CheckPair(pair);
258 if( pair == 0x0) return;
259 fMeasNumer->Fill(pair->GetQInv());
261 /******************************************************************/
263 void AliHBTCorrectQInvCorrelFctn::ProcessDiffEventParticles(AliHBTPair* pair)
265 //Process different events
266 static AliAODParticle part1, part2;
267 static AliHBTPair smearedpair(&part1,&part2);
269 pair = CheckPair(pair);
270 if( pair == 0x0) return;
271 Double_t cc = GetCoulombCorrection(pair);
272 Double_t qinv = pair->GetQInv();
274 //measured histogram -> if we are interested
275 //only if fMeasCorrelFctn is not specified by user
276 if (fMeasDenom) fMeasDenom->Fill(qinv,cc);
278 Smear(pair,smearedpair);
279 Double_t modelqinv = GetModelValue(qinv);
281 fNumerator->Fill(qinv,modelqinv*cc);
282 fDenominator->Fill(qinv,cc);
285 Double_t smearedqinv = smearedpair.GetQInv();
286 fSmearedNumer->Fill(smearedqinv,modelqinv);
287 Double_t smearedcc = GetCoulombCorrection(&smearedpair);
288 fSmearedDenom->Fill(smearedqinv,smearedcc);
291 /******************************************************************/
293 void AliHBTCorrectQInvCorrelFctn::SetInitialValues(Double_t lambda, Double_t r)
295 //Sets Initial Values
299 /******************************************************************/
300 void AliHBTCorrectQInvCorrelFctn::MakeMeasCF()
302 //makes measured correlation function
303 delete fMeasCorrelFctn;
304 fMeasCorrelFctn = 0x0;
306 if (fMeasNumer&&fMeasDenom)
308 Double_t measscale = Scale(fMeasNumer,fMeasDenom);
309 if (measscale == 0.0)
311 Error("GetResult","GetRatio for measured CF returned 0.0");
314 TString str = fName + "measured ratio";
315 fMeasCorrelFctn = (TH1D*)fMeasNumer->Clone(str.Data());
316 fMeasCorrelFctn->SetTitle(str.Data());
317 fMeasCorrelFctn->Divide(fMeasNumer,fMeasDenom,measscale);
321 TH1* AliHBTCorrectQInvCorrelFctn::GetResult()
323 //In case we don't have yet Measured Correlation Function
326 // N[meas] N[ideal]/D[ideal]
327 //C(Q) = ------- * -----------------
328 // D[meas] N[smear]/D[smear]
331 if (fMeasCorrelFctn == 0x0) MakeMeasCF();
333 if (fMeasCorrelFctn == 0x0)
336 "Measured Correlation Function is not defined and measured numeraor and/or denominator are/is null");
340 TH1D* ideal = (TH1D*)GetRatio(Scale());
343 Error("GetResult","Ratio of ideal histograms is null");
346 str = fName + " smeared ratio";
347 TH1D* smearedCF = (TH1D*)fSmearedNumer->Clone(str.Data());
348 smearedCF->SetTitle(str.Data());
349 Double_t smearedscale = Scale(fSmearedNumer,fSmearedDenom);
350 smearedCF->Divide(fSmearedNumer,fSmearedDenom,smearedscale);
352 str = fName + " product meas ideal CF";
353 TH1D* measideal = (TH1D*)ideal->Clone(str.Data());
354 measideal->Multiply(ideal,fMeasCorrelFctn);
356 str = fName + " Corrected Result";
357 TH1D* result = (TH1D*)fSmearedNumer->Clone(str.Data());
358 result->SetTitle(str.Data());
360 Double_t resultscale = Scale(measideal,smearedCF);
361 result->Divide(measideal,smearedCF,resultscale);
365 /******************************************************************/
367 void AliHBTCorrectQInvCorrelFctn::Fit()
369 //fits resuting histogram with function 1.0 + [0]*exp([1]*[1]*x*x/(-0.038936366329))
370 //where [0] is lambda
372 // 0.038936366329 - constant needed for units transformation eV(c=1,etc.) -> SI
374 Info("Fit","Before fFittedLambda = %f",fFittedLambda);
375 Info("Fit","Before fFittedR = %f",fFittedR);
376 TH1D* result = (TH1D*)GetResult();
379 Error("Fit","Can not get result");
382 TF1* fitfctn = new TF1("fitfctn","1.0 + [0]*exp([1]*[1]*x*x/(-0.038936366329))");
383 fitfctn->SetParameter(0,1.0);
384 fitfctn->SetParameter(1,6.0);
385 Float_t max = result->GetXaxis()->GetXmax();
386 Info("Fit","Max is %f",max);
387 result->Fit(fitfctn,"0","",0.008,max);
388 fFittedLambda = fitfctn->GetParameter(0);
389 fFittedR = fitfctn->GetParameter(1);
390 Info("Fit","After fFittedLambda = %f",fFittedLambda);
391 Info("Fit","After fFittedR = %f",fFittedR);
395 /******************************************************************/
397 Bool_t AliHBTCorrectQInvCorrelFctn::IsConverged()
399 //check if fitting was performed
402 Fit();//if not do fit first
405 Error("IsConverged","Fitting failed");
410 Double_t guessedR = TMath::Sqrt(fR2);
412 Info("IsConverged","Fitted lambda : %8f Fitted Radius : %8f",fFittedLambda,fFittedR);
413 Info("IsConverged","Guessed lambda : %8f Guessed Radius : %8f",fLambda,guessedR);
414 Info("IsConverged","Demanded lambda convergence: %8f Demanded Radius convergence: %8f",
415 fLambdaConvergenceTreshold,fRConvergenceTreshold);
417 if ( (TMath::Abs(fLambda-fFittedLambda)<fLambdaConvergenceTreshold) &&
418 (TMath::Abs(fFittedR-guessedR)<fRConvergenceTreshold) )
420 Info("IsConverged","Cnvergence reached");
425 Info("IsConverged","Cnvergence NOT reached");
429 /******************************************************************/
431 Double_t AliHBTCorrectQInvCorrelFctn::GetFittedRadius()
433 //Returns Fitted radius
434 if (fFittedR <= 0.0) Fit();
437 /******************************************************************/
439 Double_t AliHBTCorrectQInvCorrelFctn::GetFittedLambda()
441 //Returns Fitted Intercept paramter
442 if (fFittedR <= 0.0) Fit();
443 return fFittedLambda;
445 /******************************************************************/
447 void AliHBTCorrectQInvCorrelFctn::WriteAll()
449 //Writes function and all additional information
451 if (fMeasCorrelFctn) fMeasCorrelFctn->Write();
452 if (fMeasNumer ) fMeasNumer->Write();
453 if (fMeasDenom ) fMeasDenom->Write();
454 if (fSmearedNumer) fSmearedNumer->Write();
455 if (fSmearedDenom) fSmearedDenom->Write();
456 if (fSmearedNumer && fSmearedDenom)
458 TString str = fName + " smeared ratio";
459 TH1D* smearedCF = (TH1D*)fSmearedNumer->Clone(str.Data());
460 smearedCF->SetTitle(str.Data());
461 Double_t smearedscale = Scale(fSmearedNumer,fSmearedDenom);
462 smearedCF->Divide(fSmearedNumer,fSmearedDenom,smearedscale);