00001 #include "MCReweight/Lfluk.h"
00002 #include "MessageService/MsgService.h"
00003 #include "Registry/Registry.h"
00004
00005 #include <string>
00006 #include <iostream>
00007 #include <iomanip>
00008 #include <cstring>
00009 #include <cmath>
00010 #include <cstdlib>
00011 #include <cassert>
00012 #include <sstream>
00013 #include "TFile.h"
00014 #include "TH2F.h"
00015 #include "TF1.h"
00016 #include "TSystem.h"
00017 ClassImp(Lfluk)
00018
00019 CVSID("$Id");
00020
00021 Lfluk::Lfluk()
00022 :fParam("skzp"),
00023 fSkew("lin"),
00024 fNA49Fit("Poly3"),
00025 fPath(""),
00026 fMinW(-999.0),
00027 fMaxW(999.0),
00028 fKPiRatScale(1.0),
00029 fWghtFromHist(true),
00030 fUseFlukPi(false),
00031 fPar(0),
00032 fFlukKPiRat(0)
00033 {
00034
00035 }
00036
00037
00038 Lfluk::~Lfluk()
00039 {
00040 }
00041
00042
00043 void Lfluk::Init()
00044 {
00045 cout << "Lfluk::Init" << endl;
00046
00047 std::string dir = "";
00048 TH1::AddDirectory(kFALSE);
00049
00050
00051 std::string topDir=dir;
00052 if(topDir=="") {
00053 topDir="MCReweight/data";
00054 std::string base="";
00055 base=getenv("SRT_PRIVATE_CONTEXT");
00056 if (base!="" && base!=".") {
00057
00058 std::string path = base + "/" + topDir;
00059 void *dir_ptr = gSystem -> OpenDirectory(path.c_str());
00060 if(!dir_ptr) base=getenv("SRT_PUBLIC_CONTEXT");
00061 }
00062 else base=getenv("SRT_PUBLIC_CONTEXT");
00063 if(base=="") {
00064 MSG("MCReweight",Msg::kFatal)<<"No SRT_PUBLIC_CONTEXT set"<<std::endl;
00065 assert(false);
00066 }
00067 topDir = base+ "/" + topDir;
00068 }
00069
00070 MSG("Lfluk",Msg::kDebug) <<"Lfluk reading data from: "<<topDir<<std::endl;
00071 std::string fileName =topDir+"/fluka05ptxf.root";
00072
00073 TFile* hFile=new TFile(fileName.c_str(), "READ");
00074 if(!(hFile->IsOpen()))
00075 {
00076 hFile = new TFile("/minos/scratch/loiacono/Data/ForMonFit/fluka05ptxf.root", "READ");
00077 if(!hFile || !(hFile->IsOpen()))
00078 {
00079 cout << "Can't open /minos/scratch/loiacono/Data/ForMonFit/fluka05ptxf.root" << endl;
00080 cout << " Failed to open file: " << fileName << endl;
00081 cout << " **************I am going to crash***************"<< endl;
00082 }
00083
00084 }
00085 else
00086 {
00087 cout << " Reading Fluka PTXF from: " << fileName << endl;
00088 }
00089
00090
00091 fPlist.push_back(kPiPlus);
00092 fPlist.push_back(kPiMinus);
00093 fPlist.push_back(kKPlus);
00094 fPlist.push_back(kKMinus);
00095 fPlist.push_back(kK0L);
00096
00097 for (std::vector<ParticleType_t>::iterator itPlist=fPlist.begin();itPlist!=fPlist.end(); itPlist++)
00098 {
00099 TH2F* hist=dynamic_cast <TH2F*> (hFile->Get(Form("hF05ptxf%s",GetParticleName(*itPlist).c_str()))->Clone());
00100 hist->SetDirectory(0);
00101 TH2F* hist2=dynamic_cast <TH2F*> (hist->Clone(Form("hWeightedPTXF%s",GetParticleName(*itPlist).c_str())));
00102 hist2->SetDirectory(0);
00103 hist2->SetTitle(Form("%s weighted pt-pz",GetParticleName(*itPlist).c_str()));
00104
00105 const int nbinsx = 120;
00106 const int nbinsy = hist -> GetNbinsY();
00107
00108
00109
00110
00111
00112 fWeightHist[*itPlist] = new TH2D(Form("hWeightedPTXF%s",GetParticleName(*itPlist).c_str()),GetParticleName(*itPlist).c_str(), nbinsx, 0, 120, nbinsy, 0, 1);
00113 for(int ibinx = 0; ibinx <= nbinsx+1; ++ibinx)
00114 {
00115 for(int ibiny = 0; ibiny <= nbinsy+1; ++ibiny)
00116 {
00117
00118 fWeightHist[*itPlist] -> SetBinContent(ibinx, ibiny, 1.0);
00119 }
00120 }
00121
00122
00123 fWeightHist[*itPlist]->SetDirectory(0);
00124
00125 std::pair<Lfluk::ParticleType_t, TH2F* > p(*itPlist, hist);
00126 std::pair<Lfluk::ParticleType_t, TH2F* > p2(*itPlist, hist2);
00127 fPTXF.insert(p);
00128 fWeightedPTXF.insert(p2);
00129
00130 fPTXF[*itPlist]->SetDirectory(0);
00131 fWeightedPTXF[*itPlist]->SetDirectory(0);
00132
00133
00134
00135
00136
00137 fMeanPT[*itPlist]=fPTXF[*itPlist]->ProjectionY()->GetMean()*1000.;
00138 fWeightedMeanPT[*itPlist]=fWeightedPTXF[*itPlist]->ProjectionY()->GetMean()*1000.;
00139
00140 double N=fPTXF[*itPlist]->ProjectionY()->GetSumOfWeights();
00141 double wN=fWeightedPTXF[*itPlist]->ProjectionY()->GetSumOfWeights();
00142
00143 fN[*itPlist]=N;
00144 fNWeighted[*itPlist]=wN;
00145 }
00146 hFile->Close();
00147 delete hFile;
00148 hFile=0;
00149
00150
00151
00152
00153 std::string path = string(fPath + "na49Ratio.root");
00154 TFile *fitfile = new TFile(path.c_str(), "READ");
00155 if(!(fitfile->IsOpen()))
00156 {
00157 cout << " Failed to open file: " << path << endl;
00158 cout << " **************I am going to crash***************"<< endl;
00159 }
00160 else
00161 {
00162 cout << " Reading NA49 Pi Ratio from: " << path << endl;
00163 }
00164
00165 stringstream name;
00166 name << "NA49PipPimRatio_" << fNA49Fit << "_fit";
00167 if(!(fitfile -> Get(name.str().c_str())))
00168 {
00169 cout << " Failed to get " << name.str() << " from " << path << endl;
00170 }
00171 fNA49pirat = dynamic_cast<TF1 *>( (fitfile -> Get(name.str().c_str())) -> Clone());
00172 if(!fNA49pirat)
00173 {
00174 cout << " Failed to get " << name.str() << " from " << path << endl;
00175 fNA49pirat = 0;
00176 }
00177 fitfile -> Close();
00178 delete fitfile;
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 fPiRatio.resize(122);
00210 fFluka05KPiRatio.resize(122);
00211 fFluka05PiRatio.resize(122);
00212 fKPiRatio.resize(122);
00213 TH1D* piplus=dynamic_cast<TH1D*> (GetPTXF(8)
00214 ->ProjectionX()->Clone("piplus"));
00215 TH1D* piminus=dynamic_cast<TH1D*> (GetPTXF(9)
00216 ->ProjectionX()->Clone("piplus"));
00217 TH1D* kplus=dynamic_cast<TH1D*> (GetPTXF(11)
00218 ->ProjectionX()->Clone("kplus"));
00219
00220 kplus->Divide(piplus);
00221 piplus->Divide(piminus);
00222
00223 fFlukKPiRat = dynamic_cast<TH1D*>( kplus->Clone("FlukKPiRatio") );
00224 fFlukPiRat = dynamic_cast<TH1D*>( piplus->Clone("FlukPiRatio") );
00225
00226
00227
00228 for (int i=1;i<121;i++)
00229 {
00230 if (kplus->GetBinContent(i)!=0.)
00231 fFluka05KPiRatio[i] = kplus->GetBinContent(i);
00232 else if (i<119)
00233 fFluka05KPiRatio[i] = (fFluka05KPiRatio[i-2]+fFluka05KPiRatio[i-1]
00234 +kplus->GetBinContent(i+1)+kplus->GetBinContent(i+2))/4.;
00235 else
00236 fFluka05KPiRatio[i] = fFluka05KPiRatio[i-1];
00237
00238 fFlukKPiRat -> SetBinContent(i, fFluka05KPiRatio[i]);
00239 }
00240
00241
00242
00243 for (int i=1;i<121;i++)
00244 {
00245 if (piplus->GetBinContent(i)!=0.)
00246 fFluka05PiRatio[i] = piplus->GetBinContent(i);
00247 else if (i<119)
00248 fFluka05PiRatio[i] = (fFluka05PiRatio[i-2]+fFluka05PiRatio[i-1]
00249 +piplus->GetBinContent(i+1)+piplus->GetBinContent(i+2))/4.;
00250 else
00251 fFluka05PiRatio[i] = fFluka05PiRatio[i-1];
00252
00253 fFlukPiRat -> SetBinContent(i, fFluka05PiRatio[i]);
00254 }
00255
00256
00257 isFirst=true;
00258
00259
00260 }
00261
00262 void Lfluk::SetConfig(const std::string param, const std::string skew, const std::string na49fit, const double wmin, const double wmax)
00263 {
00264 fParam = param;
00265 fSkew = skew;
00266 fNA49Fit = na49fit;
00267 fMinW = wmin;
00268 fMaxW = wmax;
00269
00270 }
00271
00272
00273 void Lfluk::Config(const Registry ®)
00274 {
00275 reg.Get("WEIGHT_MIN", fMinW);
00276 reg.Get("WEIGHT_MAX", fMaxW);
00277 reg.Get("KPiRatioScale", fKPiRatScale);
00278
00279 if(fMaxW < 990.0 && fMinW > -990.0 && fMaxW <= fMinW)
00280 {
00281 fMaxW = fMinW + 10.0;
00282 cout << "Lfluk::Config - Weight Max <= Weight Min, setting fMaxW = " << fMaxW << " fMinW = " << fMinW << endl;
00283 }
00284
00285 const char *value_char = 0;
00286
00287 if(reg.Get("ZRatTuneParam", value_char) && value_char)
00288 {
00289 stringstream strstrm;
00290 strstrm << value_char;
00291 fParam = strstrm.str();
00292 }
00293
00294 value_char = 0;
00295 if(reg.Get("ZRatTuneSkew", value_char) && value_char)
00296 {
00297 stringstream strstrm;
00298 strstrm << value_char;
00299 fSkew = strstrm.str();
00300 }
00301
00302 value_char = 0;
00303 if(reg.Get("NA49FIT", value_char) && value_char)
00304 {
00305 stringstream strstrm;
00306 strstrm << value_char;
00307 fNA49Fit = strstrm.str();
00308 }
00309
00310 value_char = 0;
00311 if(reg.Get("ROOTFILES", value_char) && value_char)
00312 {
00313 stringstream strstrm;
00314 strstrm << value_char;
00315 fPath = strstrm.str();
00316 }
00317
00318 value_char = 0;
00319 if(reg.Get("WGHTFROMHIST", value_char) && value_char)
00320 {
00321 if(std::strcmp(value_char, "no") == 0)
00322 {
00323 fWghtFromHist = false;
00324 }
00325 }
00326
00327 value_char = 0;
00328 if(reg.Get("UseFlukaPiRatio", value_char) && value_char)
00329 {
00330 if(std::strcmp(value_char, "yes") == 0)
00331 {
00332 fUseFlukPi = true;
00333 }
00334 }
00335
00336
00337 cout << "Lfluk::Config" << endl;
00338 cout << " Root File Path = " << fPath << endl
00339 << " Get Weight From Hist = " << fWghtFromHist << endl
00340 << " Parameterization = " << fParam << endl
00341 << " Skew Config = " << fSkew << endl
00342 << " Use Fluka Pi Ratio = " << fUseFlukPi << endl
00343 << " NA49 Ratio Fit = " << fNA49Fit << endl
00344 << " KPi Ratio Scale = " << fKPiRatScale << endl
00345 << " Weight Min = " << fMinW << endl
00346 << " Weight Max = " << fMaxW << endl;
00347
00348
00349 }
00350
00351
00352 void Lfluk::SetParameters(std::vector<double> par)
00353 {
00354 fPar=par;
00355 isFirst=true;
00356
00357 if(fParam == "skzp" && fSkew == "fluka")
00358 {
00359 cout << " Pars = ";
00360 for(unsigned int ip = 0; ip < fPar.size(); ++ip)
00361 {
00362 cout << fPar[ip] << " ";
00363 }
00364 cout << "end pars " << endl;
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439 cout << "Done Setting pars...recalc weights" << endl;
00440 cout << endl;
00441
00442 }
00443
00444
00445
00446
00447
00448 RecalculateWeights();
00449 }
00450
00451
00452 TH2* Lfluk::GetWeightHist(const std::string &ptype)
00453 {
00454 TH2* hist = 0;
00455 hist = dynamic_cast <TH2*> (fWeightHist[GetParticleEnum(ptype)]->Clone());
00456 hist->SetDirectory(0);
00457
00458 return hist;
00459
00460 }
00461
00462
00463 double Lfluk::GetWeight(int ptype, double pT, double pz)
00464 {
00465
00466
00467 if(fWghtFromHist)
00468 {
00469
00470 double weight = 1.0;
00471
00472 Lfluk::ParticleType_t eptype=GetParticleEnum(ptype);
00473 string name = GetParticleName(eptype);
00474
00475 if(eptype != kPiPlus && eptype != kKPlus && eptype != kPiMinus && eptype != kPiMinus)
00476 {
00477 return 1.0;
00478 }
00479
00480 if (pz > 120.0 || pz < 0.0 || pT < 0.0)
00481 {
00482 return weight;
00483 }
00484
00485 const int nbinsx = fWeightHist[eptype] -> GetNbinsX();
00486 const int nbinsy = fWeightHist[eptype] -> GetNbinsY();
00487
00488 int binx = (fWeightHist[eptype] -> GetXaxis()) -> FindFixBin(pz);
00489 int biny = (fWeightHist[eptype] -> GetYaxis()) -> FindFixBin(pT);
00490
00491 if (pT > 1.0) biny = nbinsy+1;
00492
00493 if(!(binx < 0) && !(biny < 0) && !(binx > nbinsx+1) && !(biny > nbinsy+1))
00494 {
00495 weight = fWeightHist[eptype] -> GetBinContent(binx, biny);
00496 }
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518 return weight;
00519 }
00520
00521 else
00522 {
00523 return CalcWeight(ptype,pT,pz);
00524 }
00525 }
00526
00527
00528 double Lfluk::CalcWeight(int ptype, double pT, double pz)
00529 {
00530 double weight=1.;
00531
00532 if (fPar.size()==0)
00533 {
00534 MAXMSG("MCReweight",Msg::kWarning,10)
00535 <<"You need to set the parameters before calling "
00536 <<"Zfluk::CalcWeight (use SetParameters(vector<double>))"<<std::endl
00537 <<"Returning weight = "<<weight<<std::endl;
00538 return weight;
00539 }
00540
00541 double xF=pz/120.;
00542 Lfluk::ParticleType_t eptype=GetParticleEnum(ptype);
00543
00544
00545 if (xF>1.||xF<0.) return weight;
00546
00547 if (eptype==kPiPlus)
00548 {
00549 if (pT>1.||pT<0.) return weight;
00550
00551 if(fParam.find("skzp") != string::npos)
00552 {
00553 weight = Lfluk::GetSKZPWeight(eptype, pT, xF);
00554 }
00555 if(fParam.find("skpc") != string::npos)
00556 {
00557 weight = Lfluk::GetSKPCWeight(eptype, pT, xF);
00558 }
00559 if(fParam.find("quad") != string::npos)
00560 {
00561 weight = Lfluk::GetQuadWeight(eptype, pT, xF);
00562 }
00563 if(fParam.find("meanpt") != string::npos)
00564 {
00565 weight = Lfluk::GetMeanPTWeight(eptype, pT, xF);
00566 }
00567
00568 if(weight < fMinW) weight = fMinW;
00569 if(weight > fMaxW) weight = fMaxW;
00570
00571 }
00572 else if (eptype==kKPlus)
00573 {
00574 weight=fKPiRatio[int(pz)+1];
00575 }
00576 else if (eptype==kPiMinus)
00577 {
00578 weight=CalcWeight(kPiPlus,pT,pz)*fPiRatio[int(pz)+1];
00579 }
00580 else if (eptype==kKMinus)
00581 {
00582 weight=CalcWeight(kKPlus,pT,pz);
00583 }
00584 else if (eptype==kK0L)
00585 {
00586
00587 weight= ((fNWeighted[kKPlus]+3.*fNWeighted[kKMinus])
00588 /(fN[kKPlus]+3.*fN[kKMinus]));
00589 }
00590
00591 if(weight < -999.0) weight = fMinW;
00592 if(weight > 999.0) weight = fMaxW;
00593
00594
00595 return weight;
00596 }
00597
00598
00599
00600 double Lfluk::GetSKZPWeight(const Lfluk::ParticleType_t particle, const double pT, const double xF)
00601 {
00602 double weight = 1.0;
00603 double A,B,C;
00604 long double Ap,Bp,Cp;
00605
00606 if (particle==kPiPlus)
00607 {
00608
00609 if (pT>=0.03)
00610 {
00611
00612
00613
00614 A = Lfluk::GetSKZPA(particle, xF);
00615 B = Lfluk::GetSKZPB(particle, xF);
00616 C = Lfluk::GetSKZPC(particle, xF);
00617
00618 Lfluk::SkewSKZP(xF, A, B, C, Ap, Bp, Cp);
00619
00620 if(Cp < -100.0) Cp = -100.0;
00621 if(Cp > 100.0) Cp = 100.0;
00622 weight=(Ap+Bp*pT)/(A+B*pT)*exp(-(Cp-C)*pow(pT,3./2.));
00623 }
00624 else
00625 {
00626 weight = Lfluk::GetSKZPWeight(particle, 0.031, xF);
00627 }
00628 }
00629 else if (particle==kKPlus)
00630 {
00631 weight = 1.0;
00632 }
00633 else if (particle==kPiMinus)
00634 {
00635 weight = 1.0;
00636 }
00637 else if (particle==kKMinus)
00638 {
00639 weight = 1.0;
00640 }
00641
00642 return weight;
00643 }
00644
00645
00646 double Lfluk::GetSKPCWeight(const Lfluk::ParticleType_t particle, const double pT, const double xF)
00647 {
00648 double weight = 1.0;
00649 double A, B, C, D, E;
00650 double Ap, Bp, Cp, Dp, Ep;
00651
00652 if (particle==kPiPlus)
00653 {
00654 if (pT>=0.03)
00655 {
00656 A = Lfluk::GetSKPCA(particle, xF);
00657 B = Lfluk::GetSKPCB(particle, xF);
00658 C = Lfluk::GetSKPCC(particle, xF);
00659 D = Lfluk::GetSKPCD(particle, xF);
00660 E = Lfluk::GetSKPCE(particle, xF);
00661
00662 Lfluk::SkewSKPC(xF, A, B, C, D, E, Ap, Bp, Cp, Dp, Ep);
00663
00664 if(Ep < -20.0) Ep = -20.0;
00665 double arg = -Dp*std::pow(pT,Ep)+D*std::pow(pT,E);
00666 if(arg > 100.0) arg = 100.0;
00667 if(arg < -100.0) arg = -100.0;
00668 weight=(Ap+Bp*pT+Cp*pT*pT)/(A+B*pT+C*pT*pT)*std::exp(arg);
00669 }
00670 else
00671 {
00672 weight = Lfluk::GetSKPCWeight(particle, 0.031, xF);
00673 }
00674 }
00675 else if (particle==kKPlus)
00676 {
00677 weight = 1.0;
00678 }
00679 else if (particle==kPiMinus)
00680 {
00681 weight = 1.0;
00682 }
00683 else if (particle==kKMinus)
00684 {
00685 weight = 1.0;
00686 }
00687
00688 return weight;
00689 }
00690
00691
00692 double Lfluk::GetQuadWeight(const Lfluk::ParticleType_t particle, const double pT, const double xF)
00693 {
00694 double weight = 1.0;
00695
00696 if(particle == kPiPlus)
00697 {
00698 if(fParam == "quad0")
00699 {
00700 if(fPar.size() != 9)
00701 {
00702 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 9: npars = " << fPar.size() << endl;
00703 }
00704 else
00705 {
00706 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00707 + fPar[3]*pT + fPar[4]*pT*xF + fPar[5]*pT*xF*xF
00708 + fPar[6]*pT*pT + fPar[7]*pT*pT*xF + fPar[8]*pT*pT*xF*xF;
00709 }
00710 }
00711 else if(fParam == "quad1")
00712 {
00713 if(fPar.size() != 8)
00714 {
00715 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00716 }
00717 else
00718 {
00719 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00720 + fPar[3]*pT + fPar[4]*pT*xF + fPar[5]*pT*xF*xF
00721 + fPar[6]*pT*pT + fPar[7]*pT*pT*xF ;
00722 }
00723 }
00724 else if(fParam == "quad2")
00725 {
00726 if(fPar.size() != 8)
00727 {
00728 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00729 }
00730 else
00731 {
00732 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00733 + fPar[3]*pT + fPar[4]*pT*xF + fPar[5]*pT*xF*xF
00734 + fPar[6]*pT*pT + fPar[7]*pT*pT*xF*xF;
00735 }
00736 }
00737 else if(fParam == "quad3")
00738 {
00739 if(fPar.size() != 8)
00740 {
00741 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00742 }
00743 else
00744 {
00745 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00746 + fPar[3]*pT + fPar[4]*pT*xF + fPar[5]*pT*xF*xF
00747 + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00748 }
00749 }
00750 else if(fParam == "quad4")
00751 {
00752 if(fPar.size() != 8)
00753 {
00754 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00755 }
00756 else
00757 {
00758 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00759 + fPar[3]*pT + fPar[4]*pT*xF
00760 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00761 }
00762 }
00763 else if(fParam == "quad5")
00764 {
00765 if(fPar.size() != 8)
00766 {
00767 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00768 }
00769 else
00770 {
00771 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00772 + fPar[3]*pT + fPar[4]*pT*xF*xF
00773 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00774 }
00775 }
00776 else if(fParam == "quad6")
00777 {
00778 if(fPar.size() != 8)
00779 {
00780 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00781 }
00782 else
00783 {
00784 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00785 + fPar[3]*pT*xF + fPar[4]*pT*xF*xF
00786 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00787 }
00788 }
00789 else if(fParam == "quad7")
00790 {
00791 if(fPar.size() != 8)
00792 {
00793 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00794 }
00795 else
00796 {
00797 weight = fPar[0] + fPar[1]*xF
00798 + fPar[2]*pT + fPar[3]*pT*xF + fPar[4]*pT*xF*xF
00799 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00800 }
00801 }
00802 else if(fParam == "quad8")
00803 {
00804 if(fPar.size() != 8)
00805 {
00806 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00807 }
00808 else
00809 {
00810 weight = fPar[0] + fPar[1]*xF*xF
00811 + fPar[2]*pT + fPar[3]*pT*xF + fPar[4]*pT*xF*xF
00812 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00813 }
00814 }
00815 else if(fParam == "quad9")
00816 {
00817 if(fPar.size() != 8)
00818 {
00819 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 8: npars = " << fPar.size() << endl;
00820 }
00821 else
00822 {
00823 weight = fPar[0]*xF + fPar[1]*xF*xF
00824 + fPar[2]*pT + fPar[3]*pT*xF + fPar[4]*pT*xF*xF
00825 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF + fPar[7]*pT*pT*xF*xF;
00826 }
00827 }
00828 else if(fParam == "quad124")
00829 {
00830 if(fPar.size() != 6)
00831 {
00832 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 7: npars = " << fPar.size() << endl;
00833 }
00834 else
00835 {
00836 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00837 + fPar[3]*pT + fPar[4]*pT*xF
00838 + fPar[5]*pT*pT ;
00839 }
00840 }
00841 else if(fParam == "quad134")
00842 {
00843 if(fPar.size() != 6)
00844 {
00845 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 7: npars = " << fPar.size() << endl;
00846 }
00847 else
00848 {
00849 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00850 + fPar[3]*pT + fPar[4]*pT*xF
00851 + fPar[5]*pT*pT*xF ;
00852 }
00853 }
00854 else if(fParam == "quad1234")
00855 {
00856 if(fPar.size() != 5)
00857 {
00858 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 7: npars = " << fPar.size() << endl;
00859 }
00860 else
00861 {
00862 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00863 + fPar[3]*pT + fPar[4]*pT*xF ;
00864 }
00865 }
00866 else if(fParam == "quad14")
00867 {
00868 if(fPar.size() != 7)
00869 {
00870 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 7: npars = " << fPar.size() << endl;
00871 }
00872 else
00873 {
00874 weight = fPar[0] + fPar[1]*xF + fPar[2]*xF*xF
00875 + fPar[3]*pT + fPar[4]*pT*xF
00876 + fPar[5]*pT*pT + fPar[6]*pT*pT*xF ;
00877 }
00878 }
00879 else if(fParam == "quad147")
00880 {
00881 if(fPar.size() != 6)
00882 {
00883 cerr << "Problem in Lfluk::GetQuadWeight - Number of pars is not 6: npars = " << fPar.size() << endl;
00884 }
00885 else
00886 {
00887 weight = fPar[0] + fPar[1]*xF
00888 + fPar[2]*pT + fPar[3]*pT*xF
00889 + fPar[4]*pT*pT + fPar[5]*pT*pT*xF ;
00890 }
00891 }
00892 else
00893 {
00894 cerr << "Problem in Lfluk::GetQuadWeight - Not a valid Parameterization " << fParam << endl;
00895 }
00896
00897
00898 }
00899
00900
00901 return weight;
00902 }
00903
00904
00905 double Lfluk::GetMeanPTWeight(const Lfluk::ParticleType_t particle, const double pT, const double xF)
00906 {
00907 double weight = 1.0;
00908
00909 if(particle == kPiPlus)
00910 {
00911 if(fPar.size() != 5)
00912 {
00913 cout << "Problem in Lfluk::GetMeanPTWeight - Number of pars is not 4: npars = " << fPar.size() << endl;
00914 }
00915 else
00916 {
00917 double linxF = fPar[3]+fPar[4]*xF;
00918 if(linxF == 0.0)
00919 {
00920 linxF = 1e-20;
00921 }
00922 double exparg = fPar[2]*pT / linxF;
00923 if(exparg > 100.0) exparg = 100.0;
00924 if(exparg < -100.0) exparg = -100.0;
00925 weight = (fPar[0] + fPar[1]*xF) * exp(exparg);
00926 }
00927 }
00928
00929
00930
00931 return weight;
00932 }
00933
00934
00935 void Lfluk::SkewSKPC(const double xF, const double A, const double B, const double C,
00936 const double D, const double E, double &Ap, double &Bp, double &Cp,
00937 double &Dp, double &Ep)
00938 {
00939
00940 if(fSkew.find("lin") != string::npos)
00941 {
00942 if(fPar.size() == 10)
00943 {
00944 Ap=(fPar[0]+fPar[1]*xF)*A;
00945 Bp=(fPar[2]+fPar[3]*xF)*B;
00946 Cp=(fPar[4]+fPar[5]*xF)*C;
00947 Dp=(fPar[6]+fPar[7]*xF)*D;
00948 Ep=(fPar[8]+fPar[9]*xF)*E;
00949
00950 return;
00951 }
00952 }
00953
00954 if(fSkew.find("quad") != string::npos)
00955 {
00956 if(fPar.size() == 15)
00957 {
00958 Ap=(fPar[0]+fPar[1]*xF+fPar[2]*xF*xF)*A;
00959 Bp=(fPar[3]+fPar[4]*xF+fPar[5]*xF*xF)*B;
00960 Cp=(fPar[6]+fPar[7]*xF+fPar[8]*xF*xF)*C;
00961 Dp=(fPar[9]+fPar[10]*xF+fPar[11]*xF*xF)*D;
00962 Ep=(fPar[12]+fPar[13]*xF+fPar[14]*xF*xF)*E;
00963
00964 return;
00965 }
00966 }
00967
00968 cout << "Lfluk::SkewSKPC() - No valid skew option or wrong number of parameters" << endl
00969 << " fSkew = " << fSkew << endl
00970 << " NPars = " << fPar.size() << endl;
00971
00972 Ap = A;
00973 Bp = B;
00974 Cp = C;
00975 Dp = D;
00976 Ep = E;
00977
00978 }
00979
00980
00981 void Lfluk::SkewSKZP(const double xF, const double A, const double B, const double C, long double &Ap, long double &Bp, long double &Cp)
00982 {
00983
00984
00985 if(fSkew.find("fluka") != string::npos)
00986 {
00987 if(fPar.size() == 15)
00988 {
00989 Ap= fPar[0]*pow((1.-xF),fPar[1])*(1.+fPar[2]*xF)*pow(xF,fPar[3]);
00990 Bp= fPar[4]*pow((1.-xF),fPar[5])*(1.+fPar[6]*xF)*pow(xF,fPar[7]);
00991
00992 if (xF<0.22)
00993 {
00994 Cp= fPar[8]/pow(xF,fPar[9])+fPar[10];
00995 }
00996 else
00997 {
00998 double arg22 = (0.22-fPar[11])*fPar[12];
00999 if(arg22 < -100.0) arg22 = -100.0;
01000 if(arg22 > 100.0) arg22 = 100.0;
01001 double match = (fPar[8]/pow(0.22,fPar[9])+fPar[10]-
01002 fPar[13]*0.22-fPar[14])*exp(arg22);
01003 double exparg = (xF-fPar[11])*fPar[12];
01004 if(exparg < -100.0) exparg = -100.0;
01005 if(exparg > 100.0) exparg = 100.0;
01006 Cp = ( match / exp(exparg)) + fPar[13]*xF+fPar[14];
01007
01008 }
01009
01010 return;
01011 }
01012 }
01013
01014 if(fSkew.find("lin") != string::npos)
01015 {
01016 if(fPar.size() == 6)
01017 {
01018 Ap=(fPar[0]+fPar[1]*xF)*A;
01019 Bp=(fPar[2]+fPar[3]*xF)*B;
01020 Cp=(fPar[4]+fPar[5]*xF)*C;
01021
01022 return;
01023 }
01024 }
01025
01026 if(fSkew.find("quad") != string::npos)
01027 {
01028 if(fPar.size() == 9)
01029 {
01030 Ap=(fPar[0]+fPar[1]*xF+fPar[2]*xF*xF)*A;
01031 Bp=(fPar[3]+fPar[4]*xF+fPar[5]*xF*xF)*B;
01032 Cp=(fPar[6]+fPar[7]*xF+fPar[8]*xF*xF)*C;
01033
01034 return;
01035 }
01036 }
01037
01038 cout << "Lfluk::SkewSKZP() - No valid skew option or wrong number of parameters" << endl
01039 << " fSkew = " << fSkew << endl
01040 << " NPars = " << fPar.size() << endl;
01041
01042 Ap = A;
01043 Bp = B;
01044 Cp = C;
01045
01046 }
01047
01048
01049
01050 double Lfluk::GetSKZPA(const Lfluk::ParticleType_t particle, const double xf) const
01051 {
01052
01053 switch (particle)
01054 {
01055 case kPiPlus:
01056 return -0.007607*std::pow(1.0-xf, 4.045)*(1.0+0.9620e+4*xf)*std::pow(xf, -2.975);
01057 case kPiMinus:
01058 return -0.006306*std::pow(1.0-xf, 5.730)*(1.0+0.1365e+5*xf)*std::pow(xf, -2.900);
01059 case kKPlus:
01060 return -0.005187*std::pow(1.0-xf, 4.119)*(1.0+0.2170e+4*xf)*std::pow(xf, -2.767);
01061 case kKMinus:
01062 return -8.854 *std::pow(1.0-xf, 6.778)*(1.0-0.6050 *xf)*std::pow(xf, -1.827);
01063 default:
01064 break;
01065 }
01066
01067 return 1.0;
01068 }
01069
01070
01071 double Lfluk::GetSKZPB(const Lfluk::ParticleType_t particle, const double xf) const
01072 {
01073 switch (particle)
01074 {
01075 case kPiPlus:
01076 return 0.05465*std::pow(1.0-xf, 2.675)*(1.0+0.6959e+5*xf)*std::pow(xf, -3.144);
01077 case kPiMinus:
01078 return 0.04608*std::pow(1.0-xf, 3.291)*(1.0+0.5857e+5*xf)*std::pow(xf, -3.209);
01079 case kKPlus:
01080 return 0.4918 *std::pow(1.0-xf, 2.672)*(1.0+0.1373e+4*xf)*std::pow(xf, -2.927);
01081 case kKMinus:
01082 return 0.02857*std::pow(1.0-xf, 7.494)*(1.0+0.5879e+5*xf)*std::pow(xf, -2.577);
01083 default:
01084 break;
01085 }
01086
01087 return 0.0;
01088 }
01089
01090
01091 double Lfluk::GetSKZPC(const Lfluk::ParticleType_t particle, const double xf) const
01092 {
01093 if (xf<0.22)
01094 {
01095 switch (particle)
01096 {
01097 case kPiPlus:
01098 return -7.058/std::pow(xf, -0.1419 ) + 9.188;
01099 case kPiMinus:
01100 return -16.52 /std::pow(xf, -0.06204) + 18.12;
01101 case kKPlus:
01102 return -16.10 /std::pow(xf, -0.04582) + 17.92;
01103 case kKMinus:
01104 return -16.13 /std::pow(xf, -0.05678) + 17.39;
01105 default:
01106 break;
01107 }
01108 }
01109 else
01110 {
01111 switch (particle)
01112 {
01113 case kPiPlus:
01114 return 3.008/std::exp((xf-0.1948)*3.577) + 2.616 *xf + 0.1225;
01115 case kPiMinus:
01116 return 2.972/std::exp((xf-0.1758)*2.266) + 1.730 *xf + 0.04196;
01117 case kKPlus:
01118 return 6.905/std::exp((xf+0.1630)*6.718) - 0.4257*xf + 2.486;
01119 case kKMinus:
01120 return 3.916/std::exp((xf-4.615) *0.03255) - 4.702 *xf + 0.4062;
01121 default:
01122 break;
01123 }
01124 }
01125
01126
01127 return 0.0;
01128 }
01129
01130
01131
01132 void Lfluk::RecalculateWeights()
01133 {
01134
01135 if (isFirst) {
01136 for (int i=0;i<121;i++) {
01137 fKPiRatio[i]=1.;
01138 fPiRatio[i]=1.;
01139 }
01140 }
01141 for (std::vector<ParticleType_t>::iterator itPlist=fPlist.begin();
01142 itPlist!=fPlist.end(); itPlist++)
01143 {
01144 double xf,pt;
01145 double meanpt(0.);
01146 double sum(0.);
01147 const int nbinsx = fPTXF[*itPlist]->GetNbinsX();
01148 const int nbinsy = fPTXF[*itPlist]->GetNbinsY();
01149 for (int i=0;i<=nbinsx+1;i++)
01150 {
01151 for (int j=0;j<=nbinsy+1;j++)
01152 {
01153 xf=fPTXF[*itPlist]->GetXaxis()->GetBinCenter(i);
01154 pt=fPTXF[*itPlist]->GetYaxis()->GetBinCenter(j);
01155 double weight = CalcWeight(*itPlist,pt,xf);
01156
01157 fWeightedPTXF[*itPlist]
01158 ->SetBinContent(i,j,(fPTXF[*itPlist]->GetBinContent(i,j)
01159 *weight));
01160
01161 Lfluk::ParticleType_t eptype= *itPlist;
01162 string name = GetParticleName(eptype);
01163 fWeightHist[*itPlist]->SetBinContent(i,j,weight);
01164 if(weight - fWeightHist[*itPlist]->GetBinContent(i,j) != 0)
01165
01166 {
01167 cout << "Lfluk::RecalculateWeights(): name = " << name << " pz = " << xf << " pt = " << pt
01168 << " weight from calc = " << setprecision(10) << weight << " weight from hist = "
01169 << fWeightHist[*itPlist]->GetBinContent(i,j)
01170 << " diff = " << weight - fWeightHist[*itPlist]->GetBinContent(i,j) << endl;
01171 }
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185 if(j == nbinsy+1) continue;
01186 meanpt+=fWeightedPTXF[*itPlist]->GetBinContent(i,j)*pt;
01187 sum+=fWeightedPTXF[*itPlist]->GetBinContent(i,j);
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199 }
01200 }
01201
01202 meanpt/=sum;
01203 fWeightedMeanPT[*itPlist]=meanpt*1000.;
01204 fNWeighted[*itPlist]=sum;
01205 meanpt=0.;
01206 sum=0.;
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
01236
01237 }
01238
01239
01240 if (isFirst)
01241 {
01242 isFirst=false;
01243 const TH1D* piplus=dynamic_cast<TH1D*> (GetReweightedPTXF(8)
01244 ->ProjectionX()->Clone("piplus"));
01245 const TH1D* piminus=dynamic_cast<TH1D*> (GetReweightedPTXF(9)
01246 ->ProjectionX()->Clone("piminus"));
01247 TH1D* kplus_f05=dynamic_cast<TH1D*> (GetReweightedPTXF(11)
01248 ->ProjectionX()->Clone("kplus_f05"));
01249 TH1D* piplus_rat=dynamic_cast<TH1D*> (GetReweightedPTXF(8)
01250 ->ProjectionX()->Clone("piplus_f05"));
01251
01252
01253
01254 piplus_rat -> Divide(piplus, piminus);
01255
01256
01257
01258 kplus_f05->Divide(piplus);
01259
01260
01261
01262 for (int i=1;i<121;i++)
01263 {
01264 if (kplus_f05->GetBinContent(i)!=0)
01265 {
01266 fKPiRatio[i] = (fFluka05KPiRatio[i]*fKPiRatScale)/kplus_f05->GetBinContent(i);
01267 }
01268
01269 if (piplus_rat->GetBinContent(i)!=0)
01270 {
01271 if(fUseFlukPi && fFluka05PiRatio[i] != 0) fPiRatio[i] = piplus_rat->GetBinContent(i)/fFluka05PiRatio[i];
01272 else fPiRatio[i] = piplus_rat->GetBinContent(i)/fNA49pirat->Eval(piplus_rat->GetBinCenter(i));
01273
01274 }
01275
01276
01277
01278
01279
01280
01281
01282
01283 }
01284 delete piplus;
01285 piplus=0;
01286 delete piminus;
01287 piminus=0;
01288 delete kplus_f05;
01289 kplus_f05=0;
01290 delete piplus_rat;
01291 piplus_rat = 0;
01292
01293 RecalculateWeights();
01294 }
01295
01296 }
01297
01298
01299 double Lfluk::GetPTshift(int ptype, double pz_low, double pz_up)
01300 {
01301
01302
01303
01304
01305 Lfluk::ParticleType_t eptype=GetParticleEnum(ptype);
01306 if (fPTXF.find(eptype)==fPTXF.end()) return 0.;
01307
01308 if (pz_low==0.&&pz_up==120.) return fWeightedMeanPT[eptype]-fMeanPT[eptype];
01309
01310 int xlow=int(pz_low+1.);
01311 int xup=int(pz_up+1.);
01312
01313 double pt;
01314 double meanpt(0.);
01315 double sum(0.);
01316 for (int i=xlow;i<xup;i++) {
01317 for (int j=1;j<51;j++) {
01318 pt=0.02*j-0.01;
01319 meanpt+=fWeightedPTXF[eptype]->GetBinContent(i,j)*pt;
01320 sum+=fWeightedPTXF[eptype]->GetBinContent(i,j);
01321 }
01322 }
01323 meanpt/=sum;
01324 meanpt*=1000.;
01325
01326 return meanpt-fMeanPT[eptype];
01327
01328 }
01329
01330 double Lfluk::GetNFrac(int ptype, double pz_low, double pz_up, double pt_low, double pt_up)
01331 {
01332
01333
01334
01335 Lfluk::ParticleType_t eptype=GetParticleEnum(ptype);
01336 if (fPTXF.find(eptype)==fPTXF.end()) return 1.;
01337
01338 int xlow=int(pz_low+1.);
01339 int xup=int(pz_up+1.);
01340 int ylow=int(50.*pt_low+1.);
01341 int yup=int(50.*pt_up+1.);
01342
01343 double wsum(0.);
01344 double sum(0.);
01345 for (int i=xlow;i<xup;i++) {
01346 for (int j=ylow;j<yup;j++) {
01347 sum+=fPTXF[eptype]->GetBinContent(i,j);
01348 wsum+=fWeightedPTXF[eptype]->GetBinContent(i,j);
01349 }
01350 }
01351
01352 return wsum/sum;
01353 }
01354
01355
01356 std::string Lfluk::GetParticleName(Lfluk::ParticleType_t ptype)
01357 {
01358 switch (ptype)
01359 {
01360 case kPiPlus: return "PiPlus"; break;
01361 case kPiMinus: return "PiMinus"; break;
01362 case kKPlus: return "KPlus"; break;
01363 case kKMinus: return "KMinus"; break;
01364 case kK0L: return "K0L"; break;
01365 case kUnknown: return "Unknown"; break;
01366 default: return "Unknown"; break;
01367 }
01368
01369 return "Unknown";
01370 }
01371
01372
01373 Lfluk::ParticleType_t Lfluk::GetParticleEnum(const std::string &ptype)
01374 {
01375 if (ptype == "PiPlus") return kPiPlus;
01376 else if(ptype == "PiMinus") return kPiMinus;
01377 else if(ptype == "KPlus") return kKPlus;
01378 else if(ptype == "KMinus") return kKMinus;
01379 else return kUnknown;
01380 }
01381
01382
01383 Lfluk::ParticleType_t Lfluk::GetParticleEnum(int ptype)
01384 {
01385 switch (ptype)
01386 {
01387 case 8 : return kPiPlus; break;
01388 case 211 : return kPiPlus; break;
01389 case 9 : return kPiMinus; break;
01390 case -211: return kPiMinus; break;
01391 case 11 : return kKPlus; break;
01392 case 321 : return kKPlus; break;
01393 case 12 : return kKMinus; break;
01394 case -321: return kKMinus; break;
01395 case 10 : return kK0L; break;
01396 case 130 : return kK0L; break;
01397 default: return kUnknown; break;
01398 }
01399 return kUnknown;
01400
01401 }
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411 double Lfluk::GetSKPCA(const Lfluk::ParticleType_t particle, const double xf) const
01412 {
01413 if (xf<0.25)
01414 {
01415
01416
01417
01418 switch (particle)
01419 {
01420 case kPiPlus:
01421 return 0.0462498*std::pow(1.0-xf, 20.8206)*(1.0+11911.3*xf)*std::pow(xf, -1.0*0.96808);
01422 case kPiMinus:
01423 break;
01424 case kKPlus:
01425 break;
01426 case kKMinus:
01427 break;
01428 default:
01429 break;
01430 }
01431 }
01432 else
01433 {
01434
01435
01436
01437 switch (particle)
01438 {
01439 case kPiPlus:
01440 return 1250.0*(1.0-xf)*std::exp(-13.6097*std::pow(xf, 0.597619));
01441 case kPiMinus:
01442 break;
01443 case kKPlus:
01444 break;
01445 case kKMinus:
01446 break;
01447 default:
01448 break;
01449 }
01450 }
01451
01452 return 1.0;
01453
01454 }
01455
01456
01457 double Lfluk::GetSKPCB(const Lfluk::ParticleType_t particle, const double xf) const
01458 {
01459
01460
01461
01462
01463
01464 switch (particle)
01465 {
01466 case kPiPlus:
01467 return 3.31629*std::pow(1.0-xf, 2.48421)*(1.0+22.7285*xf)*std::pow(xf, -1.0*2.38778);
01468 case kPiMinus:
01469 break;
01470 case kKPlus:
01471 break;
01472 case kKMinus:
01473 break;
01474 default:
01475 break;
01476 }
01477
01478 return 0.0;
01479 }
01480
01481
01482 double Lfluk::GetSKPCC(const Lfluk::ParticleType_t particle, const double xf) const
01483 {
01484 if (xf<0.35)
01485 {
01486
01487
01488
01489 switch (particle)
01490 {
01491 case kPiPlus:
01492 return 0.074085*std::pow(1.0-xf, 11.2413)*(1.0+168369.0*xf)*std::pow(xf, -1.0*2.47553);
01493 case kPiMinus:
01494 break;
01495 case kKPlus:
01496 break;
01497 case kKMinus:
01498 break;
01499 default:
01500 break;
01501 }
01502 }
01503 else
01504 {
01505
01506
01507
01508 switch (particle)
01509 {
01510 case kPiPlus:
01511 return 49071.3*(1.0-xf)*std::exp(-12.1073*xf);
01512 case kPiMinus:
01513 break;
01514 case kKPlus:
01515 break;
01516 case kKMinus:
01517 break;
01518 default:
01519 break;
01520 }
01521 }
01522
01523
01524 return 0.0;
01525 }
01526
01527
01528 double Lfluk::GetSKPCD(const Lfluk::ParticleType_t particle, const double xf) const
01529 {
01530 if (xf<0.1)
01531 {
01532
01533
01534
01535 switch (particle)
01536 {
01537 case kPiPlus:
01538 return 35.8788*std::exp(-1.95477*std::pow(xf, 0.0638124));
01539 case kPiMinus:
01540 break;
01541 case kKPlus:
01542 break;
01543 case kKMinus:
01544 break;
01545 default:
01546 break;
01547 }
01548 }
01549 else
01550 {
01551
01552
01553
01554 switch (particle)
01555 {
01556 case kPiPlus:
01557 return 7.47623 + -7.35376*xf + -14.6949*xf*xf + 22.7689*xf*xf*xf;
01558 case kPiMinus:
01559 break;
01560 case kKPlus:
01561 break;
01562 case kKMinus:
01563 break;
01564 default:
01565 break;
01566 }
01567 }
01568
01569
01570 return 0.0;
01571
01572 }
01573
01574
01575 double Lfluk::GetSKPCE(const Lfluk::ParticleType_t particle, const double xf) const
01576 {
01577 if (xf<0.25)
01578 {
01579
01580
01581
01582 switch (particle)
01583 {
01584 case kPiPlus:
01585 return 3.88469*std::exp(-6.20932*std::pow(xf, 0.26879))*(1.29961 + 53.0232*xf + 121.575*xf*xf);
01586 case kPiMinus:
01587 break;
01588 case kKPlus:
01589 break;
01590 case kKMinus:
01591 break;
01592 default:
01593 break;
01594 }
01595 }
01596 else
01597 {
01598
01599
01600
01601 switch (particle)
01602 {
01603 case kPiPlus:
01604 return (-0.26414 + 1.87321*xf)/std::pow(xf, 1.28207);
01605 case kPiMinus:
01606 break;
01607 case kKPlus:
01608 break;
01609 case kKMinus:
01610 break;
01611 default:
01612 break;
01613 }
01614 }
01615
01616
01617 return 0.0;
01618
01619 }