ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CexmcGenbod.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CexmcGenbod.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 /*
27  * =============================================================================
28  *
29  * Filename: CexmcGenbod.cc
30  *
31  * Description: original fortran routine GENBOD wrapper
32  *
33  * Version: 1.0
34  * Created: 08.09.2010 14:36:23
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * =============================================================================
42  */
43 
44 #ifdef CEXMC_USE_GENBOD
45 
46 #include <G4SystemOfUnits.hh>
47 #include "CexmcGenbod.hh"
48 #include "CexmcException.hh"
49 
50 
51 extern "C"
52 {
53  extern int genbod_( void );
54 }
55 
56 
57 extern struct genbod_in_data
58 {
59  int np;
60  float tecm;
61  float amass[ 18 ];
62  int kgenev;
63 } genin_;
64 
65 
66 extern struct genbod_out_data
67 {
68  float pcm[ 18 ][ 5 ];
69  float wt;
70 } genout_;
71 
72 
73 CexmcGenbod::CexmcGenbod()
74 {
75  genin_.np = 0;
76  genin_.kgenev = 1;
77 }
78 
79 
80 G4bool CexmcGenbod::CheckKinematics( void )
81 {
82  totalEnergy = 0.;
83  for ( CexmcPhaseSpaceInVector::const_iterator k( inVec.begin() );
84  k != inVec.end(); ++k )
85  {
86  totalEnergy += ( *k )->e();
87  }
88 
89  /* epsilon is needed to compensate float to fortran real cast accuracy,
90  * the value 3E-6 was found experimentally, maybe has to be made bigger,
91  * but not smaller */
92  const float epsilon( 3E-6 );
93 
94  return totalEnergy - totalMass > 0.0f + epsilon;
95 }
96 
97 
98 G4double CexmcGenbod::Generate( void )
99 {
100  genin_.tecm = totalEnergy / GeV;
101 
102  genbod_();
103 
104  float ( *pcm )[ 5 ]( &genout_.pcm[ 0 ] );
105 
106  for ( CexmcPhaseSpaceOutVector::iterator k( outVec.begin() );
107  k != outVec.end(); ++k )
108  {
109  k->lVec->setPx( ( *pcm )[ 0 ] * GeV );
110  k->lVec->setPy( ( *pcm )[ 1 ] * GeV );
111  k->lVec->setPz( ( *pcm )[ 2 ] * GeV );
112  k->lVec->setE( ( *pcm++ )[ 3 ] * GeV );
113  }
114 
115  return genout_.wt;
116 }
117 
118 
119 void CexmcGenbod::ParticleChangeHook( void )
120 {
121  size_t nmbOfOutputParticles( outVec.size() );
122 
123  if ( nmbOfOutputParticles < 2 || nmbOfOutputParticles > 18 )
125 
126  genin_.np = nmbOfOutputParticles;
127 
128  float * amass( genin_.amass );
129 
130  for ( CexmcPhaseSpaceOutVector::const_iterator k( outVec.begin() );
131  k != outVec.end(); ++k )
132  {
133  *amass++ = k->mass / GeV;
134  }
135 }
136 
137 
138 void CexmcGenbod::FermiEnergyDepStatusChangeHook( void )
139 {
140  genin_.kgenev = fermiEnergyDepIsOn ? 2 : 1;
141 }
142 
143 #endif
144