7#include "TGeoManager.h"
8#include "TGeoMaterial.h"
11#include "TGeoVolume.h"
17 std::span<const double, 3> end,
18 std::span<double, 10> mparam) {
62 double mbarn = 1
E-3 * 1
E-24 * TMath::Na();
64 for (Int_t i = 0; i < 7; i++) bparam[i] = 0;
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]));
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;
83 TGeoNode* currentnode = 0;
84 TGeoNode* startnode = gGeoManager->InitTrack(start.data(), dir);
86 LOG(error) <<
"MeanMaterialBudget: start point out of geometry: x "
87 << start[0] <<
", y " << start[1] <<
", z " << start[2];
90 TGeoMaterial* material = startnode->GetVolume()->GetMedium()->GetMaterial();
91 lparam[0] = material->GetDensity();
92 if (lparam[0] > mparam[7]) mparam[7] = lparam[0];
93 lparam[1] = material->GetRadLen();
94 lparam[2] = material->GetA();
95 lparam[3] = material->GetZ();
97 lparam[5] = lparam[3] / lparam[2];
98 lparam[6] = material->GetIntLen();
99 double n = lparam[0] / lparam[2];
100 double sigma = 1. / (n * lparam[6]) /
mbarn;
101 if (sigma > mparam[9]) mparam[9] = sigma;
102 if (material->IsMixture()) {
103 TGeoMixture* mixture =
dynamic_cast<TGeoMixture*
>(material);
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];
116 gGeoManager->FindNextBoundaryAndStep(length, kFALSE);
118 double snext = gGeoManager->GetStep();
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];
131 while (length > TGeoShape::Tolerance()) {
132 currentnode = gGeoManager->GetCurrentNode();
133 if (snext < 2. * TGeoShape::Tolerance())
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];
149 return bparam[0] / step;
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];
160 if (snext >= length)
break;
161 if (!currentnode)
break;
163 material = currentnode->GetVolume()->GetMedium()->GetMaterial();
164 lparam[0] = material->GetDensity();
165 if (lparam[0] > mparam[7]) mparam[7] = lparam[0];
166 lparam[1] = material->GetRadLen();
167 lparam[2] = material->GetA();
168 lparam[3] = material->GetZ();
169 lparam[5] = lparam[3] / lparam[2];
170 lparam[6] = material->GetIntLen();
171 n = lparam[0] / lparam[2];
172 sigma = 1. / (n * lparam[6]) /
mbarn;
173 if (sigma > mparam[9]) mparam[9] = sigma;
174 if (material->IsMixture()) {
175 TGeoMixture* mixture =
dynamic_cast<TGeoMixture*
>(material);
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];
185 gGeoManager->FindNextBoundaryAndStep(length, kFALSE);
186 snext = gGeoManager->GetStep();
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;
double MeanMaterialBudget(std::span< const double, 3 > start, std::span< const double, 3 > end, std::span< double, 10 > mparam)