00001
00002
00003
00004
00005
00006
00008
00009
00010
00012
00013 #include "PIDFitter.h"
00014 #include "Stsstream.h"
00015 #include "Stiostream.h"
00016 #include <math.h>
00017
00018 #include "TH2.h"
00019 #include "TLine.h"
00020 #include "TF1.h"
00021 #include <float.h>
00022 #include "TStyle.h"
00023 #include "TCanvas.h"
00024 #include "TMath.h"
00025 #include "TFile.h"
00026 #include "TGraphErrors.h"
00027
00028
00029 #include "BetheBlochFunction.hh"
00030
00031
00032
00033 #include <Stiostream.h>
00034
00035 ClassImp(PIDFitter);
00036 Double_t sigmaNSampleFitFcn(Double_t* x, Double_t *par);
00037
00038
00039 PIDFitter::PIDFitter(){
00040 Init();
00041 }
00042
00043 void PIDFitter::Process( Char_t* sigmaOfSigmTrialInputName,
00044 Char_t* sigmaOfSigmTrialOutputName,
00045 Char_t* phaseSpaceCalibInputName,
00046 Char_t* phaseSpaceCalibOutputName,
00047 Char_t* gausFitInputName,
00048 Char_t* gausFitOutputName,
00049 Char_t* ampFitOutputName ){
00050
00051 GetSigmaOfSingleTrail(sigmaOfSigmTrialInputName,sigmaOfSigmTrialOutputName);
00052 DoPhaseSpaceCalibration(phaseSpaceCalibInputName,phaseSpaceCalibOutputName);
00053 FitMultiGaus(gausFitInputName,gausFitOutputName);
00054 ExtrapAmp(gausFitOutputName,ampFitOutputName);
00055
00056 }
00057
00058 void PIDFitter::GetSigmaOfSingleTrail(Char_t* fileName4SigmaOfSingleTrail,Char_t* sigmaFileName){
00059
00060 cout<<" getting sigma of single trail..."<<endl;
00061 TFile* fitResoFile;
00062
00063 if (mWriteSigmaNSampleGraph) {
00064 fitResoFile = new TFile("sigmaNSample.root","UPDATE");
00065 }
00066
00067
00068 ofstream SigmaFileOut;
00069 SigmaFileOut.open(sigmaFileName);
00070
00071 float pionPosition4Calib=0.4;
00072
00073 int i = int((pionPosition4Calib-mPStart)*mNPBins/(mPEnd-mPStart) );
00074
00075 TH1F* theHist=0;
00076
00077 TFile histo4CalibFile(fileName4SigmaOfSingleTrail,"READ");
00078
00079 TH1F* theDummyHisto = (TH1F *)histo4CalibFile.Get("h2000");
00080
00081
00082 for (int j=0; j<mNEtaBins; j++) {
00083
00084
00085 TGraphErrors* sigmaNSampleGraph = new TGraphErrors();
00086
00087 TString grName;
00088 grName.Append(fileName4SigmaOfSingleTrail);
00089 grName.Append("SigmaNSample");
00090 grName.Append((i<10) ? "0" : "");
00091 grName +=i;
00092 grName +=j;
00093 grName.ReplaceAll(".root","");
00094
00095 sigmaNSampleGraph->SetTitle(grName.Data());
00096 sigmaNSampleGraph->SetName(grName.Data());
00097
00098
00099 for (int k=0; k<mNNHitsBins;k++){
00100
00101 TH1F* tempHisto = new TH1F(*theDummyHisto);
00102 tempHisto->Reset();
00103
00104 char *theName = new char[80];
00105 if (i<10)
00106 sprintf(theName,"h0%d%d%d",i,j,k);
00107 else sprintf(theName,"h%d%d%d",i,j,k);
00108
00109 theHist= (TH1F *)histo4CalibFile.Get(theName);
00110 delete theName;
00111
00112
00113 for (int mm=0; mm<tempHisto->GetNbinsX(); mm++)
00114 tempHisto->SetBinContent(mm,(theHist->GetBinContent(mm)));
00115
00116
00117 Float_t theError=0;
00118
00119 Float_t theFitGausHalfRange = 0.03e-05*0.95;
00120
00121 Float_t mean=FitResoGaus(tempHisto,theFitGausHalfRange,theError,
00122 0.005e-4,0.04e-4,1,j,k,pionPosition4Calib);
00123 Float_t sigma=FitResoGaus(tempHisto,theFitGausHalfRange,theError,
00124 0.005e-4,0.04e-4,2,j,k,pionPosition4Calib);
00125
00126 sigmaNSampleGraph->SetPoint(sigmaNSampleGraph->GetN(),(k*mNNHitsBins+(5./2.)),sigma/mean);
00127 sigmaNSampleGraph->SetPointError((sigmaNSampleGraph->GetN()-1),0,theError);
00128
00129 if (tempHisto) delete tempHisto;
00130
00131 }
00132
00133
00134 TF1* f1 = new TF1("f1",sigmaNSampleFitFcn,12.,40.,1);
00135 sigmaNSampleGraph->Fit("f1","R");
00136
00137 cout<<"sigNSamplePion1Graph fit parameter: "<<f1->GetParameter(0);
00138 double theSigmaOfSingleTrail= f1->GetParameter(0);
00139 double theErrorOfSigmaOfSingleTrail = f1->GetParError(0);
00140 if(theErrorOfSigmaOfSingleTrail) {}
00141 if (mWriteSigmaNSampleGraph) {
00142 fitResoFile->cd();
00143 sigmaNSampleGraph->SetMarkerColor(2);
00144 sigmaNSampleGraph->SetMarkerStyle(20);
00145 sigmaNSampleGraph->Write(grName.Data(),TObject::kOverwrite | TObject::kSingleKey);
00146 fitResoFile->Write();
00147 }
00148
00149
00150 if (f1) delete f1;
00151 if (sigmaNSampleGraph) delete sigmaNSampleGraph;
00152 mSigmaOfSingleTrail[j]=theSigmaOfSingleTrail;
00153
00154
00155
00156 SigmaFileOut<<j<<endl;
00157 SigmaFileOut<<theSigmaOfSingleTrail<<endl;
00158
00159 }
00160
00161 if (mWriteSigmaNSampleGraph) fitResoFile->Close();
00162 SigmaFileOut.close();
00163
00164
00165 cout<<" end of getting sigma of single trail..."<<endl;
00166
00167 }
00168
00169
00170 float PIDFitter::FitResoGaus(TH1F* resoHist,float fitRange,float& er,float theStart, float theEnd, int ParIndex, int j, int k, float thePPosition){
00171
00172
00173 TFile* fitResoFile;
00174
00175 if (mWriteGaus4SigmaNSampleHist) {
00176 fitResoFile = new TFile("Gaus4SigmaNSample.root","UPDATE");
00177 }
00178
00179 Double_t tempSigmaOfSingleTrial =0.42;
00180
00181 RefreshPresettings(resoHist, tempSigmaOfSingleTrial, k, thePPosition);
00182
00183
00184
00185 Double_t ECenterVary=0.3;
00186 Double_t EWidthVary=0.4;
00187
00188 Double_t PiCenterVary=0.3;
00189 Double_t PiHeightVary=0.2;
00190 Double_t PiWidthVary=0.4;
00191
00192 Double_t KCenterVary=0.3;
00193 Double_t KWidthVary=0.4;
00194
00195 TF1* sumGs
00196 = new TF1("sumGs","gaus(0)+gaus(3)+gaus(6)", 0., 0.08e-4);
00197
00198 Double_t pars_b[9] = {mPiGausHeight, mPiGausCenter, mPiSigma,
00199 mEGausHeight, mEGausCenter, mESigma,
00200 mKGausHeight, mKGausCenter, mKSigma };
00201
00202 sumGs->SetParameters(&pars_b[0]);
00203
00204 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00205 mPiGausHeight*(1.+PiHeightVary) );
00206 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00207 mPiGausCenter*(1.+PiCenterVary) );
00208 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00209 mPiSigma*(1.+PiWidthVary) );
00210
00211 sumGs->SetParLimits( 3, 0.,mEGausHeight);
00212 sumGs->SetParLimits( 4, mEGausCenter*(1.-ECenterVary),
00213 mEGausCenter*(1.+ECenterVary) );
00214 sumGs->SetParLimits( 5, mESigma*(1.-EWidthVary),
00215 mESigma*(1.+EWidthVary) );
00216
00217 sumGs->SetParLimits( 6, 0.,mKGausHeight);
00218 sumGs->SetParLimits( 7, mKGausCenter*(1.-KCenterVary),
00219 mKGausCenter*(1.+KCenterVary) );
00220 sumGs->SetParLimits( 8, mKSigma*(1.-KWidthVary),
00221 mKSigma*(1.+KWidthVary) );
00222
00223
00224 resoHist->Fit("sumGs","R");
00225
00226 if (mWriteGaus4SigmaNSampleHist){
00227 fitResoFile->cd();
00228 resoHist->Write();
00229 }
00230
00231 if (mWriteGaus4SigmaNSampleHist) fitResoFile->Close();
00232 float thePar=sumGs->GetParameter(ParIndex);
00233 if (mWriteGaus4SigmaNSampleHist) { delete fitResoFile; fitResoFile=0;}
00234 if (sumGs) { delete sumGs; }
00235
00236 return thePar;
00237 }
00238
00239
00240 void PIDFitter::RefreshPresettings(TH1F* resoHist, double tempSigmaOfSingleTrial, int k, float thePPosition){
00241
00242 mEGausHeight =0; mESigma=0.;
00243 mPiGausHeight =0; mPiSigma=0.;
00244 mKGausHeight =0; mKSigma=0.;
00245 mPGausHeight =0; mPSigma=0.;
00246
00247 mEGausCenter = electronBandCenter ->Eval(thePPosition,0,0);
00248 mPiGausCenter = pionBandCenter ->Eval(thePPosition,0,0);
00249 mKGausCenter = kaonBandCenter ->Eval(thePPosition,0,0);
00250 mPGausCenter = antiprotonBandCenter->Eval(thePPosition,0,0);
00251
00252 PresetHeightAndSigma(mEGausCenter, mEGausHeight, mESigma,
00253 resoHist, tempSigmaOfSingleTrial, k);
00254 PresetHeightAndSigma(mPiGausCenter, mPiGausHeight, mPiSigma,
00255 resoHist, tempSigmaOfSingleTrial, k);
00256 PresetHeightAndSigma(mKGausCenter, mKGausHeight, mKSigma,
00257 resoHist, tempSigmaOfSingleTrial, k);
00258 PresetHeightAndSigma(mPGausCenter, mPGausHeight, mPSigma,
00259 resoHist, tempSigmaOfSingleTrial, k);
00260
00261 }
00262
00263
00264 void PIDFitter::PresetHeightAndSigma(double center, double& height, double& sigma, TH1F* resoHist, double tempSigmaOfSingleTrial, int k){
00265
00266 int nbins = resoHist->GetNbinsX();
00267 int centBin =
00268 int((center-mDedxStart)*float(nbins)/((mDedxEnd-mDedxStart)));
00269
00270 height = (centBin<nbins) ? resoHist->GetBinContent(centBin) : 0.;
00271 sigma = tempSigmaOfSingleTrial*center/TMath::Sqrt((k+0.5)*((double(mNNHitsEnd)-double(mNNHitsStart))/double(mNNHitsBins)));
00272
00273 }
00274
00275
00276
00277 void PIDFitter::DoPhaseSpaceCalibration(Char_t* fileName4Calibration,Char_t* phaseSpaceCalibFileName){
00278
00279 cout<<" doing phase space calibration.......... "<<endl;
00280
00281 double protonRef[mNEtaBins][mNNHitsBins];
00282 double pionRef[mNEtaBins][mNNHitsBins];
00283
00284 double fitEnd = mDedxEnd;
00285 double fitStart = mDedxStart;
00286
00287 TFile histo4CalibFile(fileName4Calibration,"READ");
00288
00289 TH1F* theHist=0;
00290 TF1* sumGs=0;
00291
00292 int pionPosition4Calib =int((0.5-mPStart)*mNPBins/(mPEnd-mPStart) );
00293 int protonPosition4Calib =int((0.7-mPStart)*mNPBins/(mPEnd-mPStart) );
00294
00295
00296
00297 for (int j=0; j<mNEtaBins; j++)
00298 for (int k=2; k<mNNHitsBins;k++){
00299
00300 int i = protonPosition4Calib;
00301
00302
00303
00304 int kname = k;
00305 int jname = j;
00306
00307 char *theName = new char[80];
00308 if (i<10)
00309 sprintf(theName,"h0%d%d%d",i,jname,kname);
00310 else sprintf(theName,"h%d%d%d",i,jname,kname);
00311
00312 theHist= (TH1F *)histo4CalibFile.Get(theName);
00313 delete theName;
00314
00315 float pPosition =
00316 float(i)*((mPEnd-mPStart)/float(mNPBins)) +
00317 (((mPEnd-mPStart)/mNPBins)/2.);
00318
00319
00320 RefreshPresettings(theHist, mSigmaOfSingleTrail[j] , k, pPosition);
00321
00322
00323 Double_t KCenterVary=0.15;
00324 Double_t KWidthVary=0.03;
00325
00326 Double_t PiCenterVary=0.1;
00327 Double_t PiHeightVary=0.1;
00328 Double_t PiWidthVary=0.05;
00329
00330 Double_t PCenterVary=0.1;
00331 Double_t PWidthVary=0.03;
00332
00333
00334 sumGs
00335 = new TF1("sumGs","gaus(0)+gaus(3)+gaus(6)", fitStart, fitEnd);
00336
00337 Double_t pars_c[9] = { mPiGausHeight, mPiGausCenter, mPiSigma,
00338 mKGausHeight, mKGausCenter, mKSigma,
00339 mPGausHeight, mPGausCenter, mPSigma };
00340
00341 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00342 mPiGausHeight*(1.+PiHeightVary) );
00343 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00344 mPiGausCenter*(1.+PiCenterVary) );
00345 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00346 mPiSigma*(1.+PiWidthVary) );
00347
00348
00349 sumGs->SetParLimits( 3, 0.,mKGausHeight);
00350 sumGs->SetParLimits( 4, mKGausCenter*(1.-KCenterVary),
00351 mKGausCenter*(1.+KCenterVary) );
00352 sumGs->SetParLimits( 5, mKSigma*(1.-KWidthVary),
00353 mKSigma*(1.+KWidthVary) );
00354
00355
00356 sumGs->SetParLimits( 6, 0.,mPGausHeight);
00357 sumGs->SetParLimits( 7, mPGausCenter*(1.-PCenterVary),
00358 mPGausCenter*(1.+PCenterVary) );
00359 sumGs->SetParLimits( 8, mPSigma*(1.-PWidthVary),
00360 mPSigma*(1.+PWidthVary) );
00361
00362 sumGs->SetParameters(&pars_c[0]);
00363
00364 theHist->Fit("sumGs","NR");
00365
00366 protonRef[j][k]=sumGs->GetParameter(7);
00367
00368 if (sumGs) {delete sumGs;}
00369 }
00370
00371
00372
00373 for (int j=0; j<mNEtaBins; j++)
00374 for (int k=2; k<mNNHitsBins;k++){
00375
00376 int i = pionPosition4Calib;
00377
00378
00379
00380 int kname = k;
00381 int jname = j;
00382
00383 char *theName = new char[80];
00384 if (i<10)
00385 sprintf(theName,"h0%d%d%d",i,jname,kname);
00386 else sprintf(theName,"h%d%d%d",i,jname,kname);
00387
00388 theHist= (TH1F *)histo4CalibFile.Get(theName);
00389
00390 float pPosition =
00391 float(i)*((mPEnd-mPStart)/float(mNPBins)) +
00392 (((mPEnd-mPStart)/mNPBins)/2.);
00393
00394
00395 RefreshPresettings(theHist, mSigmaOfSingleTrail[j] , k, pPosition);
00396
00397
00398 Double_t KCenterVary=0.15;
00399 Double_t KWidthVary=0.03;
00400
00401 Double_t PiCenterVary=0.1;
00402 Double_t PiHeightVary=0.1;
00403 Double_t PiWidthVary=0.05;
00404
00405 Double_t PCenterVary=0.1;
00406 Double_t PWidthVary=0.03;
00407
00408 sumGs
00409 = new TF1("sumGs","gaus(0)+gaus(3)+gaus(6)", fitStart, fitEnd);
00410
00411 Double_t pars_c[9] = { mPiGausHeight, mPiGausCenter, mPiSigma,
00412 mKGausHeight, mKGausCenter, mKSigma,
00413 mPGausHeight, mPGausCenter, mPSigma };
00414
00415 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00416 mPiGausHeight*(1.+PiHeightVary) );
00417 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00418 mPiGausCenter*(1.+PiCenterVary) );
00419 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00420 mPiSigma*(1.+PiWidthVary) );
00421
00422
00423 sumGs->SetParLimits( 3, 0.,mKGausHeight );
00424 sumGs->SetParLimits( 4, mKGausCenter*(1.-KCenterVary),
00425 mKGausCenter*(1.+KCenterVary) );
00426 sumGs->SetParLimits( 5, mKSigma*(1.-KWidthVary),
00427 mKSigma*(1.+KWidthVary) );
00428
00429
00430 sumGs->SetParLimits( 6, 0.,mPGausHeight );
00431 sumGs->SetParLimits( 7, mPGausCenter*(1.-PCenterVary),
00432 mPGausCenter*(1.+PCenterVary) );
00433 sumGs->SetParLimits( 8, mPSigma*(1.-PWidthVary),
00434 mPSigma*(1.+PWidthVary) );
00435
00436 sumGs->SetParameters(&pars_c[0]);
00437
00438 theHist->Fit("sumGs","NR");
00439
00440 pionRef[j][k]=sumGs->GetParameter(1);
00441
00442
00443 if (sumGs) {delete sumGs; }
00444 }
00445
00446 for (int j=0; j<mNEtaBins; j++)
00447 for (int k=2; k<mNNHitsBins;k++){
00448 double theCalib=4.68971e-07;
00449 double theOffSet=3.01022e-07;
00450 double deltaReference=protonRef[j][k]-pionRef[j][k];
00451 double mimimumIonizingPionPosition=
00452 float(pionPosition4Calib)*((mPEnd-mPStart)/float(mNPBins)) +
00453 (((mPEnd-mPStart)/mNPBins)/2.);
00454 double protonTestPosition=
00455 float(protonPosition4Calib)*((mPEnd-mPStart)/float(mNPBins)) +
00456 (((mPEnd-mPStart)/mNPBins)/2.);
00457
00458 BBScalePar[j][k]=look4MinDeltaDiff(theCalib*0.7, theCalib*1.3, 100,mimimumIonizingPionPosition ,protonTestPosition , deltaReference);
00459 BBOffSetPar[j][k]= theOffSet+minimumIonizingdEdx(BBScalePar[j][k],mimimumIonizingPionPosition )-pionRef[j][k];
00460
00461 cout<<" j "<<j<<" k "<<k<<" BBScalePar["<<j<<"]["<<k<<"]="<<BBScalePar[j][k]<<"; BBOffSetPar["<<j<<"]["<<k<<"]="<<BBOffSetPar[j][k]<<"; "<<endl;
00462
00463 }
00464
00465
00466 for (int j=0; j<mNEtaBins; j++)
00467 for (int k=0; k<2; k++) {
00468 BBScalePar[j][k]=BBScalePar[j][2];
00469 BBOffSetPar[j][k]=BBOffSetPar[j][2];
00470 }
00471
00472
00473 ofstream PhaseSpaceFileOut;
00474 PhaseSpaceFileOut.open(phaseSpaceCalibFileName);
00475
00476 for (int j=0; j<mNEtaBins; j++)
00477 for (int k=0; k<mNNHitsBins; k++) {
00478 PhaseSpaceFileOut<<j<<endl<<k<<endl;
00479 PhaseSpaceFileOut<<electronBandCenter->GetParameter(0)<<endl;
00480 PhaseSpaceFileOut<<electronBandCenter->GetParameter(1)<<endl;
00481 PhaseSpaceFileOut<<BBOffSetPar[j][k]<<endl;
00482 PhaseSpaceFileOut<<BBScalePar[j][k]<<endl;
00483 PhaseSpaceFileOut<<electronBandCenter->GetParameter(6)<<endl;
00484
00485 }
00486
00487 PhaseSpaceFileOut.close();
00488
00489 cout<<" phase space calibration finished .......... "<<endl;
00490
00491 }
00492
00493
00494
00495 void PIDFitter::Init(){
00496
00497 mWriteGaus4SigmaNSampleHist=kFALSE;
00498
00499
00500 if (mWriteGaus4SigmaNSampleHist){
00501 TFile* fitResoFile = new TFile("Gaus4SigmaNSample.root","RECREATE");
00502 fitResoFile->Write();
00503 fitResoFile->Close();
00504 delete fitResoFile;
00505 }
00506
00507 mWriteSigmaNSampleGraph=kFALSE;
00508
00509 if (mWriteSigmaNSampleGraph) {
00510 TFile* fitResoFile = new TFile("sigmaNSample.root","RECREATE");
00511 delete fitResoFile;
00512 }
00513
00514
00515
00516 mSigmaOfSingleTrail = new double[mNEtaBins];
00517
00518 BBOffSetPar = new double*[mNEtaBins];
00519 BBScalePar = new double*[mNEtaBins];
00520
00521 for (int ii=0; ii<mNEtaBins; ii++) {
00522 BBOffSetPar[ii] = new double[mNNHitsBins];
00523 BBScalePar[ii] = new double[mNNHitsBins];
00524 }
00525
00526
00527
00528
00529 electronBandCenter
00530 =new TF1("electronBandCenter",BetheBlochFunction, mPStart,mPEnd, NParameters);
00531 pionBandCenter
00532 =new TF1("pionBandCenter",BetheBlochFunction, mPStart,mPEnd, NParameters);
00533 kaonBandCenter
00534 =new TF1("kaonBandCenter",BetheBlochFunction, mPStart,mPEnd, NParameters);
00535 antiprotonBandCenter
00536 =new TF1("antiprotonBandCenter",BetheBlochFunction, mPStart,mPEnd, NParameters);
00537
00538 pionKaonBandCenter
00539 =new TF1("pionKaonBandCenter",BetheBlochFunction, mPStart,mPEnd, NParameters);
00540 kaonAntiprotonBandCenter
00541 =new TF1("kaonAntiprotonBandCenter",BetheBlochFunction, mPStart,mPEnd, NParameters);
00542
00543
00544
00545
00546
00547 Double_t electronPars[7]
00548 ={ 1.09344, 0.0199, 3.01022e-07, 1, 0.511e-3, 4.68971e-07, 0.0005 };
00549 Double_t pionPars[7]
00550 ={ 1.09344, 0.0199, 3.01022e-07, 1, 0.13957, 4.68971e-07, 0.0005 };
00551 Double_t kaonPars[7]
00552 ={ 1.09344, 0.0199, 3.01022e-07, 1, 0.49368, 4.68971e-07, 0.0005 };
00553 Double_t antiprotonPars[7]
00554 ={ 1.09344, 0.0199, 3.01022e-07, 1, 0.93827, 4.68971e-07, 0.0005 };
00555
00556 Double_t pionKaonPars[7]
00557 ={ 1.09344, 0.0199, 3.01022e-07, 1, 0.387447*1.1, 4.68971e-07, 0.0005 };
00558
00559 Double_t kaonAntiprotonPars[7]
00560 ={ 1.09344, 0.0199, 3.01022e-07, 1, 0.804893*1.05, 4.68971e-07, 0.0005 };
00561
00562 electronBandCenter->SetParameters(&electronPars[0]);
00563 pionBandCenter->SetParameters(&pionPars[0]);
00564 kaonBandCenter->SetParameters(&kaonPars[0]);
00565 antiprotonBandCenter->SetParameters(&antiprotonPars[0]);
00566 pionKaonBandCenter->SetParameters(&pionKaonPars[0]);
00567 kaonAntiprotonBandCenter->SetParameters(&kaonAntiprotonPars[0]);
00568
00569
00570
00571 }
00572
00573
00574
00575 double PIDFitter::delta(double calib, double pionPosition, double protonPosition){
00576
00577 pionBandCenter->SetParameter(5,calib);
00578 antiprotonBandCenter->SetParameter(5,calib);
00579
00580 return (antiprotonBandCenter->Eval(protonPosition,0,0)-
00581 pionBandCenter->Eval(pionPosition,0,0));
00582 }
00583
00584
00585 double PIDFitter::look4MinDeltaDiff(double calibStart, double calibEnd, int calibSteps, double pionPosition, double protonPosition, double DeltaRef){
00586
00587 double calibSeg=(calibEnd-calibStart)/double(calibSteps);
00588 double thisCalib=calibStart;
00589 double minDeltaDiffCalib=5000;
00590 double minDeltaDiff=5000;
00591
00592 do {
00593
00594 double myDelta=delta(thisCalib,pionPosition,protonPosition);
00595 double diff=TMath::Abs(myDelta-DeltaRef);
00596 if (diff<minDeltaDiff) {
00597 minDeltaDiff=diff;
00598 minDeltaDiffCalib=thisCalib;
00599 }
00600
00601 thisCalib=thisCalib+calibSeg;
00602 }while(thisCalib<calibEnd);
00603
00604 return minDeltaDiffCalib;
00605 }
00606
00607
00608 double PIDFitter::minimumIonizingdEdx(double calib, double pionPosition){
00609 pionBandCenter->SetParameter(5,calib);
00610
00611 return pionBandCenter->Eval(pionPosition,0,0);
00612 }
00613
00614
00615
00616 void PIDFitter::FitMultiGaus(Char_t* fileNameOfInput, Char_t* fileNameOfOutput){
00617
00618
00619
00620 TFile histoFile(fileNameOfInput,"READ");
00621
00622 TFile fittedHistoFile(fileNameOfOutput,"RECREATE");
00623
00624
00625 TH1F* theHist =0;
00626 TF1* sumGs =0;
00627
00628 for (int i=0; i<mNPBins; i++)
00629 for (int j=0; j<mNEtaBins; j++)
00630 for (int k=0; k<mNNHitsBins;k++){
00631
00632 cout<<" p bin # "<<i<<", eta bin # "<<j<<", ndedx bin # "<<k<<endl;
00633
00634 char *theName = new char[80];
00635 if (i<10)
00636 sprintf(theName,"h0%d%d%d",i,j,k);
00637 else sprintf(theName,"h%d%d%d",i,j,k);
00638
00639 theHist= (TH1F *)histoFile.Get(theName);
00640
00641 float pPosition =
00642 float(i)*((mPEnd-mPStart)/float(mNPBins)) +
00643 (((mPEnd-mPStart)/mNPBins)/2.);
00644
00645
00646
00647 electronBandCenter->SetParameter(5,BBScalePar[j][k]);
00648 pionBandCenter->SetParameter(5,BBScalePar[j][k]);
00649 kaonBandCenter->SetParameter(5,BBScalePar[j][k]);
00650 antiprotonBandCenter->SetParameter(5,BBScalePar[j][k]);
00651 pionKaonBandCenter->SetParameter(5,BBScalePar[j][k]);
00652 kaonAntiprotonBandCenter->SetParameter(5,BBScalePar[j][k]);
00653
00654 electronBandCenter->SetParameter(2,BBOffSetPar[j][k]);
00655 pionBandCenter->SetParameter(2,BBOffSetPar[j][k]);
00656 kaonBandCenter->SetParameter(2,BBOffSetPar[j][k]);
00657 antiprotonBandCenter->SetParameter(2,BBOffSetPar[j][k]);
00658 pionKaonBandCenter->SetParameter(2,BBOffSetPar[j][k]);
00659 kaonAntiprotonBandCenter->SetParameter(2,BBOffSetPar[j][k]);
00660
00661
00662 RefreshPresettings(theHist, mSigmaOfSingleTrail[j] , k, pPosition);
00663
00664
00665 Double_t KCenterVary=0.1;
00666 Double_t KWidthVary=0.1;
00667
00668 Double_t PiCenterVary=0.1;
00669 Double_t PiHeightVary=0.1;
00670 Double_t PiWidthVary=0.1;
00671
00672 Double_t PCenterVary=0.1;
00673 Double_t PWidthVary=0.1;
00674
00675 Double_t ECenterVary=0.;
00676 Double_t EWidthVary=0.1;
00677
00678
00679
00680 if (pPosition<0.13) {
00681 PiWidthVary=0.5;
00682 PiCenterVary=0.2;
00683 EWidthVary=0.5;
00684 ECenterVary=0.2;
00685 }
00686
00687
00689
00690
00691
00692
00694
00695 Double_t fitStart=0;
00696 Double_t fitEnd=0;
00697
00698 if (pPosition<junction1){
00699
00700 Double_t kaonBandLowEdge=pionKaonBandCenter->Eval(pPosition,0.,0.);
00701 fitEnd = TMath::Min(kaonBandLowEdge,mDedxEnd);
00702
00703 sumGs
00704 = new TF1("sumGs","gaus(0)+gaus(3)", fitStart, fitEnd);
00705
00706 Double_t pars_a[6] = { mPiGausHeight, mPiGausCenter, mPiSigma,
00707 mEGausHeight, mEGausCenter, mESigma };
00708
00709 sumGs->SetParameters(&pars_a[0]);
00710
00711 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00712 mPiGausHeight*(1.+PiHeightVary) );
00713 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00714 mPiGausCenter*(1.+PiCenterVary) );
00715 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00716 mPiSigma*(1.+PiWidthVary) );
00717
00718 sumGs->SetParLimits( 3, 0., mEGausHeight );
00719 sumGs->SetParLimits( 4, mEGausCenter*(1.-ECenterVary),
00720 mEGausCenter*(1.+ECenterVary));
00721 sumGs->SetParLimits( 5, mESigma*(1.-EWidthVary),
00722 mESigma*(1.+EWidthVary) );
00723
00724
00725 if (theHist->GetEntries()>1.) theHist->Fit("sumGs","R");
00726
00727 fittedHistoFile.cd();
00728 theHist->Write();
00729 if (sumGs) delete sumGs;
00730
00731 }
00732
00733
00734
00735 if (pPosition>=junction1 && pPosition<junction2){
00736
00737 Double_t antiprotonBandLowEdge=kaonAntiprotonBandCenter->Eval(pPosition,0.,0.);
00738 fitEnd = TMath::Min(antiprotonBandLowEdge,mDedxEnd);
00739
00740 sumGs
00741 = new TF1("sumGs","gaus(0)+gaus(3)+gaus(6)", fitStart, fitEnd);
00742
00743 Double_t pars_b[9] = { mPiGausHeight, mPiGausCenter, mPiSigma,
00744 mEGausHeight, mEGausCenter, mESigma,
00745 mKGausHeight, mKGausCenter, mKSigma };
00746
00747 sumGs->SetParameters(&pars_b[0]);
00748
00749
00750 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00751 mPiGausHeight*(1.+PiHeightVary));
00752 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00753 mPiGausCenter*(1.+PiCenterVary) );
00754 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00755 mPiSigma*(1.+PiWidthVary) );
00756
00757 sumGs->SetParLimits( 3, 0., mEGausHeight );
00758 sumGs->SetParLimits( 4, mEGausCenter*(1.-ECenterVary),
00759 mEGausCenter*(1.+ECenterVary) );
00760 sumGs->SetParLimits( 5, mESigma*(1.-EWidthVary),
00761 mESigma*(1.+EWidthVary) );
00762
00763 sumGs->SetParLimits( 6, 0., mKGausHeight );
00764 sumGs->SetParLimits( 7, mKGausCenter*(1.-KCenterVary),
00765 mKGausCenter*(1.+KCenterVary) );
00766 sumGs->SetParLimits( 8, mKSigma*(1.-KWidthVary),
00767 mKSigma*(1.+KWidthVary) );
00768
00769
00770 theHist->Fit("sumGs","R");
00771
00772 fittedHistoFile.cd();
00773 theHist->Write();
00774 if (sumGs) delete sumGs;
00775 }
00776
00777
00778
00779 if (pPosition>=junction2 && pPosition<junction3){
00780
00781 fitEnd = mDedxEnd;
00782
00783 sumGs
00784 = new TF1("sumGs","gaus(0)+gaus(3)+gaus(6)+gaus(9)", fitStart, fitEnd);
00785
00786 Double_t pars_c[12] = { mPiGausHeight, mPiGausCenter, mPiSigma,
00787 mEGausHeight, mEGausCenter, mESigma,
00788 mKGausHeight, mKGausCenter, mKSigma,
00789 mPGausHeight, mPGausCenter, mPSigma };
00790
00791 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00792 mPiGausHeight*(1.+PiHeightVary) );
00793 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00794 mPiGausCenter*(1.+PiCenterVary) );
00795 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00796 mPiSigma*(1.+PiWidthVary) );
00797
00798
00799 sumGs->SetParLimits( 3, 0., mEGausHeight );
00800 sumGs->SetParLimits( 4, mEGausCenter*(1.-ECenterVary),
00801 mEGausCenter*(1.+ECenterVary) );
00802 sumGs->SetParLimits( 5, mESigma*(1.-EWidthVary),
00803 mESigma*(1.+EWidthVary) );
00804
00805
00806 sumGs->SetParLimits( 6, 0., mKGausHeight );
00807 sumGs->SetParLimits( 7, mKGausCenter*(1.-KCenterVary),
00808 mKGausCenter*(1.+KCenterVary) );
00809 sumGs->SetParLimits( 8, mKSigma*(1.-KWidthVary),
00810 mKSigma*(1.+KWidthVary) );
00811
00812
00813 sumGs->SetParLimits( 9, 0., mPGausHeight );
00814 sumGs->SetParLimits(10, mPGausCenter*(1.-PCenterVary),
00815 mPGausCenter*(1.+PCenterVary) );
00816 sumGs->SetParLimits(11, mPSigma*(1.-PWidthVary),
00817 mPSigma*(1.+PWidthVary) );
00818
00819 sumGs->SetParameters(&pars_c[0]);
00820
00821 theHist->Fit("sumGs","R");
00822
00823 fittedHistoFile.cd();
00824 theHist->Write();
00825 if (sumGs) delete sumGs;
00826 }
00827
00828
00829 if (pPosition>=junction3 && pPosition<2.){
00830
00831 fitEnd = mDedxEnd;
00832
00833 sumGs
00834 = new TF1("sumGs","gaus(0)+gaus(3)+gaus(6)", fitStart, fitEnd);
00835
00836 Double_t pars_d[9] = { mPiGausHeight, mPiGausCenter, mPiSigma,
00837 mKGausHeight, mKGausCenter, mKSigma,
00838 mPGausHeight, mPGausCenter, mPSigma };
00839
00840 sumGs->SetParLimits( 0, mPiGausHeight*(1.-PiHeightVary),
00841 mPiGausHeight*(1.+PiHeightVary));
00842 sumGs->SetParLimits( 1, mPiGausCenter*(1.-PiCenterVary),
00843 mPiGausCenter*(1.+PiCenterVary));
00844 sumGs->SetParLimits( 2, mPiSigma*(1.-PiWidthVary),
00845 mPiSigma*(1.+PiWidthVary));
00846
00847
00848
00849 sumGs->SetParLimits( 3, 0., mKGausHeight );
00850 sumGs->SetParLimits( 4, mKGausCenter*(1.-KCenterVary),
00851 mKGausCenter*(1.+KCenterVary));
00852 sumGs->SetParLimits( 5, mKSigma*(1.-KWidthVary),
00853 mKSigma*(1.+KWidthVary));
00854
00855
00856 sumGs->SetParLimits( 6, 0., mPGausHeight );
00857 sumGs->SetParLimits( 7, mPGausCenter*(1.-PCenterVary),
00858 mPGausCenter*(1.+PCenterVary));
00859 sumGs->SetParLimits( 8, mPSigma*(1.-PWidthVary),
00860 mPSigma*(1.+PWidthVary));
00861
00862 sumGs->SetParameters(&pars_d[0]);
00863
00864 theHist->Fit("sumGs","R");
00865
00866 fittedHistoFile.cd();
00867 theHist->Write();
00868 if (sumGs) delete sumGs;
00869 }
00870
00871
00872 }
00873
00874
00875 fittedHistoFile.Write();
00876 fittedHistoFile.Close();
00877 }
00878
00879
00880 void PIDFitter::ExtrapAmp(Char_t* fileNameOfInput, Char_t* fileNameOfOutput){
00881
00882 cout<<" **********extraping pion amp. begin********* "<<endl;
00883
00884 Double_t pBegin = mPStart;
00885 Double_t pEnd = mPEnd;
00886
00887 TFile* gausHistFile = new TFile(fileNameOfInput,"READ");
00888
00889 TFile* ampHistFile = new TFile(fileNameOfOutput,"RECREATE");
00890
00891
00892 for (int j=0; j<mNEtaBins; j++)
00893 for (int k=0; k<mNNHitsBins;k++){
00894
00895 char *PiAmpName = new char[80];
00896 sprintf(PiAmpName,"PiAmp%d%d",j,k);
00897 char *EAmpName = new char[80];
00898 sprintf(EAmpName,"EAmp%d%d",j,k);
00899 char *KAmpName = new char[80];
00900 sprintf(KAmpName,"KAmp%d%d",j,k);
00901 char *PAmpName = new char[80];
00902 sprintf(PAmpName,"PAmp%d%d",j,k);
00903
00904 TH1F* PiAmpHisto = new TH1F(PiAmpName, PiAmpName, mNPBins,mPStart,mPEnd);
00905 TH1F* EAmpHisto = new TH1F(EAmpName, EAmpName, mNPBins,mPStart,mPEnd);
00906 TH1F* KAmpHisto = new TH1F(KAmpName, KAmpName, mNPBins,mPStart,mPEnd);
00907 TH1F* PAmpHisto = new TH1F(PAmpName, PAmpName, mNPBins,mPStart,mPEnd);
00908
00909 PiAmpHisto->SetLineColor(4);
00910 EAmpHisto->SetLineColor(6);
00911 KAmpHisto->SetLineColor(2);
00912 PAmpHisto->SetLineColor(3);
00913
00914
00915
00916 double nhitsPosition=double((k+0.5)*(float(mNNHitsEnd-mNNHitsStart)/float(mNNHitsBins)));
00917
00918
00919 for (int i=0; i<mNPBins; i++){
00920
00921 float pPosition =
00922 float(i)*((pEnd-pBegin)/float(mNPBins)) +
00923 (((pEnd-pBegin)/mNPBins)/2.);
00924
00925 char *theHistName = new char[80];
00926 if (i<10)
00927 sprintf(theHistName,"h0%d%d%d",i,j,k);
00928 else sprintf(theHistName,"h%d%d%d",i,j,k);
00929
00930 TH1F* theHist= (TH1F *)gausHistFile->Get(theHistName);
00931
00932
00933 TF1* sumGs=theHist->GetFunction("sumGs");
00934
00935 if (!sumGs) continue;
00936
00937 if (pPosition<junction1){
00938 PiAmpHisto->SetBinContent(i+1,sumGs->GetParameter(0));
00939 PiAmpHisto->SetBinError(i+1, sumGs->GetParError(0));
00940 EAmpHisto->SetBinContent(i+1,sumGs->GetParameter(3));
00941 EAmpHisto->SetBinError(i+1, sumGs->GetParError(3));
00942 }
00943
00944 if (pPosition>=junction1 && pPosition<junction2){
00945 PiAmpHisto->SetBinContent(i+1,sumGs->GetParameter(0));
00946 PiAmpHisto->SetBinError(i+1, sumGs->GetParError(0));
00947 EAmpHisto->SetBinContent(i+1,sumGs->GetParameter(3));
00948 EAmpHisto->SetBinError(i+1, sumGs->GetParError(3));
00949 KAmpHisto->SetBinContent(i+1,sumGs->GetParameter(6));
00950 KAmpHisto->SetBinError(i+1, sumGs->GetParError(6));
00951 }
00952 if (pPosition>=junction2 && pPosition<junction3 ){
00953 PiAmpHisto->SetBinContent(i+1,sumGs->GetParameter(0));
00954 PiAmpHisto->SetBinError(i+1, sumGs->GetParError(0));
00955 EAmpHisto->SetBinContent(i+1,sumGs->GetParameter(3));
00956 EAmpHisto->SetBinError(i+1, sumGs->GetParError(3));
00957 KAmpHisto->SetBinContent(i+1,sumGs->GetParameter(6));
00958 KAmpHisto->SetBinError(i+1, sumGs->GetParError(6));
00959 PAmpHisto->SetBinContent(i+1,sumGs->GetParameter(9));
00960 PAmpHisto->SetBinError(i+1, sumGs->GetParError(9));
00961 }
00962
00963 if (pPosition>=junction3 && pPosition<2.){
00964 PiAmpHisto->SetBinContent(i+1,sumGs->GetParameter(0));
00965 PiAmpHisto->SetBinError(i+1, sumGs->GetParError(0));
00966 KAmpHisto->SetBinContent(i+1,sumGs->GetParameter(3));
00967 KAmpHisto->SetBinError(i+1, sumGs->GetParError(3));
00968 PAmpHisto->SetBinContent(i+1,sumGs->GetParameter(6));
00969 PAmpHisto->SetBinError(i+1, sumGs->GetParError(6));
00970 }
00971
00972
00973 }
00974
00975
00976 double low = 0.15;
00977 double high = 0.6;
00978 double ampPeakPos = 0.45;
00979
00980
00981
00982 for (int t=0; t<4; t++){
00983 TF1* gs = new TF1("gs","gaus",low,high);
00984 PiAmpHisto->Fit("gs","NWR");
00985 low = gs->GetParameter(1)-0.13;
00986 high = gs->GetParameter(1)+0.13;
00987 ampPeakPos= gs->GetParameter(1);
00988 delete gs;
00989 }
00990
00991
00992 ampPeakPos=0.6;
00993
00994
00995
00996 TF1* PiFcnCenter = new TF1("PiFcnCenter","pol3",0.4,0.7);
00997
00998 TF1* PiFcnLeft = new TF1("PiFcnLeft","pol3",0.1,ampPeakPos-0.05);
00999 PiFcnLeft->SetLineColor(4);
01000
01001 TF1* PiFcnRight = new TF1("PiFcnRight","expo",0.7,1.4);
01002 PiFcnRight->SetLineColor(3);
01003
01004 PiAmpHisto->Fit("PiFcnCenter","WR+");
01005
01006
01007
01008
01009 float crossBandBegin = 0.8;
01010 float brossBandEnd = 1.2;
01011
01012
01013 TGraphErrors* PiAmpGraphRight = new TGraphErrors();
01014
01015 for (int ampbin = 0; ampbin<PiAmpHisto->GetNbinsX(); ampbin++){
01016 if (PiAmpHisto->GetBinCenter(ampbin) < crossBandBegin ||
01017 PiAmpHisto->GetBinCenter(ampbin) > brossBandEnd){
01018 PiAmpGraphRight->SetPoint(PiAmpGraphRight->GetN(), PiAmpHisto->GetBinCenter(ampbin), PiAmpHisto->GetBinContent(ampbin));
01019 PiAmpGraphRight->SetPointError(PiAmpGraphRight->GetN()-1, PiAmpHisto->GetBinCenter(ampbin), PiAmpHisto->GetBinContent(ampbin));
01020 }
01021 }
01022
01023
01024 PiAmpGraphRight->Fit("PiFcnRight", "WR+");
01025
01026 PiAmpHisto->GetListOfFunctions()->Add(PiAmpGraphRight->GetFunction("PiFcnRight"));
01027
01028
01029 if (PiFcnCenter) delete PiFcnCenter;
01030 if (PiFcnLeft) delete PiFcnLeft;
01031 if (PiFcnRight) delete PiFcnRight;
01032
01033
01034 float EAmpFitBegin = EAmpHisto->GetBinCenter(EAmpHisto->GetMaximumBin())+0.03;
01035
01036
01037 if (nhitsPosition <= 15. && nhitsPosition >10) EAmpFitBegin +=0.05;
01038 if (nhitsPosition <= 10. && nhitsPosition >5) EAmpFitBegin +=0.09;
01039
01040
01041 TF1* EFcnLeft = new TF1("EFcnLeft","expo",EAmpFitBegin,EAmpFitBegin+0.22);
01042 EFcnLeft->SetLineColor(2);
01043 TF1* EFcnRight = new TF1("EFcnRight","expo",0.35,0.8);
01044 EFcnRight->SetLineColor(4);
01045
01046
01047
01048 crossBandBegin = 0.45;
01049 brossBandEnd = 0.6;
01050
01051 TGraphErrors* EAmpGraphRight = new TGraphErrors();
01052
01053 for (int ampbin = 0; ampbin<EAmpHisto->GetNbinsX(); ampbin++){
01054 if (EAmpHisto->GetBinCenter(ampbin) < crossBandBegin ||
01055 EAmpHisto->GetBinCenter(ampbin) > brossBandEnd){
01056 EAmpGraphRight->SetPoint(EAmpGraphRight->GetN(), EAmpHisto->GetBinCenter(ampbin), EAmpHisto->GetBinContent(ampbin));
01057 EAmpGraphRight->SetPointError(EAmpGraphRight->GetN()-1, EAmpHisto->GetBinCenter(ampbin), EAmpHisto->GetBinContent(ampbin));
01058 }
01059 }
01060
01061
01062 EAmpGraphRight->Fit("EFcnRight", "WR+");
01063
01064 EAmpHisto->GetListOfFunctions()->Add(EAmpGraphRight->GetFunction("EFcnRight"));
01065
01066
01067
01068
01069
01070 if (EFcnLeft) delete EFcnLeft;
01071 if (EFcnRight) delete EFcnRight;
01072
01073
01074
01075 low = 0.4;
01076 high = 0.9;
01077 ampPeakPos = 0.68;
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093 TF1* KFcnCenter = new TF1("KFcnCenter","gaus",low,high);
01094
01095 TF1* KFcnLeft = new TF1("KFcnLeft","pol3", (nhitsPosition <= 25.) ? 0.28 : 0.35, 0.65);
01096 KFcnLeft->SetLineColor(4);
01097
01098 TF1* KFcnRight = new TF1("KFcnRight","expo",0.8,2.);
01099 KFcnRight->SetLineColor(3);
01100
01101
01102 crossBandBegin = 0.48;
01103 brossBandEnd = 0.58;
01104
01105
01106 TGraphErrors* KAmpGraphLeft = new TGraphErrors();
01107
01108 for (int ampbin = 0; ampbin<KAmpHisto->GetNbinsX(); ampbin++){
01109 if (KAmpHisto->GetBinCenter(ampbin) < crossBandBegin ||
01110 KAmpHisto->GetBinCenter(ampbin) > brossBandEnd){
01111 KAmpGraphLeft->SetPoint(KAmpGraphLeft->GetN(), KAmpHisto->GetBinCenter(ampbin), KAmpHisto->GetBinContent(ampbin));
01112 KAmpGraphLeft->SetPointError(KAmpGraphLeft->GetN()-1, KAmpHisto->GetBinCenter(ampbin), KAmpHisto->GetBinContent(ampbin));
01113 }
01114 }
01115
01116 KAmpGraphLeft->Fit("KFcnLeft", "WR+");
01117 KAmpHisto->GetListOfFunctions()->Add(KAmpGraphLeft->GetFunction("KFcnLeft"));
01118 crossBandBegin = 0.9;
01119 brossBandEnd = 1.5;
01120
01121
01122 TGraphErrors* KAmpGraphRight = new TGraphErrors();
01123
01124 for (int ampbin = 0; ampbin<KAmpHisto->GetNbinsX(); ampbin++){
01125 if (KAmpHisto->GetBinCenter(ampbin) < crossBandBegin ||
01126 KAmpHisto->GetBinCenter(ampbin) > brossBandEnd){
01127 KAmpGraphRight->SetPoint(KAmpGraphRight->GetN(), KAmpHisto->GetBinCenter(ampbin), KAmpHisto->GetBinContent(ampbin));
01128 KAmpGraphRight->SetPointError(KAmpGraphRight->GetN()-1, KAmpHisto->GetBinCenter(ampbin), KAmpHisto->GetBinContent(ampbin));
01129 }
01130 }
01131
01132
01133 KAmpGraphRight->Fit("KFcnRight", "WR+");
01134
01135 KAmpHisto->GetListOfFunctions()->Add(KAmpGraphRight->GetFunction("KFcnRight"));
01136
01137 KAmpHisto->Fit("KFcnCenter","WR+");
01138
01139
01140 if ( KFcnCenter->GetXmin()<KFcnLeft->GetXmax() && KFcnLeft->GetXmax() < KFcnCenter->GetXmax() )
01141 KAmpHisto->GetFunction("KFcnCenter")->SetRange(KFcnLeft->GetXmax()-0.05, KFcnCenter->GetXmax());
01142
01143
01144
01145 if (KFcnCenter) delete KFcnCenter;
01146 if (KFcnLeft) delete KFcnLeft;
01147 if (KFcnRight) delete KFcnRight;
01148
01149
01150
01151
01152 TF1* PFcnLeft = new TF1("PFcnLeft","pol4",0.6,1.4);
01153 TF1* PFcnRight = new TF1("PFcnRight","expo",1.4,2.);
01154
01155 crossBandBegin = 1.5;
01156 brossBandEnd = 1.8;
01157
01158
01159 TGraphErrors* PAmpGraphRight = new TGraphErrors();
01160
01161 for (int ampbin = 0; ampbin<PAmpHisto->GetNbinsX(); ampbin++){
01162 if (PAmpHisto->GetBinCenter(ampbin) < crossBandBegin ||
01163 PAmpHisto->GetBinCenter(ampbin) > brossBandEnd){
01164 PAmpGraphRight->SetPoint(PAmpGraphRight->GetN(), PAmpHisto->GetBinCenter(ampbin), PAmpHisto->GetBinContent(ampbin));
01165 PAmpGraphRight->SetPointError(PAmpGraphRight->GetN()-1, PAmpHisto->GetBinCenter(ampbin), PAmpHisto->GetBinContent(ampbin));
01166 }
01167 }
01168
01169
01170 PAmpGraphRight->Fit("PFcnRight", "WR+");
01171
01172 PAmpHisto->GetListOfFunctions()->Add(PAmpGraphRight->GetFunction("PFcnRight"));
01173
01174
01175 PAmpHisto->Fit("PFcnLeft","RW+");
01176
01177 if (PFcnRight) delete PFcnRight;
01178 if (PFcnLeft) delete PFcnLeft;
01179
01180
01181
01182 ampHistFile->cd();
01183 PiAmpHisto->Write(PiAmpHisto->GetName(),TObject::kOverwrite | TObject::kSingleKey);
01184 EAmpHisto->Write(EAmpHisto->GetName(),TObject::kOverwrite | TObject::kSingleKey);
01185 KAmpHisto->Write(KAmpHisto->GetName(),TObject::kOverwrite | TObject::kSingleKey);
01186 PAmpHisto->Write(PAmpHisto->GetName(),TObject::kOverwrite | TObject::kSingleKey);
01187
01188
01189 }
01190
01191 ampHistFile->Write();
01192 ampHistFile->Close();
01193 gausHistFile->Close();
01194 cout<<" **********extraping pion amp. end********* "<<endl;
01195 }
01196
01197
01198 Double_t sigmaNSampleFitFcn(Double_t* x, Double_t *par){
01199
01200 if (x[0]) return par[0]/::sqrt(x[0]);
01201 else return 0.;
01202 }
01203
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235