Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4INCLDecayAvatar.cc
이 파일의 문서화 페이지로 가기
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 
45 #include "G4INCLPauliBlocking.hh"
46 #include <sstream>
47 #include <string>
48 // #include <cassert>
49 
50 namespace 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;
197  case ParticleBelowZeroFS:
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 }
ParticleList::const_iterator ParticleIter
void incrementAcceptedDecays()
Definition: G4INCLBook.hh:74
ThreeVector const incidentDirection
void addModifiedParticle(Particle *p)
std::string dump() const
void setType(AvatarType t)
G4bool enforceEnergyConservation(FinalState *const fs)
Enforce energy conservation.
G4bool isOmega() const
Is this an omega?
FinalStateValidity getValidity() const
Book & getBook()
Definition: G4INCLStore.hh:259
G4bool isSigma() const
Is this a Sigma?
G4bool isCDPPBlocked(ParticleList const &p, Nucleus const *const n)
Check CDPP blocking.
#define INCL_DEBUG(x)
void incrementBlockedDecays()
Definition: G4INCLBook.hh:75
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
G4bool isDelta() const
Is it a Delta?
void setTotalEnergyBeforeInteraction(G4double E)
ParticleList const & getModifiedParticles() const
DecayAvatar(G4INCL::Particle *aParticle, G4double time, G4INCL::Nucleus *aNucleus, G4bool force=false)
ParticleList const & getDestroyedParticles() const
std::string dump() const
virtual void preInteraction()
G4INCL::ParticleType getType() const
G4bool isEta() const
Is this an eta?
G4bool isAntiKaon() const
Is this an antiKaon?
Char_t n[5]
G4bool isNucleon() const
void restoreParticles() const
Restore the state of both particles.
ParticleList const & getCreatedParticles() const
Store * getStore() const
std::vector< G4int > getParticleListBiasVector() const
virtual void postInteraction(FinalState *fs)