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: G4UnknownDecay.cc,v 1.3 2006/06/29 19:31:40 gunter Exp $ >> 28 // GEANT4 tag $Name: geant4-08-02 $ 27 // 29 // 28 // 30 // 29 // ------------------------------------------- 31 // -------------------------------------------------------------- 30 // GEANT 4 class implementation file 32 // GEANT 4 class implementation file 31 // 33 // 32 // ------------------------------------------- 34 // ------------------------------------------------------------ 33 // 35 // 34 36 35 #include "G4UnknownDecay.hh" 37 #include "G4UnknownDecay.hh" 36 << 37 #include "G4PhysicalConstants.hh" << 38 #include "G4SystemOfUnits.hh" << 39 #include "G4DynamicParticle.hh" 38 #include "G4DynamicParticle.hh" 40 #include "G4DecayProducts.hh" 39 #include "G4DecayProducts.hh" 41 #include "G4PhysicsLogVector.hh" 40 #include "G4PhysicsLogVector.hh" 42 #include "G4ParticleChangeForDecay.hh" 41 #include "G4ParticleChangeForDecay.hh" 43 #include "G4DecayProcessType.hh" << 44 42 45 // constructor 43 // constructor 46 G4UnknownDecay::G4UnknownDecay(const G4String& 44 G4UnknownDecay::G4UnknownDecay(const G4String& processName) 47 :G4VDiscretePro 45 :G4VDiscreteProcess(processName, fDecay), 48 verboseLevel(1), 46 verboseLevel(1), 49 HighestValue(2 47 HighestValue(20.0) 50 { 48 { 51 // set Process Sub Type << 52 SetProcessSubType(static_cast<int>(DECAY_Unk << 53 << 54 #ifdef G4VERBOSE 49 #ifdef G4VERBOSE 55 if (GetVerboseLevel()>1) { 50 if (GetVerboseLevel()>1) { 56 G4cout << "G4UnknownDecay constructor " < << 51 G4cerr << "G4UnknownDecay constructor " << " Name:" << processName << G4endl; 57 } 52 } 58 #endif 53 #endif 59 pParticleChange = &fParticleChangeForDecay; 54 pParticleChange = &fParticleChangeForDecay; 60 } 55 } 61 56 62 G4UnknownDecay::~G4UnknownDecay() 57 G4UnknownDecay::~G4UnknownDecay() 63 { 58 { 64 } 59 } 65 60 66 G4bool G4UnknownDecay::IsApplicable(const G4Pa 61 G4bool G4UnknownDecay::IsApplicable(const G4ParticleDefinition& aParticleType) 67 { 62 { 68 if(aParticleType.GetParticleName()=="unknown 63 if(aParticleType.GetParticleName()=="unknown") return true; 69 return false; 64 return false; 70 } 65 } 71 66 72 G4double G4UnknownDecay::GetMeanFreePath(const 67 G4double G4UnknownDecay::GetMeanFreePath(const G4Track& /*aTrack*/,G4double, G4ForceCondition*) 73 { 68 { 74 return 0.0; << 69 // // get particle >> 70 // const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); >> 71 // >> 72 // // returns the mean free path in GEANT4 internal units >> 73 // G4double pathlength; >> 74 // G4double pTime = aParticle->GetPreAssignedDecayProperTime(); >> 75 // if(pTime<0.) pTime = DBL_MIN; >> 76 // G4double aCtau = c_light * pTime; >> 77 // G4double aMass = aParticle->GetMass(); >> 78 // >> 79 // G4double rKineticEnergy = aParticle->GetKineticEnergy()/aMass; >> 80 // if ( rKineticEnergy > HighestValue) { >> 81 // // gamma >> 1 >> 82 // pathlength = ( rKineticEnergy + 1.0)* aCtau; >> 83 // } else if ( rKineticEnergy < DBL_MIN ) { >> 84 // // too slow particle >> 85 // pathlength = DBL_MIN; >> 86 // } else { >> 87 // pathlength = (aParticle->GetTotalMomentum())/aMass*aCtau ; >> 88 // } >> 89 // return pathlength; >> 90 return DBL_MIN; 75 } 91 } 76 92 77 void G4UnknownDecay::BuildPhysicsTable(const G 93 void G4UnknownDecay::BuildPhysicsTable(const G4ParticleDefinition&) 78 { 94 { 79 return; 95 return; 80 } 96 } 81 97 82 G4VParticleChange* G4UnknownDecay::DecayIt(con 98 G4VParticleChange* G4UnknownDecay::DecayIt(const G4Track& aTrack, const G4Step& ) 83 { 99 { 84 // The DecayIt() method returns by pointer a 100 // The DecayIt() method returns by pointer a particle-change object. 85 // Units are expressed in GEANT4 internal un 101 // Units are expressed in GEANT4 internal units. 86 102 87 // Initialize ParticleChange 103 // Initialize ParticleChange 88 // all members of G4VParticleChange are 104 // all members of G4VParticleChange are set to equal to 89 // corresponding member in G4Track 105 // corresponding member in G4Track 90 fParticleChangeForDecay.Initialize(aTrack); 106 fParticleChangeForDecay.Initialize(aTrack); 91 107 92 // get particle 108 // get particle 93 const G4DynamicParticle* aParticle = aTrack. 109 const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); 94 110 95 //check if thePreAssignedDecayProducts exist 111 //check if thePreAssignedDecayProducts exists 96 const G4DecayProducts* o_products = (aPartic 112 const G4DecayProducts* o_products = (aParticle->GetPreAssignedDecayProducts()); 97 G4bool isPreAssigned = (o_products != nullpt << 113 G4bool isPreAssigned = (o_products != 0); 98 G4DecayProducts* products = nullptr; << 114 G4DecayProducts* products = 0; 99 115 100 if (!isPreAssigned ){ 116 if (!isPreAssigned ){ 101 fParticleChangeForDecay.SetNumberOfSeconda 117 fParticleChangeForDecay.SetNumberOfSecondaries(0); 102 // Kill the parent particle 118 // Kill the parent particle 103 fParticleChangeForDecay.ProposeTrackStatus 119 fParticleChangeForDecay.ProposeTrackStatus( fStopAndKill ) ; 104 fParticleChangeForDecay.ProposeLocalEnergy 120 fParticleChangeForDecay.ProposeLocalEnergyDeposit(0.0); 105 121 106 ClearNumberOfInteractionLengthLeft(); 122 ClearNumberOfInteractionLengthLeft(); 107 return &fParticleChangeForDecay ; 123 return &fParticleChangeForDecay ; 108 } 124 } 109 125 110 // copy decay products 126 // copy decay products 111 products = new G4DecayProducts(*o_products); 127 products = new G4DecayProducts(*o_products); 112 128 113 // get parent particle information ......... 129 // get parent particle information ................................... 114 G4double ParentEnergy = aParticle->GetTot 130 G4double ParentEnergy = aParticle->GetTotalEnergy(); 115 G4double ParentMass = aParticle->GetMas << 116 if (ParentEnergy < ParentMass) { << 117 ParentEnergy = ParentMass; << 118 #ifdef G4VERBOSE << 119 if (GetVerboseLevel()>1) { << 120 G4cout << "G4UnknownDecay::DoIt : Total << 121 G4cout << " Particle: " << aParticle->Ge << 122 G4cout << " Energy:" << ParentEnergy/ << 123 G4cout << " Mass:" << ParentMass/MeV << 124 G4cout << G4endl; << 125 } << 126 #endif << 127 } << 128 G4ThreeVector ParentDirection(aParticle->Get 131 G4ThreeVector ParentDirection(aParticle->GetMomentumDirection()); 129 132 130 G4double energyDeposit = 0.0; 133 G4double energyDeposit = 0.0; 131 G4double finalGlobalTime = aTrack.GetGlobalT 134 G4double finalGlobalTime = aTrack.GetGlobalTime(); 132 //boost all decay products to laboratory fra 135 //boost all decay products to laboratory frame 133 //if the particle has traveled 136 //if the particle has traveled 134 if(aParticle->GetPreAssignedDecayProperTime( << 137 if(aParticle->GetPreAssignedDecayProperTime()>0.) { 135 products->Boost( ParentEnergy, ParentDirec 138 products->Boost( ParentEnergy, ParentDirection); 136 } 139 } 137 140 138 //add products in fParticleChangeForDecay 141 //add products in fParticleChangeForDecay 139 G4int numberOfSecondaries = products->entrie 142 G4int numberOfSecondaries = products->entries(); 140 fParticleChangeForDecay.SetNumberOfSecondari 143 fParticleChangeForDecay.SetNumberOfSecondaries(numberOfSecondaries); 141 #ifdef G4VERBOSE 144 #ifdef G4VERBOSE 142 if (GetVerboseLevel()>1) { 145 if (GetVerboseLevel()>1) { 143 G4cout << "G4UnknownDecay::DoIt : Decay v << 146 G4cerr << "G4UnknownDecay::DoIt : Decay vertex :"; 144 G4cout << " Time: " << finalGlobalTime/ns << 147 G4cerr << " Time: " << finalGlobalTime/ns << "[ns]"; 145 G4cout << " X:" << (aTrack.GetPosition()). << 148 G4cerr << " X:" << (aTrack.GetPosition()).x() /cm << "[cm]"; 146 G4cout << " Y:" << (aTrack.GetPosition()). << 149 G4cerr << " Y:" << (aTrack.GetPosition()).y() /cm << "[cm]"; 147 G4cout << " Z:" << (aTrack.GetPosition()). << 150 G4cerr << " Z:" << (aTrack.GetPosition()).z() /cm << "[cm]"; 148 G4cout << G4endl; << 151 G4cerr << G4endl; 149 G4cout << "G4UnknownDecay::DoIt : decay p << 152 G4cerr << "G4UnknownDecay::DoIt : decay products in Lab. Frame" << G4endl; 150 products->DumpInfo(); 153 products->DumpInfo(); 151 } 154 } 152 #endif 155 #endif 153 G4int index; 156 G4int index; 154 G4ThreeVector currentPosition; 157 G4ThreeVector currentPosition; 155 const G4TouchableHandle thand = aTrack.GetTo 158 const G4TouchableHandle thand = aTrack.GetTouchableHandle(); 156 for (index=0; index < numberOfSecondaries; i << 159 for (index=0; index < numberOfSecondaries; index++) 157 // get current position of the track << 160 { 158 currentPosition = aTrack.GetPosition(); << 161 // get current position of the track 159 // create a new track object << 162 currentPosition = aTrack.GetPosition(); 160 G4Track* secondary = new G4Track( products << 163 // create a new track object >> 164 G4Track* secondary = new G4Track( products->PopProducts(), 161 finalGlobalTime , 165 finalGlobalTime , 162 currentPosition ); 166 currentPosition ); 163 // switch on good for tracking flag << 167 // switch on good for tracking flag 164 secondary->SetGoodForTrackingFlag(); << 168 secondary->SetGoodForTrackingFlag(); 165 secondary->SetTouchableHandle(thand); << 169 secondary->SetTouchableHandle(thand); 166 // add the secondary track in the List << 170 // add the secondary track in the List 167 fParticleChangeForDecay.AddSecondary(secon << 171 fParticleChangeForDecay.AddSecondary(secondary); 168 } 172 } 169 delete products; 173 delete products; 170 << 174 171 // Kill the parent particle 175 // Kill the parent particle 172 fParticleChangeForDecay.ProposeTrackStatus( 176 fParticleChangeForDecay.ProposeTrackStatus( fStopAndKill ) ; 173 fParticleChangeForDecay.ProposeLocalEnergyDe 177 fParticleChangeForDecay.ProposeLocalEnergyDeposit(energyDeposit); 174 fParticleChangeForDecay.ProposeGlobalTime( f 178 fParticleChangeForDecay.ProposeGlobalTime( finalGlobalTime ); 175 // reset NumberOfInteractionLengthLeft 179 // reset NumberOfInteractionLengthLeft 176 ClearNumberOfInteractionLengthLeft(); 180 ClearNumberOfInteractionLengthLeft(); 177 181 178 return &fParticleChangeForDecay ; 182 return &fParticleChangeForDecay ; 179 } 183 } 180 184 181 void G4UnknownDecay::ProcessDescription(std::o << 182 { << 183 outFile << GetProcessName() << 184 << ": Decay of 'unknown' particles. \n" << 185 << "kinematics of daughters are dertermine << 186 << "by PreAssignedDecayProducts. \n"; << 187 } << 188 185 189 186 190 187 191 188 192 189 193 190