Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
MCGIDI_distribution.cc
이 파일의 문서화 페이지로 가기
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
12 namespace GIDI {
13 using 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;
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;
78  energyType = MCGIDI_energyType_discreteGamma; }
79  else if( ( gammaEnergy = xDataTOM_getAttributesValueInElement( element, "primary" ) ) != NULL ) {
80  if( MCGIDI_misc_PQUStringToDoubleInUnitOf( smr, gammaEnergy, "MeV", &gammaEnergy_MeV ) ) goto err;
81  energyType = MCGIDI_energyType_primaryGamma;
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 
116 err:
117  MCGIDI_distribution_release( smr, distribution );
118  return( 1 );
119 }
120 
121 #if defined __cplusplus
122 }
123 #endif
124 
#define smr_setReportError2(smr, libraryID, code, fmt,...)
MCGIDI_POP * pop
Definition: MCGIDI.h:401
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)
int MCGIDI_misc_PQUStringToDoubleInUnitOf(statusMessageReporting *smr, char const *str, char const *toUnit, double *value)
Definition: MCGIDI_misc.cc:356
enum MCGIDI_distributionType type
Definition: MCGIDI.h:382
MCGIDI_energyAngular * MCGIDI_energyAngular_free(statusMessageReporting *smr, MCGIDI_energyAngular *energyAngular)
MCGIDI_KalbachMann * MCGIDI_KalbachMann_free(statusMessageReporting *smr, MCGIDI_KalbachMann *KalbachMann)
MCGIDI_angularEnergy * angularEnergy
Definition: MCGIDI.h:386
MCGIDI_product * product
Definition: MCGIDI.h:381
MCGIDI_energy * energy
Definition: MCGIDI.h:384
#define smr_malloc2(smr, size, zero, forItem)
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
MCGIDI_angularEnergy * MCGIDI_angularEnergy_free(statusMessageReporting *smr, MCGIDI_angularEnergy *energyAngular)
MCGIDI_energy * MCGIDI_energy_free(statusMessageReporting *smr, MCGIDI_energy *energy)
int MCGIDI_distribution_release(statusMessageReporting *smr, MCGIDI_distribution *distribution)
char * name
Definition: MCGIDI.h:232
MCGIDI_energyAngular * energyAngular
Definition: MCGIDI.h:385
MCGIDI_KalbachMann * KalbachMann
Definition: MCGIDI.h:387
#define smr_unknownID
MCGIDI_energyType
Definition: MCGIDI.h:214
MCGIDI_distribution * MCGIDI_distribution_new(statusMessageReporting *smr)
void * smr_freeMemory(void **p)
int MCGIDI_LLNLAngular_angularEnergy_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution)
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_distribution_initialize(statusMessageReporting *smr, MCGIDI_distribution *distribution)
MCGIDI_angular * angular
Definition: MCGIDI.h:383
int MCGIDI_energyAngular_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution)
MCGIDI_angular * MCGIDI_angular_free(statusMessageReporting *smr, MCGIDI_angular *angular)
MCGIDI_distribution distribution
Definition: MCGIDI.h:411
int MCGIDI_angularEnergy_parseFromTOM(statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_distribution *distribution)