Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id: G4ElasticHNScattering.cc 74627 2013-10-17 07:04:38Z gcosmo $ 27 // 28 // 28 29 29 // ------------------------------------------- 30 // ------------------------------------------------------------ 30 // GEANT 4 class implemetation file 31 // GEANT 4 class implemetation file 31 // 32 // 32 // ---------------- G4ElasticHNScattering 33 // ---------------- G4ElasticHNScattering -------------- 33 // by V. Uzhinsky, March 200 34 // by V. Uzhinsky, March 2008. 34 // elastic scattering used by Frit 35 // elastic scattering used by Fritiof model 35 // Take a projectile and a tar 36 // Take a projectile and a target 36 // scatter the projectile and 37 // scatter the projectile and target 37 // ------------------------------------------- 38 // --------------------------------------------------------------------- 38 39 39 #include "globals.hh" 40 #include "globals.hh" 40 #include "Randomize.hh" 41 #include "Randomize.hh" 41 #include "G4PhysicalConstants.hh" 42 #include "G4PhysicalConstants.hh" 42 #include "G4SystemOfUnits.hh" << 43 43 44 #include "G4ElasticHNScattering.hh" 44 #include "G4ElasticHNScattering.hh" 45 #include "G4LorentzRotation.hh" 45 #include "G4LorentzRotation.hh" 46 #include "G4ThreeVector.hh" 46 #include "G4ThreeVector.hh" 47 #include "G4ParticleDefinition.hh" 47 #include "G4ParticleDefinition.hh" 48 #include "G4VSplitableHadron.hh" 48 #include "G4VSplitableHadron.hh" 49 #include "G4ExcitedString.hh" 49 #include "G4ExcitedString.hh" 50 #include "G4FTFParameters.hh" 50 #include "G4FTFParameters.hh" >> 51 //#include "G4ios.hh" 51 52 52 #include "G4SampleResonance.hh" << 53 << 54 #include "G4Exp.hh" << 55 #include "G4Log.hh" << 56 53 57 //============================================ 54 //============================================================================ 58 55 59 G4ElasticHNScattering::G4ElasticHNScattering() 56 G4ElasticHNScattering::G4ElasticHNScattering() {} 60 57 61 58 62 //============================================ 59 //============================================================================ 63 60 64 G4bool G4ElasticHNScattering::ElasticScatterin 61 G4bool G4ElasticHNScattering::ElasticScattering( G4VSplitableHadron* projectile, 65 62 G4VSplitableHadron* target, 66 63 G4FTFParameters* theParameters ) const { 67 projectile->IncrementCollisionCount( 1 ); 64 projectile->IncrementCollisionCount( 1 ); 68 target->IncrementCollisionCount( 1 ); 65 target->IncrementCollisionCount( 1 ); 69 66 70 if ( projectile->Get4Momentum().z() < 0.0 ) << 71 << 72 // Projectile parameters 67 // Projectile parameters 73 G4LorentzVector Pprojectile = projectile->Ge 68 G4LorentzVector Pprojectile = projectile->Get4Momentum(); 74 G4double M0projectile = Pprojectile.mag(); << 69 if ( Pprojectile.z() < 0.0 ) return false; >> 70 G4bool PutOnMassShell( false ); >> 71 G4double M0projectile = Pprojectile.mag(); >> 72 if ( M0projectile < projectile->GetDefinition()->GetPDGMass() ) { >> 73 PutOnMassShell = true; >> 74 M0projectile = projectile->GetDefinition()->GetPDGMass(); >> 75 } 75 G4double M0projectile2 = M0projectile * M0pr 76 G4double M0projectile2 = M0projectile * M0projectile; >> 77 G4double AveragePt2 = theParameters->GetAvaragePt2ofElasticScattering(); 76 78 77 // Target parameters 79 // Target parameters 78 G4LorentzVector Ptarget = target->Get4Moment 80 G4LorentzVector Ptarget = target->Get4Momentum(); 79 G4double M0target = Ptarget.mag(); 81 G4double M0target = Ptarget.mag(); 80 G4double M0target2 = M0target * M0target; << 82 if ( M0target < target->GetDefinition()->GetPDGMass() ) { 81 << 83 PutOnMassShell = true; 82 G4double AveragePt2 = theParameters->GetAvar << 84 M0target = target->GetDefinition()->GetPDGMass(); >> 85 } >> 86 G4double M0target2 = M0target * M0target; 83 87 84 // Transform momenta to cms and then rotate 88 // Transform momenta to cms and then rotate parallel to z axis; 85 G4LorentzVector Psum; 89 G4LorentzVector Psum; 86 Psum = Pprojectile + Ptarget; 90 Psum = Pprojectile + Ptarget; 87 G4LorentzRotation toCms( -1*Psum.boostVector 91 G4LorentzRotation toCms( -1*Psum.boostVector() ); 88 G4LorentzVector Ptmp = toCms*Pprojectile; 92 G4LorentzVector Ptmp = toCms*Pprojectile; 89 if ( Ptmp.pz() <= 0.0 ) return false; 93 if ( Ptmp.pz() <= 0.0 ) return false; 90 //"String" moving backwards in CMS, abort c << 94 // "String" moving backwards in CMS, abort collision ! 91 //G4cout << " abort Collision! " << G4endl; 95 //G4cout << " abort Collision! " << G4endl; 92 toCms.rotateZ( -1*Ptmp.phi() ); 96 toCms.rotateZ( -1*Ptmp.phi() ); 93 toCms.rotateY( -1*Ptmp.theta() ); 97 toCms.rotateY( -1*Ptmp.theta() ); 94 G4LorentzRotation toLab( toCms.inverse() ); 98 G4LorentzRotation toLab( toCms.inverse() ); 95 Pprojectile.transform( toCms ); 99 Pprojectile.transform( toCms ); 96 Ptarget.transform( toCms ); 100 Ptarget.transform( toCms ); 97 101 >> 102 // Putting on mass-on-shell, if needed 98 G4double PZcms2, PZcms; 103 G4double PZcms2, PZcms; 99 G4double S = Psum.mag2(); 104 G4double S = Psum.mag2(); 100 G4double SqrtS = std::sqrt( S ); 105 G4double SqrtS = std::sqrt( S ); 101 if ( SqrtS < M0projectile + M0target ) retur 106 if ( SqrtS < M0projectile + M0target ) return false; 102 107 103 PZcms2 = ( S*S + sqr( M0projectile2 ) + sqr( 108 PZcms2 = ( S*S + sqr( M0projectile2 ) + sqr( M0target2 ) 104 - 2*S*M0projectile2 - 2*S*M0targe 109 - 2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2 ) / 4.0 / S; 105 110 106 PZcms = ( PZcms2 > 0.0 ? std::sqrt( PZcms2 ) << 111 if ( PZcms2 < 0.0 ) { // It can be in an interaction with off-shell nuclear nucleon >> 112 if ( M0projectile > projectile->GetDefinition()->GetPDGMass() ) { >> 113 // An attempt to de-excite the projectile >> 114 // It is assumed that the target is in the ground state >> 115 M0projectile = projectile->GetDefinition()->GetPDGMass(); >> 116 M0projectile2 = M0projectile * M0projectile; >> 117 PZcms2= ( S*S + sqr( M0projectile2 ) + sqr( M0target2 ) >> 118 - 2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2 ) / 4.0 / S; >> 119 if ( PZcms2 < 0.0 ) { return false; } // Nonsuccesful attempt to de-excitate the projectile >> 120 } else { >> 121 return false; // The projectile was not excited, but the energy was too low to put >> 122 // the target nucleon on mass-shell >> 123 } >> 124 } >> 125 >> 126 PZcms = std::sqrt( PZcms2 ); >> 127 >> 128 if ( PutOnMassShell ) { >> 129 if ( Pprojectile.z() > 0.0 ) { >> 130 Pprojectile.setPz( PZcms ); >> 131 Ptarget.setPz( -PZcms ); >> 132 } else { >> 133 Pprojectile.setPz( -PZcms ); >> 134 Ptarget.setPz( PZcms ); >> 135 }; >> 136 Pprojectile.setE( std::sqrt( M0projectile2 + Pprojectile.x() * Pprojectile.x() + >> 137 Pprojectile.y() * Pprojectile.y() + PZcms2 ) ); >> 138 Ptarget.setE( std::sqrt( M0target2 + Ptarget.x() * Ptarget.x() + Ptarget.y() * Ptarget.y() + >> 139 PZcms2 ) ); >> 140 } 107 141 108 G4double maxPtSquare = PZcms2; 142 G4double maxPtSquare = PZcms2; 109 143 110 // Now we can calculate the transferred Pt 144 // Now we can calculate the transferred Pt 111 G4double Pt2; 145 G4double Pt2; 112 G4double ProjMassT2, ProjMassT; 146 G4double ProjMassT2, ProjMassT; 113 G4double TargMassT2, TargMassT; 147 G4double TargMassT2, TargMassT; 114 G4LorentzVector Qmomentum; 148 G4LorentzVector Qmomentum; 115 149 116 const G4int maxNumberOfLoops = 1000; << 117 G4int loopCounter = 0; << 118 do { 150 do { 119 Qmomentum = G4LorentzVector( GaussianPt( A 151 Qmomentum = G4LorentzVector( GaussianPt( AveragePt2, maxPtSquare ), 0.0 ); 120 Pt2 = G4ThreeVector( Qmomentum.vect() ).ma 152 Pt2 = G4ThreeVector( Qmomentum.vect() ).mag2(); 121 ProjMassT2 = M0projectile2 + Pt2; 153 ProjMassT2 = M0projectile2 + Pt2; 122 ProjMassT = std::sqrt( ProjMassT2 ); 154 ProjMassT = std::sqrt( ProjMassT2 ); 123 TargMassT2 = M0target2 + Pt2; 155 TargMassT2 = M0target2 + Pt2; 124 TargMassT = std::sqrt( TargMassT2 ); 156 TargMassT = std::sqrt( TargMassT2 ); 125 } while ( ( SqrtS < ProjMassT + TargMassT ) << 157 } while ( SqrtS < ProjMassT + TargMassT ); 126 ++loopCounter < maxNumberOfLoops ) << 127 if ( loopCounter >= maxNumberOfLoops ) { << 128 return false; << 129 } << 130 158 131 PZcms2 = ( S*S + sqr( ProjMassT2 ) + sqr( Ta 159 PZcms2 = ( S*S + sqr( ProjMassT2 ) + sqr( TargMassT2 ) 132 - 2.0*S*ProjMassT2 - 2.0*S*TargMa 160 - 2.0*S*ProjMassT2 - 2.0*S*TargMassT2 - 2.0*ProjMassT2*TargMassT2 ) / 4.0 / S; 133 161 134 if ( PZcms2 < 0.0 ) { PZcms2 = 0.0; }; // t 162 if ( PZcms2 < 0.0 ) { PZcms2 = 0.0; }; // to avoid the exactness problem 135 PZcms = std::sqrt( PZcms2 ); 163 PZcms = std::sqrt( PZcms2 ); 136 Pprojectile.setPz( PZcms ); 164 Pprojectile.setPz( PZcms ); 137 Ptarget.setPz( -PZcms ); 165 Ptarget.setPz( -PZcms ); 138 Pprojectile += Qmomentum; 166 Pprojectile += Qmomentum; 139 Ptarget -= Qmomentum; 167 Ptarget -= Qmomentum; 140 168 141 // Transform back and update SplitableHadron 169 // Transform back and update SplitableHadron Participant. 142 Pprojectile.transform( toLab ); 170 Pprojectile.transform( toLab ); 143 Ptarget.transform( toLab ); 171 Ptarget.transform( toLab ); 144 172 145 // Calculation of the creation time 173 // Calculation of the creation time 146 projectile->SetTimeOfCreation( target->GetTi 174 projectile->SetTimeOfCreation( target->GetTimeOfCreation() ); 147 projectile->SetPosition( target->GetPosition 175 projectile->SetPosition( target->GetPosition() ); 148 176 149 // Creation time and position of target nucl 177 // Creation time and position of target nucleon were determined at 150 // ReggeonCascade() of G4FTFModel 178 // ReggeonCascade() of G4FTFModel 151 179 152 projectile->Set4Momentum( Pprojectile ); 180 projectile->Set4Momentum( Pprojectile ); 153 target->Set4Momentum( Ptarget ); 181 target->Set4Momentum( Ptarget ); 154 182 155 //projectile->IncrementCollisionCount( 1 ); 183 //projectile->IncrementCollisionCount( 1 ); 156 //target->IncrementCollisionCount( 1 ); 184 //target->IncrementCollisionCount( 1 ); 157 185 158 return true; 186 return true; 159 } 187 } 160 188 161 189 162 //============================================ 190 //============================================================================ 163 191 164 G4ThreeVector G4ElasticHNScattering::GaussianP 192 G4ThreeVector G4ElasticHNScattering::GaussianPt( G4double AveragePt2, 165 193 G4double maxPtSquare ) const { 166 // @@ this method is used in FTFModel as wel 194 // @@ this method is used in FTFModel as well. Should go somewhere common! 167 G4double Pt2( 0.0 ); 195 G4double Pt2( 0.0 ); 168 if ( AveragePt2 <= 0.0 ) { 196 if ( AveragePt2 <= 0.0 ) { 169 Pt2 = 0.0; 197 Pt2 = 0.0; 170 } else { 198 } else { 171 Pt2 = -AveragePt2 * G4Log( 1.0 + G4Uniform << 199 Pt2 = -AveragePt2 * std::log( 1.0 + G4UniformRand() * >> 200 ( std::exp( -maxPtSquare/AveragePt2 ) -1.0 ) ); 172 } 201 } 173 G4double Pt = ( Pt2 > 0.0 ? std::sqrt( Pt2 ) << 202 G4double Pt = std::sqrt( Pt2 ); 174 G4double phi = G4UniformRand() * twopi; 203 G4double phi = G4UniformRand() * twopi; 175 return G4ThreeVector( Pt * std::cos( phi ), 204 return G4ThreeVector( Pt * std::cos( phi ), Pt * std::sin( phi ), 0.0 ); 176 } 205 } 177 206 178 207 179 //============================================ 208 //============================================================================ 180 209 181 G4ElasticHNScattering::G4ElasticHNScattering( 210 G4ElasticHNScattering::G4ElasticHNScattering( const G4ElasticHNScattering& ) { 182 throw G4HadronicException( __FILE__, __LINE_ 211 throw G4HadronicException( __FILE__, __LINE__, 183 "G4ElasticHNScatt << 212 "G4ElasticHNScattering copy contructor not meant to be called" ); 184 } 213 } 185 214 186 215 187 //============================================ 216 //============================================================================ 188 217 189 G4ElasticHNScattering::~G4ElasticHNScattering( 218 G4ElasticHNScattering::~G4ElasticHNScattering() {} 190 219 191 220 192 //============================================ 221 //============================================================================ 193 222 194 const G4ElasticHNScattering & G4ElasticHNScatt 223 const G4ElasticHNScattering & G4ElasticHNScattering::operator=( const G4ElasticHNScattering& ) { 195 throw G4HadronicException( __FILE__, __LINE_ 224 throw G4HadronicException( __FILE__, __LINE__, 196 "G4ElasticHNScatt 225 "G4ElasticHNScattering = operator not meant to be called" ); 197 } 226 } 198 227 199 228 200 //============================================ 229 //============================================================================ 201 230 202 G4bool G4ElasticHNScattering::operator==( cons << 231 int G4ElasticHNScattering::operator==( const G4ElasticHNScattering& ) const { 203 throw G4HadronicException( __FILE__, __LINE__ 232 throw G4HadronicException( __FILE__, __LINE__, 204 "G4ElasticHNScatte 233 "G4ElasticHNScattering == operator not meant to be called" ); 205 } 234 } 206 235 207 236 208 //============================================ 237 //============================================================================ 209 238 210 G4bool G4ElasticHNScattering::operator!=( cons << 239 int G4ElasticHNScattering::operator!=( const G4ElasticHNScattering& ) const { 211 throw G4HadronicException( __FILE__, __LINE_ 240 throw G4HadronicException( __FILE__, __LINE__, 212 "G4ElasticHNScatte 241 "G4ElasticHNScattering != operator not meant to be called" ); 213 } 242 } 214 << 215 243