00189 {
00190
00191
00192 const int par_cand( 5 );
00193 const float Charge_Mass[par_cand] = {0.00051100, 0.10566, 0.13957, 0.4937, 0.93827 };
00194 const float mass_e( 0.511 );
00195 double beta_G, beta, bet_f, Xa, deci;
00196 float betterm, bethe_B;
00197
00198 int dedxflag = vflag[0];
00199 int sigmaflag = vflag[1];
00200 bool ifMC = false;
00201 if(vflag[2] == 1)
00202 ifMC = true;
00203
00204
00205 float prob(0.0);
00206 double delta;
00207 double sig_param;
00208
00209 int Nmax_prob(0);
00210 float max_prob(-0.01);
00211 int ndf;
00212 float prob_d[5], chi2;
00213
00214 for( int it = 0; it < par_cand; it++ ) {
00215 beta_G = mom/Charge_Mass[it];
00216
00217 if(dedxflag == 1){
00218 beta = beta_G/sqrt(1+(beta_G)*(beta_G));
00219 betterm = par[1]-log(par[2]+pow(1/beta_G,par[4]));
00220 bethe_B = par[0]/pow(beta,par[3])*betterm-par[0];
00221 }
00222 else if(dedxflag == 2) {
00223 double A=0, B=0,C=0;
00224 double x = beta_G;
00225 if(x<4.5)
00226 A=1;
00227 else if(x<10)
00228 B=1;
00229 else
00230 C=1;
00231 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])) ) -
00232 par[4]+exp(par[6]+par[7]*x);
00233 double partB = par[8]*pow(x,3)+par[9]*pow(x,2)+par[10]*x+par[11];
00234 double partC = -par[12]*log(par[15]+pow(1/x,par[13]))+par[14];
00235 bethe_B = 550*(A*partA+B*partB+C*partC);
00236
00237 if(beta_G> 100)
00238 bethe_B=550*1.0;
00239
00240 }
00241
00242 if (ifMC) {
00243 double A=0, B=0,C=0;
00244 double x = beta_G;
00245 if(x<4.5)
00246 A=1;
00247 else if(x<10)
00248 B=1;
00249 else
00250 C=1;
00251 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])) ) -
00252 par[4]+exp(par[6]+par[7]*x);
00253 double partB = par[8]*pow(x,3)+par[9]*pow(x,2)+par[10]*x+par[11];
00254 double partC = -par[12]*log(par[15]+pow(1/x,par[13]))+par[14];
00255 bethe_B = 550*(A*partA+B*partB+C*partC);
00256
00257 if(beta_G> 100)
00258 bethe_B=550*1.0;
00259 }
00260
00261
00262 if (Nohit > 0) {
00263 dedx_exp[it] = bethe_B;
00264 double sig_the = std::sin((double)theta);
00265
00266 double f_betagamma, g_sinth, h_nhit, i_t0;
00267
00268 if (ifMC) {
00269
00270 double x= beta_G;
00271 double nhit = (double)Nohit;
00272 double sigma_bg=1.0;
00273 if (x > 0.3)
00274 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00275 else
00276 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00277
00278 double cor_nhit = 1.0;
00279 if (nhit < 5) nhit = 5;
00280 if (nhit <= 35)
00281 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00282 sig_par[11]*nhit+sig_par[12];
00283
00284 double cor_sin= 1.0;
00285 if(sig_the>0.99) sig_the=0.99;
00286 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00287 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00288
00289
00290 double cor_t0 = 1.0;
00291
00292
00293 if (trkalg == 1)
00294 ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0;
00295 else
00296 ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0 * sig_par[18];
00297 }
00298 else {
00299 if(sigmaflag == 1) {
00300 f_betagamma=sig_par[0]*pow(beta_G,sig_par[1])+sig_par[2];
00301 g_sinth=(sig_par[3]*sig_the*sig_the+sig_par[4])/(sig_par[3]*sig_par[5]*sig_par[5]+sig_par[4]);
00302 h_nhit=(sig_par[6]*Nohit*Nohit+sig_par[7]*Nohit+sig_par[8]) /
00303 (sig_par[6]*sig_par[9]*sig_par[9]+sig_par[7]*sig_par[9]+sig_par[8]);
00304 if(sig_par[13] != 0)
00305 i_t0 = (sig_par[10]*t0*t0+sig_par[11]*t0+sig_par[12]) /
00306 (sig_par[10]*sig_par[13]*sig_par[13]+sig_par[11]*sig_par[13]+sig_par[12]);
00307 else if(sig_par[13] == 0)
00308 i_t0 =1;
00309
00310
00311 ex_sigma[it]= f_betagamma* g_sinth * h_nhit * i_t0;
00312 }
00313 else if(sigmaflag == 2) {
00314 double x = beta_G;
00315 double nhit = (double)Nohit;
00316 double sigma_bg=1.0;
00317 if (x > 0.3)
00318 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00319 else
00320 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00321
00322 double cor_nhit=1.0;
00323 if(nhit<5) nhit=5;
00324 if (nhit <= 35)
00325 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00326 sig_par[11]*nhit+sig_par[12];
00327
00328 double cor_sin= 1.0;
00329 if(sig_the>0.99) sig_the = 0.99;
00330 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00331 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00332
00333 double cor_t0 = 1;
00334 if (t0 > 1200) t0 = 1200;
00335 if (t0 > 800)
00336 cor_t0 = sig_par[18]*pow(t0,2)+sig_par[19]*t0+sig_par[20];
00337
00338 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*cor_t0;
00339 }
00340 else if(sigmaflag == 3) {
00341 double x= beta_G;
00342 double nhit = (double)Nohit;
00343 double sigma_bg=1.0;
00344 if (x > 0.3)
00345 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00346 else
00347 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00348
00349 double cor_nhit = 1.0;
00350 if (nhit < 5) nhit = 5;
00351 if (nhit <= 35)
00352 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00353 sig_par[11]*nhit+sig_par[12];
00354
00355 double cor_sin= 1.0;
00356 if(sig_the>0.99) sig_the=0.99;
00357 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00358 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00359
00360
00361 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin;
00362 }
00363 else if(sigmaflag == 4) {
00364 double x= beta_G;
00365 double nhit = (double)Nohit;
00366 double sigma_bg=1.0;
00367 if (x > 0.3)
00368 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00369 else
00370 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00371
00372 double cor_nhit = 1.0;
00373 if (nhit < 5) nhit = 5;
00374 if (nhit <= 35)
00375 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00376 sig_par[11]*nhit+sig_par[12];
00377
00378 double cor_sin= 1.0;
00379 if(sig_the>0.99) sig_the=0.99;
00380 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00381 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00382
00383
00384 if(trkalg==1)
00385 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin;
00386 else
00387 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*sig_par[18];
00388 }
00389 else if(sigmaflag == 5) {
00390 double x = beta_G;
00391 double nhit = (double)Nohit;
00392 double sigma_bg=1.0;
00393 if (x > 0.3)
00394 sigma_bg = sig_par[0]*exp(sig_par[1]*x)+sig_par[2]*exp(sig_par[3]*pow(x,0.25))+sig_par[4];
00395 else
00396 sigma_bg = sig_par[5]*exp(sig_par[6]*x)+ sig_par[7];
00397
00398 double cor_nhit=1.0;
00399 if(nhit<5) nhit=5;
00400 if (nhit <= 35)
00401 cor_nhit = sig_par[8]*pow(nhit,4)+sig_par[9]*pow(nhit,3)+sig_par[10]*pow(nhit,2) +
00402 sig_par[11]*nhit+sig_par[12];
00403
00404 double cor_sin= 1.0;
00405 if(sig_the>0.99) sig_the = 0.99;
00406 cor_sin = sig_par[13]*pow(sig_the,4)+sig_par[14]*pow(sig_the,3) +
00407 sig_par[15]*pow(sig_the,2)+sig_par[16]*sig_the+sig_par[17];
00408
00409 double cor_t0 = 1;
00410 if (t0 > 1200) t0 = 1200;
00411 if (t0 > 800)
00412 cor_t0 = sig_par[18]*pow(t0,2)+sig_par[19]*t0+sig_par[20];
00413
00414 if(trkalg==1)
00415 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*cor_t0;
00416 else
00417 ex_sigma[it]=550*sigma_bg*cor_nhit*cor_sin*cor_t0*sig_par[21];
00418 }
00419 }
00420
00421
00422
00423 MdcDedxTrk dedxtrk;
00424 double dedx_correc;
00425
00426
00427
00428 dedx_correc = dedx;
00429 chi_dedx[it] = (dedx_correc - dedx_exp[it])/ex_sigma[it];
00430 chi2 = chi_dedx[it]*chi_dedx[it];
00431 ndf=1;
00432 pid_prob[it] = prob_(&chi2,&ndf);
00433
00434
00435 if (it == -999) {
00436 std::cout << " mom = " << mom <<"exp"<< dedx_exp[it]
00437 << " sigma "<<ex_sigma[it] <<" prob "<<pid_prob[it]
00438 << std::endl;
00439 }
00440 if( pid_prob[it] > max_prob ){
00441 max_prob = pid_prob[it];
00442 Nmax_prob = it;
00443 }
00444 }
00445 else{
00446 dedx_exp[it] = 0.0;
00447 ex_sigma[it] = 1000.0;
00448 pid_prob[it] = 0.0;
00449 chi_dedx[it] = 999.0;
00450 }
00451 }
00452
00453 }