165 {
166 const int par_cand( 5 );
167 const float Charge_Mass[par_cand] = { 0.00051100, 0.10566, 0.13957, 0.4937, 0.93827 };
168 double beta_G, beta, betterm, bethe_B;
169
170 int dedxflag = vflag[0];
171 int sigmaflag = vflag[1];
172 bool ifMC = false;
173 if ( vflag[2] == 1 ) ifMC = true;
174
175 int Nmax_prob( 0 );
176 float max_prob( -0.01 );
177 int ndf;
178 float chi2;
179
180 for ( int it = 0; it < par_cand; it++ )
181 {
182 beta_G = mom / Charge_Mass[it];
183
184 if ( dedxflag == 1 )
185 {
186 beta = beta_G / sqrt( 1 + ( beta_G ) * ( beta_G ) );
187 betterm = par[1] - log( par[2] + pow( 1 / beta_G, par[4] ) );
188 bethe_B = par[0] / pow( beta, par[3] ) * betterm - par[0];
189 }
190 else if ( dedxflag == 2 )
191 {
192 double A = 0,
B = 0,
C = 0;
193 double x = beta_G;
194 if ( x < 4.5 )
A = 1;
195 else if ( x < 10 )
B = 1;
197 double partA = par[0] * pow( sqrt( x * x + 1 ), par[2] ) / pow( x, par[2] ) *
198 ( par[1] - par[5] * log( pow( 1 / x, par[3] ) ) ) -
199 par[4] +
exp( par[6] + par[7] * x );
200 double partB = par[8] * pow( x, 3 ) + par[9] * pow( x, 2 ) + par[10] * x + par[11];
201 double partC = -par[12] * log( par[15] + pow( 1 / x, par[13] ) ) + par[14];
202 bethe_B = 550 * (
A * partA +
B * partB +
C * partC );
203
204 if ( beta_G > 100 ) bethe_B = 550 * 1.0;
205 }
206
207 if ( ifMC )
208 {
209 double A = 0,
B = 0,
C = 0;
210 double x = beta_G;
211 if ( x < 4.5 )
A = 1;
212 else if ( x < 10 )
B = 1;
214 double partA = par[0] * pow( sqrt( x * x + 1 ), par[2] ) / pow( x, par[2] ) *
215 ( par[1] - par[5] * log( pow( 1 / x, par[3] ) ) ) -
216 par[4] +
exp( par[6] + par[7] * x );
217 double partB = par[8] * pow( x, 3 ) + par[9] * pow( x, 2 ) + par[10] * x + par[11];
218 double partC = -par[12] * log( par[15] + pow( 1 / x, par[13] ) ) + par[14];
219 bethe_B = 550 * (
A * partA +
B * partB +
C * partC );
220
221 if ( beta_G > 100 ) bethe_B = 550 * 1.0;
222 }
223
224 if ( Nohit > 0 )
225 {
226 dedx_exp[it] = bethe_B;
227 double sig_the = std::sin( (double)theta );
228 double f_betagamma, g_sinth, h_nhit, i_t0;
229
230 if ( ifMC )
231 {
232
233 double x = beta_G;
234 double nhit = (double)Nohit;
235 double sigma_bg = 1.0;
236 if ( x > 0.3 )
237 sigma_bg = sig_par[0] *
exp( sig_par[1] * x ) +
238 sig_par[2] *
exp( sig_par[3] * pow( x, 0.25 ) ) + sig_par[4];
239 else sigma_bg = sig_par[5] *
exp( sig_par[6] * x ) + sig_par[7];
240
241 double cor_nhit = 1.0;
242 if ( nhit < 5 ) nhit = 5;
243 if ( nhit <= 35 )
244 cor_nhit = sig_par[8] * pow( nhit, 4 ) + sig_par[9] * pow( nhit, 3 ) +
245 sig_par[10] * pow( nhit, 2 ) + sig_par[11] * nhit + sig_par[12];
246
247 double cor_sin = 1.0;
248 if ( sig_the > 0.99 ) sig_the = 0.99;
249 cor_sin = sig_par[13] * pow( sig_the, 4 ) + sig_par[14] * pow( sig_the, 3 ) +
250 sig_par[15] * pow( sig_the, 2 ) + sig_par[16] * sig_the + sig_par[17];
251
252
253 double cor_t0 = 1.0;
254
255
256 if ( trkalg == 1 ) ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0;
257 else ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0 * sig_par[18];
258 }
259 else
260 {
261 if ( sigmaflag == 1 )
262 {
263 f_betagamma = sig_par[0] * pow( beta_G, sig_par[1] ) + sig_par[2];
264 g_sinth = ( sig_par[3] * sig_the * sig_the + sig_par[4] ) /
265 ( sig_par[3] * sig_par[5] * sig_par[5] + sig_par[4] );
266 h_nhit =
267 ( sig_par[6] * Nohit * Nohit + sig_par[7] * Nohit + sig_par[8] ) /
268 ( sig_par[6] * sig_par[9] * sig_par[9] + sig_par[7] * sig_par[9] + sig_par[8] );
269 if ( sig_par[13] != 0 )
270 i_t0 = ( sig_par[10] * t0 * t0 + sig_par[11] * t0 + sig_par[12] ) /
271 ( sig_par[10] * sig_par[13] * sig_par[13] + sig_par[11] * sig_par[13] +
272 sig_par[12] );
273 else if ( sig_par[13] == 0 ) i_t0 = 1;
274
275
276
277 ex_sigma[it] = f_betagamma * g_sinth * h_nhit * i_t0;
278 }
279 else if ( sigmaflag == 2 )
280 {
281 double x = beta_G;
282 double nhit = (double)Nohit;
283 double sigma_bg = 1.0;
284 if ( x > 0.3 )
285 sigma_bg = sig_par[0] *
exp( sig_par[1] * x ) +
286 sig_par[2] *
exp( sig_par[3] * pow( x, 0.25 ) ) + sig_par[4];
287 else sigma_bg = sig_par[5] *
exp( sig_par[6] * x ) + sig_par[7];
288
289 double cor_nhit = 1.0;
290 if ( nhit < 5 ) nhit = 5;
291 if ( nhit <= 35 )
292 cor_nhit = sig_par[8] * pow( nhit, 4 ) + sig_par[9] * pow( nhit, 3 ) +
293 sig_par[10] * pow( nhit, 2 ) + sig_par[11] * nhit + sig_par[12];
294
295 double cor_sin = 1.0;
296 if ( sig_the > 0.99 ) sig_the = 0.99;
297 cor_sin = sig_par[13] * pow( sig_the, 4 ) + sig_par[14] * pow( sig_the, 3 ) +
298 sig_par[15] * pow( sig_the, 2 ) + sig_par[16] * sig_the + sig_par[17];
299
300 double cor_t0 = 1;
301 if ( t0 > 1200 ) t0 = 1200;
302 if ( t0 > 800 ) cor_t0 = sig_par[18] * pow( t0, 2 ) + sig_par[19] * t0 + sig_par[20];
303
304 ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0;
305 }
306 else if ( sigmaflag == 3 )
307 {
308 double x = beta_G;
309 double nhit = (double)Nohit;
310 double sigma_bg = 1.0;
311 if ( x > 0.3 )
312 sigma_bg = sig_par[0] *
exp( sig_par[1] * x ) +
313 sig_par[2] *
exp( sig_par[3] * pow( x, 0.25 ) ) + sig_par[4];
314 else sigma_bg = sig_par[5] *
exp( sig_par[6] * x ) + sig_par[7];
315
316 double cor_nhit = 1.0;
317 if ( nhit < 5 ) nhit = 5;
318 if ( nhit <= 35 )
319 cor_nhit = sig_par[8] * pow( nhit, 4 ) + sig_par[9] * pow( nhit, 3 ) +
320 sig_par[10] * pow( nhit, 2 ) + sig_par[11] * nhit + sig_par[12];
321
322 double cor_sin = 1.0;
323 if ( sig_the > 0.99 ) sig_the = 0.99;
324 cor_sin = sig_par[13] * pow( sig_the, 4 ) + sig_par[14] * pow( sig_the, 3 ) +
325 sig_par[15] * pow( sig_the, 2 ) + sig_par[16] * sig_the + sig_par[17];
326
327 ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin;
328 }
329 else if ( sigmaflag == 4 )
330 {
331 double x = beta_G;
332 double nhit = (double)Nohit;
333 double sigma_bg = 1.0;
334 if ( x > 0.3 )
335 sigma_bg = sig_par[0] *
exp( sig_par[1] * x ) +
336 sig_par[2] *
exp( sig_par[3] * pow( x, 0.25 ) ) + sig_par[4];
337 else sigma_bg = sig_par[5] *
exp( sig_par[6] * x ) + sig_par[7];
338
339 double cor_nhit = 1.0;
340 if ( nhit < 5 ) nhit = 5;
341 if ( nhit <= 35 )
342 cor_nhit = sig_par[8] * pow( nhit, 4 ) + sig_par[9] * pow( nhit, 3 ) +
343 sig_par[10] * pow( nhit, 2 ) + sig_par[11] * nhit + sig_par[12];
344
345 double cor_sin = 1.0;
346 if ( sig_the > 0.99 ) sig_the = 0.99;
347 cor_sin = sig_par[13] * pow( sig_the, 4 ) + sig_par[14] * pow( sig_the, 3 ) +
348 sig_par[15] * pow( sig_the, 2 ) + sig_par[16] * sig_the + sig_par[17];
349
350 if ( trkalg == 1 ) ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin;
351 else ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * sig_par[18];
352 }
353 else if ( sigmaflag == 5 )
354 {
355 double x = beta_G;
356 double nhit = (double)Nohit;
357 double sigma_bg = 1.0;
358 if ( x > 0.3 )
359 sigma_bg = sig_par[0] *
exp( sig_par[1] * x ) +
360 sig_par[2] *
exp( sig_par[3] * pow( x, 0.25 ) ) + sig_par[4];
361 else sigma_bg = sig_par[5] *
exp( sig_par[6] * x ) + sig_par[7];
362
363 double cor_nhit = 1.0;
364 if ( nhit < 5 ) nhit = 5;
365 if ( nhit <= 35 )
366 cor_nhit = sig_par[8] * pow( nhit, 4 ) + sig_par[9] * pow( nhit, 3 ) +
367 sig_par[10] * pow( nhit, 2 ) + sig_par[11] * nhit + sig_par[12];
368 double cor_sin = 1.0;
369 if ( sig_the > 0.99 ) sig_the = 0.99;
370 cor_sin = sig_par[13] * pow( sig_the, 4 ) + sig_par[14] * pow( sig_the, 3 ) +
371 sig_par[15] * pow( sig_the, 2 ) + sig_par[16] * sig_the + sig_par[17];
372
373 double cor_t0 = 1;
374 if ( t0 > 1200 ) t0 = 1200;
375 if ( t0 > 800 ) cor_t0 = sig_par[18] * pow( t0, 2 ) + sig_par[19] * t0 + sig_par[20];
376
377 if ( trkalg == 1 ) ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0;
378 else ex_sigma[it] = 550 * sigma_bg * cor_nhit * cor_sin * cor_t0 * sig_par[21];
379 }
380 }
381
382 double dedx_correc = dedx;
383 chi_dedx[it] = ( dedx_correc - dedx_exp[it] ) / ex_sigma[it];
384 chi2 = chi_dedx[it] * chi_dedx[it];
385 ndf = 1;
386 pid_prob[it] =
prob_( &chi2, &ndf );
387
388
389 if ( it == -999 )
390 {
391 std::cout << " mom = " << mom << "exp" << dedx_exp[it] << " sigma " << ex_sigma[it]
392 << " prob " << pid_prob[it] << std::endl;
393 }
394 if ( pid_prob[it] > max_prob )
395 {
396 max_prob = pid_prob[it];
397 Nmax_prob = it;
398 }
399 }
400 else
401 {
402 dedx_exp[it] = 0.0;
403 ex_sigma[it] = 1000.0;
404 pid_prob[it] = 0.0;
405 chi_dedx[it] = 999.0;
406 }
407 }
408}
float prob_(float *, int *)
EvtComplex exp(const EvtComplex &c)
***************************************************************************************Pseudo Class RRes *****************************************************************************************Parameters and physical constants **Maarten sept ************************************************************************DOUBLE PRECISION xsmu **************************************************************************PARTICLE DATA all others are from PDG *Only resonances with known widths into electron pairs are sept ************************************************************************C Declarations C