Import Geant4 4.0.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-08 16:18:25 +02:00
parent 36c080dca6
commit 921d3b1cda
3990 changed files with 185376 additions and 82884 deletions
+11 -1
View File
@@ -1,4 +1,4 @@
# $Id: GNUmakefile,v 1.5 2000/06/27 15:24:19 gcosmo Exp $
# $Id: GNUmakefile,v 1.8 2001/11/16 14:19:19 hpw Exp $
# --------------------------------------------------------------
# GNUmakefile for hadronic models library. G.Folger 10-Dec-97
# --------------------------------------------------------------
@@ -20,12 +20,22 @@ SUBDIRS += generator/string_common
SUBDIRS += generator/string_fragmentation
SUBDIRS += generator/util
SUBDIRS += radiative_decay
SUBDIRS += chiral_inv_phase_space/body
SUBDIRS += chiral_inv_phase_space/interface
SUBDIRS += coherent_elastic
SUBDIRS += cascade/evaporation
SUBDIRS += cascade/utils
SUBLIBS = G4hadronic_HE G4hadronic_LE G4hadronic_neu G4hadronic_iso
SUBLIBS += G4hadronic_deex G4hadronic_diffstring G4hadronic_HE_gen G4hadronic_kinetic
SUBLIBS += G4hadronic_man_gen G4hadronic_preequ G4hadronic_radioactivedecay
SUBLIBS += G4hadronic_qgstring G4hadronic_string_common
SUBLIBS += G4hadronic_stringfrag G4hadronic_util_gen
SUBLIBS += G4hadronic_body_ci
SUBLIBS += G4hadronic_interface_ci
SUBLIBS += G4hadronic_coherent_elastic
SUBLIBS += G4hadronic_hetcpp_evaporation
SUBLIBS += G4hadronic_hetcpp_utils
ifndef G4INSTALL
G4INSTALL = ../../../..
@@ -0,0 +1,18 @@
# --------------------------------------------------------------
# GNUmakefile for chips library. HPW 20-Nov-99
# --------------------------------------------------------------
name := G4hadronic_hetcpp
SUBDIRS = evaporation
SUBDIRS += utils
SUBLIBS = G4hadronic_hetcpp_evaporation
SUBLIBS += G4hadronic_hetcpp_utils
ifndef G4INSTALL
G4INSTALL = ../../../../..
endif
include $(G4INSTALL)/config/globlib.gmk
@@ -0,0 +1,36 @@
# $Id: GNUmakefile,v 1.5 2001/11/16 14:22:18 hpw Exp $
# -----------------------------------------------------------
# GNUmakefile for hadronic library. Gabriele Cosmo, 18/9/96.
# -----------------------------------------------------------
name := G4hadronic_hetcpp_evaporation
ifndef G4INSTALL
G4INSTALL = ../../../../../..
endif
include $(G4INSTALL)/config/architecture.gmk
CPPFLAGS += -I$(G4BASE)/global/management/include \
-I$(G4BASE)/global/HEPRandom/include \
-I$(G4BASE)/global/HEPGeometry/include \
-I$(G4BASE)/track/include \
-I$(G4BASE)/geometry/volumes/include \
-I$(G4BASE)/geometry/management/include \
-I$(G4BASE)/processes/management/include \
-I$(G4BASE)/processes/hadronic/management/include/ \
-I$(G4BASE)/processes/hadronic/util/include \
-I$(G4BASE)/processes/hadronic/cross_sections/include/ \
-I$(G4BASE)/processes/hadronic/models/generator/management/include/ \
-I$(G4BASE)/processes/hadronic/models/generator/util/include/ \
-I$(G4BASE)/processes/hadronic/models/generator/de_excitation/include/ \
-I$(G4BASE)/processes/hadronic/models/cascade/utils/include \
-I$(G4BASE)/particles/management/include \
-I$(G4BASE)/particles/leptons/include \
-I$(G4BASE)/particles/bosons/include \
-I$(G4BASE)/particles/hadrons/mesons/include \
-I$(G4BASE)/particles/hadrons/barions/include \
-I$(G4BASE)/particles/hadrons/ions/include \
-I$(G4BASE)/materials/include
include $(G4INSTALL)/config/common.gmk
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,55 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BEChargedChannel_h
#define G4BEChargedChannel_h 1
#include "globals.hh"
#include "G4BertiniEvaporationChannel.hh"
#include "Randomize.hh"
class G4BEChargedChannel : public G4BertiniEvaporationChannel
{
public:
G4BEChargedChannel();
virtual ~G4BEChargedChannel();
virtual void calculateProbability();
virtual G4DynamicParticle * emit() = 0;
virtual G4double coulombFactor() = 0;
G4double coulombFactorForProton();
G4double qmFactorForProton();
G4double qmFactorForAlpha();
G4double sampleKineticEnergy();
protected:
G4double A;
G4double spin;
};
#endif
@@ -0,0 +1,48 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BEDeuteronChannel_h
#define G4BEDeuteronChannel_h 1
#include "G4BEChargedChannel.hh"
class G4BEDeuteronChannel : public G4BEChargedChannel
{
public:
G4BEDeuteronChannel();
virtual ~G4BEDeuteronChannel();
G4DynamicParticle * emit();
G4double constant();
virtual G4double coulombFactor();
virtual G4double qmFactor( );
private:
};
#endif
@@ -0,0 +1,59 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BEGammaDeexcitation_h
#define G4BEGammaDeexcitation_h 1
#include "globals.hh"
class G4BEGammaDeexcitation
{
public:
G4BEGammaDeexcitation();
virtual ~G4BEGammaDeexcitation();
void setVerboseLevel( G4int verbose );
void setNucleusA( G4int inputA );
void setNucleusZ( G4int inputZ );
void setExcitationEnergy( G4double inputE );
G4DynamicParticle * emit();
private:
G4double sampleKineticEnergy();
G4int verboseLevel;
G4int nucleusA;
G4int nucleusZ;
G4double excitationEnergy;
void isotropicCosines( G4double&,
G4double&,
G4double& );
};
#endif
@@ -0,0 +1,48 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BEHe3Channel_h
#define G4BEHe3Channel_h 1
#include "G4BEChargedChannel.hh"
class G4BEHe3Channel : public G4BEChargedChannel
{
public:
G4BEHe3Channel();
virtual ~G4BEHe3Channel();
G4DynamicParticle * emit();
G4double constant();
virtual G4double coulombFactor();
virtual G4double qmFactor( );
private:
};
#endif
@@ -0,0 +1,48 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BEHe4Channel_h
#define G4BEHe4Channel_h 1
#include "G4BEChargedChannel.hh"
class G4BEHe4Channel : public G4BEChargedChannel
{
public:
G4BEHe4Channel();
virtual ~G4BEHe4Channel();
G4DynamicParticle * emit();
G4double constant();
virtual G4double coulombFactor();
virtual G4double qmFactor( );
private:
};
#endif
@@ -0,0 +1,50 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BENeutronChannel_h
#define G4BENeutronChannel_h 1
#include "globals.hh"
#include "G4BertiniEvaporationChannel.hh"
class G4BENeutronChannel : public G4BertiniEvaporationChannel
{
public:
G4BENeutronChannel();
virtual ~G4BENeutronChannel();
virtual void calculateProbability();
G4DynamicParticle * emit();
G4double sampleKineticEnergy();
private:
G4double alpha();
G4double beta();
};
#endif
@@ -0,0 +1,48 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, 30-May-2000
#ifndef G4BEProtonChannel_h
#define G4BEProtonChannel_h 1
#include "G4BEChargedChannel.hh"
class G4BEProtonChannel : public G4BEChargedChannel
{
public:
G4BEProtonChannel();
virtual ~G4BEProtonChannel();
G4DynamicParticle * emit();
G4double constant();
virtual G4double coulombFactor();
virtual G4double qmFactor( );
private:
};
#endif
@@ -0,0 +1,48 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BETritonChannel_h
#define G4BETritonChannel_h 1
#include "G4BEChargedChannel.hh"
class G4BETritonChannel : public G4BEChargedChannel
{
public:
G4BETritonChannel();
virtual ~G4BETritonChannel();
G4DynamicParticle * emit();
G4double constant();
virtual G4double coulombFactor();
virtual G4double qmFactor( );
private:
};
#endif
@@ -0,0 +1,65 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BertiniEvaporation_h
#define G4BertiniEvaporation_h 1
#include "globals.hh"
#include "G4LayeredNucleus.hh"
#include "G4BertiniEvaporationChannel.hh"
#include "G4ParticleChange.hh"
#include "G4VEvaporation.hh"
class G4BertiniEvaporation : public G4VEvaporation
{
public:
G4BertiniEvaporation();
~G4BertiniEvaporation();
virtual G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)
{
G4LayeredNucleus aNuc( theNucleus.GetA(), theNucleus.GetZ() );
aNuc.AddExcitationEnergy(theNucleus.GetExcitationEnergy());
return BreakItUp(aNuc);
}
G4FragmentVector * BreakItUp( G4LayeredNucleus & nucleus);
void setVerboseLevel( const G4int verbose );
private:
G4int verboseLevel;
G4std::vector< G4BertiniEvaporationChannel * > channelVector;
void fillResult( G4std::vector< G4DynamicParticle * > secondaryParticleVector,
G4FragmentVector * aResult );
void splitBe8( const G4double E,
const G4ThreeVector boost,
G4std::vector< G4DynamicParticle * > & secondaryParticleVector);
void isotropicCosines( G4double & u, G4double & v,G4double & w );
};
#endif
@@ -0,0 +1,88 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#ifndef G4BertiniEvaporationChannel_h
#define G4BertiniEvaporationChannel_h 1
#include "globals.hh"
#include "G4DynamicParticle.hh"
#include "G4NucleiProperties.hh"
class G4BertiniEvaporationChannel
{
public:
G4BertiniEvaporationChannel();
virtual ~G4BertiniEvaporationChannel();
void setVerboseLevel( G4int verbose );
void setNucleusA( G4int inputA );
void setNucleusZ( G4int inputZ );
G4int getParticleA();
G4int getParticleZ();
void setExcitationEnergy( G4double inputE );
void setQ( G4double inputQ );
void setPairingCorrection( G4int isCorrection );
G4double getLevelDensityParameter();
G4String getName();
virtual G4double getProbability() ;
virtual void setProbability( G4double newProb ) ;
virtual void calculateProbability() = 0 ;
virtual G4double qmFactor ();
virtual G4double getQ();
virtual G4double getCoulomb();
virtual G4double getThresh();
virtual G4DynamicParticle* emit() = 0;
protected:
G4String name;
G4int verboseLevel;
G4int nucleusA;
G4int nucleusZ;
G4int particleA;
G4int particleZ;
G4double exmass;
G4double emissionProbability;
G4double rho;
G4double correction;
G4double excitationEnergy;
// G4int massInNeutronMasses;
G4int spin;
G4double Q( G4double a, G4double z );
G4double pairingEnergyProtons( G4int A );
G4double pairingEnergyNeutrons( G4int N );
G4double cameron( G4double a, G4double z );
G4double cameronShellCorrectionP( G4int Z );
G4double cameronShellCorrectionN( G4int N );
void isotropicCosines( G4double&,
G4double&,
G4double& );
};
#endif
@@ -0,0 +1,202 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "G4BEChargedChannel.hh"
G4BEChargedChannel::G4BEChargedChannel()
{
verboseLevel = 0;
}
G4BEChargedChannel::~G4BEChargedChannel()
{
}
void G4BEChargedChannel::calculateProbability()
{
G4int residualZ = nucleusZ - particleZ;
G4int residualA = nucleusA - particleA;
// Check if nucleus is too small, if this evaporation channel
// leads to an impossible residual nucleus or if there is no enough
// energy.
if ( nucleusA < 2.0 * particleA ||
nucleusZ < 2.0 * particleZ ||
residualA <= residualZ ||
excitationEnergy - getThresh() - correction < 0 )
{
if ( verboseLevel >= 6 )
G4cout << "G4BEChargedChannel : calculateProbability for " << getName() << " = 0 " << G4endl;
emissionProbability = 0;
return;
}
// In HETC88 s-s0 was used in exp( s ), in which s0 was either 50 or
// max(s_i), where i goes over all channels.
G4double levelParam = getLevelDensityParameter();
G4double s = 2 * sqrt( levelParam * ( excitationEnergy - getThresh() - correction ) );
G4double constant = A / 2 * ( 2 * spin + 1 ) * ( 1 + coulombFactor() );
G4double eye1 = ( pow( s, 2 ) - 3 * s + 3 ) / ( 4 * pow( levelParam, 2 ) ) * exp( s );
emissionProbability = constant * pow( residualA, 0.6666666 ) * eye1;
if ( verboseLevel >= 6 )
G4cout << "G4BEChargedChannel : calculateProbability for " << getName() << G4endl
<< " res A = " << residualA << G4endl
<< " res Z = " << residualZ << G4endl
<< " c*(c_i+1) = "<< constant << G4endl
<< " qmfactor = "<< qmFactor() << G4endl
<< " coulombfactor = "<< coulombFactor() << G4endl
<< " E = " << excitationEnergy << G4endl
<< " correction = " << correction << G4endl
<< " eye1 = " << eye1 << G4endl
<< " levelParam = " << levelParam << G4endl
<< " thresh = " << getThresh() << G4endl
<< " s = " << s << G4endl
<< " probability = " << emissionProbability << G4endl;
return;
}
G4double G4BEChargedChannel::sampleKineticEnergy()
{
// G4double randExp1;
// G4double randExp2;
// G4double s;
// G4double levelParam;
// G4double kineticEnergyAv;
// G4double kineticEnergy;
// randExp1 = RandExponential::shoot( 1 );
// randExp2 = RandExponential::shoot( 1 );
// levelParam = getLevelDensityParameter();
// s = 2 * sqrt( levelParam * ( excitationEnergy - getThresh() - correction ) );
// kineticEnergyAv = 2 * ( pow( s, 3 ) - 6.0 * pow( s, 2 ) + 15.0 * s - 15.0 ) /
// ( ( 2.0 * pow( s, 2 ) - 6.0 * s + 6.0 ) * levelParam );
// kineticEnergy = 0.5 * ( randExp1 + randExp2 ) * kineticEnergyAv + getThresh() - getQ();
// if ( verboseLevel >= 10 )
// G4cout << " G4BEChargedChannel : sampleKineticEnergy() " << G4endl
// << " kinetic e = " << kineticEnergy << G4endl
// << " average = " << kineticEnergyAv << G4endl
// << " s = " << s << G4endl
// << " levelParam = " << levelParam << G4endl
// << " randExp1 = " << randExp1 << G4endl
// << " randExp2 = " << randExp2 << G4endl;
G4double levelParam;
levelParam = getLevelDensityParameter();
const G4double xMax = excitationEnergy - getThresh() - correction; // maximum number
const G4double xProb = ( - 1 + sqrt ( 1 + 4 * levelParam * xMax ) ) / ( 2 * levelParam ); // most probable value
const G4double m = xProb * exp ( 2 * sqrt ( levelParam * ( xMax - xProb ) ) ); // maximum value of P(x)
// Sample x according to density function P(x) with rejection method
G4double r1;
G4double r2;
G4int koe=0;
do
{
r1 = G4UniformRand() * xMax;
r2 = G4UniformRand() * m;
koe++;
}
while ( r1 * exp ( 2 * sqrt ( levelParam * ( xMax - r1 ) ) ) < r2 );
// G4cout << "Q ch " << koe << G4endl;
G4double kineticEnergy = r1 + getCoulomb(); // add coulomb potential;
if ( verboseLevel >= 10 )
G4cout << " G4BENeutronChannel : sampleKineticEnergy() " << G4endl
<< " kinetic n e = " << kineticEnergy << G4endl
<< " levelParam = " << levelParam << G4endl
<< " thresh= " << getThresh() << G4endl;
return kineticEnergy;
}
G4double G4BEChargedChannel::coulombFactorForProton()
{
// Coefficient c_p:s for empirical cross section formula are
// defined with the proton constant. See Dostrovsky, Phys. Rev.,
// vol. 116, 1959.
G4double t[7] = { 0.08 , 0 , -0.06 , -0.1 , -0.1 , -0.1 , -0.1 };
G4int Z = nucleusZ - particleZ;
if ( Z >= 70.0 ) return t[6];
if ( Z <= 10.0 ) return t[0];
// Linear interpolation
G4int n = G4int( 0.1 * Z + 1.0 );
G4float x = ( 10 * n - Z ) * 0.1;
G4double ret_val = x * t[n - 2] + ( 1.0 - x ) * t[n-1];
return ret_val;
}
G4double G4BEChargedChannel::qmFactorForProton()
{
// Coefficient k_p for empirical cross section formula are defined
// with the proton constant. See Dostrovsky, Phys. Rev., vol. 116,
// 1959
G4double t[7] = { 0.36, 0.51, 0.60, 0.66, 0.68, 0.69, 0.69 };
G4int Z = nucleusZ - particleZ;
if ( Z >= 70.0 ) return t[6];
if ( Z <= 10.0 ) return t[0];
// Linear interpolation
G4int n = G4int( 0.1 * Z + 1.0 );
G4float x = ( 10 * n - Z ) * 0.1;
return x * t[n - 2] + ( 1.0 - x ) * t[n-1];
}
G4double G4BEChargedChannel::qmFactorForAlpha()
{
// Coefficient k_alpha for empirical cross section formula presented
// in Dostrovsky, Phys. Rev., vol. 116, 1959
G4double t[7] = { 0.77, 0.81, 0.85, 0.89, 0.93, 0.97, 1.00 };
G4int Z = nucleusZ - particleZ;
if ( Z >= 70.0 ) return t[6];
if ( Z <= 10.0 ) return t[0];
// Linear interpolation
G4int n = G4int( 0.1 * Z + 1.0 );
G4float x = ( 10 * n - Z ) * 0.1;
return x * t[n - 2] + ( 1.0 - x ) * t[n-1];
}
@@ -0,0 +1,76 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "G4BEDeuteronChannel.hh"
#include "G4Deuteron.hh"
G4BEDeuteronChannel::G4BEDeuteronChannel()
{
name = "deuteron";
verboseLevel = 0;
particleA = 2;
particleZ = 1;
rho = 0.70588;
exmass = G4NucleiProperties::GetMassExcess( particleA, particleZ );
A=2;
spin = 1;
}
G4BEDeuteronChannel::~G4BEDeuteronChannel()
{
}
G4DynamicParticle* G4BEDeuteronChannel::emit()
{
G4double u, v, w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4Deuteron::Deuteron() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u, v, w );
pParticle -> SetMomentumDirection( u, v, w );
return pParticle;
}
G4double G4BEDeuteronChannel::coulombFactor()
{
// Coefficient c_i representing the variation of charged-particle
// capture cross sections with Z for each particle. See Dostrovsky,
// Phys. Rev. 116, 1959.
return 0.5 * coulombFactorForProton();
}
G4double G4BEDeuteronChannel::qmFactor()
{
// Coefficient k_i representing the quantum mechanical barrier
// penetration, see Dostrovsky, Phys. Rev. 116, 1959.
return qmFactorForProton() + 0.06;
}
@@ -0,0 +1,107 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "globals.hh"
#include "G4ios.hh"
#include "Randomize.hh"
#include "G4Neutron.hh"
#include "G4Proton.hh"
#include "G4Deuteron.hh"
#include "G4Triton.hh"
#include "G4Alpha.hh"
#include "G4Nucleus.hh"
#include "G4BEGammaDeexcitation.hh"
G4BEGammaDeexcitation::G4BEGammaDeexcitation()
{
}
G4BEGammaDeexcitation::~G4BEGammaDeexcitation()
{
}
void G4BEGammaDeexcitation::setVerboseLevel( G4int level )
{
verboseLevel = level ;
}
void G4BEGammaDeexcitation::setNucleusA( G4int a )
{
nucleusA = a;
}
void G4BEGammaDeexcitation::setNucleusZ( G4int z )
{
nucleusZ = z;
}
void G4BEGammaDeexcitation::setExcitationEnergy( G4double energy )
{
excitationEnergy = energy;
}
G4double G4BEGammaDeexcitation::sampleKineticEnergy()
{
return excitationEnergy * G4UniformRand();
}
G4DynamicParticle * G4BEGammaDeexcitation::emit()
{
// Isotropic distribution assumed to gammas
G4double u, v, w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4Gamma::Gamma() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u, v, w );
pParticle -> SetMomentumDirection( u, v, w );
return pParticle;
}
void G4BEGammaDeexcitation::isotropicCosines( G4double & u,
G4double & v,
G4double & w )
{
// Samples isotropic random direction cosines.
G4double CosTheta = 1.0 - 2.0 * G4UniformRand();
G4double SinTheta = sqrt( 1.0 - CosTheta * CosTheta );
G4double Phi = twopi * G4UniformRand();
u = cos( Phi ) * SinTheta;
v = cos( Phi ) * CosTheta,
w = sin( Phi );
return;
}
@@ -0,0 +1,71 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "G4BEHe3Channel.hh"
#include "G4He3.hh"
G4BEHe3Channel::G4BEHe3Channel()
{
name = "He3";
verboseLevel = 0;
particleA = 3;
particleZ = 2;
rho = 0.70588;
A=3;
spin = 0.5;
}
G4BEHe3Channel::~G4BEHe3Channel()
{
}
G4DynamicParticle* G4BEHe3Channel::emit()
{
G4double u , v , w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4He3::He3() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u, v, w);
pParticle -> SetMomentumDirection( u, v, w);
return pParticle;
}
G4double G4BEHe3Channel::coulombFactor()
{
return 0;
}
G4double G4BEHe3Channel::qmFactor()
{
// Coefficient representing the quantum mechanical barrier
// penetration, see Dostrovsky, Phys. Rev. 116, 1959.
return qmFactorForAlpha() - 0.06;
}
@@ -0,0 +1,71 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "G4BEHe4Channel.hh"
#include "G4Alpha.hh"
G4BEHe4Channel::G4BEHe4Channel()
{
name = "He4";
verboseLevel = 0;
particleA = 4;
particleZ = 2;
rho = 0.70588;
A=4;
spin = 0;
}
G4BEHe4Channel::~G4BEHe4Channel()
{
}
G4DynamicParticle * G4BEHe4Channel::emit()
{
G4double u , v , w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4Alpha::Alpha() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u , v , w );
pParticle -> SetMomentumDirection( u , v , w );
return pParticle;
}
G4double G4BEHe4Channel::coulombFactor()
{
return 0;
}
G4double G4BEHe4Channel::qmFactor()
{
// Coefficient representing the quantum mechanical barrier
// penetration, see Dostrovsky, Phys. Rev. 116, 1959.
return qmFactorForAlpha();
}
@@ -0,0 +1,201 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "globals.hh"
#include "G4ios.hh"
#include "Randomize.hh"
#include "G4Neutron.hh"
#include "G4Proton.hh"
#include "G4Deuteron.hh"
#include "G4Triton.hh"
#include "G4Alpha.hh"
#include "G4ParticleTable.hh"
#include "G4Nucleus.hh"
#include "G4BENeutronChannel.hh"
G4BENeutronChannel::G4BENeutronChannel()
{
name = "neutron";
particleA = 1;
particleZ = 0;
verboseLevel = 0;
rho = 0;
}
G4BENeutronChannel::~G4BENeutronChannel()
{
}
void G4BENeutronChannel::calculateProbability()
{
const G4int residualZ = nucleusZ - particleZ;
const G4int residualA = nucleusA - particleA;
if ( nucleusA < 2.0 * particleA ||
nucleusZ < 2.0 * particleZ ||
residualA <= residualZ ||
excitationEnergy - getThresh() - correction < 0 )
{
if ( verboseLevel >= 6 )
G4cout << "G4BENeutronChannel : calculateProbability = 0 " << G4endl;
emissionProbability = 0;
return;
}
// In HETC88 s-s0 was used in exp( s ), in which s0 was either 50 or
// max(s_i), where i goes over all channels.
const G4double levelParam = getLevelDensityParameter();
const G4double s = 2 * sqrt( levelParam * ( excitationEnergy - getThresh() - correction ) );
const G4double temp = ( pow( s, 2 ) - 3 * s + 3 ) / ( 4 * pow( levelParam, 2 ) )
+ beta() * ( s - 1 ) / ( 2 * levelParam );
const G4double eye0 = exp( s ) * ( s - 1 ) / ( 2 * levelParam );
const G4double eye1 = ( pow( s, 2 ) - 3*s +3 ) * exp( s ) / ( 4 * pow( levelParam, 2 ) ) ;
emissionProbability = pow( residualA, 0.666666 ) * alpha() * ( eye1 + beta() * eye0 );
if ( verboseLevel >= 6 )
G4cout << "G4BENeutronChannel : calculateProbability " << G4endl
<< " res A = " << residualA << G4endl
<< " res Z = " << residualZ << G4endl
<< " alpha = " << alpha() << G4endl
<< " beta = " << beta() << G4endl
<< " E = " << excitationEnergy << G4endl
<< " correction = " << correction << G4endl
<< " eye1 = " << eye1 << G4endl
<< " eye0 = " << eye0 << G4endl
<< " levelParam = " << levelParam << G4endl
<< " thresh = " << getThresh() << G4endl
<< " s = " << s << G4endl
<< " probability = " << emissionProbability << G4endl;
return;
}
G4double G4BENeutronChannel::sampleKineticEnergy()
{
// Samples the kinetic energy of the particle in CMS
//
// Algorithm used in HETC98
//
// G4double e1;
// G4double e2;
// G4double s;
// G4double levelParam;
// G4double eye0;
// G4double eye1;
// G4double kineticEnergyAv;
// G4double kineticEnergy;
// e1 = RandExponential::shoot( 1 );
// e2 = RandExponential::shoot( 1 );
// levelParam = getLevelDensityParameter();
// s = 2 * sqrt( levelParam * ( excitationEnergy - getThresh() - correction ) );
// eye0 = 0.5 * ( s - 1 ) * exp( s ) / levelParam;
// eye1 = ( pow( s, 2 ) - 3*s + 3 ) * exp( s ) / ( 4 * pow( levelParam, 2 ) );
// kineticEnergyAv = 2 * ( pow( s, 3 ) - 6.0 * pow( s, 2 ) + 15.0 * s - 15.0 ) /
// ( ( 2.0 * pow( s, 2 ) - 6.0 * s + 6.0 ) * levelParam );
// kineticEnergyAv = ( kineticEnergyAv + beta() ) / ( 1.0 + beta() * eye0
// / eye1 );
// kineticEnergy = 0.5 * ( e1 + e2 ) * kineticEnergyAv + getThresh() - getQ();
////////////////
// A random number is sampled from the density function
// P(x) = x * exp ( 2 sqrt ( a ( xMax - x ) ) ) [not normalized],
// x belongs to [ 0, xMax ]
// with the 'Hit or Miss' -method
// Kinetic energy is this energy scaled properly
G4double levelParam;
levelParam = getLevelDensityParameter();
const G4double xMax = excitationEnergy - getThresh() - correction + beta(); // maximum number
const G4double xProb = ( - 1 + sqrt ( 1 + 4 * levelParam * xMax ) ) / ( 2 * levelParam ); // most probable value
const G4double m = xProb * exp ( 2 * sqrt ( levelParam * ( xMax - xProb ) ) ); // maximum value of P(x)
// Sample x according to density function P(x) with rejection method
G4double r1;
G4double r2;
G4int koe=0;
do
{
r1 = beta() + G4UniformRand() * ( xMax - beta() );
r2 = G4UniformRand() * m;
koe++;
}
while ( r1 * exp ( 2 * sqrt ( levelParam * ( xMax - r1 ) ) ) < r2 );
// G4cout << koe << G4endl;
G4double kineticEnergy = r1 - beta();
if ( verboseLevel >= 10 )
G4cout << " G4BENeutronChannel : sampleKineticEnergy() " << G4endl
<< " kinetic n e = " << kineticEnergy << G4endl
<< " levelParam = " << levelParam << G4endl
<< " thresh= " << getThresh() << G4endl
<< " beta= " << beta() << G4endl;
return kineticEnergy;
}
G4DynamicParticle * G4BENeutronChannel::emit()
{
G4double u;
G4double v;
G4double w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4Neutron::Neutron() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u, v, w );
pParticle -> SetMomentumDirection( u , v , w );
return pParticle;
}
G4double G4BENeutronChannel::alpha()
{
const G4double residualA = nucleusA - particleA;
return 0.76 + 1.93 * pow( residualA, -0.33333 );
}
G4double G4BENeutronChannel::beta()
{
G4double residualA = nucleusA - particleA;
return ( 1.66 * pow ( residualA, -0.66666 ) - 0.05 )/alpha()*MeV;
}
@@ -0,0 +1,71 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, 30-May-2000
#include "G4BEProtonChannel.hh"
#include "G4Proton.hh"
G4BEProtonChannel::G4BEProtonChannel()
{
name = "proton";
verboseLevel = 0;
particleA = 1;
particleZ = 1;
rho = 0;
A=1;
spin = 0.5;
}
G4BEProtonChannel::~G4BEProtonChannel()
{
}
G4DynamicParticle* G4BEProtonChannel::emit()
{
G4double u , v , w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4Proton::Proton() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u , v , w );
pParticle -> SetMomentumDirection( u , v , w );
return pParticle;
}
G4double G4BEProtonChannel::coulombFactor()
{
return coulombFactorForProton();
}
G4double G4BEProtonChannel::qmFactor()
{
// Coefficient representing the quantum mechanical barrier
// penetration, see Dostrovsky, Phys. Rev. 116, 1959.
return qmFactorForProton();
}
@@ -0,0 +1,71 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "G4BETritonChannel.hh"
#include "G4Triton.hh"
G4BETritonChannel::G4BETritonChannel()
{
name = "triton";
verboseLevel = 0;
particleA = 3;
particleZ = 1;
rho = 0.70588;
A=3;
spin = 0.5;
}
G4BETritonChannel::~G4BETritonChannel()
{
}
G4DynamicParticle* G4BETritonChannel::emit()
{
G4double u , v , w;
G4DynamicParticle * pParticle = new G4DynamicParticle;
pParticle -> SetDefinition( G4Triton::Triton() );
pParticle -> SetKineticEnergy( sampleKineticEnergy() );
isotropicCosines( u , v , w );
pParticle -> SetMomentumDirection( u , v , w );
return pParticle;
}
G4double G4BETritonChannel::coulombFactor()
{
return 0.333333*coulombFactorForProton();
}
G4double G4BETritonChannel::qmFactor()
{
// Coefficient representing the quantum mechanical barrier
// penetration, see Dostrovsky, Phys. Rev. 116, 1959.
return qmFactorForProton() + 0.12;
}
@@ -0,0 +1,413 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "globals.hh"
#include "G4BertiniEvaporation.hh"
#include "G4BENeutronChannel.hh"
#include "G4BEProtonChannel.hh"
#include "G4BEDeuteronChannel.hh"
#include "G4BETritonChannel.hh"
#include "G4BEHe3Channel.hh"
#include "G4BEHe4Channel.hh"
#include "G4BEGammaDeexcitation.hh"
// verboseLevels : 4 inform about basic probabilities and branchings
// 6 some details about calculations
// 8 inform about final values
// 10 inform everything
G4BertiniEvaporation::G4BertiniEvaporation()
{
G4cout << "Info G4BertiniEvaporation: This is still very fresh code."<< G4endl;
G4cout << " G4BertiniEvaporation: feed-back for improvement is very wellcome."<< G4endl;
verboseLevel = 0;
channelVector.push_back( new G4BENeutronChannel );
channelVector.push_back( new G4BEProtonChannel );
channelVector.push_back( new G4BEDeuteronChannel);
channelVector.push_back( new G4BETritonChannel );
channelVector.push_back( new G4BEHe3Channel );
channelVector.push_back( new G4BEHe4Channel );
}
G4BertiniEvaporation::~G4BertiniEvaporation()
{
while ( !channelVector.empty() )
{
delete channelVector.back();
channelVector.pop_back();
}
}
void G4BertiniEvaporation::setVerboseLevel( const G4int verbose )
{
verboseLevel = verbose;
// Update verbose level to all evaporation channels.
G4std::vector< G4BertiniEvaporationChannel * >::iterator iChannel = channelVector.begin();
for ( ; iChannel != channelVector.end() ; *iChannel++ )
( *iChannel )->setVerboseLevel( verboseLevel );
}
G4FragmentVector * G4BertiniEvaporation::BreakItUp( G4LayeredNucleus & nucleus )
{
G4int nucleusA;
G4int nucleusZ;
G4int i;
G4double totalProbability;
G4double excE;
G4double newExcitation;
G4double nucleusTotalMomentum;
G4double nucleusKineticEnergy;
G4double mRes; // Mass of residual nucleus.
G4ThreeVector nucleusMomentumVector;
G4DynamicParticle *pEmittedParticle;
G4std::vector< G4DynamicParticle * > secondaryParticleVector;
G4FragmentVector * result = new G4FragmentVector;
// Read properties of the nucleus.
nucleusA = ( G4int ) nucleus.GetN(); // GetN should in fact get GetA
nucleusZ = ( G4int ) nucleus.GetZ();
excE = nucleus.GetEnergyDeposit();
nucleusMomentumVector = nucleus.GetMomentum();
// Move to CMS frame, save initial velocity of the nucleus to boostToLab vector.
G4ThreeVector boostToLab( ( 1/G4NucleiProperties::GetAtomicMass( nucleusA, nucleusZ ) )
* nucleusMomentumVector ); // xx mass ok?
if ( verboseLevel >= 10 )
G4cout << " G4BertiniEvaporation : initial kinematics : boostToLab vector = " << boostToLab << G4endl
<< " excitation energy : " << excE<< G4endl;
if ( nucleusA == 8 && nucleusZ == 4 )
{
splitBe8( excE, boostToLab, secondaryParticleVector );
fillResult( secondaryParticleVector, result);
return result;
}
// Initialize evaporation channels and calculate sum of emission
// probabilities.
G4std::vector< G4BertiniEvaporationChannel * >::iterator iChannel = channelVector.begin();
totalProbability = 0;
for ( ; iChannel != channelVector.end() ; *iChannel++ )
{
( *iChannel )->setNucleusA( nucleusA );
( *iChannel )->setNucleusZ( nucleusZ );
( *iChannel )->setExcitationEnergy( excE );
( *iChannel )->setPairingCorrection( 1 );
( *iChannel )->calculateProbability();
totalProbability += ( *iChannel )->getProbability();
}
// If no evaporation process is possible, try without pairing energy.
if ( totalProbability == 0 )
{
if ( verboseLevel >= 4 )
G4cout << "G4BertiniEvaporation : no emission possible with pairing correction, trying without it" << G4endl;
for ( iChannel = channelVector.begin() ; iChannel != channelVector.end() ; *iChannel++ )
{
( *iChannel )->setPairingCorrection(0);
( *iChannel )->calculateProbability();
totalProbability += ( *iChannel )->getProbability();
}
if ( verboseLevel >= 4 )
G4cout << " probability without correction " << totalProbability << G4endl;
}
// Normal evaporation cycle follows.
// Particles are evaporated till all probabilities are zero.
while ( totalProbability > 0 )
{
G4BertiniEvaporationChannel *pSelectedChannel;
// Sample active emission channel.
G4double sampledProbability = G4UniformRand() * totalProbability;
if ( verboseLevel >= 10 ) G4cout << " RandomProb : " << sampledProbability << G4endl;
for ( iChannel = channelVector.begin() ; iChannel != channelVector.end() ; *iChannel++ )
{
sampledProbability -= ( *iChannel )->getProbability();
if ( sampledProbability < 0 ) break;
}
pSelectedChannel = ( *iChannel );
if ( iChannel == channelVector.end() )
G4Exception( "G4BertiniEvaporation : Error while sampling evaporation particle" );
if ( verboseLevel >= 4 )
G4cout << "G4BertiniEvaporation : particle " << pSelectedChannel->getName() << " selected " << G4endl;
// Max 10 tries to get a physically acceptable particle energy
// in this emission channel.
i = 0;
do
{
pEmittedParticle = pSelectedChannel->emit();
// This loop checks that particle with too large energy is not emitted.
// CMS frame is considered in this loop. Nonrelativistic treatment. xxx
const G4int zRes = nucleusZ - pSelectedChannel->getParticleZ();
const G4int aRes = nucleusA - pSelectedChannel->getParticleA();
const G4double eBind = G4NucleiProperties::GetBindingEnergy( aRes, zRes ); // Binding energy of the nucleus.
mRes = G4NucleiProperties::GetAtomicMass( aRes, zRes ); // Mass of the target nucleus
// In HETC88:
// eBind = Z * (-0.78244) + A * 8.36755 - cameron ( A , Z );
// mRes = zRes * 938.79304 + ( aRes - zRes ) * 939.57548 - eBind;
// where cameron ( A, Z ) is the mass excess by Cameron, see Canadian Journal of Physics,
// vol. 35, 1957, p.1022
nucleusTotalMomentum = pEmittedParticle->GetTotalMomentum(); // CMS frame
nucleusKineticEnergy = pow( nucleusTotalMomentum, 2 ) / ( 2 * mRes );
newExcitation = excE - pEmittedParticle->GetKineticEnergy() - nucleusKineticEnergy - pSelectedChannel->getQ();
if ( verboseLevel >= 10)
G4cout << "G4BertiniEvaporation : Kinematics " << G4endl
<< " part kinetic E in CMS = "
<< pEmittedParticle->GetKineticEnergy() << G4endl
<< " new excitation E = "
<< newExcitation << G4endl;
i++;
if ( !( newExcitation > 0 ) && i < 10) delete pEmittedParticle;
} while ( !( newExcitation > 0 ) && i < 10 );
if ( i >= 10 )
{
// No appropriate particle energy found.
// Set probability of this channel to zero
// and try to sample another particle on the
// next round.
delete pEmittedParticle;
if ( verboseLevel >= 4 )
G4cout << "G4BertiniEvaporation : No appropriate energy for particle "
<< pSelectedChannel->getName() << " found." << G4endl;
pSelectedChannel->setProbability( 0 );
totalProbability = 0;
for ( ; iChannel != channelVector.end() ; *iChannel++ )
totalProbability += ( *iChannel )->getProbability();
} // Treatment of physically unacceptable particle ends.
else
{
// Good particle found.
// Transform particle properties to lab frame and save it.
G4LorentzVector particleFourVector = pEmittedParticle->Get4Momentum();
G4LorentzVector nucleusFourVector( - pEmittedParticle->GetMomentum(), // CMS Frame.
nucleusKineticEnergy + mRes ); // Total energy.
particleFourVector.boost( boostToLab );
nucleusFourVector.boost( boostToLab );
G4DynamicParticle *pPartLab = new G4DynamicParticle( pEmittedParticle->GetDefinition(),
particleFourVector.e(), // Total energy
particleFourVector.vect() ); // momentum vector
secondaryParticleVector.push_back( pPartLab );
// Update residual nucleus and boostToLab vector.
nucleusA = nucleusA - pSelectedChannel->getParticleA();
nucleusZ = nucleusZ - pSelectedChannel->getParticleZ();
excE = newExcitation;
boostToLab = G4ThreeVector ( ( 1/mRes ) * nucleusFourVector.vect() );
if ( verboseLevel >= 10 )
G4cout << " particle mom in cms " << pEmittedParticle->GetMomentum() << G4endl
<< " particle mom in cms " << pEmittedParticle->GetTotalMomentum() << G4endl
<< " Etot in cms " << pEmittedParticle->GetTotalEnergy() << G4endl
<< " Ekin in cms " << pEmittedParticle->GetKineticEnergy() << G4endl
<< " particle mass " << pEmittedParticle->GetMass() << G4endl
<< " boost vect " << boostToLab << G4endl
<< " boosted 4v " << particleFourVector << G4endl
<< " nucleus 4v " << nucleusFourVector << G4endl
<< " nucl cm mom " << nucleusTotalMomentum << G4endl
<< " particle k.e. in lab " << pPartLab->GetKineticEnergy() << G4endl
<< " new boost vector " << boostToLab << G4endl;
delete pEmittedParticle;
// If the residual nucleus is Be8, split it.
if ( nucleusA == 8 && nucleusZ == 4 )
{
splitBe8( excE, boostToLab, secondaryParticleVector );
fillResult( secondaryParticleVector, result);
return result;
}
// Update evaporation channels and
// total emission probability.
totalProbability = 0;
for ( iChannel = channelVector.begin() ; iChannel != channelVector.end() ; *iChannel++ )
{
( *iChannel )->setNucleusA( nucleusA );
( *iChannel )->setNucleusZ( nucleusZ );
( *iChannel )->setExcitationEnergy( excE );
( *iChannel )->calculateProbability();
totalProbability += ( *iChannel )->getProbability();
}
} // Treatment of physically acceptable particle ends.
} // End of evaporation cycle.
// Gamma de-excitation.
G4BEGammaDeexcitation *pGammaChannel = new G4BEGammaDeexcitation;
pGammaChannel->setNucleusA( nucleusA );
pGammaChannel->setNucleusZ( nucleusZ );
pGammaChannel->setVerboseLevel( verboseLevel );
pGammaChannel->setExcitationEnergy( excE );
// Emit equally sampled photons until all the excitation energy is
// used; the last photon gets the remaining de-excitation energy.
// Change of momentum of the nucleus is neglected.
G4double gammaEnergy;
G4double totalDeExcEnergy = 0;
while ( excE > 0 )
{
pEmittedParticle = pGammaChannel->emit();
gammaEnergy = pEmittedParticle->GetKineticEnergy();
if ( ( totalDeExcEnergy + gammaEnergy ) > excE )
{
// All the remaining energy is used here.
gammaEnergy = excE - totalDeExcEnergy;
excE = 0;
}
totalDeExcEnergy += gammaEnergy;
if ( verboseLevel >= 10 )
G4cout << " G4BertiniEvaporation : gamma de-excitation, g of " << gammaEnergy << " MeV " << G4endl;
G4LorentzVector gammaFourVector( pEmittedParticle->GetMomentum(),
pEmittedParticle->GetKineticEnergy() );
gammaFourVector.boost( boostToLab );
pEmittedParticle->SetKineticEnergy( gammaFourVector.e() );
pEmittedParticle->SetMomentumDirection( gammaFourVector.vect().unit() );
secondaryParticleVector.push_back( pEmittedParticle );
}
delete pGammaChannel;
// Residual nucleus is not returned.
fillResult( secondaryParticleVector, result);
return result;
}
void G4BertiniEvaporation::splitBe8( const G4double E,
const G4ThreeVector boostToLab,
G4std::vector< G4DynamicParticle * > & secondaryParticleVector )
{
G4double kineticEnergy;
G4double u;
G4double v;
G4double w;
const G4double Be8DecayEnergy = 0.093 * MeV;
if ( E <= 0 ) G4Exception( "G4BertiniEvaporation : excitation energy < 0 " );
if ( verboseLevel >= 4 ) G4cout << " Be8 split to 2 x He4" << G4endl;
kineticEnergy = 0.5 * ( E + Be8DecayEnergy );
// Create two alpha particles in CMS frame.
isotropicCosines( u , v , w );
G4ThreeVector momentumDirectionCMS( u, v, w );
G4DynamicParticle *pP1Cms = new G4DynamicParticle( G4Alpha::Alpha(),
momentumDirectionCMS,
kineticEnergy );
G4DynamicParticle *pP2Cms = new G4DynamicParticle( G4Alpha::Alpha(),
-momentumDirectionCMS,
kineticEnergy );
G4LorentzVector fourVector1( pP1Cms->GetMomentum(),
pP1Cms->GetTotalEnergy() );
G4LorentzVector fourVector2( pP2Cms->GetMomentum(),
pP2Cms->GetTotalEnergy() );
// Transform into lab frame by transforming the four vectors. Then
// add to the vector of secondary particles.
fourVector1.boost( boostToLab );
fourVector2.boost( boostToLab );
G4DynamicParticle * pP1Lab = new G4DynamicParticle( G4Alpha::Alpha(),
fourVector1.vect(),
fourVector1.e() );
G4DynamicParticle * pP2Lab = new G4DynamicParticle( G4Alpha::Alpha(),
fourVector2.vect(),
fourVector2.e() );
secondaryParticleVector.push_back( pP1Lab );
secondaryParticleVector.push_back( pP2Lab );
delete pP1Cms;
delete pP2Cms;
return;
}
void G4BertiniEvaporation::fillResult( G4std::vector<G4DynamicParticle *> secondaryParticleVector,
G4FragmentVector * aResult )
{
// Fill the vector pParticleChange with secondary particles stored in vector.
for ( G4int i = 0 ; i < secondaryParticleVector.size() ; i++ )
{
G4int aZ = secondaryParticleVector[i]->GetDefinition()->GetPDGCharge();
G4int aA = secondaryParticleVector[i]->GetDefinition()->GetBaryonNumber();
G4LorentzVector aMomentum = secondaryParticleVector[i]->Get4Momentum();
if(aA>0)
{
aResult->push_back( new G4Fragment(aA, aZ, aMomentum) );
}
else
{
aResult->push_back( new G4Fragment(aMomentum, secondaryParticleVector[i]->GetDefinition()) );
}
}
return;
}
void G4BertiniEvaporation::isotropicCosines( G4double & u, G4double & v, G4double & w )
{
// Samples isotropic random direction cosines.
G4double CosTheta = 1.0 - 2.0 * G4UniformRand();
G4double SinTheta = sqrt( 1.0 - CosTheta * CosTheta );
G4double Phi = twopi * G4UniformRand();
u = cos( Phi ) * SinTheta;
v = cos( Phi ) * CosTheta,
w = sin( Phi );
return;
}
@@ -0,0 +1,400 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Implementation of the HETC88 code into Geant4.
// Evaporation and De-excitation parts
// T. Lampen, Helsinki Institute of Physics, May-2000
#include "globals.hh"
#include "G4ios.hh"
#include "Randomize.hh"
#include "G4Neutron.hh"
#include "G4Proton.hh"
#include "G4Deuteron.hh"
#include "G4Triton.hh"
#include "G4Alpha.hh"
#include "G4ParticleTable.hh"
#include "G4Nucleus.hh"
#include "G4BertiniEvaporationChannel.hh"
G4BertiniEvaporationChannel::G4BertiniEvaporationChannel()
{
verboseLevel = 0;
}
G4BertiniEvaporationChannel::~G4BertiniEvaporationChannel()
{
}
void G4BertiniEvaporationChannel::setVerboseLevel( G4int level )
{
verboseLevel = level;
}
void G4BertiniEvaporationChannel::setNucleusA( G4int a )
{
nucleusA = a;
}
void G4BertiniEvaporationChannel::setNucleusZ( G4int z )
{
nucleusZ = z;
}
G4int G4BertiniEvaporationChannel::getParticleA()
{
return particleA;
}
G4int G4BertiniEvaporationChannel::getParticleZ()
{
return particleZ;
}
void G4BertiniEvaporationChannel::setExcitationEnergy(G4double energy )
{
excitationEnergy = energy;
}
void G4BertiniEvaporationChannel::setPairingCorrection( G4int isCorrection )
{
G4int residualZ = nucleusZ - particleZ;
G4int residualA = nucleusA - particleA;
// Note: pairing energy is zero for odd nucleon number.
if ( isCorrection ) correction = pairingEnergyProtons( residualZ )
+ pairingEnergyNeutrons( residualA - residualZ );
else correction = 0;
}
G4double G4BertiniEvaporationChannel::getProbability()
{
if ( verboseLevel >= 4 )
G4cout << "G4BerEvaporationChannel : probability of particle " << name
<< " is " << emissionProbability << G4endl;
return emissionProbability;
}
G4String G4BertiniEvaporationChannel::getName()
{
return name;
}
void G4BertiniEvaporationChannel::setProbability( G4double newProb )
{
emissionProbability = newProb;
return;
}
G4double G4BertiniEvaporationChannel::getQ()
{
// The reaction Q is calculated by using the excess masses of the
// secondary particle and the initial and residual nuclei
G4int residualZ = nucleusZ - particleZ;
G4int residualA = nucleusA - particleA;
G4int residualN = residualA - residualZ;
G4int nucleusN = nucleusA - nucleusZ;
// All the following are by default in MeV
const G4double e1 = G4NucleiProperties::GetMassExcess( residualA, residualZ );
const G4double e2 = G4NucleiProperties::GetMassExcess( nucleusA, nucleusZ );
return e1 - e2 + G4NucleiProperties::GetMassExcess( particleA, particleZ );
// In HETC88 : Mass excesses were calculated with the Cameron mass excess formula,
// see Cameron, Canadian Journal of Physics,
// vol. 35, 1957, p.1022
// Also mass excesses of particles were
// 8.3675, 7.5851, 13.7279, 15.8381, 15.8195, 3.6092 for
// n, p, D, T, 3He, 4He
}
G4double G4BertiniEvaporationChannel::getThresh()
{
G4double threshold = getQ() + getCoulomb();
return threshold;
}
G4double G4BertiniEvaporationChannel::getCoulomb()
{
G4int residualZ = nucleusZ - particleZ;
G4int residualA = nucleusA - particleA;
const G4double factor = 0.84696; // = e / ( 4 pi epsilon_0 r0 ) * 10^-6, r0=1.7E-15
// In HETC88 this factor was 0.88235, perhaps due to different r0
G4double coulomb = factor * particleZ * qmFactor() * residualZ /
( pow( residualA, 0.33333333 ) + rho ) * MeV;
if ( verboseLevel >= 10 )
G4cout << " G4BertiniEvaporationChannel::getThresh() " << G4endl
<< " residualZ " << residualZ << G4endl
<< " residualA " << residualA << G4endl
<< " qmFactor " << qmFactor() << G4endl
<< " Q " << getQ() << G4endl
<< " rho " << rho << G4endl
<< " part Z " << particleZ << G4endl
<< " (correction) " << correction << G4endl;
return coulomb;
}
G4double G4BertiniEvaporationChannel::qmFactor()
{
// Coefficient k_p for empirical cross section
// formula presented in Dostrovsky, Phys. Rev.,
// vol. 116, 1959
return 0;
}
G4double G4BertiniEvaporationChannel::getLevelDensityParameter()
{
G4int residualZ = nucleusZ - particleZ;
G4int residualA = nucleusA - particleA;
G4double b0 = 8;
G4double y0 = 1.5;
G4double temp = ( residualA - 2.0 * residualZ ) / residualA;
G4double smallA = residualA * ( 1.0 + y0 * pow( temp, 2 ) ) / b0 / MeV;
// In HETC98 b0 = b0(E).
return smallA;
}
void G4BertiniEvaporationChannel::isotropicCosines( G4double & u, G4double & v, G4double & w )
{
// Samples isotropic random direction cosines.
G4double CosTheta = 1.0 - 2.0 * G4UniformRand();
G4double SinTheta = sqrt( 1.0 - CosTheta * CosTheta );
G4double Phi = twopi * G4UniformRand();
u = cos( Phi ) * SinTheta;
v = cos( Phi ) * CosTheta,
w = sin( Phi );
return;
}
G4double G4BertiniEvaporationChannel::pairingEnergyProtons(G4int Z)
{
// Pairing energy for protons P(Z), see
// Cameron, Nuclear Level Spacings, p. 1040
// Canadian Journal of Physics, vol 36, 1958
G4double table [130] = {
0.00000000E+00, 0.54399996E+01, 0.00000000E+00, 0.27599993E+01, 0.00000000E+00,
0.33399992E+01, 0.00000000E+00, 0.26999998E+01, 0.00000000E+00, 0.18999996E+01,
0.00000000E+00, 0.21199999E+01, 0.00000000E+00, 0.21299992E+01, 0.00000000E+00,
0.15399990E+01, 0.00000000E+00, 0.14199991E+01, 0.00000000E+00, 0.15099993E+01,
0.00000000E+00, 0.17299995E+01, 0.00000000E+00, 0.14399996E+01, 0.00000000E+00,
0.14499998E+01, 0.00000000E+00, 0.13699999E+01, 0.00000000E+00, 0.10899992E+01,
0.00000000E+00, 0.13599997E+01, 0.00000000E+00, 0.14199991E+01, 0.00000000E+00,
0.13299990E+01, 0.00000000E+00, 0.11999998E+01, 0.00000000E+00, 0.99999988E+00,
0.00000000E+00, 0.11599998E+01, 0.00000000E+00, 0.12799997E+01, 0.00000000E+00,
0.13799992E+01, 0.00000000E+00, 0.13799992E+01, 0.00000000E+00, 0.13199997E+01,
0.00000000E+00, 0.10399990E+01, 0.00000000E+00, 0.11099997E+01, 0.00000000E+00,
0.11299992E+01, 0.00000000E+00, 0.12099991E+01, 0.00000000E+00, 0.14299994E+01,
0.00000000E+00, 0.11499996E+01, 0.00000000E+00, 0.98999995E+00, 0.00000000E+00,
0.90999997E+00, 0.00000000E+00, 0.91999996E+00, 0.00000000E+00, 0.99999988E+00,
0.00000000E+00, 0.11099997E+01, 0.00000000E+00, 0.12299995E+01, 0.00000000E+00,
0.84999996E+00, 0.00000000E+00, 0.97999996E+00, 0.00000000E+00, 0.71999997E+00,
0.00000000E+00, 0.79999995E+00, 0.00000000E+00, 0.76999998E+00, 0.00000000E+00,
0.88999999E+00, 0.00000000E+00, 0.91999996E+00, 0.00000000E+00, 0.79999995E+00,
0.00000000E+00, 0.80999994E+00, 0.00000000E+00, 0.69000000E+00, 0.00000000E+00,
0.69999999E+00, 0.00000000E+00, 0.75999999E+00, 0.00000000E+00, 0.72999996E+00,
0.00000000E+00, 0.79999995E+00, 0.00000000E+00, 0.73999995E+00, 0.00000000E+00,
0.72999996E+00, 0.00000000E+00, 0.71999997E+00, 0.00000000E+00, 0.71999997E+00,
0.00000000E+00, 0.71999997E+00, 0.00000000E+00, 0.70999998E+00, 0.00000000E+00,
0.69000000E+00, 0.00000000E+00, 0.67999995E+00, 0.00000000E+00, 0.65999997E+00,
0.00000000E+00, 0.60999995E+00, 0.00000000E+00, 0.41999996E+00, 0.00000000E+00,
0.35999995E+00, 0.00000000E+00, 0.40999997E+00, 0.00000000E+00, 0.48999995E+00
};
if ( Z>130 ) G4Exception( " G4BertiniEvaporationChannel: pairing energy for protons called with too large Z " );
return table[ Z-1 ]*MeV;
}
G4double G4BertiniEvaporationChannel::pairingEnergyNeutrons(G4int N)
{
// Pairing energy for neutrons P(N), see
// Cameron, Nuclear Level Spacings, p. 1040
// Canadian Journal of Physics, vol 36, 1958
G4double table[200] = {
0.00000000E+00, 0.59799995E+01, 0.00000000E+00, 0.27699995E+01, 0.00000000E+00,
0.31599998E+01, 0.00000000E+00, 0.30099993E+01, 0.00000000E+00, 0.16799994E+01,
0.00000000E+00, 0.17299995E+01, 0.00000000E+00, 0.21699991E+01, 0.00000000E+00,
0.17399998E+01, 0.00000000E+00, 0.17500000E+01, 0.00000000E+00, 0.17199993E+01,
0.00000000E+00, 0.16299992E+01, 0.00000000E+00, 0.14099998E+01, 0.00000000E+00,
0.12899990E+01, 0.00000000E+00, 0.14699993E+01, 0.00000000E+00, 0.13199997E+01,
0.00000000E+00, 0.14599991E+01, 0.00000000E+00, 0.14399996E+01, 0.00000000E+00,
0.14599991E+01, 0.00000000E+00, 0.15199995E+01, 0.00000000E+00, 0.15099993E+01,
0.00000000E+00, 0.14699993E+01, 0.00000000E+00, 0.14499998E+01, 0.00000000E+00,
0.12799997E+01, 0.00000000E+00, 0.12299995E+01, 0.00000000E+00, 0.12699995E+01,
0.00000000E+00, 0.61999995E+00, 0.00000000E+00, 0.75999999E+00, 0.00000000E+00,
0.12299995E+01, 0.00000000E+00, 0.12199993E+01, 0.00000000E+00, 0.13999996E+01,
0.00000000E+00, 0.13599997E+01, 0.00000000E+00, 0.12999992E+01, 0.00000000E+00,
0.12899990E+01, 0.00000000E+00, 0.12399998E+01, 0.00000000E+00, 0.12799997E+01,
0.00000000E+00, 0.12399998E+01, 0.00000000E+00, 0.11999998E+01, 0.00000000E+00,
0.94000000E+00, 0.00000000E+00, 0.99999988E+00, 0.00000000E+00, 0.10499992E+01,
0.00000000E+00, 0.53999996E+00, 0.00000000E+00, 0.59999996E+00, 0.00000000E+00,
0.75000000E+00, 0.00000000E+00, 0.75000000E+00, 0.00000000E+00, 0.84999996E+00,
0.00000000E+00, 0.96999997E+00, 0.00000000E+00, 0.10199995E+01, 0.00000000E+00,
0.10499992E+01, 0.00000000E+00, 0.10599995E+01, 0.00000000E+00, 0.10699997E+01,
0.00000000E+00, 0.10599995E+01, 0.00000000E+00, 0.10499992E+01, 0.00000000E+00,
0.10199995E+01, 0.00000000E+00, 0.96999997E+00, 0.00000000E+00, 0.90999997E+00,
0.00000000E+00, 0.82999998E+00, 0.00000000E+00, 0.73999995E+00, 0.00000000E+00,
0.65999997E+00, 0.00000000E+00, 0.60999995E+00, 0.00000000E+00, 0.60999995E+00,
0.00000000E+00, 0.89999998E+00, 0.00000000E+00, 0.51999998E+00, 0.00000000E+00,
0.80999994E+00, 0.00000000E+00, 0.67999995E+00, 0.00000000E+00, 0.71999997E+00,
0.00000000E+00, 0.76999998E+00, 0.00000000E+00, 0.67999995E+00, 0.00000000E+00,
0.66999996E+00, 0.00000000E+00, 0.79999995E+00, 0.00000000E+00, 0.67999995E+00,
0.00000000E+00, 0.63999999E+00, 0.00000000E+00, 0.57999998E+00, 0.00000000E+00,
0.54999995E+00, 0.00000000E+00, 0.56999993E+00, 0.00000000E+00, 0.56999993E+00,
0.00000000E+00, 0.54999995E+00, 0.00000000E+00, 0.59999996E+00, 0.00000000E+00,
0.57999998E+00, 0.00000000E+00, 0.57999998E+00, 0.00000000E+00, 0.60999995E+00,
0.00000000E+00, 0.63000000E+00, 0.00000000E+00, 0.64999998E+00, 0.00000000E+00,
0.65999997E+00, 0.00000000E+00, 0.64999998E+00, 0.00000000E+00, 0.64999998E+00,
0.00000000E+00, 0.63999999E+00, 0.00000000E+00, 0.63999999E+00, 0.00000000E+00,
0.63000000E+00, 0.00000000E+00, 0.60999995E+00, 0.00000000E+00, 0.58999997E+00,
0.00000000E+00, 0.54999995E+00, 0.00000000E+00, 0.38999999E+00, 0.00000000E+00,
0.35999995E+00, 0.00000000E+00, 0.39999998E+00, 0.00000000E+00, 0.39999998E+00,
0.00000000E+00, 0.39999998E+00, 0.00000000E+00, 0.39999998E+00, 0.00000000E+00,
0.39999998E+00, 0.00000000E+00, 0.39999998E+00, 0.00000000E+00, 0.39999998E+00
};
if ( N > 200 ) G4Exception( " G4BertiniEvaporationChannel: pairing energy for neutrons called with too large Z " );
return table[ N-1 ]*MeV;
}
G4double G4BertiniEvaporationChannel::cameronShellCorrectionP(G4int Z)
{
// Gives the binding energy correction depending in Z
// due to shell correction and pairing energies in MeV
//
// see Cameron, Canadian Journal of Physics,
// vol. 35, 1957, p.1022
G4double table[130] = {
0.26169998E+02, 0.19250000E+02, 0.24209991E+02, 0.20919998E+02, 0.23149994E+02,
0.18009995E+02, 0.19549988E+02, 0.16939987E+02, 0.19729996E+02, 0.17069992E+02,
0.18209991E+02, 0.14990000E+02, 0.16009995E+02, 0.12040000E+02, 0.13270000E+02,
0.11089998E+02, 0.12169999E+02, 0.10259998E+02, 0.11040000E+02, 0.84099998E+01,
0.97899990E+01, 0.73599997E+01, 0.81499996E+01, 0.56299992E+01, 0.58799992E+01,
0.31699991E+01, 0.33199997E+01, 0.81999993E+00, 0.18299999E+01, 0.96999997E+00,
0.23299999E+01, 0.12699995E+01, 0.29199991E+01, 0.16099997E+01, 0.29099998E+01,
0.13499994E+01, 0.23999996E+01, 0.88999999E+00, 0.17399998E+01, 0.35999995E+00,
0.94999999E+00, -0.64999998E+00, -0.39999995E-01, -0.17299995E+01, -0.95999998E+00,
-0.28699999E+01, -0.20499992E+01, -0.40499992E+01, -0.33999996E+01, -0.57199993E+01,
-0.37499990E+01, -0.41299992E+01, -0.24199991E+01, -0.28499994E+01, -0.10099993E+01,
-0.13299990E+01, 0.53999996E+00, -0.20000000E-01, 0.17399998E+01, 0.75000000E+00,
0.22399998E+01, 0.99999988E+00, 0.19799995E+01, 0.78999996E+00, 0.15399990E+01,
0.38999999E+00, 0.10799999E+01, 0.00000000E+00, 0.77999997E+00, -0.34999996E+00,
0.57999998E+00, -0.54999995E+00, 0.58999997E+00, -0.60999995E+00, 0.58999997E+00,
-0.34999996E+00, 0.31999993E+00, -0.95999998E+00, -0.51999998E+00, -0.20799999E+01,
-0.24599991E+01, -0.36399994E+01, -0.15499992E+01, -0.95999998E+00, 0.96999997E+00,
0.88000000E+00, 0.23699999E+01, 0.17500000E+01, 0.27199993E+01, 0.18999996E+01,
0.25499992E+01, 0.14599991E+01, 0.19299994E+01, 0.85999995E+00, 0.11699991E+01,
0.79999983E-01, 0.38999999E+00, -0.75999999E+00, -0.38999999E+00, -0.15099993E+01,
-0.11699991E+01, -0.23599997E+01, -0.19499998E+01, -0.30599995E+01, -0.26199999E+01,
-0.35499992E+01, -0.29499998E+01, -0.37499990E+01, -0.30699997E+01, -0.37899990E+01,
-0.30599995E+01, -0.37699995E+01, -0.30499992E+01, -0.37799997E+01, -0.31199999E+01,
-0.38999996E+01, -0.33499994E+01, -0.42399998E+01, -0.38599997E+01, -0.49199991E+01,
-0.50599995E+01, -0.67699995E+01, -0.74099998E+01, -0.91799994E+01, -0.10160000E+02,
-0.11120000E+02, -0.97599993E+01, -0.92299995E+01, -0.79599991E+01, -0.76499996E+01,
};
if ( Z > 130 ) G4Exception( " G4BertiniEvaporationChannel: shell correction for protons called with too large Z " );
return table[ Z-1 ]*MeV;
}
G4double G4BertiniEvaporationChannel::cameronShellCorrectionN(G4int N)
{
// Gives the binding energy correction depending in N
// due to shell correction and pairing energies in MeV
//
// see Cameron, Canadian Journal of Physics,
// vol. 35, 1957, p.1022
G4double table[200] = {
-0.83199997E+01, -0.15899999E+02, -0.11509999E+02, -0.14309999E+02, -0.11570000E+02,
-0.15899999E+02, -0.13909999E+02, -0.16029999E+02, -0.12129999E+02, -0.13869999E+02,
-0.12249998E+02, -0.14399999E+02, -0.13069999E+02, -0.15799998E+02, -0.13809999E+02,
-0.14980000E+02, -0.12629999E+02, -0.13759999E+02, -0.11369999E+02, -0.12379998E+02,
-0.92299995E+01, -0.96499996E+01, -0.76399994E+01, -0.91699991E+01, -0.80499992E+01,
-0.97199993E+01, -0.88699989E+01, -0.10759999E+02, -0.86399994E+01, -0.88899994E+01,
-0.65999994E+01, -0.71299992E+01, -0.47699995E+01, -0.53299990E+01, -0.30599995E+01,
-0.37899990E+01, -0.17199993E+01, -0.27899990E+01, -0.92999995E+00, -0.21899996E+01,
-0.51999998E+00, -0.18999996E+01, -0.44999999E+00, -0.21999998E+01, -0.12199993E+01,
-0.30699997E+01, -0.24199991E+01, -0.43699999E+01, -0.39399996E+01, -0.60799999E+01,
-0.44899998E+01, -0.45000000E+01, -0.31399994E+01, -0.29299994E+01, -0.10399990E+01,
-0.13599997E+01, 0.69000000E+00, 0.20999998E+00, 0.21099997E+01, 0.13299990E+01,
0.32900000E+01, 0.24599991E+01, 0.42999992E+01, 0.33199997E+01, 0.47899990E+01,
0.36199999E+01, 0.49699993E+01, 0.36399994E+01, 0.46299992E+01, 0.30699997E+01,
0.40599995E+01, 0.24899998E+01, 0.32999992E+01, 0.14599991E+01, 0.20599995E+01,
0.50999999E+00, 0.73999995E+00, -0.11799994E+01, -0.12599993E+01, -0.35399990E+01,
-0.39699993E+01, -0.52599993E+01, -0.41799994E+01, -0.37099991E+01, -0.20999994E+01,
-0.16999998E+01, -0.79999983E-01, -0.17999995E+00, 0.94000000E+00, 0.26999998E+00,
0.11299992E+01, 0.79999983E-01, 0.90999997E+00, -0.30999994E+00, 0.48999995E+00,
-0.77999997E+00, 0.79999983E-01, -0.11499996E+01, -0.22999996E+00, -0.14099998E+01,
-0.41999996E+00, -0.15499992E+01, -0.54999995E+00, -0.16599998E+01, -0.65999997E+00,
-0.17299995E+01, -0.75000000E+00, -0.17399998E+01, -0.77999997E+00, -0.16899996E+01,
-0.77999997E+00, -0.15999994E+01, -0.75000000E+00, -0.14599991E+01, -0.66999996E+00,
-0.12599993E+01, -0.50999999E+00, -0.10399990E+01, -0.52999997E+00, -0.18399992E+01,
-0.24199991E+01, -0.45199995E+01, -0.47599993E+01, -0.63299990E+01, -0.67599993E+01,
-0.78099995E+01, -0.57999992E+01, -0.53699999E+01, -0.36299992E+01, -0.33499994E+01,
-0.17500000E+01, -0.18799992E+01, -0.60999995E+00, -0.89999998E+00, 0.89999974E-01,
-0.31999993E+00, 0.54999995E+00, -0.13000000E+00, 0.69999999E+00, -0.59999999E-01,
0.48999995E+00, -0.19999999E+00, 0.39999998E+00, -0.21999997E+00, 0.35999995E+00,
-0.89999974E-01, 0.57999998E+00, 0.11999995E+00, 0.75000000E+00, 0.14999998E+00,
0.69999999E+00, 0.16999996E+00, 0.11099997E+01, 0.88999999E+00, 0.18499994E+01,
0.16199999E+01, 0.25399990E+01, 0.22899990E+01, 0.31999998E+01, 0.29099998E+01,
0.38399992E+01, 0.35299997E+01, 0.44799995E+01, 0.41499996E+01, 0.51199999E+01,
0.47799997E+01, 0.57500000E+01, 0.53899994E+01, 0.63099995E+01, 0.59099998E+01,
0.68699999E+01, 0.63299990E+01, 0.71299992E+01, 0.66099997E+01, 0.72999992E+01,
0.63099995E+01, 0.62699995E+01, 0.48299999E+01, 0.44899998E+01, 0.28499994E+01,
0.23199997E+01, 0.57999998E+00, -0.10999995E+00, -0.97999996E+00, 0.80999994E+00,
0.17699995E+01, 0.33699999E+01, 0.41299992E+01, 0.55999994E+01, 0.61499996E+01,
0.72899990E+01, 0.73499994E+01, 0.79499998E+01, 0.76699991E+01, 0.81599998E+01,
0.78299990E+01, 0.83099995E+01, 0.80099993E+01, 0.85299997E+01, 0.82699995E+01
};
if ( N > 130 ) G4Exception( " G4BertiniEvaporationChannel: shell correction for protons called with too large N " );
return table[ N-1 ]*MeV;
}
@@ -0,0 +1,32 @@
# $Id: GNUmakefile,v 1.2 2001/11/16 14:22:37 hpw Exp $
# -----------------------------------------------------------
# GNUmakefile for hadronic library. Gabriele Cosmo, 18/9/96.
# -----------------------------------------------------------
name := G4hadronic_hetcpp_utils
ifndef G4INSTALL
G4INSTALL = ../../../../../..
endif
include $(G4INSTALL)/config/architecture.gmk
CPPFLAGS += -I$(G4BASE)/global/management/include \
-I$(G4BASE)/global/HEPRandom/include \
-I$(G4BASE)/global/HEPGeometry/include \
-I$(G4BASE)/track/include \
-I$(G4BASE)/geometry/volumes/include \
-I$(G4BASE)/geometry/management/include \
-I$(G4BASE)/processes/management/include \
-I$(G4BASE)/processes/hadronic/management/include/ \
-I$(G4BASE)/processes/hadronic/util/include \
-I$(G4BASE)/processes/hadronic/cross_sections/include/ \
-I$(G4BASE)/particles/management/include \
-I$(G4BASE)/particles/leptons/include \
-I$(G4BASE)/particles/bosons/include \
-I$(G4BASE)/particles/hadrons/mesons/include \
-I$(G4BASE)/particles/hadrons/barions/include \
-I$(G4BASE)/particles/hadrons/ions/include \
-I$(G4BASE)/materials/include
include $(G4INSTALL)/config/common.gmk
@@ -0,0 +1,64 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// original class G4Nucleus by H.P. Wellisch
// modified by J.L. Chuma, TRIUMF, 19-Nov-1996
// last modified: 27-Mar-1997
// Chr. Volcker, 10-Nov-1997: new methods and class variables.
// M.G. Pia, 2 Oct 1998: modified GetFermiMomentum (original design was
// the source of memory leaks)
// This class G4LayeredNucleus by T. Lampen 14.6.2000
#ifndef G4LayeredNucleus_h
#define G4LayeredNucleus_h 1
#include "G4Nucleus.hh"
class G4LayeredNucleus : public G4Nucleus
{
public:
G4LayeredNucleus() : G4Nucleus()
{
}
G4LayeredNucleus( const G4double A, const G4double Z ) : G4Nucleus ( A, Z )
{
}
G4LayeredNucleus( const G4Material *aMaterial ) : G4Nucleus ( aMaterial )
{
}
G4ThreeVector GetMomentum();
void SetMomentum(const G4ThreeVector& mom);
private:
G4ThreeVector momentumVector;
};
#endif
@@ -0,0 +1,56 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
//
// Modified version of the G4Nucleus class by T. Lampen, HIP, June 2000
// original G4Nucleusby H.P. Wellisch
// modified by J.L. Chuma, TRIUMF, 19-Nov-1996
// last modified: 27-Mar-1997
// J.P.Wellisch: 23-Apr-97: minor simplifications
// modified by J.L.Chuma 24-Jul-97 to set the total momentum in Cinema and
// EvaporationEffects
// modified by J.L.Chuma 21-Oct-97 put abs() around the totalE^2-mass^2
// in calculation of total momentum in
// Cinema and EvaporationEffects
// Chr. Volcker, 10-Nov-1997: new methods and class variables.
// HPW added utilities for low energy neutron transport. (12.04.1998)
// M.G. Pia, 2 Oct 1998: modified GetFermiMomentum to avoid memory leaks
#include "G4LayeredNucleus.hh"
#include "Randomize.hh"
G4ThreeVector G4LayeredNucleus::GetMomentum()
{
return momentumVector;
}
void G4LayeredNucleus::SetMomentum( const G4ThreeVector& mom )
{
momentumVector = mom;
}
/* end of file */
@@ -0,0 +1,18 @@
# --------------------------------------------------------------
# GNUmakefile for chips library. HPW 20-Nov-99
# --------------------------------------------------------------
name := G4hadronic_chips
SUBDIRS = body
SUBDIRS += interface
SUBLIBS = G4hadronic_body_ci
SUBLIBS += G4hadronic_interface_ci
ifndef G4INSTALL
G4INSTALL = ../../../../..
endif
include $(G4INSTALL)/config/globlib.gmk
@@ -0,0 +1,32 @@
# -----------------------------------------------------------
# GNUmakefile for chips granular library. HPW 20-Nov-99
# -----------------------------------------------------------
name := G4hadronic_body_ci
ifndef G4INSTALL
G4INSTALL = ../../../../../..
endif
include $(G4INSTALL)/config/architecture.gmk
CPPFLAGS += -I$(G4BASE)/global/management/include \
-I$(G4BASE)/global/HEPRandom/include \
-I$(G4BASE)/global/HEPGeometry/include \
-I$(G4BASE)/track/include \
-I$(G4BASE)/geometry/volumes/include \
-I$(G4BASE)/geometry/management/include \
-I$(G4BASE)/processes/management/include \
-I$(G4BASE)/processes/hadronic/management/include/ \
-I$(G4BASE)/processes/hadronic/util/include \
-I$(G4BASE)/processes/hadronic/cross_sections/include/ \
-I$(G4BASE)/processes/hadronic/models/generator/util/include \
-I$(G4BASE)/particles/management/include \
-I$(G4BASE)/particles/leptons/include \
-I$(G4BASE)/particles/bosons/include \
-I$(G4BASE)/particles/hadrons/mesons/include \
-I$(G4BASE)/particles/hadrons/barions/include \
-I$(G4BASE)/particles/hadrons/ions/include \
-I$(G4BASE)/materials/include
include $(G4INSTALL)/config/common.gmk
@@ -0,0 +1,47 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4Chips.hh,v 1.10 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4Chips ----------------
// by Mikhail Kossov, September 1999.
// namespace for constants of the CHIPS Model
// ------------------------------------------------------------
#ifndef G4Chips_h
#define G4Chips_h 1
// >>> D O E S N O T W O R K - N O T U S E D N O W <<<
// Instead the "static const G4double" are used in the member functions
namespace G4Chips
{
// To have 3 quarks in Nucleon Temperature should be < M_N/4 (234 MeV)
const G4double Temperature = 200.; // Temperature of Quasmon (constant of the model)
}
// Now the same constants or types should be made global (if it is necessary)
//
const double& G4Chips::Temperature Temperature;
// typedef G4Chips::NewType Newtype;
@@ -0,0 +1,84 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QCHIPSWorld.hh,v 1.10 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCHIPSWorld ----------------
// by Mikhail Kossov, Sept 1999.
// class header for CHIPS World of particles in CHIPS Model
// ------------------------------------------------------------
#ifndef G4QCHIPSWorld_h
#define G4QCHIPSWorld_h 1
#include "g4std/iostream"
#include "globals.hh"
#include "G4QParticleVector.hh"
class G4QCHIPSWorld
{
public:
// Constructors
G4QCHIPSWorld(G4int nOfParts = 0); // Construction with N particles
G4QCHIPSWorld(const G4QCHIPSWorld& right); // Copy Constructor by value
G4QCHIPSWorld(G4QCHIPSWorld* right); // Copy Constructor by pointer
~G4QCHIPSWorld(); // Destructor
// Overloaded Operators
const G4QCHIPSWorld& operator=(const G4QCHIPSWorld& right);
// Selectors
G4QParticle* GetQParticle(G4int PDG) const; // Get pointer to particle in CHIPS World
G4QParticle* GetQParticle(G4QPDGCode QPDG) const; // Get pointer to particle in CHIPS World
G4QParticle* GetQParticle(G4QPDGCode* pQP) const; // Get pointer to particle in CHIPS World
G4int GetQPEntries() const; // Get a#of particles in CHIPS World
private:
G4QParticleVector* InitCHIPSWorld(G4int nOfParts);// nOfParts<0 kills the CHIPS World @@??
// Body
private:
G4QParticleVector* qWorld; // Pointer to the CHIPS World (C++ Hip)
};
inline G4QParticle* G4QCHIPSWorld::GetQParticle(G4int PDG) const
{
return (*qWorld)[G4QPDGCode(PDG).GetQCode()];
}
inline G4QParticle* G4QCHIPSWorld::GetQParticle(G4QPDGCode QPDG) const
{
return (*qWorld)[QPDG.GetQCode()];
}
inline G4QParticle* G4QCHIPSWorld::GetQParticle(G4QPDGCode* pQP) const
{
return (*qWorld)[pQP->GetQCode()];
}
inline G4int G4QCHIPSWorld::GetQPEntries() const {return (*qWorld).size();}
#endif
@@ -0,0 +1,136 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QCandidate.hh,v 1.13 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidate ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Quasmon initiated Candidates used by the CHIPS Model
// ----------------------------------------------------------------------
#ifndef G4QCandidate_h
#define G4QCandidate_h 1
#include "G4QHadron.hh"
#include "G4QParentClusterVector.hh"
#include "g4std/algorithm"
class G4QCandidate : public G4QHadron
{
public:
G4QCandidate(); // Default Constructor
G4QCandidate(G4int PDGcode); // Constructor by PDG Code
G4QCandidate(const G4QCandidate& right); // Copy Constructor by value
G4QCandidate(G4QCandidate* right); // Copy Constructor by pointer
~G4QCandidate(); // Destructor
// Overloaded Operators
const G4QCandidate& operator=(const G4QCandidate& right);
G4int operator==(const G4QCandidate &right) const;
G4int operator!=(const G4QCandidate &right) const;
// Specific Selectors
G4QParentCluster* TakeParClust(G4int nPC);// Get pointer to Parent Cluster from ParClastVector
G4int GetPClustEntries() const; // Get a number of Parent Clusters in ParClastVector
G4bool GetPossibility() const; // Get possibility(true)/forbiding(false) to be a hadr./fragm.
G4bool GetParPossibility() const; // Get possibility(true)/forbiding(false) to be a parent
G4double GetKMin() const; // Get k-minimal for the candidate
G4double GetEBMass() const; // Get bound mass in respect to Environment
G4double GetNBMass() const; // Get bound mass in respect to TotalNucleus
G4double GetDenseProbability() const; // Get dense-probability for the candidate
G4double GetPreProbability() const; // Get pre-probability for the candidate
G4double GetRelProbability() const; // Get the relative probility of hadronization
G4double GetIntegProbability() const; // Get integrated probability for randomization
G4double GetSecondRelProb() const; // Get 2nd relative probility of hadronization
G4double GetSecondIntProb() const; // Get 2nd integ. probability for randomization
// Specific Modifiers
void ClearParClustVector(); // Clear the Parent Claster Vector of the Candidate
void FillPClustVec(G4QParentCluster* pCl);// Fill pointer to Parent Cluster in ParClastVector
void SetPossibility(G4bool choice); // Set possibility(true)/forbiding(false) to be a hadr./fragm.
void SetParPossibility(G4bool choice); // Set possibility(true)/forbiding(false) to be a parent
void SetKMin(G4double kmin); // Set k-minimal for the candidate
void SetDenseProbability(G4double prep); // Set dense-probability for the candidate
void SetPreProbability(G4double prep); // Set pre-probability for the candidate
void SetRelProbability(G4double relP); // Set the relative probility of hadronization
void SetIntegProbability(G4double intP); // Set integrated probability for randomization
void SetSecondRelProb(G4double relP); // Set 2nd relative probility of hadronization
void SetSecondIntProb(G4double intP); // Set 2nd integr. probability for randomization
void SetEBMass(G4double newMass); // Set mass bounded to Environment
void SetNBMass(G4double newMass); // Set mass bounded to Total Nucleus
// Body
private:
G4bool possible; // permission/forbiding preFlag to be a hadron/fragment
G4bool parPossible; // permission/forbiding preFlag to be a parent
G4double kMin; // mu^2/2M (Q-case), ~BindingEnergy (Clust.-case)
G4double denseProbability; // a#of clusters of the type in dense region
G4double preProbability; // a#of clusters of the type or Q-suppression
G4double relativeProbability; // relative probability of hadronization
G4double integralProbability; // integrated probability of randomization
G4double secondRelProbability; // spare relative probability of hadronization
G4double secondIntProbability; // spare integrated probability of randomization
G4QParentClusterVector thePClusters; // vector of parent clusters for candid.-fragment
G4double EBMass; // Bound Mass of the cluster in the Environment
G4double NBMass; // Bound Mass of the cluster in the Total Nucleus
};
inline G4int G4QCandidate::operator==(const G4QCandidate &right) const {return this==&right;}
inline G4int G4QCandidate::operator!=(const G4QCandidate &right) const {return this!=&right;}
inline G4QParentCluster* G4QCandidate::TakeParClust(G4int nPC) {return thePClusters[nPC];}
inline G4int G4QCandidate::GetPClustEntries() const {return thePClusters.size();}
inline G4bool G4QCandidate::GetPossibility() const {return possible;}
inline G4bool G4QCandidate::GetParPossibility() const {return parPossible;}
inline G4double G4QCandidate::GetKMin() const {return kMin;}
inline G4double G4QCandidate::GetEBMass() const {return EBMass;}
inline G4double G4QCandidate::GetNBMass() const {return NBMass;}
inline G4double G4QCandidate::GetDenseProbability() const {return denseProbability;}
inline G4double G4QCandidate::GetPreProbability() const {return preProbability;}
inline G4double G4QCandidate::GetRelProbability() const {return relativeProbability;}
inline G4double G4QCandidate::GetIntegProbability() const {return integralProbability;}
inline G4double G4QCandidate::GetSecondRelProb() const {return secondRelProbability;}
inline G4double G4QCandidate::GetSecondIntProb() const {return secondIntProbability;}
inline void G4QCandidate::ClearParClustVector()
{
G4std::for_each(thePClusters.begin(), thePClusters.end(), DeleteQParentCluster());
thePClusters.clear();
}
inline void G4QCandidate::FillPClustVec(G4QParentCluster* pCl)
{
G4QParentCluster* npCl = new G4QParentCluster(pCl);
thePClusters.push_back(npCl); // Fill new instance of PCl
}
inline void G4QCandidate::SetPossibility(G4bool choice) {possible=choice;}
inline void G4QCandidate::SetParPossibility(G4bool choice) {parPossible=choice;}
inline void G4QCandidate::SetKMin(G4double kmin) {kMin=kmin;}
inline void G4QCandidate::SetDenseProbability(G4double prep) {denseProbability=prep;}
inline void G4QCandidate::SetPreProbability(G4double prep) {preProbability=prep;}
inline void G4QCandidate::SetRelProbability(G4double relP) {relativeProbability=relP;}
inline void G4QCandidate::SetIntegProbability(G4double intP) {integralProbability=intP;}
inline void G4QCandidate::SetSecondRelProb(G4double relP) {secondRelProbability=relP;}
inline void G4QCandidate::SetSecondIntProb(G4double intP) {secondIntProbability=intP;}
inline void G4QCandidate::SetEBMass(G4double newM) {EBMass=newM;}
inline void G4QCandidate::SetNBMass(G4double newM) {NBMass=newM;}
#endif
@@ -0,0 +1,41 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QCandidateVector.hh,v 1.11 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidateVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type defenition for Quasmon initiated Candidates used by CHIPS model
// -----------------------------------------------------------------
#ifndef G4QCandidateVector_h
#define G4QCandidateVector_h 1
#include "G4QCandidate.hh"
#include "g4std/vector"
typedef G4std::vector<G4QCandidate *> G4QCandidateVector;
struct DeleteQCandidate{ void operator()(G4QCandidate * aQ){delete aQ;}};
#endif
@@ -0,0 +1,112 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QChipolino.hh,v 1.9 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QChipolino ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Chipolino (Double Hadron) in CHIPS Model
// ----------------------------------------------------------
#ifndef G4QChipolino_h
#define G4QChipolino_h 1
#include "globals.hh"
//#include "G4QContent.hh"
#include "G4QPDGCode.hh"
class G4QChipolino
{
public:
// Constructors
G4QChipolino(); // Default Constructor
G4QChipolino(G4QContent& QContent); // Construction by Quark Content
G4QChipolino(const G4QChipolino& right); // Copy constructor by value
G4QChipolino(G4QChipolino* right); // Copy constructor by pointer
~G4QChipolino(); // Destructor
// Operators
const G4QChipolino& operator=(const G4QChipolino& right);
G4int operator==(const G4QChipolino& right) const;
G4int operator!=(const G4QChipolino& right) const;
// Selectors
G4double GetMass(); // Get mass of the Chipolino (MinDoubleHadronMass)
G4double GetMass2(); // Get mass^2 of the Chipolino
G4QPDGCode GetQPDG1(); // Get 1-st QPDG of the Chipolino
G4QPDGCode GetQPDG2(); // Get 2-nd QPDG of the Chipolino
G4QContent GetQContent() const; // Get private quark content of the Chipolino
G4QContent GetQContent1() const; // Get 1-st quark content of the Chipolino
G4QContent GetQContent2() const; // Get 2-st quark content of the Chipolino
// Modifiers
void SetHadronQPDG(const G4QPDGCode& QPDG); // Set QPDG of 1-st Hadron of the Chipolino
void SetHadronPDGCode(const G4int& PDGCode);// Set PDGCode of 1-st Hadron of the Chipolino
void SetHadronQCont(const G4QContent& QC); // Set QContent of 1-st Hadron of the Chipolino
private:
G4QPDGCode theQPDG1; // QPDG of the 1-st Hadron of the Chipolino
G4QPDGCode theQPDG2; // QPDG of the 2-nd Hadron of the Chipolino
G4QContent theQCont; // Quark Content of the whole Chipolino
G4QContent theQCont1; // Quark Content of the 1-st Hadron of Chipolino
G4double minM; // Minimal Mass of Chipolino
};
G4std::ostream& operator<<(G4std::ostream& lhs, G4QChipolino& rhs);
//G4std::ostream& operator<<(G4std::ostream& lhs, const G4QChipolino& rhs);
inline G4int G4QChipolino::operator==(const G4QChipolino& right) const {return this==&right;}
inline G4int G4QChipolino::operator!=(const G4QChipolino& right) const {return this!=&right;}
inline G4double G4QChipolino::GetMass() {return minM;}
inline G4double G4QChipolino::GetMass2() {return minM*minM;}
inline G4QPDGCode G4QChipolino::GetQPDG1() {return theQPDG1;}
inline G4QPDGCode G4QChipolino::GetQPDG2() {return theQPDG2;}
inline G4QContent G4QChipolino::GetQContent1() const {return theQCont1;}
inline G4QContent G4QChipolino::GetQContent2() const {return theQCont - theQCont1;}
inline G4QContent G4QChipolino::GetQContent() const {return theQCont;}
inline void G4QChipolino::SetHadronQPDG(const G4QPDGCode& newQPDG)
{
theQPDG1 = newQPDG;
theQCont1 = theQPDG1.GetQuarkContent();
G4QContent theQCont2 = theQCont - theQCont1;
theQPDG2 = G4QPDGCode(theQCont2.GetSPDGCode());
}
inline void G4QChipolino::SetHadronPDGCode(const G4int& PDGCode)
{
theQPDG1.SetPDGCode(PDGCode);
SetHadronQPDG(theQPDG1);
}
inline void G4QChipolino::SetHadronQCont(const G4QContent& QCont)
{SetHadronPDGCode(QCont.GetSPDGCode());}
#endif
@@ -0,0 +1,317 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QContent.hh,v 1.14 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QContent ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Quasmon initiated Contents used by the CHIPS Model
// ----------------------------------------------------------------------
#ifndef G4QContent_h
#define G4QContent_h 1
#include "g4std/iostream"
#include "globals.hh"
#include "Randomize.hh"
class G4QContent
{
public:
G4QContent(G4int d=0, G4int u=0, G4int s=0, G4int ad=0, G4int au=0, G4int as=0);
G4QContent(const G4QContent& rhs); // Copy constructor by value
G4QContent(G4QContent* rhs); // Copy constructor by pointer
~G4QContent();
// Overloaded operators
const G4QContent& operator=(const G4QContent& rhs);
G4int operator==(const G4QContent& rhs) const;
G4int operator!=(const G4QContent& rhs) const;
G4QContent operator+=(G4QContent& rhs);
G4QContent operator-=(G4QContent& rhs);
G4QContent operator*=(G4int& rhs);
G4QContent operator+=(const G4QContent& rhs);
G4QContent operator-=(const G4QContent& rhs);
G4QContent operator*=(const G4int& rhs);
// Selectors
G4int GetCharge() const;
G4int GetBaryonNumber() const;
G4int GetStrangeness() const;
G4int GetSPDGCode() const;
G4int GetZNSPDGCode() const;
G4int NOfCombinations(const G4QContent& rhs) const; //@@ can be an "operator/"
G4int GetQ() const;
G4int GetAQ() const;
G4int GetTot() const;
G4bool CheckNegative() const;
G4int GetP() const; // A#of protons
G4int GetN() const; // A#of neutrons
G4int GetL() const; // A#of lambdas
G4int GetAP() const; // A#of anti-protons
G4int GetAN() const; // A#of anti-neutrons
G4int GetAL() const; // A#of anti-lambdas
G4int GetD() const; // A#of d-quarks
G4int GetU() const; // A#of u-quarks
G4int GetS() const; // A#of s-quarks
G4int GetAD() const; // A#of anti-d-quarks
G4int GetAU() const; // A#of anti-u-quarks
G4int GetAS() const; // A#of anti-s-quarks
G4int GetNetD() const; // A net#of d-quarks
G4int GetNetU() const; // A net#of u-quarks
G4int GetNetS() const; // A net#of s-quarks
G4int GetNetAD() const; // A net#of anti-d-quarks
G4int GetNetAU() const; // A net#of anti-u-quarks
G4int GetNetAS() const; // A net#of anti-s-quarks
G4int GetDD() const; // A#of dd-di-quarks
G4int GetUU() const; // A#of uu-di-quarks
G4int GetSS() const; // A#of ss-di-quarks
G4int GetUD() const; // A#of ud-di-quarks
G4int GetDS() const; // A#of ds-di-quarks
G4int GetUS() const; // A#of us-di-quarks
G4int GetADAD() const; // A#of anti-dd-di-quarks
G4int GetAUAU() const; // A#of anti-uu-di-quarks
G4int GetASAS() const; // A#of anti-ss-di-quarks
G4int GetAUAD() const; // A#of anti-ud-di-quarks
G4int GetADAS() const; // A#of anti-ds-di-quarks
G4int GetAUAS() const; // A#of anti-us-di-quarks
// Modifiers
void Anti();
G4QContent IndQ (G4int ind=0);
G4QContent IndAQ(G4int ind=0);
G4QContent SplitChipo(G4double mQ);
G4bool SubtractHadron(G4QContent h);
G4bool SubtractPi0();
G4bool SubtractPion();
G4bool SubtractKaon(G4double mQ);
void SetD (G4int n=0);
void SetU (G4int n=0);
void SetS (G4int n=0);
void SetAD(G4int n=0);
void SetAU(G4int n=0);
void SetAS(G4int n=0);
void IncD (G4int n=1);
void IncU (G4int n=1);
void IncS (G4int n=1);
void IncAD(G4int n=1);
void IncAU(G4int n=1);
void IncAS(G4int n=1);
void IncQAQ(const G4int& nQAQ=1, const G4double& sProb = 1.);
void DecD (G4int n=1);
void DecU (G4int n=1);
void DecS (G4int n=1);
void DecAD(G4int n=1);
void DecAU(G4int n=1);
void DecAS(G4int n=1);
G4int DecQAQ(const G4int& nQAQ=1);
private:
G4QContent GetThis() const;
// Body
private: // C S
G4int nD; // a#of d-quarks (-1/3)( 0)
G4int nU; // a#of u-quarks (+2/3)( 0)
G4int nS; // a#of s-quarks (-1/3)(+1)
G4int nAD; // a#of anti-d-quarks (+1/3)( 0)
G4int nAU; // a#of anti-u-quarks (-2/3)( 0)
G4int nAS; // a#of anti-s-quarks (+1/3)(-1)
};
// Not member operators
G4std::ostream& operator<<(G4std::ostream& lhs, G4QContent& rhs);
G4std::ostream& operator<<(G4std::ostream& lhs, const G4QContent& rhs);
G4QContent operator+(const G4QContent& lhs, const G4QContent& rhs);
G4QContent operator-(const G4QContent& lhs, const G4QContent& rhs);
G4QContent operator*(const G4QContent& lhs, const G4int& rhs);
G4QContent operator*(const G4int& lhs, const G4QContent& rhs);
//G4int operator/(const G4QContent& lhs, const G4QContent& rhs); // Combinations
// Not member functions
//----------------------------------------------------------------------------------------
inline G4int G4QContent::operator==(const G4QContent& rhs) const {return this==&rhs;}
inline G4int G4QContent::operator!=(const G4QContent& rhs) const {return this!=&rhs;}
inline G4int G4QContent::GetQ() const {return nU+nD+nS;}
inline G4int G4QContent::GetAQ() const {return nAU+nAD+nAS;}
inline G4int G4QContent::GetTot() const {return nU+nD+nS+nAU+nAD+nAS;}
inline G4int G4QContent::GetStrangeness() const {return nS-nAS;}
// @@ Temporary for tests
inline G4bool G4QContent::CheckNegative() const{return nU<0||nD<0||nS<0||nAU<0||nAD<0||nAS<0;}
inline G4int G4QContent::GetU() const{return nU;}
inline G4int G4QContent::GetD() const{return nD;}
inline G4int G4QContent::GetS() const{return nS;}
inline G4int G4QContent::GetAU() const{return nAU;}
inline G4int G4QContent::GetAD() const{return nAD;}
inline G4int G4QContent::GetAS() const{return nAS;}
inline G4int G4QContent::GetNetU() const{return nU-nAU;}
inline G4int G4QContent::GetNetD() const{return nD-nAD;}
inline G4int G4QContent::GetNetS() const{return nS-nAS;}
inline G4int G4QContent::GetNetAU() const{return nAU-nU;}
inline G4int G4QContent::GetNetAD() const{return nAD-nD;}
inline G4int G4QContent::GetNetAS() const{return nAS-nS;}
inline G4int G4QContent::GetUU() const{return nU*(nU-1)/2;}
inline G4int G4QContent::GetDD() const{return nD*(nD-1)/2;}
inline G4int G4QContent::GetSS() const{return nS*(nS-1)/2;}
inline G4int G4QContent::GetUD() const{return nU*nD;}
inline G4int G4QContent::GetUS() const{return nU*nS;}
inline G4int G4QContent::GetDS() const{return nD*nS;}
inline G4int G4QContent::GetAUAU() const{return nAU*(nAU-1)/2;}
inline G4int G4QContent::GetADAD() const{return nAD*(nAD-1)/2;}
inline G4int G4QContent::GetASAS() const{return nAS*(nAS-1)/2;}
inline G4int G4QContent::GetAUAD() const{return nAU*nAD;}
inline G4int G4QContent::GetAUAS() const{return nAU*nAS;}
inline G4int G4QContent::GetADAS() const{return nAD*nAS;}
// Convert particle to anti-particle
inline G4int G4QContent::GetZNSPDGCode() const
{
G4int kD=nD-nAD; // A net # of d quarks
G4int kU=nU-nAU; // A net # of u quarks
G4int kS=nS-nAS; // A net # of s quarks
// if(kD>=0&&kU>=0&&kS>=0&&kD+kU+kS>0) // => "Normal nucleus" case
//{
// G4int b=(kU+kD-kS-kS)/3;
// G4int d=kU-kD;
// G4int n=(b-d)/2;
// return 90000000+1000*(1000*kS+n+d)+n;
//}
//else if(kD<=0&&kU<=0&&kS<=0&&kD+kU+kS<0) // => "Normal anti-nucleus" case
//{
// G4int b=(kS+kS-kD-kU)/3;
// G4int d=kD-kU;
// G4int n=(b-d)/2;
// return -90000000-1000*(1000*kS+n+d)-n; // @@ double notation for anti-nuclei
//}
//else
//{
G4int b=(kU+kD-kS-kS)/3; // Baryon number-n*{LAMBDA=kS)
G4int d=kU-kD; // Isotopic shift
G4int n=(b-d)/2; // A#of neutrons
return 90000000+1000*(1000*kS+n+d)+n;
//}
//return 0;
}
// Convert particle to anti-particle
inline void G4QContent::Anti()
{
G4int r=nD;
nD = nAD;
nAD= r;
r = nU;
nU = nAU;
nAU= r;
r = nS;
nS = nAS;
nAS= r;
}
// Add Quark Content
inline G4QContent G4QContent::operator+=(const G4QContent& rhs)
// =======================================================
{
nD += rhs.nD;
nU += rhs.nU;
nS += rhs.nS;
nAD+= rhs.nAD;
nAU+= rhs.nAU;
nAS+= rhs.nAS;
return *this;
}
// Add Quark Content
inline G4QContent G4QContent::operator+=(G4QContent& rhs)
// =======================================================
{
nD += rhs.nD;
nU += rhs.nU;
nS += rhs.nS;
nAD+= rhs.nAD;
nAU+= rhs.nAU;
nAS+= rhs.nAS;
return *this;
}
// Multiply Quark Content by integer number
inline G4QContent G4QContent::operator*=(const G4int& rhs)
// ===================================================
{
nU *= rhs;
nD *= rhs;
nS *= rhs;
nAU*= rhs;
nAD*= rhs;
nAS*= rhs;
return *this;
}
// Multiply Quark Content by integer number
inline G4QContent G4QContent::operator*=(G4int& rhs)
// ===================================================
{
nU *= rhs;
nD *= rhs;
nS *= rhs;
nAU*= rhs;
nAD*= rhs;
nAS*= rhs;
return *this;
}
inline void G4QContent::SetU(G4int n) {nU=n;}
inline void G4QContent::SetD(G4int n) {nD=n;}
inline void G4QContent::SetS(G4int n) {nS=n;}
inline void G4QContent::SetAU(G4int n){nAU=n;}
inline void G4QContent::SetAD(G4int n){nAD=n;}
inline void G4QContent::SetAS(G4int n){nAS=n;}
inline void G4QContent::IncU(G4int n) {nU+=n;}
inline void G4QContent::IncD(G4int n) {nD+=n;}
inline void G4QContent::IncS(G4int n) {nS+=n;}
inline void G4QContent::IncAU(G4int n){nAU+=n;}
inline void G4QContent::IncAD(G4int n){nAD+=n;}
inline void G4QContent::IncAS(G4int n){nAS+=n;}
inline void G4QContent::DecU(G4int n) {nU-=n;}
inline void G4QContent::DecD(G4int n) {nD-=n;}
inline void G4QContent::DecS(G4int n) {nS-=n;}
inline void G4QContent::DecAU(G4int n){nAU-=n;}
inline void G4QContent::DecAD(G4int n){nAD-=n;}
inline void G4QContent::DecAS(G4int n){nAS-=n;}
// Private member functions
inline G4QContent G4QContent::GetThis()const{return G4QContent(nD,nU,nS,nAD,nAU,nAS);}
#endif
@@ -0,0 +1,94 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QDecayChan.hh,v 1.9 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QDecayChan ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Decay Channel definition in CHIPS Model
// ------------------------------------------------------------
#ifndef G4QDecayChan_h
#define G4QDecayChan_h 1
#include "g4std/iostream"
#include "globals.hh"
#include "G4QPDGCodeVector.hh"
class G4QDecayChan
{
public:
// Constructors
G4QDecayChan(); // Default Constructor
G4QDecayChan(G4QPDGCodeVector secHadr, G4double probLimit = 1.); // General Constructor
G4QDecayChan(G4double pLev, G4int PDG1, G4int PDG2, G4int PDG3=0); // Detailed Constructor
G4QDecayChan(const G4QDecayChan& right); // Copy Constructor by value
G4QDecayChan(G4QDecayChan* right); // Copy Constructor by pointer
~G4QDecayChan(); // Destructor
// Operators
const G4QDecayChan& operator=(const G4QDecayChan& right);
G4int operator==(const G4QDecayChan& rhs) const;
G4int operator!=(const G4QDecayChan& rhs) const;
// Selectors
G4double GetDecayChanLimit() const; // Get a Decay Channel Probability Limit
G4double GetMinMass() const; // Get a Minimum Mass for the Decay Channel
G4QPDGCodeVector GetVecOfSecHadrons(); // Get a Vector of secondary PDG-particles
// Modifiers
void SetDecayChanLimit(G4double newDecChanLim);// Set a Decay Channel Probability Limit
void SetMinMass(G4double newMinMass); // Set a Minimum Mass for the Decay Channel
void SetVecOfSecHadrons(G4QPDGCodeVector hadV);// Set a Vector of secondary PDG-particles
//private:
// Encapsulated functions
private:
// the Body
G4double aDecayChanLimit;
G4double theMinMass;
G4QPDGCodeVector aVecOfSecHadrons;
};
// Not member operators
G4std::ostream& operator<<(G4std::ostream& lhs, G4QDecayChan& rhs);
//----------------------------------------------------------------------------------------
inline G4int G4QDecayChan::operator==(const G4QDecayChan& rhs) const {return this==&rhs;}
inline G4int G4QDecayChan::operator!=(const G4QDecayChan& rhs) const {return this!=&rhs;}
inline G4double G4QDecayChan::GetDecayChanLimit() const {return aDecayChanLimit;}
inline G4double G4QDecayChan::GetMinMass() const {return theMinMass;}
inline G4QPDGCodeVector G4QDecayChan::GetVecOfSecHadrons() {return aVecOfSecHadrons;}
inline void G4QDecayChan::SetDecayChanLimit(G4double DCL) {aDecayChanLimit=DCL;}
inline void G4QDecayChan::SetMinMass(G4double minMass) {theMinMass=minMass;}
inline void G4QDecayChan::SetVecOfSecHadrons(G4QPDGCodeVector VSH) {aVecOfSecHadrons=VSH;}
#endif
@@ -0,0 +1,41 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QDecayChanVector.hh,v 1.8 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidateVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type defenition for Decay Channel Vector in CHIPS model
// --------------------------------------------------------------
#ifndef G4QDecayChanVector_h
#define G4QDecayChanVector_h 1
#include "G4QDecayChan.hh"
#include "g4std/vector"
typedef G4std::vector<G4QDecayChan *> G4QDecayChanVector;
struct DeleteQDecayChan{void operator()(G4QDecayChan *aQ){delete aQ;}};
#endif
@@ -0,0 +1,107 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QEnvironment.hh,v 1.9 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QEnvironment ----------------
// by Mikhail Kossov, August 2000.
// header for Multy Quasmon Environment in the CHIPS Model
// ------------------------------------------------------------
#ifndef G4QEnvironment_h
#define G4QEnvironment_h 1
// Standard G4-headers
#include "G4QuasmonVector.hh"
class G4QEnvironment
{
public:
G4QEnvironment(const G4QHadronVector& projHadrons, const G4int targPDG);
G4QEnvironment(const G4QEnvironment& right); // copy QEnvironment by value
G4QEnvironment(G4QEnvironment* right); // copy QEnvironment by pointer
~G4QEnvironment();
// Overloaded operators
const G4QEnvironment& operator=(const G4QEnvironment& right);
int operator==(const G4QEnvironment &right) const;
int operator!=(const G4QEnvironment &right) const;
//Selectors
G4QNucleus GetEnvironment() const;
G4QuasmonVector* GetQuasmons();
G4QHadronVector* GetQHadrons();
G4QHadronVector* Fragment(); // Unresp. wrapper for HadronizeQEnvironment()
// Static functions
static void SetParameters( G4double solAn=0.4, G4bool efFlag=false, G4double piThresh=141.4,
G4double mpisq=20000., G4double dinum=1880.);
// General functions
G4ThreeVector RndmDir(); // Randomize 3D direction (@@subst by libFunc)
private:
G4QHadronVector HadronizeQEnvironment(); // Main HadronizationFunction used in Fragment
void CreateQuasmon(const G4QContent& projQC, const G4LorentzVector& proj4M);
void InitClustersVector(G4int maxC, G4int maxA); // Init.NucCclusters for 1st interact
void CleanUp(); // Makes theEnvironment=vacuum & kill Quasmons
void PrepareInteractionProbabilities(const G4QContent& projQC, G4double AP);
void EvaporateResidual(G4QHadron* evap, G4bool corFlag = false);// Final Evaporation
void DecayDibaryon(G4QHadron* dB); // Decay of any di-baryon (deuteron is kept)
void DecayThreeBaryon(G4QHadron* dB); // Decay of ppp, nnn or LLL states
void DecayAntiStrange(G4QHadron* dB); // Decay of the nucleus, containing K+/K0
void DecayAlphaBar(G4QHadron* dB); // Decay of alpha+p or alpha+n states
void DecayAlphaDiN(G4QHadron* dB); // Decay of alpha+p+p states
void DecayAlphaAlpha(G4QHadron* dB); // Decay of alpha+alpha state
G4bool CheckGroundState(G4Quasmon* quasm, G4bool corFlag = false);// as G4Q for TotHadrV
G4bool DecayInEnvQ(G4Quasmon* quasm); // Use befor evaporation in PANIC case
// Body
private:
// Static Parameters
static G4bool EnergyFlux; // Flag for Energy Flux use instead of Multy Quasmon
static G4double SolidAngle; // Part of Solid Angle to capture secondaries (@@A-dep)
static G4double PiPrThresh; // Pion Production Threshold for gammas
static G4double M2ShiftVir; // Shift for M2=-Q2=m_pi^2 of the virtual gamma
static G4double DiNuclMass; // Double Nucleon Mass for virtual normalization
// Output hadrons
G4QHadronVector theQHadrons; // Vector of generated secondary hadrons
// Internal working parameters
G4QCHIPSWorld theWorld; // the CHIPS World
G4int nBarClust; // Maximum barion number of clusters (Calc. @ Interaction)
G4double f2all; // Ratio of free nucleons to free+dense nucleons (do we need it in Quasmon?)
G4QuasmonVector theQuasmons; // Intermediate vector of Quasmons before fragmentation (***delete***)
G4QCandidateVector theQCandidates; // Vector of possible candidates to clusters (***delete***)
G4QNucleus theEnvironment; // Initial Nucleus & later Residual Nuclear Environment
G4LorentzVector tot4Mom; // Total 4-momentum in the reaction
};
inline int G4QEnvironment::operator==(const G4QEnvironment &right) const {return this == &right;}
inline int G4QEnvironment::operator!=(const G4QEnvironment &right) const {return this != &right;}
inline G4QNucleus G4QEnvironment::GetEnvironment() const {return theEnvironment;}
#endif
@@ -0,0 +1,192 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QHadron.hh,v 1.15 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QHadron ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Hadrons generated by the CHIPS Model
// ------------------------------------------------------
#ifndef G4QHadron_h
#define G4QHadron_h 1
#include "globals.hh"
#include "G4ThreeVector.hh"
#include "G4LorentzVector.hh"
#include "Randomize.hh"
#include "G4QParticle.hh"
class G4QHadron
{
public:
// Constructors
G4QHadron(); // Default Constructor
G4QHadron(G4LorentzVector p); // Kinematical Constructor
G4QHadron(G4int PDGcode, G4LorentzVector p=G4LorentzVector(0.,0.,0.,0.));// CHIPS World Hadron
G4QHadron(G4QPDGCode QPDG, G4LorentzVector p=G4LorentzVector(0.,0.,0.,0.));// CHIPS World Had.
G4QHadron(G4QContent QC, G4LorentzVector p=G4LorentzVector(0.,0.,0.,0.));// QC defined Hadron
G4QHadron(G4int PDG, G4double m, G4QContent QC); // Constructor for a Chipolino or a Quasmon
G4QHadron(G4QPDGCode QPDG, G4double m, G4QContent QC); // Con. for a Chipolino or a Quasmon
G4QHadron(G4int PDG, G4LorentzVector p, G4QContent QC);// Constructor for Chipolino or Quasmon
G4QHadron(G4QPDGCode QPDG, G4LorentzVector p, G4QContent QC);// Con. for Chipolino or Quasmon
G4QHadron(G4QParticle* pPart, G4double maxM); // Constructor for a resonance with RANDOM m
G4QHadron(const G4QHadron& right); // Copy constructor by object
G4QHadron(G4QHadron* right); // Copy constructor by pointer
~G4QHadron(); // Destructor
// Operators
const G4QHadron& operator=(const G4QHadron& right);
G4int operator==(const G4QHadron& right) const;
G4int operator!=(const G4QHadron& right) const;
// Selectors
G4int GetPDGCode() const; // Get PDG code of the Hadron
G4int GetQCode() const; // Get Q code of the Hadron
G4QPDGCode GetQPDG() const; // Get QPDG of the Hadron
G4LorentzVector Get4Momentum() const; // Get 4-mom of the Hadron
G4QContent GetQC() const; // Get private quark content
G4double GetMass() const; // Get a mass of the Hadron
G4double GetMass2() const; // Get an m^2 value for the Hadron
G4double GetWidth() const; // Get Width of Hadron
G4int GetNFragments() const; // Get a#of Fragments of this Hadron
G4int GetCharge() const; // Get Charge of the Hadron
G4int GetStrangeness() const; // Get Strangeness of the Hadron
G4int GetBaryonNumber() const; // Get Baryon Number of the Hadron
// Modifiers
void SetQPDG(const G4QPDGCode& QPDG); // Set QPDG of the Hadron
void Set4Momentum(const G4LorentzVector& aMom); // Set 4-mom of the Hadron
void SetQC(const G4QContent& newQC); // Set new private quark content
void SetNFragments(const G4int& nf); // Set a#of Fragments of this Hadron
void NegPDGCode();
void MakeAntiHadron(); // Make AntiHadron of this Hadron
// General
G4double RandomizeMass(G4QParticle* pPart, G4double maxM); // Randomize a mass value
G4bool TestRealNeutral();
G4bool DecayIn2(G4LorentzVector& f4Mom, G4LorentzVector& s4Mom);
G4bool CorMDecayIn2(G4double corM, G4LorentzVector& fr4Mom);//->This(new mass corM)+fr4Mom(correct)
G4bool CorEDecayIn2(G4double corE, G4LorentzVector& fr4Mom);//->This(E+=corE,P)+fr4Mom(fE-=corE,fP)
G4bool RelDecayIn2(G4LorentzVector& f4Mom, G4LorentzVector& s4Mom, G4LorentzVector& dir,
G4double maxCost, G4double minCost = -1.);
G4bool DecayIn3(G4LorentzVector& f4Mom, G4LorentzVector& s4Mom, G4LorentzVector& t4Mom);
private:
// Private methods
void DefineQC(G4int PDGCode);
private:
G4QPDGCode theQPDG; // Instance of QPDG for the Hadron
G4LorentzVector theMomentum; // The 4-mom of Hadron
G4QContent valQ; // QC ( @@ ?? for Quasmon and Chipolino)
G4int nFragm; // =0 - stable, =N - decayed in N particles
};
inline G4int G4QHadron::operator==(const G4QHadron &right) const {return this==&right;}
inline G4int G4QHadron::operator!=(const G4QHadron &right) const {return this!=&right;}
inline G4int G4QHadron::GetPDGCode() const {return theQPDG.GetPDGCode();}
inline G4int G4QHadron::GetQCode() const {return theQPDG.GetQCode();}
inline G4QPDGCode G4QHadron::GetQPDG() const {return theQPDG;}
inline G4QContent G4QHadron::GetQC() const {return valQ;}
inline G4LorentzVector G4QHadron::Get4Momentum() const {return theMomentum;}
inline G4int G4QHadron::GetNFragments() const {return nFragm;}
//@@ This is an example how to make other inline selectors for the 4-Momentum of the Hadron
inline G4double G4QHadron::GetMass() const {return theMomentum.m();}
inline G4double G4QHadron::GetMass2() const {return theMomentum.m2();}
//@@ This is an example how to make other inline selectors for the Hadron
inline G4int G4QHadron::GetCharge() const {return valQ.GetCharge();}
inline G4int G4QHadron::GetStrangeness() const {return valQ.GetStrangeness();}
inline G4int G4QHadron::GetBaryonNumber() const {return valQ.GetBaryonNumber();}
inline void G4QHadron::MakeAntiHadron() {if(TestRealNeutral()) NegPDGCode();}
inline void G4QHadron::SetQPDG(const G4QPDGCode& newQPDG)
{
theQPDG = newQPDG;
G4int PDG= newQPDG.GetPDGCode();
G4int Q = newQPDG.GetQCode();
//G4cout<<"G4QHadron::SetQPDG is called with PDGCode="<<PDG<<", QCode="<<Q<<G4endl;
if (Q>-1) valQ=theQPDG.GetQuarkContent();
else if(PDG>80000000)DefineQC(PDG);
else
{
G4cerr<<"***G4QHadron::SetQPDG: QPDG="<<newQPDG<<G4endl;
G4Exception("***G4QHadron::SetQPDG: Impossible QPDG");
}
}
inline void G4QHadron::SetQC(const G4QContent& newQC) {valQ=newQC;}
inline void G4QHadron::Set4Momentum(const G4LorentzVector& aMom) {theMomentum=aMom;}
inline void G4QHadron::SetNFragments(const G4int& nf) {nFragm=nf;}
inline void G4QHadron::NegPDGCode() {theQPDG.NegPDGCode(); valQ.Anti();}
inline G4bool G4QHadron::TestRealNeutral() { return theQPDG.TestRealNeutral();}
inline void G4QHadron::DefineQC(G4int PDGCode)
{
//G4cout<<"G4QHadron::DefineQC is called with PDGCode="<<PDGCode<<G4endl;
G4int szn=PDGCode-90000000;
G4int ds=0;
G4int dz=0;
G4int dn=0;
if(szn<-100000)
{
G4int ns=(-szn)/1000000+1;
szn+=ns*1000000;
ds+=ns;
}
else if(szn<-100)
{
G4int nz=(-szn)/1000+1;
szn+=nz*1000;
dz+=nz;
}
else if(szn<0)
{
G4int nn=-szn;
szn=0;
dn+=nn;
}
G4int sz =szn/1000;
G4int n =szn%1000;
if(n>700)
{
n-=1000;
dz--;
}
G4int z =sz%1000-dz;
if(z>700)
{
z-=1000;
ds--;
}
G4int Sq =sz/1000-ds;
G4int zns=z+n+Sq;
G4int Dq=n+zns;
G4int Uq=z+zns;
if (Dq<0&&Uq<0&&Sq<0)valQ=G4QContent(0 ,0 ,0 ,-Dq,-Uq,-Sq);
else if (Uq<0&&Sq<0) valQ=G4QContent(Dq,0 ,0 ,0 ,-Uq,-Sq);
else if (Dq<0&&Sq<0) valQ=G4QContent(0 ,Uq,0 ,-Dq,0 ,-Sq);
else if (Dq<0&&Uq<0) valQ=G4QContent(0 ,0 ,Sq,-Dq,-Uq,0 );
else if (Uq<0) valQ=G4QContent(Dq,0 ,Sq,0 ,-Uq,0 );
else if (Sq<0) valQ=G4QContent(Dq,Uq,0 ,0 ,0 ,-Sq);
else if (Dq<0) valQ=G4QContent(0 ,Uq,Sq,-Dq,0 ,0 );
else valQ=G4QContent(Dq,Uq,Sq,0 ,0 ,0 );
}
#endif
@@ -0,0 +1,41 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QHadronVector.hh,v 1.10 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidateVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type defenition for a Vector of Hadrons - output of CHIPS model
// ---------------------------------------------------------------
#ifndef G4QHadronVector_h
#define G4QHadronVector_h 1
#include "G4QHadron.hh"
#include "g4std/vector"
typedef G4std::vector<G4QHadron *> G4QHadronVector;
struct DeleteQHadron { void operator()(G4QHadron * aQ){delete aQ;}};
#endif
@@ -0,0 +1,212 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QNucleus.hh,v 1.12 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QNucleus ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Quasmon initiated Candidates used by the CHIPS Model
// ----------------------------------------------------------------------
#ifndef G4QNucleus_h
#define G4QNucleus_h 1
#include "G4QCandidateVector.hh"
class G4QNucleus : public G4QHadron
{
public:
G4QNucleus(); // Default Constructor
G4QNucleus(G4int nucPDG); // At Rest PDG-Constructor
G4QNucleus(G4LorentzVector p, G4int nucPDG); // Full PDG-Constructor
G4QNucleus(G4QContent nucQC); // At Rest QuarkCont-Constructor
G4QNucleus(G4QContent nucQC, G4LorentzVector p); // Full QuarkCont-Constructor
G4QNucleus(G4int z, G4int n, G4int s); // At Rest ZNS-Constructor
G4QNucleus(G4int z, G4int n, G4int s, G4LorentzVector p);// Full ZNS-Constructor
G4QNucleus(const G4QNucleus& right); // Copy Constructor by value
G4QNucleus(G4QNucleus* right); // Copy Constructor by pointer
~G4QNucleus(); // Destructor
// Overloaded Operators
const G4QNucleus & operator=(const G4QNucleus &right);
G4int operator==(const G4QNucleus &right) const;
G4int operator!=(const G4QNucleus &right) const;
// Specific Selectors
G4int GetPDG() const; // Get a PDG Code of the nucleus
G4int GetZ() const; // Get a#of protons
G4int GetN() const; // Get a#of neutrons
G4int GetS() const; // Get a#of lambdas
G4int GetA() const; // Get A of the nucleus
G4int GetDZ() const; // Get a#of protons in dense region
G4int GetDN() const; // Get a#of neutrons in dense region
G4int GetDS() const; // Get a#of lambdas in dense region
G4int GetDA() const; // Get A of the dense part of nucleus
G4int GetMaxClust() const; // Get Max BarNum of Clusters
G4double GetProbability(G4int bn=0) const; // probab. for the cluster with BarN
G4double GetMZNS() const; // Get GS mass of Nucleus(not H || Q)
G4double GetGSMass() const; // Get GS mass of Nucleus(not Hadron)
G4QContent GetQCZNS() const; // Get ZNS quark content of Nucleus
// Specific Modifiers
G4bool EvaporateBaryon(G4QHadron* h1,G4QHadron* h2); // Evaporate one Baryon from Nucleus
G4bool SplitBaryon(); // Is it possible to split a baryon/alpha
G4bool Split2Baryons(); // Is it possible to split two baryons?
void InitByPDG(G4int newPDG); // Init existing nucleus by new PDG
void InitByQC(G4QContent newQC); // Init existing nucleus by new QCont
void IncProbability(G4int bn); // Add one cluster to probability
void Increase(G4int PDG, G4LorentzVector LV = G4LorentzVector(0.,0.,0.,0.));
void Increase(G4QContent QC, G4LorentzVector LV = G4LorentzVector(0.,0.,0.,0.));
void Reduce(G4int PDG); // Reduce Nucleus by PDG fragment
void CalculateMass(); // Recalculate (calculate) the mass
void SetMaxClust(G4int maxC); // Set Max BarNum of Clusters
void PrepareCandidates(G4QCandidateVector& theQCandidates, G4bool piF, G4bool gaF);
G4int UpdateClusters(G4bool din); // Return a#of clusters & calc. probab's
G4QNucleus operator+=(const G4QNucleus& rhs); // Add a cluster to the nucleus
G4QNucleus operator-=(const G4QNucleus& rhs); // Subtract a cluster from a nucleus
G4QNucleus operator*=(const G4int& rhs); // Multiplication of the Nucleus
// Static functions
static void SetParameters(G4double fN, G4double fD, G4double cP, G4double mR=1.);
// Specific General Functions
G4int RandomizeBinom(G4double p,G4int N); // Randomize according to Binomial Law
G4double CoulombBarrier(const G4double& cZ, const G4double& cA, G4double dZ=0., G4double dA=0.);
G4double BindingEnergy(const G4double& cZ, const G4double& cA, G4double dZ=0., G4double dA=0.);
G4double CoulBarPenProb(const G4double& CB, const G4double& E, const G4int& C, const G4int& B);
private:
// Specific Encapsulated Functions
void SetZNSQC(G4int z, G4int n, G4int s); // Set QC, using Z,N,S
G4QNucleus GetThis() const; // @@ Check for memory leak
// Body
private:
// Static Parameters
static G4double freeNuc; // probability of the quasi-free baryon on surface
static G4double freeDib; // probability of the quasi-free dibaryon on surface
static G4double clustProb; // clusterization probability in dense region
static G4double mediRatio; // relative vacuum hadronization probability
// The basic
G4int Z; // Z of the Nucleus
G4int N; // N of the Nucleus
G4int S; // S of the Nucleus
// The secondaries
G4int dZ; // Z of the dense region of the nucleus
G4int dN; // N of the dense region of the nucleus
G4int dS; // S of the dense region of the nucleus
G4int maxClust; // Baryon Number of the last calculated cluster
G4double probVect[256]; // Cluster probability ("a#of issues" can be real) Vector
};
G4std::ostream& operator<<(G4std::ostream& lhs, G4QNucleus& rhs);
G4std::ostream& operator<<(G4std::ostream& lhs, const G4QNucleus& rhs);
inline G4int G4QNucleus::operator==(const G4QNucleus &right) const {return this==&right;}
inline G4int G4QNucleus::operator!=(const G4QNucleus &right) const {return this!=&right;}
inline G4int G4QNucleus::GetPDG()const {return 90000000+1000*(1000*S+Z)+N;}
inline G4int G4QNucleus::GetZ() const {return Z;}
inline G4int G4QNucleus::GetN() const {return N;}
inline G4int G4QNucleus::GetS() const {return S;}
inline G4int G4QNucleus::GetA() const {return Z+N+S;}
inline G4int G4QNucleus::GetDZ() const {return dZ;}
inline G4int G4QNucleus::GetDN() const {return dN;}
inline G4int G4QNucleus::GetDS() const {return dS;}
inline G4int G4QNucleus::GetDA() const {return dZ+dN+dS;}
inline G4int G4QNucleus::GetMaxClust() const {return maxClust;}
inline G4double G4QNucleus::GetProbability(G4int bn) const {return probVect[bn];}
// Init existing nucleus by new Quark Content
inline void G4QNucleus::InitByQC(G4QContent newQC)
{// =============================================
G4int PDG=G4QPDGCode(newQC).GetPDGCode();
InitByPDG(PDG);
}
inline G4double G4QNucleus::GetMZNS() const {return GetQPDG().GetNuclMass(Z,N,S);}
inline G4double G4QNucleus::GetGSMass() const {return GetQPDG().GetMass();}
inline G4QContent G4QNucleus::GetQCZNS() const
{
if(S>=0) return G4QContent(Z+N+N+S,Z+Z+N+S,S,0,0,0);
else return G4QContent(Z+N+N+S,Z+Z+N+S,0,0,0,-S);
}
inline void G4QNucleus::SetMaxClust(G4int maxC) {maxClust=maxC;}
inline void G4QNucleus::CalculateMass()
{Set4Momentum(G4LorentzVector(0.,0.,0.,GetGSMass()));}
// Add Cluster
inline G4QNucleus G4QNucleus::operator+=(const G4QNucleus& rhs)
// =======================================================
{
Z+=rhs.Z;
N+=rhs.N;
S+=rhs.S;
// Atributes of aHadron
G4int newPDG= GetPDGCode() + rhs.GetPDGCode() - 90000000;
SetQPDG (newPDG);
G4QContent newQC = GetQC() + rhs.GetQC();
SetQC (newQC);
G4LorentzVector newLV = Get4Momentum() + rhs.Get4Momentum();
Set4Momentum (newLV);
return *this;
}
// Subtract Cluster
inline G4QNucleus G4QNucleus::operator-=(const G4QNucleus& rhs)
// =======================================================
{
Z-=rhs.Z;
N-=rhs.N;
S-=rhs.S;
// Atributes of aHadron
G4int newPDG= GetPDGCode() - rhs.GetPDGCode() + 90000000;
SetQPDG (newPDG);
G4QContent newQC = GetQC() - rhs.GetQC();
SetQC (newQC);
G4LorentzVector newLV = Get4Momentum() - rhs.Get4Momentum();
Set4Momentum (newLV);
return *this;
}
// Multiply Nucleus by integer value
inline G4QNucleus G4QNucleus::operator*=(const G4int& rhs)
// ===================================================
{
Z*=rhs;
N*=rhs;
S*=rhs;
// Atributes of aHadron
G4int newPDG= rhs*(GetPDGCode() - 90000000) + 90000000;
SetQPDG (newPDG);
G4QContent newQC = rhs*GetQC();
SetQC (newQC);
G4LorentzVector newLV = rhs*Get4Momentum();
Set4Momentum (newLV);
return *this;
}
// Private member functions
inline G4QNucleus G4QNucleus::GetThis()const{return G4QNucleus(Z,N,S);}
#endif
@@ -0,0 +1,256 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QPDGCode.hh,v 1.11 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QPDGCode ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Hadron definition in CHIPS Model
// ------------------------------------------------------------
#ifndef G4QPDGCode_h
#define G4QPDGCode_h 1
#include "g4std/iostream"
#include "globals.hh"
#include "G4ParticleTable.hh"
#include "G4NucleiProperties.hh"
#include "G4NucleiPropertiesTable.hh"
#include "G4QContent.hh"
class G4QPDGCode
{
public:
// Constructors
G4QPDGCode(G4int PDGCode = 0); // Construction by PDGCode
G4QPDGCode(G4QContent QCont); // Construction by Quark Content
G4QPDGCode(const G4QPDGCode& rhs); // Copy Constructor by value
G4QPDGCode(G4QPDGCode* rhs); // Copy Constructor by pointer
~G4QPDGCode(); // Destructor
// Operators
const G4QPDGCode& operator=(const G4QPDGCode& rhs);
G4int operator==(const G4QPDGCode& rhs) const;
G4int operator==(const G4int& rhs) const;
G4int operator!=(const G4QPDGCode& rhs) const;
G4int operator!=(const G4int& rhs) const;
G4QPDGCode operator+=(const G4int& rhs);
G4QPDGCode operator+=(const G4QPDGCode& rhs);
G4QPDGCode operator-=(const G4int& rhs);
G4QPDGCode operator-=(const G4QPDGCode& rhs);
G4QPDGCode operator*=(const G4int& rhs);
G4QPDGCode operator/=(const G4int& rhs);
// Selectors
G4double GetMass(); // GS Mass for the QHadron
G4double GetMass2(); // Squared GS Mass for the QHadron
G4double GetWidth(); // Width for the QHadron
G4double GetNuclMass(G4int Z, G4int N, G4int S); // Wrapper for nuclear mass calculation
G4double GetNuclMass(G4int PDGCode); // Wrapper for nuclear mass calculation
G4QContent GetQuarkContent() const; // Get QC for the particle
G4int GetBaryNum() const; // Get Baryon Number of the Hadron
G4int GetSpin() const; // Returns 2s+1 for hadrons or 1 for nuclei
G4int GetCharge() const; // Get Charge of the Hadron
G4int GetPDGCode() const; // Get PDG code of the Hadron
G4int GetQCode() const; // Get Q code of the Hadron
G4QContent GetExQContent(G4int i, G4int o) const; // Get Q Content for the Quark Exchange
G4int GetRelCrossIndex(G4int i, G4int o) const; // Relative Cross Index for q_i->q_o
G4int GetNumOfComb(G4int i, G4int o) const; // Get number of Combinations for q_i->q_o
G4int GetTotNumOfComb(G4int i) const; // Get a total # of Combinations for q_i
// Modifiers
void SetPDGCode(G4int newPDGCode); // Set PDG code of the Hadron
void InitByQCont(G4QContent QCont); // Init existing QPDG by Quark Content
void InitByQCode(G4int QCode); // Init existing QPDG by Q Code
// General
G4bool TestRealNeutral();
void NegPDGCode();
private:
// Encapsulated functions
G4bool TestRealNeutral(const G4int& PDGCode);
G4int MakeQCode(const G4int& PDGCode); // Make Q Code, using PDG Code
G4int MakePDGCode(const G4int& QCode); // Make PDG Code, using Q Code
private:
// the Body
G4int thePDGCode;
G4int theQCode;
};
// Not member operators
G4std::ostream& operator<<(G4std::ostream& lhs, G4QPDGCode& rhs);
G4std::ostream& operator<<(G4std::ostream& lhs, const G4QPDGCode& rhs);
G4int operator+(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
G4int operator+(const G4QPDGCode& lhs, const G4int& rhs);
G4int operator+(const G4int& lhs, const G4QPDGCode& rhs);
G4int operator-(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
G4int operator-(const G4QPDGCode& lhs, const G4int& rhs);
G4int operator-(const G4int& lhs, const G4QPDGCode& rhs);
G4int operator*(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
G4int operator*(const G4QPDGCode& lhs, const G4int& rhs);
G4int operator*(const G4int& lhs, const G4QPDGCode& rhs);
G4int operator/(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
G4int operator/(const G4QPDGCode& lhs, const G4int& rhs);
G4int operator/(const G4int& lhs, const G4QPDGCode& rhs);
G4int operator%(const G4QPDGCode& lhs, const G4int& rhs);
// Not member functions
//----------------------------------------------------------------------------------------
inline G4int G4QPDGCode::operator==(const G4QPDGCode& rhs) const {return this==&rhs;}
inline G4int G4QPDGCode::operator==(const G4int& rhs) const {return thePDGCode==rhs;}
inline G4int G4QPDGCode::operator!=(const G4QPDGCode& rhs) const {return this!=&rhs;}
inline G4int G4QPDGCode::operator!=(const G4int& rhs) const {return thePDGCode!=rhs;}
inline G4QPDGCode G4QPDGCode::operator+=(const G4QPDGCode& rhs)
{
thePDGCode+=rhs.GetPDGCode();
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
return *this;
}
inline G4QPDGCode G4QPDGCode::operator+=(const G4int& rhs)
{
thePDGCode+=rhs;
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
return *this;
}
inline G4QPDGCode G4QPDGCode::operator-=(const G4QPDGCode& rhs)
{
thePDGCode-=rhs.GetPDGCode();
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
return *this;
}
inline G4QPDGCode G4QPDGCode::operator-=(const G4int& rhs)
{
thePDGCode-=rhs;
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
return *this;
}
inline G4QPDGCode G4QPDGCode::operator*=(const G4int& rhs)
{
thePDGCode*=rhs;
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
return *this;
}
inline G4QPDGCode G4QPDGCode::operator/=(const G4int& rhs)
{
thePDGCode/=rhs;
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
return *this;
}
inline G4double G4QPDGCode::GetMass2() {G4double m=GetMass(); return m*m;}
inline G4double G4QPDGCode::GetNuclMass(G4int PDG)
{
if(PDG>80000000)
{
G4int szn=PDG-90000000;
G4int ds=0;
G4int dz=0;
G4int dn=0;
if(szn<-100000)
{
G4int ns=(-szn)/1000000+1;
szn+=ns*1000000;
ds+=ns;
}
else if(szn<-100)
{
G4int nz=(-szn)/1000+1;
szn+=nz*1000;
dz+=nz;
}
else if(szn<0)
{
G4int nn=-szn;
szn=0;
dn+=nn;
}
G4int sz =szn/1000;
G4int n =szn%1000;
if(n>700)
{
n-=1000;
dz--;
}
G4int z =sz%1000-dz;
if(z>700)
{
z-=1000;
ds--;
}
G4int s =sz/1000-ds;
return GetNuclMass(z,n,s);
}
return 0.;
}
inline G4int G4QPDGCode::GetPDGCode() const {return thePDGCode;}
inline G4int G4QPDGCode::GetQCode() const {return theQCode;}
inline G4int G4QPDGCode::GetCharge() const {return GetQuarkContent().GetCharge();}
inline G4int G4QPDGCode::GetBaryNum() const {return GetQuarkContent().GetBaryonNumber();}
inline G4int G4QPDGCode::GetSpin() const
{
if(thePDGCode<80000000) return thePDGCode%10;
else if(GetQuarkContent().GetTot()%2) return 3;
else return 1;
}
inline void G4QPDGCode::NegPDGCode() {thePDGCode=-thePDGCode;}
inline G4bool G4QPDGCode::TestRealNeutral(){return TestRealNeutral(thePDGCode);}
// Redefinition of the PDG instance
inline void G4QPDGCode::SetPDGCode(G4int newPDGCode)
// ========================================
{
thePDGCode=newPDGCode;
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(newPDGCode);
}
// Init existing QPDG by Quark Content
inline void G4QPDGCode::InitByQCont(G4QContent QCont)
{// =========================================
thePDGCode = QCont.GetSPDGCode();
if(!thePDGCode) theQCode = -2;
else theQCode = MakeQCode(thePDGCode);
}
// Init existing QPDG by Quark Content
inline void G4QPDGCode::InitByQCode(G4int QCode)
{// ====================================
theQCode = QCode;
thePDGCode = MakePDGCode(QCode);
}
#endif
@@ -0,0 +1,44 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QPDGCodeVector.hh,v 1.8 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidateVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type defenition for Hadron definition in CHIPS model
// ---------------------------------------------------------------
#ifndef G4QPDGCodeVector_h
#define G4QPDGCodeVector_h 1
#include "G4QPDGCode.hh"
#include "g4std/vector"
typedef G4std::vector<G4QPDGCode *> G4QPDGCodeVector;
struct DeleteQPDGCode{ void operator()(G4QPDGCode *aN){delete aN;} };
#endif
@@ -0,0 +1,131 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QParentCluster.hh,v 1.10 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QParentCluster ----------------
// by Mikhail Kossov, Sept 1999.
// class header for a Parent nuclear cluster in the CHIPS Model
// -------------------------------------------------------------
#ifndef G4QParentCluster_h
#define G4QParentCluster_h 1
#include "g4std/iostream"
#include "globals.hh"
#include "G4QContent.hh"
class G4QParentCluster
{
public:
// Constructors
G4QParentCluster(G4int PDGCode = 0); // Construction by PDGCode
G4QParentCluster(G4int PDGCode, G4double prob); // Construction by PDGCode & Probab
G4QParentCluster(const G4QParentCluster& rhs); // Copy Constructor by value
G4QParentCluster(G4QParentCluster* rhs); // Copy Constructor by pointer
~G4QParentCluster(); // Destructor
// Operators
const G4QParentCluster& operator=(const G4QParentCluster& rhs);
G4int operator==(const G4QParentCluster& rhs) const;
G4int operator!=(const G4QParentCluster& rhs) const;
// Selectors
G4int GetPDGCode() const; // Get PDG code of the Parent Cluster
G4double GetProbability() const; // Get a probability of hadronization on it
G4int GetNQPart2() const; // Get n-2 for the fragment
G4QContent GetTransQC() const; // Get QuarkCont of a Pseudo Exchange Meson
G4double GetLow() const; // Get a low limit for randomization
G4double GetHigh() const; // Get a high limit for randomization
G4double GetEBMass() const; // Get a Nuclear Bounded mass of the parent cluster
G4double GetEBind() const; // Get Environment Binding energy for the parent cluster
G4double GetNBMass() const; // Get an Environmental bounded mass of the parent cluster
G4double GetNBind() const; // Get Total Nucleus Binding energy for the parent cluster
// Modifiers
void SetPDGCode(G4int newPDGCode); // Set PDG code of the Parent Cluster
void SetProbability(G4double probab); // Set probab. to hadronize on this cluster
void SetNQPart2(G4int nm2); // Get n-2 for the fragment
void SetTransQC(G4QContent newTrans); // Set QuarkCont of a Pseudo Exchange Meson
void SetLow(G4double loLim); // Set a low limit for hadronization
void SetHigh(G4double hiLim); // Set a high limit for hadronization
void SetEBMass(G4double bMass); // Set a bounded mass of the parent cluster in E
void SetEBind(G4double bEn); // Set binding energy of the parent cluster in E
void SetNBMass(G4double bMass); // Set a bounded mass of the parent cluster in N
void SetNBind(G4double bEn); // Set binding energy of the parent cluster in N
// General
private:
// Encapsulated functions
private:
// the Body
G4int thePDGCode;
G4double theProbability;
// Secondary
G4int nQPart2;
G4QContent transQC; // Quark Content of pseudo exchange meson
G4double lowLimit;
G4double highLimit;
G4double theEnvBoundedMass;
G4double theEnvBindingEnergy;
G4double theNucBoundedMass;
G4double theNucBindingEnergy;
};
// Not member operators
G4std::ostream& operator<<(G4std::ostream& lhs, G4QParentCluster& rhs);
G4std::ostream& operator<<(G4std::ostream& lhs, const G4QParentCluster& rhs);
inline G4int G4QParentCluster::operator==(const G4QParentCluster& rhs) const {return this==&rhs;}
inline G4int G4QParentCluster::operator!=(const G4QParentCluster& rhs) const {return this!=&rhs;}
inline G4int G4QParentCluster::GetPDGCode() const {return thePDGCode;}
inline G4double G4QParentCluster::GetProbability() const {return theProbability;}
inline G4int G4QParentCluster::GetNQPart2() const {return nQPart2;}
inline G4QContent G4QParentCluster::GetTransQC() const {return transQC;}
inline G4double G4QParentCluster::GetHigh() const {return highLimit;}
inline G4double G4QParentCluster::GetLow() const {return lowLimit;}
inline G4double G4QParentCluster::GetEBMass() const {return theEnvBoundedMass;}
inline G4double G4QParentCluster::GetEBind() const {return theEnvBindingEnergy;}
inline G4double G4QParentCluster::GetNBMass() const {return theNucBoundedMass;}
inline G4double G4QParentCluster::GetNBind() const {return theNucBindingEnergy;}
inline void G4QParentCluster::SetPDGCode(G4int newPDGCode) {thePDGCode = newPDGCode;}
inline void G4QParentCluster::SetProbability(G4double prob) {theProbability = prob;}
inline void G4QParentCluster::SetNQPart2(G4int nm2) {nQPart2 = nm2;}
inline void G4QParentCluster::SetTransQC(G4QContent newTrans) {transQC=newTrans;}
inline void G4QParentCluster::SetHigh(G4double hiLim) {highLimit = hiLim;}
inline void G4QParentCluster::SetLow(G4double loLim) {lowLimit = loLim;}
inline void G4QParentCluster::SetEBMass(G4double bMass) {theEnvBoundedMass = bMass;}
inline void G4QParentCluster::SetNBMass(G4double bMass) {theNucBoundedMass = bMass;}
inline void G4QParentCluster::SetEBind(G4double bEn) {theEnvBindingEnergy= bEn;}
inline void G4QParentCluster::SetNBind(G4double bEn) {theNucBindingEnergy= bEn;}
#endif
@@ -0,0 +1,43 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QParentClusterVector.hh,v 1.8 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidateVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type defenition of Parent nuclear cluster Vector in CHIPS model
// ---------------------------------------------------------------
#ifndef G4QParentClusterVector_h
#define G4QParentClusterVector_h 1
#include "G4QParentCluster.hh"
#include "g4std/vector"
typedef G4std::vector<G4QParentCluster *> G4QParentClusterVector;
struct DeleteQParentCluster{ void operator()(G4QParentCluster *aN){delete aN;} };
#endif
@@ -0,0 +1,129 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QParticle.hh,v 1.10 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QParticle ----------------
// by Mikhail Kossov, Sept 1999.
// class header for Particles in the CHIPS Model
// ---------------------------------------------------
#ifndef G4QParticle_h
#define G4QParticle_h 1
#include "g4std/iostream"
#include "globals.hh"
#include "G4QDecayChanVector.hh"
class G4QParticle
{
public:
// Constructors
G4QParticle(); // Default Constructor
G4QParticle(G4int thePDG); // PDGCode Constructor
G4QParticle(const G4QParticle& right); // Copy Constructor by value
G4QParticle(G4QParticle* right); // Copy Constructor by pointer
~G4QParticle(); // Destructor
// Operators
const G4QParticle& operator=(const G4QParticle& right);
G4int operator==(const G4QParticle& rhs) const;
G4int operator!=(const G4QParticle& rhs) const;
// Selectors
G4QPDGCode GetQPDG() const; // Get a PDG-Particle of the Particle
G4int GetPDGCode() const; // Get a PDG Code of the Particle
G4int GetQCode() const; // Get a Q Code of the Particle
G4int GetSpin() const; // Get 2s+1 of the Particle
G4int GetCharge() const; // Get a Charge of the Particle
G4int GetStrange() const; // Get a Strangeness of the Particle
G4int GetBaryNum() const; // Get a Baryon Number of the Particle
G4QContent GetQContent(); // Get Quark Content of the Particle
G4QDecayChanVector GetDecayVector(); // Get a Decay Vector for the Particle
G4double GetMass(); // Get a mass value for the Particle
G4double GetWidth(); // Get a width value for the Particle
// Modifiers
G4QDecayChanVector InitDecayVector(G4int Q); // Init Decay Vector in the CHIPS World by Q code
void InitPDGParticle(G4int thePDGCode);
void InitQParticle(G4int theQCode);
// General
G4double MinMassOfFragm(); // Minimal mass of decaing fragments
private:
// Encapsulated functions
private:
// the Body
G4QPDGCode aQPDG;
G4QDecayChanVector aDecay;
G4QContent aQuarkCont; // @@ Secondary (added for acceleration - check)
};
// Not member operators
G4std::ostream& operator<<(G4std::ostream& lhs, G4QParticle& rhs);
// Not member functions
//----------------------------------------------------------------------------------------
inline G4int G4QParticle::operator==(const G4QParticle& rhs) const {return this==&rhs;}
inline G4int G4QParticle::operator!=(const G4QParticle& rhs) const {return this!=&rhs;}
inline G4QPDGCode G4QParticle::GetQPDG() const {return aQPDG;}
inline G4int G4QParticle::GetPDGCode() const {return aQPDG.GetPDGCode();}
inline G4int G4QParticle::GetSpin() const {return aQPDG.GetSpin();}
inline G4int G4QParticle::GetCharge() const {return aQuarkCont.GetCharge();}
inline G4int G4QParticle::GetStrange() const {return aQuarkCont.GetStrangeness();}
inline G4int G4QParticle::GetBaryNum() const {return aQuarkCont.GetBaryonNumber();}
inline G4QContent G4QParticle::GetQContent() {return aQuarkCont;}
inline G4QDecayChanVector G4QParticle::GetDecayVector() {return aDecay;}
inline G4double G4QParticle::GetMass() {return aQPDG.GetMass();}
inline G4double G4QParticle::GetWidth() {return aQPDG.GetWidth();}
inline G4double G4QParticle::MinMassOfFragm()
{
G4int nCh=aDecay.size();
G4double m=GetMass();
G4double min=m;
if(nCh)
{
min=aDecay[0]->GetMinMass();
if(nCh>1) for(G4int j=1; j<nCh; j++)
{
G4double next=aDecay[j]->GetMinMass();
if(next<min) min=next;
}
}
G4double w=GetWidth();
G4double lim=m+.001;
if(w) lim-=1.5*w;
if(min<lim) min=lim;
return min;
}
#endif
@@ -0,0 +1,43 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QParticleVector.hh,v 1.8 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidateVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type defenition for Decay Channel Vector in CHIPS model
// ---------------------------------------------------------------
#ifndef G4QParticleVector_h
#define G4QParticleVector_h 1
#include "G4QParticle.hh"
#include "g4std/vector"
typedef G4std::vector<G4QParticle *> G4QParticleVector;
struct DeleteQParticle{ void operator()(G4QParticle *aN){delete aN;} };
#endif
@@ -0,0 +1,66 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QSelector.hh,v 1.7 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QSelector ----------------
// by Mikhail Kossov, Sept 1999.
// class header for decay Selection for Hadrons of CHIPS Model
// ------------------------------------------------------------
#ifndef G4QSelector_h
#define G4QSelector_h 1
//#include "globals.hh"
#include "G4QHadronVector.hh"
#include "G4QPDGCodeVector.hh"
class G4QSelector
{
public:
// Constructors
G4QSelector(); // Default Constructor
G4QSelector(G4QHadronVector hadronVec); // Constructor for the Hadrons Set
~G4QSelector(); // Destructor
// Operators
const G4QSelector& operator=(const G4QSelector& right);
G4int operator==(const G4QSelector& right) const;
G4int operator!=(const G4QSelector& right) const;
// Selectors
G4QHadronVector GetHadrons() const; // Get PDG code of the Hadron
// Modifiers
void SetHadrons(G4QHadronVector hadronVec); // Get PDG code of the Hadron
G4bool SelectPDGSet(G4QPDGCodeVector thePDGCodes); // Select event with the PDGCode Set
private:
G4QHadronVector theHadrons; // Vector of Hadron
};
inline G4int G4QSelector::operator==(const G4QSelector& right) const {return this==&right;}
inline G4int G4QSelector::operator!=(const G4QSelector& right) const {return this!=&right;}
inline G4QHadronVector G4QSelector::GetHadrons() const {return theHadrons;}
inline void G4QSelector::SetHadrons(G4QHadronVector hadronVec) {theHadrons=hadronVec;}
#endif
@@ -0,0 +1,179 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4Quasmon.hh,v 1.19 2001/11/26 14:11:45 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4Quasmon ----------------
// by Mikhail Kossov, July 1999.
// class for a Quasmon used by the CHIPS Model
// ------------------------------------------------------------
#ifndef G4Quasmon_h
#define G4Quasmon_h 1
// Standard G4-headers
#include "G4ios.hh"
#include "globals.hh"
#include "G4ThreeVector.hh"
#include "G4LorentzVector.hh"
#include "G4LorentzRotation.hh"
//CHIPS-headers
#include "G4QCHIPSWorld.hh"
#include "G4QChipolino.hh"
#include "G4QHadronVector.hh"
#include "G4QNucleus.hh"
class G4Quasmon
{
public:
G4Quasmon(G4QContent qQCont = G4QContent(0,0,0,0,0,0),
G4LorentzVector q4M = G4LorentzVector(0.,0.,0.,0.),
G4LorentzVector ph4M = G4LorentzVector(0.,0.,0.,0.));// Direct Constructor
G4Quasmon(const G4Quasmon& right); // Copy Quasmon by object
G4Quasmon(G4Quasmon* right); // Copy Quasmon by pointer
~G4Quasmon();
// Overloaded Operators
const G4Quasmon& operator=(const G4Quasmon& right);
int operator==(const G4Quasmon &right) const;
int operator!=(const G4Quasmon &right) const;
// Static functions
static void SetParameters(G4double temperature, G4double ssin2g, G4double etaetap);
static void SetTemper(G4double temperature);
static void SetSOverU(G4double ssin2g);
static void SetEtaSup(G4double etaetap);
//Selectors
G4double GetTemper() const;
G4double GetSOverU() const;
G4double GetEtaSup() const;
G4LorentzVector Get4Momentum() const;
G4QContent GetQC() const;
G4QPDGCode GetQPDG() const;
G4int GetStatus() const;
//Modifiers
G4QHadronVector* Fragment(G4QNucleus& nucEnviron, G4int nQ); // Pub-wrapper for "HadronizeQuasmon(,)"
void ClearOutput(); // Clear but not destroy the output
void InitQuasmon(const G4QContent& qQCont, const G4LorentzVector& q4M);
void IncreaseBy(const G4Quasmon* pQuasm); // as operator+= but by pointer
void KillQuasmon(); // Kill Quasmon (status=0)
private:
G4QHadronVector HadronizeQuasmon(G4QNucleus& qEnv, G4int nQ); // Return new neuclear environment
G4double GetRandomMass(G4int PDGCode, G4double maxM);
void ModifyInMatterCandidates();
void InitCandidateVector(G4int maxMes, G4int maxBar, G4int maxClust);
void CalculateNumberOfQPartons(G4double qMass);
void CalculateHadronizationProbabilities(G4double excE, G4double kQ, G4double kLS,
G4bool piF, G4bool gaF);
void FillHadronVector(G4QHadron* qHadron);
G4int RandomPoisson(G4double meanValue);
G4double GetQPartonMomentum(G4double mMinResidual2, G4double mCandidate2);
G4bool DecayOutHadron(G4QHadron* qHadron, G4int DFlag=0);
G4bool CheckGroundState(G4bool corFlag = false); // Forbid correction by default
void KillEnvironment(); // Kill Environment (Z,N,S=0,LV=0)
// Body
private:
// Static Parameters
static G4double Temperature; // Quasmon Temperature
static G4double SSin2Gluons; // Percent of ssbar sea in a constituen gluon
static G4double EtaEtaprime; // Part of eta-prime in all etas
// Hadronic input
G4LorentzVector q4Mom; // 4-momentum of the Quasmon +++++
G4QContent valQ; // Quark Content of the Quasmon +++++
G4QNucleus theEnvironment; // Nuclear (or Vacuum) Environment around the Quasmon
// Output
G4int status; // -1-Panic,0-Done,1-FilledSomething,2-DidNothing,3-StopedByCB,4-JustBorn
G4QHadronVector theQHadrons; // Vector of generated secondary hadrons +++++
// Internal working objects (@@ it is possible to sacrifice some of them in future)
G4QCHIPSWorld theWorld; // Pointer to the CHIPS World
G4LorentzVector phot4M; // Gamma 4-momentum for interaction with a quark-parton
G4int nBarClust; // Maximum barion number of clusters in the Environment @@ ??
G4int nOfQ; // number of quark-partons in the Quasmon (just to accelerate)
G4QCandidateVector theQCandidates; // Vector of possible secondary hadrons/clusters (**delete!**)
G4double f2all; // Ratio of free nucleons to free+freeInDense nucleons @@ ??
G4double rEP; // E+p for the Residual Coloured Quasmon im LS +++++
G4double rMo; // p for the Residual Coloured Quasmon im LS +++++
G4double totMass; // Mass of total compound system curQuasmon+curEnvironment
G4int bEn; // BaryoNumber of the Limit Active Nuclear Environment
G4double mbEn; // Mass of the LimActNucEnv
G4LorentzVector bEn4M; // 4-momentum of the LimitActiveNuclearEnviron
G4QContent bEnQC; // QuarkContent of the LimitActiveNuclEnv
};
inline int G4Quasmon::operator==(const G4Quasmon &right) const {return this == &right;}
inline int G4Quasmon::operator!=(const G4Quasmon &right) const {return this != &right;}
inline G4double G4Quasmon::GetTemper() const {return Temperature;}
inline G4double G4Quasmon::GetSOverU() const {return SSin2Gluons;}
inline G4double G4Quasmon::GetEtaSup() const {return EtaEtaprime;}
inline G4LorentzVector G4Quasmon::Get4Momentum() const {return q4Mom;}
inline G4QContent G4Quasmon::GetQC() const {return valQ;}
inline G4QPDGCode G4Quasmon::GetQPDG() const {return G4QPDGCode(valQ);}
inline G4int G4Quasmon::GetStatus() const {return status;}
inline void G4Quasmon::ClearOutput()
{G4std::for_each(theQHadrons.begin(), theQHadrons.end(), DeleteQHadron());
theQHadrons.clear();
}
inline void G4Quasmon::KillEnvironment()
{theEnvironment=G4QNucleus(0,0,0,G4LorentzVector(0.,0.,0.,0.));}
inline G4double G4Quasmon::GetRandomMass(G4int PDG, G4double maxM)
{
G4QParticle* part = theWorld.GetQParticle(PDG);
return G4QHadron(part, maxM).GetMass();
}
inline void G4Quasmon::IncreaseBy(const G4Quasmon* pQuasm)
{
valQ += pQuasm->GetQC();
q4Mom += pQuasm->Get4Momentum();
status= 3;
}
inline void G4Quasmon::InitQuasmon(const G4QContent& qQCont, const G4LorentzVector& q4M)
{
valQ = qQCont;
q4Mom = q4M;
status= 3;
}
inline void G4Quasmon::KillQuasmon()
{
static const G4QContent zeroQC(0,0,0,0,0,0);
static const G4LorentzVector nothing(0.,0.,0.,0.);
phot4M= nothing;
valQ = zeroQC;
q4Mom = nothing;
status= 0;
}
#endif
@@ -0,0 +1,41 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QuasmonVector.hh,v 1.9 2001/11/26 14:11:46 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QuasmonVector ----------------
// by Mikhail Kossov, Sept 1999.
// Type definition for a Vector of Quasmons - output of CHIPS model
// ----------------------------------------------------------------
#ifndef G4QuasmonVector_h
#define G4QuasmonVector_h 1
#include "G4Quasmon.hh"
#include "g4std/vector"
typedef G4std::vector<G4Quasmon *> G4QuasmonVector;
struct DeleteQuasmon{ void operator()(G4Quasmon *aN){delete aN;} };
#endif
@@ -0,0 +1,122 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QCHIPSWorld.cc,v 1.17 2001/11/26 14:11:46 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCHIPSWorld ----------------
// by Mikhail Kossov, Sept 1999.
// class for the CHIPS World definition in CHIPS Model
// -------------------------------------------------------------------
//#define debug
//#define pdebug
#include "G4QCHIPSWorld.hh"
G4QCHIPSWorld::G4QCHIPSWorld(G4int nOfParts)
{
qWorld = InitCHIPSWorld(nOfParts); // Initialization of the CHIPS World with N particles
}
G4QCHIPSWorld::G4QCHIPSWorld(const G4QCHIPSWorld& right)
{
qWorld = right.qWorld;
}
G4QCHIPSWorld::G4QCHIPSWorld(G4QCHIPSWorld* right)
{
qWorld = right->qWorld;
}
G4QCHIPSWorld::~G4QCHIPSWorld() {}
const G4QCHIPSWorld& G4QCHIPSWorld::operator=(const G4QCHIPSWorld &right)
{// ===================================================================
qWorld = right.qWorld;
return *this;
}
// Standard output for CHIPS World
G4std::ostream& operator<<(G4std::ostream& lhs, G4QCHIPSWorld& rhs)
// ============================================
{
// @@ Later make a list of activated particles and clusters
lhs << "[ a#of particles in the CHIPS World =" << rhs.GetQPEntries() << "]";
return lhs;
}
//Initialize the CHIPS World of Quasmons
G4QParticleVector* G4QCHIPSWorld::InitCHIPSWorld(G4int nOfParts)
// =============================================
{
static G4int mnofParts = 486; // max number of particles (up to A=80)
static G4QParticleVector theWorld; // *** A body of the CHIPS World ***
static int init = 0; // Initialization counter (private)
#ifdef debug
G4cout<<"G4QCHIPSWorld::InitCHIPSWorld: n="<<nOfParts<<" particles, init="<<init<<G4endl;
#endif
if(nOfParts>0)
{
#ifdef debug
G4cout<<"G4QCHIPSWorld::InitCHIPSWorld: Creating CHIPS World of nP="<<nOfParts<<G4endl;
#endif
G4int curNP=theWorld.size();
if(curNP<0) curNP=0;
if(!init++||nOfParts>curNP) // Initialize for increasing CHIPS World
{
if (nOfParts>mnofParts)
{
nOfParts=mnofParts;
G4cerr<<"***G4QCHIPSWorld::InitCHIPSWorld: nOfParts="<<nOfParts<<" >"<<mnofParts<<G4endl;
}
if (nOfParts<10) nOfParts=10; // Minimal number of particles for Vacuum
#ifdef debug
G4cerr<<"G4QCHIPSWorld::InitCHIPSWorld:Should be once, i="<<init<<",n="<<nOfParts<<",c="<<curNP<<G4endl;
#endif
for (G4int i=curNP; i<nOfParts; i++)
{
G4QParticle* curPart = new G4QParticle; // Created
curPart->InitQParticle(i); // ||
theWorld.push_back(curPart); // Filled (forever but once)
#ifdef debug
G4cout<<"G4QCHIPSWorld::InitCHIPSWorld: Particle#"<<i<<"(of "<<nOfParts<<") done"<<endl;
#endif
}
}
else if (nOfParts<0)
{
G4std::for_each(theWorld.begin(), theWorld.end(), DeleteQParticle());
theWorld.clear();
init=0;
}
else init--;
}
return &theWorld;
}
@@ -0,0 +1,141 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QCandidate.cc,v 1.18 2001/12/13 12:04:17 gunter Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QCandidate ----------------
// by Mikhail Kossov, Sept 1999.
// class for Quasmon initiated Candidates used by CHIPS Model
// ------------------------------------------------------------------
//#define debug
#include "G4QCandidate.hh"
#include "g4std/algorithm"
G4QCandidate::G4QCandidate() : relativeProbability(0.),integralProbability(0.)
{
}
G4QCandidate::G4QCandidate(G4int PDGcode) :
relativeProbability(0.),integralProbability(0.)
{
G4LorentzVector cur4Mom(0.,0.,0.,0.);
G4QPDGCode QPDG(PDGcode);
SetQPDG(QPDG);
G4double vacMass = QPDG.GetMass();
cur4Mom.setE(vacMass);
Set4Momentum(cur4Mom);
SetQC(QPDG.GetQuarkContent());
}
G4QCandidate::G4QCandidate(const G4QCandidate& right)
{
Set4Momentum (right.Get4Momentum());
SetQPDG (right.GetQPDG());
SetQC (right.GetQC());
SetNFragments (right.GetNFragments());
possible = right.possible;
parPossible = right.parPossible;
kMin = right.kMin;
denseProbability = right.denseProbability;
preProbability = right.preProbability;
relativeProbability = right.relativeProbability;
integralProbability = right.integralProbability;
secondRelProbability= right.secondRelProbability;
secondIntProbability= right.secondIntProbability;
// thePClusters
G4int nParCl = right.thePClusters.size();
if(nParCl) for(G4int ip=0; ip<nParCl; ip++)
{
G4QParentCluster* curPC = new G4QParentCluster(right.thePClusters[ip]);
thePClusters.push_back(curPC);
}
}
G4QCandidate::G4QCandidate(G4QCandidate* right)
{
Set4Momentum (right->Get4Momentum());
SetQPDG (right->GetQPDG());
SetQC (right->GetQC());
SetNFragments (right->GetNFragments());
possible = right->possible;
parPossible = right->parPossible;
kMin = right->kMin;
denseProbability = right->denseProbability;
preProbability = right->preProbability;
relativeProbability = right->relativeProbability;
integralProbability = right->integralProbability;
secondRelProbability= right->secondRelProbability;
secondIntProbability= right->secondIntProbability;
// thePClusters
G4int nParCl = right->thePClusters.size();
if(nParCl) for(G4int ip=0; ip<nParCl; ip++)
{
G4QParentCluster* curPC = new G4QParentCluster(right->thePClusters[ip]);
thePClusters.push_back(curPC);
}
}
G4QCandidate::~G4QCandidate()
{
#ifdef debug
G4cout<<"~G4QCandidate: before thePClusters nC="<<thePClusters.entries()<<G4endl;
#endif
G4std::for_each(thePClusters.begin(), thePClusters.end(), DeleteQParentCluster());
#ifdef debug
G4cout<<"~G4QCandidate: === DONE ==="<<G4endl;
#endif
}
// Assignment operator
const G4QCandidate& G4QCandidate::operator=(const G4QCandidate &right)
{
Set4Momentum (right.Get4Momentum());
SetQPDG (right.GetQPDG());
SetQC (right.GetQC());
SetNFragments (right.GetNFragments());
possible = right.possible;
parPossible = right.parPossible;
kMin = right.kMin;
denseProbability = right.denseProbability;
preProbability = right.preProbability;
relativeProbability = right.relativeProbability;
integralProbability = right.integralProbability;
secondRelProbability= right.secondRelProbability;
secondIntProbability= right.secondIntProbability;
// thePClusters (Vector)
G4int nParCl = right.thePClusters.size();
if(nParCl) for(G4int ip=0; ip<nParCl; ip++)
{
G4QParentCluster* curPC = new G4QParentCluster(right.thePClusters[ip]);
thePClusters.push_back(curPC);
}
return *this;
}
@@ -0,0 +1,512 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QChipolino.cc,v 1.14 2001/11/26 14:11:46 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QChipolino ----------------
// by Mikhail Kossov, Sept 1999.
// class for Quasmon initiated Chipolinos generated by CHIPS Model
// ------------------------------------------------------------------
//#define debug
//#define pdebug
#include "G4QChipolino.hh"
G4QChipolino::G4QChipolino(G4QContent& QCont)
{
// @@ Does not work as static const ??
G4QPDGCode Pi0(111);
G4double mPi0 = Pi0.GetMass();
G4QContent Pi0QC = Pi0.GetQuarkContent();
G4int ban =QCont.GetBaryonNumber();
G4int tban=abs(3*ban);
G4int tot=QCont.GetTot(); // Initial total number of quarks in QC
G4int tod=tot%2; // tot is even - meson or dibaryon-nucleus
if(!tod&&(tot<4||ban&&tot<tban)||tod&&tot<tban+2) QCont.IncQAQ(1,0.); // Add quark-pair
G4QContent rQC=QCont; // Copy for possible reduction ("annihilation" of q-qbar pairs)
tot=rQC.GetTot(); // New total number of quarks in QC (temporary)
if (tot%2)rQC.DecQAQ(-tban-2); // Reduce pairs, keep only 5 quarks (baryon case)
else if(ban)rQC.DecQAQ(-tban); // Reduce pairs, keep only 6 quarks (dibaryon case)
else rQC.DecQAQ(-4); // Reduce pairs, keep only 4 quarks (meson case)
tot=rQC.GetTot(); // Final total number of quarks (updated)
#ifdef debug
cout<<"G4QChipolino is called with QC="<<QCont<<",rQC="<<rQC<<",tot="<<tot<<G4endl;
#endif
minM=1000000.; // Prototype of minimal mass (@@ just a big number)
theQPDG1 = Pi0;
theQPDG2 = Pi0;
theQCont1 = Pi0QC;
if (!tot) // Should not be here, just in case (strange input)
{
G4cerr<<"***G4QChipolino: shouldn't be here 1 QC="<<rQC<<G4endl;
G4Exception("G4QChipolino cannot be constructed as n_tot=0");
}
else if (tot==2 || tot==3) // Should not be here (basic octet/singlet states)
{
G4cerr<<"***G4QChipolino: shouldn't be here 2 QC="<<rQC<<G4endl;
theQCont1= rQC;
theQPDG1.InitByQCont(rQC);
theQCont = rQC+Pi0QC;
}
else if (tot==4) // Two possible combinations for the meson
{
G4QContent bQC=rQC.IndQ();
#ifdef debug
cout<<"G4QChipolino: tot=4,rQC="<<rQC<<",bQC="<<bQC<<G4endl;
#endif
for(int j=0; j<2; j++)
{
G4QContent aQC=rQC.IndAQ(j);
G4QContent cQC=bQC+aQC;
G4QPDGCode cQPDG(cQC);
G4double M1=cQPDG.GetMass();
if(cQPDG.GetPDGCode()==221) M1=mPi0;
G4QContent oQC=rQC-cQC;
#ifdef debug
cout<<"G4QChipolino: aQC="<<aQC<<", cQC="<<cQC<<", oQC="<<oQC<<G4endl;
#endif
G4QPDGCode oQPDG(oQC);
G4double M2=oQPDG.GetMass();
if(oQPDG.GetPDGCode()==221) M2=mPi0;
G4double m=M1+M2;
#ifdef debug
cout<<"G4QChipolino: c="<<cQPDG<<",cM="<<M1<<",o="<<oQPDG<<",oM="<<M2
<<",cM+0M="<<m<<", curMinM="<<minM<<G4endl;
#endif
if(m<minM)
{
minM=m;
theQPDG1 = cQPDG;
theQCont1 = cQC;
theQPDG2 = oQPDG;
}
}
}
else if (tot==5) // Four possible combinations for the baryon
{
G4int nQ=rQC.GetQ();
G4int nA=rQC.GetAQ();
G4bool fl=nA>nQ; // Flag of antibaryon case
#ifdef pdebug
cout<<"G4QChipolino: Baryon case nQ="<<nQ<<",nA="<<nA<<",QC="<<rQC
<<",fl="<<fl<<G4endl;
#endif
G4QContent bQC;
if (fl) bQC=rQC.IndQ(); // Antibaryon case
else bQC=rQC.IndAQ(); // Baryon case - QC of antiquark
for (int i=0; i<4; i++)
{
G4QContent cQC;
if (fl) cQC=bQC+rQC.IndAQ(i);
else cQC=bQC+rQC.IndQ(i);// Make mesonout of anti-quark
G4QPDGCode cQPDG(cQC); // Make QPDG particle
G4double M1=cQPDG.GetMass(); // Get meson mass
if(cQPDG.GetPDGCode()==221) M1=mPi0; // Make pi0 out of eta
G4QContent oQC=rQC-cQC; // Make residual baryon
G4QPDGCode oQPDG(oQC); // Make QPDG of residual baryon
G4double M2=oQPDG.GetMass(); // Get baryon mass
if(oQPDG.GetPDGCode()==221) M2=mPi0; // @@ Never !!
G4double m=M1+M2;
if(m<minM)
{
minM=m;
theQPDG1 = cQPDG;
theQCont1 = cQC;
theQPDG2 = oQPDG;
}
}
#ifdef pdebug
cout<<"G4QChipolino: Baryon case minM="<<minM<<", M="<<theQCont1<<theQPDG1
<<", B="<<theQPDG2<<G4endl;
#endif
}
else if (tot==6) // Four possible combinations for the di-baryon
{
if(ban)
{
G4int nQ=rQC.GetQ();
G4int nA=rQC.GetAQ();
G4bool fl=nA>nQ; // Flag of anti-dibaryon case
#ifdef debug
cout<<"G4QChipolino: Di-Baryon case nQ="<<nQ<<",nA="<<nA<<",QC="<<rQC<<",fl="<<fl<<G4endl;
#endif
for (int i=0; i<4; i++)
{
G4QContent aQC;
if (fl) aQC=rQC.IndAQ(i);
else aQC=rQC.IndQ(i);
for (int j=i+1; j<5; j++)
{
G4QContent bQC;
if (fl) bQC=aQC+rQC.IndAQ(j);
else bQC=aQC+rQC.IndQ(j);
for (int k=j+1; k<6; k++)
{
G4QContent cQC;
if (fl) cQC=bQC+rQC.IndAQ(k);
else cQC=bQC+rQC.IndQ(k);
G4QPDGCode cQPDG(cQC);
G4double M1=cQPDG.GetMass();
if(cQPDG.GetPDGCode()==221) M1=mPi0;
G4QContent oQC=rQC-cQC;
G4QPDGCode oQPDG=(oQC);
G4double M2=oQPDG.GetMass();
if(oQPDG.GetPDGCode()==221) M2=mPi0;
G4double m=M1+M2;
if(m<minM)
{
minM=m;
theQPDG1 = cQPDG;
theQCont1 = cQC;
theQPDG2 = oQPDG;
}
}
}
}
}
else // Baryon-AntiBaryon
{
theQCont1 = rQC.IndQ(0)+rQC.IndQ(1)+rQC.IndQ(2);
theQPDG1.InitByQCont(theQCont1);
theQPDG2.InitByQCont(rQC.IndAQ(0)+rQC.IndAQ(1)+rQC.IndAQ(2));
}
}
else if(((rQC.GetU() )>(rQC.GetS() -4) && (rQC.GetD() )>(rQC.GetS() -4)) ||
((rQC.GetAU())>(rQC.GetAS()-4) && (rQC.GetAD())>(rQC.GetAS()-4)) )
{
G4int kD=rQC.GetD();
G4int kU=rQC.GetU();
G4int kS=rQC.GetS();
G4int mD=rQC.GetAD();
G4int mU=rQC.GetAU();
G4int mS=rQC.GetAS();
G4int nQ=rQC.GetQ();
G4int nA=rQC.GetAQ();
G4bool fl=nA>nQ; // Flag of anti-fragment case
#ifdef debug
cout<<"G4QChipolino: NucFragment case nQ="<<nQ<<",nAQ="<<nA<<", QC="<<rQC<<",fl="<<fl<<G4endl;
#endif
if((fl&&kS>1)||(!fl&&mS>1))
{
G4cerr<<"***G4QChipolino: ***Overfowed by strange quarks*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino: Nuclear Fragment-Chipolino is overflowed by strange quarks");
}
else if(fl) // ===> Anti-fragment
{
//G4cerr<<"***G4QChipolino: ***Anti-nuclear fragments*** rQC="<<rQC<<G4endl;
//G4Exception("G4QChipolino: Antinuclear fragments are not yet supported");
if(!mS) // No strange quarks
{
G4int nI=mU-mD; // Isotopic shift
G4int nN=(mU+mD-nI*3)/6;
if(!kS) // No kaons
{
if((nI>=0&&nN>=0)||(nI<0&&nN>=-nI)) // Delta isn't necessary
{
if(nI>0) // Excess of antiprotons
{
theQPDG1 = G4QPDGCode(-(90000000+1000*(nN+nI-1)+nN)); // A Fragment-AProton
theQPDG2 = G4QPDGCode(-2212); // An Anti-Proton
}
else // Excess of a-neutrons
{
theQPDG1 = G4QPDGCode(-(90000000+1000*(nN+nI)+nN-1)); // A Fragment-ANeutron
theQPDG2 = G4QPDGCode(-2112); // An Anti-Neutron
}
}
else if((nI>=0&&nN>-2)||(nI<0&&nN>-nI-2)) // Delta can be a part
{
if(nI>0) // Excess of au-quarks
{
theQPDG1=G4QPDGCode(-(90000000+1000*(nN+nI-2)+nN+1)); // A Fragment-AProton
theQPDG2=G4QPDGCode(-2224); // An Anti-Delta++
}
else // Excess of ad-quarks
{
theQPDG1=G4QPDGCode(-(90000000+1000*(nN+nI+1)+nN-2)); // A Fragment-ANeutron
theQPDG2=G4QPDGCode(-1114); // An Anti-Delta-
}
}
else
{
G4cerr<<"***G4QChipolino: **A**Isotopic asymmetry (without S)*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino: Exotic Isotopic asymmety of AntiMultyBaryon Quasmon");
}
}
else if(kS<2) // NucFrag+K is possible
{
G4int nN =(mU+mD-4-nI*3)/6;
if(nI>0) // Excess of au-quarks
{
nN+=1;
theQPDG1 = G4QPDGCode(-(90000000+1000*(nN+nI-1)+nN)); // An Anti-Fragment
theQPDG2 = G4QPDGCode(-321); // A K- meson
}
else
{
theQPDG1 = G4QPDGCode(-(90000000+1000*(nN+nI+1)+nN)); // An AntiFragment
theQPDG2 = G4QPDGCode(-311); // An Anti-K0 meson
}
}
else
{
G4cerr<<"***G4QChipolino: ***Too many kaons are needed*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino: Too much Kaons are needed together with AntiNuclearFragm");
}
}
else // Fragment with strangeness
{
if(mS<=mU&&mS<=mD) // Fragment consisting of Neutrons, Protons & Lambrdas only
{
G4int nI=mU-mD; // Isotopic shift
G4int nN=(mU+mD-mS-mS-nI*3)/6;
if((nI>=0&&nN>=0)||(nI<0&&nN>=-nI)) // Delta isn't necessary
{
if(nI>0) // Excess of protons
{
theQPDG1 = G4QPDGCode(-(90000000+1000*(kS*1000+nN+nI-1)+nN));// A Fragment-AProton
theQPDG2 = G4QPDGCode(-2212); // An Anti-Proton
}
else // Excess of neutrons
{
theQPDG1 = G4QPDGCode(-(90000000+1000*(kS*1000+nN+nI)+nN-1));//A Fragment-ANeutron
theQPDG2 = G4QPDGCode(-2112); // An Anti-Neutron
}
}
else if((nI>=0&&nN>-2)||(nI<0&&nN>-nI-2)) // Delta can be a part
{
if(nI>0) // Excess of au-quarks
{
theQPDG1=G4QPDGCode(-(90000000+1000*(kS*1000+nN+nI-2)+nN+1));// A Fragment-AProton
theQPDG2=G4QPDGCode(-2224); // An Anti-Delta++
}
else // Excess of ad-quarks
{
theQPDG1=G4QPDGCode(-(90000000+1000*(kS*1000+nN+nI+1)+nN-2));//A Fragment-ANeutron
theQPDG2=G4QPDGCode(-1114); // An Anti-Delta-
}
}
else
{
G4cerr<<"***G4QChipolino: **A**Isotopic assimetry (with S)*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino:Exotic Isotopics of Strange AntiMultyBaryon Quasmon");
}
}
else // Excess of s-quarks
{
G4int lam=mU; // A#of Anti-Lambdas
if (lam>mD) lam=mD;
G4int lD=mD-lam; // Residual ad-quarks
G4int lU=mU-lam; // Residual au-quarks
G4int lS=mS-lam; // Residual as-quarks
if(lD+lU+lS!=3||lD<0||lU<0||lS<0)
{
G4cerr<<"***G4QChipolino:*AntiFragm* rQC="<<rQC<<",s="<<lS<<",u="<<lU<<",d"<<lD<<G4endl;
G4Exception("G4QChipolino: Exotic superstrange AntiMultyBaryon");
}
if ( !lD && lU==2) theQPDG2=G4QPDGCode(-3222); // Anti-Sigma+
else if( !lU && lD==2) theQPDG2=G4QPDGCode(-3112); // Anti-Sigma-
else if( !lD && lU==1) theQPDG2=G4QPDGCode(-3322); // Anti-Ksi0
else if( !lU && lD==1) theQPDG2=G4QPDGCode(-3312); // Anti-Ksi-
else theQPDG2=G4QPDGCode(-3334); // Anti-Omega-
theQPDG1=G4QPDGCode(-(90+lam)*1000000); // Anti Strange Matter
}
theQCont1 = rQC-theQPDG2.GetQuarkContent(); // QCont of Fragment-H
theQCont = rQC; // QCont of Chipolino
}
}
else // ===> Nuclear Fragment
{
if(!kS) // No strange quarks
{
G4int nI=kU-kD; // Isotopic shift
G4int nN=(kU+kD-nI*3)/6;
if(!mS) // No kaons
{
if((nI>=0&&nN>=0)||(nI<0&&nN>=-nI)) // Delta isn't necessary
{
if(nI>0) // Excess of protons
{
theQPDG1 = G4QPDGCode(90000000+1000*(nN+nI-1)+nN); // A Fragment-Proton
theQPDG2 = G4QPDGCode(2212); // A Proton
}
else // Excess of neutrons
{
theQPDG1 = G4QPDGCode(90000000+1000*(nN+nI)+nN-1); // A Fragment-Neutron
theQPDG2 = G4QPDGCode(2112); // A Neutron
}
}
else if((nI>=0&&nN>-2)||(nI<0&&nN>-nI-2)) // Delta can be a part
{
if(nI>0) // Excess of u-quarks
{
theQPDG1=G4QPDGCode(90000000+1000*(nN+nI-2)+nN+1); // A Fragment-Proton
theQPDG2=G4QPDGCode(2224); // A Delta++
}
else // Excess of d-quarks
{
theQPDG1=G4QPDGCode(90000000+1000*(nN+nI+1)+nN-2); // A Fragment-Neutron
theQPDG2=G4QPDGCode(1114); // A Delta-
}
}
else
{
G4cerr<<"***G4QChipolino: ***Isotopic assimetry (without S)*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino: Exotic Isotopic assimety of MultyBaryon Quasmon");
}
}
else if(mS<2) // NucFrag+K is possible
{
G4int nN =(kU+kD-4-nI*3)/6;
if(nI>0) // Excess of u-quarks
{
nN+=1;
theQPDG1 = G4QPDGCode(90000000+1000*(nN+nI-1)+nN); // A Fragment
theQPDG2 = G4QPDGCode(321); // A K+ meson
}
else
{
theQPDG1 = G4QPDGCode(90000000+1000*(nN+nI+1)+nN); // A Fragment
theQPDG2 = G4QPDGCode(311); // A K0 meson
}
}
else
{
G4cerr<<"***G4QChipolino: ***Too many kaons are needed*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino: More than one Kaon is needed together with Nuclear Fragm");
}
}
else // Fragment with strangeness
{
if(kS<=kU&&kS<=kD) // Fragment consisting of Neutrons, Protons & Lambrdas only
{
G4int nI=kU-kD; // Isotopic shift
G4int nN=(kU+kD-kS-kS-nI*3)/6;
if((nI>=0&&nN>=0)||(nI<0&&nN>=-nI)) // Delta isn't necessary
{
if(nI>0) // Excess of protons
{
theQPDG1 = G4QPDGCode(90000000+1000*(kS*1000+nN+nI-1)+nN);// A Fragment-Proton
theQPDG2 = G4QPDGCode(2212); // A Proton
}
else // Excess of neutrons
{
theQPDG1 = G4QPDGCode(90000000+1000*(kS*1000+nN+nI)+nN-1);// A Fragment-Neutron
theQPDG2 = G4QPDGCode(2112); // A Neutron
}
}
else if((nI>=0&&nN>-2)||(nI<0&&nN>-nI-2)) // Delta can be a part
{
if(nI>0) // Excess of u-quarks
{
theQPDG1=G4QPDGCode(90000000+1000*(kS*1000+nN+nI-2)+nN+1);// A Fragment-Proton
theQPDG2=G4QPDGCode(2224); // A Delta++
}
else // Excess of d-quarks
{
theQPDG1=G4QPDGCode(90000000+1000*(kS*1000+nN+nI+1)+nN-2);// A Fragment-Neutron
theQPDG2=G4QPDGCode(1114); // A Delta-
}
}
else
{
G4cerr<<"***G4QChipolino: ***Isotopic assimetry (with S)*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino:Exotic Isotopic Assimety of Strange MultyBaryon Quasmon");
}
}
else // Excess of s-quarks
{
G4int lam=kU; // A#of Lambda
if (lam>kD) lam=kD;
G4int lD=kD-lam; // Residual d-quarks
G4int lU=kU-lam; // Residual u-quarks
G4int lS=kS-lam; // Residual s-quarks
if(lD+lU+lS!=3||lD<0||lU<0||lS<0)
{
G4cerr<<"***G4QChipolino: *Fragment* rQC="<<rQC<<",s="<<lS<<",u="<<lU<<",d"<<lD<<G4endl;
G4Exception("G4QChipolino: Exotic superstrange Multy Baryon");
}
if ( !lD && lU==2) theQPDG2=G4QPDGCode(3222); // Sigma+
else if( !lU && lD==2) theQPDG2=G4QPDGCode(3112); // Sigma-
else if( !lD && lU==1) theQPDG2=G4QPDGCode(3322); // Ksi0
else if( !lU && lD==1) theQPDG2=G4QPDGCode(3312); // Ksi-
else theQPDG2=G4QPDGCode(3334); // Omega-
theQPDG1=G4QPDGCode((90+lam)*1000000); // A Strange Matter
}
theQCont1 = rQC-theQPDG2.GetQuarkContent(); // QCont of Fragment-H
theQCont = rQC; // QCont of Chipolino
}
}
}
else
{
G4cerr<<"***G4QChipolino: ***Exotics*** rQC="<<rQC<<G4endl;
G4Exception("G4QChipolino: can not be constructed for the exotic baryon or meson");
}
}
G4QChipolino::G4QChipolino(const G4QChipolino& right)
{
theQPDG1 = right.theQPDG1;
theQPDG2 = right.theQPDG2;
theQCont = right.theQCont;
theQCont1 = right.theQCont1;
minM = right.minM;
}
G4QChipolino::G4QChipolino(G4QChipolino* right)
{
theQPDG1 = right->theQPDG1;
theQPDG2 = right->theQPDG2;
theQCont = right->theQCont;
theQCont1 = right->theQCont1;
minM = right->minM;
}
const G4QChipolino& G4QChipolino::operator=(const G4QChipolino &right)
{
theQPDG1 = right.theQPDG1;
theQPDG2 = right.theQPDG2;
theQCont = right.theQCont;
theQCont1 = right.theQCont1;
minM = right.minM;
return *this;
}
G4QChipolino::~G4QChipolino() {}
// Standard output for G4QChipolino
G4std::ostream& operator<<(G4std::ostream& lhs, G4QChipolino& rhs)
{// ===========================================
lhs<<"{1="<<rhs.GetQPDG1()<<",2="<<rhs.GetQPDG2()<< "}";
return lhs;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,129 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QDecayChan.cc,v 1.14 2001/11/26 14:11:46 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QDecayChan ----------------
// by Mikhail Kossov, Sept 1999.
// class for Decay Channels of Hadrons in CHIPS Model
// -------------------------------------------------------------------
//#define debug
//#define pdebug
#include "G4QDecayChanVector.hh"
#include "g4std/algorithm"
G4QDecayChan::G4QDecayChan(){}
G4QDecayChan::G4QDecayChan(G4double pLev, G4int PDG1, G4int PDG2, G4int PDG3):
aDecayChanLimit(pLev)
{
G4QPDGCode* firstPDG = new G4QPDGCode(PDG1);
theMinMass =firstPDG->GetMass();
aVecOfSecHadrons.push_back(firstPDG);
G4QPDGCode* secondPDG = new G4QPDGCode(PDG2);
theMinMass+=secondPDG->GetMass();
aVecOfSecHadrons.push_back(secondPDG);
if(PDG3)
{
G4QPDGCode* thirdPDG = new G4QPDGCode(PDG3);
theMinMass+=thirdPDG->GetMass();
aVecOfSecHadrons.push_back(thirdPDG);
}
#ifdef debug
cout<<"G4QDecayChan is defined with pL="<<pLev<<",1="<<PDG1<<",2="<<PDG2<<",3="<<PDG3
<<",m1="<<firstPDG->GetMass()<<",m2="<<secondPDG->GetMass()<<",minM="<<theMinMass<<endl;
#endif
}
G4QDecayChan::G4QDecayChan(const G4QDecayChan& right)
{
aDecayChanLimit = right.aDecayChanLimit;
theMinMass = right.theMinMass;
//aVecOfSecHadrons (Vector)
G4int nSH = right.aVecOfSecHadrons.size();
if(nSH) for(G4int ih=0; ih<nSH; ih++)
{
G4QPDGCode* curPC = new G4QPDGCode(right.aVecOfSecHadrons[ih]);
aVecOfSecHadrons.push_back(curPC);
}
}
G4QDecayChan::G4QDecayChan(G4QDecayChan* right)
{
aDecayChanLimit = right->aDecayChanLimit;
theMinMass = right->theMinMass;
//aVecOfSecHadrons (Vector)
G4int nSH = right->aVecOfSecHadrons.size();
if(nSH) for(G4int ih=0; ih<nSH; ih++)
{
G4QPDGCode* curPC = new G4QPDGCode(right->aVecOfSecHadrons[ih]);
aVecOfSecHadrons.push_back(curPC);
}
}
G4QDecayChan::~G4QDecayChan()
{
G4std::for_each(aVecOfSecHadrons.begin(), aVecOfSecHadrons.end(), DeleteQPDGCode());
}
// Assignment operator
const G4QDecayChan& G4QDecayChan::operator=(const G4QDecayChan& right)
{
aDecayChanLimit = right.aDecayChanLimit;
theMinMass = right.theMinMass;
//aVecOfSecHadrons (Vector)
G4int nSH = right.aVecOfSecHadrons.size();
if(nSH) for(G4int ih=0; ih<nSH; ih++)
{
G4QPDGCode* curPC = new G4QPDGCode(right.aVecOfSecHadrons[ih]);
aVecOfSecHadrons.push_back(curPC);
}
return *this;
}
// Standard output for QDecayChan
G4std::ostream& operator<<(G4std::ostream& lhs, G4QDecayChan& rhs)
// =========================================
{
lhs << "[L=" << rhs.GetDecayChanLimit();
G4QPDGCodeVector VSH = rhs.GetVecOfSecHadrons();
G4int n = VSH.size();
lhs << ", N=" << n << ": ";
for (int i=0; i<n; i++)
{
if(!i) lhs << ":";
else lhs << ",";
lhs << VSH[i]->GetPDGCode();
}
lhs << "]";
return lhs;
}
@@ -0,0 +1,536 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QHadron.cc,v 1.22 2001/11/26 14:11:46 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QHadron ----------------
// by Mikhail Kossov, Sept 1999.
// class for Quasmon initiated Hadrons generated by CHIPS Model
// ------------------------------------------------------------------
//#define debug
//#define pdebug
//#define sdebug
#include "G4QHadron.hh"
G4QHadron::G4QHadron() :
theQPDG(0),theMomentum(0.,0.,0.,0.),valQ(0,0,0,0,0,0),nFragm(0)
{}
G4QHadron::G4QHadron(G4LorentzVector p) :
theQPDG(0),theMomentum(p),valQ(0,0,0,0,0,0),nFragm(0)
{}
// For Chipolino or Quasmon doesn't make any sense
G4QHadron::G4QHadron(G4int PDGCode, G4LorentzVector p) :
theQPDG(PDGCode),theMomentum(p),nFragm(0)
{
if(GetQCode()>-1)
{
if(theMomentum.e()==0.) theMomentum.setE(theQPDG.GetMass());
valQ=theQPDG.GetQuarkContent();
}
else if(PDGCode>80000000) DefineQC(PDGCode);
else G4cerr<<"***G4QHaron:(P) PDG="<<PDGCode<<", use other constructor"<<G4endl;
}
// For Chipolino or Quasmon doesn't make any sense
G4QHadron::G4QHadron(G4QPDGCode QPDG, G4LorentzVector p) :
theQPDG(QPDG),theMomentum(p),nFragm(0)
{
if(theQPDG.GetQCode()>-1)
{
if(theMomentum.e()==0.) theMomentum.setE(theQPDG.GetMass());
valQ=theQPDG.GetQuarkContent();
}
else
{
G4cerr<<"***G4QHaron:(QP) PDG="<<theQPDG.GetPDGCode()<<", use other constructor"<<G4endl;
#ifdef sdebug
G4Exception("***G4QHadron: QPDG Constructor failed");
#endif
}
}
// Make sense Chipolino or Quasmon
G4QHadron::G4QHadron(G4QContent QC, G4LorentzVector p) :
theMomentum(p),valQ(QC),nFragm(0)
{
G4int curPDG=valQ.GetSPDGCode();
if(curPDG&&curPDG!=10) theQPDG.SetPDGCode(curPDG);
}
G4QHadron::G4QHadron(G4int PDGCode, G4double aMass, G4QContent QC) :
theQPDG(PDGCode),theMomentum(0.,0.,0., aMass),valQ(QC),nFragm(0)
{}
G4QHadron::G4QHadron(G4QPDGCode QPDG, G4double aMass, G4QContent QC) :
theQPDG(QPDG),theMomentum(0.,0.,0., aMass),valQ(QC),nFragm(0)
{}
G4QHadron::G4QHadron(G4int PDGCode, G4LorentzVector p, G4QContent QC) :
theQPDG(PDGCode),theMomentum(p),valQ(QC),nFragm(0)
{}
G4QHadron::G4QHadron(G4QPDGCode QPDG, G4LorentzVector p, G4QContent QC) :
theQPDG(QPDG),theMomentum(p),valQ(QC),nFragm(0)
{}
G4QHadron::G4QHadron(G4QParticle* pPart, G4double maxM) :
theQPDG(pPart->GetQPDG()),theMomentum(0.,0.,0.,0.),nFragm(0)
{
#ifdef debug
G4cout<<"G4QHadron is created & randomized with maxM="<<maxM<<G4endl;
#endif
G4int PDGCode = theQPDG.GetPDGCode();
if(PDGCode<2) G4cerr<<"***G4QHaron:(M) PDGC="<<PDGCode<<", use other constructor"<<G4endl;
valQ=theQPDG.GetQuarkContent();
theMomentum.setE(RandomizeMass(pPart, maxM));
}
G4QHadron::G4QHadron(const G4QHadron& right)
{
theMomentum = right.theMomentum;
theQPDG = right.theQPDG;
valQ = right.valQ;
nFragm = right.nFragm;
}
G4QHadron::G4QHadron(G4QHadron* right)
{
theMomentum = right->theMomentum;
theQPDG = right->theQPDG;
valQ = right->valQ;
nFragm = right->nFragm;
}
const G4QHadron& G4QHadron::operator=(const G4QHadron &right)
{
theMomentum = right.theMomentum;
theQPDG = right.theQPDG;
valQ = right.valQ;
nFragm = right.nFragm;
return *this;
}
G4QHadron::~G4QHadron() {}
// Decay of the Hadron in 2 particles (f + s) in respect to the direction of refference particle
G4bool G4QHadron::RelDecayIn2(G4LorentzVector& f4Mom, G4LorentzVector& s4Mom,
G4LorentzVector& dir, G4double maxCost, G4double minCost)
{// ===================================================================
G4double fM2 = f4Mom.m2();
G4double fM = sqrt(fM2); // Mass of the 1st Hadron
G4double sM2 = s4Mom.m2();
G4double sM = sqrt(sM2); // Mass of the 2nd Hadron
G4double iM2 = theMomentum.m2();
G4double iM = sqrt(iM2); // Mass of the decaying hadron
G4ThreeVector ltb = theMomentum.boostVector(); // Boost vector for backward Lorentz Trans.
G4ThreeVector ltf = -ltb; // Boost vector for forward Lorentz Trans.
G4LorentzVector cdir = dir; // A copy to make a transformation to CMS
cdir.boost(ltf); // Direction transpormed to CMS of the Momentum
G4ThreeVector vdir = cdir.vect(); // 3-Vector of the direction-particle
#ifdef debug
G4cout<<"G4QHadron::RelDecayIn2: dir="<<dir<<",ltf="<<ltf<<",cdir="<<cdir<<",vdir="<<vdir<<G4endl;
#endif
G4ThreeVector vx(0.,0.,1.); // Ort in the direction of the reference particle
G4ThreeVector vy(0.,1.,0.); // First ort orthogonal to the direction
G4ThreeVector vz(1.,0.,0.); // Second ort orthoganal to the direction
if(vdir.mag2() > 0.) // the refference particle isn't at rest in CMS
{
vx = vdir.unit(); // Ort in the direction of the reference particle
G4ThreeVector vv= vx.orthogonal(); // Not normed orthogonal vector (!)
vy = vv.unit(); // First ort orthogonal to the direction
vz = vx.cross(vy); // Second ort orthoganal to the direction
}
#ifdef debug
G4cout<<"G4QHadron::RelDecayIn2:iM="<<iM<<" => fM="<<fM<<" + sM="<<sM<<",ob="<<vx<<vy<<vz<<G4endl;
#endif
if(maxCost>1.) maxCost=1.;
if (abs(iM-fM-sM)<.001)
{
G4double fR=fM/iM;
G4double sR=sM/iM;
f4Mom=fR*theMomentum;
s4Mom=sR*theMomentum;
return true;
}
else if (iM+.001<fM+sM || iM==0. || maxCost<-1.)
{//@@ Later on make a quark content check for the decay
G4cerr<<"***G4QHadron::RelDecayIn2:fM="<<fM<<"+sM="<<sM<<">iM="<<iM<<",d="<<iM-fM-sM<<",mC="
<<maxCost<<G4endl;
return false;
}
G4double d2 = iM2-fM2-sM2;
G4double p2 = (d2*d2/4.-fM2*sM2)/iM2; // Decay momentum(^2) in CMS of Quasmon
if(p2<0.)
{
#ifdef debug
G4cout<<"***G4QHadr:RelDecIn2:p2="<<p2<<"<0,d2^2="<<d2*d2/4.<<"<4*fM2*sM2="<<4*fM2*sM2<<G4endl;
#endif
p2=0.;
}
G4double p = sqrt(p2);
G4double ct = maxCost;
if(maxCost>minCost&&minCost>=-1.)
{
G4double dcost=maxCost-minCost;
ct = minCost+dcost*G4UniformRand();
}
G4double phi= 360.*deg*G4UniformRand(); // @@ Change 360.*deg to M_TWOPI (?)
G4double ps = p * sqrt(1.-ct*ct);
G4ThreeVector pVect=(ps*sin(phi))*vz+(ps*cos(phi))*vy+p*ct*vx;
#ifdef debug
G4cout<<"G4QHadron::RelDecayIn2:ct="<<ct<<",p="<<p<<",ps="<<ps<<",ph="<<phi<<",v="<<pVect<<G4endl;
#endif
f4Mom.setVect(pVect);
f4Mom.setE(sqrt(fM2+p2));
s4Mom.setVect((-1)*pVect);
s4Mom.setE(sqrt(sM2+p2));
#ifdef debug
G4cout<<"G4QHadron::RelDecayIn2: p2="<<p2<<",v="<<ltb<<",f4Mom="<<f4Mom<<",s4Mom="<<s4Mom<<G4endl;
#endif
f4Mom.boost(ltb); // Lor.Trans. of 1st hadron back to LS
s4Mom.boost(ltb); // Lor.Trans. of 2nd hadron back to LS
#ifdef debug
G4cout<<"G4QHadron::RelDecayIn2: ROOT OUTPUT f4Mom="<<f4Mom<<", s4Mom="<<s4Mom<<G4endl;
#endif
return true;
} // End of "RelDecayIn2"
// Decay of the Hadron in 2 particles (f + s)
G4bool G4QHadron::DecayIn2(G4LorentzVector& f4Mom, G4LorentzVector& s4Mom)
{// ===================================================================
G4double fM = f4Mom.m(); // Mass of the 1st Hadron
G4double fM2 = f4Mom.m2();
G4double sM = s4Mom.m(); // Mass of the 2nd Hadron
G4double sM2 = s4Mom.m2();
G4double iM = theMomentum.m(); // Mass of the decaying hadron
G4double iM2 = theMomentum.m2();
#ifdef pdebug
G4cout<<"G4QHadron::DecayIn2: iM="<<iM<<theMomentum<<" => fM="<<fM<<" + sM="<<sM<<G4endl;
#endif
//@@ Later on make a quark content check for the decay
if (abs(iM-fM-sM)<.001)
{
G4double fR=fM/iM;
G4double sR=sM/iM;
f4Mom=fR*theMomentum;
s4Mom=sR*theMomentum;
return true;
}
#ifdef pdebug
else if (iM+.001<fM+sM || iM==0.)
{
G4cerr<<"***G4QHadron::DecayIn2*** fM="<<fM<<" + sM="<<sM<<"="<<fM+sM<<" > iM="<<iM<<", d="
<<iM-fM-sM<<G4endl;
return false;
}
#endif
G4double d2 = iM2-fM2-sM2;
G4double p2 = (d2*d2/4.-fM2*sM2)/iM2; // Decay momentum(^2) in CMS of Quasmon
if (p2<0.)
{
#ifdef pdebug
G4cerr<<"***G4QHadr::DecayIn2:p2="<<p2<<"<0,d2^2="<<d2*d2/4.<<"<4*fM2*sM2="<<4*fM2*sM2<<G4endl;
#endif
p2=0.;
}
G4double p = sqrt(p2);
G4double ct = 1.-2*G4UniformRand();
#ifdef debug
G4cout<<"G4QHadron::DecayIn2: ct="<<ct<<", p="<<p<<G4endl;
#endif
G4double phi= 360.*deg*G4UniformRand(); // @@ Change 360.*deg to M_TWOPI (?)
G4double ps = p * sqrt(1.-ct*ct);
G4ThreeVector pVect(ps*sin(phi),ps*cos(phi),p*ct);
f4Mom.setVect(pVect);
f4Mom.setE(sqrt(fM2+p2));
s4Mom.setVect((-1)*pVect);
s4Mom.setE(sqrt(sM2+p2));
G4ThreeVector ltb = theMomentum.boostVector(); // Boost vector for backward Lor.Trans.
#ifdef pdebug
G4cout<<"G4QHadron::DecayIn2: LorTransform v="<<ltb<<", f4Mom="<<f4Mom<<", s4Mom="<<s4Mom<<G4endl;
#endif
f4Mom.boost(ltb); // Lor.Trans. of 1st hadron back to LS
s4Mom.boost(ltb); // Lor.Trans. of 2nd hadron back to LS
#ifdef pdebug
G4cout<<"G4QHadron::DecayIn2: ROOT OUTPUT f4Mom="<<f4Mom<<", s4Mom="<<s4Mom<<G4endl;
#endif
return true;
} // End of "DecayIn2"
// Correction for the Hadron + fr decay in case of the new corM mass of the Hadron
G4bool G4QHadron::CorMDecayIn2(G4double corM, G4LorentzVector& fr4Mom)
{// ===============================================================
G4double fM = fr4Mom.m(); // Mass of the Fragment
G4LorentzVector comp=theMomentum+fr4Mom; // 4Mom of the decaying compound system
G4double iM = comp.m(); // mass of the decaying compound system
#ifdef pdebug
G4cout<<"G4QHadr::CorMDecayIn2: iM="<<iM<<comp<<"=>fM="<<fM<<"+corM="<<corM<<"="<<fM+corM<<G4endl;
#endif
G4double dE=iM-fM-corM;
//@@ Later on make a quark content check for the decay
if (abs(dE)<.001)
{
G4double fR=fM/iM;
G4double cR=corM/iM;
fr4Mom=fR*comp;
theMomentum=cR*comp;
return true;
}
else if (dE<-.001 || iM==0.)
{
G4cerr<<"***G4QHadron::CorMDecayIn2***fM="<<fM<<" + cM="<<corM<<" > iM="<<iM<<",d="<<dE<<G4endl;
return false;
}
G4double corM2= corM*corM;
G4double fM2 = fM*fM;
G4double iM2 = iM*iM;
G4double d2 = iM2-fM2-corM2;
G4double p2 = (d2*d2/4.-fM2*corM2)/iM2; // Decay momentum(^2) in CMS of Quasmon
if (p2<0.)
{
#ifdef pdebug
G4cerr<<"***G4QH::CorMDecayIn2:p2="<<p2<<"<0, d="<<d2*d2/4.<<"<4*fM2*hM2="<<4*fM2*corM2<<G4endl;
#endif
p2=0.;
}
G4double p = sqrt(p2);
G4ThreeVector ltb = comp.boostVector(); // Boost vector for backward Lor.Trans.
G4ThreeVector ltf = -ltb; // Boost vector for forward Lorentz Trans.
G4LorentzVector cm4Mom=fr4Mom; // Copy of fragment 4Mom to transform to CMS
cm4Mom.boost(ltf); // Now it is in CMS (Forward Lor.Trans.)
G4double pfx= cm4Mom.px();
G4double pfy= cm4Mom.py();
G4double pfz= cm4Mom.pz();
G4double pt2= pfx*pfx+pfy*pfy;
G4double tx=0.;
G4double ty=0.;
if(pt2<=0.)
{
G4double phi= 360.*deg*G4UniformRand(); // @@ Change 360.*deg to M_TWOPI (?)
tx=sin(phi);
ty=cos(phi);
}
else
{
G4double pt=sqrt(pt2);
tx=pfx/pt;
ty=pfy/pt;
}
G4double pc2=pt2+pfz*pfz;
G4double ct=0.;
if(pc2<=0.)
{
G4double rnd= G4UniformRand();
ct=1.-rnd-rnd;
}
else
{
G4double pc=sqrt(pc2);
ct=pfz/pc;
}
#ifdef debug
G4cout<<"G4QHadron::CorMDecayIn2: ct="<<ct<<", p="<<p<<G4endl;
#endif
G4double ps = p * sqrt(1.-ct*ct);
G4ThreeVector pVect(ps*tx,ps*ty,p*ct);
fr4Mom.setVect(pVect);
fr4Mom.setE(sqrt(fM2+p2));
theMomentum.setVect((-1)*pVect);
theMomentum.setE(sqrt(corM2+p2));
#ifdef pdebug
G4LorentzVector dif2=comp-fr4Mom-Momentum;
G4cout<<"G4QHadron::CorMDecayIn2:vBLT="<<ltb<<",f4M="<<fr4Mom<<",h4M="<<theMomentum<<dif1<<G4endl;
#endif
fr4Mom.boost(ltb); // Lor.Trans. of the Fragment back to LS
theMomentum.boost(ltb); // Lor.Trans. of the Hadron back to LS
#ifdef pdebug
G4LorentzVector dif2=comp-fr4Mom-Momentum;
G4cout<<"G4QHadr::CorMDecayIn2:OUTPUT:f4Mom="<<fr4Mom<<",h4Mom="<<theMomentum<<"d="<<dif2<<G4endl;
#endif
return true;
} // End of "CorMDecayIn2"
// Fragment fr4Mom louse energy corE and transfer it to This Hadron
G4bool G4QHadron::CorEDecayIn2(G4double corE, G4LorentzVector& fr4Mom)
{// ===============================================================
G4double fE = fr4Mom.m(); // Energy of the Fragment
#ifdef pdebug
G4cout<<"G4QHadron::CorEDecayIn2:fE="<<fE<<fr4Mom<<" > corE="<<corE<<",h4M="<<theMomentum<<G4endl;
#endif
if (fE+.001<=corE)
{
#ifdef pdebug
G4cerr<<"***G4QHadron::CorEDecayIn2*** fE="<<fE<<" < corE="<<corE<<", d="<<corE-fE<<G4endl;
#endif
return false;
}
G4double fM2=fr4Mom.m2(); // Squared Mass of the Fragment
G4double iPx=fr4Mom.px(); // Initial Px of the Fragment
G4double iPy=fr4Mom.py(); // Initial Py of the Fragment
G4double iPz=fr4Mom.pz(); // Initial Pz of the Fragment
G4double fP2=iPx*iPx+iPy*iPy+iPz*iPz; // Initial Squared 3-momentum of the Fragment
G4double finE = fE - corE; // Final energy of the fragment
G4double rP = sqrt((finE*finE-fM2)/fP2); // Reduction factor for the momentum
G4double fPx=iPx*rP;
G4double fPy=iPy*rP;
G4double fPz=iPz*rP;
fr4Mom= G4LorentzVector(fPx,fPy,fPz,finE);
G4double Px=theMomentum.px()+iPx-fPx;
G4double Py=theMomentum.py()+iPy-fPy;
G4double Pz=theMomentum.pz()+iPz-fPz;
G4double mE=theMomentum.e();
///////////G4double mM2=theMomentum.m2();
theMomentum= G4LorentzVector(Px,Py,Pz,mE+corE);
#ifdef pdebug
G4double difF=fr4Mom.m2()-fM2;
G4double difM=theMomentum.m2()-mM2;
G4cout<<"G4QHadr::CorEDecayIn2:dmM2="<<difM<<",dfM2="<<difF<<",out:"<<theMomentum<<fr4Mom<<G4endl;
#endif
return true;
} // End of "CorEDecayIn2"
// Decay of the hadron in 3 particles i=>r+s+t
G4bool G4QHadron::DecayIn3(G4LorentzVector& f4Mom,G4LorentzVector& s4Mom,G4LorentzVector& t4Mom)
{// =========================================================================================
#ifdef debug
G4cout<<"G4QHadron::DecayIn3:"<<theMomentum<<"=>pf="<<f4Mom<<"+ps="<<s4Mom<<"+pt="<<t4Mom<<G4endl;
#endif
G4double iM = theMomentum.m(); // Mass of the decaying hadron
G4double fM = f4Mom.m(); // Mass of the 1st hadron
G4double sM = s4Mom.m(); // Mass of the 2nd hadron
G4double tM = t4Mom.m(); // Mass of the 3rd hadron
if (iM+.001<fM+sM+tM)
{
G4cerr<<"***G4QHadron::DecayIn3:fM="<<fM<<" + sM="<<sM<<" + tM="<<tM<<" > iM="<<iM<<",d="
<<iM-fM-sM-tM<<G4endl;
return false;
}
G4double fM2 = fM*fM;
G4double sM2 = sM*sM;
G4double tM2 = tM*tM;
G4double iM2 = iM*iM;
G4double m13sBase=(iM-sM)*(iM-sM)-(fM+tM)*(fM+tM);
G4double m12sMin =(fM+sM)*(fM+sM);
G4double m12sBase=(iM-tM)*(iM-tM)-m12sMin;
G4double rR = 0.;
G4double rnd= 1.;
/////////////G4int tr = 0; //@@ Comment if "cout" below is skiped @@
G4double m12s = 0.; // Fake definition before the Loop
while (rnd > rR)
{
m12s = m12sMin + m12sBase*G4UniformRand();
G4double e1=m12s-fM2-sM2;
G4double e2=iM2-m12s-tM2;
G4double four12=4*m12s;
G4double m13sRange=sqrt((e1*e1-four12*fM2)*(e2*e2-four12*tM2))/m12s;
rR = m13sRange/m13sBase;
rnd= G4UniformRand();
#ifdef debug
G4cout<<"G4QHadron::DecayIn3: try to decay #"<<++tr<<", rR="<<rR<<", rnd="<<rnd<<G4endl;
#endif
}
G4double m12 = sqrt(m12s); // Mass of the H1+H2 system
G4LorentzVector dh4Mom(0.,0.,0.,m12);
if(!DecayIn2(t4Mom,dh4Mom))
{
G4cerr<<"***G4QHadron::DecayIn3: Exception1"<<G4endl;
//G4Exception("***G4QHadron::DecayIn3(): DecayIn2 did not succeed");
return false;
}
#ifdef debug
G4cout<<"G4QHadron::DecayIn3: Now the last decay of m12="<<dh4Mom.m()<<G4endl;
#endif
if(!G4QHadron(dh4Mom).DecayIn2(f4Mom,s4Mom))
{
G4cerr<<"***G4QHadron::DecayIn3: Exception2"<<G4endl;
//G4Exception("G4QHadron::DecayIn3(): DecayIn2 did not succeed");
return false;
}
return true;
}
// Randomize particle mass taking into account the width
G4double G4QHadron::RandomizeMass(G4QParticle* pPart, G4double maxM)
// ===========================================================
{
G4double meanM = theQPDG.GetMass();
G4double width = theQPDG.GetWidth()/2.;
#ifdef debug
G4cout<<"G4QHadron::RandomizeMass: meanM="<<meanM<<", halfWidth="<<width<<G4endl;
#endif
if(maxM<meanM-3*width)
{
#ifdef debug
G4cerr<<"***G4QHadron::RandMass: maxM="<<maxM<<" < meanM="<<meanM<<" - 3*halfW="<<width<<G4endl;
#endif
return 0.;
}
///////////////G4double theMass = 0.;
if(width==0.)
{
#ifdef debug
if(meanM>maxM) G4cerr<<"***G4QHadron::RandomizeMass:Stable m="<<meanM<<" > maxM="<<maxM<<G4endl;
#endif
return meanM;
//return 0.;
}
else if(width<0.)
{
G4cerr<<"***G4QHadron::RandomizeMass: width="<<width<<"<0, PDGC="<<theQPDG.GetPDGCode()<<G4endl;
G4Exception("G4QHadron::RandomizeMass: width of the Hadron < 0");
}
G4double minM = pPart->MinMassOfFragm();
if(minM>maxM)
{
#ifdef debug
G4cerr<<"***G4QHadron::RandomizeMass:for PDG="<<theQPDG.GetPDGCode()<<" minM="<<minM
<<" > maxM="<<maxM<<G4endl;
#endif
return 0.;
}
//Now calculate the Breit-Wigner distribution with two cuts
G4double v1=atan((minM-meanM)/width);
G4double v2=atan((maxM-meanM)/width);
G4double dv=v2-v1;
#ifdef debug
G4cout<<"G4QHadron::RandomizeMass:Mi="<<minM<<",i="<<v1<<",Ma="<<maxM<<",a="<<v2<<","<<dv<<G4endl;
#endif
return meanM+width*tan(v1+dv*G4UniformRand());
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,105 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QParentCluster.cc,v 1.13 2001/11/26 14:11:46 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QParentCluster ----------------
// by Mikhail Kossov, Sept 1999.
// class fora Parent nuclear cluster in the CHIPS Model
// ----------------------------------------------------------
//#define debug
//#define pdebug
#include "G4QParentClusterVector.hh"
G4QParentCluster::G4QParentCluster(G4int PDGCode): thePDGCode(PDGCode), theProbability(0.){}
G4QParentCluster::G4QParentCluster(G4int PDGCode, G4double prob):
thePDGCode(PDGCode), theProbability(prob){}
G4QParentCluster::G4QParentCluster(const G4QParentCluster& rhs)
{
thePDGCode = rhs.thePDGCode;
theProbability = rhs.theProbability;
nQPart2 = rhs.nQPart2;
transQC = rhs.transQC;
lowLimit = rhs.lowLimit;
highLimit = rhs.highLimit;
theEnvBoundedMass = rhs.theEnvBoundedMass;
theEnvBindingEnergy = rhs.theEnvBindingEnergy;
theNucBoundedMass = rhs.theNucBoundedMass;
theNucBindingEnergy = rhs.theNucBindingEnergy;
}
G4QParentCluster::G4QParentCluster(G4QParentCluster* rhs)
{
thePDGCode = rhs->thePDGCode;
theProbability = rhs->theProbability;
nQPart2 = rhs->nQPart2;
transQC = rhs->transQC;
lowLimit = rhs->lowLimit;
highLimit = rhs->highLimit;
theEnvBoundedMass = rhs->theEnvBoundedMass;
theEnvBindingEnergy = rhs->theEnvBindingEnergy;
theNucBoundedMass = rhs->theNucBoundedMass;
theNucBindingEnergy = rhs->theNucBindingEnergy;
}
const G4QParentCluster& G4QParentCluster::operator=(const G4QParentCluster& rhs)
{
thePDGCode = rhs.thePDGCode;
theProbability = rhs.theProbability;
nQPart2 = rhs.nQPart2;
transQC = rhs.transQC;
lowLimit = rhs.lowLimit;
highLimit = rhs.highLimit;
theEnvBoundedMass = rhs.theEnvBoundedMass;
theEnvBindingEnergy = rhs.theEnvBindingEnergy;
theNucBoundedMass = rhs.theNucBoundedMass;
theNucBindingEnergy = rhs.theNucBindingEnergy;
return *this;
}
G4QParentCluster::~G4QParentCluster() {}
// Standard output for G4QParentCluster
G4std::ostream& operator<<(G4std::ostream& lhs, G4QParentCluster& rhs)
{// ===============================================
lhs << "[ParClPDG=" << rhs.GetPDGCode() << ", probab=" << rhs.GetProbability() << "]";
return lhs;
}
// Standard output for const G4QParentCluster
G4std::ostream& operator<<(G4std::ostream& lhs, const G4QParentCluster& rhs)
{// ===============================================
lhs << "[ParClPDG=" << rhs.GetPDGCode() << ", probab=" << rhs.GetProbability() << "]";
return lhs;
}
@@ -0,0 +1,698 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QParticle.cc,v 1.17 2001/11/26 14:11:47 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QParticle ----------------
// by Mikhail Kossov, Sept 1999.
// class for Particles in the CHIPS Model
// -------------------------------------------------------------------
//#define debug
//#define pdebug
#include "G4QParticleVector.hh"
G4QParticle::G4QParticle() {}
G4QParticle::G4QParticle(G4int thePDG)
{
aQPDG = G4QPDGCode(thePDG);
aQuarkCont = aQPDG.GetQuarkContent();
aDecay = InitDecayVector(aQPDG.GetQCode());
}
G4QParticle::G4QParticle(const G4QParticle& right)
{
aQPDG = right.aQPDG;
//aDecay (Vector)
G4int nD = right.aDecay.size();
if(nD) for(G4int id=0; id<nD; id++)
{
G4QDecayChan* curD = new G4QDecayChan(right.aDecay[id]);
aDecay.push_back(curD);
}
aQuarkCont = right.aQuarkCont;
}
G4QParticle::G4QParticle(G4QParticle* right)
{
aQPDG = right->aQPDG;
//aDecay (Vector)
G4int nD = right->aDecay.size();
if(nD) for(G4int id=0; id<nD; id++)
{
G4QDecayChan* curD = new G4QDecayChan(right->aDecay[id]);
aDecay.push_back(curD);
}
aQuarkCont = right->aQuarkCont;
}
G4QParticle::~G4QParticle()
{
G4std::for_each(aDecay.begin(), aDecay.end(), DeleteQDecayChan());
}
// Assignment operator
const G4QParticle& G4QParticle::operator=(const G4QParticle &right)
{
aQPDG = right.aQPDG;
//aDecay (Vector)
G4int nD = right.aDecay.size();
if(nD) for(G4int id=0; id<nD; id++)
{
G4QDecayChan* curD = new G4QDecayChan(right.aDecay[id]);
aDecay.push_back(curD);
}
aQuarkCont = right.aQuarkCont;
return *this;
}
// Standard output for QParticle
G4std::ostream& operator<<(G4std::ostream& lhs, G4QParticle& rhs)
// =========================================
{
G4QPDGCode rhsQPDG = rhs.GetQPDG();
lhs << G4endl << "Particle with PDG=" << rhsQPDG << ", Spin=" << rhs.GetSpin()
<< ", mass=" << rhs.GetMass() << ", width=" << rhs.GetWidth() << G4endl;
lhs << " Quark Content of the Particle=" << rhs.GetQContent() << ", Decay Channels:" << G4endl;
G4QDecayChanVector DCV = rhs.GetDecayVector();
G4int n = DCV.size();
for (int i=0; i<n; i++)
{
lhs << DCV[i]->GetDecayChanLimit() << "PDG codes";
G4QPDGCodeVector PCV=DCV[i]->GetVecOfSecHadrons();
G4int m = PCV.size();
for (int j=0; j<m; j++)
{
if(!j) lhs << ":";
else lhs << ",";
lhs << PCV[j]->GetPDGCode() ;
}
}
return lhs;
}
// Initialize the PDG-Particle by QCode @@ Can be improved, using PDG.DATA file
G4QDecayChanVector G4QParticle::InitDecayVector(G4int nQ)
// ===================================================
{
//static G4int nP = 486; // Up to A=80
static G4int nP = 494; // Up to A=80 "Isonuclear revision"
static G4QDecayChanVector* DecayDB = new G4QDecayChanVector[nP];
static int limit= 0;
if(nQ>=limit && nQ<nP)
{
// *** Secondary PDG-particles should be ordered in a Channel by increasing width ***!!!***
// *** Channels should be ordered by increasing minimum mass of the secondary particles ***
//if(limit<= 0 && nQ>= 0)DecayDB[ 0] = NULL; // gamma
if(limit<= 1 && nQ>= 1) // Low sigma=pi,pi S-wave : f_0 (800)
{
DecayDB[ 1].push_back(new G4QDecayChan(.333,211,-211));
DecayDB[ 1].push_back(new G4QDecayChan(1.00,111, 111));
}
if(limit<= 2 && nQ>= 2) // Midle Regeon-Pomeron : f_0 (980)
{
DecayDB[ 2].push_back(new G4QDecayChan(.333,211,-211));
DecayDB[ 2].push_back(new G4QDecayChan(1.00,111, 111));
}
if(limit<= 3 && nQ>= 3) // High Regeon-Pomeron : f_0 (1500)
{
DecayDB[ 3].push_back(new G4QDecayChan(.300,221, 331));
DecayDB[ 3].push_back(new G4QDecayChan(.600,221, 221));
DecayDB[ 3].push_back(new G4QDecayChan(.650,311,-311));
DecayDB[ 3].push_back(new G4QDecayChan(.700,321,-321));
DecayDB[ 3].push_back(new G4QDecayChan(.800,211,-211));
DecayDB[ 3].push_back(new G4QDecayChan(1.00,111, 111));
}
//if(limit<= 4 && nQ>= 4)DecayDB[ 4].push_back(new G4QDecayChan(1.00, 22, 22));//Pi 0
//if(limit<= 5 && nQ>= 5)DecayDB[ 5] = NULL; // Pi +
if(limit<= 6 && nQ>= 6) // eta
{
DecayDB[ 6].push_back(new G4QDecayChan(.231,211,-211,111));
DecayDB[ 6].push_back(new G4QDecayChan(.553,111, 111,111));
DecayDB[ 6].push_back(new G4QDecayChan(.603,211,-211, 22));
DecayDB[ 6].push_back(new G4QDecayChan(1.00, 22, 22));
}
//if(limit<= 7 && nQ>= 7) // K 0 (K_short - probab 1/2) @@@@@@@@@@@@
//{
// DecayDB[ 7].push_back(new G4QDecayChan(.6861,211,-211));
// DecayDB[ 7].push_back(new G4QDecayChan(1.00, 111, 111));
//}
//if(limit<= 8 && nQ>= 8)DecayDB[ 8] = NULL; // K +
if(limit<= 9 && nQ>= 9) // eta'
{
DecayDB[ 9].push_back(new G4QDecayChan(.438,211,-211,221));
DecayDB[ 9].push_back(new G4QDecayChan(.645,111, 111,221));
DecayDB[ 9].push_back(new G4QDecayChan(.675, 22, 223));
DecayDB[ 9].push_back(new G4QDecayChan(.677,111, 111,111));
DecayDB[ 9].push_back(new G4QDecayChan(.979, 22, 113));
DecayDB[ 9].push_back(new G4QDecayChan(1.00, 22, 22));
}
//if(limit<= 10 && nQ>= 10)DecayDB[ 10] = NULL; // n
//if(limit<= 11 && nQ>= 11)DecayDB[ 11] = NULL; // p
//if(limit<= 12 && nQ>= 12) // Lambda ===>>> all week decays are closed at this time
//{
// DecayDB[ 12].push_back(new G4QDecayChan(.640,2212,-211));
// DecayDB[ 12].push_back(new G4QDecayChan(1.00,2112, 111));
//}
//if(limit<= 13 && nQ>= 13)DecayDB[ 13].push_back(new G4QDecayChan(1.00,2112,-211)); // Sigma -
if(limit<= 14 && nQ>= 14)DecayDB[ 14].push_back(new G4QDecayChan(1.00,3122, 22));//Sigma 0(EM)
//if(limit<= 15 && nQ>= 15) // Sigma +
//{
// DecayDB[ 15].push_back(new G4QDecayChan(.484,2112, 211));
// DecayDB[ 15].push_back(new G4QDecayChan(1.00,2212, 111));
//}
//if(limit<= 16 && nQ>= 16)DecayDB[ 16].push_back(new G4QDecayChan(1.00,3122,-211)); // Ksi -
//if(limit<= 17 && nQ>= 17)DecayDB[ 17].push_back(new G4QDecayChan(1.00,3122, 111)); // Ksi 0
if(limit<= 18 && nQ>= 18)DecayDB[ 18].push_back(new G4QDecayChan(1.00, 211,-211)); // rho 0
if(limit<= 19 && nQ>= 19)DecayDB[ 19].push_back(new G4QDecayChan(1.00, 211, 111)); // rho +
if(limit<= 20 && nQ>= 20) // omega
{
DecayDB[ 20].push_back(new G4QDecayChan(.892, 211,-211,111));
DecayDB[ 20].push_back(new G4QDecayChan(.914, 211,-211));
DecayDB[ 20].push_back(new G4QDecayChan(1.00, 22, 111));
}
if(limit<= 21 && nQ>= 21) // K* 0
{
DecayDB[ 21].push_back(new G4QDecayChan(.667,-211, 321));
DecayDB[ 21].push_back(new G4QDecayChan(1.00, 111, 311));
}
if(limit<= 22 && nQ>= 22) // K* +
{
DecayDB[ 22].push_back(new G4QDecayChan(.667, 211, 311));
DecayDB[ 22].push_back(new G4QDecayChan(1.00, 111, 321));
}
if(limit<= 23 && nQ>= 23) // phi
{
DecayDB[ 23].push_back(new G4QDecayChan(.341, 311,-311));
DecayDB[ 23].push_back(new G4QDecayChan(.832, 321,-321));
DecayDB[ 23].push_back(new G4QDecayChan(.850, 22, 221));
DecayDB[ 23].push_back(new G4QDecayChan(.900, 211,-213));
DecayDB[ 23].push_back(new G4QDecayChan(.950,-211, 213));
DecayDB[ 23].push_back(new G4QDecayChan(1.00, 111, 113));
}
if(limit<= 24 && nQ>= 24)DecayDB[ 24].push_back(new G4QDecayChan(1.00,2112,-211)); // Delta -
if(limit<= 25 && nQ>= 25) // Delta 0
{
DecayDB[ 25].push_back(new G4QDecayChan(.333,2212,-211));
DecayDB[ 25].push_back(new G4QDecayChan(1.00,2112, 111));
}
if(limit<= 26 && nQ>= 26) // Delta +
{
DecayDB[ 26].push_back(new G4QDecayChan(.333,2112, 211));
DecayDB[ 26].push_back(new G4QDecayChan(1.00,2212, 111));
}
if(limit<= 27 && nQ>= 27)DecayDB[ 27].push_back(new G4QDecayChan(1.00,2212, 211)); // Delta ++
if(limit<= 28 && nQ>= 28) // Lambda* (1520)
{
DecayDB[ 28].push_back(new G4QDecayChan(.230,3112,-311));
DecayDB[ 28].push_back(new G4QDecayChan(.460,3222,-321));
DecayDB[ 28].push_back(new G4QDecayChan(.463,3112,211,111));
DecayDB[ 28].push_back(new G4QDecayChan(.466,3212,211,-211));
DecayDB[ 28].push_back(new G4QDecayChan(.467,3212,111,111));
DecayDB[ 28].push_back(new G4QDecayChan(.470,3222,-211,111));
DecayDB[ 28].push_back(new G4QDecayChan(.540,3122,211,-211));
DecayDB[ 28].push_back(new G4QDecayChan(.570,3122,111,111));
DecayDB[ 28].push_back(new G4QDecayChan(.710,3222,-211));
DecayDB[ 28].push_back(new G4QDecayChan(.850,3212, 111));
DecayDB[ 28].push_back(new G4QDecayChan(.990,3112, 211));
DecayDB[ 28].push_back(new G4QDecayChan(1.00,3122, 22));
}
if(limit<= 29 && nQ>= 29) // Sigma* -
{
DecayDB[ 29].push_back(new G4QDecayChan(.060,3112, 111));
DecayDB[ 29].push_back(new G4QDecayChan(.120,3212,-211));
DecayDB[ 29].push_back(new G4QDecayChan(1.00,3122,-211));
}
if(limit<= 30 && nQ>= 30) // Sigma* 0
{
DecayDB[ 30].push_back(new G4QDecayChan(.040,3112, 211));
DecayDB[ 30].push_back(new G4QDecayChan(.080,3222,-211));
DecayDB[ 30].push_back(new G4QDecayChan(.120,3212, 111));
DecayDB[ 30].push_back(new G4QDecayChan(1.00,3122, 111));
}
if(limit<= 31 && nQ>= 31) // Sigma* +
{
DecayDB[ 31].push_back(new G4QDecayChan(.060,3212, 211));
DecayDB[ 31].push_back(new G4QDecayChan(.120,3222, 111));
DecayDB[ 31].push_back(new G4QDecayChan(1.00,3122, 211));
}
if(limit<= 32 && nQ>= 32) // Ksi* -
{
DecayDB[ 32].push_back(new G4QDecayChan(.667,3322,-211));
DecayDB[ 32].push_back(new G4QDecayChan(1.00,3312, 111));
}
if(limit<= 33 && nQ>= 33) // Ksi* 0
{
DecayDB[ 33].push_back(new G4QDecayChan(.667,3312, 211));
DecayDB[ 33].push_back(new G4QDecayChan(1.00,3322, 111));
}
//if(limit<= 34 && nQ>= 34) // OMEGA - (Weak)
//{
// DecayDB[ 34].push_back(new G4QDecayChan(.678,3122, 321));
// DecayDB[ 34].push_back(new G4QDecayChan(.914,3322,-211));
// DecayDB[ 34].push_back(new G4QDecayChan(1.00,3312, 111));
//}
if(limit<= 35 && nQ>= 35) // a_2 0
{
DecayDB[ 35].push_back(new G4QDecayChan(.068, 211,-211,223));
DecayDB[ 35].push_back(new G4QDecayChan(.102, 111, 111,223));
DecayDB[ 35].push_back(new G4QDecayChan(.126, 321,-321));
DecayDB[ 35].push_back(new G4QDecayChan(.150, 311,-311));
DecayDB[ 35].push_back(new G4QDecayChan(.298, 111, 221));
DecayDB[ 35].push_back(new G4QDecayChan(.532,-211, 213));
DecayDB[ 35].push_back(new G4QDecayChan(.766, 211,-213));
DecayDB[ 35].push_back(new G4QDecayChan(1.00, 111, 113));
}
if(limit<= 36 && nQ>= 36) // a_2 +
{
DecayDB[ 36].push_back(new G4QDecayChan(.102,111,211,223));
DecayDB[ 36].push_back(new G4QDecayChan(.150, 321,-311));
DecayDB[ 36].push_back(new G4QDecayChan(.298, 211, 221));
DecayDB[ 36].push_back(new G4QDecayChan(.649, 211, 113));
DecayDB[ 36].push_back(new G4QDecayChan(1.00, 111, 213));
}
if(limit<= 37 && nQ>= 37) // f_2 0
{
DecayDB[ 37].push_back(new G4QDecayChan(.005, 221, 221));
DecayDB[ 37].push_back(new G4QDecayChan(.028, 311,-311));
DecayDB[ 37].push_back(new G4QDecayChan(.051, 321,-321));
DecayDB[ 37].push_back(new G4QDecayChan(.123, 111, 113));
DecayDB[ 37].push_back(new G4QDecayChan(.126, 111, 221));
DecayDB[ 37].push_back(new G4QDecayChan(.154, 211,-211,113));
DecayDB[ 37].push_back(new G4QDecayChan(.718, 211,-211));
DecayDB[ 37].push_back(new G4QDecayChan(1.00, 111, 111));
}
if(limit<= 38 && nQ>= 38) // K_2 0
{
DecayDB[ 38].push_back(new G4QDecayChan(.028, 311, 223));
DecayDB[ 38].push_back(new G4QDecayChan(.074, 211,-211,313));
DecayDB[ 38].push_back(new G4QDecayChan(.143,111,-211,323));
DecayDB[ 38].push_back(new G4QDecayChan(.166,111, 111,313));
DecayDB[ 38].push_back(new G4QDecayChan(.190,-211, 323));
DecayDB[ 38].push_back(new G4QDecayChan(.314, 111, 313));
DecayDB[ 38].push_back(new G4QDecayChan(.357, 311, 113));
DecayDB[ 38].push_back(new G4QDecayChan(.500, 321,-213));
DecayDB[ 38].push_back(new G4QDecayChan(.750,-211, 321));
DecayDB[ 38].push_back(new G4QDecayChan(1.00, 111, 311));
}
if(limit<= 39 && nQ>= 39) // K_2 +
{
DecayDB[ 39].push_back(new G4QDecayChan(.028, 321, 223));
DecayDB[ 39].push_back(new G4QDecayChan(.074,211,-211,323));
DecayDB[ 39].push_back(new G4QDecayChan(.143,111, 211,313));
DecayDB[ 39].push_back(new G4QDecayChan(.166,111, 111,323));
DecayDB[ 39].push_back(new G4QDecayChan(.190, 211, 313));
DecayDB[ 39].push_back(new G4QDecayChan(.314, 111, 323));
DecayDB[ 39].push_back(new G4QDecayChan(.357, 311, 213));
DecayDB[ 39].push_back(new G4QDecayChan(.500, 321, 113));
DecayDB[ 39].push_back(new G4QDecayChan(.750, 211, 311));
DecayDB[ 39].push_back(new G4QDecayChan(1.00, 111, 321));
}
if(limit<= 40 && nQ>= 40) // f_2' 0
{
DecayDB[ 40].push_back(new G4QDecayChan(.103, 221, 221));
DecayDB[ 40].push_back(new G4QDecayChan(.547, 311,-311));
DecayDB[ 40].push_back(new G4QDecayChan(.991, 321,-321));
DecayDB[ 40].push_back(new G4QDecayChan(.997, 211,-211));
DecayDB[ 40].push_back(new G4QDecayChan(1.00, 111, 111));
}
if(limit<= 41 && nQ>= 41) // N_5/2 0
{
DecayDB[ 41].push_back(new G4QDecayChan(.040, 211, 1114));
DecayDB[ 41].push_back(new G4QDecayChan(.080, 111, 2114));
DecayDB[ 41].push_back(new G4QDecayChan(.120,-211, 2214));
DecayDB[ 41].push_back(new G4QDecayChan(.180, 2112, 113));
DecayDB[ 41].push_back(new G4QDecayChan(.210, 2212,-213));
DecayDB[ 41].push_back(new G4QDecayChan(.340, 2112, 110));
DecayDB[ 41].push_back(new G4QDecayChan(.780, 2212,-211));
DecayDB[ 41].push_back(new G4QDecayChan(1.00, 2112, 111));
}
if(limit<= 42 && nQ>= 42) // N_5/2 +
{
DecayDB[ 42].push_back(new G4QDecayChan(.040,-211, 2224));
DecayDB[ 42].push_back(new G4QDecayChan(.080, 211, 2114));
DecayDB[ 42].push_back(new G4QDecayChan(.120, 111, 2214));
DecayDB[ 42].push_back(new G4QDecayChan(.180, 2112, 213));
DecayDB[ 42].push_back(new G4QDecayChan(.210, 2212, 113));
DecayDB[ 42].push_back(new G4QDecayChan(.340, 2212, 229));
DecayDB[ 42].push_back(new G4QDecayChan(.780, 2112, 211));
DecayDB[ 42].push_back(new G4QDecayChan(1.00, 2212, 111));
}
if(limit<= 43 && nQ>= 43) // LAMBDA_5/2
{
DecayDB[ 43].push_back(new G4QDecayChan(.350, 2112,-311));
DecayDB[ 43].push_back(new G4QDecayChan(.700, 2212,-321));
DecayDB[ 43].push_back(new G4QDecayChan(.740, 211, 3114));
DecayDB[ 43].push_back(new G4QDecayChan(.780,-211, 3224));
DecayDB[ 43].push_back(new G4QDecayChan(.820, 111, 3214));
DecayDB[ 43].push_back(new G4QDecayChan(.880, 3112, 211));
DecayDB[ 43].push_back(new G4QDecayChan(.940, 3222,-211));
DecayDB[ 43].push_back(new G4QDecayChan(1.00, 3212, 111));
}
if(limit<= 44 && nQ>= 44) // SIGMA_5/2 -
{
DecayDB[ 44].push_back(new G4QDecayChan(.600, 2112,-321));
DecayDB[ 44].push_back(new G4QDecayChan(.660,-211, 3214));
DecayDB[ 44].push_back(new G4QDecayChan(.720, 111, 3114));
DecayDB[ 44].push_back(new G4QDecayChan(.810, 3212,-211));
DecayDB[ 44].push_back(new G4QDecayChan(.900, 3112, 111));
DecayDB[ 44].push_back(new G4QDecayChan(1.00, 3122,-211));
}
if(limit<= 45 && nQ>= 45) // SIGMA_5/2 0
{
DecayDB[ 45].push_back(new G4QDecayChan(.300, 2112,-311));
DecayDB[ 45].push_back(new G4QDecayChan(.600, 2212,-321));
DecayDB[ 45].push_back(new G4QDecayChan(.640, 211, 3114));
DecayDB[ 45].push_back(new G4QDecayChan(.680,-211, 3224));
DecayDB[ 45].push_back(new G4QDecayChan(.720, 111, 3214));
DecayDB[ 45].push_back(new G4QDecayChan(.780, 3112, 211));
DecayDB[ 45].push_back(new G4QDecayChan(.840, 3222,-211));
DecayDB[ 45].push_back(new G4QDecayChan(.900, 3212, 111));
DecayDB[ 45].push_back(new G4QDecayChan(1.00, 3122, 111));
}
if(limit<= 46 && nQ>= 46) // SIGMA_5/2 +
{
DecayDB[ 46].push_back(new G4QDecayChan(.600, 2212,-311));
DecayDB[ 46].push_back(new G4QDecayChan(.660, 211, 3214));
DecayDB[ 46].push_back(new G4QDecayChan(.720, 111, 3224));
DecayDB[ 46].push_back(new G4QDecayChan(.810, 3212, 211));
DecayDB[ 46].push_back(new G4QDecayChan(.900, 3222, 111));
DecayDB[ 46].push_back(new G4QDecayChan(1.00, 3122, 211));
}
if(limit<= 47 && nQ>= 47) // KSI_5/2 -
{
DecayDB[ 47].push_back(new G4QDecayChan(.400, 3112,-311));
DecayDB[ 47].push_back(new G4QDecayChan(.800, 3212,-321));
DecayDB[ 47].push_back(new G4QDecayChan(1.00, 3122,-321));
}
if(limit<= 48 && nQ>= 48) // KSI_5/2 0
{
DecayDB[ 48].push_back(new G4QDecayChan(.400, 3212,-311));
DecayDB[ 48].push_back(new G4QDecayChan(.800, 3222,-321));
DecayDB[ 48].push_back(new G4QDecayChan(1.00, 3122,-311));
}
if(limit<= 49 && nQ>= 49) // rho_3 0
{
DecayDB[ 49].push_back(new G4QDecayChan(.019,311,-313));
DecayDB[ 49].push_back(new G4QDecayChan(.038,321,-323));
DecayDB[ 49].push_back(new G4QDecayChan(.046,311,-311));
DecayDB[ 49].push_back(new G4QDecayChan(.054,321,-321));
DecayDB[ 49].push_back(new G4QDecayChan(.224,111, 223));
DecayDB[ 49].push_back(new G4QDecayChan(.404,111,-211,213));
DecayDB[ 49].push_back(new G4QDecayChan(.584,111, 211,-213));
DecayDB[ 49].push_back(new G4QDecayChan(.764,111, 111,113));
DecayDB[ 49].push_back(new G4QDecayChan(1.00,211,-211));
}
if(limit<= 50 && nQ>= 50) // rho_3 +
{
DecayDB[ 50].push_back(new G4QDecayChan(.019, 321,-313));
DecayDB[ 50].push_back(new G4QDecayChan(.038,-311, 323));
DecayDB[ 50].push_back(new G4QDecayChan(.054, 321,-311));
DecayDB[ 50].push_back(new G4QDecayChan(.224, 211, 223));
DecayDB[ 50].push_back(new G4QDecayChan(.404,211,-211,213));
DecayDB[ 50].push_back(new G4QDecayChan(.584,211,211,-213));
DecayDB[ 50].push_back(new G4QDecayChan(.764,211,111,113));
DecayDB[ 50].push_back(new G4QDecayChan(1.00, 211, 111));
}
if(limit<= 51 && nQ>= 51) // omega_3
{
DecayDB[ 51].push_back(new G4QDecayChan(.020,211,-211,223));
DecayDB[ 51].push_back(new G4QDecayChan(.040,111, 111,223));
DecayDB[ 51].push_back(new G4QDecayChan(.060, 211,-213));
DecayDB[ 51].push_back(new G4QDecayChan(.080,-211, 213));
DecayDB[ 51].push_back(new G4QDecayChan(1.00, 111, 113));
}
if(limit<= 52 && nQ>= 52) // K_3 0
{
DecayDB[ 52].push_back(new G4QDecayChan(.030, 111, 315));
DecayDB[ 52].push_back(new G4QDecayChan(.060,-211, 325));
DecayDB[ 52].push_back(new G4QDecayChan(.340, 311, 331));
DecayDB[ 52].push_back(new G4QDecayChan(.400, 111, 313));
DecayDB[ 52].push_back(new G4QDecayChan(.520,-211, 323));
DecayDB[ 52].push_back(new G4QDecayChan(.620, 311, 113));
DecayDB[ 52].push_back(new G4QDecayChan(.820, 321,-213));
DecayDB[ 52].push_back(new G4QDecayChan(.940,-211, 321));
DecayDB[ 52].push_back(new G4QDecayChan(1.00, 111, 311));
}
if(limit<= 53 && nQ>= 53) // K_3 +
{
DecayDB[ 53].push_back(new G4QDecayChan(.030, 211, 315));
DecayDB[ 53].push_back(new G4QDecayChan(.060, 111, 325));
DecayDB[ 53].push_back(new G4QDecayChan(.340, 321, 331));
DecayDB[ 53].push_back(new G4QDecayChan(.400, 211, 313));
DecayDB[ 53].push_back(new G4QDecayChan(.520, 111, 323));
DecayDB[ 53].push_back(new G4QDecayChan(.620, 311, 213));
DecayDB[ 53].push_back(new G4QDecayChan(.820, 321, 113));
DecayDB[ 53].push_back(new G4QDecayChan(.940, 211, 311));
DecayDB[ 53].push_back(new G4QDecayChan(1.00, 111, 321));
}
if(limit<= 54 && nQ>= 54) // phi_3
{
DecayDB[ 54].push_back(new G4QDecayChan(.250, 321,-321));
DecayDB[ 54].push_back(new G4QDecayChan(.500, 311,-311));
DecayDB[ 54].push_back(new G4QDecayChan(.625, 321,-323));
DecayDB[ 54].push_back(new G4QDecayChan(.750,-321, 323));
DecayDB[ 54].push_back(new G4QDecayChan(.875, 311,-313));
DecayDB[ 54].push_back(new G4QDecayChan(1.00,-311, 313));
}
if(limit<= 55 && nQ>= 55) // DELTA_7/2 -
{
DecayDB[ 55].push_back(new G4QDecayChan(.200, 2112,-213 ));
DecayDB[ 55].push_back(new G4QDecayChan(.320,-211 , 2114));
DecayDB[ 55].push_back(new G4QDecayChan(.500, 111 , 1114));
DecayDB[ 55].push_back(new G4QDecayChan(1.00, 2112,-211 ));
}
if(limit<= 56 && nQ>= 56) // DELTA_7/2 0
{
DecayDB[ 56].push_back(new G4QDecayChan(.133, 2112, 113 ));
DecayDB[ 56].push_back(new G4QDecayChan(.200, 2212,-213 ));
DecayDB[ 56].push_back(new G4QDecayChan(.360,-211 , 2214));
DecayDB[ 56].push_back(new G4QDecayChan(.480, 211 , 1114));
DecayDB[ 56].push_back(new G4QDecayChan(.500, 111 , 2114));
DecayDB[ 56].push_back(new G4QDecayChan(.666, 2212,-211 ));
DecayDB[ 56].push_back(new G4QDecayChan(1.00, 2112, 111 ));
}
if(limit<= 57 && nQ>= 57) // DELTA_7/2 +
{
DecayDB[ 57].push_back(new G4QDecayChan(.133, 2112, 213 ));
DecayDB[ 57].push_back(new G4QDecayChan(.200, 2212, 113 ));
DecayDB[ 57].push_back(new G4QDecayChan(.360,-211 , 2224));
DecayDB[ 57].push_back(new G4QDecayChan(.480, 211 , 2114));
DecayDB[ 57].push_back(new G4QDecayChan(.500, 111 , 2214));
DecayDB[ 57].push_back(new G4QDecayChan(.666, 2112, 211 ));
DecayDB[ 57].push_back(new G4QDecayChan(1.00, 2212, 111 ));
}
if(limit<= 58 && nQ>= 58) // DELTA_7/2 ++
{
DecayDB[ 58].push_back(new G4QDecayChan(.200, 2212, 213 ));
DecayDB[ 58].push_back(new G4QDecayChan(.320, 211 , 2214));
DecayDB[ 58].push_back(new G4QDecayChan(.500, 111 , 2224));
DecayDB[ 58].push_back(new G4QDecayChan(1.00, 2212, 211 ));
}
if(limit<= 59 && nQ>= 59) // LAMBDA_7/2
{
DecayDB[ 59].push_back(new G4QDecayChan(.160, 3122, 223 ));
DecayDB[ 59].push_back(new G4QDecayChan(.260, 2112,-313 ));
DecayDB[ 59].push_back(new G4QDecayChan(.360, 2212,-323 ));
DecayDB[ 59].push_back(new G4QDecayChan(.400, 3312, 321 ));
DecayDB[ 59].push_back(new G4QDecayChan(.440, 3322, 311 ));
DecayDB[ 59].push_back(new G4QDecayChan(.480, 3122, 221 ));
DecayDB[ 59].push_back(new G4QDecayChan(.520, 2112,-311 ));
DecayDB[ 59].push_back(new G4QDecayChan(.560, 2212,-321 ));
DecayDB[ 59].push_back(new G4QDecayChan(.600, 3112, 211 ));
DecayDB[ 59].push_back(new G4QDecayChan(.800, 3222,-211 ));
DecayDB[ 59].push_back(new G4QDecayChan(1.00, 3212, 111 ));
}
if(limit<= 60 && nQ>= 60) // SIGMA_7/2 -
{
DecayDB[ 60].push_back(new G4QDecayChan(.030, 2112,-323 ));
DecayDB[ 60].push_back(new G4QDecayChan(.165,-311 , 1114));
DecayDB[ 60].push_back(new G4QDecayChan(.210,-321 , 2114));
DecayDB[ 60].push_back(new G4QDecayChan(.390,-211 , 3124));
DecayDB[ 60].push_back(new G4QDecayChan(.450,-211 , 3214));
DecayDB[ 60].push_back(new G4QDecayChan(.510, 111 , 3114));
DecayDB[ 60].push_back(new G4QDecayChan(.540, 311 , 3314));
DecayDB[ 60].push_back(new G4QDecayChan(.570,-211 , 3212));
DecayDB[ 60].push_back(new G4QDecayChan(.600, 111 , 3112));
DecayDB[ 60].push_back(new G4QDecayChan(.780,-321 , 2112));
DecayDB[ 60].push_back(new G4QDecayChan(1.00,-211 , 3122));
}
if(limit<= 61 && nQ>= 61) // SIGMA_7/2 0
{
DecayDB[ 61].push_back(new G4QDecayChan(.015, 2112,-313 ));
DecayDB[ 61].push_back(new G4QDecayChan(.030, 2212,-321 ));
DecayDB[ 61].push_back(new G4QDecayChan(.120,-311 , 2114));
DecayDB[ 61].push_back(new G4QDecayChan(.210,-321 , 2214));
DecayDB[ 61].push_back(new G4QDecayChan(.390, 111 , 3124));
DecayDB[ 61].push_back(new G4QDecayChan(.450,-211 , 3224));
DecayDB[ 61].push_back(new G4QDecayChan(.510, 211 , 3114));
DecayDB[ 61].push_back(new G4QDecayChan(.525, 311 , 3324));
DecayDB[ 61].push_back(new G4QDecayChan(.540, 321 , 3314));
DecayDB[ 61].push_back(new G4QDecayChan(.570,-211 , 3222));
DecayDB[ 61].push_back(new G4QDecayChan(.600, 211 , 3112));
DecayDB[ 61].push_back(new G4QDecayChan(.690,-311 , 2112));
DecayDB[ 61].push_back(new G4QDecayChan(.780,-321 , 2212));
DecayDB[ 61].push_back(new G4QDecayChan(1.00, 111 , 3122));
}
if(limit<= 62 && nQ>= 62) // SIGMA_7/2 +
{
DecayDB[ 62].push_back(new G4QDecayChan(.030, 2212,-313 ));
DecayDB[ 62].push_back(new G4QDecayChan(.165,-321 , 2224));
DecayDB[ 62].push_back(new G4QDecayChan(.210,-311 , 2214));
DecayDB[ 62].push_back(new G4QDecayChan(.390, 211 , 3124));
DecayDB[ 62].push_back(new G4QDecayChan(.450, 211 , 3214));
DecayDB[ 62].push_back(new G4QDecayChan(.510, 111 , 3224));
DecayDB[ 62].push_back(new G4QDecayChan(.540, 321 , 3324));
DecayDB[ 62].push_back(new G4QDecayChan(.570, 211 , 3212));
DecayDB[ 62].push_back(new G4QDecayChan(.600, 111 , 3222));
DecayDB[ 62].push_back(new G4QDecayChan(.780,-311 , 2212));
DecayDB[ 62].push_back(new G4QDecayChan(1.00, 211 , 3122));
}
if(limit<= 63 && nQ>= 63) // KSI_7/2 -
{
DecayDB[ 63].push_back(new G4QDecayChan(.400, 3112,-311));
DecayDB[ 63].push_back(new G4QDecayChan(.800, 3212,-321));
DecayDB[ 63].push_back(new G4QDecayChan(1.00, 3122,-321));
}
if(limit<= 64 && nQ>= 64) // KSI_7/2 0
{
DecayDB[ 64].push_back(new G4QDecayChan(.400, 3212,-311));
DecayDB[ 64].push_back(new G4QDecayChan(.800, 3222,-321));
DecayDB[ 64].push_back(new G4QDecayChan(1.00, 3122,-311));
}
if(limit<= 65 && nQ>= 65) // OMEGA_7/2 -
{
DecayDB[ 65].push_back(new G4QDecayChan(.250,-311 , 3314));
DecayDB[ 65].push_back(new G4QDecayChan(.500,-321 , 3324));
DecayDB[ 65].push_back(new G4QDecayChan(.750, 3312,-313 ));
DecayDB[ 65].push_back(new G4QDecayChan(1.00, 3322,-323 ));
}
if(limit<= 66 && nQ>= 66) // a_4 0
{
DecayDB[ 66].push_back(new G4QDecayChan(.200, 311,-311));
DecayDB[ 66].push_back(new G4QDecayChan(.400, 321,-321));
DecayDB[ 66].push_back(new G4QDecayChan(.600, 111, 221));
DecayDB[ 66].push_back(new G4QDecayChan(1.00, 111, 211,-211));
}
if(limit<= 67 && nQ>= 67) // a_4 +
{
DecayDB[ 67].push_back(new G4QDecayChan(.400, 321,-311));
DecayDB[ 67].push_back(new G4QDecayChan(.600, 211, 221));
DecayDB[ 67].push_back(new G4QDecayChan(.800, 211, 211,-211));
DecayDB[ 67].push_back(new G4QDecayChan(1.00, 211, 111, 111));
}
if(limit<= 68 && nQ>= 68) // f_4 0
{
DecayDB[ 68].push_back(new G4QDecayChan(.020, 333, 333));
DecayDB[ 68].push_back(new G4QDecayChan(.340, 223, 223));
DecayDB[ 68].push_back(new G4QDecayChan(.350, 221, 221));
DecayDB[ 68].push_back(new G4QDecayChan(.360, 311,-311));
DecayDB[ 68].push_back(new G4QDecayChan(.370, 321,-321));
DecayDB[ 68].push_back(new G4QDecayChan(.670, 213,-213));
DecayDB[ 68].push_back(new G4QDecayChan(.820, 113, 113));
DecayDB[ 68].push_back(new G4QDecayChan(.940, 211,-211));
DecayDB[ 68].push_back(new G4QDecayChan(1.00, 111, 111));
}
if(limit<= 69 && nQ>= 69) // K_4 0
{
DecayDB[ 69].push_back(new G4QDecayChan(.060, 333, 313));
DecayDB[ 69].push_back(new G4QDecayChan(.260, 223, 313));
DecayDB[ 69].push_back(new G4QDecayChan(.380, 313, 113));
DecayDB[ 69].push_back(new G4QDecayChan(.400, 323,-213));
DecayDB[ 69].push_back(new G4QDecayChan(.500, 223, 311));
DecayDB[ 69].push_back(new G4QDecayChan(.550, 311, 113));
DecayDB[ 69].push_back(new G4QDecayChan(.600, 321,-213));
DecayDB[ 69].push_back(new G4QDecayChan(.700, 311, 113));
DecayDB[ 69].push_back(new G4QDecayChan(.800, 321,-213));
DecayDB[ 69].push_back(new G4QDecayChan(.900, 311, 111));
DecayDB[ 69].push_back(new G4QDecayChan(1.00, 321,-211));
}
if(limit<= 70 && nQ>= 70) // K_4 +
{
DecayDB[ 70].push_back(new G4QDecayChan(.060, 333, 323));
DecayDB[ 70].push_back(new G4QDecayChan(.260, 223, 323));
DecayDB[ 70].push_back(new G4QDecayChan(.380, 313, 213));
DecayDB[ 70].push_back(new G4QDecayChan(.400, 323, 113));
DecayDB[ 70].push_back(new G4QDecayChan(.500, 223, 321));
DecayDB[ 70].push_back(new G4QDecayChan(.550, 321, 113));
DecayDB[ 70].push_back(new G4QDecayChan(.600, 311, 213));
DecayDB[ 70].push_back(new G4QDecayChan(.700, 311, 211));
DecayDB[ 70].push_back(new G4QDecayChan(.800, 321, 111));
DecayDB[ 70].push_back(new G4QDecayChan(.900, 311, 211));
DecayDB[ 70].push_back(new G4QDecayChan(1.00, 321, 111));
}
if(limit<= 71 && nQ>= 71)DecayDB[ 71].push_back(new G4QDecayChan(1.00, 333, 333));//phi_4(2300)
if(limit<= 72 && nQ>= 72)DecayDB[ 72].push_back(new G4QDecayChan(1.00, 2212, 2224)); //pDelta++
if(limit<= 73 && nQ>= 73)DecayDB[ 73].push_back(new G4QDecayChan(1.00, 2112, 1114)); //nDelta-
if(limit<= 74 && nQ>= 74)DecayDB[ 74].push_back(new G4QDecayChan(1.00, 2224, 2224)); //D++D++
if(limit<= 75 && nQ>= 75)DecayDB[ 75].push_back(new G4QDecayChan(1.00, 1114, 1114)); //Del-Del-
if(limit<= 76 && nQ>= 76)DecayDB[ 76].push_back(new G4QDecayChan(1.,2212,2212,2224));//ppDelta++
if(limit<= 77 && nQ>= 77)DecayDB[ 77].push_back(new G4QDecayChan(1.,2112,2112,1114));//nnDelta-
if(limit<= 78 && nQ>= 78)DecayDB[ 78].push_back(new G4QDecayChan(1.,2212,2224,2224));//pD++D++
if(limit<= 79 && nQ>= 79)DecayDB[ 79].push_back(new G4QDecayChan(1.,2112,1114,1114));//nDel-Del-
if(limit<= 83 && nQ>= 83)DecayDB[ 83].push_back(new G4QDecayChan(1.00, 2112, 2112)); //nn
if(limit<= 84 && nQ>= 84)DecayDB[ 84].push_back(new G4QDecayChan(1.00, 2212, 2112)); //pn
if(limit<= 85 && nQ>= 85)DecayDB[ 85].push_back(new G4QDecayChan(1.00, 2212, 2212)); //pp
// ------- Nuclear fragments
//if(limit<= 80 && nQ>=80)
//{
// if(limit<80) limit=80;
// for (int i=limit; i<nQ; i++) DecayDB[i] = NULL;
//}
//Update the limit
limit=nQ+1;
#ifdef debug
G4cout<<"G4QParticle::InitDecayVector: limit is set to "<<limit<<G4endl;
#endif
}
return DecayDB[abs(nQ)];
}
// Initialize the Particle by a Q Code
void G4QParticle::InitQParticle(G4int theQCode)
// =============================================
{
aQPDG.InitByQCode(theQCode);
aQuarkCont = aQPDG.GetQuarkContent();
aDecay = InitDecayVector(aQPDG.GetQCode());
}
// Initialize the Particle by a PDG Code
void G4QParticle::InitPDGParticle(G4int thePDGCode)
// =============================================
{
aQPDG = G4QPDGCode(thePDGCode);
aQuarkCont = aQPDG.GetQuarkContent();
aDecay = InitDecayVector(aQPDG.GetQCode());
}
@@ -0,0 +1,52 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4QSelector.cc,v 1.14 2001/11/26 14:11:47 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// ---------------- G4QSelector ----------------
// by Mikhail Kossov, Sept 1999.
// class for decay Selection for Hadrons generated by CHIPS Model
// -------------------------------------------------------------------
#include "G4QSelector.hh"
G4QSelector::G4QSelector(){}
G4QSelector::G4QSelector(G4QHadronVector hadronVec) : theHadrons(hadronVec){}
G4bool G4QSelector::SelectPDGSet(G4QPDGCodeVector thePDGCodes)
{
G4int ind;
G4int tNH = theHadrons.size();
G4int* yes = new int[tNH];
//for (ind=0; ind<tNH; ind++)
for (ind=tNH-1; ind>=0; ind--) // A Loop to fill
{
////////G4int c=theHadrons[ind]->GetPDGCode(); // PDGCode
}
delete yes;
return false;
}
G4QSelector::~G4QSelector() {}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,35 @@
# -----------------------------------------------------------
# GNUmakefile for chips granular library. HPW 20-Nov-99
# -----------------------------------------------------------
name := G4hadronic_interface_ci
ifndef G4INSTALL
G4INSTALL = ../../../../../..
endif
include $(G4INSTALL)/config/architecture.gmk
CPPFLAGS += -I$(G4BASE)/global/management/include \
-I$(G4BASE)/global/HEPRandom/include \
-I$(G4BASE)/global/HEPGeometry/include \
-I$(G4BASE)/track/include \
-I$(G4BASE)/geometry/volumes/include \
-I$(G4BASE)/geometry/management/include \
-I$(G4BASE)/processes/management/include \
-I$(G4BASE)/processes/hadronic/management/include/ \
-I$(G4BASE)/processes/hadronic/util/include \
-I$(G4BASE)/processes/hadronic/cross_sections/include/ \
-I$(G4BASE)/processes/hadronic/models/generator/util/include \
-I$(G4BASE)/processes/hadronic/models/generator/management/include \
-I$(G4BASE)/processes/hadronic/models/chiral_inv_phase_space/interface/include \
-I$(G4BASE)/processes/hadronic/models/chiral_inv_phase_space/body/include \
-I$(G4BASE)/particles/management/include \
-I$(G4BASE)/particles/leptons/include \
-I$(G4BASE)/particles/bosons/include \
-I$(G4BASE)/particles/hadrons/mesons/include \
-I$(G4BASE)/particles/hadrons/barions/include \
-I$(G4BASE)/particles/hadrons/ions/include \
-I$(G4BASE)/materials/include
include $(G4INSTALL)/config/common.gmk
@@ -0,0 +1,161 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4ChiralInvariantPhaseSpace_h
#define G4ChiralInvariantPhaseSpace_h
//#define CHIPSdebug
#include "globals.hh"
#include "G4HadronicInteraction.hh"
#include "G4ParticleTable.hh"
#include "G4QEnvironment.hh"
//#include "G4Quasmon.hh"
#include "G4QNucleus.hh"
#include "G4QHadronVector.hh"
#include "G4ParticleChange.hh"
#include "G4LorentzVector.hh"
#include "G4DynamicParticle.hh"
#include "G4IonTable.hh"
#include "G4Neutron.hh"
class G4ChiralInvariantPhaseSpace
{
public:
G4VParticleChange * ApplyYourself(const G4Track& aTrack,
G4Nucleus& aTargetNucleus,
G4ParticleChange * aChange = 0);
private:
G4ParticleChange theResult;
};
inline
G4VParticleChange * G4ChiralInvariantPhaseSpace::
ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus, G4ParticleChange * aChange)
{
G4ParticleChange * aResult;
if(aChange != 0)
{
aResult = aChange;
}
else
{
aResult = & theResult;
aResult->Initialize(aTrack);
aResult->SetStatusChange(fStopAndKill);
}
//projectile properties needed in constructor of quasmon
G4LorentzVector proj4Mom;
proj4Mom = aTrack.GetDynamicParticle()->Get4Momentum();
G4int projectilePDGCode = aTrack.GetDynamicParticle()
->GetDefinition()
->GetPDGEncoding();
//target properties needed in constructor of quasmon
G4int targetZ = G4int(aTargetNucleus.GetZ()+0.5);
G4int targetA = G4int(aTargetNucleus.GetN()+0.5);
G4int targetPDGCode = 90000000 + 1000*targetZ + (targetA-targetZ);
// NOT NECESSARY ______________
G4double targetMass = G4ParticleTable::GetParticleTable()->GetIonTable()
->GetIonMass(targetZ, targetA);
G4LorentzVector targ4Mom(0.,0.,0.,targetMass);
// END OF NOT NECESSARY^^^^^^^^
G4int nop = 164; // nuclear clusters up to A=21
G4double fractionOfSingleQuasiFreeNucleons = 0.4;
G4double fractionOfPairedQuasiFreeNucleons = 0.0;
if(targetA>27) fractionOfPairedQuasiFreeNucleons = 0.04;
G4double clusteringCoefficient = 4.;
G4double temperature = 180.;
G4double halfTheStrangenessOfSee = 0.1; // = s/d = s/u
G4double etaToEtaPrime = 0.3;
// construct and fragment the quasmon
G4QCHIPSWorld aWorld(nop); // Create CHIPS World of nop particles
G4QNucleus::SetParameters(fractionOfSingleQuasiFreeNucleons,
fractionOfPairedQuasiFreeNucleons,
clusteringCoefficient);
G4Quasmon::SetParameters(temperature,
halfTheStrangenessOfSee,
etaToEtaPrime);
// G4cout << "Input info "<< projectilePDGCode << " "
// << targetPDGCode <<" "
// << 1./MeV*proj4Mom<<" "
// << 1./MeV*targ4Mom << " "
// << nop << G4endl;
G4QHadronVector projHV;
G4QHadron* iH = new G4QHadron(projectilePDGCode, 1./MeV*proj4Mom);
projHV.push_back(iH);
G4QEnvironment* pan= new G4QEnvironment(projHV, targetPDGCode);
G4std::for_each(projHV.begin(), projHV.end(), DeleteQHadron());
projHV.clear();
//G4Quasmon* pan= new G4Quasmon(projectilePDGCode, targetPDGCode, 1./MeV*proj4Mom, 1./MeV*targ4Mom, nop);
G4QHadronVector* output = pan->Fragment();
delete pan;
// Fill the particle change.
aResult->SetNumberOfSecondaries(output->size());
G4DynamicParticle * theSec;
#ifdef CHIPSdebug
G4cout << "G4ChiralInvariantPhaseSpace: NEW EVENT #ofHadrons="<<output->size()<<endl;
#endif
unsigned int particle;
for( particle = 0; particle < output->size(); particle++)
{
if(output->operator[](particle)->GetNFragments() != 0)
{
delete output->operator[](particle);
continue;
}
theSec = new G4DynamicParticle;
G4int pdgCode = output->operator[](particle)->GetPDGCode();
#ifdef CHIPSdebug
G4cout << "G4ChiralInvariantPhaseSpace: h#"<<particle<<", PDG="<<pdgCode<<endl;
#endif
G4ParticleDefinition * theDefinition;
// Note that I still have to take care of strange nuclei
// For this I need the mass calculation, and a changed interface
// for ion-tablel ==> work for Hisaya @@@@@@@
// Then I can sort out the pdgCode. I also need a decau process
// for strange nuclei; may be another chips interface
if(pdgCode>90000000)
{
G4int aZ = (pdgCode-90000000)/1000;
G4int anN = pdgCode-90000000-1000*aZ;
theDefinition = G4ParticleTable::GetParticleTable()->FindIon(aZ,anN+aZ,0,aZ);
if(aZ == 0 && anN == 1) theDefinition = G4Neutron::Neutron();
}
else
{
theDefinition = G4ParticleTable::GetParticleTable()->FindParticle(output->operator[](particle)->GetPDGCode());
}
theSec->SetDefinition(theDefinition);
theSec->SetMomentum(output->operator[](particle)->Get4Momentum().vect());
aResult->AddSecondary(theSec);
delete output->operator[](particle);
}
delete output;
return aResult;
}
#endif
@@ -0,0 +1,98 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4ElectroNuclearReaction_h
#define G4ElectroNuclearReaction_h
#include "globals.hh"
#include "G4HadronicInteraction.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
#include "G4ElectroNuclearCrossSection.hh"
#include "G4Electron.hh"
#include "G4Positron.hh"
class G4ElectroNuclearReaction : public G4HadronicInteraction
{
public:
virtual ~G4ElectroNuclearReaction()
{
}
G4VParticleChange * ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus);
private:
G4ChiralInvariantPhaseSpace theModel;
G4ElectroNuclearCrossSection theData;
G4ParticleChange theResult;
};
inline
G4VParticleChange * G4ElectroNuclearReaction::
ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus)
{
const G4ParticleDefinition* aD = aTrack.GetDynamicParticle()->GetDefinition();
if((aD != G4Electron::ElectronDefinition()) && (aD != G4Positron::PositronDefinition()))
{
G4Exception("Called G4ElectroNuclearReaction for particle other than electron or positron");
}
theResult.Initialize(aTrack);
const G4ElementTable* aTab = G4Element::GetElementTable();
G4Element * anElement = 0;
G4int aZ = static_cast<G4int>(aTargetNucleus.GetZ()+.1);
for(size_t ii=0; ii<aTab->size(); ii++)
{
if ( abs((*aTab)[ii]->GetZ()-aZ) < .1)
{
anElement = (*aTab)[ii];
break;
}
}
if(0==anElement)
{
G4cout << "G4ElectroNuclearReaction::ApplyYourself - trying to react on an element"<<G4endl;
G4cout << "that is not in the table of elements. Z="<<aTargetNucleus.GetZ()<<G4endl;
G4Exception("Folding with error.");
}
G4double photonEnergy = 10*GeV;
G4double xSec;
while(photonEnergy>3.*GeV)
{
xSec = theData.GetCrossSection(aTrack.GetDynamicParticle(), anElement);
photonEnergy = theData.GetEffectivePhotonEnergy();
}
if(aTrack.GetDynamicParticle()->GetKineticEnergy() - photonEnergy < 0)
{
G4Exception("G4ElectroNuclearReaction: photonEnergy above electron energy");
}
theResult.SetEnergyChange(aTrack.GetDynamicParticle()->GetKineticEnergy() - photonEnergy);
G4ThreeVector photonDirection = aTrack.GetMomentumDirection();
G4DynamicParticle localGamma(G4Gamma::GammaDefinition(), photonDirection, photonEnergy);
G4ThreeVector position(0,0,0);
G4Track localTrack(&localGamma, 0., position);
G4VParticleChange * result = theModel.ApplyYourself(localTrack, aTargetNucleus, &theResult);
return result;
}
#endif
@@ -0,0 +1,55 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4GammaNuclearReaction_h
#define G4GammaNuclearReaction_h
#include "globals.hh"
#include "G4HadronicInteraction.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
#include "G4Gamma.hh"
class G4GammaNuclearReaction : public G4HadronicInteraction
{
public:
virtual ~G4GammaNuclearReaction()
{
}
G4VParticleChange * ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus);
private:
G4ChiralInvariantPhaseSpace theModel;
};
inline
G4VParticleChange * G4GammaNuclearReaction::
ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus)
{
if(aTrack.GetDynamicParticle()->GetDefinition() != G4Gamma::GammaDefinition())
{
G4Exception("Called G4GammaNuclearReaction for particle other than gamma");
}
return theModel.ApplyYourself(aTrack, aTargetNucleus);
}
#endif
@@ -0,0 +1,104 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4PionMinusNuclearAtRestChips_h
#define G4PionMinusNuclearAtRestChips_h
#include "globals.hh"
#include "G4VRestProcess.hh"
#include "G4StopElementSelector.hh"
#include "G4PionMinus.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
class G4PionMinusNuclearAtRestChips : public G4VRestProcess
{
private:
// hide assignment operator as private
G4PionMinusNuclearAtRestChips& operator=(const G4PionMinusNuclearAtRestChips &right);
G4PionMinusNuclearAtRestChips(const G4PionMinusNuclearAtRestChips& );
public:
G4PionMinusNuclearAtRestChips(const G4String& processName ="PionMinusAnnihilationAtRest")
: G4VRestProcess (processName) {}
~G4PionMinusNuclearAtRestChips() {}
G4bool IsApplicable(const G4ParticleDefinition& aParticle)
{
return ( &aParticle == G4PionMinus::PionMinusDefinition() );
}
// null physics table
void BuildPhysicsTable(const G4ParticleDefinition&){}
G4double AtRestGetPhysicalInteractionLength(const G4Track&track,
G4ForceCondition*condition);
// zero mean lifetime
G4double GetMeanLifeTime(const G4Track& aTrack,
G4ForceCondition* condition) {return 0.0;}
G4VParticleChange* AtRestDoIt(const G4Track&, const G4Step&);
private:
G4ChiralInvariantPhaseSpace theModel;
G4StopElementSelector theSelector; // Assume identical laws as for muons
};
inline
G4VParticleChange * G4PionMinusNuclearAtRestChips::
AtRestDoIt(const G4Track& aTrack, const G4Step&aStep)
{
if(aTrack.GetDynamicParticle()->GetDefinition() != G4PionMinus::PionMinus())
{
G4Exception("Calling G4PionMinusNuclearAtRestChips with particle other than pi-!!!");
}
// Create target
G4Element * theTarget = theSelector.GetElement(aTrack.GetMaterial());
G4Nucleus aTargetNucleus(theTarget->GetN() ,theTarget->GetZ());
// Call chips
return theModel.ApplyYourself(aTrack, aTargetNucleus);
}
G4double G4PionMinusNuclearAtRestChips::
AtRestGetPhysicalInteractionLength(const G4Track&track,
G4ForceCondition*condition)
{
ResetNumberOfInteractionLengthLeft();
*condition = NotForced;
currentInteractionLength = GetMeanLifeTime(track, condition);
#ifdef CHIPSdebug
if ((currentInteractionLength <0.0) || (verboseLevel>2))
{
G4cout << "G4PionMinusNuclearAtRestChips::AtRestGetPhysicalInteractionLength ";
G4cout << "[ " << GetProcessName() << "]" <<G4endl;
track.GetDynamicParticle()->DumpInfo();
G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
G4cout << "MeanLifeTime = " << currentInteractionLength/ns << "[ns]" <<G4endl;
}
#endif
return theNumberOfInteractionLengthLeft * currentInteractionLength;
}
#endif
@@ -0,0 +1,51 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4PionMinusNuclearReaction_h
#define G4PionMinusNuclearReaction_h
#include "globals.hh"
#include "G4HadronicInteraction.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
#include "G4PionMinus.hh"
class G4PionMinusNuclearReaction : public G4HadronicInteraction
{
public:
G4VParticleChange * ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus);
private:
G4ChiralInvariantPhaseSpace theModel;
};
inline
G4VParticleChange * G4PionMinusNuclearReaction::
ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus)
{
// if(aTrack.GetDynamicParticle()->GetDefinition() != G4PionMinus::PionMinusDefinition())
// {
// G4Exception("Called G4PionMinusNuclearReaction for particle other than PionMinus");
// }
return theModel.ApplyYourself(aTrack, aTargetNucleus);
}
#endif
@@ -0,0 +1,117 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4ProtonAntiProtonAtRestChips_h
#define G4ProtonAntiProtonAtRestChips_h
#include "globals.hh"
#include "G4VRestProcess.hh"
#include "G4ParticleTable.hh"
#include "G4Quasmon.hh"
#include "G4QHadronVector.hh"
#include "G4ParticleChange.hh"
#include "G4LorentzVector.hh"
#include "G4DynamicParticle.hh"
#include "G4IonTable.hh"
#include "G4Neutron.hh"
#include "G4StopElementSelector.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
class G4ProtonAntiProtonAtRestChips : public G4VRestProcess
{
private:
// hide assignment operator as private
G4ProtonAntiProtonAtRestChips& operator=(const G4ProtonAntiProtonAtRestChips &right);
G4ProtonAntiProtonAtRestChips(const G4ProtonAntiProtonAtRestChips& );
public:
G4ProtonAntiProtonAtRestChips(const G4String& processName ="AntiProtonAnnihilationAtRest")
: G4VRestProcess (processName) {}
~G4ProtonAntiProtonAtRestChips() {}
G4bool IsApplicable(const G4ParticleDefinition& aParticle)
{
return ( &aParticle == G4AntiProton::AntiProtonDefinition() );
}
// null physics table
void BuildPhysicsTable(const G4ParticleDefinition&){}
G4double AtRestGetPhysicalInteractionLength(const G4Track&track,
G4ForceCondition*condition);
// zero mean lifetime
G4double GetMeanLifeTime(const G4Track& aTrack,
G4ForceCondition* condition) {return 0.0;}
G4VParticleChange* AtRestDoIt(const G4Track&, const G4Step&);
private:
G4ChiralInvariantPhaseSpace theModel;
G4StopElementSelector theSelector; // Assume identical laws as for muons
};
inline
G4VParticleChange * G4ProtonAntiProtonAtRestChips::
AtRestDoIt(const G4Track& aTrack, const G4Step&aStep)
{
// Create target
G4Element * theTarget = theSelector.GetElement(aTrack.GetMaterial());
G4Nucleus aTargetNucleus(theTarget->GetN() ,theTarget->GetZ());
// Check model validity - note this will be a sub-branch in the ordinary stopping @@@@@@
// in the long haul. @@@@@@
if(aTrack.GetDynamicParticle()->GetDefinition() != G4AntiProton::AntiProton())
{
G4Exception("Calling G4ProtonAntiProtonAtRestChips with particle other than p-bar!!!");
}
if(aTargetNucleus.GetZ() != 1)
{
G4Exception("Calling G4ProtonAntiProtonAtRestChips for target other than Hydrogen!!!");
}
// Call chips
return theModel.ApplyYourself(aTrack, aTargetNucleus);
}
G4double G4ProtonAntiProtonAtRestChips::
AtRestGetPhysicalInteractionLength(const G4Track&track,
G4ForceCondition*condition)
{
ResetNumberOfInteractionLengthLeft();
*condition = NotForced;
currentInteractionLength = GetMeanLifeTime(track, condition);
#ifdef CHIPSdebug
if ((currentInteractionLength <0.0) || (verboseLevel>2))
{
G4cout << "G4ProtonAntiProtonAtRestChips::AtRestGetPhysicalInteractionLength ";
G4cout << "[ " << GetProcessName() << "]" <<G4endl;
track.GetDynamicParticle()->DumpInfo();
G4cout << " in Material " << track.GetMaterial()->GetName() <<G4endl;
G4cout << "MeanLifeTime = " << currentInteractionLength/ns << "[ns]" <<G4endl;
}
#endif
return theNumberOfInteractionLengthLeft * currentInteractionLength;
}
#endif
@@ -0,0 +1,55 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4ProtonAntiProtonReaction_h
#define G4ProtonAntiProtonReaction_h
#include "globals.hh"
#include "G4HadronicInteraction.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
#include "G4AntiProton.hh"
class G4ProtonAntiProtonReaction : public G4HadronicInteraction
{
public:
G4VParticleChange * ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus);
private:
G4ChiralInvariantPhaseSpace theModel;
};
inline
G4VParticleChange * G4ProtonAntiProtonReaction::
ApplyYourself(const G4Track& aTrack, G4Nucleus& aTargetNucleus)
{
if(aTrack.GetDynamicParticle()->GetDefinition() != G4AntiProton::AntiProton())
{
G4Exception("Calling G4ProtonAntiProtonReaction with particle other than p-bar!!!");
}
if(aTargetNucleus.GetZ() != 1)
{
G4Exception("Calling G4ProtonAntiProtonReaction for target other than Hydrogen!!!");
}
return theModel.ApplyYourself(aTrack, aTargetNucleus);
}
#endif
@@ -0,0 +1,43 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4StringChipsInterface_h
#define G4StringChipsInterface_h
#include "G4VIntraNuclearTransportModel.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
class G4StringChipsInterface : public G4VIntraNuclearTransportModel
{
public:
G4StringChipsInterface();
virtual G4VParticleChange* ApplyYourself(const G4Track& aTrack,
G4Nucleus& theNucleus);
virtual G4ReactionProductVector* Propagate(G4KineticTrackVector* theSecondaries,
G4V3DNucleus* theNucleus);
private:
G4ChiralInvariantPhaseSpace theModel;
G4double theEnergyLossPerFermi;
};
#endif
@@ -0,0 +1,54 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4StringChipsParticleLevelInterface_h
#define G4StringChipsParticleLevelInterface_h
#include "G4VIntraNuclearTransportModel.hh"
#include "G4ChiralInvariantPhaseSpace.hh"
class G4StringChipsParticleLevelInterface : public G4VIntraNuclearTransportModel
{
public:
G4StringChipsParticleLevelInterface();
virtual G4VParticleChange* ApplyYourself(const G4Track& aTrack,
G4Nucleus& theNucleus);
virtual G4ReactionProductVector* Propagate(G4KineticTrackVector* theSecondaries,
G4V3DNucleus* theNucleus);
private:
G4ChiralInvariantPhaseSpace theModel;
G4double theEnergyLossPerFermi;
G4double theInnerCoreDensityCut;
G4double fractionOfSingleQuasiFreeNucleons;
G4double fractionOfPairedQuasiFreeNucleons;
G4double clusteringCoefficient;
G4double temperature;
G4double halfTheStrangenessOfSee;
G4double etaToEtaPrime;
G4double fusionToExchange;
G4int nop;
};
#endif
@@ -0,0 +1,419 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#include "G4StringChipsInterface.hh"
#include "globals.hh"
#include "G4Pair.hh"
#include "g4std/list"
#include "G4KineticTrackVector.hh"
#include "G4Nucleon.hh"
#include "G4LorentzRotation.hh"
G4StringChipsInterface::G4StringChipsInterface()
{
#ifdef CHIPSdebug
G4cout << "Please enter the energy loss per fermi in GeV"<<G4endl;
G4cin >> theEnergyLossPerFermi;
#endif
theEnergyLossPerFermi *= GeV;
// theEnergyLossPerFermi = 1.*GeV;
}
G4VParticleChange* G4StringChipsInterface::
ApplyYourself(const G4Track& aTrack, G4Nucleus& theNucleus)
{
return theModel.ApplyYourself(aTrack, theNucleus);
}
G4ReactionProductVector* G4StringChipsInterface::
Propagate(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus)
{
// Protection for non physical conditions
if(theSecondaries->size() == 1)
G4Exception("G4StringChipsInterface: Only one particle from String models!");
// Calculate the mean energy lost
G4Pair<G4double, G4double> theImpact = theNucleus->RefetchImpactXandY();
G4double impactX = theImpact.first;
G4double impactY = theImpact.second;
G4double inpactPar2 = impactX*impactX + impactY*impactY;
G4double radius2 = theNucleus->GetNuclearRadius(5*perCent);
radius2 *= radius2;
G4double pathlength = 0;
if(radius2 - inpactPar2>0) pathlength = 2.*sqrt(radius2 - inpactPar2);
G4double theEnergyLostInFragmentation = theEnergyLossPerFermi*pathlength/fermi;
// now select all particles in range
G4std::list<G4Pair<G4double, G4KineticTrack *> > theSorted;
G4std::list<G4Pair<G4double, G4KineticTrack *> >::iterator current;
for(unsigned int secondary = 0; secondary<theSecondaries->size(); secondary++)
{
G4LorentzVector a4Mom = theSecondaries->operator[](secondary)->Get4Momentum();
#ifdef CHIPSdebug
G4cout <<"ALL STRING particles "<<theSecondaries->operator[](secondary)->GetDefinition()->GetPDGCharge()<<" "
<< theSecondaries->operator[](secondary)->GetDefinition()->GetPDGEncoding()<<" "
<< a4Mom <<G4endl;
#endif
G4double toSort = a4Mom.rapidity();
G4Pair<G4double, G4KineticTrack *> it;
it.first = toSort;
it.second = theSecondaries->operator[](secondary);
G4bool inserted = false;
for(current = theSorted.begin(); current!=theSorted.end(); current++)
{
if((*current).first > toSort)
{
theSorted.insert(current, it);
inserted = true;
break;
}
}
if(!inserted)
{
theSorted.push_front(it);
}
}
G4LorentzVector proj4Mom(0.,0.,0.,0.);
// @@ Use the G4QContent class, which is exactly (nD,nU,nS,nAD,nAU,nAS) !
// The G4QContent class is a basic clas in CHIPS (not PDG Code as in GEANT4),
// so in CHIPS on can has a hadronic obgect (Quasmon) with any Quark Content.
// As a simple extantion for the hadron (which is a special case for Hadron)
// there is a clas G4QChipolino, which is a Quasmon, which can decay in two
// hadrons. In future the three-hadron class can be added...
G4int nD = 0;
G4int nU = 0;
G4int nS = 0;
G4int nAD = 0;
G4int nAU = 0;
G4int nAS = 0;
G4std::list<G4Pair<G4double, G4KineticTrack *> >::iterator firstEscaping = theSorted.begin();
G4double runningEnergy = 0;
G4int particleCount = 0;
G4LorentzVector theLow = (*(theSorted.begin())).second->Get4Momentum();
G4LorentzVector theHigh;
#ifdef CHIPSdebug
G4cout << "CHIPS ENERGY LOST "<<theEnergyLostInFragmentation<<G4endl;
G4cout << "sorted rapidities event start"<<G4endl;
#endif
G4ReactionProductVector * theResult = new G4ReactionProductVector;
G4ReactionProduct * theSec;
G4KineticTrackVector * secondaries;
// first decay and add all escaping particles.
for(current = theSorted.begin(); current!=theSorted.end(); current++)
{
firstEscaping = current;
if((*current).second->GetDefinition()->GetQuarkContent(3)!=0 ||
(*current).second->GetDefinition()->GetAntiQuarkContent(3) !=0)
{
G4KineticTrack * aResult = (*current).second;
G4ParticleDefinition * pdef=aResult->GetDefinition();
secondaries = NULL;
if ( pdef->GetPDGWidth() > 0 && pdef->GetPDGLifeTime() < 5E-17*s )
{
secondaries = aResult->Decay();
}
if ( secondaries == NULL )
{
theSec = new G4ReactionProduct(aResult->GetDefinition());
G4LorentzVector current4Mom = aResult->Get4Momentum();
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
else
{
for (unsigned int aSecondary=0; aSecondary<secondaries->size(); aSecondary++)
{
theSec = new G4ReactionProduct(secondaries->operator[](aSecondary)->GetDefinition());
G4LorentzVector current4Mom = secondaries->operator[](aSecondary)->Get4Momentum();
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
G4std::for_each(secondaries->begin(), secondaries->end(), DeleteKineticTrack());
delete secondaries;
}
continue;
}
runningEnergy += (*current).second->Get4Momentum().t();
if(runningEnergy > theEnergyLostInFragmentation) break;
#ifdef CHIPSdebug
G4cout <<"ABSORBED STRING particles "<<current->second->GetDefinition()->GetPDGCharge()<<" "
<< current->second->GetDefinition()->GetPDGEncoding()<<" "
<< current->second->Get4Momentum() <<G4endl;
#endif
// projectile 4-momentum needed in constructor of quasmon
particleCount++;
theHigh = (*current).second->Get4Momentum();
proj4Mom += (*current).second->Get4Momentum();
#ifdef CHIPSdebug
G4cout << "sorted rapidities "<<current->second->Get4Momentum().rapidity()<<G4endl;
#endif
// projectile quark contents needed for G4QContent construction (@@ ? -> G4QContent class)
nD += (*current).second->GetDefinition()->GetQuarkContent(1);
nU += (*current).second->GetDefinition()->GetQuarkContent(2);
nS += (*current).second->GetDefinition()->GetQuarkContent(3);
nAD += (*current).second->GetDefinition()->GetAntiQuarkContent(1);
nAU += (*current).second->GetDefinition()->GetAntiQuarkContent(2);
nAS += (*current).second->GetDefinition()->GetAntiQuarkContent(3);
}
// construct G4QContent
#ifdef CHIPSdebug
G4cout << "Quark content: d="<<nD<<", u="<<nU<< ", s="<< nS << G4endl;
G4cout << "Anti-quark content: anit-d="<<nAD<<", anti-u="<<nAU<< ", anti-s="<< nAS << G4endl;
#endif
G4QContent theProjectiles(nD, nU, nS, nAD, nAU, nAS);
#ifdef CHIPSdebug
G4cout << "G4QContent is constructed"<<endl;
#endif
// target properties needed in constructor of quasmon
// remove all hit nucleons to get Target code
theNucleus->StartLoop();
G4Nucleon * aNucleon;
G4int resA = 0;
G4int resZ = 0;
G4ThreeVector hitMomentum(0,0,0);
G4double hitMass = 0;
G4int hitCount = 0;
while((aNucleon = theNucleus->GetNextNucleon()))
{
if(!aNucleon->AreYouHit())
{
resA++;
resZ+=G4int (aNucleon->GetDefinition()->GetPDGCharge());
}
else
{
hitMomentum += aNucleon->GetMomentum().vect();
hitMass += aNucleon->GetMomentum().m();
hitCount ++;
}
}
G4int targetPDGCode = 90000000 + 1000*resZ + (resA-resZ);
G4double targetMass = theNucleus->GetMass();
targetMass -= hitMass;
G4double targetEnergy = sqrt(hitMomentum.mag2()+targetMass*targetMass);
// !! @@ Target should be at rest: hitMomentum=(0,0,0) @@ !! M.K.
G4LorentzVector targ4Mom(-1.*hitMomentum, targetEnergy);
// construct the quasmon
G4int nop = 223; // ??????
G4double fractionOfSingleQuasiFreeNucleons = 0.15;
G4double fractionOfPairedQuasiFreeNucleons = 0.01;
G4double clusteringCoefficient = 5.;
G4double temperature = 180.;
G4double halfTheStrangenessOfSee = 0.1; // = s/d = s/u
G4double etaToEtaPrime = 0.3;
G4QNucleus::SetParameters(fractionOfSingleQuasiFreeNucleons,
fractionOfPairedQuasiFreeNucleons,
clusteringCoefficient);
G4Quasmon::SetParameters(temperature,
halfTheStrangenessOfSee,
etaToEtaPrime);
#ifdef CHIPSdebug
G4cout << "G4QNucleus parameters "<< fractionOfSingleQuasiFreeNucleons << " "
<< fractionOfPairedQuasiFreeNucleons << " "<< clusteringCoefficient << G4endl;
G4cout << "G4Quasmon parameters "<< temperature << " "<< halfTheStrangenessOfSee << " "
<<etaToEtaPrime << G4endl;
G4cout << "The Target PDG code = "<<targetPDGCode<<G4endl;
G4cout << "The projectile momentum = "<<1./MeV*proj4Mom<<G4endl;
G4cout << "The target momentum = "<<1./MeV*targ4Mom<<G4endl;
#endif
// Chips expects all in target rest frame, along z.
G4QCHIPSWorld aWorld(nop); // Create CHIPS World of nop particles
G4QHadronVector projHV;
// target rest frame
proj4Mom.boost(-1.*targ4Mom.boostVector());
// now go along z
G4LorentzRotation toZ;
toZ.rotateZ(-1*proj4Mom.phi());
toZ.rotateY(-1*proj4Mom.theta());
proj4Mom = toZ*proj4Mom;
G4LorentzRotation toLab(toZ.inverse());
#ifdef CHIPSdebug
G4cout << "a Boosted projectile vector along z"<<proj4Mom<<" "<<proj4Mom.mag()<<G4endl;
#endif
G4QHadron* iH = new G4QHadron(theProjectiles, 1./MeV*proj4Mom);
projHV.push_back(iH);
// now call chips with this info in place
G4QHadronVector * output = 0;
if (particleCount!=0)
{
G4QEnvironment* pan= new G4QEnvironment(projHV, targetPDGCode);
G4std::for_each(projHV.begin(), projHV.end(), DeleteQHadron());
projHV.clear();
output = pan->Fragment();
delete pan;
}
else
{
output = new G4QHadronVector;
}
// Fill the result.
#ifdef CHIPSdebug
G4cout << "NEXT EVENT"<<endl;
#endif
// first decay and add all escaping particles.
for(current = firstEscaping; current!=theSorted.end(); current++)
{
G4KineticTrack * aResult = (*current).second;
G4ParticleDefinition * pdef=aResult->GetDefinition();
secondaries = NULL;
if ( pdef->GetPDGWidth() > 0 && pdef->GetPDGLifeTime() < 5E-17*s )
{
secondaries = aResult->Decay();
}
if ( secondaries == NULL )
{
theSec = new G4ReactionProduct(aResult->GetDefinition());
G4LorentzVector current4Mom = aResult->Get4Momentum();
current4Mom = toLab*current4Mom;
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
else
{
for (unsigned int aSecondary=0; aSecondary<secondaries->size(); aSecondary++)
{
theSec = new G4ReactionProduct(secondaries->operator[](aSecondary)->GetDefinition());
G4LorentzVector current4Mom = secondaries->operator[](aSecondary)->Get4Momentum();
current4Mom = toLab*current4Mom;
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
G4std::for_each(secondaries->begin(), secondaries->end(), DeleteKineticTrack());
delete secondaries;
}
}
G4std::for_each(theSecondaries->begin(), theSecondaries->end(), DeleteKineticTrack());
delete theSecondaries;
// now add the quasmon output
#ifdef CHIPSdebug
G4cout << "Number of particles from string"<<theResult->size()<<G4endl;
G4cout << "Number of particles from chips"<<output->size()<<G4endl;
#endif
for(unsigned int particle = 0; particle < output->size(); particle++)
{
if(output->operator[](particle)->GetNFragments() != 0)
{
delete output->operator[](particle);
continue;
}
theSec = new G4ReactionProduct;
G4int pdgCode = output->operator[](particle)->GetPDGCode();
G4ParticleDefinition * theDefinition;
// Note that I still have to take care of strange nuclei
// For this I need the mass calculation, and a changed interface
// for ion-table ==> work for Hisaya @@@@@@@
// Then I can sort out the pdgCode. I also need a decau process
// for strange nuclei; may be another chips interface
if(pdgCode>90000000)
{
G4int aZ = (pdgCode-90000000)/1000;
if (aZ>1000) aZ=aZ%1000; // patch for strange nuclei, to be repaired @@@@
G4int anN = pdgCode-90000000-1000*aZ;
if(anN>1000) anN=anN%1000; // patch for strange nuclei, to be repaired @@@@
if(pdgCode==91000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==92000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==93000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==94000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==95000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==96000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==97000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==98000000) theDefinition = G4Lambda::LambdaDefinition();
else if(aZ == 0 && anN == 1) theDefinition = G4Neutron::Neutron();
else theDefinition = G4ParticleTable::GetParticleTable()->FindIon(aZ,anN+aZ,0,aZ);
}
else
{
theDefinition = G4ParticleTable::GetParticleTable()->FindParticle(output->operator[](particle)->GetPDGCode());
}
#ifdef CHIPSdebug
G4cout << "Particle code produced = "<< pdgCode <<G4endl;
#endif
theSec = new G4ReactionProduct(theDefinition);
G4LorentzVector current4Mom = output->operator[](particle)->Get4Momentum();
current4Mom = toLab*current4Mom;
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
#ifdef CHIPSdebug
G4cout <<"CHIPS particles "<<theDefinition->GetPDGCharge()<<" "
<< theDefinition->GetPDGEncoding()<<" "
<< current4Mom <<G4endl;
#endif
delete output->operator[](particle);
}
delete output;
#ifdef CHIPSdebug
G4cout << "Number of particles"<<theResult->size()<<G4endl;
G4cout << G4endl;
// @@ G4QContent has even the out option!
G4cout << "QUASMON preparation info "
<< 1./MeV*proj4Mom<<" "
<< 1./MeV*targ4Mom<<" "
<< nD<<" "<<nU<<" "<<nS<<" "<<nAD<<" "<<nAU<<" "<<nAS<<" "
<< hitCount<<" "
<< particleCount<<" "
<< theLow<<" "
<< theHigh<<" "
<< G4endl;
#endif
return theResult;
}
@@ -0,0 +1,486 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
#include "G4StringChipsParticleLevelInterface.hh"
#include "globals.hh"
#include "G4Pair.hh"
#include "g4std/list"
#include "g4std/vector"
#include "G4KineticTrackVector.hh"
#include "G4Nucleon.hh"
#include "G4Proton.hh"
#include "G4Neutron.hh"
#include "G4LorentzRotation.hh"
// #define CHIPSdebug
// #define CHIPSdebug_1
G4StringChipsParticleLevelInterface::G4StringChipsParticleLevelInterface()
{
theEnergyLossPerFermi = 0.7*GeV;
nop = 164; // ??????
fractionOfSingleQuasiFreeNucleons = 0.1;
fractionOfPairedQuasiFreeNucleons = 0.;
clusteringCoefficient = 2.7;
temperature = 180.;
halfTheStrangenessOfSee = 0.3; // = s/d = s/u
etaToEtaPrime = 0.3;
fusionToExchange = 100.;
theInnerCoreDensityCut = 50.;
if(getenv("ChipsParameterTuning"))
{
G4cout << "Please enter the energy loss per fermi in GeV"<<G4endl;
G4cin >> theEnergyLossPerFermi;
theEnergyLossPerFermi *= GeV;
G4cout << "Please enter nop"<<G4endl;
G4cin >> nop;
G4cout << "Please enter the fractionOfSingleQuasiFreeNucleons"<<G4endl;
G4cin >> fractionOfSingleQuasiFreeNucleons;
G4cout << "Please enter the fractionOfPairedQuasiFreeNucleons"<<G4endl;
G4cin >> fractionOfPairedQuasiFreeNucleons;
G4cout << "Please enter the clusteringCoefficient"<<G4endl;
G4cin >> clusteringCoefficient;
G4cout << "Please enter the temperature"<<G4endl;
G4cin >> temperature;
G4cout << "Please enter halfTheStrangenessOfSee"<<G4endl;
G4cin >> halfTheStrangenessOfSee;
G4cout << "Please enter the etaToEtaPrime"<<G4endl;
G4cin >> etaToEtaPrime;
G4cout << "Please enter the fusionToExchange"<<G4endl;
G4cin >> fusionToExchange;
G4cout << "Please enter the cut-off for calculating the nuclear radius in percent"<<G4endl;
G4cin >> theInnerCoreDensityCut;
}
}
G4VParticleChange* G4StringChipsParticleLevelInterface::
ApplyYourself(const G4Track& aTrack, G4Nucleus& theNucleus)
{
return theModel.ApplyYourself(aTrack, theNucleus);
}
G4ReactionProductVector* G4StringChipsParticleLevelInterface::
Propagate(G4KineticTrackVector* theSecondaries, G4V3DNucleus* theNucleus)
{
// Protection for non physical conditions
if(theSecondaries->size() == 1)
{
G4ReactionProductVector * theFastResult = new G4ReactionProductVector;
G4ReactionProduct * theFastSec;
theFastSec = new G4ReactionProduct((*theSecondaries)[0]->GetDefinition());
G4LorentzVector current4Mom = (*theSecondaries)[0]->Get4Momentum();
theFastSec->SetTotalEnergy(current4Mom.t());
theFastSec->SetMomentum(current4Mom.vect());
theFastResult->push_back(theFastSec);
return theFastResult;
// G4Exception("G4StringChipsParticleLevelInterface: Only one particle from String models!");
}
// target properties needed in constructor of quasmon, and for boosting to
// target rest frame
// remove all hit nucleons to get Target code
theNucleus->StartLoop();
G4Nucleon * aNucleon;
G4int resA = 0;
G4int resZ = 0;
G4ThreeVector hitMomentum(0,0,0);
G4double hitMass = 0;
unsigned int hitCount = 0;
while((aNucleon = theNucleus->GetNextNucleon()))
{
if(!aNucleon->AreYouHit())
{
resA++;
resZ+=G4int (aNucleon->GetDefinition()->GetPDGCharge());
}
else
{
hitMomentum += aNucleon->GetMomentum().vect();
hitMass += aNucleon->GetMomentum().m();
hitCount ++;
}
}
G4int targetPDGCode = 90000000 + 1000*resZ + (resA-resZ);
G4double targetMass = theNucleus->GetMass();
targetMass -= hitMass;
G4double targetEnergy = sqrt(hitMomentum.mag2()+targetMass*targetMass);
// !! @@ Target should be at rest: hitMomentum=(0,0,0) @@ !! M.K.
G4LorentzVector targ4Mom(-1.*hitMomentum, targetEnergy);
// Calculate the mean energy lost
G4Pair<G4double, G4double> theImpact = theNucleus->RefetchImpactXandY();
G4double impactX = theImpact.first;
G4double impactY = theImpact.second;
G4double inpactPar2 = impactX*impactX + impactY*impactY;
G4double radius2 = theNucleus->GetNuclearRadius(theInnerCoreDensityCut*perCent);
radius2 *= radius2;
G4double pathlength = 0;
if(radius2 - inpactPar2>0) pathlength = 2.*sqrt(radius2 - inpactPar2);
G4double theEnergyLostInFragmentation = theEnergyLossPerFermi*pathlength/fermi;
// now select all particles in range
G4std::list<G4Pair<G4double, G4KineticTrack *> > theSorted;
G4std::list<G4Pair<G4double, G4KineticTrack *> >::iterator current;
for(unsigned int secondary = 0; secondary<theSecondaries->size(); secondary++)
{
G4LorentzVector a4Mom = theSecondaries->operator[](secondary)->Get4Momentum();
#ifdef CHIPSdebug
G4cout <<"ALL STRING particles "<<theSecondaries->operator[](secondary)->GetDefinition()->GetPDGCharge()<<" "
<< theSecondaries->operator[](secondary)->GetDefinition()->GetPDGEncoding()<<" "
<< a4Mom <<G4endl;
#endif
G4double toSort = a4Mom.rapidity();
G4Pair<G4double, G4KineticTrack *> it;
it.first = toSort;
it.second = theSecondaries->operator[](secondary);
G4bool inserted = false;
for(current = theSorted.begin(); current!=theSorted.end(); current++)
{
if((*current).first > toSort)
{
theSorted.insert(current, it);
inserted = true;
break;
}
}
if(!inserted)
{
theSorted.push_back(it);
}
}
G4LorentzVector proj4Mom(0.,0.,0.,0.);
G4int nD = 0;
G4int nU = 0;
G4int nS = 0;
G4int nAD = 0;
G4int nAU = 0;
G4int nAS = 0;
G4std::list<G4Pair<G4double, G4KineticTrack *> >::iterator firstEscaping = theSorted.begin();
G4double runningEnergy = 0;
G4int particleCount = 0;
G4LorentzVector theLow = (*(theSorted.begin())).second->Get4Momentum();
G4LorentzVector theHigh;
#ifdef CHIPSdebug
G4cout << "CHIPS ENERGY LOST "<<theEnergyLostInFragmentation<<G4endl;
G4cout << "sorted rapidities event start"<<G4endl;
#endif
G4QHadronVector projHV;
G4std::vector<G4QContent> theContents;
G4std::vector<G4LorentzVector *> theMomenta;
G4ReactionProductVector * theResult = new G4ReactionProductVector;
G4ReactionProduct * theSec;
G4KineticTrackVector * secondaries;
for(current = theSorted.begin(); current!=theSorted.end(); current++)
{
firstEscaping = current;
if((*current).second->GetDefinition()->GetQuarkContent(3)!=0 ||
(*current).second->GetDefinition()->GetAntiQuarkContent(3) !=0)
{
G4KineticTrack * aResult = (*current).second;
G4ParticleDefinition * pdef=aResult->GetDefinition();
secondaries = NULL;
if ( pdef->GetPDGWidth() > 0 && pdef->GetPDGLifeTime() < 5E-17*s )
{
secondaries = aResult->Decay();
}
if ( secondaries == NULL )
{
theSec = new G4ReactionProduct(aResult->GetDefinition());
G4LorentzVector current4Mom = aResult->Get4Momentum();
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
else
{
for (unsigned int aSecondary=0; aSecondary<secondaries->size(); aSecondary++)
{
theSec = new G4ReactionProduct(secondaries->operator[](aSecondary)->GetDefinition());
G4LorentzVector current4Mom = secondaries->operator[](aSecondary)->Get4Momentum();
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
G4std::for_each(secondaries->begin(), secondaries->end(), DeleteKineticTrack());
delete secondaries;
}
}
runningEnergy += (*current).second->Get4Momentum().t();
if((*current).second->GetDefinition() == G4Proton::Proton())
runningEnergy-=G4Proton::Proton()->GetPDGMass();
if((*current).second->GetDefinition() == G4Neutron::Neutron())
runningEnergy-=G4Neutron::Neutron()->GetPDGMass();
#ifdef CHIPSdebug
G4cout << "sorted rapidities "<<(*current).second->Get4Momentum().rapidity()<<G4endl;
#endif
if(runningEnergy > theEnergyLostInFragmentation) break;
#ifdef CHIPSdebug
G4cout <<"ABSORBED STRING particles "<<(*current).second->GetDefinition()->GetPDGCharge()<<" "
<< (*current).second->GetDefinition()->GetPDGEncoding()<<" "
<< (*current).second->Get4Momentum() <<G4endl;
#endif
// projectile 4-momentum in target rest frame needed in constructor of QHadron
particleCount++;
theHigh = (*current).second->Get4Momentum();
proj4Mom = (*current).second->Get4Momentum();
proj4Mom.boost(-1.*targ4Mom.boostVector());
nD = (*current).second->GetDefinition()->GetQuarkContent(1);
nU = (*current).second->GetDefinition()->GetQuarkContent(2);
nS = (*current).second->GetDefinition()->GetQuarkContent(3);
nAD = (*current).second->GetDefinition()->GetAntiQuarkContent(1);
nAU = (*current).second->GetDefinition()->GetAntiQuarkContent(2);
nAS = (*current).second->GetDefinition()->GetAntiQuarkContent(3);
G4QContent aProjectile(nD, nU, nS, nAD, nAU, nAS);
#ifdef CHIPSdebug_1
G4cout << G4endl;
G4cout << "Quark content: d="<<nD<<", u="<<nU<< ", s="<< nS << G4endl;
G4cout << "Anti-quark content: anit-d="<<nAD<<", anti-u="<<nAU<< ", anti-s="<< nAS << G4endl;
G4cout << "G4QContent is constructed"<<endl;
#endif
theContents.push_back(aProjectile);
G4LorentzVector * aVec = new G4LorentzVector(1./MeV*proj4Mom);
#ifdef CHIPSdebug_1
G4cout << "projectile momentum = "<<*aVec<<G4endl;
G4cout << G4endl;
#endif
theMomenta.push_back(aVec);
}
G4std::vector<G4QContent> theFinalContents;
G4std::vector<G4LorentzVector*> theFinalMomenta;
if(theContents.size()<hitCount || 1)
{
for(unsigned int hp = 0; hp<theContents.size(); hp++)
{
G4QHadron* aHadron = new G4QHadron(theContents[hp], *(theMomenta[hp]) );
projHV.push_back(aHadron);
}
}
else
{
unsigned int hp;
for(hp=0; hp<hitCount; hp++)
{
G4QContent co(0, 0, 0, 0, 0, 0);
theFinalContents.push_back(co);
G4LorentzVector * mo = new G4LorentzVector(0,0,0,0);
theFinalMomenta.push_back(mo);
}
unsigned int running = 0;
while (running<theContents.size())
{
for(hp = 0; hp<hitCount; hp++)
{
theFinalContents[hp] +=theContents[running];
*(theFinalMomenta[hp])+=*(theMomenta[running]);
running++;
if(running == theContents.size()) break;
}
}
for(hp = 0; hp<hitCount; hp++)
{
G4QHadron* aHadron = new G4QHadron(theFinalContents[hp], *theFinalMomenta[hp]);
projHV.push_back(aHadron);
}
}
// construct the quasmon
size_t i;
for (i=0; i<theFinalMomenta.size(); i++) delete theFinalMomenta[i];
for (i=0; i<theMomenta.size(); i++) delete theMomenta[i];
theFinalMomenta.clear();
theMomenta.clear();
G4QNucleus::SetParameters(fractionOfSingleQuasiFreeNucleons,
fractionOfPairedQuasiFreeNucleons,
clusteringCoefficient,
fusionToExchange);
G4Quasmon::SetParameters(temperature,
halfTheStrangenessOfSee,
etaToEtaPrime);
#ifdef CHIPSdebug
G4cout << "G4QNucleus parameters "<< fractionOfSingleQuasiFreeNucleons << " "
<< fractionOfPairedQuasiFreeNucleons << " "<< clusteringCoefficient << G4endl;
G4cout << "G4Quasmon parameters "<< temperature << " "<< halfTheStrangenessOfSee << " "
<< etaToEtaPrime << G4endl;
G4cout << "The Target PDG code = "<<targetPDGCode<<G4endl;
G4cout << "The projectile momentum = "<<1./MeV*proj4Mom<<G4endl;
G4cout << "The target momentum = "<<1./MeV*targ4Mom<<G4endl;
#endif
// now call chips with this info in place
G4QHadronVector * output = 0;
if (particleCount!=0 && resA!=0)
{
G4QCHIPSWorld aWorld(nop); // Create CHIPS World of nop particles
G4QEnvironment* pan= new G4QEnvironment(projHV, targetPDGCode);
// clean up particles
G4std::for_each(projHV.begin(), projHV.end(), DeleteQHadron());
projHV.clear();
output = pan->Fragment();
delete pan;
}
else
{
output = new G4QHadronVector;
}
// Fill the result.
#ifdef CHIPSdebug
G4cout << "NEXT EVENT"<<endl;
#endif
// first decay and add all escaping particles.
for(current = firstEscaping; current!=theSorted.end(); current++)
{
G4KineticTrack * aResult = (*current).second;
G4ParticleDefinition * pdef=aResult->GetDefinition();
secondaries = NULL;
if ( pdef->GetPDGWidth() > 0 && pdef->GetPDGLifeTime() < 5E-17*s )
{
secondaries = aResult->Decay();
}
if ( secondaries == NULL )
{
theSec = new G4ReactionProduct(aResult->GetDefinition());
G4LorentzVector current4Mom = aResult->Get4Momentum();
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
else
{
for (unsigned int aSecondary=0; aSecondary<secondaries->size(); aSecondary++)
{
theSec = new G4ReactionProduct(secondaries->operator[](aSecondary)->GetDefinition());
G4LorentzVector current4Mom = secondaries->operator[](aSecondary)->Get4Momentum();
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
}
G4std::for_each(secondaries->begin(), secondaries->end(), DeleteKineticTrack());
delete secondaries;
}
}
G4std::for_each(theSecondaries->begin(), theSecondaries->end(), DeleteKineticTrack());
delete theSecondaries;
// now add the quasmon output
G4int maxParticle=output->size();
#ifdef CHIPSdebug
G4cout << "Number of particles from string"<<theResult->size()<<G4endl;
G4cout << "Number of particles from chips"<<maxParticle<<G4endl;
#endif
for(G4int particle = 0; particle < maxParticle; particle++)
{
if(output->operator[](particle)->GetNFragments() != 0)
{
delete output->operator[](particle);
continue;
}
G4int pdgCode = output->operator[](particle)->GetPDGCode();
#ifdef CHIPSdebug
G4cerr << "PDG code of chips particle = "<<pdgCode<<G4endl;
#endif
G4ParticleDefinition * theDefinition;
// Note that I still have to take care of strange nuclei
// For this I need the mass calculation, and a changed interface
// for ion-table ==> work for Hisaya @@@@@@@
// Then I can sort out the pdgCode. I also need a decau process
// for strange nuclei; may be another chips interface
if(pdgCode>90000000)
{
G4int aZ = (pdgCode-90000000)/1000;
if (aZ>1000) aZ=aZ%1000; // patch for strange nuclei, to be repaired @@@@
G4int anN = pdgCode-90000000-1000*aZ;
if(anN>1000) anN=anN%1000; // patch for strange nuclei, to be repaired @@@@
if(pdgCode==91000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==92000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==93000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==94000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==95000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==96000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==97000000) theDefinition = G4Lambda::LambdaDefinition();
else if(pdgCode==98000000) theDefinition = G4Lambda::LambdaDefinition();
else if(aZ == 0 && anN == 1) theDefinition = G4Neutron::Neutron();
else theDefinition = G4ParticleTable::GetParticleTable()->FindIon(aZ,anN+aZ,0,aZ);
}
else theDefinition = G4ParticleTable::GetParticleTable()->FindParticle(pdgCode);
#ifdef CHIPSdebug
G4cout << "Particle code produced = "<< pdgCode <<G4endl;
#endif
theSec = new G4ReactionProduct(theDefinition);
G4LorentzVector current4Mom = output->operator[](particle)->Get4Momentum();
current4Mom.boost(targ4Mom.boostVector());
theSec->SetTotalEnergy(current4Mom.t());
theSec->SetMomentum(current4Mom.vect());
theResult->push_back(theSec);
#ifdef CHIPSdebug
G4cout <<"CHIPS particles "<<theDefinition->GetPDGCharge()<<" "
<< theDefinition->GetPDGEncoding()<<" "
<< current4Mom <<G4endl;
#endif
delete output->operator[](particle);
}
delete output;
#ifdef CHIPSdebug
G4cout << "Number of particles"<<theResult->size()<<G4endl;
G4cout << G4endl;
G4cout << "QUASMON preparation info "
<< 1./MeV*proj4Mom<<" "
<< 1./MeV*targ4Mom<<" "
<< nD<<" "<<nU<<" "<<nS<<" "<<nAD<<" "<<nAU<<" "<<nAS<<" "
<< hitCount<<" "
<< particleCount<<" "
<< theLow<<" "
<< theHigh<<" "
<< G4endl;
#endif
return theResult;
}
@@ -0,0 +1,36 @@
# $Id: GNUmakefile,v 1.2 2001/10/11 08:53:58 fjones Exp $
# -----------------------------------------------------------
# GNUmakefile for hadronic library. Gabriele Cosmo, 18/9/96.
# -----------------------------------------------------------
name := G4hadronic_coherent_elastic
ifndef G4INSTALL
G4INSTALL = ../../../../..
endif
include $(G4INSTALL)/config/architecture.gmk
CPPFLAGS += -I$(G4BASE)/global/management/include \
-I$(G4BASE)/global/HEPRandom/include \
-I$(G4BASE)/global/HEPGeometry/include \
-I$(G4BASE)/global/HEPNumerics/include \
-I$(G4BASE)/track/include \
-I$(G4BASE)/geometry/volumes/include \
-I$(G4BASE)/geometry/management/include \
-I$(G4BASE)/processes/management/include \
-I$(G4BASE)/processes/hadronic/management/include/ \
-I$(G4BASE)/processes/hadronic/util/include \
-I$(G4BASE)/processes/hadronic/cross_sections/include/ \
-I$(G4BASE)/particles/management/include \
-I$(G4BASE)/particles/leptons/include \
-I$(G4BASE)/particles/bosons/include \
-I$(G4BASE)/particles/hadrons/mesons/include \
-I$(G4BASE)/particles/hadrons/barions/include \
-I$(G4BASE)/particles/hadrons/ions/include \
-I$(G4BASE)/materials/include \
-I$(G4BASE)/myexample/include
CPPFLAGS+=-I$(G4INSTALL)/tests/tools/include -DMAKEHBOOK -DMAKEBOOK
include $(G4INSTALL)/config/common.gmk
@@ -0,0 +1,70 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// G4 Low energy model: n-n or p-p scattering
// F.W. Jones, L.G. Greeniaus, H.P. Wellisch
//
// For further comments see G4LEnpData.hh and G4LEnp.cc
//
#ifndef G4LEnp_h
#define G4LEnp_h 1
#include "globals.hh"
#include "Randomize.hh"
#include "G4Element.hh"
#include "G4ElementVector.hh"
#include "G4ElementTable.hh"
#include "G4PhysicsTable.hh"
#include "G4PhysicsVector.hh"
#include "G4LPhysicsFreeVector.hh"
#include "G4Gamma.hh"
#include "G4Step.hh"
#include "G4TrackStatus.hh"
#include "G4HadronicInteraction.hh"
class G4LEnp : public G4HadronicInteraction
{
private:
enum { NENERGY=22, NANGLE=180 };
public:
G4LEnp();
~G4LEnp();
G4VParticleChange* ApplyYourself(const G4Track& aTrack,
G4Nucleus& targetNucleus);
void SetCoulombSuppression(G4int State);
private:
static G4float sig[NENERGY][NANGLE];
static G4float pcm[NENERGY], elab[NENERGY],
dsigmax[NENERGY], sigtot[NENERGY];
};
#endif
@@ -0,0 +1,637 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
// G4 Low energy model: n-p scattering -- Data
// THIS FILE contains static array initialization
// F.W. Jones, L.G. Greeniaus, H.P. Wellisch
// Table of Cumulative np Scattering Probabilities
// To be used for generation as a function of cos(theta cm)
// NOTE: Assumes angle range to be generated is 0-180 degrees
// This allows tracking of
// well-defined GEANT4 particles and generation of secondary
// Range of validity of tables: 10 - 1200 MeV
// Results are extracted from RA Arndt"s PSA of 1998
// CM Angle range: 0.5 - 179.5 degrees in 1 degree steps
// Data written 8 values/line, delimited by commas
// Appended at end: cm momentum (GeV/c), Lab Energy (GeV), max
// dsigma/domega-CM (mb/sr), total cross section
G4float G4LEnp::sig[NENERGY][NANGLE] = {
//------------ 0.01 GeV
0.00007, 0.00030, 0.00066, 0.00118, 0.00184, 0.00265, 0.00360,
0.00471, 0.00595, 0.00735, 0.00888, 0.01057, 0.01239, 0.01436,
0.01648, 0.01874, 0.02113, 0.02367, 0.02635, 0.02917, 0.03213,
0.03523, 0.03847, 0.04184, 0.04534, 0.04899, 0.05276, 0.05667,
0.06071, 0.06488, 0.06917, 0.07360, 0.07815, 0.08283, 0.08763,
0.09255, 0.09760, 0.10276, 0.10805, 0.11345, 0.11896, 0.12459,
0.13033, 0.13618, 0.14214, 0.14821, 0.15438, 0.16066, 0.16704,
0.17352, 0.18009, 0.18677, 0.19353, 0.20039, 0.20734, 0.21438,
0.22151, 0.22871, 0.23601, 0.24338, 0.25083, 0.25835, 0.26595,
0.27362, 0.28136, 0.28917, 0.29704, 0.30497, 0.31297, 0.32102,
0.32913, 0.33729, 0.34550, 0.35376, 0.36207, 0.37042, 0.37881,
0.38724, 0.39570, 0.40420, 0.41273, 0.42129, 0.42988, 0.43848,
0.44711, 0.45576, 0.46443, 0.47310, 0.48179, 0.49049, 0.49919,
0.50789, 0.51659, 0.52530, 0.53399, 0.54268, 0.55136, 0.56003,
0.56868, 0.57731, 0.58592, 0.59451, 0.60307, 0.61161, 0.62011,
0.62858, 0.63701, 0.64540, 0.65376, 0.66206, 0.67032, 0.67853,
0.68669, 0.69480, 0.70285, 0.71083, 0.71876, 0.72662, 0.73442,
0.74214, 0.74979, 0.75737, 0.76487, 0.77230, 0.77964, 0.78689,
0.79407, 0.80115, 0.80814, 0.81504, 0.82184, 0.82854, 0.83515,
0.84165, 0.84805, 0.85434, 0.86052, 0.86659, 0.87255, 0.87840,
0.88413, 0.88974, 0.89523, 0.90060, 0.90584, 0.91096, 0.91595,
0.92081, 0.92554, 0.93014, 0.93460, 0.93892, 0.94311, 0.94716,
0.95107, 0.95484, 0.95847, 0.96195, 0.96528, 0.96847, 0.97151,
0.97440, 0.97714, 0.97973, 0.98217, 0.98445, 0.98658, 0.98856,
0.99038, 0.99204, 0.99355, 0.99490, 0.99610, 0.99713, 0.99801,
0.99872, 0.99928, 0.99968, 0.99992, 1.00000,
//--------- 0.02 GeV
0.00008, 0.00030, 0.00068, 0.00120, 0.00188, 0.00271, 0.00368,
0.00480, 0.00608, 0.00750, 0.00906, 0.01078, 0.01264, 0.01465,
0.01680, 0.01909, 0.02153, 0.02411, 0.02684, 0.02970, 0.03270,
0.03584, 0.03912, 0.04254, 0.04609, 0.04977, 0.05359, 0.05753,
0.06161, 0.06582, 0.07015, 0.07461, 0.07919, 0.08390, 0.08873,
0.09367, 0.09874, 0.10392, 0.10922, 0.11463, 0.12015, 0.12578,
0.13152, 0.13737, 0.14332, 0.14937, 0.15553, 0.16178, 0.16813,
0.17458, 0.18112, 0.18775, 0.19447, 0.20128, 0.20817, 0.21515,
0.22221, 0.22935, 0.23657, 0.24386, 0.25123, 0.25866, 0.26617,
0.27374, 0.28138, 0.28908, 0.29685, 0.30467, 0.31255, 0.32048,
0.32846, 0.33650, 0.34458, 0.35271, 0.36088, 0.36909, 0.37734,
0.38563, 0.39395, 0.40231, 0.41069, 0.41911, 0.42754, 0.43600,
0.44448, 0.45298, 0.46150, 0.47003, 0.47857, 0.48712, 0.49568,
0.50424, 0.51280, 0.52136, 0.52992, 0.53848, 0.54703, 0.55557,
0.56409, 0.57260, 0.58110, 0.58957, 0.59803, 0.60645, 0.61486,
0.62323, 0.63157, 0.63988, 0.64815, 0.65639, 0.66458, 0.67273,
0.68083, 0.68889, 0.69689, 0.70484, 0.71274, 0.72057, 0.72835,
0.73607, 0.74372, 0.75130, 0.75881, 0.76625, 0.77362, 0.78090,
0.78811, 0.79524, 0.80228, 0.80924, 0.81611, 0.82289, 0.82957,
0.83616, 0.84265, 0.84904, 0.85533, 0.86151, 0.86759, 0.87356,
0.87942, 0.88516, 0.89079, 0.89630, 0.90168, 0.90695, 0.91209,
0.91711, 0.92200, 0.92675, 0.93138, 0.93587, 0.94022, 0.94443,
0.94851, 0.95244, 0.95623, 0.95987, 0.96336, 0.96670, 0.96989,
0.97293, 0.97582, 0.97854, 0.98111, 0.98352, 0.98578, 0.98786,
0.98979, 0.99155, 0.99315, 0.99459, 0.99585, 0.99695, 0.99788,
0.99864, 0.99924, 0.99966, 0.99992, 1.00000,
//--------- 0.03 GeV
0.00008, 0.00032, 0.00073, 0.00129, 0.00201, 0.00289, 0.00393,
0.00513, 0.00649, 0.00801, 0.00968, 0.01150, 0.01348, 0.01561,
0.01790, 0.02033, 0.02291, 0.02564, 0.02852, 0.03154, 0.03470,
0.03801, 0.04145, 0.04503, 0.04875, 0.05261, 0.05659, 0.06071,
0.06495, 0.06932, 0.07382, 0.07844, 0.08318, 0.08804, 0.09302,
0.09811, 0.10331, 0.10863, 0.11405, 0.11958, 0.12522, 0.13096,
0.13679, 0.14273, 0.14876, 0.15489, 0.16111, 0.16742, 0.17382,
0.18030, 0.18687, 0.19352, 0.20025, 0.20705, 0.21394, 0.22089,
0.22792, 0.23501, 0.24218, 0.24941, 0.25670, 0.26405, 0.27147,
0.27894, 0.28646, 0.29404, 0.30167, 0.30935, 0.31708, 0.32486,
0.33268, 0.34054, 0.34844, 0.35638, 0.36435, 0.37236, 0.38040,
0.38848, 0.39658, 0.40471, 0.41286, 0.42104, 0.42924, 0.43746,
0.44569, 0.45395, 0.46221, 0.47049, 0.47878, 0.48708, 0.49538,
0.50369, 0.51201, 0.52032, 0.52863, 0.53694, 0.54524, 0.55354,
0.56183, 0.57010, 0.57837, 0.58662, 0.59485, 0.60306, 0.61125,
0.61942, 0.62756, 0.63568, 0.64377, 0.65182, 0.65984, 0.66783,
0.67577, 0.68368, 0.69155, 0.69937, 0.70714, 0.71486, 0.72253,
0.73015, 0.73772, 0.74522, 0.75267, 0.76005, 0.76737, 0.77462,
0.78180, 0.78891, 0.79594, 0.80290, 0.80978, 0.81658, 0.82329,
0.82993, 0.83647, 0.84292, 0.84928, 0.85554, 0.86171, 0.86777,
0.87374, 0.87960, 0.88535, 0.89099, 0.89652, 0.90194, 0.90724,
0.91242, 0.91747, 0.92241, 0.92721, 0.93188, 0.93643, 0.94083,
0.94510, 0.94923, 0.95322, 0.95706, 0.96075, 0.96429, 0.96767,
0.97091, 0.97398, 0.97689, 0.97964, 0.98222, 0.98464, 0.98688,
0.98896, 0.99086, 0.99258, 0.99413, 0.99550, 0.99669, 0.99770,
0.99853, 0.99917, 0.99963, 0.99991, 1.00000,
//--------- 0.05 GeV
0.00010, 0.00040, 0.00089, 0.00157, 0.00245, 0.00352, 0.00478,
0.00623, 0.00787, 0.00970, 0.01170, 0.01389, 0.01626, 0.01880,
0.02151, 0.02439, 0.02744, 0.03065, 0.03402, 0.03754, 0.04122,
0.04505, 0.04902, 0.05313, 0.05738, 0.06176, 0.06628, 0.07092,
0.07568, 0.08057, 0.08557, 0.09068, 0.09590, 0.10123, 0.10666,
0.11219, 0.11781, 0.12353, 0.12933, 0.13522, 0.14119, 0.14725,
0.15337, 0.15957, 0.16585, 0.17218, 0.17859, 0.18505, 0.19157,
0.19816, 0.20479, 0.21148, 0.21821, 0.22499, 0.23182, 0.23869,
0.24560, 0.25255, 0.25953, 0.26655, 0.27361, 0.28069, 0.28781,
0.29495, 0.30212, 0.30932, 0.31654, 0.32378, 0.33105, 0.33834,
0.34565, 0.35298, 0.36032, 0.36769, 0.37507, 0.38247, 0.38988,
0.39731, 0.40476, 0.41221, 0.41968, 0.42717, 0.43466, 0.44217,
0.44969, 0.45722, 0.46476, 0.47231, 0.47987, 0.48744, 0.49501,
0.50260, 0.51019, 0.51778, 0.52539, 0.53300, 0.54061, 0.54823,
0.55584, 0.56347, 0.57109, 0.57871, 0.58633, 0.59395, 0.60157,
0.60918, 0.61678, 0.62438, 0.63197, 0.63955, 0.64711, 0.65467,
0.66221, 0.66973, 0.67723, 0.68472, 0.69218, 0.69961, 0.70702,
0.71440, 0.72175, 0.72907, 0.73635, 0.74360, 0.75080, 0.75796,
0.76508, 0.77215, 0.77918, 0.78615, 0.79306, 0.79992, 0.80672,
0.81346, 0.82013, 0.82674, 0.83328, 0.83974, 0.84613, 0.85244,
0.85867, 0.86482, 0.87088, 0.87685, 0.88273, 0.88851, 0.89420,
0.89978, 0.90526, 0.91063, 0.91589, 0.92103, 0.92605, 0.93095,
0.93572, 0.94036, 0.94487, 0.94923, 0.95345, 0.95751, 0.96143,
0.96518, 0.96876, 0.97218, 0.97542, 0.97849, 0.98136, 0.98405,
0.98654, 0.98884, 0.99093, 0.99281, 0.99448, 0.99593, 0.99717,
0.99819, 0.99898, 0.99955, 0.99989, 1.00000,
//--------- 0.07 GeV
0.00012, 0.00048, 0.00108, 0.00191, 0.00298, 0.00427, 0.00580,
0.00755, 0.00952, 0.01171, 0.01412, 0.01673, 0.01954, 0.02256,
0.02577, 0.02916, 0.03274, 0.03649, 0.04041, 0.04450, 0.04874,
0.05314, 0.05768, 0.06237, 0.06719, 0.07214, 0.07722, 0.08241,
0.08772, 0.09313, 0.09865, 0.10426, 0.10996, 0.11575, 0.12162,
0.12757, 0.13359, 0.13968, 0.14583, 0.15204, 0.15830, 0.16462,
0.17098, 0.17738, 0.18382, 0.19029, 0.19679, 0.20333, 0.20988,
0.21646, 0.22306, 0.22968, 0.23630, 0.24294, 0.24959, 0.25625,
0.26291, 0.26958, 0.27625, 0.28291, 0.28958, 0.29625, 0.30292,
0.30958, 0.31624, 0.32290, 0.32955, 0.33620, 0.34284, 0.34948,
0.35612, 0.36275, 0.36939, 0.37601, 0.38264, 0.38927, 0.39589,
0.40252, 0.40915, 0.41578, 0.42241, 0.42905, 0.43570, 0.44235,
0.44901, 0.45568, 0.46237, 0.46906, 0.47576, 0.48248, 0.48922,
0.49597, 0.50274, 0.50952, 0.51633, 0.52315, 0.53000, 0.53686,
0.54375, 0.55066, 0.55759, 0.56454, 0.57152, 0.57851, 0.58553,
0.59257, 0.59963, 0.60671, 0.61381, 0.62093, 0.62807, 0.63523,
0.64239, 0.64958, 0.65677, 0.66398, 0.67119, 0.67841, 0.68564,
0.69286, 0.70009, 0.70731, 0.71453, 0.72174, 0.72894, 0.73613,
0.74329, 0.75044, 0.75757, 0.76467, 0.77174, 0.77879, 0.78579,
0.79276, 0.79968, 0.80656, 0.81340, 0.82018, 0.82690, 0.83357,
0.84018, 0.84672, 0.85320, 0.85960, 0.86593, 0.87218, 0.87835,
0.88443, 0.89042, 0.89632, 0.90212, 0.90782, 0.91341, 0.91890,
0.92426, 0.92950, 0.93462, 0.93960, 0.94443, 0.94913, 0.95366,
0.95804, 0.96225, 0.96628, 0.97012, 0.97377, 0.97722, 0.98045,
0.98347, 0.98625, 0.98880, 0.99111, 0.99316, 0.99495, 0.99648,
0.99774, 0.99873, 0.99943, 0.99986, 1.00000,
//--------- 0.10 GeV
0.00015, 0.00060, 0.00133, 0.00235, 0.00366, 0.00524, 0.00710,
0.00923, 0.01162, 0.01427, 0.01716, 0.02030, 0.02366, 0.02724,
0.03104, 0.03503, 0.03922, 0.04360, 0.04815, 0.05287, 0.05775,
0.06278, 0.06795, 0.07325, 0.07868, 0.08423, 0.08988, 0.09563,
0.10148, 0.10742, 0.11343, 0.11951, 0.12567, 0.13187, 0.13813,
0.14444, 0.15078, 0.15716, 0.16357, 0.17000, 0.17644, 0.18290,
0.18936, 0.19582, 0.20228, 0.20874, 0.21519, 0.22162, 0.22803,
0.23442, 0.24080, 0.24714, 0.25346, 0.25974, 0.26600, 0.27222,
0.27841, 0.28456, 0.29068, 0.29676, 0.30280, 0.30881, 0.31478,
0.32071, 0.32661, 0.33247, 0.33830, 0.34410, 0.34987, 0.35560,
0.36131, 0.36700, 0.37266, 0.37830, 0.38392, 0.38953, 0.39512,
0.40070, 0.40628, 0.41185, 0.41741, 0.42298, 0.42856, 0.43414,
0.43973, 0.44533, 0.45095, 0.45659, 0.46226, 0.46795, 0.47367,
0.47942, 0.48520, 0.49102, 0.49689, 0.50279, 0.50874, 0.51474,
0.52078, 0.52688, 0.53303, 0.53924, 0.54550, 0.55181, 0.55819,
0.56462, 0.57111, 0.57766, 0.58427, 0.59094, 0.59767, 0.60445,
0.61129, 0.61819, 0.62514, 0.63215, 0.63920, 0.64631, 0.65346,
0.66065, 0.66789, 0.67516, 0.68246, 0.68980, 0.69717, 0.70455,
0.71196, 0.71938, 0.72681, 0.73425, 0.74169, 0.74913, 0.75656,
0.76398, 0.77138, 0.77876, 0.78611, 0.79344, 0.80072, 0.80797,
0.81517, 0.82232, 0.82942, 0.83646, 0.84343, 0.85034, 0.85718,
0.86395, 0.87063, 0.87724, 0.88375, 0.89017, 0.89650, 0.90273,
0.90885, 0.91485, 0.92074, 0.92650, 0.93213, 0.93762, 0.94297,
0.94815, 0.95316, 0.95800, 0.96264, 0.96707, 0.97129, 0.97528,
0.97902, 0.98250, 0.98570, 0.98861, 0.99122, 0.99351, 0.99547,
0.99708, 0.99835, 0.99927, 0.99982, 1.00000,
//--------- 0.14 GeV
0.00018, 0.00069, 0.00154, 0.00271, 0.00421, 0.00603, 0.00816,
0.01058, 0.01329, 0.01628, 0.01953, 0.02304, 0.02678, 0.03075,
0.03494, 0.03933, 0.04391, 0.04867, 0.05360, 0.05868, 0.06391,
0.06928, 0.07478, 0.08039, 0.08611, 0.09193, 0.09784, 0.10383,
0.10989, 0.11602, 0.12220, 0.12843, 0.13470, 0.14101, 0.14734,
0.15369, 0.16005, 0.16642, 0.17279, 0.17915, 0.18550, 0.19183,
0.19815, 0.20443, 0.21069, 0.21690, 0.22309, 0.22922, 0.23532,
0.24136, 0.24736, 0.25330, 0.25919, 0.26502, 0.27079, 0.27651,
0.28217, 0.28777, 0.29331, 0.29879, 0.30421, 0.30958, 0.31489,
0.32015, 0.32536, 0.33051, 0.33562, 0.34068, 0.34569, 0.35067,
0.35561, 0.36051, 0.36538, 0.37022, 0.37504, 0.37984, 0.38462,
0.38939, 0.39414, 0.39890, 0.40365, 0.40840, 0.41316, 0.41794,
0.42273, 0.42754, 0.43237, 0.43723, 0.44213, 0.44706, 0.45204,
0.45706, 0.46213, 0.46725, 0.47243, 0.47768, 0.48298, 0.48836,
0.49380, 0.49933, 0.50492, 0.51060, 0.51636, 0.52221, 0.52814,
0.53416, 0.54027, 0.54647, 0.55277, 0.55915, 0.56563, 0.57221,
0.57887, 0.58563, 0.59248, 0.59941, 0.60644, 0.61355, 0.62075,
0.62803, 0.63538, 0.64281, 0.65031, 0.65788, 0.66551, 0.67320,
0.68094, 0.68873, 0.69656, 0.70443, 0.71233, 0.72025, 0.72819,
0.73614, 0.74409, 0.75205, 0.75999, 0.76792, 0.77583, 0.78370,
0.79155, 0.79935, 0.80710, 0.81480, 0.82244, 0.83001, 0.83752,
0.84495, 0.85230, 0.85956, 0.86674, 0.87382, 0.88080, 0.88769,
0.89446, 0.90113, 0.90769, 0.91412, 0.92043, 0.92660, 0.93263,
0.93852, 0.94424, 0.94978, 0.95514, 0.96030, 0.96524, 0.96994,
0.97438, 0.97854, 0.98240, 0.98593, 0.98912, 0.99193, 0.99435,
0.99636, 0.99794, 0.99908, 0.99977, 1.00000,
//--------- 0.18 GeV
0.00019, 0.00073, 0.00162, 0.00286, 0.00444, 0.00635, 0.00857,
0.01110, 0.01391, 0.01701, 0.02036, 0.02396, 0.02779, 0.03185,
0.03610, 0.04055, 0.04518, 0.04998, 0.05494, 0.06004, 0.06528,
0.07065, 0.07613, 0.08172, 0.08741, 0.09319, 0.09906, 0.10499,
0.11099, 0.11705, 0.12316, 0.12931, 0.13550, 0.14171, 0.14794,
0.15419, 0.16045, 0.16670, 0.17296, 0.17920, 0.18543, 0.19163,
0.19781, 0.20396, 0.21008, 0.21615, 0.22219, 0.22817, 0.23411,
0.24000, 0.24584, 0.25162, 0.25734, 0.26300, 0.26861, 0.27415,
0.27963, 0.28505, 0.29041, 0.29571, 0.30094, 0.30612, 0.31124,
0.31630, 0.32131, 0.32627, 0.33117, 0.33603, 0.34084, 0.34560,
0.35033, 0.35502, 0.35968, 0.36430, 0.36890, 0.37348, 0.37804,
0.38258, 0.38711, 0.39163, 0.39615, 0.40067, 0.40520, 0.40974,
0.41429, 0.41886, 0.42345, 0.42808, 0.43273, 0.43742, 0.44215,
0.44693, 0.45175, 0.45663, 0.46156, 0.46656, 0.47163, 0.47676,
0.48197, 0.48725, 0.49261, 0.49806, 0.50359, 0.50921, 0.51493,
0.52074, 0.52664, 0.53265, 0.53875, 0.54496, 0.55127, 0.55768,
0.56420, 0.57082, 0.57755, 0.58439, 0.59132, 0.59836, 0.60550,
0.61274, 0.62008, 0.62751, 0.63503, 0.64264, 0.65033, 0.65810,
0.66594, 0.67385, 0.68182, 0.68985, 0.69793, 0.70606, 0.71422,
0.72240, 0.73061, 0.73884, 0.74706, 0.75529, 0.76350, 0.77170,
0.77987, 0.78800, 0.79609, 0.80412, 0.81210, 0.82001, 0.82785,
0.83561, 0.84329, 0.85087, 0.85836, 0.86575, 0.87303, 0.88021,
0.88727, 0.89422, 0.90105, 0.90776, 0.91435, 0.92080, 0.92712,
0.93329, 0.93931, 0.94517, 0.95086, 0.95636, 0.96165, 0.96672,
0.97153, 0.97607, 0.98030, 0.98420, 0.98774, 0.99088, 0.99360,
0.99587, 0.99766, 0.99895, 0.99974, 1.00000,
//--------- 0.24 GeV
0.00019, 0.00074, 0.00163, 0.00288, 0.00445, 0.00635, 0.00855,
0.01104, 0.01381, 0.01683, 0.02010, 0.02360, 0.02732, 0.03123,
0.03534, 0.03962, 0.04408, 0.04869, 0.05346, 0.05837, 0.06341,
0.06858, 0.07388, 0.07929, 0.08480, 0.09042, 0.09613, 0.10192,
0.10780, 0.11374, 0.11976, 0.12583, 0.13196, 0.13813, 0.14434,
0.15058, 0.15686, 0.16315, 0.16945, 0.17577, 0.18208, 0.18840,
0.19470, 0.20099, 0.20727, 0.21352, 0.21974, 0.22593, 0.23208,
0.23819, 0.24426, 0.25029, 0.25626, 0.26219, 0.26805, 0.27387,
0.27962, 0.28532, 0.29095, 0.29653, 0.30205, 0.30750, 0.31290,
0.31824, 0.32351, 0.32873, 0.33390, 0.33901, 0.34407, 0.34907,
0.35403, 0.35895, 0.36382, 0.36865, 0.37344, 0.37820, 0.38294,
0.38764, 0.39232, 0.39698, 0.40163, 0.40626, 0.41089, 0.41551,
0.42013, 0.42475, 0.42939, 0.43403, 0.43869, 0.44337, 0.44807,
0.45280, 0.45757, 0.46236, 0.46720, 0.47208, 0.47701, 0.48199,
0.48703, 0.49213, 0.49729, 0.50251, 0.50781, 0.51318, 0.51862,
0.52415, 0.52976, 0.53545, 0.54124, 0.54712, 0.55309, 0.55916,
0.56532, 0.57159, 0.57796, 0.58443, 0.59101, 0.59769, 0.60448,
0.61137, 0.61837, 0.62547, 0.63267, 0.63997, 0.64737, 0.65486,
0.66245, 0.67012, 0.67788, 0.68571, 0.69362, 0.70159, 0.70962,
0.71770, 0.72583, 0.73400, 0.74220, 0.75041, 0.75864, 0.76687,
0.77509, 0.78329, 0.79146, 0.79960, 0.80768, 0.81571, 0.82368,
0.83157, 0.83937, 0.84708, 0.85470, 0.86220, 0.86960, 0.87688,
0.88403, 0.89106, 0.89797, 0.90474, 0.91138, 0.91788, 0.92425,
0.93048, 0.93656, 0.94249, 0.94827, 0.95387, 0.95929, 0.96451,
0.96950, 0.97424, 0.97870, 0.98284, 0.98662, 0.99001, 0.99296,
0.99544, 0.99741, 0.99884, 0.99971, 1.00000,
//--------- 0.34 GeV
0.00019, 0.00072, 0.00159, 0.00279, 0.00431, 0.00612, 0.00823,
0.01060, 0.01322, 0.01608, 0.01917, 0.02247, 0.02598, 0.02969,
0.03359, 0.03768, 0.04195, 0.04641, 0.05104, 0.05584, 0.06082,
0.06596, 0.07126, 0.07673, 0.08235, 0.08811, 0.09403, 0.10008,
0.10626, 0.11257, 0.11900, 0.12554, 0.13219, 0.13893, 0.14576,
0.15267, 0.15965, 0.16669, 0.17379, 0.18094, 0.18812, 0.19533,
0.20257, 0.20981, 0.21706, 0.22430, 0.23153, 0.23874, 0.24592,
0.25307, 0.26017, 0.26724, 0.27424, 0.28120, 0.28808, 0.29491,
0.30166, 0.30834, 0.31494, 0.32147, 0.32791, 0.33427, 0.34055,
0.34674, 0.35285, 0.35888, 0.36483, 0.37069, 0.37647, 0.38217,
0.38779, 0.39334, 0.39882, 0.40422, 0.40956, 0.41483, 0.42004,
0.42519, 0.43028, 0.43532, 0.44031, 0.44525, 0.45015, 0.45501,
0.45984, 0.46463, 0.46940, 0.47414, 0.47886, 0.48356, 0.48825,
0.49292, 0.49759, 0.50226, 0.50693, 0.51160, 0.51629, 0.52098,
0.52568, 0.53041, 0.53516, 0.53994, 0.54474, 0.54958, 0.55446,
0.55937, 0.56434, 0.56935, 0.57441, 0.57953, 0.58471, 0.58996,
0.59527, 0.60065, 0.60611, 0.61165, 0.61727, 0.62297, 0.62877,
0.63465, 0.64063, 0.64670, 0.65287, 0.65914, 0.66552, 0.67199,
0.67857, 0.68525, 0.69202, 0.69890, 0.70588, 0.71295, 0.72011,
0.72736, 0.73469, 0.74209, 0.74957, 0.75711, 0.76470, 0.77233,
0.78001, 0.78771, 0.79542, 0.80314, 0.81086, 0.81855, 0.82621,
0.83383, 0.84140, 0.84889, 0.85631, 0.86365, 0.87088, 0.87800,
0.88500, 0.89188, 0.89864, 0.90525, 0.91173, 0.91806, 0.92425,
0.93030, 0.93621, 0.94197, 0.94758, 0.95304, 0.95835, 0.96348,
0.96843, 0.97316, 0.97766, 0.98188, 0.98579, 0.98932, 0.99244,
0.99508, 0.99719, 0.99874, 0.99968, 1.00000,
//--------- 0.42 GeV
0.00020, 0.00075, 0.00165, 0.00289, 0.00445, 0.00633, 0.00849,
0.01094, 0.01364, 0.01660, 0.01979, 0.02322, 0.02688, 0.03077,
0.03487, 0.03920, 0.04375, 0.04852, 0.05350, 0.05870, 0.06411,
0.06973, 0.07556, 0.08159, 0.08782, 0.09423, 0.10084, 0.10761,
0.11456, 0.12167, 0.12893, 0.13633, 0.14386, 0.15152, 0.15928,
0.16715, 0.17510, 0.18313, 0.19123, 0.19938, 0.20757, 0.21580,
0.22404, 0.23229, 0.24054, 0.24877, 0.25698, 0.26515, 0.27328,
0.28135, 0.28937, 0.29732, 0.30519, 0.31298, 0.32068, 0.32829,
0.33580, 0.34320, 0.35051, 0.35771, 0.36479, 0.37177, 0.37864,
0.38539, 0.39204, 0.39857, 0.40499, 0.41131, 0.41751, 0.42362,
0.42962, 0.43551, 0.44132, 0.44702, 0.45264, 0.45816, 0.46361,
0.46896, 0.47424, 0.47945, 0.48458, 0.48964, 0.49464, 0.49958,
0.50446, 0.50928, 0.51405, 0.51878, 0.52345, 0.52809, 0.53269,
0.53725, 0.54178, 0.54628, 0.55076, 0.55521, 0.55965, 0.56407,
0.56847, 0.57287, 0.57726, 0.58165, 0.58604, 0.59044, 0.59484,
0.59925, 0.60368, 0.60813, 0.61260, 0.61710, 0.62163, 0.62620,
0.63080, 0.63545, 0.64015, 0.64490, 0.64970, 0.65457, 0.65950,
0.66450, 0.66958, 0.67473, 0.67997, 0.68529, 0.69070, 0.69620,
0.70179, 0.70749, 0.71328, 0.71917, 0.72516, 0.73126, 0.73745,
0.74374, 0.75014, 0.75662, 0.76320, 0.76987, 0.77661, 0.78343,
0.79032, 0.79727, 0.80427, 0.81131, 0.81839, 0.82548, 0.83258,
0.83967, 0.84675, 0.85380, 0.86081, 0.86776, 0.87464, 0.88144,
0.88815, 0.89475, 0.90125, 0.90762, 0.91386, 0.91997, 0.92594,
0.93177, 0.93746, 0.94301, 0.94842, 0.95368, 0.95880, 0.96376,
0.96855, 0.97316, 0.97757, 0.98173, 0.98560, 0.98913, 0.99227,
0.99495, 0.99711, 0.99870, 0.99967, 1.00000,
//--------- 0.50 GeV
0.00023, 0.00086, 0.00190, 0.00333, 0.00513, 0.00729, 0.00979,
0.01261, 0.01574, 0.01917, 0.02288, 0.02688, 0.03115, 0.03570,
0.04053, 0.04562, 0.05098, 0.05661, 0.06251, 0.06866, 0.07507,
0.08173, 0.08863, 0.09577, 0.10314, 0.11072, 0.11851, 0.12650,
0.13468, 0.14303, 0.15154, 0.16020, 0.16900, 0.17791, 0.18693,
0.19605, 0.20524, 0.21449, 0.22379, 0.23312, 0.24247, 0.25182,
0.26117, 0.27048, 0.27977, 0.28900, 0.29818, 0.30728, 0.31630,
0.32523, 0.33406, 0.34278, 0.35138, 0.35987, 0.36823, 0.37645,
0.38454, 0.39250, 0.40031, 0.40798, 0.41551, 0.42289, 0.43013,
0.43723, 0.44419, 0.45101, 0.45769, 0.46424, 0.47065, 0.47694,
0.48310, 0.48913, 0.49505, 0.50085, 0.50654, 0.51212, 0.51759,
0.52297, 0.52824, 0.53342, 0.53852, 0.54352, 0.54845, 0.55329,
0.55806, 0.56276, 0.56739, 0.57195, 0.57645, 0.58089, 0.58528,
0.58961, 0.59390, 0.59814, 0.60233, 0.60648, 0.61060, 0.61468,
0.61873, 0.62275, 0.62675, 0.63072, 0.63467, 0.63861, 0.64253,
0.64645, 0.65035, 0.65426, 0.65816, 0.66207, 0.66598, 0.66991,
0.67385, 0.67781, 0.68180, 0.68581, 0.68985, 0.69393, 0.69806,
0.70222, 0.70644, 0.71071, 0.71505, 0.71944, 0.72391, 0.72844,
0.73306, 0.73776, 0.74254, 0.74741, 0.75237, 0.75742, 0.76257,
0.76782, 0.77317, 0.77862, 0.78416, 0.78980, 0.79553, 0.80136,
0.80727, 0.81327, 0.81934, 0.82548, 0.83168, 0.83794, 0.84423,
0.85056, 0.85690, 0.86325, 0.86960, 0.87592, 0.88222, 0.88846,
0.89465, 0.90076, 0.90678, 0.91271, 0.91853, 0.92424, 0.92982,
0.93528, 0.94061, 0.94580, 0.95086, 0.95579, 0.96058, 0.96523,
0.96973, 0.97408, 0.97825, 0.98221, 0.98592, 0.98933, 0.99238,
0.99500, 0.99713, 0.99871, 0.99967, 1.00000,
//--------- 0.58 GeV
0.00029, 0.00110, 0.00243, 0.00427, 0.00660, 0.00938, 0.01260,
0.01623, 0.02027, 0.02469, 0.02948, 0.03464, 0.04015, 0.04601,
0.05222, 0.05876, 0.06564, 0.07283, 0.08034, 0.08815, 0.09626,
0.10465, 0.11331, 0.12223, 0.13138, 0.14077, 0.15037, 0.16017,
0.17014, 0.18027, 0.19055, 0.20096, 0.21147, 0.22207, 0.23275,
0.24347, 0.25423, 0.26500, 0.27577, 0.28652, 0.29723, 0.30789,
0.31847, 0.32897, 0.33938, 0.34967, 0.35984, 0.36987, 0.37975,
0.38948, 0.39905, 0.40845, 0.41767, 0.42671, 0.43556, 0.44423,
0.45271, 0.46099, 0.46909, 0.47699, 0.48471, 0.49223, 0.49957,
0.50673, 0.51371, 0.52051, 0.52714, 0.53360, 0.53989, 0.54603,
0.55201, 0.55785, 0.56354, 0.56908, 0.57450, 0.57978, 0.58494,
0.58997, 0.59489, 0.59970, 0.60440, 0.60900, 0.61350, 0.61790,
0.62221, 0.62644, 0.63059, 0.63465, 0.63865, 0.64257, 0.64643,
0.65022, 0.65395, 0.65763, 0.66125, 0.66483, 0.66836, 0.67184,
0.67529, 0.67870, 0.68208, 0.68543, 0.68876, 0.69206, 0.69534,
0.69860, 0.70185, 0.70509, 0.70832, 0.71155, 0.71478, 0.71802,
0.72126, 0.72451, 0.72777, 0.73105, 0.73436, 0.73769, 0.74105,
0.74444, 0.74787, 0.75134, 0.75486, 0.75843, 0.76206, 0.76575,
0.76949, 0.77331, 0.77720, 0.78116, 0.78520, 0.78933, 0.79354,
0.79784, 0.80222, 0.80670, 0.81128, 0.81594, 0.82070, 0.82555,
0.83049, 0.83552, 0.84064, 0.84583, 0.85110, 0.85643, 0.86182,
0.86726, 0.87274, 0.87825, 0.88378, 0.88931, 0.89484, 0.90034,
0.90581, 0.91122, 0.91657, 0.92185, 0.92703, 0.93212, 0.93710,
0.94196, 0.94671, 0.95132, 0.95582, 0.96018, 0.96443, 0.96855,
0.97254, 0.97640, 0.98011, 0.98366, 0.98701, 0.99011, 0.99290,
0.99532, 0.99731, 0.99878, 0.99969, 1.00000,
//--------- 0.62 GeV
0.00033, 0.00125, 0.00277, 0.00487, 0.00752, 0.01069, 0.01436,
0.01850, 0.02311, 0.02815, 0.03361, 0.03949, 0.04576, 0.05243,
0.05948, 0.06691, 0.07469, 0.08283, 0.09130, 0.10010, 0.10920,
0.11860, 0.12828, 0.13822, 0.14841, 0.15881, 0.16943, 0.18023,
0.19119, 0.20230, 0.21354, 0.22488, 0.23630, 0.24779, 0.25931,
0.27086, 0.28241, 0.29393, 0.30542, 0.31686, 0.32821, 0.33948,
0.35063, 0.36166, 0.37255, 0.38329, 0.39387, 0.40427, 0.41448,
0.42451, 0.43433, 0.44395, 0.45335, 0.46254, 0.47151, 0.48026,
0.48880, 0.49711, 0.50520, 0.51307, 0.52073, 0.52818, 0.53541,
0.54245, 0.54928, 0.55592, 0.56236, 0.56862, 0.57470, 0.58061,
0.58635, 0.59192, 0.59734, 0.60260, 0.60772, 0.61270, 0.61754,
0.62225, 0.62684, 0.63131, 0.63566, 0.63990, 0.64404, 0.64808,
0.65203, 0.65588, 0.65965, 0.66334, 0.66695, 0.67049, 0.67396,
0.67736, 0.68071, 0.68399, 0.68723, 0.69042, 0.69356, 0.69666,
0.69973, 0.70276, 0.70576, 0.70874, 0.71169, 0.71462, 0.71753,
0.72043, 0.72332, 0.72620, 0.72908, 0.73195, 0.73483, 0.73772,
0.74062, 0.74353, 0.74645, 0.74939, 0.75236, 0.75535, 0.75838,
0.76143, 0.76453, 0.76767, 0.77085, 0.77408, 0.77736, 0.78070,
0.78410, 0.78756, 0.79110, 0.79470, 0.79838, 0.80214, 0.80598,
0.80990, 0.81391, 0.81801, 0.82220, 0.82648, 0.83086, 0.83532,
0.83988, 0.84452, 0.84925, 0.85406, 0.85895, 0.86392, 0.86894,
0.87403, 0.87916, 0.88433, 0.88952, 0.89474, 0.89995, 0.90515,
0.91032, 0.91546, 0.92054, 0.92555, 0.93049, 0.93533, 0.94007,
0.94470, 0.94921, 0.95360, 0.95786, 0.96201, 0.96603, 0.96993,
0.97371, 0.97737, 0.98090, 0.98427, 0.98746, 0.99043, 0.99312,
0.99546, 0.99738, 0.99881, 0.99970, 1.00000,
//--------- 0.68 GeV
0.00038, 0.00148, 0.00327, 0.00575, 0.00888, 0.01263, 0.01698,
0.02189, 0.02733, 0.03330, 0.03977, 0.04672, 0.05414, 0.06201,
0.07032, 0.07906, 0.08819, 0.09771, 0.10760, 0.11783, 0.12839,
0.13924, 0.15038, 0.16178, 0.17340, 0.18524, 0.19725, 0.20943,
0.22173, 0.23415, 0.24665, 0.25920, 0.27179, 0.28438, 0.29697,
0.30951, 0.32199, 0.33439, 0.34669, 0.35887, 0.37091, 0.38279,
0.39449, 0.40600, 0.41732, 0.42841, 0.43928, 0.44992, 0.46031,
0.47046, 0.48034, 0.48997, 0.49934, 0.50844, 0.51728, 0.52586,
0.53418, 0.54223, 0.55003, 0.55758, 0.56489, 0.57195, 0.57877,
0.58536, 0.59173, 0.59789, 0.60383, 0.60957, 0.61511, 0.62047,
0.62564, 0.63064, 0.63546, 0.64013, 0.64464, 0.64901, 0.65323,
0.65732, 0.66128, 0.66512, 0.66884, 0.67245, 0.67596, 0.67937,
0.68269, 0.68592, 0.68907, 0.69215, 0.69515, 0.69809, 0.70097,
0.70379, 0.70656, 0.70928, 0.71196, 0.71460, 0.71721, 0.71978,
0.72233, 0.72486, 0.72737, 0.72986, 0.73234, 0.73481, 0.73728,
0.73974, 0.74221, 0.74467, 0.74715, 0.74963, 0.75212, 0.75463,
0.75715, 0.75970, 0.76227, 0.76486, 0.76748, 0.77013, 0.77282,
0.77554, 0.77830, 0.78110, 0.78395, 0.78685, 0.78980, 0.79281,
0.79587, 0.79899, 0.80218, 0.80544, 0.80877, 0.81217, 0.81565,
0.81921, 0.82286, 0.82659, 0.83040, 0.83431, 0.83831, 0.84240,
0.84658, 0.85085, 0.85521, 0.85966, 0.86419, 0.86881, 0.87350,
0.87825, 0.88307, 0.88794, 0.89285, 0.89779, 0.90274, 0.90771,
0.91266, 0.91760, 0.92249, 0.92733, 0.93211, 0.93681, 0.94141,
0.94592, 0.95031, 0.95459, 0.95874, 0.96278, 0.96669, 0.97048,
0.97416, 0.97772, 0.98115, 0.98444, 0.98757, 0.99048, 0.99313,
0.99546, 0.99737, 0.99881, 0.99970, 1.00000,
//--------- 0.74 GeV
0.00043, 0.00168, 0.00373, 0.00655, 0.01012, 0.01440, 0.01935,
0.02495, 0.03117, 0.03798, 0.04537, 0.05330, 0.06176, 0.07073,
0.08018, 0.09010, 0.10045, 0.11121, 0.12235, 0.13386, 0.14569,
0.15782, 0.17022, 0.18285, 0.19570, 0.20873, 0.22190, 0.23519,
0.24856, 0.26200, 0.27546, 0.28892, 0.30236, 0.31574, 0.32905,
0.34225, 0.35532, 0.36824, 0.38099, 0.39355, 0.40591, 0.41803,
0.42992, 0.44155, 0.45292, 0.46401, 0.47482, 0.48533, 0.49555,
0.50547, 0.51509, 0.52440, 0.53341, 0.54212, 0.55052, 0.55863,
0.56645, 0.57398, 0.58123, 0.58821, 0.59492, 0.60137, 0.60757,
0.61353, 0.61925, 0.62475, 0.63002, 0.63509, 0.63996, 0.64464,
0.64913, 0.65345, 0.65761, 0.66160, 0.66545, 0.66915, 0.67272,
0.67616, 0.67948, 0.68269, 0.68580, 0.68880, 0.69171, 0.69454,
0.69729, 0.69997, 0.70258, 0.70512, 0.70762, 0.71006, 0.71246,
0.71482, 0.71714, 0.71943, 0.72170, 0.72395, 0.72618, 0.72840,
0.73060, 0.73280, 0.73500, 0.73720, 0.73941, 0.74162, 0.74384,
0.74607, 0.74831, 0.75057, 0.75286, 0.75516, 0.75748, 0.75983,
0.76221, 0.76461, 0.76705, 0.76952, 0.77202, 0.77456, 0.77713,
0.77975, 0.78240, 0.78510, 0.78784, 0.79063, 0.79348, 0.79637,
0.79932, 0.80232, 0.80538, 0.80851, 0.81170, 0.81497, 0.81830,
0.82170, 0.82519, 0.82875, 0.83240, 0.83613, 0.83995, 0.84386,
0.84785, 0.85194, 0.85612, 0.86038, 0.86474, 0.86918, 0.87370,
0.87829, 0.88296, 0.88769, 0.89247, 0.89730, 0.90216, 0.90704,
0.91193, 0.91682, 0.92168, 0.92650, 0.93127, 0.93598, 0.94061,
0.94514, 0.94957, 0.95389, 0.95809, 0.96217, 0.96613, 0.96997,
0.97368, 0.97728, 0.98075, 0.98409, 0.98726, 0.99022, 0.99293,
0.99531, 0.99728, 0.99877, 0.99969, 1.00000,
//--------- 0.80 GeV
0.00048, 0.00187, 0.00414, 0.00728, 0.01125, 0.01601, 0.02152,
0.02775, 0.03467, 0.04225, 0.05046, 0.05928, 0.06868, 0.07863,
0.08910, 0.10007, 0.11150, 0.12335, 0.13560, 0.14821, 0.16114,
0.17435, 0.18782, 0.20150, 0.21536, 0.22936, 0.24347, 0.25764,
0.27186, 0.28608, 0.30027, 0.31440, 0.32844, 0.34237, 0.35615,
0.36976, 0.38318, 0.39638, 0.40935, 0.42206, 0.43450, 0.44666,
0.45851, 0.47006, 0.48128, 0.49218, 0.50275, 0.51298, 0.52287,
0.53242, 0.54164, 0.55052, 0.55906, 0.56728, 0.57518, 0.58275,
0.59002, 0.59699, 0.60366, 0.61005, 0.61617, 0.62202, 0.62761,
0.63296, 0.63808, 0.64296, 0.64764, 0.65210, 0.65637, 0.66046,
0.66436, 0.66811, 0.67169, 0.67512, 0.67841, 0.68157, 0.68461,
0.68753, 0.69035, 0.69306, 0.69568, 0.69822, 0.70068, 0.70307,
0.70539, 0.70766, 0.70987, 0.71204, 0.71417, 0.71626, 0.71833,
0.72037, 0.72239, 0.72440, 0.72639, 0.72838, 0.73037, 0.73236,
0.73436, 0.73636, 0.73838, 0.74041, 0.74246, 0.74452, 0.74661,
0.74873, 0.75086, 0.75303, 0.75523, 0.75745, 0.75971, 0.76200,
0.76433, 0.76669, 0.76909, 0.77153, 0.77400, 0.77651, 0.77907,
0.78166, 0.78429, 0.78697, 0.78969, 0.79245, 0.79526, 0.79812,
0.80103, 0.80399, 0.80700, 0.81007, 0.81320, 0.81639, 0.81964,
0.82296, 0.82635, 0.82981, 0.83334, 0.83696, 0.84066, 0.84444,
0.84831, 0.85226, 0.85630, 0.86044, 0.86466, 0.86896, 0.87336,
0.87783, 0.88238, 0.88701, 0.89170, 0.89644, 0.90123, 0.90605,
0.91089, 0.91575, 0.92059, 0.92542, 0.93020, 0.93493, 0.93959,
0.94417, 0.94865, 0.95303, 0.95729, 0.96143, 0.96545, 0.96935,
0.97312, 0.97677, 0.98030, 0.98369, 0.98691, 0.98994, 0.99271,
0.99516, 0.99719, 0.99872, 0.99968, 1.00000,
//--------- 0.90 GeV
0.00056, 0.00217, 0.00482, 0.00847, 0.01308, 0.01861, 0.02502,
0.03227, 0.04031, 0.04912, 0.05865, 0.06887, 0.07974, 0.09123,
0.10329, 0.11587, 0.12895, 0.14246, 0.15636, 0.17061, 0.18515,
0.19995, 0.21495, 0.23011, 0.24538, 0.26072, 0.27608, 0.29143,
0.30673, 0.32194, 0.33703, 0.35195, 0.36668, 0.38120, 0.39547,
0.40947, 0.42318, 0.43658, 0.44965, 0.46238, 0.47475, 0.48676,
0.49839, 0.50964, 0.52050, 0.53098, 0.54108, 0.55078, 0.56011,
0.56906, 0.57764, 0.58586, 0.59372, 0.60123, 0.60840, 0.61525,
0.62178, 0.62800, 0.63392, 0.63957, 0.64494, 0.65004, 0.65490,
0.65952, 0.66392, 0.66809, 0.67206, 0.67584, 0.67943, 0.68285,
0.68611, 0.68921, 0.69217, 0.69499, 0.69768, 0.70026, 0.70273,
0.70511, 0.70739, 0.70958, 0.71170, 0.71376, 0.71575, 0.71768,
0.71958, 0.72142, 0.72324, 0.72502, 0.72679, 0.72853, 0.73026,
0.73199, 0.73371, 0.73543, 0.73715, 0.73889, 0.74063, 0.74239,
0.74417, 0.74597, 0.74779, 0.74964, 0.75151, 0.75342, 0.75535,
0.75732, 0.75933, 0.76137, 0.76345, 0.76556, 0.76771, 0.76990,
0.77213, 0.77440, 0.77671, 0.77905, 0.78144, 0.78386, 0.78632,
0.78882, 0.79135, 0.79393, 0.79654, 0.79919, 0.80188, 0.80461,
0.80739, 0.81020, 0.81306, 0.81596, 0.81891, 0.82191, 0.82497,
0.82808, 0.83125, 0.83448, 0.83778, 0.84115, 0.84459, 0.84811,
0.85170, 0.85538, 0.85914, 0.86299, 0.86693, 0.87095, 0.87507,
0.87927, 0.88355, 0.88792, 0.89236, 0.89687, 0.90145, 0.90608,
0.91075, 0.91545, 0.92017, 0.92489, 0.92960, 0.93427, 0.93890,
0.94346, 0.94794, 0.95233, 0.95661, 0.96078, 0.96484, 0.96877,
0.97257, 0.97626, 0.97982, 0.98324, 0.98651, 0.98960, 0.99244,
0.99495, 0.99706, 0.99866, 0.99966, 1.00000,
//--------- 1.00 GeV
0.00064, 0.00248, 0.00552, 0.00970, 0.01498, 0.02132, 0.02865,
0.03694, 0.04614, 0.05619, 0.06706, 0.07870, 0.09105, 0.10406,
0.11768, 0.13184, 0.14650, 0.16159, 0.17704, 0.19281, 0.20883,
0.22505, 0.24140, 0.25784, 0.27431, 0.29076, 0.30714, 0.32342,
0.33955, 0.35548, 0.37119, 0.38664, 0.40181, 0.41666, 0.43117,
0.44532, 0.45910, 0.47248, 0.48546, 0.49803, 0.51018, 0.52191,
0.53321, 0.54408, 0.55453, 0.56457, 0.57418, 0.58339, 0.59220,
0.60062, 0.60867, 0.61634, 0.62365, 0.63062, 0.63725, 0.64356,
0.64957, 0.65527, 0.66069, 0.66583, 0.67071, 0.67534, 0.67973,
0.68389, 0.68784, 0.69158, 0.69512, 0.69848, 0.70167, 0.70468,
0.70755, 0.71027, 0.71285, 0.71530, 0.71764, 0.71987, 0.72201,
0.72405, 0.72601, 0.72789, 0.72971, 0.73147, 0.73319, 0.73485,
0.73649, 0.73809, 0.73967, 0.74123, 0.74278, 0.74432, 0.74586,
0.74740, 0.74894, 0.75050, 0.75206, 0.75365, 0.75525, 0.75687,
0.75852, 0.76020, 0.76190, 0.76363, 0.76539, 0.76719, 0.76902,
0.77088, 0.77278, 0.77472, 0.77669, 0.77871, 0.78076, 0.78284,
0.78497, 0.78713, 0.78932, 0.79156, 0.79382, 0.79613, 0.79846,
0.80083, 0.80322, 0.80565, 0.80811, 0.81060, 0.81311, 0.81566,
0.81824, 0.82085, 0.82349, 0.82617, 0.82889, 0.83164, 0.83444,
0.83728, 0.84017, 0.84311, 0.84611, 0.84916, 0.85228, 0.85547,
0.85872, 0.86205, 0.86546, 0.86895, 0.87252, 0.87618, 0.87992,
0.88376, 0.88768, 0.89169, 0.89578, 0.89995, 0.90420, 0.90852,
0.91289, 0.91732, 0.92179, 0.92627, 0.93077, 0.93526, 0.93973,
0.94415, 0.94851, 0.95279, 0.95699, 0.96108, 0.96506, 0.96892,
0.97267, 0.97630, 0.97980, 0.98319, 0.98642, 0.98949, 0.99233,
0.99486, 0.99700, 0.99863, 0.99965, 1.00000,
//--------- 1.10 GeV
0.00072, 0.00280, 0.00623, 0.01096, 0.01693, 0.02409, 0.03237,
0.04173, 0.05210, 0.06342, 0.07565, 0.08870, 0.10253, 0.11705,
0.13220, 0.14790, 0.16408, 0.18067, 0.19759, 0.21477, 0.23214,
0.24964, 0.26719, 0.28474, 0.30223, 0.31961, 0.33682, 0.35382,
0.37056, 0.38702, 0.40315, 0.41893, 0.43433, 0.44933, 0.46390,
0.47804, 0.49173, 0.50497, 0.51774, 0.53005, 0.54190, 0.55328,
0.56421, 0.57468, 0.58471, 0.59431, 0.60348, 0.61224, 0.62059,
0.62856, 0.63616, 0.64339, 0.65028, 0.65683, 0.66306, 0.66897,
0.67460, 0.67993, 0.68499, 0.68979, 0.69434, 0.69865, 0.70273,
0.70659, 0.71025, 0.71370, 0.71696, 0.72004, 0.72295, 0.72570,
0.72830, 0.73076, 0.73309, 0.73529, 0.73738, 0.73937, 0.74127,
0.74308, 0.74481, 0.74648, 0.74809, 0.74964, 0.75116, 0.75264,
0.75410, 0.75554, 0.75696, 0.75837, 0.75978, 0.76120, 0.76262,
0.76405, 0.76550, 0.76697, 0.76845, 0.76996, 0.77150, 0.77306,
0.77465, 0.77627, 0.77792, 0.77961, 0.78133, 0.78308, 0.78487,
0.78669, 0.78855, 0.79045, 0.79238, 0.79435, 0.79636, 0.79840,
0.80047, 0.80258, 0.80472, 0.80690, 0.80910, 0.81133, 0.81358,
0.81586, 0.81816, 0.82049, 0.82283, 0.82519, 0.82757, 0.82997,
0.83238, 0.83482, 0.83727, 0.83974, 0.84224, 0.84476, 0.84730,
0.84988, 0.85249, 0.85514, 0.85782, 0.86056, 0.86334, 0.86617,
0.86906, 0.87201, 0.87502, 0.87811, 0.88127, 0.88450, 0.88782,
0.89121, 0.89469, 0.89826, 0.90191, 0.90565, 0.90947, 0.91337,
0.91734, 0.92138, 0.92547, 0.92961, 0.93377, 0.93795, 0.94213,
0.94628, 0.95040, 0.95446, 0.95845, 0.96235, 0.96616, 0.96986,
0.97345, 0.97693, 0.98029, 0.98355, 0.98667, 0.98964, 0.99241,
0.99489, 0.99700, 0.99862, 0.99965, 1.00000,
//--------- 1.20 GeV
0.00080, 0.00312, 0.00693, 0.01219, 0.01884, 0.02680, 0.03601,
0.04640, 0.05791, 0.07047, 0.08400, 0.09841, 0.11364, 0.12959,
0.14617, 0.16331, 0.18089, 0.19885, 0.21709, 0.23553, 0.25408,
0.27268, 0.29125, 0.30973, 0.32804, 0.34614, 0.36398, 0.38151,
0.39868, 0.41547, 0.43184, 0.44777, 0.46324, 0.47822, 0.49272,
0.50672, 0.52021, 0.53319, 0.54567, 0.55765, 0.56914, 0.58014,
0.59067, 0.60074, 0.61035, 0.61953, 0.62829, 0.63665, 0.64461,
0.65220, 0.65943, 0.66631, 0.67286, 0.67909, 0.68501, 0.69065,
0.69600, 0.70108, 0.70589, 0.71046, 0.71479, 0.71889, 0.72276,
0.72642, 0.72988, 0.73314, 0.73621, 0.73910, 0.74183, 0.74439,
0.74681, 0.74908, 0.75123, 0.75325, 0.75516, 0.75697, 0.75869,
0.76033, 0.76190, 0.76341, 0.76486, 0.76628, 0.76766, 0.76902,
0.77036, 0.77169, 0.77301, 0.77434, 0.77568, 0.77704, 0.77841,
0.77980, 0.78121, 0.78266, 0.78413, 0.78563, 0.78717, 0.78873,
0.79034, 0.79197, 0.79364, 0.79535, 0.79710, 0.79888, 0.80069,
0.80255, 0.80444, 0.80636, 0.80833, 0.81033, 0.81236, 0.81443,
0.81653, 0.81866, 0.82082, 0.82301, 0.82522, 0.82746, 0.82971,
0.83198, 0.83427, 0.83656, 0.83887, 0.84118, 0.84350, 0.84582,
0.84815, 0.85047, 0.85280, 0.85514, 0.85747, 0.85982, 0.86217,
0.86453, 0.86690, 0.86929, 0.87171, 0.87414, 0.87661, 0.87910,
0.88163, 0.88421, 0.88683, 0.88950, 0.89223, 0.89502, 0.89788,
0.90080, 0.90380, 0.90688, 0.91003, 0.91328, 0.91660, 0.92001,
0.92349, 0.92705, 0.93068, 0.93437, 0.93811, 0.94189, 0.94568,
0.94948, 0.95326, 0.95701, 0.96071, 0.96434, 0.96789, 0.97135,
0.97472, 0.97798, 0.98115, 0.98421, 0.98717, 0.98999, 0.99263,
0.99502, 0.99707, 0.99865, 0.99965, 1.00000
};
// CM momentum (GeV/c)
G4float G4LEnp::pcm[NENERGY] = {
0.685E-01, 0.969E-01, 0.119, 0.153, 0.181, 0.217, 0.256,
0.291, 0.336, 0.399, 0.444, 0.484, 0.522, 0.539,
0.565, 0.589, 0.613, 0.650, 0.685, 0.718, 0.750
};
// Lab energy (GeV)
G4float G4LEnp::elab[NENERGY] = {
0.100E-01, 0.200E-01, 0.300E-01, 0.500E-01, 0.700E-01, 0.100, 0.140,
0.180, 0.240, 0.340, 0.420, 0.500, 0.580, 0.620,
0.680, 0.740, 0.800, 0.900, 1.00, 1.10, 1.20
};
// Max dsigma/domega-CM (mb/sr)
G4float G4LEnp::dsigmax[NENERGY] = {
79.0, 43.0, 29.8, 20.0, 16.3, 14.5, 13.3,
12.6, 11.9, 11.3, 11.1, 10.7, 9.69, 10.1,
11.4, 12.5, 13.3, 14.5, 15.6, 16.9, 18.3
};
// Total cross section
G4float G4LEnp::sigtot[NENERGY] = {
947., 485., 310., 168., 110., 75.7, 55.2,
45.9, 39.1, 34.1, 32.3, 31.3, 30.1, 29.5,
28.4, 27.4, 26.4, 24.8, 23.4, 22.4, 21.9
};
@@ -0,0 +1,85 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// G4 Low energy model: n-n or p-p scattering
// F.W. Jones, L.G. Greeniaus, H.P. Wellisch
//
// For further comments see G4LEppData.hh and G4LEpp.cc
//
#ifndef G4LEpp_h
#define G4LEpp_h 1
#include "globals.hh"
#include "Randomize.hh"
#include "G4Element.hh"
#include "G4ElementVector.hh"
#include "G4ElementTable.hh"
#include "G4PhysicsTable.hh"
#include "G4PhysicsVector.hh"
#include "G4LPhysicsFreeVector.hh"
#include "G4Gamma.hh"
#include "G4Step.hh"
#include "G4TrackStatus.hh"
#include "G4HadronicInteraction.hh"
class G4LEpp : public G4HadronicInteraction
{
private:
enum { NENERGY=22, NANGLE=180 };
public:
G4LEpp();
~G4LEpp();
G4VParticleChange* ApplyYourself(const G4Track& aTrack,
G4Nucleus& targetNucleus);
void SetCoulombSuppression(G4int State);
private:
G4float * sig[NANGLE];
G4float * elab;
// The following arrays are declared static to allow the use of initializers.
// They are initialized in G4LEppData.hh
// Coulomb effects suppressed:
static G4float Sig[NENERGY][NANGLE];
static G4float Pcm[NENERGY], Elab[NENERGY],
dSigmax[NENERGY], Sigtot[NENERGY];
// Coulomb effects not suppressed:
static G4float SigCoul[NENERGY][NANGLE];
static G4float PcmCoul[NENERGY], ElabCoul[NENERGY],
dSigmaxCoul[NENERGY], SigtotCoul[NENERGY];
};
#endif
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,343 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
// G4 Low energy model: n-p scattering
// F.W. Jones, L.G. Greeniaus, H.P. Wellisch
#include "G4LEnp.hh"
#include "Randomize.hh"
#include "G4ios.hh"
// Initialization of static data arrays:
#include "G4LEnpData.hh"
#include "Randomize.hh"
G4LEnp::G4LEnp() :
G4HadronicInteraction()
{
// theParticleChange.SetNumberOfSecondaries(1);
// SetMinEnergy(10.*MeV);
// SetMaxEnergy(1200.*MeV);
SetMinEnergy(0.);
SetMaxEnergy(1200.*GeV);
}
G4LEnp::~G4LEnp()
{
// theParticleChange.Clear();
}
G4VParticleChange*
G4LEnp::ApplyYourself(const G4Track& aTrack, G4Nucleus& targetNucleus)
{
theParticleChange.Initialize(aTrack);
const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
G4double P = aParticle->GetTotalMomentum();
G4double Px = aParticle->GetMomentum().x();
G4double Py = aParticle->GetMomentum().y();
G4double Pz = aParticle->GetMomentum().z();
G4double ek = aParticle->GetKineticEnergy();
G4ThreeVector theInitial = aParticle->GetMomentum();
if (verboseLevel > 1) {
G4double E = aParticle->GetTotalEnergy();
G4double E0 = aParticle->GetDefinition()->GetPDGMass();
G4double Q = aParticle->GetDefinition()->GetPDGCharge();
G4double N = targetNucleus.GetN();
G4double Z = targetNucleus.GetZ();
G4cout << "G4LEnp:ApplyYourself: incident particle: "
<< aParticle->GetDefinition()->GetParticleName() << G4endl;
G4cout << "P = " << P/GeV << " GeV/c"
<< ", Px = " << Px/GeV << " GeV/c"
<< ", Py = " << Py/GeV << " GeV/c"
<< ", Pz = " << Pz/GeV << " GeV/c" << G4endl;
G4cout << "E = " << E/GeV << " GeV"
<< ", kinetic energy = " << ek/GeV << " GeV"
<< ", mass = " << E0/GeV << " GeV"
<< ", charge = " << Q << G4endl;
G4cout << "G4LEnp:ApplyYourself: material:" << G4endl;
G4cout << "A = " << N
<< ", Z = " << Z
<< ", atomic mass "
<< G4Proton::Proton()->GetPDGMass()/GeV << "GeV"
<< G4endl;
//
// GHEISHA ADD operation to get total energy, mass, charge
//
E += G4Proton::Proton()->GetPDGMass();
G4double E02 = E*E - P*P;
E0 = sqrt(abs(E02));
if (E02 < 0)E0 *= -1;
Q += Z;
G4cout << "G4LEnp:ApplyYourself: total:" << G4endl;
G4cout << "E = " << E/GeV << " GeV"
<< ", mass = " << E0/GeV << " GeV"
<< ", charge = " << Q << G4endl;
}
// Find energy bin
G4int je1 = 0;
G4int je2 = NENERGY - 1;
ek = ek/GeV;
do {
G4int midBin = (je1 + je2)/2;
if (ek < elab[midBin])
je2 = midBin;
else
je1 = midBin;
} while (je2 - je1 > 1);
// G4int j;
//abs(ek-elab[je1]) < abs(ek-elab[je2]) ? j = je1 : j = je2;
G4double delab = elab[je2] - elab[je1];
// Sample the angle
G4float sample = G4UniformRand();
G4int ke1 = 0;
G4int ke2 = NANGLE - 1;
G4double dsig = sig[je2][0] - sig[je1][0];
G4double rc = dsig/delab;
G4double b = sig[je1][0] - rc*elab[je1];
G4double sigint1 = rc*ek + b;
G4double sigint2 = 0.;
if (verboseLevel > 1) G4cout << "sample=" << sample << G4endl
<< ke1 << " " << ke2 << " "
<< sigint1 << " " << sigint2 << G4endl;
do {
G4int midBin = (ke1 + ke2)/2;
dsig = sig[je2][midBin] - sig[je1][midBin];
rc = dsig/delab;
b = sig[je1][midBin] - rc*elab[je1];
G4double sigint = rc*ek + b;
if (sample < sigint) {
ke2 = midBin;
sigint2 = sigint;
}
else {
ke1 = midBin;
sigint1 = sigint;
}
if (verboseLevel > 1)G4cout << ke1 << " " << ke2 << " "
<< sigint1 << " " << sigint2 << G4endl;
} while (ke2 - ke1 > 1);
// sigint1 and sigint2 should be recoverable from above loop
// G4double dsig = sig[je2][ke1] - sig[je1][ke1];
// G4double rc = dsig/delab;
// G4double b = sig[je1][ke1] - rc*elab[je1];
// G4double sigint1 = rc*ek + b;
// G4double dsig = sig[je2][ke2] - sig[je1][ke2];
// G4double rc = dsig/delab;
// G4double b = sig[je1][ke2] - rc*elab[je1];
// G4double sigint2 = rc*ek + b;
dsig = sigint2 - sigint1;
rc = 1./dsig;
b = ke1 - rc*sigint1;
G4double kint = rc*sample + b;
G4double theta = (0.5 + kint)*pi/180.;
// G4int k;
//abs(sample-sig[j][ke1]) < abs(sample-sig[j][ke2]) ? k = ke1 : k = ke2;
// G4double theta = (0.5 + k)*pi/180.;
if (verboseLevel > 1) {
G4cout << " energy bin " << je1 << " energy=" << elab[je1] << G4endl;
G4cout << " angle bin " << kint << " angle=" << theta/degree << G4endl;
}
// Get the target particle
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
G4double E1 = aParticle->GetTotalEnergy();
G4double M1 = aParticle->GetDefinition()->GetPDGMass();
G4double E2 = targetParticle->GetTotalEnergy();
G4double M2 = targetParticle->GetDefinition()->GetPDGMass();
G4double totalEnergy = E1 + E2;
G4double pseudoMass = sqrt(totalEnergy*totalEnergy - P*P);
// pseudoMass also = sqrt(M1*M1 + M2*M2 + 2*M2*E1)
// Transform into centre of mass system
G4double px = (M2/pseudoMass)*Px;
G4double py = (M2/pseudoMass)*Py;
G4double pz = (M2/pseudoMass)*Pz;
G4double p = sqrt(px*px + py*py + pz*pz);
if (verboseLevel > 1) {
G4cout << " E1, M1 (GeV) " << E1/GeV << " " << M1/GeV << G4endl;
G4cout << " E2, M2 (GeV) " << E2/GeV << " " << M2/GeV << G4endl;
G4cout << " particle 1 momentum in CM " << px/GeV << " " << py/GeV << " "
<< pz/GeV << " " << p/GeV << G4endl;
}
// First scatter w.r.t. Z axis
G4double phi = G4UniformRand()*twopi;
G4double pxnew = p*sin(theta)*cos(phi);
G4double pynew = p*sin(theta)*sin(phi);
G4double pznew = p*cos(theta);
// Rotate according to the direction of the incident particle
if (px*px + py*py > 0) {
G4double cost, sint, ph, cosp, sinp, a, b, c;
cost = pz/p;
sint = (sqrt(abs((1-cost)*(1+cost))) + sqrt(px*px+py*py)/p)/2;
py < 0 ? ph = 3*halfpi : ph = halfpi;
if (abs(px) > 0.000001*GeV) ph = atan2(py,px);
cosp = cos(ph);
sinp = sin(ph);
px = (cost*cosp*pxnew - sinp*pynew + sint*cosp*pznew);
py = (cost*sinp*pxnew + cosp*pynew + sint*sinp*pznew);
pz = (-sint*pxnew + cost*pznew);
// G4ThreeVector it(a,b,c);
// p0->SetMomentum(it);
// G4ThreeVector aTargetMom = theInitial - it;
// targetParticle->SetMomentum(aTargetMom);
}
else {
px = pxnew;
py = pynew;
pz = pznew;
}
if (verboseLevel > 1) {
G4cout << " AFTER SCATTER..." << G4endl;
G4cout << " particle 1 momentum in CM " << px/GeV << " " << py/GeV << " "
<< pz/GeV << " " << p/GeV << G4endl;
}
// Transform to lab system
G4double E1pM2 = E1 + M2;
G4double betaCM = P/E1pM2;
G4double betaCMx = Px/E1pM2;
G4double betaCMy = Py/E1pM2;
G4double betaCMz = Pz/E1pM2;
G4double gammaCM = E1pM2/sqrt(E1pM2*E1pM2 - P*P);
if (verboseLevel > 1) {
G4cout << " betaCM " << betaCMx << " " << betaCMy << " "
<< betaCMz << " " << betaCM << G4endl;
G4cout << " gammaCM " << gammaCM << G4endl;
}
// Now following GLOREN...
G4double BETA[5], PA[5], PB[5];
BETA[1] = -betaCMx;
BETA[2] = -betaCMy;
BETA[3] = -betaCMz;
BETA[4] = gammaCM;
//The incident particle...
PA[1] = px;
PA[2] = py;
PA[3] = pz;
PA[4] = sqrt(M1*M1 + p*p);
G4double BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3];
G4double BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4];
PB[1] = PA[1] + BPGAM * BETA[1];
PB[2] = PA[2] + BPGAM * BETA[2];
PB[3] = PA[3] + BPGAM * BETA[3];
PB[4] = (PA[4] - BETPA) * BETA[4];
G4DynamicParticle* newP = new G4DynamicParticle;
newP->SetDefinition(aParticle->GetDefinition());
newP->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3]));
//The target particle...
PA[1] = -px;
PA[2] = -py;
PA[3] = -pz;
PA[4] = sqrt(M2*M2 + p*p);
BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3];
BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4];
PB[1] = PA[1] + BPGAM * BETA[1];
PB[2] = PA[2] + BPGAM * BETA[2];
PB[3] = PA[3] + BPGAM * BETA[3];
PB[4] = (PA[4] - BETPA) * BETA[4];
targetParticle->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3]));
if (verboseLevel > 1) {
G4cout << " particle 1 momentum in LAB "
<< newP->GetMomentum()*(1./GeV)
<< " " << newP->GetTotalMomentum()/GeV << G4endl;
G4cout << " particle 2 momentum in LAB "
<< targetParticle->GetMomentum()*(1./GeV)
<< " " << targetParticle->GetTotalMomentum()/GeV << G4endl;
G4cout << " TOTAL momentum in LAB "
<< (newP->GetMomentum()+targetParticle->GetMomentum())*(1./GeV)
<< " "
<< (newP->GetMomentum()+targetParticle->GetMomentum()).mag()/GeV
<< G4endl;
}
// charge symmetry....
if(G4UniformRand()<.5)
{
theParticleChange.SetNumberOfSecondaries(1);
theParticleChange.SetMomentumChange(newP->GetMomentumDirection());
theParticleChange.SetEnergyChange(newP->GetKineticEnergy());
delete newP;
G4DynamicParticle* p1 = new G4DynamicParticle;
p1->SetDefinition(targetParticle->GetDefinition());
p1->SetMomentum(targetParticle->GetMomentum());
theParticleChange.AddSecondary(p1);
}
else
{
theParticleChange.SetNumberOfSecondaries(2);
theParticleChange.SetStatusChange(fStopAndKill);
G4DynamicParticle * pA = new G4DynamicParticle;
pA->SetDefinition(targetParticle->GetDefinition());
pA->SetMomentum(newP->GetMomentum());
G4DynamicParticle * pB = new G4DynamicParticle;
pB->SetDefinition(newP->GetDefinition());
pB->SetMomentum(targetParticle->GetMomentum());
delete newP;
theParticleChange.AddSecondary(pA);
theParticleChange.AddSecondary(pB);
}
return &theParticleChange;
}
// end of file
@@ -0,0 +1,372 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
// G4 Low energy model: n-n or p-p scattering
// F.W. Jones, L.G. Greeniaus, H.P. Wellisch
#include "G4LEpp.hh"
#include "Randomize.hh"
#include "G4ios.hh"
// Initialization of static data arrays:
#include "G4LEppData.hh"
G4LEpp::G4LEpp() :
G4HadronicInteraction()
{
// theParticleChange.SetNumberOfSecondaries(1);
// SetMinEnergy(10.*MeV);
// SetMaxEnergy(1200.*MeV);
SetCoulombSuppression(1);
SetMinEnergy(0.);
SetMaxEnergy(1200.*GeV);
}
G4LEpp::~G4LEpp()
{
// theParticleChange.Clear();
}
void
G4LEpp::SetCoulombSuppression(G4int State)
{
if (State) {
for(G4int i=0; i<NANGLE; i++)
{
sig[i] = Sig[i];
}
elab = Elab;
}
else {
for(G4int i=0; i<NANGLE; i++)
{
sig[i] = SigCoul[i];
}
elab = ElabCoul;
}
}
G4VParticleChange*
G4LEpp::ApplyYourself(const G4Track& aTrack, G4Nucleus& targetNucleus)
{
theParticleChange.Initialize(aTrack);
const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
G4double P = aParticle->GetTotalMomentum();
G4double Px = aParticle->GetMomentum().x();
G4double Py = aParticle->GetMomentum().y();
G4double Pz = aParticle->GetMomentum().z();
G4double ek = aParticle->GetKineticEnergy();
G4ThreeVector theInitial = aParticle->GetMomentum();
if (verboseLevel > 1) {
G4double E = aParticle->GetTotalEnergy();
G4double E0 = aParticle->GetDefinition()->GetPDGMass();
G4double Q = aParticle->GetDefinition()->GetPDGCharge();
G4double N = targetNucleus.GetN();
G4double Z = targetNucleus.GetZ();
G4cout << "G4LEpp:ApplyYourself: incident particle: "
<< aParticle->GetDefinition()->GetParticleName() << G4endl;
G4cout << "P = " << P/GeV << " GeV/c"
<< ", Px = " << Px/GeV << " GeV/c"
<< ", Py = " << Py/GeV << " GeV/c"
<< ", Pz = " << Pz/GeV << " GeV/c" << G4endl;
G4cout << "E = " << E/GeV << " GeV"
<< ", kinetic energy = " << ek/GeV << " GeV"
<< ", mass = " << E0/GeV << " GeV"
<< ", charge = " << Q << G4endl;
G4cout << "G4LEpp:ApplyYourself: material:" << G4endl;
G4cout << "A = " << N
<< ", Z = " << Z
<< ", atomic mass "
<< G4Proton::Proton()->GetPDGMass()/GeV << "GeV"
<< G4endl;
//
// GHEISHA ADD operation to get total energy, mass, charge
//
E += G4Proton::Proton()->GetPDGMass();
G4double E02 = E*E - P*P;
E0 = sqrt(abs(E02));
if (E02 < 0)E0 *= -1;
Q += Z;
G4cout << "G4LEpp:ApplyYourself: total:" << G4endl;
G4cout << "E = " << E/GeV << " GeV"
<< ", mass = " << E0/GeV << " GeV"
<< ", charge = " << Q << G4endl;
}
// Find energy bin
G4int je1 = 0;
G4int je2 = NENERGY - 1;
ek = ek/GeV;
do {
G4int midBin = (je1 + je2)/2;
if (ek < elab[midBin])
je2 = midBin;
else
je1 = midBin;
} while (je2 - je1 > 1);
// G4int j;
//abs(ek-elab[je1]) < abs(ek-elab[je2]) ? j = je1 : j = je2;
G4double delab = elab[je2] - elab[je1];
// Sample the angle
G4float sample = G4UniformRand();
G4int ke1 = 0;
G4int ke2 = NANGLE - 1;
G4double dsig = sig[je2][0] - sig[je1][0];
G4double rc = dsig/delab;
G4double b = sig[je1][0] - rc*elab[je1];
G4double sigint1 = rc*ek + b;
G4double sigint2 = 0.;
if (verboseLevel > 1) G4cout << "sample=" << sample << G4endl
<< ke1 << " " << ke2 << " "
<< sigint1 << " " << sigint2 << G4endl;
do {
G4int midBin = (ke1 + ke2)/2;
dsig = sig[je2][midBin] - sig[je1][midBin];
rc = dsig/delab;
b = sig[je1][midBin] - rc*elab[je1];
G4double sigint = rc*ek + b;
if (sample < sigint) {
ke2 = midBin;
sigint2 = sigint;
}
else {
ke1 = midBin;
sigint1 = sigint;
}
if (verboseLevel > 1)G4cout << ke1 << " " << ke2 << " "
<< sigint1 << " " << sigint2 << G4endl;
} while (ke2 - ke1 > 1);
// sigint1 and sigint2 should be recoverable from above loop
// G4double dsig = sig[je2][ke1] - sig[je1][ke1];
// G4double rc = dsig/delab;
// G4double b = sig[je1][ke1] - rc*elab[je1];
// G4double sigint1 = rc*ek + b;
// G4double dsig = sig[je2][ke2] - sig[je1][ke2];
// G4double rc = dsig/delab;
// G4double b = sig[je1][ke2] - rc*elab[je1];
// G4double sigint2 = rc*ek + b;
dsig = sigint2 - sigint1;
rc = 1./dsig;
b = ke1 - rc*sigint1;
G4double kint = rc*sample + b;
G4double theta = (0.5 + kint)*pi/180.;
// G4int k;
//abs(sample-sig[j][ke1]) < abs(sample-sig[j][ke2]) ? k = ke1 : k = ke2;
// G4double theta = (0.5 + k)*pi/180.;
if (verboseLevel > 1) {
G4cout << " energy bin " << je1 << " energy=" << elab[je1] << G4endl;
G4cout << " angle bin " << kint << " angle=" << theta/degree << G4endl;
}
// Get the target particle
G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
G4double E1 = aParticle->GetTotalEnergy();
G4double M1 = aParticle->GetDefinition()->GetPDGMass();
G4double E2 = targetParticle->GetTotalEnergy();
G4double M2 = targetParticle->GetDefinition()->GetPDGMass();
G4double totalEnergy = E1 + E2;
G4double pseudoMass = sqrt(totalEnergy*totalEnergy - P*P);
// pseudoMass also = sqrt(M1*M1 + M2*M2 + 2*M2*E1)
// Transform into centre of mass system
G4double px = (M2/pseudoMass)*Px;
G4double py = (M2/pseudoMass)*Py;
G4double pz = (M2/pseudoMass)*Pz;
G4double p = sqrt(px*px + py*py + pz*pz);
if (verboseLevel > 1) {
G4cout << " E1, M1 (GeV) " << E1/GeV << " " << M1/GeV << G4endl;
G4cout << " E2, M2 (GeV) " << E2/GeV << " " << M2/GeV << G4endl;
G4cout << " particle 1 momentum in CM " << px/GeV << " " << py/GeV << " "
<< pz/GeV << " " << p/GeV << G4endl;
}
// First scatter w.r.t. Z axis
G4double phi = G4UniformRand()*twopi;
G4double pxnew = p*sin(theta)*cos(phi);
G4double pynew = p*sin(theta)*sin(phi);
G4double pznew = p*cos(theta);
// Rotate according to the direction of the incident particle
if (px*px + py*py > 0) {
G4double cost, sint, ph, cosp, sinp, a, b, c;
cost = pz/p;
sint = (sqrt(abs((1-cost)*(1+cost))) + sqrt(px*px+py*py)/p)/2;
py < 0 ? ph = 3*halfpi : ph = halfpi;
if (abs(px) > 0.000001*GeV) ph = atan2(py,px);
cosp = cos(ph);
sinp = sin(ph);
px = (cost*cosp*pxnew - sinp*pynew + sint*cosp*pznew);
py = (cost*sinp*pxnew + cosp*pynew + sint*sinp*pznew);
pz = (-sint*pxnew + cost*pznew);
// G4ThreeVector it(a,b,c);
// p0->SetMomentum(it);
// G4ThreeVector aTargetMom = theInitial - it;
// targetParticle->SetMomentum(aTargetMom);
}
else {
px = pxnew;
py = pynew;
pz = pznew;
}
if (verboseLevel > 1) {
G4cout << " AFTER SCATTER..." << G4endl;
G4cout << " particle 1 momentum in CM " << px/GeV << " " << py/GeV << " "
<< pz/GeV << " " << p/GeV << G4endl;
}
// Transform to lab system
G4double E1pM2 = E1 + M2;
G4double betaCM = P/E1pM2;
G4double betaCMx = Px/E1pM2;
G4double betaCMy = Py/E1pM2;
G4double betaCMz = Pz/E1pM2;
G4double gammaCM = E1pM2/sqrt(E1pM2*E1pM2 - P*P);
if (verboseLevel > 1) {
G4cout << " betaCM " << betaCMx << " " << betaCMy << " "
<< betaCMz << " " << betaCM << G4endl;
G4cout << " gammaCM " << gammaCM << G4endl;
}
// Now following GLOREN...
G4double BETA[5], PA[5], PB[5];
BETA[1] = -betaCMx;
BETA[2] = -betaCMy;
BETA[3] = -betaCMz;
BETA[4] = gammaCM;
//The incident particle...
PA[1] = px;
PA[2] = py;
PA[3] = pz;
PA[4] = sqrt(M1*M1 + p*p);
G4double BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3];
G4double BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4];
PB[1] = PA[1] + BPGAM * BETA[1];
PB[2] = PA[2] + BPGAM * BETA[2];
PB[3] = PA[3] + BPGAM * BETA[3];
PB[4] = (PA[4] - BETPA) * BETA[4];
G4DynamicParticle* newP = new G4DynamicParticle;
newP->SetDefinition(aParticle->GetDefinition());
newP->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3]));
//The target particle...
PA[1] = -px;
PA[2] = -py;
PA[3] = -pz;
PA[4] = sqrt(M2*M2 + p*p);
BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3];
BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4];
PB[1] = PA[1] + BPGAM * BETA[1];
PB[2] = PA[2] + BPGAM * BETA[2];
PB[3] = PA[3] + BPGAM * BETA[3];
PB[4] = (PA[4] - BETPA) * BETA[4];
targetParticle->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3]));
G4double ektotal = newP->GetKineticEnergy() +
targetParticle->GetKineticEnergy();
if (verboseLevel > 1) {
G4cout << " particle 1 momentum in LAB "
<< newP->GetMomentum()*(1./GeV)
<< " " << newP->GetTotalMomentum()/GeV << G4endl;
G4cout << " particle 2 momentum in LAB "
<< targetParticle->GetMomentum()*(1./GeV)
<< " " << targetParticle->GetTotalMomentum()/GeV << G4endl;
G4cout << " TOTAL momentum in LAB "
<< (newP->GetMomentum()+targetParticle->GetMomentum())*(1./GeV)
<< " "
<< (newP->GetMomentum()+targetParticle->GetMomentum()).mag()/GeV
<< G4endl;
}
// if (theta < pi/2.) {
theParticleChange.SetNumberOfSecondaries(1);
// G4double p = newP->GetMomentum().mag();
// G4ThreeVector m = newP->GetMomentum();
// if (p > DBL_MIN)
// theParticleChange.SetMomentumChange(m.x()/p, m.y()/p, m.z()/p);
// else
// theParticleChange.SetMomentumChange(0., 0., 0.);
theParticleChange.SetMomentumDirectionChange(
newP->GetMomentumDirection());
theParticleChange.SetEnergyChange(newP->GetKineticEnergy());
delete newP;
// }
// else {
// // charge exchange
// theParticleChange.SetNumberOfSecondaries(2);
// theParticleChange.AddSecondary(newP);
// theParticleChange.SetStatusChange(fStopAndKill);
// // theParticleChange.SetEnergyChange(0.0);
// }
// Recoil particle
G4DynamicParticle* p1 = new G4DynamicParticle;
p1->SetDefinition(targetParticle->GetDefinition());
p1->SetMomentum(targetParticle->GetMomentum());
theParticleChange.AddSecondary(p1);
return &theParticleChange;
}
// end of file
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4AlphaCoulombBarrier.hh,v 1.2.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4AlphaCoulombBarrier.hh,v 1.4 2001/08/01 17:04:07 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Dec 1999)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4AlphaEvaporationChannel.hh,v 1.2.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4AlphaEvaporationChannel.hh,v 1.4 2001/08/01 17:04:07 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Nov. 1999)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4AlphaEvaporationProbability.hh,v 1.2.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4AlphaEvaporationProbability.hh,v 1.4 2001/08/01 17:04:08 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Nov 1999)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4B9FermiFragment.hh,v 1.3.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4B9FermiFragment.hh,v 1.5 2001/08/01 17:04:08 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Nov 1998)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4Be8FermiFragment.hh,v 1.3.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4Be8FermiFragment.hh,v 1.5 2001/08/01 17:04:09 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Nov 1998)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CameronGilbertPairingCorrections.hh,v 1.3.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CameronGilbertPairingCorrections.hh,v 1.5 2001/08/01 17:04:09 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CameronGilbertShellCorrections.hh,v 1.3.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CameronGilbertShellCorrections.hh,v 1.5 2001/08/01 17:04:09 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CameronShellPlusPairingCorrections.hh,v 1.3.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CameronShellPlusPairingCorrections.hh,v 1.5 2001/08/01 17:04:09 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CameronTruranHilfPairingCorrections.hh,v 1.3.2.1 2001/06/28 19:12:58 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CameronTruranHilfPairingCorrections.hh,v 1.5 2001/08/01 17:04:10 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CameronTruranHilfShellCorrections.hh,v 1.3.2.1 2001/06/28 19:12:59 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CameronTruranHilfShellCorrections.hh,v 1.5 2001/08/01 17:04:10 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CompetitiveFission.hh,v 1.4.2.1 2001/06/28 19:12:59 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CompetitiveFission.hh,v 1.6 2001/08/01 17:04:11 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Oct 1998)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4ConstantLevelDensityParameter.hh,v 1.3.2.1 2001/06/28 19:12:59 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4ConstantLevelDensityParameter.hh,v 1.5 2001/08/01 17:04:11 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations (photon evaporation)
// by C. Dallapiccola (Nov 1998)
@@ -14,7 +14,7 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
@@ -14,7 +14,7 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4CoulombBarrier.hh,v 1.2.2.1 2001/06/28 19:13:00 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4CoulombBarrier.hh,v 1.5 2001/10/08 17:15:48 larazb Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Dec 1999)
@@ -58,7 +58,9 @@ private:
virtual G4double BarrierPenetrationFactor(const G4double aZ) const {return 1.0;}
virtual G4double CalcCompoundRadius(const G4double ZRes) const
{
return 2.173*fermi*(1.0+0.006103*G4double(GetZ())*ZRes)/(1.0+0.009443*G4double(GetZ())*ZRes);
}
};
#endif
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4DeuteronCoulombBarrier.hh,v 1.1.8.1 2001/06/28 19:13:00 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4DeuteronCoulombBarrier.hh,v 1.3 2001/08/01 17:04:13 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Dec 1999)
@@ -14,15 +14,15 @@
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: G4DeuteronEvaporationChannel.hh,v 1.2.2.1 2001/06/28 19:13:00 gunter Exp $
// GEANT4 tag $Name: $
// $Id: G4DeuteronEvaporationChannel.hh,v 1.4 2001/08/01 17:04:14 hpw Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
// Hadronic Process: Nuclear De-excitations
// by V. Lara (Nov. 1999)

Some files were not shown because too many files have changed in this diff Show More