Files
geant4/source/processes/hadronic/models/inclxx/incl_physics/include/G4INCLInteractionAvatar.hh
2025-12-05 08:54:02 +01:00

250 lines
9.5 KiB
C++

//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// INCL++ intra-nuclear cascade model
// Alain Boudard, CEA-Saclay, France
// Joseph Cugnon, University of Liege, Belgium
// Jean-Christophe David, CEA-Saclay, France
// Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland
// Sylvie Leray, CEA-Saclay, France
// Davide Mancusi, CEA-Saclay, France
//
#define INCLXX_IN_GEANT4_MODE 1
#include "globals.hh"
/* \file G4INCLInteractionAvatar.hh
* \brief Virtual class for interaction avatars.
*
* This class is inherited by decay and collision avatars. The goal is to
* provide a uniform treatment of common physics, such as Pauli blocking,
* enforcement of energy conservation, etc.
*
* \date Mar 1st, 2011
* \author Davide Mancusi
*/
#ifndef G4INCLINTERACTIONAVATAR_HH_
#define G4INCLINTERACTIONAVATAR_HH_
#include "G4INCLIAvatar.hh"
#include "G4INCLNucleus.hh"
#include "G4INCLFinalState.hh"
#include "G4INCLRootFinder.hh"
#include "G4INCLKinematicsUtils.hh"
#include "G4INCLAllocationPool.hh"
namespace G4INCL {
class InteractionAvatar : public G4INCL::IAvatar {
public:
InteractionAvatar(G4double, G4INCL::Nucleus*, G4INCL::Particle*);
InteractionAvatar(G4double, G4INCL::Nucleus*, G4INCL::Particle*, G4INCL::Particle*);
virtual ~InteractionAvatar();
/// \brief Target accuracy in the determination of the local-energy Q-value
static const G4double locEAccuracy;
/// \brief Max number of iterations for the determination of the local-energy Q-value
static const G4int maxIterLocE;
/// \brief Release the memory allocated for the backup particles
static void deleteBackupParticles();
/**
* static instance
*/
static InteractionAvatar* Instance();
void setSrcPartner(Particle *p /*, const ThreeVector m*/);
/** \brief Apply local-energy transformation, if appropriate
*
* \param p particle to apply the transformation to
*/
void preInteractionLocalEnergy(Particle * const p);
ThreeVector getboostVector(){return boostVector;}
void setboostVector(ThreeVector& v){boostVector = v;}
protected:
virtual G4INCL::IChannel* getChannel() = 0;
G4bool bringParticleInside(Particle * const p);
EventInfo theEventInfo;
/** \brief Store the state of the particles before the interaction
*
* If the interaction cannot be realised for any reason, we will need to
* restore the particle state as it was before. This is done by calling
* the restoreParticles() method.
*/
void preInteractionBlocking();
void preInteraction();
void postInteraction(FinalState *);
/** \brief Restore the state of both particles.
*
* The state must first be stored by calling preInteractionBlocking().
*/
void restoreParticles() const;
void restoreSrcPartner(FinalState * fs);
/// \brief true if the given avatar should use local energy
G4bool shouldUseLocalEnergy() const;
Nucleus *theNucleus;
Particle *particle1, *particle2;
static G4ThreadLocal Particle *backupParticle1, *backupParticle2;
ThreeVector boostVector;
G4double oldTotalEnergy, oldXSec;
G4bool isPiN;
G4double weight;
private:
static G4ThreadLocal InteractionAvatar* interactionAvatar;
static G4ThreadLocal Particle *backupPartner;
static ThreeVector mbackupPartner;
/// \brief RootFunctor-derived object for enforcing energy conservation in N-N.
class ViolationEMomentumFunctor : public RootFunctor {
public:
/** \brief Prepare for calling the () operator and scaleParticleMomenta
*
* The constructor sets the private class members.
*/
ViolationEMomentumFunctor(Nucleus * const nucleus, ParticleList const &modAndCre, const G4double totalEnergyBeforeInteraction, ThreeVector const &boost, const G4bool localE);
virtual ~ViolationEMomentumFunctor();
/** \brief Compute the energy-conservation violation.
*
* \param x scale factor for the particle momenta
* \return the energy-conservation violation
*/
G4double operator()(const G4double x) const;
/// \brief Clean up after root finding
void cleanUp(const G4bool success) const;
private:
/// \brief List of final-state particles.
ParticleList finalParticles;
/// \brief CM particle momenta, as determined by the channel.
std::vector<ThreeVector> particleMomenta;
/// \brief Total energy before the interaction.
G4double initialEnergy;
/// \brief Pointer to the nucleus
Nucleus *theNucleus;
/// \brief Pointer to the boost vector
ThreeVector const &boostVector;
/// \brief True if we should use local energy
const G4bool shouldUseLocalEnergy;
/** \brief Scale the momenta of the modified and created particles.
*
* Set the momenta of the modified and created particles to alpha times
* their original momenta (stored in particleMomenta). You must call
* init() before using this method.
*
* \param alpha scale factor
*/
void scaleParticleMomenta(const G4double alpha) const;
};
/// \brief RootFunctor-derived object for enforcing energy conservation in delta production
class ViolationEEnergyFunctor : public RootFunctor {
public:
/** \brief Prepare for calling the () operator and setParticleEnergy
*
* The constructor sets the private class members.
*/
ViolationEEnergyFunctor(Nucleus * const nucleus, Particle * const aParticle, const G4double totalEnergyBeforeInteraction, const G4bool localE);
virtual ~ViolationEEnergyFunctor() {}
/** \brief Compute the energy-conservation violation.
*
* \param x scale factor for the particle energy
* \return the energy-conservation violation
*/
G4double operator()(const G4double x) const;
/// \brief Clean up after root finding
void cleanUp(const G4bool success) const;
/** \brief Set the energy of the particle.
*
* \param energy
*/
void setParticleEnergy(const G4double energy) const;
private:
/// \brief Total energy before the interaction.
G4double initialEnergy;
/// \brief Pointer to the nucleus.
Nucleus *theNucleus;
/// \brief The final-state particle.
Particle *theParticle;
/// \brief The initial energy of the particle.
G4double theEnergy;
/// \brief The initial momentum of the particle.
ThreeVector theMomentum;
/** \brief Threshold for the energy of the particle
*
* The particle (a delta) cannot have less than this energy.
*/
G4double energyThreshold;
/// \brief Whether we should use local energy
const G4bool shouldUseLocalEnergy;
};
RootFunctor *violationEFunctor;
protected:
/** \brief Enforce energy conservation.
*
* Final states generated by the channels might violate energy conservation
* because of different reasons (energy-dependent potentials, local
* energy...). This conservation law must therefore be enforced by hand. We
* do so by rescaling the momenta of the final-state particles in the CM
* frame. If this turns out to be impossible, this method returns false.
*
* \return true if the algorithm succeeded
*/
G4bool enforceEnergyConservation(FinalState * const fs);
ParticleList modified, created, modifiedAndCreated, Destroyed, ModifiedAndDestroyed;
INCL_DECLARE_ALLOCATION_POOL(InteractionAvatar)
};
}
#endif /* G4INCLINTERACTIONAVATAR_HH_ */