Geant4 Cross Reference |
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 */ 19 MCGIDI_distribution *MCGIDI_distribution_new( statusMessageReporting *smr ) { 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 */ 30 int MCGIDI_distribution_initialize( statusMessageReporting * /*smr*/, MCGIDI_distribution *distribution ) { 31 32 memset( distribution, 0, sizeof( MCGIDI_distribution ) ); 33 return( 0 ); 34 } 35 /* 36 ************************************************************ 37 */ 38 MCGIDI_distribution *MCGIDI_distribution_free( statusMessageReporting *smr, MCGIDI_distribution *distribution ) { 39 40 MCGIDI_distribution_release( smr, distribution ); 41 smr_freeMemory( (void **) &distribution ); 42 return( NULL ); 43 } 44 /* 45 ************************************************************ 46 */ 47 int MCGIDI_distribution_release( statusMessageReporting *smr, MCGIDI_distribution *distribution ) { 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 */ 61 int MCGIDI_distribution_parseFromTOM( statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_product *product, MCGIDI_POPs * /*pops*/, ptwXYPoints *norms ) { 62 63 char const *nativeData, *gammaEnergy; 64 double gammaEnergy_MeV{0.0}; 65 MCGIDI_distribution *distribution = &(product->distribution); 66 xDataTOM_element *distributionElement; 67 enum MCGIDI_energyType energyType = MCGIDI_energyType_unknown; 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 125