BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
KalFitMaterial.cxx
Go to the documentation of this file.
1//-----------------------------------------------------------------------
2// File from KalFit module
3//
4// Filename : KalFitMaterial.cc
5//------------------------------------------------------------------------
6// Description :
7// Material is a class which describes the properties of a given material,
8// for instance atomic number, atomic weight and so on.
9//------------------------------------------------------------------------
10// Modif :
11//------------------------------------------------------------------------
12#include "KalFitAlg/KalFitMaterial.h"
13#include <iostream>
14#include <math.h>
15
16using namespace std;
17
18KalFitMaterial::KalFitMaterial( double z, double a, double i, double rho, double x0 )
19 : x0_( x0 )
20 , z_( z ) // rho is the density, z is the atomic number, a is the weight
21 // i is mean excitation potention, x0 is the radiation length
22{
23 rza_ = rho * z / a;
24 isq_ = i * i * 1e-18;
25}
26
28 : rza_( mat.rza_ ), isq_( mat.isq_ ), x0_( mat.x0_ ), z_( mat.z_ ) {}
29
30// calculate dE
31double KalFitMaterial::dE( double mass, double path, double p ) const {
32 if ( !( p > 0 ) ) return 0;
33
34 // cout<<"this material:x0 "<< x0_ << " Z " << z_ << endl
35 // <<" rho*Z/A "<< rza_ << " I^2 "<< isq_ << endl;
36
37 const double Me = 0.000510999;
38 double psq = p * p;
39 double bsq = psq / ( psq + mass * mass );
40 double esq = psq / ( mass * mass );
41
42 double s = Me / mass;
43 double w = ( 4 * Me * esq / ( 1 + 2 * s * sqrt( 1 + esq ) + s * s ) );
44
45 // Density correction :
46 double cc, x0;
47 cc = 1 + 2 * log( sqrt( isq_ ) / ( 28.8E-09 * sqrt( rza_ ) ) );
48 if ( cc < 5.215 ) x0 = 0.2;
49 else x0 = 0.326 * cc - 1.5;
50 double x1( 3 ), xa( cc / 4.606 ), aa;
51 aa = 4.606 * ( xa - x0 ) / ( ( x1 - x0 ) * ( x1 - x0 ) * ( x1 - x0 ) );
52 double delta( 0 );
53 double x( log10( sqrt( esq ) ) );
54 if ( x > x0 )
55 {
56 delta = 4.606 * x - cc;
57 if ( x < x1 ) delta = delta + aa * ( x1 - x ) * ( x1 - x ) * ( x1 - x );
58 }
59
60 // Shell correction :
61 float f1, f2, f3, f4, f5, ce;
62 f1 = 1 / esq;
63 f2 = f1 * f1;
64 f3 = f1 * f2;
65 f4 = ( f1 * 0.42237 + f2 * 0.0304 - f3 * 0.00038 ) * 1E12;
66 f5 = ( f1 * 3.858 - f2 * 0.1668 + f3 * 0.00158 ) * 1E18;
67 ce = f4 * isq_ + f5 * isq_ * sqrt( isq_ );
68
69 return ( 0.0001535 * rza_ / bsq *
70 ( log( Me * esq * w / isq_ ) - 2 * bsq - delta - 2.0 * ce / z_ ) ) *
71 path;
72}
73
74// calculate Multiple Scattering angle
75double KalFitMaterial::mcs_angle( double mass, double path, double p ) const {
76 // cout<<"this material:x0 "<< x0_ << " Z " << z_ << endl
77 // <<" rho*Z/A "<< rza_ << " I^2 "<< isq_ << endl;
78 double t = path / x0_;
79 double psq = p * p;
80 return 0.0136 * sqrt( t * ( mass * mass + psq ) ) / psq * ( 1 + 0.038 * log( t ) );
81}
82
83// calculate the RMS of straggling for the energy loss (del_E) :
84double KalFitMaterial::del_E( double mass, double path, double p ) const {
85 double sigma0_2 = 0.1569 * rza_ * path;
86
87 if ( sigma0_2 < 0 ) return 0;
88
89 double psq = p * p;
90 double bsq = psq / ( psq + mass * mass );
91
92 // Correction for relativistic particles :
93 double sigma_2 = sigma0_2 * ( 1 - 0.5 * bsq ) / ( 1 - bsq );
94
95 if ( sigma_2 < 0 ) return 0;
96
97 // Return sigma in GeV !!
98 return sqrt( sigma_2 ) * 0.001;
99}
double mass
TFile * f1
Double_t x[10]
double w
XmlRpcServer s
double del_E(double mass, double path, double p) const
Calculate the straggling of energy loss.
double mcs_angle(double mass, double path, double p) const
Calculate Multiple Scattering angle.
double dE(double mass, double path, double p) const
Calculate energy loss.
int t()
Definition t.c:1