ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MCGIDI_distribution.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file 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