252
252
// double old_y = old_vec(2, 0);
253
253
double old_py = old_vec(3, 0);
254
254
double old_kappa = old_vec(4, 0);
255
double old_pz = fabs(1.0 / old_kappa);
255
256
double charge = old_kappa/fabs(old_kappa);
257
double old_momentum = sqrt(old_px*old_px + old_py*old_py + old_pz*old_pz);
257
259
_Bz = _geometry_helper->GetFieldValue((start.GetId() > 0 ? 1 : 0));
266
268
if (start.GetId() < 0) u = - u;
270
double reduction_factor = 1.0;
272
if (_subtract_eloss) {
273
SciFiMaterialsList materials;
274
_geometry_helper->FillMaterialsList(start.GetId(), end.GetId(), materials);
276
// Reduce/increase momentum vector accordingly.
277
double e_loss_sign = 1.0;
278
if (end.GetId() > 0) {
282
double delta_p = 0.0;
283
double momentum = old_momentum;
284
int n_steps = materials.size();
285
for (int i = 0; i < n_steps; i++) { // In mm => times by 0.1;
286
// delta_p = _geometry_helper->BetheBlochStoppingPower(momentum,
287
// materials.at(i).first)*materials.at(i).second*0.1;
288
double SP = _geometry_helper->BetheBlochStoppingPower(momentum, materials.at(i).first);
289
delta_p = SP*materials.at(i).second*0.1;
290
momentum += e_loss_sign*delta_p;
293
reduction_factor = momentum/old_momentum;
268
296
TMatrixD new_prop(5, 5);
270
298
new_prop(0, 0) = 1.;
271
new_prop(0, 1) = sine/u;
299
new_prop(0, 1) = (sine/u);
272
300
new_prop(0, 2) = 0.;
273
new_prop(0, 3) = (cosine-1.)/u;
301
new_prop(0, 3) = ((cosine-1.)/u);
275
303
new_prop(1, 0) = 0.;
276
new_prop(1, 1) = cosine;
304
new_prop(1, 1) = cosine*reduction_factor;
277
305
new_prop(1, 2) = 0.;
278
new_prop(1, 3) = -sine;
306
new_prop(1, 3) = -sine*reduction_factor;
280
308
new_prop(2, 0) = 0.;
281
new_prop(2, 1) = (1.-cosine)/u;
309
new_prop(2, 1) = ((1.-cosine)/u);
282
310
new_prop(2, 2) = 1.;
283
new_prop(2, 3) = sine/u;
311
new_prop(2, 3) = (sine/u);
285
313
new_prop(3, 0) = 0.;
286
new_prop(3, 1) = sine;
314
new_prop(3, 1) = sine*reduction_factor;
287
315
new_prop(3, 2) = 0.;
288
new_prop(3, 3) = cosine;
316
new_prop(3, 3) = cosine*reduction_factor;
290
318
new_prop(4, 0) = 0.;
291
319
new_prop(4, 1) = 0.;
292
320
new_prop(4, 2) = 0.;
293
321
new_prop(4, 3) = 0.;
322
new_prop(4, 4) = 1./reduction_factor;
296
324
if (_correct_Pz) {
297
325
if (start.GetId() < 0) {
298
326
new_prop(0, 4) = delta_z*(old_px*cosine - old_py*sine);
299
new_prop(1, 4) = -u*delta_z*(old_px*sine + old_py*cosine);
327
new_prop(1, 4) = -u*delta_z*(old_px*sine + old_py*cosine)*reduction_factor;
300
328
new_prop(2, 4) = delta_z*(old_px*sine + old_py*cosine);
301
new_prop(3, 4) = u*delta_z*(old_px*cosine - old_py*sine);
329
new_prop(3, 4) = u*delta_z*(old_px*cosine - old_py*sine)*reduction_factor;
303
331
new_prop(0, 4) = delta_z*(old_px*cosine - old_py*sine);
304
new_prop(1, 4) = -u*delta_z*(old_px*sine + old_py*cosine);
332
new_prop(1, 4) = -u*delta_z*(old_px*sine + old_py*cosine)*reduction_factor;
305
333
new_prop(2, 4) = delta_z*(old_px*sine + old_py*cosine);
306
new_prop(3, 4) = u*delta_z*(old_px*cosine - old_py*sine);
334
new_prop(3, 4) = u*delta_z*(old_px*cosine - old_py*sine)*reduction_factor;
309
337
new_prop(0, 4) = 0.0;