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 // GEANT 4 class header file 27 // GEANT 4 class header file 28 // 28 // 29 // History: 29 // History: 30 // 17 August 2004 P. Gumplinger, T. MacP 30 // 17 August 2004 P. Gumplinger, T. MacPhail 31 // 11 April 2008 Kamil Sedlak (PSI), To 31 // 11 April 2008 Kamil Sedlak (PSI), Toni Shiroka (PSI) 32 // ------------------------------------------- 32 // ------------------------------------------------------------ 33 // 33 // 34 #include "G4DecayWithSpin.hh" 34 #include "G4DecayWithSpin.hh" 35 35 36 #include "G4Step.hh" 36 #include "G4Step.hh" 37 #include "G4Track.hh" 37 #include "G4Track.hh" 38 #include "G4DecayTable.hh" 38 #include "G4DecayTable.hh" 39 #include "G4MuonDecayChannelWithSpin.hh" 39 #include "G4MuonDecayChannelWithSpin.hh" 40 40 41 #include "G4PhysicalConstants.hh" << 42 #include "G4SystemOfUnits.hh" << 43 #include "G4Vector3D.hh" 41 #include "G4Vector3D.hh" 44 42 45 #include "G4TransportationManager.hh" 43 #include "G4TransportationManager.hh" 46 #include "G4PropagatorInField.hh" 44 #include "G4PropagatorInField.hh" 47 #include "G4FieldManager.hh" 45 #include "G4FieldManager.hh" 48 #include "G4Field.hh" 46 #include "G4Field.hh" 49 47 50 #include "G4Transform3D.hh" 48 #include "G4Transform3D.hh" 51 49 52 G4DecayWithSpin::G4DecayWithSpin(const G4Strin 50 G4DecayWithSpin::G4DecayWithSpin(const G4String& processName):G4Decay(processName) 53 { 51 { 54 // set Process Sub Type 52 // set Process Sub Type 55 SetProcessSubType(static_cast<int>(DECAY_Wit 53 SetProcessSubType(static_cast<int>(DECAY_WithSpin)); 56 54 57 } 55 } 58 56 59 G4DecayWithSpin::~G4DecayWithSpin(){} 57 G4DecayWithSpin::~G4DecayWithSpin(){} 60 58 61 G4VParticleChange* G4DecayWithSpin::PostStepDo << 59 G4VParticleChange* G4DecayWithSpin::DecayIt(const G4Track& aTrack, const G4Step& aStep) 62 { 60 { 63 if ( (aTrack.GetTrackStatus() == fStopButAli << 64 (aTrack.GetTrackStatus() == fStopAndKil << 65 fParticleChangeForDecay.Initialize(aTrack) << 66 return &fParticleChangeForDecay; << 67 } << 68 61 69 // get particle 62 // get particle 70 const G4DynamicParticle* aParticle = aTrack. 63 const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); 71 const G4ParticleDefinition* aParticleDef = a << 64 G4ParticleDefinition* aParticleDef = aParticle->GetDefinition(); 72 65 73 // get parent_polarization 66 // get parent_polarization 74 G4ThreeVector parent_polarization = aParticl 67 G4ThreeVector parent_polarization = aParticle->GetPolarization(); 75 68 76 if(parent_polarization == G4ThreeVector(0,0, << 69 if(parent_polarization == G4ThreeVector(0,0,0)) >> 70 { 77 // Generate random polarization direction 71 // Generate random polarization direction 78 G4double cost = 1. - 2.*G4UniformRand(); << 79 G4double sint = std::sqrt((1.-cost)*(1.+co << 80 << 81 G4double phi = twopi*G4UniformRand(); << 82 G4double sinp = std::sin(phi); << 83 G4double cosp = std::cos(phi); << 84 << 85 G4double px = sint*cosp; << 86 G4double py = sint*sinp; << 87 G4double pz = cost; << 88 << 89 parent_polarization.setX(px); << 90 parent_polarization.setY(py); << 91 parent_polarization.setZ(pz); << 92 } << 93 << 94 // decay table << 95 G4DecayTable *decaytable = aParticleDef->Get << 96 if (decaytable != nullptr) { << 97 for (G4int ip=0; ip<decaytable->entries(); << 98 decaytable->GetDecayChannel(ip)->SetPola << 99 } << 100 } << 101 72 102 G4ParticleChangeForDecay* pParticleChangeFor << 103 pParticleChangeForDecay = (G4ParticleChangeF << 104 pParticleChangeForDecay->ProposePolarization << 105 << 106 return pParticleChangeForDecay; << 107 } << 108 << 109 G4VParticleChange* G4DecayWithSpin::AtRestDoIt << 110 { << 111 << 112 // get particle << 113 const G4DynamicParticle* aParticle = aTrack. << 114 const G4ParticleDefinition* aParticleDef = a << 115 << 116 // get parent_polarization << 117 G4ThreeVector parent_polarization = aParticl << 118 << 119 if(parent_polarization == G4ThreeVector(0,0, << 120 // Generate random polarization direction << 121 G4double cost = 1. - 2.*G4UniformRand(); 73 G4double cost = 1. - 2.*G4UniformRand(); 122 G4double sint = std::sqrt((1.-cost)*(1.+co 74 G4double sint = std::sqrt((1.-cost)*(1.+cost)); 123 75 124 G4double phi = twopi*G4UniformRand(); 76 G4double phi = twopi*G4UniformRand(); 125 G4double sinp = std::sin(phi); 77 G4double sinp = std::sin(phi); 126 G4double cosp = std::cos(phi); 78 G4double cosp = std::cos(phi); 127 79 128 G4double px = sint*cosp; 80 G4double px = sint*cosp; 129 G4double py = sint*sinp; 81 G4double py = sint*sinp; 130 G4double pz = cost; 82 G4double pz = cost; 131 83 132 parent_polarization.setX(px); 84 parent_polarization.setX(px); 133 parent_polarization.setY(py); 85 parent_polarization.setY(py); 134 parent_polarization.setZ(pz); 86 parent_polarization.setZ(pz); 135 87 136 }else{ 88 }else{ 137 89 138 G4FieldManager* fieldMgr = aStep.GetTrack( 90 G4FieldManager* fieldMgr = aStep.GetTrack()->GetVolume()-> 139 GetLogica 91 GetLogicalVolume()->GetFieldManager(); 140 if (fieldMgr == nullptr) { << 92 >> 93 if (!fieldMgr) { 141 G4TransportationManager *transportMgr = 94 G4TransportationManager *transportMgr = 142 G4TransportationManag 95 G4TransportationManager::GetTransportationManager(); 143 G4PropagatorInField* fFieldPropagator = 96 G4PropagatorInField* fFieldPropagator = 144 transp 97 transportMgr->GetPropagatorInField(); 145 if (fFieldPropagator) fieldMgr = 98 if (fFieldPropagator) fieldMgr = 146 fFieldPropag 99 fFieldPropagator->GetCurrentFieldManager(); 147 } 100 } 148 101 149 const G4Field* field = nullptr; << 102 const G4Field* field = NULL; 150 if (fieldMgr != nullptr) field = fieldMgr- << 103 if(fieldMgr)field = fieldMgr->GetDetectorField(); >> 104 >> 105 if (field) { 151 106 152 if ( field != nullptr ) { << 153 G4double point[4]; 107 G4double point[4]; 154 point[0] = (aStep.GetPostStepPoint()->G 108 point[0] = (aStep.GetPostStepPoint()->GetPosition())[0]; 155 point[1] = (aStep.GetPostStepPoint()->G 109 point[1] = (aStep.GetPostStepPoint()->GetPosition())[1]; 156 point[2] = (aStep.GetPostStepPoint()->G 110 point[2] = (aStep.GetPostStepPoint()->GetPosition())[2]; 157 point[3] = aTrack.GetGlobalTime(); 111 point[3] = aTrack.GetGlobalTime(); 158 112 159 G4double fieldValue[6] ={ 0., 0., 0., 0 << 113 G4double fieldValue[6]; 160 field -> GetFieldValue(point,fieldValue 114 field -> GetFieldValue(point,fieldValue); >> 115 161 G4ThreeVector B(fieldValue[0],fieldValu 116 G4ThreeVector B(fieldValue[0],fieldValue[1],fieldValue[2]); 162 117 163 // Call the spin precession only for no 118 // Call the spin precession only for non-zero mag. field 164 if (B.mag2() > 0.) parent_polarization 119 if (B.mag2() > 0.) parent_polarization = 165 Spin_Precessi 120 Spin_Precession(aStep,B,fRemainderLifeTime); 166 121 167 } 122 } 168 } 123 } 169 124 170 // decay table 125 // decay table 171 G4DecayTable *decaytable = aParticleDef->Get 126 G4DecayTable *decaytable = aParticleDef->GetDecayTable(); 172 if ( decaytable != nullptr) { << 127 173 for (G4int ip=0; ip<decaytable->entries(); << 128 if (decaytable) { 174 decaytable->GetDecayChannel(ip)->SetPola << 129 G4MuonDecayChannelWithSpin *decaychannel; 175 } << 130 decaychannel = (G4MuonDecayChannelWithSpin*)decaytable->SelectADecayChannel(); 176 } << 131 if (decaychannel) decaychannel->SetPolarization(parent_polarization); >> 132 } 177 133 178 G4ParticleChangeForDecay* pParticleChangeFor 134 G4ParticleChangeForDecay* pParticleChangeForDecay; >> 135 179 pParticleChangeForDecay = (G4ParticleChangeF 136 pParticleChangeForDecay = (G4ParticleChangeForDecay*)G4Decay::DecayIt(aTrack,aStep); >> 137 180 pParticleChangeForDecay->ProposePolarization 138 pParticleChangeForDecay->ProposePolarization(parent_polarization); 181 139 182 return pParticleChangeForDecay; 140 return pParticleChangeForDecay; 183 141 184 } 142 } 185 143 186 G4ThreeVector G4DecayWithSpin::Spin_Precession 144 G4ThreeVector G4DecayWithSpin::Spin_Precession( const G4Step& aStep, 187 G4Thre 145 G4ThreeVector B, G4double deltatime ) 188 { 146 { 189 G4double Bnorm = std::sqrt(sqr(B[0]) + sqr( 147 G4double Bnorm = std::sqrt(sqr(B[0]) + sqr(B[1]) +sqr(B[2]) ); 190 148 191 G4double q = aStep.GetTrack()->GetDefinition 149 G4double q = aStep.GetTrack()->GetDefinition()->GetPDGCharge(); 192 G4double a = 1.165922e-3; 150 G4double a = 1.165922e-3; 193 G4double s_omega = 8.5062e+7*rad/(s*kilogaus 151 G4double s_omega = 8.5062e+7*rad/(s*kilogauss); 194 152 195 G4double omega = -(q*s_omega)*(1.+a) * Bnorm 153 G4double omega = -(q*s_omega)*(1.+a) * Bnorm; 196 154 197 G4double rotationangle = deltatime * omega; 155 G4double rotationangle = deltatime * omega; 198 156 199 G4Transform3D SpinRotation = G4Rotate3D(rota 157 G4Transform3D SpinRotation = G4Rotate3D(rotationangle,B.unit()); 200 158 201 G4Vector3D Spin = aStep.GetTrack() -> GetPol 159 G4Vector3D Spin = aStep.GetTrack() -> GetPolarization(); 202 160 203 G4Vector3D newSpin = SpinRotation * Spin; 161 G4Vector3D newSpin = SpinRotation * Spin; 204 162 205 #ifdef G4VERBOSE 163 #ifdef G4VERBOSE 206 if (GetVerboseLevel()>2) { 164 if (GetVerboseLevel()>2) { 207 G4double normspin = std::sqrt(Spin*Spin); 165 G4double normspin = std::sqrt(Spin*Spin); 208 G4double normnewspin = std::sqrt(newSpin*n 166 G4double normnewspin = std::sqrt(newSpin*newSpin); 209 //G4double cosalpha = Spin*newSpin/normspi 167 //G4double cosalpha = Spin*newSpin/normspin/normnewspin; 210 //G4double alpha = std::acos(cosalpha); 168 //G4double alpha = std::acos(cosalpha); 211 169 212 G4cout << "AT REST::: PARAMETERS " << G4en 170 G4cout << "AT REST::: PARAMETERS " << G4endl; 213 G4cout << "Initial spin : " << Spin << G 171 G4cout << "Initial spin : " << Spin << G4endl; 214 G4cout << "Delta time : " << deltatime 172 G4cout << "Delta time : " << deltatime << G4endl; 215 G4cout << "Rotation angle: " << rotationan 173 G4cout << "Rotation angle: " << rotationangle/rad << G4endl; 216 G4cout << "New spin : " << newSpin < 174 G4cout << "New spin : " << newSpin << G4endl; 217 G4cout << "Checked norms : " << normspin < 175 G4cout << "Checked norms : " << normspin <<" " << normnewspin << G4endl; 218 } 176 } 219 #endif 177 #endif 220 178 221 return newSpin; 179 return newSpin; 222 180 223 } << 224 << 225 void G4DecayWithSpin::ProcessDescription(std:: << 226 { << 227 outFile << GetProcessName() << 228 << ": Decay of particles considering paren << 229 << "kinematics of daughters are dertermine << 230 } 181 } 231 182