132 #include "G4Track.hh" 149 maximumTries(20), numberOfTries(0),
174 outFile <<
"The Bertini-style cascade implements the inelastic scattering\n" 175 <<
"of hadrons by nuclei. Nucleons, pions, kaons and hyperons\n" 176 <<
"from 0 to 15 GeV may be used as projectiles in this model.\n" 177 <<
"Final state hadrons are produced by a classical cascade\n" 178 <<
"consisting of individual hadron-nucleon scatterings which use\n" 179 <<
"free-space partial cross sections, corrected for various\n" 180 <<
"nuclear medium effects. The target nucleus is modeled as a\n" 181 <<
"set of 1, 3 or 6 spherical shells, in which scattered hadrons\n" 182 <<
"travel in straight lines until they are reflected from or\n" 183 <<
"transmitted through shell boundaries.\n";
203 if (!ch || !pn || !nn || !pp)
return;
251 G4cout <<
" >>> G4CascadeInterface::ApplyYourself" <<
G4endl;
254 G4cerr <<
" >>> G4CascadeInterface got negative-energy track: " 259 #ifdef G4CASCADE_DEBUG_INTERFACE 260 static G4int counter(0);
262 G4cerr <<
"Reaction number "<< counter <<
" " 356 #ifdef G4CASCADE_DEBUG_INTERFACE 360 <<
"\n " << theSecondaries->size() <<
" secondaries:" <<
G4endl;
361 for (
size_t i=0; i<theSecondaries->size(); i++) {
430 G4cout <<
" >>> G4CascadeInterface::NoInteraction" <<
G4endl;
446 G4int bulletType = 0;
447 G4int bulletA = 0, bulletZ = 0;
456 if (0 == bulletType && 0 == bulletA*bulletZ) {
459 <<
" not usable as bullet." <<
G4endl;
475 projectileMomentum.
e());
523 G4cerr <<
" ERROR: G4CascadeInterface incompatible particle type " 524 << outgoingType <<
G4endl;
559 G4cout <<
" >>> G4CascadeInterface::copyOutputToHadronicResult" <<
G4endl;
568 if (!particles.empty()) {
570 for (; ipart != particles.end(); ipart++) {
576 if (!outgoingNuclei.empty()) {
578 for (; ifrag != outgoingNuclei.end(); ifrag++) {
586 G4cout <<
" >>> G4CascadeInterface::copyOutputToReactionProducts" <<
G4endl;
597 if (!particles.empty()) {
599 for (; ipart != particles.end(); ipart++) {
603 propResult->push_back(rp);
609 if (!fragments.empty()) {
611 for (; ifrag != fragments.end(); ifrag++) {
615 propResult->push_back(rp);
631 G4cerr <<
"ERROR: no baryon number conservation, sum of baryons = " 636 G4cerr <<
"ERROR: no charge conservation, sum of charges = " 641 G4cerr <<
"Kinetic energy conservation violated by " 648 G4cout <<
"Initial energy " << eInit <<
" final energy " << eFinal
649 <<
"\nTotal energy conservation at level " 653 G4cerr <<
"FATAL ERROR: kinetic energy created " 667 const std::vector<G4InuclElementaryParticle>& p =
672 violated |= (
ipart->getKineticEnergy() < coulumbBarrier);
682 const std::vector<G4InuclElementaryParticle>& out =
685 #ifdef G4CASCADE_DEBUG_INTERFACE 687 G4cout <<
" retryInelasticProton: number of Tries " 689 <<
"\n retryInelasticProton: AND collision type ";
692 G4cout << (out.size() == 2 ?
"ELASTIC (t)" :
"INELASTIC (f)")
693 <<
"\n retryInelasticProton: AND Leading particles bullet " 694 << (out.size() >= 2 &&
697 ?
"YES (t)" :
"NO (f)")
721 #ifdef G4CASCADE_DEBUG_INTERFACE 723 G4cout <<
" retryInelasticNucleus: numberOfTries " 725 <<
"\n retryInelasticNucleus: AND outputParticles " 726 << ((npart != 0) ?
"NON-ZERO (t)" :
"EMPTY (f)")
727 #ifdef G4CASCADE_COULOMB_DEV 728 <<
"\n retryInelasticNucleus: AND coulombBarrier (COULOMB_DEV) " 730 <<
"\n retryInelasticNucleus: AND collision type (COULOMB_DEV) " 731 << ((npart+nfrag > 2) ?
"INELASTIC (t)" :
"ELASTIC (f)")
733 <<
"\n retryInelasticNucleus: AND collsion type " 734 << ((npart+nfrag < 3) ?
"ELASTIC (t)" :
"INELASTIC (f)")
735 <<
"\n retryInelasticNucleus: AND Leading particle bullet " 738 <<
"\n retryInelasticNucleus: OR conservation " 739 << (!
balance->
okay() ?
"FAILED (t)" :
"PASSED (f)")
745 #ifdef G4CASCADE_COULOMB_DEV
748 (npart+nfrag < 3 && firstOut == bullet->getDefinition())
751 #ifndef G4CASCADE_SKIP_ECONS 765 std::ostream& errInfo =
G4cerr;
767 errInfo <<
" >>> G4CascadeInterface has non-conserving" 770 G4String throwMsg =
"G4CascadeInterface - ";
772 throwMsg +=
"Energy";
773 errInfo <<
" Energy conservation violated by " <<
balance->
deltaE()
778 throwMsg +=
"Momentum";
779 errInfo <<
" Momentum conservation violated by " <<
balance->
deltaP()
784 throwMsg +=
"Baryon number";
789 throwMsg +=
"Charge";
790 errInfo <<
" Charge conservation violated by " <<
balance->
deltaQ()
794 errInfo <<
" Final event output, for debugging:\n" 795 <<
" Bullet: \n" << *
bullet << G4endl
799 throwMsg +=
" non-conservation. More info in output.";
G4LorentzVector getMomentum() const
void useCascadeDeexcitation()
const G4ParticleDefinition * GetDefinition() const
void fill(G4int a, G4int z, G4double exc=0., Model model=DefaultModel)
void rescatter(G4InuclParticle *bullet, G4KineticTrackVector *theSecondaries, G4V3DNucleus *theNucleus, G4CollisionOutput &globalOutput)
void setVerboseLevel(G4int verbose)
const G4String randomFile
G4bool chargeOkay() const
G4CascadeInterface(const G4String &name="BertiniCascade")
const G4ThreeVector & GetPosition() const
static const G4CascadeChannel * GetTable(G4int initialState)
G4InuclNuclei nucleusTarget
G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &theNucleus)
virtual G4int GetCharge()=0
G4CascadeCheckBalance * balance
const G4LorentzVector & Get4Momentum() const
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &output)
virtual G4int GetMassNumber()=0
G4double GetFormationTime() const
G4CollisionOutput * output
G4bool retryInelasticNucleus() const
G4int numberOfOutgoingNuclei() const
virtual void ModelDescription(std::ostream &outFile) const
G4LorentzRotation bulletInLabFrame
virtual void DumpConfiguration(std::ostream &outFile) const
const char * name(G4int ptype)
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const
const G4DynamicParticle & getDynamicParticle() const
void setLimits(G4double relative, G4double absolute)
static G4Diproton * Definition()
const G4HadProjectile * GetPrimaryProjectile() const
HepLorentzRotation & rotateY(double delta)
virtual void setVerboseLevel(G4int verbose=0)
G4double relativeP() const
void SetStatusChange(G4HadFinalStateStatus aS)
std::vector< G4ReactionProduct * > G4ReactionProductVector
void useCascadeDeexcitation()
void copyOutputToHadronicResult()
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
ParticleList decay(Cluster *const c)
Carries out a cluster decay.
std::vector< G4InuclElementaryParticle >::const_iterator particleIterator
G4ReactionProductVector * Propagate(G4KineticTrackVector *theSecondaries, G4V3DNucleus *theNucleus)
G4bool energyOkay() const
G4InuclNuclei nucleusBullet
void setVerboseLevel(G4int verbose=0)
G4bool createTarget(G4Nucleus &theNucleus)
G4bool momentumOkay() const
void collide(G4InuclParticle *bullet, G4InuclParticle *target, G4CollisionOutput &globalOutput)
G4ReactionProductVector * copyOutputToReactionProducts()
static const double perCent
void rotateEvent(const G4LorentzRotation &rotate)
static G4KaonZeroLong * Definition()
HepLorentzRotation & rotateZ(double delta)
HepLorentzRotation & invert()
static G4Dineutron * Definition()
const G4ParticleDefinition * GetDefinition() const
G4bool quasi_deutron() const
G4int GetAtomicNumber() const
void SetEnergyChange(G4double anEnergy)
void usePreCompoundDeexcitation()
G4double GetKineticEnergy() const
G4double getKineticEnergy() const
G4int numberOfOutgoingParticles() const
static void saveEngineStatus(const char filename[]="Config.conf")
static G4KaonZeroShort * Definition()
cout<< "-> Edep in the target
G4InuclElementaryParticle hadronBullet
virtual void SetVerboseLevel(G4int value)
void fill(G4int ityp, Model model=DefaultModel)
std::vector< G4InuclNuclei >::const_iterator nucleiIterator
G4HadFinalState theParticleChange
std::vector< G4InuclElementaryParticle >::iterator particleIterator
void throwNonConservationFailure()
G4double relativeE() const
static DLL_API const HepLorentzRotation IDENTITY
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
G4InuclElementaryParticle hadronTarget
G4bool baryonOkay() const
G4InuclCollider * collider
G4bool createBullet(const G4HadProjectile &aTrack)
void SetVerboseLevel(G4int verbose)
const std::vector< G4InuclNuclei > & getOutgoingNuclei() const
const G4ParticleDefinition * getDefinition() const
void SetEnergyMomentumCheckLevels(G4double relativeLevel, G4double absoluteLevel)
G4DynamicParticle * makeDynamicParticle(const G4InuclElementaryParticle &iep) const
G4int GetAtomicMass() const
void usePreCompoundDeexcitation()
void printCollisionOutput(std::ostream &os=G4cout) const
static void DumpConfiguration(std::ostream &os)
G4double getEnergy() const
static G4UnboundPN * Definition()
G4GLOB_DLL std::ostream G4cerr
G4bool IsApplicable(const G4HadProjectile &aTrack, G4Nucleus &theNucleus)
G4bool coulombBarrierViolation() const
virtual ~G4CascadeInterface()
G4HadFinalState * NoInteraction(const G4HadProjectile &aTrack, G4Nucleus &theNucleus)
const G4LorentzVector & Get4Momentum() const
static G4bool usePreCompound()
G4bool retryInelasticProton() const