Geant4-11
G4INCLDecayAvatar.cc
Go to the documentation of this file.
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// INCL++ intra-nuclear cascade model
27// Alain Boudard, CEA-Saclay, France
28// Joseph Cugnon, University of Liege, Belgium
29// Jean-Christophe David, CEA-Saclay, France
30// Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
31// Sylvie Leray, CEA-Saclay, France
32// Davide Mancusi, CEA-Saclay, France
33//
34#define INCLXX_IN_GEANT4_MODE 1
35
36#include "globals.hh"
37
38#include "G4INCLDecayAvatar.hh"
39
46#include <sstream>
47#include <string>
48// #include <cassert>
49
50namespace G4INCL {
51
53 : InteractionAvatar(time, n, aParticle), forced(force),
54 incidentDirection(aParticle->getMomentum())
55 {
57 }
58
60 : InteractionAvatar(time, n, aParticle, bParticle), forced(force),
61 incidentDirection(aParticle->getMomentum())
62 {
64 }
65
67
68 }
69
71 if(!particle2){
72 if(particle1->isDelta()) {
73 INCL_DEBUG("DeltaDecayChannel chosen." << '\n');
75 }
76 else if(particle1->isEta() || particle1->isOmega()) {
77 INCL_DEBUG("PionResonanceDecayChannel chosen." << '\n');
79 }
80 else if(particle1->getType() == SigmaZero) {
81 INCL_DEBUG("SigmaZeroDecayChannel chosen." << '\n');
83 }
84 else if(particle1->getType() == KZero || particle1->getType() == KZeroBar) {
85 INCL_DEBUG("NeutralKaonDecayChannel chosen." << '\n');
87 }
88 }
90 INCL_DEBUG("StrangeAbsorbtion." << '\n');
92 }
93 return NULL;
94 }
95
98 }
99
101 // Make sure we have at least two particles in the final state
102 // Removed because of neutral kaon decay
103
104// assert((fs->getModifiedParticles().size() + fs->getCreatedParticles().size() - fs->getDestroyedParticles().size() >= 2) || ((*fs->getModifiedParticles().begin())->getType() == KShort || (*fs->getModifiedParticles().begin())->getType() == KLong ));
105 //assert((fs->getModifiedParticles().size() + fs->getCreatedParticles().size() - fs->getDestroyedParticles().size() >= 1));
106 if(!forced) { // Normal decay
107 // Call the postInteraction method of the parent class
108 // (provides Pauli blocking and enforces energy conservation)
110
111 if(fs->getValidity() == PauliBlockedFS)
112 /* If the decay was Pauli-blocked, make sure the propagation model
113 * generates a new decay avatar on the next call to propagate().
114 *
115 * \bug{Note that we don't generate new decay avatars for deltas that
116 * could not satisfy energy conservation. This is in keeping with
117 * INCL4.6, but doesn't seem to make much sense to me (DM), as energy
118 * conservation can be impossible to satisfy due to weird local-energy
119 * conditions, for example, that evolve with time.}
120 */
122 } else { // Forced decay
127 modifiedAndCreated.insert(modifiedAndCreated.end(), created.begin(), created.end());
129 ModifiedAndDestroyed.insert(ModifiedAndDestroyed.end(), Destroyed.begin(), Destroyed.end());
130
131 std::vector<G4int> newBiasCollisionVector;
132 newBiasCollisionVector = ModifiedAndDestroyed.getParticleListBiasVector();
133 for(ParticleIter i=modifiedAndCreated.begin(), e=modifiedAndCreated.end(); i!=e; ++i ) {
134 (*i)->setBiasCollisionVector(newBiasCollisionVector);
135 }
136 // Try to enforce energy conservation
138 const G4bool success = enforceEnergyConservation(fs);
139 if(!success) {
140 INCL_DEBUG("Enforcing energy conservation: failed!" << '\n');
141
142 if(theNucleus) {
143 // Restore the state of the initial particles
145
146 // Delete newly created particles
147 for(ParticleIter i=created.begin(), e=created.end(); i!=e; ++i )
148 delete *i;
149
150 fs->reset();
153
154 return; // Interaction is blocked. Return an empty final state.
155 } else {
156 // If there is no nucleus we have to continue anyway, even if energy
157 // conservation failed. We cannot afford producing unphysical
158 // remnants.
159 INCL_DEBUG("No nucleus, continuing anyway." << '\n');
160 }
161 } else {
162 INCL_DEBUG("Enforcing energy conservation: success!" << '\n');
163 }
164
165 if(theNucleus) {
166 // Test CDPP blocking
168
169 if(isCDPPBlocked) {
170 INCL_DEBUG("CDPP: Blocked!" << '\n');
171
172 // Restore the state of both particles
174
175 // Delete newly created particles
176 for(ParticleIter i=created.begin(), e=created.end(); i!=e; ++i )
177 delete *i;
178
179 fs->reset();
180 fs->makePauliBlocked();
182
183 return; // Interaction is blocked. Return an empty final state.
184 }
185 INCL_DEBUG("CDPP: Allowed!" << '\n');
186
187 }
188 }
189 // If there is a nucleus, increment the counters
190 if(theNucleus) {
191 switch(fs->getValidity()) {
192 case PauliBlockedFS:
194 break;
198 break;
199 case ValidFS:
201 }
202 }
203
204 return;
205 }
206
207 std::string DecayAvatar::dump() const {
208 std::stringstream ss;
209 ss << "(avatar " << theTime << " 'decay" << '\n'
210 << "(list " << '\n'
211 << particle1->dump()
212 << "))" << '\n';
213 return ss.str();
214 }
215}
#define INCL_DEBUG(x)
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
void incrementAcceptedDecays()
Definition: G4INCLBook.hh:74
void incrementBlockedDecays()
Definition: G4INCLBook.hh:75
ThreeVector const incidentDirection
std::string dump() const
virtual void postInteraction(FinalState *fs)
DecayAvatar(G4INCL::Particle *aParticle, G4double time, G4INCL::Nucleus *aNucleus, G4bool force=false)
virtual void preInteraction()
void addModifiedParticle(Particle *p)
ParticleList const & getModifiedParticles() const
void setTotalEnergyBeforeInteraction(G4double E)
FinalStateValidity getValidity() const
ParticleList const & getDestroyedParticles() const
ParticleList const & getCreatedParticles() const
void setType(AvatarType t)
void restoreParticles() const
Restore the state of both particles.
G4bool enforceEnergyConservation(FinalState *const fs)
Enforce energy conservation.
Store * getStore() const
std::vector< G4int > getParticleListBiasVector() const
G4bool isOmega() const
Is this an omega?
std::string dump() const
G4bool isSigma() const
Is this a Sigma?
G4bool isEta() const
Is this an eta?
G4bool isAntiKaon() const
Is this an antiKaon?
G4INCL::ParticleType getType() const
G4bool isDelta() const
Is it a Delta?
G4bool isNucleon() const
Book & getBook()
Definition: G4INCLStore.hh:259
G4bool isCDPPBlocked(ParticleList const &p, Nucleus const *const n)
Check CDPP blocking.
ParticleList::const_iterator ParticleIter
@ DecayAvatarType
@ ParticleBelowZeroFS
@ NoEnergyConservationFS
@ ParticleBelowFermiFS