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 /// \file eventgenerator/pythia/pythia8decayer/src/Py8DecayerPhysics.cc 28 /// \brief Implementation of the Py8DecayerPhysics class 29 /// 30 /// \author J. Yarba; FNAL 31 32 #include "Py8DecayerPhysics.hh" 33 34 #include "Py8Decayer.hh" 35 36 #include "G4Decay.hh" 37 #include "G4DecayTable.hh" 38 #include "G4ParticleDefinition.hh" 39 #include "G4ProcessManager.hh" 40 41 // factory 42 // 43 #include "G4PhysicsConstructorFactory.hh" 44 // 45 // register it with contructor factory 46 // 47 G4_DECLARE_PHYSCONSTR_FACTORY(Py8DecayerPhysics); 48 49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 50 51 Py8DecayerPhysics::Py8DecayerPhysics(G4int) : G4VPhysicsConstructor("Py8DecayerPhysics") {} 52 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 54 55 Py8DecayerPhysics::~Py8DecayerPhysics() {} 56 57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 58 59 void Py8DecayerPhysics::ConstructParticle() 60 { 61 // Nothing needs to be done here 62 } 63 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 65 66 void Py8DecayerPhysics::ConstructProcess() 67 { 68 // Adding external decayer to G4Decay process (per each thread). 69 // G4Decay will use the external decayer if G4Decay process is 70 // assigned to an unstable particle and that particle does not 71 // have its decay table. 72 73 // Loop over all particles instantiated and remove already-assigned 74 // decay table for tau's and B+/- so that they will decay through 75 // the external decayer (Pythia8). 76 77 // NOTE: The extDecayer will be deleted in G4Decay destructor 78 79 Py8Decayer* extDecayer = new Py8Decayer(); 80 G4bool setOnce = true; 81 82 auto particleIterator = GetParticleIterator(); 83 particleIterator->reset(); 84 while ((*particleIterator)()) { 85 G4ParticleDefinition* particle = particleIterator->value(); 86 87 // remove native/existing decay table for 88 // a)tau's 89 // b) B+/- 90 // so that G4Decay will use the external decayer 91 if (std::abs(particle->GetPDGEncoding()) == 15 || std::abs(particle->GetPDGEncoding()) == 521) { 92 if (particle->GetDecayTable()) { 93 delete particle->GetDecayTable(); 94 particle->SetDecayTable(nullptr); 95 /* 96 if ( verboseLevel > 1 ) { 97 G4cout << "Use ext decayer for: " 98 << particleIterator->value()->GetParticleName() 99 << G4endl; 100 } 101 */ 102 } 103 } 104 105 if (setOnce) 106 // One G4Decay object is shared by all unstable particles (per thread). 107 // Thus, we set the external decayer only once. 108 { 109 G4ProcessManager* pmanager = particle->GetProcessManager(); 110 G4ProcessVector* processVector = pmanager->GetProcessList(); 111 for (size_t i = 0; i < processVector->length(); ++i) { 112 G4Decay* decay = dynamic_cast<G4Decay*>((*processVector)[i]); 113 if (decay) { 114 decay->SetExtDecayer(extDecayer); 115 setOnce = false; 116 } 117 } 118 } 119 } 120 121 return; 122 } 123 124 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 125