Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // @hpw@ misses the sampling of two breit wign 27 // @hpw@ to be usefull for resonance resonance 28 29 #include <typeinfo> 30 31 #include "globals.hh" 32 #include "G4SystemOfUnits.hh" 33 #include "G4VScatteringCollision.hh" 34 #include "G4KineticTrack.hh" 35 #include "G4VCrossSectionSource.hh" 36 #include "G4Proton.hh" 37 #include "G4Neutron.hh" 38 #include "G4XNNElastic.hh" 39 #include "G4AngularDistribution.hh" 40 #include "G4ThreeVector.hh" 41 #include "G4LorentzVector.hh" 42 #include "G4LorentzRotation.hh" 43 #include "G4KineticTrackVector.hh" 44 #include "Randomize.hh" 45 #include "G4PionPlus.hh" 46 47 G4VScatteringCollision::G4VScatteringCollision 48 { 49 theAngularDistribution = new G4AngularDistri 50 } 51 52 53 G4VScatteringCollision::~G4VScatteringCollisio 54 { 55 delete theAngularDistribution; 56 theAngularDistribution=0; 57 } 58 59 60 G4KineticTrackVector* G4VScatteringCollision:: 61 const G4KineticTrack& trk2) 62 { 63 const G4VAngularDistribution* angDistributio 64 G4LorentzVector p = trk1.Get4Momentum() + tr 65 G4double sqrtS = p.m(); 66 G4double S = sqrtS * sqrtS; 67 68 std::vector<const G4ParticleDefinition*> Out 69 if (OutputDefinitions.size() != 2) 70 throw G4HadronicException(__FILE__, __LINE 71 72 if (OutputDefinitions[0]->IsShortLived() && 73 { 74 if(std::getenv("G4KCDEBUG")) G4cerr << "tw 75 // throw G4HadronicException(__FILE__, __L 76 } 77 78 G4double outm1 = OutputDefinitions[0]->GetPD 79 G4double outm2 = OutputDefinitions[1]->GetPD 80 81 if (OutputDefinitions[0]->IsShortLived()) 82 { 83 outm1 = SampleResonanceMass(outm1, 84 OutputDefinitions[0]->GetPDGWi 85 G4Neutron::NeutronDefinition()->GetPDGMass 86 sqrtS-(G4Neutron::NeutronDefinition()->Get 87 88 } 89 if (OutputDefinitions[1]->IsShortLived()) 90 { 91 outm2 = SampleResonanceMass(outm2, OutputD 92 G4Neutron::NeutronDefinition()->GetPDGMa 93 sqrtS-outm1); 94 } 95 96 // Angles of outgoing particles 97 G4double cosTheta = angDistribution->CosThet 98 G4double phi = angDistribution->Phi(); 99 100 // Unit vector of three-momentum 101 G4LorentzRotation fromCMSFrame(p.boostVector 102 G4LorentzRotation toCMSFrame(fromCMSFrame.in 103 G4LorentzVector TempPtr = toCMSFrame*trk1.Ge 104 G4LorentzRotation toZ; 105 toZ.rotateZ(-1*TempPtr.phi()); 106 toZ.rotateY(-1*TempPtr.theta()); 107 G4LorentzRotation toCMS(toZ.inverse()); 108 109 G4ThreeVector pFinal1(std::sin(std::acos(cos 110 111 // Three momentum in cm system 112 G4double pCM = std::sqrt( (S-(outm1+outm2)*( 113 pFinal1 = pFinal1 * pCM; 114 G4ThreeVector pFinal2 = -pFinal1; 115 116 G4double eFinal1 = std::sqrt(pFinal1.mag2() 117 G4double eFinal2 = std::sqrt(pFinal2.mag2() 118 119 G4LorentzVector p4Final1(pFinal1, eFinal1); 120 G4LorentzVector p4Final2(pFinal2, eFinal2); 121 p4Final1 = toCMS*p4Final1; 122 p4Final2 = toCMS*p4Final2; 123 124 125 // Lorentz transformation 126 G4LorentzRotation toLabFrame(p.boostVector() 127 p4Final1 *= toLabFrame; 128 p4Final2 *= toLabFrame; 129 130 // Final tracks are copies of incoming ones, 131 132 G4double chargeBalance = OutputDefinitions[0 133 chargeBalance-= trk1.GetDefinition()->GetPDG 134 chargeBalance-= trk2.GetDefinition()->GetPDG 135 if(std::abs(chargeBalance) >.1) 136 { 137 G4cout << "Charges in "<<typeid(*this).nam 138 G4cout << OutputDefinitions[0]->GetPDGChar 139 << OutputDefinitions[1]->GetPDGChar 140 << trk1.GetDefinition()->GetPDGCharge()<< 141 << trk2.GetDefinition()->GetPDGCharge()<< 142 } 143 G4KineticTrack* final1 = new G4KineticTrack( 144 G4KineticTrack* final2 = new G4KineticTrack( 145 146 G4KineticTrackVector* finalTracks = new G4Ki 147 148 finalTracks->push_back(final1); 149 finalTracks->push_back(final2); 150 151 return finalTracks; 152 } 153 154 155 156 double G4VScatteringCollision::SampleResonance 157 const double gamma, 158 const double aMinMass, 159 const double maxMass) const 160 { 161 // Chooses a mass randomly between minMass a 162 // according to a Breit-Wigner function 163 // width gamma and pole poleMass 164 165 G4double minMass = aMinMass; 166 if (minMass > maxMass) G4cerr << "########## 167 if(minMass > maxMass) minMass -= G4PionPlus: 168 if(minMass > maxMass) minMass = 0; 169 170 if (gamma < 1E-10*GeV) 171 return std::max(minMass,std::min(maxMass, 172 else { 173 double fmin = BrWigInt0(minMass, gamma, po 174 double fmax = BrWigInt0(maxMass, gamma, po 175 double f = fmin + (fmax-fmin)*G4UniformRan 176 return BrWigInv(f, gamma, poleMass); 177 } 178 } 179 180 void G4VScatteringCollision::establish_G4MT_TL 181 { 182 establish_G4MT_TLS_G4VCollision(); 183 if ( theAngularDistribution ) delete theAngu 184 theAngularDistribution = new G4AngularDistri 185 } 186