Geant4 Cross Reference |
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: CexmcProductionModel.hh 30 * 31 * Description: interface to production model 32 * 33 * Version: 1.0 34 * Created: 03.11.2009 16:50:53 35 * Revision: none 36 * Compiler: gcc 37 * 38 * Author: Alexey Radkov (), 39 * Company: PNPI 40 * 41 * ============================================================================= 42 */ 43 44 #ifndef CEXMC_PRODUCTION_MODEL_HH 45 #define CEXMC_PRODUCTION_MODEL_HH 46 47 #include <G4Types.hh> 48 #include <G4String.hh> 49 #include <G4ios.hh> 50 #include <G4ParticleDefinition.hh> 51 #include "CexmcAngularRange.hh" 52 #include "CexmcProductionModelData.hh" 53 #include "CexmcHistoManager.hh" 54 #include "CexmcException.hh" 55 #include "CexmcCommon.hh" 56 57 class CexmcProductionModelMessenger; 58 59 60 class CexmcProductionModel 61 { 62 public: 63 explicit CexmcProductionModel( const G4String & name = "unspecified", 64 G4bool fermiMotionIsOn = false ); 65 66 virtual ~CexmcProductionModel(); 67 68 public: 69 void ApplyFermiMotion( G4bool on, G4bool fromMessenger = true ); 70 71 void SetAngularRange( G4double top, G4double bottom, 72 G4int nmbOfDivs ); 73 74 void SetAngularRanges( const CexmcAngularRangeList & angularRanges_ ); 75 76 void AddAngularRange( G4double top, G4double bottom, 77 G4int nmbOfDivs ); 78 79 void SetProductionModelData( 80 const CexmcProductionModelData & productionModelData_ ); 81 82 void PrintInitialData( void ) const; 83 84 const CexmcAngularRangeList & GetAngularRanges( void ) const; 85 86 const CexmcAngularRangeList & GetTriggeredAngularRanges( void ) const; 87 88 const CexmcProductionModelData & GetProductionModelData( void ) const; 89 90 G4bool IsFermiMotionOn( void ) const; 91 92 void SetTriggeredAngularRanges( G4double opCosThetaSCM ); 93 94 const G4String & GetName( void ) const; 95 96 public: 97 G4ParticleDefinition * GetIncidentParticle( void ) const; 98 99 G4ParticleDefinition * GetNucleusParticle( void ) const; 100 101 G4ParticleDefinition * GetOutputParticle( void ) const; 102 103 G4ParticleDefinition * GetNucleusOutputParticle( void ) const; 104 105 protected: 106 virtual void FermiMotionStatusChangeHook( void ); 107 108 private: 109 G4bool IsValidCandidateForAngularRange( G4double top, 110 G4double bottom, G4int nmbOfDivs = 1 ) const; 111 112 G4bool IsGoodCandidateForAngularRange( G4double top, 113 G4double bottom ) const; 114 115 protected: 116 G4String name; 117 118 G4bool fermiMotionIsOn; 119 120 CexmcAngularRangeList angularRanges; 121 122 CexmcAngularRangeList angularRangesRef; 123 124 CexmcAngularRangeList triggeredAngularRanges; 125 126 CexmcProductionModelData productionModelData; 127 128 protected: 129 G4ParticleDefinition * incidentParticle; 130 131 G4ParticleDefinition * nucleusParticle; 132 133 G4ParticleDefinition * outputParticle; 134 135 G4ParticleDefinition * nucleusOutputParticle; 136 137 private: 138 CexmcProductionModelMessenger * messenger; 139 }; 140 141 142 inline void CexmcProductionModel::ApplyFermiMotion( G4bool on, 143 G4bool fromMessenger ) 144 { 145 if ( fromMessenger ) 146 ThrowExceptionIfProjectIsRead( CexmcCmdIsNotAllowed ); 147 148 fermiMotionIsOn = on; 149 150 FermiMotionStatusChangeHook(); 151 } 152 153 154 inline void CexmcProductionModel::SetAngularRanges( 155 const CexmcAngularRangeList & angularRanges_ ) 156 { 157 angularRangesRef = angularRanges_; 158 angularRanges = angularRangesRef; 159 #ifdef CEXMC_USE_ROOT 160 CexmcHistoManager::Instance()->SetupARHistos( angularRanges ); 161 #endif 162 } 163 164 165 inline void CexmcProductionModel::SetProductionModelData( 166 const CexmcProductionModelData & productionModelData_ ) 167 { 168 productionModelData = productionModelData_; 169 } 170 171 172 inline void CexmcProductionModel::PrintInitialData( void ) const 173 { 174 const char * fermiMotionMsg( "Fermi motion in the target is off" ); 175 if ( fermiMotionIsOn ) 176 fermiMotionMsg = "Fermi motion in the target is on"; 177 178 G4cout << CEXMC_LINE_START << fermiMotionMsg << G4endl; 179 G4cout << CEXMC_LINE_START << "Angular ranges:" << angularRanges; 180 } 181 182 183 inline const CexmcAngularRangeList & 184 CexmcProductionModel::GetAngularRanges( void ) const 185 { 186 return angularRanges; 187 } 188 189 190 inline const CexmcAngularRangeList & 191 CexmcProductionModel::GetTriggeredAngularRanges( void ) const 192 { 193 return triggeredAngularRanges; 194 } 195 196 197 inline const CexmcProductionModelData & 198 CexmcProductionModel::GetProductionModelData( void ) const 199 { 200 return productionModelData; 201 } 202 203 204 inline G4bool CexmcProductionModel::IsFermiMotionOn( void ) const 205 { 206 return fermiMotionIsOn; 207 } 208 209 210 inline const G4String & CexmcProductionModel::GetName( void ) const 211 { 212 return name; 213 } 214 215 216 inline G4ParticleDefinition * CexmcProductionModel::GetIncidentParticle( 217 void ) const 218 { 219 return incidentParticle; 220 } 221 222 223 inline G4ParticleDefinition * CexmcProductionModel::GetNucleusParticle( void ) 224 const 225 { 226 return nucleusParticle; 227 } 228 229 230 inline G4ParticleDefinition * CexmcProductionModel::GetOutputParticle( void ) 231 const 232 { 233 return outputParticle; 234 } 235 236 237 inline G4ParticleDefinition * CexmcProductionModel::GetNucleusOutputParticle( 238 void ) const 239 { 240 return nucleusOutputParticle; 241 } 242 243 244 inline G4bool CexmcProductionModel::IsValidCandidateForAngularRange( 245 G4double top, G4double bottom, G4int nmbOfDivs ) const 246 { 247 return top > bottom && top <= 1.0 && top > -1.0 && bottom < 1.0 && 248 bottom >= -1.0 && nmbOfDivs >= 1; 249 } 250 251 252 #endif 253 254