Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/lend/src/MCGIDI_outputChannel.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/hadronic/models/lend/src/MCGIDI_outputChannel.cc (Version 11.3.0) and /processes/hadronic/models/lend/src/MCGIDI_outputChannel.cc (Version 10.4.p1)


  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 #define _USE_MATH_DEFINES                      << 
  7 #include <cmath>                                    6 #include <cmath>
  8                                                     7 
  9 #include "MCGIDI.h"                                 8 #include "MCGIDI.h"
 10 #include "MCGIDI_misc.h"                            9 #include "MCGIDI_misc.h"
 11                                                    10 
 12 #if defined __cplusplus                            11 #if defined __cplusplus
 13 #include "G4Log.hh"                                12 #include "G4Log.hh"
 14 namespace GIDI {                                   13 namespace GIDI {
 15 using namespace GIDI;                              14 using namespace GIDI;
 16 #endif                                             15 #endif
 17                                                    16 
 18 /*                                                 17 /*
 19 **********************************************     18 ************************************************************
 20 */                                                 19 */
 21 MCGIDI_outputChannel *MCGIDI_outputChannel_new     20 MCGIDI_outputChannel *MCGIDI_outputChannel_new( statusMessageReporting *smr ) {
 22                                                    21 
 23     MCGIDI_outputChannel *outputChannel;           22     MCGIDI_outputChannel *outputChannel;
 24                                                    23 
 25     if( ( outputChannel = (MCGIDI_outputChanne     24     if( ( outputChannel = (MCGIDI_outputChannel *) smr_malloc2( smr, sizeof( MCGIDI_outputChannel ), 0, "outputChannel" ) ) == NULL ) return( NULL );
 26     if( MCGIDI_outputChannel_initialize( smr,      25     if( MCGIDI_outputChannel_initialize( smr, outputChannel ) ) outputChannel = MCGIDI_outputChannel_free( smr, outputChannel );
 27     return( outputChannel );                       26     return( outputChannel );
 28 }                                                  27 }
 29 /*                                                 28 /*
 30 **********************************************     29 ************************************************************
 31 */                                                 30 */
 32 int MCGIDI_outputChannel_initialize( statusMes     31 int MCGIDI_outputChannel_initialize( statusMessageReporting * /*smr*/, MCGIDI_outputChannel *outputChannel ) {
 33                                                    32 
 34     memset( outputChannel, 0, sizeof( MCGIDI_o     33     memset( outputChannel, 0, sizeof( MCGIDI_outputChannel ) );
 35     return( 0 );                                   34     return( 0 );
 36 }                                                  35 }
 37 /*                                                 36 /*
 38 **********************************************     37 ************************************************************
 39 */                                                 38 */
 40 MCGIDI_outputChannel *MCGIDI_outputChannel_fre     39 MCGIDI_outputChannel *MCGIDI_outputChannel_free( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel ) {
 41                                                    40 
 42     MCGIDI_outputChannel_release( smr, outputC     41     MCGIDI_outputChannel_release( smr, outputChannel );
 43     smr_freeMemory( (void **) &outputChannel )     42     smr_freeMemory( (void **) &outputChannel );
 44     return( NULL );                                43     return( NULL );
 45 }                                                  44 }
 46 /*                                                 45 /*
 47 **********************************************     46 ************************************************************
 48 */                                                 47 */
 49 int MCGIDI_outputChannel_release( statusMessag     48 int MCGIDI_outputChannel_release( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel ) {
 50                                                    49 
 51     int i;                                         50     int i;
 52                                                    51 
 53     for( i = 0; i < outputChannel->numberOfPro     52     for( i = 0; i < outputChannel->numberOfProducts; i++ ) MCGIDI_product_release( smr, &(outputChannel->products[i]) );
 54     smr_freeMemory( (void **) &(outputChannel-     53     smr_freeMemory( (void **) &(outputChannel->products) );
 55     MCGIDI_outputChannel_initialize( smr, outp     54     MCGIDI_outputChannel_initialize( smr, outputChannel );
 56                                                    55 
 57     return( 0 );                                   56     return( 0 );
 58 }                                                  57 }
 59 /*                                                 58 /*
 60 **********************************************     59 ************************************************************
 61 */                                                 60 */
 62 int MCGIDI_outputChannel_parseFromTOM( statusM     61 int MCGIDI_outputChannel_parseFromTOM( statusMessageReporting *smr, xDataTOM_element *element, MCGIDI_POPs *pops, MCGIDI_outputChannel *outputChannel,
 63         MCGIDI_reaction *reaction, MCGIDI_prod     62         MCGIDI_reaction *reaction, MCGIDI_product *parent ) {
 64                                                    63 
 65     int n{0}, delayedNeutronIndex{0};          <<  64     int n, delayedNeutronIndex = 0;
 66     char const *genre{""}, *Q{""};             <<  65     char const *genre, *Q;
 67     xDataTOM_element *child{nullptr};          <<  66     xDataTOM_element *child;
 68                                                    67 
 69     MCGIDI_outputChannel_initialize( smr, outp     68     MCGIDI_outputChannel_initialize( smr, outputChannel );
 70                                                    69 
 71     outputChannel->reaction = reaction;            70     outputChannel->reaction = reaction;
 72     outputChannel->parent = parent;                71     outputChannel->parent = parent;
 73     if( ( genre = xDataTOM_getAttributesValueI     72     if( ( genre = xDataTOM_getAttributesValueInElement( element, "genre" ) ) == NULL ) goto err;
 74     if( ( parent != NULL ) && ( strcmp( genre,     73     if( ( parent != NULL ) && ( strcmp( genre, "NBody" ) ) ) {
 75         smr_setReportError2( smr, smr_unknownI     74         smr_setReportError2( smr, smr_unknownID, 1, "decay channel's genre can only be 'uncorreclated' (a.k.a. 'NBody') and not '%s'", genre );
 76         goto err;                                  75         goto err;
 77     }                                              76     }
 78     if( strcmp( genre, "twoBody" ) == 0 ) {        77     if( strcmp( genre, "twoBody" ) == 0 ) {
 79         outputChannel->genre = MCGIDI_channelG     78         outputChannel->genre = MCGIDI_channelGenre_twoBody_e; }
 80     else if( strcmp( genre, "NBody" ) == 0 ) {     79     else if( strcmp( genre, "NBody" ) == 0 ) {
 81         outputChannel->genre = MCGIDI_channelG     80         outputChannel->genre = MCGIDI_channelGenre_uncorrelated_e; }
 82     else if( strcmp( genre, "sumOfRemainingOut     81     else if( strcmp( genre, "sumOfRemainingOutputChannels" ) == 0 ) {
 83         outputChannel->genre = MCGIDI_channelG     82         outputChannel->genre = MCGIDI_channelGenre_sumOfRemaining_e; }
 84     else {                                         83     else {
 85         smr_setReportError2( smr, smr_unknownI     84         smr_setReportError2( smr, smr_unknownID, 1, "unsupported genre = '%s'", genre );
 86         goto err;                                  85         goto err;
 87     }                                              86     }
 88     if( ( Q = xDataTOM_getAttributesValueInEle     87     if( ( Q = xDataTOM_getAttributesValueInElement( element, "Q" ) ) == NULL ) goto err;
 89     outputChannel->QIsFloat = !MCGIDI_misc_PQU     88     outputChannel->QIsFloat = !MCGIDI_misc_PQUStringToDoubleInUnitOf( smr, Q, "MeV", &(outputChannel->Q) );
 90                                                    89 
 91     if( ( n = xDataTOM_numberOfElementsByName(     90     if( ( n = xDataTOM_numberOfElementsByName( smr, element, "product" ) ) == 0 ) {
 92         smr_setReportError2p( smr, smr_unknown     91         smr_setReportError2p( smr, smr_unknownID, 1, "outputChannel does not have any products" );
 93         goto err;                                  92         goto err;
 94     }                                              93     }
 95     if( ( outputChannel->products = (MCGIDI_pr     94     if( ( outputChannel->products = (MCGIDI_product *) smr_malloc2( smr, n * sizeof( MCGIDI_product ), 0, "outputChannel->products" ) ) == NULL ) goto err;
 96                                                    95 
 97     for( child = xDataTOME_getFirstElement( el     96     for( child = xDataTOME_getFirstElement( element ); child != NULL; child = xDataTOME_getNextElement( child ) ) {
 98         if( strcmp( child->name, "product" ) =     97         if( strcmp( child->name, "product" ) == 0 ) {
 99             if( MCGIDI_product_parseFromTOM( s     98             if( MCGIDI_product_parseFromTOM( smr, child, outputChannel, pops, &(outputChannel->products[outputChannel->numberOfProducts]),
100                 &delayedNeutronIndex ) ) goto      99                 &delayedNeutronIndex ) ) goto err;
101             outputChannel->numberOfProducts++;    100             outputChannel->numberOfProducts++; }
102         else if( strcmp( child->name, "fission    101         else if( strcmp( child->name, "fissionEnergyReleased" ) == 0 ) {     /* ????????? Need to support. */
103             continue; }                           102             continue; }
104         else {                                    103         else {
105             printf( "outputChannel child not c    104             printf( "outputChannel child not currently supported = %s\n", child->name );
106         }                                         105         }
107     }                                             106     }
108     if( outputChannel->genre == MCGIDI_channel    107     if( outputChannel->genre == MCGIDI_channelGenre_twoBody_e ) {
109         double projectileMass_MeV, targetMass_    108         double projectileMass_MeV, targetMass_MeV, productMass_MeV, residualMass_MeV;
110                                                   109 
111         projectileMass_MeV = MCGIDI_reaction_g    110         projectileMass_MeV = MCGIDI_reaction_getProjectileMass_MeV( smr, reaction );
112         targetMass_MeV = MCGIDI_reaction_getTa    111         targetMass_MeV = MCGIDI_reaction_getTargetMass_MeV( smr, reaction );
113         productMass_MeV = MCGIDI_product_getMa    112         productMass_MeV = MCGIDI_product_getMass_MeV( smr, &(outputChannel->products[0]) );
114         residualMass_MeV = MCGIDI_product_getM    113         residualMass_MeV = MCGIDI_product_getMass_MeV( smr, &(outputChannel->products[1]) );
115                                                   114 
116         //TK 17-11-10 for v1.3                    115         //TK 17-11-10 for v1.3
117         //A temporary fix for emission of gamm    116         //A temporary fix for emission of gamma(2.2MeV) from n captured by H
118         //                  capture               117         //                  capture                     gamma                        D 
119         if ( reaction->ENDF_MT == 102 && produ    118         if ( reaction->ENDF_MT == 102 && productMass_MeV == 0 && ( outputChannel->products[1].pop->A == 2 && outputChannel->products[1].pop->Z == 1 ) ) {
120            //include/PoPs_data.h:#define e_Mas    119            //include/PoPs_data.h:#define e_Mass 5.4857990943e-4 /* electron mass in AMU */
121            residualMass_MeV += 5.4857990943e-4    120            residualMass_MeV += 5.4857990943e-4*MCGIDI_AMU2MeV;
122         }                                         121         }
123                                                   122 
124         MCGIDI_product_setTwoBodyMasses( smr,     123         MCGIDI_product_setTwoBodyMasses( smr, &(outputChannel->products[0]), projectileMass_MeV, targetMass_MeV, productMass_MeV, residualMass_MeV );
125     }                                             124     }
126                                                   125 
127     return( 0 );                                  126     return( 0 );
128                                                   127 
129 err:                                              128 err:
130     MCGIDI_outputChannel_release( smr, outputC    129     MCGIDI_outputChannel_release( smr, outputChannel );
131     return( 1 );                                  130     return( 1 );
132 }                                                 131 }
133 /*                                                132 /*
134 **********************************************    133 ************************************************************
135 */                                                134 */
136 int MCGIDI_outputChannel_numberOfProducts( MCG    135 int MCGIDI_outputChannel_numberOfProducts( MCGIDI_outputChannel *outputChannel ) {
137                                                   136 
138     return( outputChannel->numberOfProducts );    137     return( outputChannel->numberOfProducts );
139 }                                                 138 }
140 /*                                                139 /*
141 **********************************************    140 ************************************************************
142 */                                                141 */
143 MCGIDI_product *MCGIDI_outputChannel_getProduc    142 MCGIDI_product *MCGIDI_outputChannel_getProductAtIndex( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel, int i ) {
144                                                   143 
145     if( ( i < 0 ) || ( i >= outputChannel->num    144     if( ( i < 0 ) || ( i >= outputChannel->numberOfProducts ) ) {
146         smr_setReportError2( smr, smr_unknownI    145         smr_setReportError2( smr, smr_unknownID, 1, "bad product index = %d: outputChannel as only %d products", i, outputChannel->numberOfProducts );
147         return( NULL );                           146         return( NULL );
148     }                                             147     }
149     return( &(outputChannel->products[i]) );      148     return( &(outputChannel->products[i]) );
150 }                                                 149 }
151 /*                                                150 /*
152 **********************************************    151 ************************************************************
153 */                                                152 */
154 int MCGIDI_outputChannel_getDomain( statusMess    153 int MCGIDI_outputChannel_getDomain( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel, double *EMin, double *EMax ) {
155                                                   154 
156     if( outputChannel->reaction != NULL ) retu    155     if( outputChannel->reaction != NULL ) return( MCGIDI_reaction_getDomain( smr, outputChannel->reaction, EMin, EMax ) );
157     return( MCGIDI_product_getDomain( smr, out    156     return( MCGIDI_product_getDomain( smr, outputChannel->parent, EMin, EMax ) );
158 }                                                 157 }
159 /*                                                158 /*
160 **********************************************    159 ************************************************************
161 */                                                160 */
162 MCGIDI_target_heated *MCGIDI_outputChannel_get    161 MCGIDI_target_heated *MCGIDI_outputChannel_getTargetHeated( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel ) {
163                                                   162 
164     if( outputChannel->reaction != NULL ) retu    163     if( outputChannel->reaction != NULL ) return( MCGIDI_reaction_getTargetHeated( smr, outputChannel->reaction ) );
165     return( MCGIDI_product_getTargetHeated( sm    164     return( MCGIDI_product_getTargetHeated( smr, outputChannel->parent ) );
166 }                                                 165 }
167 /*                                                166 /*
168 **********************************************    167 ************************************************************
169 */                                                168 */
170 double MCGIDI_outputChannel_getProjectileMass_    169 double MCGIDI_outputChannel_getProjectileMass_MeV( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel ) {
171                                                   170 
172     if( outputChannel->reaction != NULL ) retu    171     if( outputChannel->reaction != NULL ) return( MCGIDI_reaction_getProjectileMass_MeV( smr, outputChannel->reaction ) );
173     return( MCGIDI_product_getProjectileMass_M    172     return( MCGIDI_product_getProjectileMass_MeV( smr, outputChannel->parent ) );
174 }                                                 173 }
175 /*                                                174 /*
176 **********************************************    175 ************************************************************
177 */                                                176 */
178 double MCGIDI_outputChannel_getTargetMass_MeV(    177 double MCGIDI_outputChannel_getTargetMass_MeV( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel ) {
179                                                   178 
180     if( outputChannel->reaction != NULL ) retu    179     if( outputChannel->reaction != NULL ) return( MCGIDI_reaction_getTargetMass_MeV( smr, outputChannel->reaction ) );
181     return( MCGIDI_product_getTargetMass_MeV(     180     return( MCGIDI_product_getTargetMass_MeV( smr, outputChannel->parent ) );
182 }                                                 181 }
183 /*                                                182 /*
184 **********************************************    183 ************************************************************
185 */                                                184 */
186 double MCGIDI_outputChannel_getQ_MeV( statusMe    185 double MCGIDI_outputChannel_getQ_MeV( statusMessageReporting * /*smr*/, MCGIDI_outputChannel *outputChannel, double /*e_in*/ ) {
187                                                   186 
188     return( outputChannel->Q );                   187     return( outputChannel->Q );
189 }                                                 188 }
190 /*                                                189 /*
191 **********************************************    190 ************************************************************
192 */                                                191 */
193 double MCGIDI_outputChannel_getFinalQ( statusM    192 double MCGIDI_outputChannel_getFinalQ( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel, double e_in ) {
194                                                   193 
195     int iProduct;                                 194     int iProduct;
196     double Q = outputChannel->Q;                  195     double Q = outputChannel->Q;
197     MCGIDI_product *product;                      196     MCGIDI_product *product;
198                                                   197 
199     for( iProduct = 0; iProduct < outputChanne    198     for( iProduct = 0; iProduct < outputChannel->numberOfProducts; iProduct++ ) {
200         product = &(outputChannel->products[iP    199         product = &(outputChannel->products[iProduct]);
201         if( product->decayChannel.genre != MCG    200         if( product->decayChannel.genre != MCGIDI_channelGenre_undefined_e ) Q += MCGIDI_outputChannel_getFinalQ( smr, &(product->decayChannel), e_in );
202         if( !smr_isOk( smr ) ) break;             201         if( !smr_isOk( smr ) ) break;
203     }                                             202     }
204     return( Q );                                  203     return( Q );
205 }                                                 204 }
206 /*                                                205 /*
207 **********************************************    206 ************************************************************
208 */                                                207 */
209 int MCGIDI_outputChannel_sampleProductsAtE(sta << 208 int MCGIDI_outputChannel_sampleProductsAtE( statusMessageReporting *smr, MCGIDI_outputChannel *outputChannel, MCGIDI_quantitiesLookupModes &modes,
210                                            MCG << 209         MCGIDI_decaySamplingInfo *decaySamplingInfo, MCGIDI_sampledProductsDatas *productDatas, double *masses_ ) {
211                                            MCG << 
212                                            MCG << 
213                                            MCG << 
214                                            dou << 
215 {                                              << 
216   int i1;                                      << 
217   int multiplicity(0);                         << 
218   int secondTwoBody = 0, isDecayChannel = ( ou << 
219   double e_in = modes.getProjectileEnergy( );  << 
220   MCGIDI_product *product;                     << 
221   double phi, p, masses[3];                    << 
222   MCGIDI_distribution *distribution;           << 
223   MCGIDI_sampledProductsData productData[2];   << 
224                                                << 
225   if (isDecayChannel) {                        << 
226     masses[0] = masses_[0];              /* Mo << 
227     masses[1] = masses_[1];                    << 
228   } else {                                     << 
229     masses[0] = MCGIDI_reaction_getProjectileM << 
230     masses[1] = MCGIDI_reaction_getTargetMass_ << 
231   }                                            << 
232                                                << 
233   // Loop over all possible final state partic << 
234   // List of these particles (products) was re << 
235   // Note: all particles satifying the samplin << 
236   // final state, regardless of charge, energy << 
237                                                << 
238   for (i1 = 0; i1 < outputChannel->numberOfPro << 
239     product = &(outputChannel->products[i1]);  << 
240     if (product->decayChannel.genre != MCGIDI_ << 
241       if( MCGIDI_outputChannel_sampleProductsA << 
242                                                << 
243                                                << 
244     } else {                                   << 
245       distribution = &(product->distribution); << 
246       if( distribution->type == MCGIDI_distrib << 
247                                                << 
248       if (!secondTwoBody) {                    << 
249         // Sample multiplicity of final state  << 
250         // The multiplicity stored in GIDI is  << 
251         // compared to a random number to deci << 
252         if ((multiplicity = product->multiplic << 
253                                MCGIDI_product_ << 
254                                   decaySamplin << 
255         while (multiplicity > 0) {             << 
256                                                << 
257           multiplicity--;                      << 
258           decaySamplingInfo->pop = product->po << 
259           decaySamplingInfo->mu = 0;           << 
260           decaySamplingInfo->Ep = 0;           << 
261           productData[0].isVelocity = decaySam << 
262           productData[0].pop = product->pop;   << 
263           productData[0].delayedNeutronIndex = << 
264           productData[0].delayedNeutronRate =  << 
265           productData[0].birthTimeSec = 0;     << 
266           if (product->delayedNeutronRate > 0) << 
267             productData[0].birthTimeSec =      << 
268                  -G4Log( decaySamplingInfo->rn << 
269           }                                    << 
270                                                << 
271           switch( outputChannel->genre ) {     << 
272                                                << 
273           case MCGIDI_channelGenre_twoBody_e : << 
274             secondTwoBody = 1;                 << 
275             MCGIDI_angular_sampleMu( smr, dist << 
276             if (smr_isOk(smr) ) {              << 
277               phi = 2. * M_PI * decaySamplingI << 
278               MCGIDI_kinetics_2BodyReaction( s << 
279               if (!smr_isOk(smr) ) return( -1  << 
280               productData[1].pop = product[1]. << 
281               productData[1].delayedNeutronInd << 
282               productData[1].delayedNeutronRat << 
283               productData[1].birthTimeSec = 0; << 
284               MCGIDI_sampledProducts_addProduc << 
285               if( !smr_isOk( smr ) ) return( - << 
286               MCGIDI_sampledProducts_addProduc << 
287               if( !smr_isOk( smr ) ) return( - << 
288             }                                  << 
289             break;                             << 
290                                                << 
291           case MCGIDI_channelGenre_uncorrelate << 
292                                                   210 
293           case MCGIDI_channelGenre_sumOfRemain << 211     int i1, multiplicity, secondTwoBody = 0, isDecayChannel = ( outputChannel->reaction == NULL );
294             // Get mass of final state particl << 212     double e_in = modes.getProjectileEnergy( );
295             // masses[0] and masses[1] are inc << 213     MCGIDI_product *product;
296             masses[2] = MCGIDI_product_getMass << 214     double phi, p, masses[3];
297             switch( distribution->type ) {     << 215     MCGIDI_distribution *distribution;
298             case MCGIDI_distributionType_uncor << 216     MCGIDI_sampledProductsData productData[2];
299               MCGIDI_uncorrelated_sampleDistri << 217 
300               break;                           << 218     if( isDecayChannel ) {
301             case MCGIDI_distributionType_energ << 219         masses[0] = masses_[0];              /* More work may be needed here. */
302               MCGIDI_energyAngular_sampleDistr << 220         masses[1] = masses_[1]; }
303               break;                           << 221     else {
304             case MCGIDI_distributionType_Kalba << 222         masses[0] = MCGIDI_reaction_getProjectileMass_MeV( smr, outputChannel->reaction );
305               MCGIDI_KalbachMann_sampleEp( smr << 223         masses[1] = MCGIDI_reaction_getTargetMass_MeV( smr, outputChannel->reaction );
306               break;                           << 224     }
307             case MCGIDI_distributionType_angul << 
308               MCGIDI_angularEnergy_sampleDistr << 
309               break;                           << 
310             default :                          << 
311               printf( "Unknown spectral data f << 
312               break;                           << 
313             }                                  << 
314             break;                             << 
315                                                   225 
316           case MCGIDI_channelGenre_undefined_e << 226     for( i1 = 0; i1 < outputChannel->numberOfProducts; i1++ ) {
317             printf( "Channel is undefined\n" ) << 227         product = &(outputChannel->products[i1]);
318             break;                             << 228         if( product->decayChannel.genre != MCGIDI_channelGenre_undefined_e ) {
319                                                << 229             if( MCGIDI_outputChannel_sampleProductsAtE( smr, &(product->decayChannel), modes, decaySamplingInfo, productDatas, masses ) < 0 ) return( -1 ); }
320           case MCGIDI_channelGenre_twoBodyDeca << 230         else {
321             printf( "Channel is twoBodyDecay\n << 231             distribution = &(product->distribution);
322             break;                             << 232             if( distribution->type == MCGIDI_distributionType_none_e ) continue;
323                                                << 233             if( !secondTwoBody ) {
324           case MCGIDI_channelGenre_uncorrelate << 234                 if( ( multiplicity = product->multiplicity ) == 0 ) multiplicity = MCGIDI_product_sampleMultiplicity( smr, product, e_in,
325             printf( "Channel is uncorrelatedDe << 235                     decaySamplingInfo->rng( decaySamplingInfo->rngState ) );
326             break;                             << 236                 while( multiplicity > 0 ) { 
327                                                << 237 
328           default :                            << 238                     multiplicity--;
329             printf( "Unsupported channel genre << 239                     decaySamplingInfo->pop = product->pop;
330             break;                             << 240                     decaySamplingInfo->mu = 0;
331           }                                    << 241                     decaySamplingInfo->Ep = 0;
332                                                << 242                     productData[0].isVelocity = decaySamplingInfo->isVelocity;
333           if (!smr_isOk(smr) ) return( -1 );   << 243                     productData[0].pop = product->pop;
334           if (!secondTwoBody) {                << 244                     productData[0].delayedNeutronIndex = product->delayedNeutronIndex;
335             if (decaySamplingInfo->frame == xD << 245                     productData[0].delayedNeutronRate = product->delayedNeutronRate;
336               if (MCGIDI_kinetics_COM2Lab( smr << 246                     productData[0].birthTimeSec = 0;
                                                   >> 247                     if( product->delayedNeutronRate > 0 ) {
                                                   >> 248                         productData[0].birthTimeSec = -G4Log( decaySamplingInfo->rng( decaySamplingInfo->rngState ) ) / product->delayedNeutronRate;
                                                   >> 249                     }
                                                   >> 250 
                                                   >> 251                     switch( outputChannel->genre ) {
                                                   >> 252                     case MCGIDI_channelGenre_twoBody_e :
                                                   >> 253                         secondTwoBody = 1;
                                                   >> 254                         MCGIDI_angular_sampleMu( smr, distribution->angular, modes, decaySamplingInfo );
                                                   >> 255                         if( smr_isOk( smr ) ) {
                                                   >> 256                             phi = 2. * M_PI * decaySamplingInfo->rng( decaySamplingInfo->rngState );
                                                   >> 257                             MCGIDI_kinetics_2BodyReaction( smr, distribution->angular, e_in, decaySamplingInfo->mu, phi, productData );
                                                   >> 258                             if( !smr_isOk( smr ) ) return( -1 );
                                                   >> 259                             productData[1].pop = product[1].pop;
                                                   >> 260                             productData[1].delayedNeutronIndex = product[1].delayedNeutronIndex;
                                                   >> 261                             productData[1].delayedNeutronRate = product->delayedNeutronRate;
                                                   >> 262                             productData[1].birthTimeSec = 0;
                                                   >> 263                             MCGIDI_sampledProducts_addProduct( smr, productDatas, productData );
                                                   >> 264                             if( !smr_isOk( smr ) ) return( -1 );
                                                   >> 265                             MCGIDI_sampledProducts_addProduct( smr, productDatas, &(productData[1]) );
                                                   >> 266                             if( !smr_isOk( smr ) ) return( -1 );
                                                   >> 267                         }
                                                   >> 268                         break;
                                                   >> 269                     case MCGIDI_channelGenre_uncorrelated_e :
                                                   >> 270                     case MCGIDI_channelGenre_sumOfRemaining_e :
                                                   >> 271                         masses[2] = MCGIDI_product_getMass_MeV( smr, product );
                                                   >> 272                         switch( distribution->type ) {
                                                   >> 273                         case MCGIDI_distributionType_uncorrelated_e :
                                                   >> 274                             MCGIDI_uncorrelated_sampleDistribution( smr, distribution, modes, decaySamplingInfo );
                                                   >> 275                             break;
                                                   >> 276                         case MCGIDI_distributionType_energyAngular_e :
                                                   >> 277                             MCGIDI_energyAngular_sampleDistribution( smr, distribution, modes, decaySamplingInfo );
                                                   >> 278                             break;
                                                   >> 279                         case MCGIDI_distributionType_KalbachMann_e :
                                                   >> 280                             MCGIDI_KalbachMann_sampleEp( smr, distribution->KalbachMann, modes, decaySamplingInfo );
                                                   >> 281                             break;
                                                   >> 282                         case MCGIDI_distributionType_angularEnergy_e :
                                                   >> 283                             MCGIDI_angularEnergy_sampleDistribution( smr, distribution->angularEnergy, modes, decaySamplingInfo );
                                                   >> 284                             break;
                                                   >> 285                         default :
                                                   >> 286                             printf( "Unknown spectral data form product name = %s, channel genre = %d\n", product->pop->name, outputChannel->genre );
                                                   >> 287                             break;
                                                   >> 288                         }
                                                   >> 289                         break;
                                                   >> 290                     case MCGIDI_channelGenre_undefined_e :
                                                   >> 291                         printf( "Channel is undefined\n" );
                                                   >> 292       break;
                                                   >> 293                     case MCGIDI_channelGenre_twoBodyDecay_e :
                                                   >> 294                         printf( "Channel is twoBodyDecay\n" );
                                                   >> 295       break;
                                                   >> 296                     case MCGIDI_channelGenre_uncorrelatedDecay_e :
                                                   >> 297                         printf( "Channel is uncorrelatedDecay\n" );
                                                   >> 298       break;
                                                   >> 299                     default :
                                                   >> 300                         printf( "Unsupported channel genre = %d\n", outputChannel->genre );
                                                   >> 301       break;
                                                   >> 302                     }
                                                   >> 303                     if( !smr_isOk( smr ) ) return( -1 );
                                                   >> 304                     if( !secondTwoBody ) {
                                                   >> 305                         if( decaySamplingInfo->frame == xDataTOM_frame_centerOfMass ) {
                                                   >> 306                             if( MCGIDI_kinetics_COM2Lab( smr, modes, decaySamplingInfo, masses ) != 0 ) return( -1 );
                                                   >> 307                         }
                                                   >> 308                         productData[0].kineticEnergy = decaySamplingInfo->Ep;
                                                   >> 309                         p = std::sqrt( decaySamplingInfo->Ep * ( decaySamplingInfo->Ep + 2. * product->pop->mass_MeV ) );
                                                   >> 310                         if( productData[0].isVelocity ) p *= MCGIDI_speedOfLight_cm_sec / std::sqrt( p * p + product->pop->mass_MeV * product->pop->mass_MeV );
                                                   >> 311                         productData[0].pz_vz = p * decaySamplingInfo->mu;
                                                   >> 312                         p = std::sqrt( 1. - decaySamplingInfo->mu * decaySamplingInfo->mu ) * p;
                                                   >> 313                         phi = 2. * M_PI * decaySamplingInfo->rng( decaySamplingInfo->rngState );
                                                   >> 314                         productData[0].px_vx = p * std::sin( phi );
                                                   >> 315                         productData[0].py_vy = p * std::cos( phi );
                                                   >> 316                         MCGIDI_sampledProducts_addProduct( smr, productDatas, productData );
                                                   >> 317                         if( !smr_isOk( smr ) ) return( -1 );
                                                   >> 318                     }
                                                   >> 319                 } // Loop checking, 11.06.2015, T. Koi
337             }                                     320             }
338                                                << 321         }
339             // Assign kinematics to final stat << 322     }
340             productData[0].kineticEnergy = dec << 323     return( productDatas->numberOfProducts );
341             p = std::sqrt( decaySamplingInfo-> << 
342             if (productData[0].isVelocity) p * << 
343             productData[0].pz_vz = p * decaySa << 
344             p = std::sqrt( 1. - decaySamplingI << 
345             phi = 2. * M_PI * decaySamplingInf << 
346             productData[0].px_vx = p * std::si << 
347             productData[0].py_vy = p * std::co << 
348             MCGIDI_sampledProducts_addProduct( << 
349             if (!smr_isOk(smr) ) return( -1 ); << 
350           }                                    << 
351         } // while multiplicity                << 
352                                                << 
353       }  // if !secondTwoBody                  << 
354     }  // if decay channel genre               << 
355                                                << 
356   }  // loop over possible final state product << 
357   return( productDatas->numberOfProducts );    << 
358                                                << 
359 }                                                 324 }
360                                                   325 
361 #if defined __cplusplus                           326 #if defined __cplusplus
362 }                                                 327 }
363 #endif                                            328 #endif
364                                                   329 
365                                                   330