18 {
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 mparam[0] = 0;
50 mparam[1] = 1;
51 mparam[2] = 0;
52 mparam[3] = 0;
53 mparam[4] = 0;
54 mparam[5] = 0;
55 mparam[6] = 0;
56 mparam[7] = 0;
57 mparam[8] = 0;
58 mparam[9] = 0;
59
60 double bparam[7];
61 double lparam[7];
62 double mbarn = 1
E-3 * 1
E-24 * TMath::Na();
63
64 for (Int_t i = 0; i < 7; i++) bparam[i] = 0;
65
66 if (!gGeoManager) {
67 return 0.;
68 }
69
70 double length;
71 double dir[3];
72 length = TMath::Sqrt((end[0] - start[0]) * (end[0] - start[0]) +
73 (end[1] - start[1]) * (end[1] - start[1]) +
74 (end[2] - start[2]) * (end[2] - start[2]));
75 mparam[4] = length;
76 if (length < TGeoShape::Tolerance()) return 0.0;
77 double invlen = 1. / length;
78 dir[0] = (end[0] - start[0]) * invlen;
79 dir[1] = (end[1] - start[1]) * invlen;
80 dir[2] = (end[2] - start[2]) * invlen;
81
82
83 TGeoNode* currentnode = 0;
84 TGeoNode* startnode = gGeoManager->InitTrack(start.data(), dir);
85 if (!startnode) {
86 LOG(error) << "MeanMaterialBudget: start point out of geometry: x "
87 << start[0] << ", y " << start[1] << ", z " << start[2];
88 return 0.0;
89 }
90 TGeoMaterial*
material = startnode->GetVolume()->GetMedium()->GetMaterial();
92 if (lparam[0] > mparam[7]) mparam[7] = lparam[0];
96 lparam[4] = length;
97 lparam[5] = lparam[3] / lparam[2];
99 double n = lparam[0] / lparam[2];
101 if (sigma > mparam[9]) mparam[9] =
sigma;
103 TGeoMixture* mixture =
dynamic_cast<TGeoMixture*
>(
material);
104 lparam[5] = 0;
105 double sum = 0;
106 for (Int_t iel = 0; iel < mixture->GetNelements(); iel++) {
107 sum += mixture->GetWmixt()[iel];
108 lparam[5] += mixture->GetZmixt()[iel] * mixture->GetWmixt()[iel] /
109 mixture->GetAmixt()[iel];
110 }
111 lparam[5] /= sum;
112 }
113
114
115
116 gGeoManager->FindNextBoundaryAndStep(length, kFALSE);
118 double snext = gGeoManager->GetStep();
119
120 if (!gGeoManager->IsOnBoundary()) {
121 mparam[0] = lparam[0];
122 mparam[1] = lparam[4] / lparam[1];
123 mparam[2] = lparam[2];
124 mparam[3] = lparam[3];
125 mparam[4] = lparam[4];
126 mparam[8] = lparam[4] / lparam[6];
127 return lparam[0];
128 }
129
130 Int_t nzero = 0;
131 while (length > TGeoShape::Tolerance()) {
132 currentnode = gGeoManager->GetCurrentNode();
133 if (snext < 2. * TGeoShape::Tolerance())
134 nzero++;
135 else
136 nzero = 0;
137 if (nzero > 3) {
138
139
140 mparam[0] = bparam[0] /
step;
141 mparam[1] = bparam[1];
142 mparam[2] = bparam[2] /
step;
143 mparam[3] = bparam[3] /
step;
144 mparam[5] = bparam[5] /
step;
145 mparam[8] = bparam[6];
147 mparam[0] = 0.;
148 mparam[1] = 1000000;
149 return bparam[0] /
step;
150 }
151 mparam[6] += 1.;
153 bparam[1] += snext / lparam[1];
154 bparam[2] += snext * lparam[2];
155 bparam[3] += snext * lparam[3];
156 bparam[5] += snext * lparam[5];
157 bparam[6] += snext / lparam[6];
158 bparam[0] += snext * lparam[0];
159
160 if (snext >= length) break;
161 if (!currentnode) break;
162 length -= snext;
163 material = currentnode->GetVolume()->GetMedium()->GetMaterial();
165 if (lparam[0] > mparam[7]) mparam[7] = lparam[0];
169 lparam[5] = lparam[3] / lparam[2];
171 n = lparam[0] / lparam[2];
173 if (sigma > mparam[9]) mparam[9] =
sigma;
175 TGeoMixture* mixture =
dynamic_cast<TGeoMixture*
>(
material);
176 lparam[5] = 0;
177 double sum = 0;
178 for (Int_t iel = 0; iel < mixture->GetNelements(); iel++) {
179 sum += mixture->GetWmixt()[iel];
180 lparam[5] += mixture->GetZmixt()[iel] * mixture->GetWmixt()[iel] /
181 mixture->GetAmixt()[iel];
182 }
183 lparam[5] /= sum;
184 }
185 gGeoManager->FindNextBoundaryAndStep(length, kFALSE);
186 snext = gGeoManager->GetStep();
187 }
188 mparam[0] = bparam[0] /
step;
189 mparam[1] = bparam[1];
190 mparam[2] = bparam[2] /
step;
191 mparam[3] = bparam[3] /
step;
192 mparam[5] = bparam[5] /
step;
193 mparam[8] = bparam[6];
194 return bparam[0] /
step;
195}