Geant4 Cross Reference |
1 /* 1 /* 2 # <<BEGIN-copyright>> 2 # <<BEGIN-copyright>> 3 # <<END-copyright>> 3 # <<END-copyright>> 4 */ 4 */ 5 #include <string.h> 5 #include <string.h> 6 #include <cmath> 6 #include <cmath> 7 7 8 #include "MCGIDI.h" 8 #include "MCGIDI.h" 9 #include "MCGIDI_misc.h" 9 #include "MCGIDI_misc.h" 10 10 11 #if defined __cplusplus 11 #if defined __cplusplus 12 namespace GIDI { 12 namespace GIDI { 13 using namespace GIDI; 13 using namespace GIDI; 14 #endif 14 #endif 15 15 16 /* 16 /* 17 ********************************************** 17 ************************************************************ 18 */ 18 */ 19 MCGIDI_distribution *MCGIDI_distribution_new( 19 MCGIDI_distribution *MCGIDI_distribution_new( statusMessageReporting *smr ) { 20 20 21 MCGIDI_distribution *distribution; 21 MCGIDI_distribution *distribution; 22 22 23 if( ( distribution = (MCGIDI_distribution 23 if( ( distribution = (MCGIDI_distribution *) smr_malloc2( smr, sizeof( MCGIDI_distribution ), 0, "distribution" ) ) == NULL ) return( NULL ); 24 if( MCGIDI_distribution_initialize( smr, d 24 if( MCGIDI_distribution_initialize( smr, distribution ) ) distribution = MCGIDI_distribution_free( smr, distribution ); 25 return( distribution ); 25 return( distribution ); 26 } 26 } 27 /* 27 /* 28 ********************************************** 28 ************************************************************ 29 */ 29 */ 30 int MCGIDI_distribution_initialize( statusMess 30 int MCGIDI_distribution_initialize( statusMessageReporting * /*smr*/, MCGIDI_distribution *distribution ) { 31 31 32 memset( distribution, 0, sizeof( MCGIDI_di 32 memset( distribution, 0, sizeof( MCGIDI_distribution ) ); 33 return( 0 ); 33 return( 0 ); 34 } 34 } 35 /* 35 /* 36 ********************************************** 36 ************************************************************ 37 */ 37 */ 38 MCGIDI_distribution *MCGIDI_distribution_free( 38 MCGIDI_distribution *MCGIDI_distribution_free( statusMessageReporting *smr, MCGIDI_distribution *distribution ) { 39 39 40 MCGIDI_distribution_release( smr, distribu 40 MCGIDI_distribution_release( smr, distribution ); 41 smr_freeMemory( (void **) &distribution ); 41 smr_freeMemory( (void **) &distribution ); 42 return( NULL ); 42 return( NULL ); 43 } 43 } 44 /* 44 /* 45 ********************************************** 45 ************************************************************ 46 */ 46 */ 47 int MCGIDI_distribution_release( statusMessage 47 int MCGIDI_distribution_release( statusMessageReporting *smr, MCGIDI_distribution *distribution ) { 48 48 49 if( distribution->angular ) distribution-> 49 if( distribution->angular ) distribution->angular = MCGIDI_angular_free( smr, distribution->angular ); 50 if( distribution->energy ) distribution->e 50 if( distribution->energy ) distribution->energy = MCGIDI_energy_free( smr, distribution->energy ); 51 if( distribution->KalbachMann ) distributi 51 if( distribution->KalbachMann ) distribution->KalbachMann = MCGIDI_KalbachMann_free( smr, distribution->KalbachMann ); 52 if( distribution->energyAngular ) distribu 52 if( distribution->energyAngular ) distribution->energyAngular = MCGIDI_energyAngular_free( smr, distribution->energyAngular ); 53 if( distribution->angularEnergy ) distribu 53 if( distribution->angularEnergy ) distribution->angularEnergy = MCGIDI_angularEnergy_free( smr, distribution->angularEnergy ); 54 54 55 MCGIDI_distribution_initialize( smr, distr 55 MCGIDI_distribution_initialize( smr, distribution ); 56 return( 0 ); 56 return( 0 ); 57 } 57 } 58 /* 58 /* 59 ********************************************** 59 ************************************************************ 60 */ 60 */ 61 int MCGIDI_distribution_parseFromTOM( statusMe 61 int MCGIDI_distribution_parseFromTOM( statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_product *product, MCGIDI_POPs * /*pops*/, ptwXYPoints *norms ) { 62 62 63 char const *nativeData, *gammaEnergy; 63 char const *nativeData, *gammaEnergy; 64 double gammaEnergy_MeV{0.0}; 64 double gammaEnergy_MeV{0.0}; 65 MCGIDI_distribution *distribution = &(prod 65 MCGIDI_distribution *distribution = &(product->distribution); 66 xDataTOM_element *distributionElement; 66 xDataTOM_element *distributionElement; 67 enum MCGIDI_energyType energyType = MCGIDI 67 enum MCGIDI_energyType energyType = MCGIDI_energyType_unknown; 68 68 69 MCGIDI_distribution_initialize( smr, distr 69 MCGIDI_distribution_initialize( smr, distribution ); 70 70 71 distribution->product = product; 71 distribution->product = product; 72 if( ( distributionElement = xDataTOME_getO 72 if( ( distributionElement = xDataTOME_getOneElementByName( smr, element, "distributions", 1 ) ) == NULL ) goto err; 73 if( ( nativeData = xDataTOM_getAttributesV 73 if( ( nativeData = xDataTOM_getAttributesValueInElement( distributionElement, "nativeData" ) ) == NULL ) goto err; 74 74 75 if( strcmp( product->pop->name, "gamma" ) 75 if( strcmp( product->pop->name, "gamma" ) == 0 ) { 76 if( ( gammaEnergy = xDataTOM_getAttrib 76 if( ( gammaEnergy = xDataTOM_getAttributesValueInElement( element, "discrete" ) ) != NULL ) { 77 if( MCGIDI_misc_PQUStringToDoubleI 77 if( MCGIDI_misc_PQUStringToDoubleInUnitOf( smr, gammaEnergy, "MeV", &gammaEnergy_MeV ) ) goto err; 78 energyType = MCGIDI_energyType_dis 78 energyType = MCGIDI_energyType_discreteGamma; } 79 else if( ( gammaEnergy = xDataTOM_getA 79 else if( ( gammaEnergy = xDataTOM_getAttributesValueInElement( element, "primary" ) ) != NULL ) { 80 if( MCGIDI_misc_PQUStringToDoubleI 80 if( MCGIDI_misc_PQUStringToDoubleInUnitOf( smr, gammaEnergy, "MeV", &gammaEnergy_MeV ) ) goto err; 81 energyType = MCGIDI_energyType_pri 81 energyType = MCGIDI_energyType_primaryGamma; 82 } 82 } 83 if( gammaEnergy != NULL ) { 83 if( gammaEnergy != NULL ) { 84 if( strcmp( nativeData, "angular" 84 if( strcmp( nativeData, "angular" ) ) { 85 smr_setReportError2( smr, smr_ 85 smr_setReportError2( smr, smr_unknownID, 1, "%s gamma can only have a distribution with 'nativeData' = 'angular' and not '%s'", 86 gammaEnergy, nativeData ); 86 gammaEnergy, nativeData ); 87 goto err; 87 goto err; 88 } 88 } 89 nativeData = "uncorrelated"; 89 nativeData = "uncorrelated"; 90 } 90 } 91 } 91 } 92 92 93 if( strcmp( nativeData, "angular" ) == 0 ) 93 if( strcmp( nativeData, "angular" ) == 0 ) { 94 if( MCGIDI_angular_parseFromTOM( smr, 94 if( MCGIDI_angular_parseFromTOM( smr, distributionElement, distribution, norms ) ) goto err; } 95 else if( strcmp( nativeData, "uncorrelated 95 else if( strcmp( nativeData, "uncorrelated" ) == 0 ) { 96 if( MCGIDI_uncorrelated_parseFromTOM( 96 if( MCGIDI_uncorrelated_parseFromTOM( smr, distributionElement, distribution, norms, energyType, gammaEnergy_MeV ) ) goto err; } 97 else if( strcmp( nativeData, "energyAngula 97 else if( strcmp( nativeData, "energyAngular" ) == 0 ) { 98 if( MCGIDI_energyAngular_parseFromTOM( 98 if( MCGIDI_energyAngular_parseFromTOM( smr, distributionElement, distribution ) ) goto err; } 99 else if( strcmp( nativeData, "angularEnerg 99 else if( strcmp( nativeData, "angularEnergy" ) == 0 ) { 100 if( MCGIDI_angularEnergy_parseFromTOM( 100 if( MCGIDI_angularEnergy_parseFromTOM( smr, distributionElement, distribution ) ) goto err; } 101 else if( strcmp( nativeData, "Legendre" ) 101 else if( strcmp( nativeData, "Legendre" ) == 0 ) { 102 if( MCGIDI_energyAngular_parseFromTOM( 102 if( MCGIDI_energyAngular_parseFromTOM( smr, distributionElement, distribution ) ) goto err; } 103 else if( strcmp( nativeData, "LLNLAngular_ 103 else if( strcmp( nativeData, "LLNLAngular_angularEnergy" ) == 0 ) { 104 if( MCGIDI_LLNLAngular_angularEnergy_p 104 if( MCGIDI_LLNLAngular_angularEnergy_parseFromTOM( smr, distributionElement, distribution ) ) goto err; } 105 else if( strcmp( nativeData, "none" ) == 0 105 else if( strcmp( nativeData, "none" ) == 0 ) { 106 distribution->type = MCGIDI_distributi 106 distribution->type = MCGIDI_distributionType_none_e; } 107 else if( strcmp( nativeData, "unknown" ) = 107 else if( strcmp( nativeData, "unknown" ) == 0 ) { 108 distribution->type = MCGIDI_distributi 108 distribution->type = MCGIDI_distributionType_unknown_e; } 109 else { 109 else { 110 smr_setReportError2( smr, smr_unknownI 110 smr_setReportError2( smr, smr_unknownID, 1, "Unsupported distribution = '%s'\n", nativeData ); 111 goto err; 111 goto err; 112 } 112 } 113 113 114 return( 0 ); 114 return( 0 ); 115 115 116 err: 116 err: 117 MCGIDI_distribution_release( smr, distribu 117 MCGIDI_distribution_release( smr, distribution ); 118 return( 1 ); 118 return( 1 ); 119 } 119 } 120 120 121 #if defined __cplusplus 121 #if defined __cplusplus 122 } 122 } 123 #endif 123 #endif 124 124 125 125