5#include "TRestGeant4PrimaryGeneratorInfo.h"
11#include <TRestStringOutput.h>
17using namespace TRestGeant4PrimaryGeneratorTypes;
19string TRestGeant4PrimaryGeneratorTypes::SpatialGeneratorTypesToString(
const SpatialGeneratorTypes& type) {
21 case SpatialGeneratorTypes::CUSTOM:
23 case SpatialGeneratorTypes::VOLUME:
25 case SpatialGeneratorTypes::SURFACE:
27 case SpatialGeneratorTypes::POINT:
29 case SpatialGeneratorTypes::COSMIC:
32 cout <<
"TRestGeant4PrimaryGeneratorTypes::SpatialGeneratorTypesToString - Error - Unknown "
33 "SpatialGeneratorTypes"
38SpatialGeneratorTypes TRestGeant4PrimaryGeneratorTypes::StringToSpatialGeneratorTypes(
const string& type) {
39 if (TString(type).EqualTo(SpatialGeneratorTypesToString(SpatialGeneratorTypes::CUSTOM),
40 TString::ECaseCompare::kIgnoreCase)) {
41 return SpatialGeneratorTypes::CUSTOM;
42 }
else if (TString(type).EqualTo(SpatialGeneratorTypesToString(SpatialGeneratorTypes::VOLUME),
43 TString::ECaseCompare::kIgnoreCase)) {
44 return SpatialGeneratorTypes::VOLUME;
45 }
else if (TString(type).EqualTo(SpatialGeneratorTypesToString(SpatialGeneratorTypes::SURFACE),
46 TString::ECaseCompare::kIgnoreCase)) {
47 return SpatialGeneratorTypes::SURFACE;
48 }
else if (TString(type).EqualTo(SpatialGeneratorTypesToString(SpatialGeneratorTypes::POINT),
49 TString::ECaseCompare::kIgnoreCase)) {
50 return SpatialGeneratorTypes::POINT;
51 }
else if (TString(type).EqualTo(SpatialGeneratorTypesToString(SpatialGeneratorTypes::COSMIC),
52 TString::ECaseCompare::kIgnoreCase)) {
53 return SpatialGeneratorTypes::COSMIC;
55 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToSpatialGeneratorTypes - Error - Unknown "
56 "SpatialGeneratorTypes: "
62string TRestGeant4PrimaryGeneratorTypes::SpatialGeneratorShapesToString(
const SpatialGeneratorShapes& type) {
64 case SpatialGeneratorShapes::GDML:
66 case SpatialGeneratorShapes::WALL:
68 case SpatialGeneratorShapes::CIRCLE:
70 case SpatialGeneratorShapes::BOX:
72 case SpatialGeneratorShapes::SPHERE:
74 case SpatialGeneratorShapes::CYLINDER:
77 cout <<
"TRestGeant4PrimaryGeneratorTypes::SpatialGeneratorShapesToString - Error - Unknown "
78 "SpatialGeneratorShapes"
83SpatialGeneratorShapes TRestGeant4PrimaryGeneratorTypes::StringToSpatialGeneratorShapes(
const string& type) {
84 if (TString(type).EqualTo(SpatialGeneratorShapesToString(SpatialGeneratorShapes::GDML),
85 TString::ECaseCompare::kIgnoreCase)) {
86 return SpatialGeneratorShapes::GDML;
87 }
else if (TString(type).EqualTo(SpatialGeneratorShapesToString(SpatialGeneratorShapes::WALL),
88 TString::ECaseCompare::kIgnoreCase)) {
89 return SpatialGeneratorShapes::WALL;
90 }
else if (TString(type).EqualTo(SpatialGeneratorShapesToString(SpatialGeneratorShapes::CIRCLE),
91 TString::ECaseCompare::kIgnoreCase)) {
92 return SpatialGeneratorShapes::CIRCLE;
93 }
else if (TString(type).EqualTo(SpatialGeneratorShapesToString(SpatialGeneratorShapes::BOX),
94 TString::ECaseCompare::kIgnoreCase)) {
95 return SpatialGeneratorShapes::BOX;
96 }
else if (TString(type).EqualTo(SpatialGeneratorShapesToString(SpatialGeneratorShapes::SPHERE),
97 TString::ECaseCompare::kIgnoreCase)) {
98 return SpatialGeneratorShapes::SPHERE;
99 }
else if (TString(type).EqualTo(SpatialGeneratorShapesToString(SpatialGeneratorShapes::CYLINDER),
100 TString::ECaseCompare::kIgnoreCase)) {
101 return SpatialGeneratorShapes::CYLINDER;
104 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToSpatialGeneratorShapes - Error - Unknown "
105 "SpatialGeneratorShapes: "
111string TRestGeant4PrimaryGeneratorTypes::EnergyDistributionTypesToString(
112 const EnergyDistributionTypes& type) {
114 case EnergyDistributionTypes::TH1D:
116 case EnergyDistributionTypes::FORMULA:
118 case EnergyDistributionTypes::FORMULA2:
120 case EnergyDistributionTypes::MONO:
122 case EnergyDistributionTypes::FLAT:
124 case EnergyDistributionTypes::LOG:
127 cout <<
"TRestGeant4PrimaryGeneratorTypes::EnergyDistributionTypesToString - Error - Unknown energy "
133EnergyDistributionTypes TRestGeant4PrimaryGeneratorTypes::StringToEnergyDistributionTypes(
134 const string& type) {
135 if (TString(type).EqualTo(EnergyDistributionTypesToString(EnergyDistributionTypes::TH1D),
136 TString::ECaseCompare::kIgnoreCase)) {
137 return EnergyDistributionTypes::TH1D;
138 }
else if (TString(type).EqualTo(EnergyDistributionTypesToString(EnergyDistributionTypes::FORMULA),
139 TString::ECaseCompare::kIgnoreCase)) {
140 return EnergyDistributionTypes::FORMULA;
141 }
else if (TString(type).EqualTo(EnergyDistributionTypesToString(EnergyDistributionTypes::FORMULA2),
142 TString::ECaseCompare::kIgnoreCase)) {
143 return EnergyDistributionTypes::FORMULA2;
144 }
else if (TString(type).EqualTo(EnergyDistributionTypesToString(EnergyDistributionTypes::MONO),
145 TString::ECaseCompare::kIgnoreCase)) {
146 return EnergyDistributionTypes::MONO;
147 }
else if (TString(type).EqualTo(EnergyDistributionTypesToString(EnergyDistributionTypes::FLAT),
148 TString::ECaseCompare::kIgnoreCase)) {
149 return EnergyDistributionTypes::FLAT;
150 }
else if (TString(type).EqualTo(EnergyDistributionTypesToString(EnergyDistributionTypes::LOG),
151 TString::ECaseCompare::kIgnoreCase)) {
152 return EnergyDistributionTypes::LOG;
154 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToEnergyDistributionTypes - Error - Unknown "
155 "EnergyDistributionTypes: "
161string TRestGeant4PrimaryGeneratorTypes::EnergyDistributionFormulasToString(
162 const EnergyDistributionFormulas& type) {
164 case EnergyDistributionFormulas::COSMIC_NEUTRONS:
165 return "CosmicNeutrons";
166 case EnergyDistributionFormulas::COSMIC_GAMMAS:
167 return "CosmicGammas";
169 cout <<
"TRestGeant4PrimaryGeneratorTypes::EnergyDistributionFormulasToString - Error - Unknown energy "
170 "distribution formula"
175EnergyDistributionFormulas TRestGeant4PrimaryGeneratorTypes::StringToEnergyDistributionFormulas(
176 const string& type) {
177 if (TString(type).EqualTo(EnergyDistributionFormulasToString(EnergyDistributionFormulas::COSMIC_NEUTRONS),
178 TString::ECaseCompare::kIgnoreCase)) {
179 return EnergyDistributionFormulas::COSMIC_NEUTRONS;
180 }
else if (TString(type).EqualTo(
181 EnergyDistributionFormulasToString(EnergyDistributionFormulas::COSMIC_GAMMAS),
182 TString::ECaseCompare::kIgnoreCase)) {
183 return EnergyDistributionFormulas::COSMIC_GAMMAS;
185 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToEnergyDistributionFormulas - Error - Unknown "
186 "energyDistributionFormulas: "
192TF1 TRestGeant4PrimaryGeneratorTypes::EnergyDistributionFormulasToRootFormula(
193 const EnergyDistributionFormulas& type) {
195 case EnergyDistributionFormulas::COSMIC_NEUTRONS: {
197 const char* title =
"Cosmic Neutrons at Sea Level";
200 "1.006E-6 * TMath::Exp(-0.3500 * TMath::Power(TMath::Log(x * 1E-3), 2) + 2.1451 * "
201 "TMath::Log(x * 1E-3)) + "
202 "1.011E-3 * TMath::Exp(-0.4106 * TMath::Power(TMath::Log(x * 1E-3), 2) - 0.6670 * "
203 "TMath::Log(x * 1E-3))",
205 distribution.SetNormalized(
true);
206 distribution.SetTitle(title);
207 distribution.GetXaxis()->SetTitle(
"Energy (keV)");
210 case EnergyDistributionFormulas::COSMIC_GAMMAS:
213 cout <<
"TRestGeant4PrimaryGeneratorTypes::EnergyDistributionFormulasToRootFormula - Error - Unknown "
214 "energy distribution formula"
219string TRestGeant4PrimaryGeneratorTypes::AngularDistributionTypesToString(
220 const AngularDistributionTypes& type) {
222 case AngularDistributionTypes::TH1D:
224 case AngularDistributionTypes::FORMULA:
226 case AngularDistributionTypes::FORMULA2:
228 case AngularDistributionTypes::ISOTROPIC:
230 case AngularDistributionTypes::FLUX:
232 case AngularDistributionTypes::BACK_TO_BACK:
233 return "Back to back";
235 cout <<
"TRestGeant4PrimaryGeneratorTypes::AngularDistributionTypesToString - Error - Unknown angular "
241AngularDistributionTypes TRestGeant4PrimaryGeneratorTypes::StringToAngularDistributionTypes(
242 const string& type) {
243 if (TString(type).EqualTo(AngularDistributionTypesToString(AngularDistributionTypes::TH1D),
244 TString::ECaseCompare::kIgnoreCase)) {
245 return AngularDistributionTypes::TH1D;
246 }
else if (TString(type).EqualTo(AngularDistributionTypesToString(AngularDistributionTypes::FORMULA),
247 TString::ECaseCompare::kIgnoreCase)) {
248 return AngularDistributionTypes::FORMULA;
249 }
else if (TString(type).EqualTo(AngularDistributionTypesToString(AngularDistributionTypes::FORMULA2),
250 TString::ECaseCompare::kIgnoreCase)) {
251 return AngularDistributionTypes::FORMULA2;
252 }
else if (TString(type).EqualTo(AngularDistributionTypesToString(AngularDistributionTypes::ISOTROPIC),
253 TString::ECaseCompare::kIgnoreCase)) {
254 return AngularDistributionTypes::ISOTROPIC;
255 }
else if (TString(type).EqualTo(AngularDistributionTypesToString(AngularDistributionTypes::FLUX),
256 TString::ECaseCompare::kIgnoreCase)) {
257 return AngularDistributionTypes::FLUX;
258 }
else if (TString(type).EqualTo(AngularDistributionTypesToString(AngularDistributionTypes::BACK_TO_BACK),
259 TString::ECaseCompare::kIgnoreCase)) {
260 return AngularDistributionTypes::BACK_TO_BACK;
262 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToAngularDistributionTypes - Error - Unknown "
263 "AngularDistributionTypes: "
269string TRestGeant4PrimaryGeneratorTypes::AngularDistributionFormulasToString(
270 const AngularDistributionFormulas& type) {
272 case AngularDistributionFormulas::COS2:
274 case AngularDistributionFormulas::COS3:
277 cout <<
"TRestGeant4PrimaryGeneratorTypes::AngularDistributionFormulasToString - Error - Unknown angular "
278 "distribution formula"
283AngularDistributionFormulas TRestGeant4PrimaryGeneratorTypes::StringToAngularDistributionFormulas(
284 const string& type) {
285 if (TString(type).EqualTo(AngularDistributionFormulasToString(AngularDistributionFormulas::COS2),
286 TString::ECaseCompare::kIgnoreCase)) {
287 return AngularDistributionFormulas::COS2;
288 }
else if (TString(type).EqualTo(AngularDistributionFormulasToString(AngularDistributionFormulas::COS3),
289 TString::ECaseCompare::kIgnoreCase)) {
290 return AngularDistributionFormulas::COS3;
292 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToAngularDistributionFormulas - Error - Unknown "
293 "AngularDistributionFormulas: "
299TF1 TRestGeant4PrimaryGeneratorTypes::AngularDistributionFormulasToRootFormula(
300 const AngularDistributionFormulas& type) {
302 case AngularDistributionFormulas::COS2: {
303 auto cos2 = [](
double* xs,
double* ps) {
304 if (xs[0] >= 0 && xs[0] <= TMath::Pi() / 2) {
305 return TMath::Power(TMath::Cos(xs[0]), 2);
309 const char* title =
"AngularDistribution: Cos2";
310 auto f = TF1(title, cos2, 0.0, TMath::Pi());
314 case AngularDistributionFormulas::COS3: {
315 auto cos3 = [](
double* xs,
double* ps) {
316 if (xs[0] >= 0 && xs[0] <= TMath::Pi() / 2) {
317 return TMath::Power(TMath::Cos(xs[0]), 3);
321 const char* title =
"AngularDistribution: Cos3";
322 auto f = TF1(title, cos3, 0.0, TMath::Pi());
327 cout <<
"TRestGeant4PrimaryGeneratorTypes::AngularDistributionFormulasToRootFormula - Error - Unknown "
328 "angular distribution formula"
333string TRestGeant4PrimaryGeneratorTypes::EnergyAndAngularDistributionFormulasToString(
334 const EnergyAndAngularDistributionFormulas& type) {
336 case EnergyAndAngularDistributionFormulas::COSMIC_MUONS:
337 return "CosmicMuons";
339 cout <<
"TRestGeant4PrimaryGeneratorTypes::EnergyAndAngularDistributionFormulasToString - Error - "
340 "Unknown energy/angular distribution formula"
345EnergyAndAngularDistributionFormulas
346TRestGeant4PrimaryGeneratorTypes::StringToEnergyAndAngularDistributionFormulas(
const string& type) {
347 if (TString(type).EqualTo(
348 EnergyAndAngularDistributionFormulasToString(EnergyAndAngularDistributionFormulas::COSMIC_MUONS),
349 TString::ECaseCompare::kIgnoreCase)) {
350 return EnergyAndAngularDistributionFormulas::COSMIC_MUONS;
352 cout <<
"TRestGeant4PrimaryGeneratorTypes::StringToEnergyAndAngularDistributionFormulas - Error - "
353 "Unknown AngularDistributionFormulas: "
359TF2 TRestGeant4PrimaryGeneratorTypes::EnergyAndAngularDistributionFormulasToRootFormula(
360 const EnergyAndAngularDistributionFormulas& type) {
362 case EnergyAndAngularDistributionFormulas::COSMIC_MUONS: {
367 const char* title =
"Cosmic Muons Energy and Angular";
370 "2*TMath::Pi()*1E-6*0.14*TMath::Power(x*1E-6*(1.+3.64/"
371 "(x*1E-6*TMath::Power(TMath::Power((TMath::Power(TMath::Cos(y),2)+0.0105212-0.068287*"
372 "TMath::Power(TMath::Cos(y),0.958633)+0.0407253*TMath::Power(TMath::Cos(y),0.817285)"
373 ")/(0.982960),0.5),1.29))),-2.7)*(1./"
374 "(1.+(1.1*x*1E-6*TMath::Power((TMath::Power(TMath::Cos(y),2)+0.0105212-0.068287*TMath::"
375 "Power(TMath::Cos(y),0.958633)+0.0407253*TMath::Power(TMath::Cos(y),0.817285))/"
376 "(0.982960),0.5))/115.)+0.054/"
377 "(1.+(1.1*x*1E-6*TMath::Power((TMath::Power(TMath::Cos(y),2)+0.0105212-0.068287*TMath::"
378 "Power(TMath::Cos(y),0.958633)+0.0407253*TMath::Power(TMath::Cos(y),0.817285))/"
379 "(0.982960),0.5))/850.))*(2.*TMath::Sin(y)*TMath::Pi())",
380 2.0E5, 5.0E9, 0, TMath::Pi() / 2.);
391 cout <<
"TRestGeant4PrimaryGeneratorTypes::EnergyAndAngularDistributionFormulasToRootFormula - Error - "
392 "Unknown energy and angular distribution formula"
397void TRestGeant4PrimaryGeneratorInfo::Print()
const {
399 RESTMetadata <<
"Generator type: " << SpatialGeneratorTypesToString(typeEnum) << RESTendl;
401 if (typeEnum != SpatialGeneratorTypes::POINT) {
403 RESTMetadata <<
"Generator shape: " << SpatialGeneratorShapesToString(shapeEnum);
404 if (shapeEnum == SpatialGeneratorShapes::GDML) {
407 if (shapeEnum == SpatialGeneratorShapes::BOX) {
408 RESTMetadata <<
", (length, width, height): ";
409 }
else if (shapeEnum == SpatialGeneratorShapes::SPHERE) {
410 RESTMetadata <<
", (radius, , ): ";
411 }
else if (shapeEnum == SpatialGeneratorShapes::WALL) {
412 RESTMetadata <<
", (length, width, ): ";
413 }
else if (shapeEnum == SpatialGeneratorShapes::CIRCLE) {
414 RESTMetadata <<
", (radius, , ): ";
415 }
else if (shapeEnum == SpatialGeneratorShapes::CYLINDER) {
416 RESTMetadata <<
", (radius, length, ): ";
TVector3 fSpatialGeneratorSize
The size of the generator. Stores up to three dimensions according to the shape box: length,...
TString fSpatialGeneratorFrom
The volume name where the events are generated, in case of volume or surface generator types.
Double_t fSpatialGeneratorRotationValue
degrees of rotation for generator virtual shape along the axis
TVector3 fSpatialGeneratorPosition
The position of the generator for virtual, and point, generator types.
TVector3 fSpatialGeneratorRotationAxis
A 3d-std::vector with the angles, measured in degrees, of a XYZ rotation applied to the virtual gener...
TString fSpatialGeneratorShape
Shape of spatial generator (wall, GDML, sphere, etc)
TString fSpatialGeneratorType
Type of spatial generator (point, surface, volume, custom)