BmnRoot
Loading...
Searching...
No Matches
CbmKFMaterial.cxx
Go to the documentation of this file.
1#include "CbmKFMaterial.h"
2
3#include "CbmKFMath.h"
4#include "CbmKF.h"
5#include "TString.h"
6
7#include <cmath>
8
9using std::fabs;
10
11TString CbmKFMaterial::Info() const{
12 char tmp[255];
13 sprintf( tmp, " ( id, z, dz, RadL )= ( %i, %f, %f, %f )",
15 return tmp;
16}
17
18
19Int_t CbmKFMaterial::Pass( Double_t ZCross, Double_t ZThick,
20 CbmKFTrackInterface &track,
21 Bool_t downstream, Double_t &QP0 ){
22 Bool_t err = 0;
23 Double_t *T = track.GetTrack();
24 Double_t *C = track.GetCovMatrix();
25 err = err || CbmKF::Instance()->Propagate( T, C, ZCross, QP0 );
26 if( err ) return err;
27 if( IsOutside( T[0], T[1] ) ) return 0;
28 Double_t Q5, Q8, Q9, Ecor;
29 err = err || CbmKFMath::GetNoise( ZThick/RadLength, F, Fe,
30 T[2], T[3], QP0,
31 track.GetMass(), track.IsElectron(), downstream,
32 &Q5,&Q8,&Q9,&Ecor);
33 if( err ) return err;
34 C[5]+=Q5;
35 C[8]+=Q8;
36 C[9]+=Q9;
37 QP0 *= Ecor;
38 T[ 4] *= Ecor;
39 C[10] *= Ecor;
40 C[11] *= Ecor;
41 C[12] *= Ecor;
42 C[13] *= Ecor;
43 C[14] *= Ecor*Ecor;
44 return 0;
45}
46
47CbmKFTube::CbmKFTube(Int_t ID_, Double_t x_, Double_t y_, Double_t z_, Double_t dz_, Double_t r_, Double_t R_, Double_t radL_):
48x(x_),
49y(y_),
50z(z_),
51dz(dz_),
52r(r_),
53R(R_),
54rr(r_*r_),
55RR(R_*R_)
56{
57 ID = ID_;
58 ZReference =z_;
59 ZThickness = dz_;
60 RadLength =radL_ ;
61 F = 1;
62}
63
64TString CbmKFTube::Info() const{
65 char tmp[255];
66 sprintf(tmp, " tube ( id, x,y,z, dz, r, R, RadL )= ( %i, %f, %f, %f, %f, %f, %f, %f )",
67 ID, x, y, z, dz, r, R, RadLength );
68 return tmp;
69}
70
71CbmKFBox::CbmKFBox(Int_t ID_, Double_t x_, Double_t y_, Double_t z_, Double_t dx_, Double_t dy_, Double_t dz_, Double_t radL_):
72x(x_),
73y(y_),
74z(z_),
75dx05(dx_/2),
76dy05(dy_/2),
77dz(dz_)
78{
79 ID = ID_;
80 ZReference =z_;
81 ZThickness = dz_;
82 RadLength =radL_ ;
83 F = 1;
84}
85
86Bool_t CbmKFBox::IsOutside( Double_t X, Double_t Y ){
87 return ( TMath::Abs(X-x)>dx05 || TMath::Abs(Y-y)>dy05 ) ;
88}
89
90TString CbmKFBox::Info() const{
91 char tmp[255];
92 sprintf(tmp, " box ( id, x,y,z, dx, dy, dz, RadL )= ( %i, %f, %f, %f, %f, %f, %f, %f )",
93 ID, x, y, z, dx05*2, dy05*2, dz, RadLength );
94 return tmp;
95}
96
97
98Int_t CbmKFCone::Pass( Double_t ZCross, Double_t ZThick,
99 CbmKFTrackInterface &track,
100 Bool_t downstream, Double_t &QP0 ){
101
102 Bool_t err = 0;
103 CbmKF *KF = CbmKF::Instance();
104 Double_t *T = track.GetTrack();
105 Double_t *C = track.GetCovMatrix();
106
107 Double_t zthick = ZThickness, zcross=ZReference;
108 Double_t T_tmp[6];
109 for(Int_t j=0; j<6; j++ ) T_tmp[j] = T[j];
110 err = err || KF->Propagate( T_tmp, 0, ZReference, QP0);
111 if( err ) return err;
112 Double_t cz1, ct1, cz2, ct2;
113 {
114 Double_t iz1, iz2, iZ1, iZ2;
115 Bool_t err1 = CbmKFMath::intersectCone( z1, z2, r1, r2, T_tmp, &iz1, &iz2 );
116 Bool_t err2 = CbmKFMath::intersectCone( z1, z2, R1, R2, T_tmp, &iZ1, &iZ2 );
117 if ( err1 || iz1<z1 || iz1>z2 ) iz1 = -200;
118 if ( err1 || iz2<z1 || iz2>z2 ) iz2 = -200;
119 if ( err2 || iZ1<z1 || iZ1>z2 ) iZ1 = -200;
120 if ( err2 || iZ2<z1 || iZ2>z2 ) iZ2 = -200;
121
122 if ( iz1>-200 && iZ1>-200 )
123 {
124 cz1 = ( iz1 + iZ1 )/2;
125 ct1 = fabs( iZ1 - iz1 );
126 }
127 else
128 {
129 cz1 = ZCross; //TODO Check me
130 ct1 = 0;
131 }
132
133 if ( iz2>-200 && iZ2>-200 )
134 {
135 cz2 = ( iz2 + iZ2 )/2;
136 ct2 = fabs( iZ2 - iz2 );
137 }
138 else
139 {
140 cz2 = ZCross; //TODO Check me
141 ct2 = 0;
142 }
143
144 if ( iz1<=-200 && iz2<=-200 && iZ1>-200 && iZ2>-200 )
145 {
146 cz1 = ( iZ1 + iZ2 )/2;
147 ct1 = fabs( iZ2 - iZ1 );
148 cz2 = ZCross; //TODO Check me
149 ct2 = 0;
150 }
151 }
152 Double_t dz1 = cz1 - T[5];
153 Double_t dz2 = cz2 - T[5];
154 if( fabs(dz1)<fabs(dz2) ){
155 zthick = ct1;
156 zcross = cz1;
157 }else{
158 zthick = ct2;
159 zcross = cz2;
160 }
161
162 err = err || KF->Propagate( T, C, zcross, QP0 );
163
164 Double_t Q5, Q8, Q9, Ecor;
165 err = err || CbmKFMath::GetNoise( zthick/RadLength, F, Fe,
166 T[2], T[3], QP0,
167 track.GetMass(), track.IsElectron(),downstream,
168 &Q5,&Q8,&Q9,&Ecor);
169 if( err ) return err;
170 C[5]+=Q5;
171 C[8]+=Q8;
172 C[9]+=Q9;
173 QP0 *= Ecor;
174 T[ 4] *= Ecor;
175 C[10] *= Ecor;
176 C[11] *= Ecor;
177 C[12] *= Ecor;
178 C[13] *= Ecor;
179 C[14] *= Ecor*Ecor;
180 return 0;
181}
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
Double_t x
Double_t z
TString Info() const
Bool_t IsOutside(Double_t X, Double_t Y)
Double_t dx05
Double_t y
Double_t dz
Double_t dy05
Double_t R2
Double_t z2
Double_t R1
Double_t r1
Double_t r2
Int_t Pass(Double_t ZCross, Double_t ZThick, CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)
Double_t z1
virtual Bool_t IsOutside(Double_t x, Double_t y)
Double_t ZReference
virtual Int_t Pass(Double_t ZCross, Double_t ZThick, CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)
virtual TString Info() const
Double_t RadLength
Double_t ZThickness
static Bool_t intersectCone(Double_t zCone, Double_t ZCone, Double_t rCone, Double_t RCone, const Double_t x[], Double_t *z1, Double_t *z2)
Definition CbmKFMath.cxx:13
static Int_t GetNoise(Double_t Lrl, Double_t F, Double_t Fe, Double_t tx, Double_t ty, Double_t qp, Double_t mass, Bool_t is_electron, Bool_t downstream_direction, Double_t *Q5, Double_t *Q8, Double_t *Q9, Double_t *Ecor)
virtual Double_t * GetTrack()
Is it electron.
virtual Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
virtual Double_t GetMass()
virtual Bool_t IsElectron()
Mass hypothesis.
Double_t R
Double_t x
TString Info() const
Double_t r
Double_t dz
Double_t y
Double_t z
Definition CbmKF.h:28
Int_t Propagate(Double_t *T, Double_t *C, Double_t z_out, Double_t QP0, Bool_t line=false)
Definition CbmKF.cxx:747
static CbmKF * Instance()
Definition CbmKF.h:35