00001 #include <TMath.h>
00002 #include <cmath>
00003 #include <vector>
00004 #include <iostream>
00005 #include "TGraphErrors.h"
00006
00007 #include "DedxCalibAlg/DedxCalibParameters.h"
00008
00009 extern "C"
00010 {
00011 float vavset_ (double *, double *, int*);
00012 float vavden_ (double *);
00013 float prob_ (float *, int*);
00014 }
00015
00016
00017 double mylan(double *x, double *par)
00018 {
00019 double kk=(x[0]-par[1])/par[2];
00020 double fterm=kk+exp(-1*kk);
00021 double fitval=par[0]*exp(par[3]*fterm);
00022 return fitval;
00023 }
00024
00025 double landaun(double *x, double *par)
00026 {
00027
00028 double kk=(x[0]-par[1])/par[2];
00029 double fterm=kk+exp(-1*kk);
00030 double fitval=par[0]*exp(-0.5*fterm);
00031 return fitval;
00032 }
00033
00034 double Landau(double *x, double *par)
00035 {
00036 double fitval = TMath::Landau(x[0], par[0], par[1], kFALSE);
00037 return fitval;
00038 }
00039
00040
00041 double Vavilov(double *x, double *par)
00042 {
00043 double kappa, beta2;
00044 int mode = 0;
00045 vavset_(&par[0], &par[1], &mode);
00046 double fitval = vavden_(&x[0]);
00047 return fitval;
00048 }
00049
00050 double AsymGauss(double *x, double *par)
00051 {
00052 double delta, a, b, c, d, fitval;
00053 a = TMath::Sqrt(log(4.0));
00054 b = (x[0]-par[1])/par[2];
00055 c = TMath::Power(par[3],2.0);
00056 delta = (1+ TMath::SinH(par[3]*a)/a)*b;
00057 d = TMath::Power(log(delta),2.0)/c+c;
00058 fitval = par[0]*TMath::Exp(-0.5*d);
00059 return fitval;
00060 }
00061
00062
00063 void dedx_pid_exp_old( int landau, int runflag, float dedx,
00064 int Nohit, float mom, float theta, float t0, float lsamp,
00065 double dedx_exp[5], double ex_sigma[5],
00066 double pid_prob[5], double chi_dedx[5] )
00067 {
00068 double par[5], sigma_par[4], sigma_index_nhit, sigma_index_sin;
00069
00070 if(runflag==1) {
00071 par[0]= HV1_curvep0;
00072 par[1]= HV1_curvep1;
00073 par[2]= HV1_curvep2;
00074 par[3]= HV1_curvep3;
00075 par[4]= HV1_curvep4;
00076 sigma_par[0] = HV1_sigmap0;
00077 sigma_par[1] = HV1_sigmap1;
00078 sigma_par[2] = HV1_sigmap2;
00079 sigma_par[3] = HV1_sigmap3;
00080 sigma_index_nhit = HV1_index_nhit;
00081 sigma_index_sin = HV1_index_sin;
00082 }
00083 else if(runflag==2) {
00084 par[0]= HV2_curvep0;
00085 par[1]= HV2_curvep1;
00086 par[2]= HV2_curvep2;
00087 par[3]= HV2_curvep3;
00088 par[4]= HV2_curvep4;
00089 sigma_par[0] = HV2_sigmap0;
00090 sigma_par[1] = HV2_sigmap1;
00091 sigma_par[2] = HV2_sigmap2;
00092 sigma_par[3] = HV2_sigmap3;
00093 sigma_index_nhit = HV2_index_nhit;
00094 sigma_index_sin = HV2_index_sin;
00095 }
00096
00097 const int par_cand( 5 );
00098 const float Charge_Mass[par_cand] = {0.00051100, 0.10566, 0.13957, 0.4937, 0.93827 };
00099 double beta_G, beta, betterm, bethe_B, sig_param;
00100
00101 int Nmax_prob( 0 );
00102 float max_prob( -0.01 );
00103 int ndf;
00104 float chi2;
00105
00106 for( int it = 0; it < par_cand; it++ ) {
00107 beta_G = mom/Charge_Mass[it];
00108 beta = beta_G/sqrt(1+(beta_G)*(beta_G));
00109 betterm = par[1]-log(par[2]+pow(1/beta_G,par[4]));
00110 bethe_B = par[0]/pow(beta,par[3])*betterm-par[0];
00111
00112 if( Nohit >0 ) {
00113 dedx_exp[it] = bethe_B;
00114 double sig_the=std::sin( (double)theta );
00115
00116 if(runflag <3 && runflag>0){
00117 if(landau == 0) {
00118 sig_param = 1.6*std::sin( (double) theta )/(lsamp*double(Nohit));
00119 ex_sigma[it] = 0.05*bethe_B*sqrt( 50.0*sig_param );
00120 }
00121 else {
00122
00123 if(beta_G < 4) {
00124 sig_param=sigma_par[1]+sigma_par[2]*std::pow(beta_G,sigma_par[3]);
00125 } else {
00126 sig_param= sigma_par[0];
00127 }
00128
00129 sig_the=std::pow(sig_the,sigma_index_sin);
00130 double sig_n;
00131 sig_n=35.0/double(Nohit);
00132 sig_n=std::pow(sig_n,sigma_index_nhit);
00133 ex_sigma[it]=sig_param*sig_the*sig_n;
00134 }
00135 }
00136
00137 double dedx_correc;
00138 if(runflag == 2 ) dedx_correc = SpaceChargeCorrec(theta, mom, it, dedx);
00139 else dedx_correc = dedx;
00140 chi_dedx[it] = (dedx_correc - dedx_exp[it])/ex_sigma[it];
00141 chi2 = chi_dedx[it]*chi_dedx[it];
00142 ndf = 1;
00143 pid_prob[it] = prob_(&chi2,&ndf);
00144
00145
00146 if( it == -999 ){
00147 std::cout << " mom = " << mom <<"exp"<< dedx_exp[it]
00148 << " sigma "<<ex_sigma[it] <<" prob "<<pid_prob[it]
00149 << std::endl;
00150 }
00151 if( pid_prob[it] > max_prob ) {
00152 max_prob = pid_prob[it];
00153 Nmax_prob = it;
00154 }
00155 }
00156 else {
00157 dedx_exp[it] = 0.0;
00158 ex_sigma[it] = 1000.0;
00159 pid_prob[it] = 0.0;
00160 chi_dedx[it] = 999.0;
00161 }
00162 }
00163 }
00164
00165 void dedx_pid_exp(int vflag[3], float dedx, int trkalg,
00166 int Nohit, float mom, float theta, float t0, float lsamp,
00167 double dedx_exp[5], double ex_sigma[5],
00168 double pid_prob[5], double chi_dedx[5],
00169 std::vector<double> & par, std::vector<double> & sig_par)
00170 {
00171 const int par_cand( 5 );
00172 const float Charge_Mass[par_cand] = {0.00051100, 0.10566, 0.13957, 0.4937, 0.93827 };
00173 double beta_G, beta, betterm, bethe_B;
00174
00175 int dedxflag = vflag[0];
00176 int sigmaflag = vflag[1];
00177 bool ifMC = false;
00178 if(vflag[2] == 1) ifMC = true;
00179
00180 int Nmax_prob(0);
00181 float max_prob(-0.01);
00182 int ndf;
00183 float chi2;
00184
00185 for( int it = 0; it < par_cand; it++ ) {
00186 beta_G = mom/Charge_Mass[it];
00187
00188 if(dedxflag == 1){
00189 beta = beta_G/sqrt(1+(beta_G)*(beta_G));
00190 betterm = par[1]-log(par[2]+pow(1/beta_G,par[4]));
00191 bethe_B = par[0]/pow(beta,par[3])*betterm-par[0];
00192 }
00193 else if(dedxflag == 2) {
00194 double A=0, B=0,C=0;
00195 double x = beta_G;
00196 if(x<4.5)
00197 A=1;
00198 else if(x<10)
00199 B=1;
00200 else
00201 C=1;
00202 double partA = par[0]*pow(sqrt(x*x+1),par[2])/pow(x,par[2])*(par[1]-par[5]*log(pow(1/x,par[3])) ) - par[4]+exp(par[6]+par[7]*x);
00203 double partB = par[8]*pow(x,3)+par[9]*pow(x,2)+par[10]*x+par[11];
00204 double partC = -par[12]*log(par[15]+pow(1/x,par[13]))+par[14];
00205 bethe_B = 550*(A*partA+B*partB+C*partC);
00206
00207 if(beta_G> 100) bethe_B=550*1.0;
00208 }
00209
00210 if (ifMC) {
00211 double A=0, B=0,C=0;
00212 double x = beta_G;
00213 if(x<4.5)
00214 A=1;
00215 else if(x<10)
00216 B=1;
00217 else
00218 C=1;
00219 double partA = par[0]*pow(sqrt(x*x+1),par[2])/pow(x,par[2])*(par[1]-par[5]*log(pow(1/x,par[3])) ) - par[4]+exp(par[6]+par[7]*x);
00220 double partB = par[8]*pow(x,3)+par[9]*pow(x,2)+par[10]*x+par[11];
00221 double partC = -par[12]*log(par[15]+pow(1/x,par[13]))+par[14];
00222 bethe_B = 550*(A*partA+B*partB+C*partC);
00223
00224 if(beta_G> 100) bethe_B=550*1.0;
00225 }
00226
00227
00228 if (Nohit > 0) {
00229 dedx_exp[it] = bethe_B;
00230 double sig_the = std::sin((double)theta);
00231 double f_betagamma, g_sinth, h_nhit, i_t0;
00232
00233 if (ifMC) {
00234
00235 double x= beta_G;
00236 double nhit = (double)Nohit;
00237 double sigma_bg=1.0;
00238 if (x > 0.3)
00239 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00240 else
00241 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00242
00243 double cor_nhit = 1.0;
00244 if (nhit < 5) nhit = 5;
00245 if (nhit <= 35)
00246 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00247 sig_par[11]*nhit+sig_par[12];
00248
00249 double cor_sin= 1.0;
00250 if(sig_the>0.99) sig_the=0.99;
00251 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00252 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00253
00254
00255 double cor_t0 = 1.0;
00256
00257
00258 if (trkalg == 1)
00259 ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0;
00260 else
00261 ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0 * sig_par[18];
00262 }
00263 else {
00264 if(sigmaflag == 1) {
00265 f_betagamma=sig_par[0]*pow(beta_G,sig_par[1])+sig_par[2];
00266 g_sinth=(sig_par[3]*sig_the*sig_the+sig_par[4])/(sig_par[3]*sig_par[5]*sig_par[5]+sig_par[4]);
00267 h_nhit=(sig_par[6]*Nohit*Nohit+sig_par[7]*Nohit+sig_par[8]) /
00268 (sig_par[6]*sig_par[9]*sig_par[9]+sig_par[7]*sig_par[9]+sig_par[8]);
00269 if(sig_par[13] != 0)
00270 i_t0 = (sig_par[10]*t0*t0+sig_par[11]*t0+sig_par[12]) /
00271 (sig_par[10]*sig_par[13]*sig_par[13]+sig_par[11]*sig_par[13]+sig_par[12]);
00272 else if(sig_par[13] == 0)
00273 i_t0 =1;
00274
00275
00276 ex_sigma[it]= f_betagamma* g_sinth * h_nhit * i_t0;
00277 }
00278 else if(sigmaflag == 2) {
00279 double x = beta_G;
00280 double nhit = (double)Nohit;
00281 double sigma_bg=1.0;
00282 if (x > 0.3)
00283 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00284 else
00285 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00286
00287 double cor_nhit=1.0;
00288 if(nhit<5) nhit=5;
00289 if (nhit <= 35)
00290 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) + sig_par[11]*nhit+sig_par[12];
00291
00292 double cor_sin= 1.0;
00293 if(sig_the>0.99) sig_the = 0.99;
00294 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00295 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00296
00297 double cor_t0 = 1;
00298 if (t0 > 1200) t0 = 1200;
00299 if (t0 > 800)
00300 cor_t0 = sig_par[18]*pow(t0,2)+sig_par[19]*t0+sig_par[20];
00301
00302 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*cor_t0;
00303 }
00304 else if(sigmaflag == 3) {
00305 double x= beta_G;
00306 double nhit = (double)Nohit;
00307 double sigma_bg=1.0;
00308 if (x > 0.3)
00309 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00310 else
00311 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00312
00313 double cor_nhit = 1.0;
00314 if (nhit < 5) nhit = 5;
00315 if (nhit <= 35)
00316 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) + sig_par[11]*nhit+sig_par[12];
00317
00318 double cor_sin= 1.0;
00319 if(sig_the>0.99) sig_the=0.99;
00320 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00321 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00322
00323 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin;
00324 }
00325 else if(sigmaflag == 4) {
00326 double x= beta_G;
00327 double nhit = (double)Nohit;
00328 double sigma_bg=1.0;
00329 if (x > 0.3)
00330 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00331 else
00332 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00333
00334 double cor_nhit = 1.0;
00335 if (nhit < 5) nhit = 5;
00336 if (nhit <= 35)
00337 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) + sig_par[11]*nhit+sig_par[12];
00338
00339 double cor_sin= 1.0;
00340 if(sig_the>0.99) sig_the=0.99;
00341 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00342 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00343
00344 if(trkalg==1)
00345 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin;
00346 else
00347 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*sig_par[18];
00348 }
00349 else if(sigmaflag == 5) {
00350 double x = beta_G;
00351 double nhit = (double)Nohit;
00352 double sigma_bg=1.0;
00353 if (x > 0.3)
00354 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00355 else
00356 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00357
00358 double cor_nhit=1.0;
00359 if(nhit<5) nhit=5;
00360 if (nhit <= 35)
00361 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00362 sig_par[11]*nhit+sig_par[12];
00363 double cor_sin= 1.0;
00364 if(sig_the>0.99) sig_the = 0.99;
00365 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00366 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00367
00368 double cor_t0 = 1;
00369 if (t0 > 1200) t0 = 1200;
00370 if (t0 > 800)
00371 cor_t0 = sig_par[18]*pow(t0,2)+sig_par[19]*t0+sig_par[20];
00372
00373 if(trkalg==1)
00374 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*cor_t0;
00375 else
00376 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*cor_t0*sig_par[21];
00377 }
00378 }
00379
00380 double dedx_correc = dedx;
00381 chi_dedx[it] = (dedx_correc - dedx_exp[it])/ex_sigma[it];
00382 chi2 = chi_dedx[it]*chi_dedx[it];
00383 ndf=1;
00384 pid_prob[it] = prob_(&chi2,&ndf);
00385
00386
00387 if (it == -999) {
00388 std::cout << " mom = " << mom <<"exp"<< dedx_exp[it]
00389 << " sigma "<<ex_sigma[it] <<" prob "<<pid_prob[it]
00390 << std::endl;
00391 }
00392 if( pid_prob[it] > max_prob ){
00393 max_prob = pid_prob[it];
00394 Nmax_prob = it;
00395 }
00396 }
00397 else{
00398 dedx_exp[it] = 0.0;
00399 ex_sigma[it] = 1000.0;
00400 pid_prob[it] = 0.0;
00401 chi_dedx[it] = 999.0;
00402 }
00403 }
00404 }
00405
00406 double SpaceChargeCorrec(double m_theta, double mom, int Particle, double dEdx )
00407 {
00408 const int par_cand( 5 );
00409 const float Charge_Mass[par_cand] = {0.00051100, 0.10566, 0.13957, 0.4937, 0.93827 };
00410 double beta_G;
00411 double e_Par[5] = {143.349, 1.7315, 0.192616, 2.90437, 1.08248};
00412 double Beta_Gamma[22] ={0.373026, 0.479605, 0.586184, 0.692763, 0.799342, 782.779, 1565.56,
00413 2348.34, 17.2727, 18.1245, 1.43297, 2.14946, 12.1803, 13.6132, 6.62515, 10.4109,
00414 14.1967, 17.9825, 21.7683, 26.0274, 30.7596, 35.4919 };
00415 double K_par[22] ={4.64411e-05, 5.86544e-05, 8.05289e-05, 8.46981e-05, 8.92014e-05, 4.74517e-05,
00416 4.51684e-05, 5.32732e-05, 6.12803e-05, 6.14592e-05, 8.08608e-05, 6.73184e-05, 5.46448e-05,
00417 6.1377e-05, 6.57385e-05, 7.03053e-05, 6.61171e-05, 6.86824e-05, 6.246e-05, 7.25988e-05,
00418 7.11034e-05, 6.24924e-05 };
00419 double D_par[22] ={0.0871504, 0.0956379, 0.117193, 0.118647, 0.127203, 0.0566449, 0.0529198,
00420 0.0642525, 0.0764562, 0.081341, 0.0952263, 0.0987536, 0.0639901, 0.0845994,0.0777062,
00421 0.0823206, 0.0783874, 0.079537, 0.0815792, 0.0849875, 0.0824751,0.0776296 };
00422 double DSqr_par[22] = {0.00759519, 0.0091466, 0.0137341, 0.0140772, 0.0161807, 0.00320864,
00423 0.00280051, 0.00412839, 0.00584555, 0.00661636, 0.00906805, 0.00975227, 0.00409473,
00424 0.00715706, 0.00603826, 0.00677668, 0.00614458, 0.00632613, 0.00665516, 0.00722288,
00425 0.00680214, 0.00602635};
00426
00427 beta_G = mom/Charge_Mass[Particle];
00428 if(beta_G <0.3) beta_G =0.3;
00429 double bet=beta_G/TMath::Sqrt(beta_G*beta_G+1);
00430 double fterm=TMath::Log(e_Par[2]+1/pow(beta_G,e_Par[4]));
00431 double fitval=e_Par[0]/pow(bet,e_Par[3])*(e_Par[1]-pow(bet,e_Par[3])-fterm);
00432 TGraphErrors *gr1 = new TGraphErrors(22,Beta_Gamma, K_par,0,0);
00433 TGraphErrors *gr2 = new TGraphErrors(22,Beta_Gamma, DSqr_par,0,0);
00434
00435 double par[3];
00436 par[0] = fitval;
00437 par[1] = gr1->Eval(m_theta);
00438 par[2] = gr2->Eval(m_theta);
00439 Double_t y = fabs(cos(m_theta));
00440 double electron_par[3] ={334.032, 6.20658e-05, 0.00525673};
00441 double arg= TMath::Sqrt(y*y+ par[2]);
00442
00443 double cal_factor =TMath::Exp(-(par[1]* par[0])/arg);
00444 double arg_electron = TMath::Sqrt(y*y + electron_par[2]);
00445
00446 double electron_factor = TMath::Exp(-(electron_par[1]* electron_par[0])/arg_electron);
00447
00448 double dedx_cal = dEdx/(cal_factor/electron_factor);
00449
00450
00451 delete gr1;
00452 delete gr2;
00453 return dedx_cal;
00454 }