Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
MCGIDI_distribution.cc
Go to the documentation of this file.
1/*
2# <<BEGIN-copyright>>
3# <<END-copyright>>
4*/
5#include <string.h>
6#include <cmath>
7
8#include "MCGIDI.h"
9#include "MCGIDI_misc.h"
10
11#if defined __cplusplus
12namespace GIDI {
13using namespace GIDI;
14#endif
15
16/*
17************************************************************
18*/
20
21 MCGIDI_distribution *distribution;
22
23 if( ( distribution = (MCGIDI_distribution *) smr_malloc2( smr, sizeof( MCGIDI_distribution ), 0, "distribution" ) ) == NULL ) return( NULL );
24 if( MCGIDI_distribution_initialize( smr, distribution ) ) distribution = MCGIDI_distribution_free( smr, distribution );
25 return( distribution );
26}
27/*
28************************************************************
29*/
31
32 memset( distribution, 0, sizeof( MCGIDI_distribution ) );
33 return( 0 );
34}
35/*
36************************************************************
37*/
39
40 MCGIDI_distribution_release( smr, distribution );
41 smr_freeMemory( (void **) &distribution );
42 return( NULL );
43}
44/*
45************************************************************
46*/
48
49 if( distribution->angular ) distribution->angular = MCGIDI_angular_free( smr, distribution->angular );
50 if( distribution->energy ) distribution->energy = MCGIDI_energy_free( smr, distribution->energy );
51 if( distribution->KalbachMann ) distribution->KalbachMann = MCGIDI_KalbachMann_free( smr, distribution->KalbachMann );
52 if( distribution->energyAngular ) distribution->energyAngular = MCGIDI_energyAngular_free( smr, distribution->energyAngular );
53 if( distribution->angularEnergy ) distribution->angularEnergy = MCGIDI_angularEnergy_free( smr, distribution->angularEnergy );
54
55 MCGIDI_distribution_initialize( smr, distribution );
56 return( 0 );
57}
58/*
59************************************************************
60*/
62
63 char const *nativeData, *gammaEnergy;
64 double gammaEnergy_MeV{0.0};
65 MCGIDI_distribution *distribution = &(product->distribution);
66 xDataTOM_element *distributionElement;
68
69 MCGIDI_distribution_initialize( smr, distribution );
70
71 distribution->product = product;
72 if( ( distributionElement = xDataTOME_getOneElementByName( smr, element, "distributions", 1 ) ) == NULL ) goto err;
73 if( ( nativeData = xDataTOM_getAttributesValueInElement( distributionElement, "nativeData" ) ) == NULL ) goto err;
74
75 if( strcmp( product->pop->name, "gamma" ) == 0 ) {
76 if( ( gammaEnergy = xDataTOM_getAttributesValueInElement( element, "discrete" ) ) != NULL ) {
77 if( MCGIDI_misc_PQUStringToDoubleInUnitOf( smr, gammaEnergy, "MeV", &gammaEnergy_MeV ) ) goto err;
79 else if( ( gammaEnergy = xDataTOM_getAttributesValueInElement( element, "primary" ) ) != NULL ) {
80 if( MCGIDI_misc_PQUStringToDoubleInUnitOf( smr, gammaEnergy, "MeV", &gammaEnergy_MeV ) ) goto err;
82 }
83 if( gammaEnergy != NULL ) {
84 if( strcmp( nativeData, "angular" ) ) {
85 smr_setReportError2( smr, smr_unknownID, 1, "%s gamma can only have a distribution with 'nativeData' = 'angular' and not '%s'",
86 gammaEnergy, nativeData );
87 goto err;
88 }
89 nativeData = "uncorrelated";
90 }
91 }
92
93 if( strcmp( nativeData, "angular" ) == 0 ) {
94 if( MCGIDI_angular_parseFromTOM( smr, distributionElement, distribution, norms ) ) goto err; }
95 else if( strcmp( nativeData, "uncorrelated" ) == 0 ) {
96 if( MCGIDI_uncorrelated_parseFromTOM( smr, distributionElement, distribution, norms, energyType, gammaEnergy_MeV ) ) goto err; }
97 else if( strcmp( nativeData, "energyAngular" ) == 0 ) {
98 if( MCGIDI_energyAngular_parseFromTOM( smr, distributionElement, distribution ) ) goto err; }
99 else if( strcmp( nativeData, "angularEnergy" ) == 0 ) {
100 if( MCGIDI_angularEnergy_parseFromTOM( smr, distributionElement, distribution ) ) goto err; }
101 else if( strcmp( nativeData, "Legendre" ) == 0 ) {
102 if( MCGIDI_energyAngular_parseFromTOM( smr, distributionElement, distribution ) ) goto err; }
103 else if( strcmp( nativeData, "LLNLAngular_angularEnergy" ) == 0 ) {
104 if( MCGIDI_LLNLAngular_angularEnergy_parseFromTOM( smr, distributionElement, distribution ) ) goto err; }
105 else if( strcmp( nativeData, "none" ) == 0 ) {
106 distribution->type = MCGIDI_distributionType_none_e; }
107 else if( strcmp( nativeData, "unknown" ) == 0 ) {
108 distribution->type = MCGIDI_distributionType_unknown_e; }
109 else {
110 smr_setReportError2( smr, smr_unknownID, 1, "Unsupported distribution = '%s'\n", nativeData );
111 goto err;
112 }
113
114 return( 0 );
115
116err:
117 MCGIDI_distribution_release( smr, distribution );
118 return( 1 );
119}
120
121#if defined __cplusplus
122}
123#endif
124
MCGIDI_energyAngular * MCGIDI_energyAngular_free(statusMessageReporting *smr, MCGIDI_energyAngular *energyAngular)
MCGIDI_angularEnergy * MCGIDI_angularEnergy_free(statusMessageReporting *smr, MCGIDI_angularEnergy *energyAngular)
int MCGIDI_distribution_initialize(statusMessageReporting *smr, MCGIDI_distribution *distribution)
int MCGIDI_LLNLAngular_angularEnergy_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution)
MCGIDI_energy * MCGIDI_energy_free(statusMessageReporting *smr, MCGIDI_energy *energy)
MCGIDI_distribution * MCGIDI_distribution_free(statusMessageReporting *smr, MCGIDI_distribution *distribution)
int MCGIDI_uncorrelated_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution, ptwXYPoints *norms, enum MCGIDI_energyType energyType, double gammaEnergy_MeV)
@ MCGIDI_distributionType_unknown_e
Definition MCGIDI.h:204
@ MCGIDI_distributionType_none_e
Definition MCGIDI.h:204
MCGIDI_angular * MCGIDI_angular_free(statusMessageReporting *smr, MCGIDI_angular *angular)
int MCGIDI_angular_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution, ptwXYPoints *norms)
int MCGIDI_distribution_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_product *product, MCGIDI_POPs *pops, ptwXYPoints *norms)
int MCGIDI_angularEnergy_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution)
int MCGIDI_energyAngular_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution)
MCGIDI_distribution * MCGIDI_distribution_new(statusMessageReporting *smr)
int MCGIDI_distribution_release(statusMessageReporting *smr, MCGIDI_distribution *distribution)
int MCGIDI_misc_PQUStringToDoubleInUnitOf(statusMessageReporting *smr, char const *str, char const *toUnit, double *value)
MCGIDI_energyType
Definition MCGIDI.h:210
@ MCGIDI_energyType_unknown
Definition MCGIDI.h:210
@ MCGIDI_energyType_primaryGamma
Definition MCGIDI.h:210
@ MCGIDI_energyType_discreteGamma
Definition MCGIDI.h:210
MCGIDI_KalbachMann * MCGIDI_KalbachMann_free(statusMessageReporting *smr, MCGIDI_KalbachMann *KalbachMann)
#define smr_setReportError2(smr, libraryID, code, fmt,...)
void * smr_freeMemory(void **p)
#define smr_malloc2(smr, size, zero, forItem)
#define smr_unknownID
char * name
Definition MCGIDI.h:228
MCGIDI_angularEnergy * angularEnergy
Definition MCGIDI.h:382
MCGIDI_energy * energy
Definition MCGIDI.h:380
MCGIDI_product * product
Definition MCGIDI.h:377
MCGIDI_angular * angular
Definition MCGIDI.h:379
enum MCGIDI_distributionType type
Definition MCGIDI.h:378
MCGIDI_energyAngular * energyAngular
Definition MCGIDI.h:381
MCGIDI_KalbachMann * KalbachMann
Definition MCGIDI.h:383
MCGIDI_POP * pop
Definition MCGIDI.h:397
MCGIDI_distribution distribution
Definition MCGIDI.h:407
xDataTOM_element * xDataTOME_getOneElementByName(statusMessageReporting *smr, xDataTOM_element *element, char const *name, int required)
Definition xDataTOM.cc:246
char const * xDataTOM_getAttributesValueInElement(xDataTOM_element *element, char const *name)
Definition xDataTOM.cc:286