Import Geant4 9.4.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 16:25:56 +02:00
parent 74cad5e589
commit 89a9605df1
4440 changed files with 379508 additions and 189225 deletions
@@ -0,0 +1,18 @@
#------------------------------------------------------------------------------
# CMakeLists.txt
# Module : G4had_string
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string
#
# Intermediate level CMakeLists.txt - just process subdirectories
#
# Generated on : 24/9/2010
#
# $Id: CMakeLists.txt,v 1.1 2010/09/29 19:04:26 bmorgan Exp $
#
#------------------------------------------------------------------------------
add_subdirectory(diffraction)
add_subdirectory(hadronization)
add_subdirectory(management)
add_subdirectory(qgsm)
@@ -13,6 +13,12 @@ code and to keep track of all tags.
---------------------------------------------------------------
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
9 Dec. 2009, V. Uzhinsky (hadr-prtn-V09-03-00)
Crush found by Alberto with AveragePt2=0 is erased in FTF.
--------------------------------------------------------
6 December 2009, V. Uzhinsky (hadr-prtn-V09-02-10)
Some correstions are made in diffr., hadronization and managment
to treat kinky string fragmentation.
19 November 2009, Gunter Folger (hadr-prtn-V09-02-09)
- G4VParticipants.hh: use modified name of method to sort nucleons in G4V3DNucleus
@@ -0,0 +1,18 @@
#------------------------------------------------------------------------------
# CMakeLists.txt
# Module : G4had_string_diff
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_diff
#
# CMakeLists.txt for building a single granular library.
#
# Generated on : 24/9/2010
#
# $Id: CMakeLists.txt,v 1.1 2010/09/29 19:04:35 bmorgan Exp $
#
#------------------------------------------------------------------------------
if(GEANT4_BUILD_GRANULAR_LIBS)
include(Geant4MacroLibraryTargets)
GEANT4_GRANULAR_LIBRARY_TARGET(COMPONENT sources.cmake)
endif()
@@ -1,4 +1,4 @@
$Id: History,v 1.29 2009/12/15 19:20:46 vuzhinsk Exp $
$Id: History,v 1.34 2010/11/15 10:10:16 vuzhinsk Exp $
-------------------------------------------------------------------
==========================================================
@@ -14,12 +14,31 @@ code and to keep track of all tags.
---------------------------------------------------------------
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
15 Nov. 2010, V. Uzhinsky (hadr-string-diff-V09-03-04)
FTF with tuned parameters for pA and PiA interactions.
Quark exchange is tuned.
Low mass string fragmentation is improved.
Reggeon cascade parameters are tuned.
--------------------------------------------------------
20 Sept. 2010, V, Uzhinsky (hadr-string-diff-V09-03-03)
FTF with new tuned parameters of nuclear destrustion is implemented.
The parameters were tuned using HARP-CDP data on p+Cu interactions.
They will be re-tuned for heavy nuclei a little bit.
----------------------------------------------------
8 Sept 2010 G.Folger (hadr-string-diff-V09-03-02)
G4FTFModel.cc: use integer interace of G4Nucleus
14 Jun 2010 G.Cosmo (hadr-string-diff-V09-03-01)
Added missing virtual destructor to G4DiffractiveHHScatterer.
15 Dec 2009 V.Uzhinsky (hadr-string-diff-V09-02-23)
Bug was fixed for Kaon + A interactions in G4DiffractiveExcitation.cc
Bug was fixed for Kaon + A interactions in G4DiffractiveExcitation.cc
------------------------------------------------------------
15 Dec 2009 G.Folger (hadr-string-diff-V09-02-22)
- G4FTFModel: In ctor, initialise NumberOfInvolvedNucleon
G4FTFModel: In ctor, initialise NumberOfInvolvedNucleon
14 Dec. 2009 V. Uzhinsky (hadr-string-diff-V09-02-21)
Momentum sampling in the reggeon cascade is improved.
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveHHScatterer.hh,v 1.7 2009/10/06 10:10:36 vuzhinsk Exp $
// $Id: G4DiffractiveHHScatterer.hh,v 1.8 2010/06/14 16:26:46 gcosmo Exp $
#ifndef G4DiffractiveHHScatterer_h
#define G4DiffractiveHHScatterer_h 1
@@ -51,10 +51,11 @@ class G4DiffractiveHHScatterer
public:
G4DiffractiveHHScatterer();
virtual ~G4DiffractiveHHScatterer();
// G4KineticTrackVector * Scatter(const G4KineticTrack & aTrack, const G4KineticTrack & bTrack);
virtual void CreateStrings() const;
virtual void CreateStrings() const;
/*
(G4VSplitableHadron * aHadron,
G4bool isProjectile,
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveSplitableHadron.hh,v 1.5 2009/08/03 13:14:19 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4DiffractiveSplitableHadron.hh,v 1.6 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#ifndef G4DiffractiveSplitableHadron_h
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FTFModel.hh,v 1.10 2009/10/25 10:50:54 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4FTFModel.hh,v 1.11 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// Class Description
// Final state production code for hadron inelastic scattering above 20 GeV
@@ -26,17 +26,20 @@
#ifndef G4FTFParameters_h
#define G4FTFParameters_h 1
//
// $Id: G4FTFParameters.hh,v 1.7 2009/10/25 10:50:54 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4FTFParameters.hh,v 1.9 2010/11/15 10:05:19 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#include "G4Proton.hh"
class G4FTFParameters
{
public:
G4FTFParameters(const G4ParticleDefinition * , G4double theA,
G4double theZ,
G4FTFParameters(const G4ParticleDefinition * , G4int theA,
G4int theZ,
G4double s);
// G4FTFParameters(const G4ParticleDefinition * , G4double theA,
// G4double theZ,
// G4double s);
~G4FTFParameters();
@@ -62,6 +65,7 @@ class G4FTFParameters
void SetMagQuarkExchange(const G4double aValue);
void SetSlopeQuarkExchange(const G4double aValue);
void SetDeltaProbAtQuarkExchange(const G4double aValue);
void SetProbOfSameQuarkExchange(const G4double aValue);
void SetProjMinDiffMass(const G4double aValue);
void SetProjMinNonDiffMass(const G4double aValue);
@@ -80,6 +84,9 @@ class G4FTFParameters
const G4double Pssbar );
// --------- Set parameters of nuclear destruction--------------------
void SetMaxNumberOfCollisions(const G4double aValue, const G4double bValue);
void SetProbOfInteraction(const G4double aValue);
void SetCofNuclearDestruction(const G4double aValue);
void SetR2ofNuclearDestruction(const G4double aValue);
@@ -108,6 +115,7 @@ class G4FTFParameters
G4double GetMagQuarkExchange();
G4double GetSlopeQuarkExchange();
G4double GetDeltaProbAtQuarkExchange();
G4double GetProbOfSameQuarkExchange();
G4double GetProjMinDiffMass();
G4double GetProjMinNonDiffMass();
@@ -124,6 +132,9 @@ class G4FTFParameters
std::vector<G4double> GetQuarkProbabilitiesAtGluonSplitUp();
// --------- Get parameters of nuclear destruction---------------------
G4double GetMaxNumberOfCollisions();
G4double GetProbOfInteraction();
G4double GetCofNuclearDestruction();
G4double GetR2ofNuclearDestruction();
@@ -154,6 +165,7 @@ class G4FTFParameters
G4double MagQuarkExchange;
G4double SlopeQuarkExchange;
G4double DeltaProbAtQuarkExchange;
G4double ProbOfSameQuarkExchange;
G4double ProjMinDiffMass;
G4double ProjMinNonDiffMass;
@@ -170,6 +182,9 @@ class G4FTFParameters
std::vector<G4double> QuarkProbabilitiesAtGluonSplitUp;
// --------- Parameters of nuclear destruction------------------------
G4double MaxNumberOfCollisions;
G4double ProbOfInelInteraction;
G4double CofNuclearDestruction; // Cnd of nuclear destruction
G4double R2ofNuclearDestruction; // R2nd
@@ -226,6 +241,8 @@ inline void G4FTFParameters::SetSlopeQuarkExchange(const G4double aValue)
{SlopeQuarkExchange = aValue;}
inline void G4FTFParameters::SetDeltaProbAtQuarkExchange(const G4double aValue)
{DeltaProbAtQuarkExchange = aValue;}
inline void G4FTFParameters::SetProbOfSameQuarkExchange(const G4double aValue)
{ProbOfSameQuarkExchange = aValue;}
inline void G4FTFParameters::SetProjMinDiffMass(const G4double aValue)
{ProjMinDiffMass = aValue*GeV;}
@@ -259,6 +276,24 @@ inline void G4FTFParameters::SetQuarkProbabilitiesAtGluonSplitUp(
}
// --------- Set parameters of nuclear destruction--------------------
inline void G4FTFParameters::SetMaxNumberOfCollisions(const G4double Plab,
const G4double Pbound)
{
if(Plab > Pbound)
{
MaxNumberOfCollisions = Plab/Pbound;
SetProbOfInteraction(-1.);
} else
{
// MaxNumberOfCollisions = -1.;
// SetProbOfInteraction(std::exp(0.25*(Plab-Pbound)));
MaxNumberOfCollisions = 1;
SetProbOfInteraction(-1.);
}
}
inline void G4FTFParameters::SetProbOfInteraction(const G4double aValue)
{ProbOfInelInteraction = aValue;}
inline void G4FTFParameters::SetCofNuclearDestruction(const G4double aValue)
{CofNuclearDestruction = aValue;}
inline void G4FTFParameters::SetR2ofNuclearDestruction(const G4double aValue)
@@ -303,9 +338,9 @@ inline G4double G4FTFParameters::GetAvaragePt2ofElasticScattering()
// --------- Get parameters of excitations ---------------------------
inline G4double G4FTFParameters::GetMagQuarkExchange() {return MagQuarkExchange;}
inline G4double G4FTFParameters::GetSlopeQuarkExchange() {return SlopeQuarkExchange;}
inline G4double G4FTFParameters::GetDeltaProbAtQuarkExchange()
{return DeltaProbAtQuarkExchange;}
inline G4double G4FTFParameters::GetDeltaProbAtQuarkExchange(){return
DeltaProbAtQuarkExchange;}
inline G4double G4FTFParameters::GetProbOfSameQuarkExchange(){return ProbOfSameQuarkExchange;}
inline G4double G4FTFParameters::GetProjMinDiffMass() {return ProjMinDiffMass;}
inline G4double G4FTFParameters::GetProjMinNonDiffMass() {return ProjMinNonDiffMass;}
@@ -324,6 +359,9 @@ inline std::vector<G4double>
{return QuarkProbabilitiesAtGluonSplitUp;}
// --------- Get parameters of nuclear destruction---------------------
inline G4double G4FTFParameters::GetMaxNumberOfCollisions(){return MaxNumberOfCollisions;}
inline G4double G4FTFParameters::GetProbOfInteraction() {return ProbOfInelInteraction;}
inline G4double G4FTFParameters::GetCofNuclearDestruction(){return CofNuclearDestruction;}
inline G4double G4FTFParameters::GetR2ofNuclearDestruction(){return R2ofNuclearDestruction;}
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FTFParticipants.hh,v 1.6 2009/08/03 13:14:19 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4FTFParticipants.hh,v 1.7 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#ifndef G4FTFParticipants_h
@@ -0,0 +1,99 @@
#------------------------------------------------------------------------------
# sources.cmake
# Module : G4had_string_diff
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_diff
#
# Sources description for a library.
# Lists the sources and headers of the code explicitely.
# Lists include paths needed.
# Lists the internal granular and global dependencies of the library.
# Source specific properties should be added at the end.
#
# Generated on : 24/9/2010
#
# $Id: sources.cmake,v 1.1 2010/09/29 19:04:44 bmorgan Exp $
#
#------------------------------------------------------------------------------
# List external includes needed.
include_directories(${CLHEP_INCLUDE_DIRS})
# List internal includes needed.
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/volumes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPGeometry/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPNumerics/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPRandom/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/materials/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/bosons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/barions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/ions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/mesons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/leptons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/shortlived/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/parton_string/diffraction/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/parton_string/hadronization/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/parton_string/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/track/include)
#
# Define the Geant4 Module.
#
include(Geant4MacroDefineModule)
GEANT4_DEFINE_MODULE(NAME G4had_string_diff
HEADERS
G4DiffractiveExcitation.hh
G4DiffractiveHHScatterer.hh
G4DiffractiveSplitableHadron.hh
G4ElasticHNScattering.hh
G4FTFModel.hh
G4FTFParameters.hh
G4FTFParticipants.hh
SOURCES
G4DiffractiveExcitation.cc
G4DiffractiveHHScatterer.cc
G4DiffractiveSplitableHadron.cc
G4ElasticHNScattering.cc
G4FTFModel.cc
G4FTFParameters.cc
G4FTFParticipants.cc
GRANULAR_DEPENDENCIES
G4baryons
G4bosons
G4geometrymng
G4globman
G4had_mod_man
G4had_mod_util
G4had_string_diff
G4had_string_frag
G4had_string_man
G4hadronic_mgt
G4hadronic_util
G4hepnumerics
G4ions
G4leptons
G4materials
G4mesons
G4partman
G4procman
G4shortlived
G4track
G4volumes
GLOBAL_DEPENDENCIES
G4geometry
G4global
G4materials
G4particles
G4track
LINK_LIBRARIES
)
# List any source specific properties here
@@ -24,7 +24,7 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveExcitation.cc,v 1.21 2009/12/15 19:14:31 vuzhinsk Exp $
// $Id: G4DiffractiveExcitation.cc,v 1.23 2010/11/15 10:02:38 vuzhinsk Exp $
// ------------------------------------------------------------
// GEANT 4 class implemetation file
//
@@ -107,12 +107,13 @@ G4bool G4DiffractiveExcitation::
// -------------------- Target parameters -------------------------
G4int TargetPDGcode=target->GetDefinition()->GetPDGEncoding();
G4int absTargetPDGcode=std::abs(TargetPDGcode);
//G4cout<<"Excit "<<ProjectilePDGcode<<" "<<TargetPDGcode<<G4endl;
G4LorentzVector Ptarget=target->Get4Momentum();
G4double M0target = Ptarget.mag();
G4double TargetRapidity = Ptarget.rapidity();
// G4double TargetRapidity = Ptarget.rapidity();
if(M0target < target->GetDefinition()->GetPDGMass())
{
@@ -128,8 +129,8 @@ G4bool G4DiffractiveExcitation::
G4double AveragePt2=theParameters->GetAveragePt2();
G4double ProbOfDiffraction=ProbProjectileDiffraction +
ProbTargetDiffraction;
// G4double ProbOfDiffraction=ProbProjectileDiffraction +
// ProbTargetDiffraction;
G4double SumMasses=M0projectile+M0target+200.*MeV;
@@ -161,7 +162,7 @@ G4bool G4DiffractiveExcitation::
G4double PZcms2, PZcms;
G4double SqrtS=std::sqrt(S);
//G4cout<<"SqrtS < 2300*MeV "<<SqrtS<<G4endl;
if(absProjectilePDGcode > 1000 && (SqrtS < 2300*MeV || SqrtS < SumMasses))
{target->SetStatus(2); return false;} // The model cannot work for
// p+p-interactions
@@ -214,7 +215,13 @@ G4bool G4DiffractiveExcitation::
}
G4double maxPtSquare; // = PZcms2;
/*
G4cout<<"Start --------------------"<<G4endl;
G4cout<<"Proj "<<M0projectile<<" "<<ProjectileDiffStateMinMass<<" "<<ProjectileNonDiffStateMinMass<<G4endl;
G4cout<<"Targ "<<M0target <<" "<<TargetDiffStateMinMass <<" "<<TargetNonDiffStateMinMass<<G4endl;
G4cout<<"SqrtS "<<SqrtS<<G4endl;
G4cout<<"Rapid "<<ProjectileRapidity<<G4endl; //" "<<TargetRapidity<<G4endl;
*/
// Charge exchange can be possible for baryons -----------------
// Getting the values needed for exchange ----------------------
@@ -227,10 +234,19 @@ G4bool G4DiffractiveExcitation::
G4double DeltaMass=
(G4ParticleTable::GetParticleTable()->FindParticle(2224))->GetPDGMass();
// Check for possible quark excjane -----------------------------------
//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity - TargetRapidity))<<G4endl;
//G4cout<<"Q exc Mag Slop Wdelta"<<MagQuarkExchange<<" "<<SlopeQuarkExchange<<" "<<DeltaProbAtQuarkExchange<<G4endl;
//G4cout<<"ProjectileRapidity "<<ProjectileRapidity<<G4endl;
//G4cout<<MagQuarkExchange*std::exp(-SlopeQuarkExchange*(ProjectileRapidity))<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
// Check for possible quark exchange -----------------------------------
if(G4UniformRand() < MagQuarkExchange*
std::exp(-SlopeQuarkExchange*(ProjectileRapidity - TargetRapidity)))
std::exp(-SlopeQuarkExchange*ProjectileRapidity)) //TargetRapidity))) 1.45
{
// std::exp(-SlopeQuarkExchange*(ProjectileRapidity - 1.36))) //TargetRapidity))) 1.45
//G4cout<<"Q exchange"<<G4endl;
G4int NewProjCode(0), NewTargCode(0);
G4int ProjQ1(0), ProjQ2(0), ProjQ3(0);
@@ -248,12 +264,15 @@ G4bool G4DiffractiveExcitation::
G4int TargQ1(0), TargQ2(0), TargQ3(0);
UnpackBaryon(TargetPDGcode, TargQ1, TargQ2, TargQ3);
//G4cout<<ProjQ1<<" "<<ProjQ2<<" "<<ProjQ3<<G4endl;
//G4cout<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<G4endl;
// Sampling of exchanged quarks -------------------
G4int ProjExchangeQ(0);
G4int TargExchangeQ(0);
if(absProjectilePDGcode < 1000 )
{ // projectile is meson -----------------
if(ProjQ1 > 0 ) // ProjQ1 is quark
{
ProjExchangeQ = ProjQ1;
@@ -282,36 +301,79 @@ G4bool G4DiffractiveExcitation::
{
TargExchangeQ = TargQ3; TargQ3=ProjExchangeQ; ProjQ2=TargExchangeQ;
}
} // End of if(ProjQ1 > 0 ) // ProjQ1 is quark
G4int aProjQ1=std::abs(ProjQ1);
G4int aProjQ2=std::abs(ProjQ2);
if(aProjQ1 == aProjQ2) {NewProjCode = 111;} // Pi0-meson
if(aProjQ1 == aProjQ2) {NewProjCode = 111;} // Pi0-meson
else // |ProjQ1| # |ProjQ2|
{
if(aProjQ1 > aProjQ2) {NewProjCode = aProjQ1*100+aProjQ2*10+1;}
else {NewProjCode = aProjQ2*100+aProjQ1*10+1;}
NewProjCode *=(ProjectilePDGcode/absProjectilePDGcode);
}
G4bool ProjExcited=false;
if(G4UniformRand() < 0.5)
{
NewProjCode +=2; // Excited Pi0-meson
ProjExcited=true;
}
//G4cout<<G4endl<<"NewProjCode "<<NewProjCode<<G4endl;
G4ParticleDefinition* TestParticle=0;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
if(TestParticle)
{
M0projectile=
(G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass();
M0projectile2 = M0projectile * M0projectile;
ProjectileDiffStateMinMass =M0projectile+210.*MeV; //210 MeV=m_pi+70 MeV
ProjectileNonDiffStateMinMass=M0projectile+210.*MeV; //210 MeV=m_pi+70 MeV
} else
{return false;}
//G4cout<<"New TrQ "<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<G4endl;
NewTargCode = NewNucleonId(TargQ1, TargQ2, TargQ3);
//G4cout<<"NewTargCode "<<NewTargCode<<G4endl;
if( (TargQ1 == TargQ2) && (TargQ1 == TargQ3) &&
(SqrtS > M0projectile+DeltaMass)) {NewTargCode +=2;} //Create Delta isobar
else if( target->GetDefinition()->GetPDGiIsospin() == 3 ) //Delta was the target
{ if(G4UniformRand() > DeltaProbAtQuarkExchange){NewTargCode +=2;} //Save Delta isobar
(SqrtS > M0projectile+DeltaMass)) {NewTargCode +=2; //Create Delta isobar
ProjExcited=true;}
else if( target->GetDefinition()->GetPDGiIsospin() == 3 ) //Delta was the target
{ if(G4UniformRand() > DeltaProbAtQuarkExchange){NewTargCode +=2; //Save Delta isobar
ProjExcited=true;}
else {} // De-excite initial Delta isobar
}
else if((G4UniformRand() < DeltaProbAtQuarkExchange) && //Nucleon was the target
// else if((!CreateDelta) &&
else if((!ProjExcited) &&
(G4UniformRand() < DeltaProbAtQuarkExchange) && //Nucleon was the target
(SqrtS > M0projectile+DeltaMass)) {NewTargCode +=2;} //Create Delta isobar
// else if( CreateDelta) {NewTargCode +=2;}
else {} //Save initial nucleon
// target->SetDefinition( // Fix 15.12.09
// G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode));// Fix 15.12.09
//G4cout<<"NewTargCode "<<NewTargCode<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
if(TestParticle)
{
M0target=
(G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass();
M0target2 = M0target * M0target;
TargetDiffStateMinMass =M0target+220.*MeV; //220 MeV=m_pi+80 MeV;
TargetNonDiffStateMinMass=M0target+220.*MeV; //220 MeV=m_pi+80 MeV;
} else
{return false;}
} else
{ // projectile is baryon ----------------
G4double Same=0.; //0.3; //0.5;
//=========================================================================
G4double Same=theParameters->GetProbOfSameQuarkExchange(); //0.3; //0.5; 0.
G4bool ProjDeltaHasCreated(false);
G4bool TargDeltaHasCreated(false);
@@ -325,6 +387,7 @@ G4bool G4DiffractiveExcitation::
else
{ProjExchangeQ = ProjQ3;}
//G4cout<<"ProjExchangeQ "<<ProjExchangeQ<<G4endl;
if((ProjExchangeQ != TargQ1)||(G4UniformRand()<Same))
{
TargExchangeQ = TargQ1; TargQ1=ProjExchangeQ; ProjExchangeQ=TargExchangeQ;
@@ -337,6 +400,8 @@ G4bool G4DiffractiveExcitation::
TargExchangeQ = TargQ3; TargQ3=ProjExchangeQ; ProjExchangeQ=TargExchangeQ;
}
//G4cout<<"ProjExchangeQ "<<ProjExchangeQ<<G4endl;
//G4cout<<"TargExchangeQ "<<TargExchangeQ<<G4endl;
if( Ksi < 0.333333 )
{ProjQ1=ProjExchangeQ;}
else if( (0.333333 <= Ksi) && (Ksi < 0.666667))
@@ -376,6 +441,15 @@ G4bool G4DiffractiveExcitation::
NewProjCode = NewNucleonId(ProjQ1, ProjQ2, ProjQ3); // *****************************
//G4cout<<"ProjQ1, ProjQ2, ProjQ3 "<<ProjQ1<<" "<<ProjQ2<<" "<<ProjQ3<<" "<<NewProjCode<<G4endl;
G4int TestParticleID=NewProjCode;
G4ParticleDefinition* TestParticle=0;
G4double TestParticleMass=DBL_MAX;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
if((ProjQ1==ProjQ2) && (ProjQ1==ProjQ3)) {NewProjCode +=2; ProjDeltaHasCreated=true;}
else if(projectile->GetDefinition()->GetPDGiIsospin() == 3)// Projectile was Delta
{ if(G4UniformRand() > DeltaProbAtQuarkExchange)
@@ -389,8 +463,23 @@ G4bool G4DiffractiveExcitation::
else {NewProjCode +=0; ProjDeltaHasCreated=false;}
}
G4ParticleDefinition* NewTestParticle=
G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode);
//G4cout<<"TestParticleMass NewTestParticle->GetPDGMass() "<<TestParticleMass<<" "<< NewTestParticle->GetPDGMass()<<G4endl;
//if(TestParticleMass < NewTestParticle->GetPDGMass()) {NewProjCode=TestParticleID;}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
NewTargCode = NewNucleonId(TargQ1, TargQ2, TargQ3); // *****************************
//G4cout<<"TargQ1, TargQ2, TargQ3 "<<TargQ1<<" "<<TargQ2<<" "<<TargQ3<<" "<<NewTargCode<<G4endl;
TestParticleID=NewTargCode;
TestParticleMass=DBL_MAX;
TestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
if(TestParticle) TestParticleMass=TestParticle->GetPDGMass();
if((TargQ1==TargQ2) && (TargQ1==TargQ3)) {NewTargCode +=2; TargDeltaHasCreated=true;}
else if(target->GetDefinition()->GetPDGiIsospin() == 3) // Target was Delta
{ if(G4UniformRand() > DeltaProbAtQuarkExchange)
@@ -404,37 +493,53 @@ G4bool G4DiffractiveExcitation::
else {NewTargCode +=0; TargDeltaHasCreated=false;}
}
NewTestParticle=G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode);
//G4cout<<"TestParticleMass NewTestParticle->GetPDGMass() "<<TestParticleMass<<" "<< NewTestParticle->GetPDGMass()<<G4endl;
//if(TestParticleMass < NewTestParticle->GetPDGMass()) {NewTargCode=TestParticleID;}
//G4cout<<"NewProjCode NewTargCode "<<NewProjCode<<" "<<NewTargCode<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
if((absProjectilePDGcode == NewProjCode) && (absTargetPDGcode == NewTargCode))
{ // Nothing was changed! It is not right!?
}
// Forming baryons --------------------------------------------------
if(ProjDeltaHasCreated) {ProbProjectileDiffraction=1.; ProbTargetDiffraction=0.;}
if(TargDeltaHasCreated) {ProbProjectileDiffraction=0.; ProbTargetDiffraction=1.;}
if(ProjDeltaHasCreated)
{
M0projectile=
(G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass();
M0projectile2 = M0projectile * M0projectile;
ProjectileDiffStateMinMass =M0projectile+210.*MeV; //210 MeV=m_pi+70 MeV
ProjectileNonDiffStateMinMass=M0projectile+210.*MeV; //210 MeV=m_pi+70 MeV
}
// if(M0target <
// (G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass())
if(TargDeltaHasCreated)
{
M0target=
(G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass();
M0target2 = M0target * M0target;
TargetDiffStateMinMass =M0target+210.*MeV; //210 MeV=m_pi+70 MeV;
TargetNonDiffStateMinMass=M0target+210.*MeV; //210 MeV=m_pi+70 MeV;
}
} // End of if projectile is baryon ---------------------------
//G4cout<<"At end// NewProjCode "<<NewProjCode<<G4endl;
//G4cout<<"At end// NewTargCode "<<NewTargCode<<G4endl;
// If we assume that final state hadrons after the charge exchange will be
// in the ground states, we have to put ----------------------------------
if(M0projectile <
(G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass())
{
M0projectile=
(G4ParticleTable::GetParticleTable()->FindParticle(NewProjCode))->GetPDGMass();
M0projectile2 = M0projectile * M0projectile;
}
if(M0target <
(G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass())
{
M0target=
(G4ParticleTable::GetParticleTable()->FindParticle(NewTargCode))->GetPDGMass();
M0target2 = M0target * M0target;
}
//G4cout<<"M0pr M0tr SqS "<<M0projectile<<" "<<M0target<<" "<<SqrtS<<G4endl;
PZcms2=(S*S+M0projectile2*M0projectile2+M0target2*M0target2-
2*S*M0projectile2 - 2*S*M0target2 - 2*M0projectile2*M0target2)
/4./S;
//G4cout<<"PZcms2 1 "<<PZcms2<<G4endl<<G4endl;
if(PZcms2 < 0) {return false;} // It can be if energy is not sufficient for Delta
//----------------------------------------------------------
projectile->SetDefinition(
@@ -451,23 +556,74 @@ G4bool G4DiffractiveExcitation::
Ptarget.setPz( -PZcms);
Ptarget.setE(std::sqrt(M0target2+PZcms2));
{
Pprojectile.transform(toLab);
Ptarget.transform(toLab);
// ----------------------------------------------------------
projectile->SetTimeOfCreation(target->GetTimeOfCreation());
projectile->SetPosition(target->GetPosition());
if(absProjectilePDGcode < 1000)
{ // For projectile meson
G4double Wexcit=1.-2.256*std::exp(-0.6*ProjectileRapidity);
Wexcit=0.;
if(G4UniformRand() > Wexcit)
{ // Make elastic scattering
//G4cout<<"Make elastic scattering of new hadrons"<<G4endl;
Pprojectile.transform(toLab);
Ptarget.transform(toLab);
projectile->Set4Momentum(Pprojectile);
target->Set4Momentum(Ptarget);
projectile->SetTimeOfCreation(target->GetTimeOfCreation());
projectile->SetPosition(target->GetPosition());
G4bool Result= theElastic->ElasticScattering (projectile,target,theParameters);
projectile->Set4Momentum(Pprojectile);
target->Set4Momentum(Ptarget);
return Result;
}
G4bool Result= theElastic->ElasticScattering (projectile,target,theParameters);
return Result;
} // end of if(Make elastic scattering for projectile meson?)
} else
{ // For projectile baryon
G4double Wexcit=1.-2.256*std::exp(-0.6*ProjectileRapidity);
//Wexcit=0.;
if(G4UniformRand() > Wexcit)
{ // Make elastic scattering
//G4cout<<"Make elastic scattering of new hadrons"<<G4endl;
Pprojectile.transform(toLab);
Ptarget.transform(toLab);
projectile->SetTimeOfCreation(target->GetTimeOfCreation());
projectile->SetPosition(target->GetPosition());
projectile->Set4Momentum(Pprojectile);
target->Set4Momentum(Ptarget);
G4bool Result= theElastic->ElasticScattering (projectile,target,theParameters);
return Result;
} // end of if(Make elastic scattering for projectile baryon?)
}
//G4cout<<"Make excitation of new hadrons"<<G4endl;
} // End of charge exchange part ------------------------------
// ------------------------------------------------------------------
G4double ProbOfDiffraction=ProbProjectileDiffraction + ProbTargetDiffraction;
/*
G4cout<<"Excite --------------------"<<G4endl;
G4cout<<"Proj "<<M0projectile<<" "<<ProjectileDiffStateMinMass<<" "<<ProjectileNonDiffStateMinMass<<G4endl;
G4cout<<"Targ "<<M0target <<" "<<TargetDiffStateMinMass <<" "<<TargetNonDiffStateMinMass<<G4endl;
G4cout<<"SqrtS "<<SqrtS<<G4endl;
G4cout<<"Prob ProjDiff TargDiff "<<ProbProjectileDiffraction<<" "<<ProbTargetDiffraction<<" "<<ProbOfDiffraction<<G4endl;
G4cout<<"Pr Y "<<Pprojectile.rapidity()<<" Tr Y "<<Ptarget.rapidity()<<G4endl;
G4int Uzhi; G4cin>>Uzhi;
*/
/*
if(ProjectileNonDiffStateMinMass + TargetNonDiffStateMinMass > SqrtS) // 24.07.10
{
if(ProbOfDiffraction!=0.)
{
ProbProjectileDiffraction/=ProbOfDiffraction;
ProbOfDiffraction=1.;
} else {return false;}
}
*/
if(ProbOfDiffraction!=0.)
{
ProbProjectileDiffraction/=ProbOfDiffraction;
@@ -477,6 +633,8 @@ G4bool G4DiffractiveExcitation::
ProbProjectileDiffraction=0.;
}
//G4cout<<"Prob ProjDiff TargDiff "<<ProbProjectileDiffraction<<" "<<ProbTargetDiffraction<<" "<<ProbOfDiffraction<<G4endl;
G4double ProjectileDiffStateMinMass2 = ProjectileDiffStateMinMass *
ProjectileDiffStateMinMass;
G4double ProjectileNonDiffStateMinMass2 = ProjectileNonDiffStateMinMass *
@@ -499,34 +657,41 @@ G4bool G4DiffractiveExcitation::
G4double Qminus, Qplus;
G4int whilecount=0;
// Choose a process ---------------------------
if(G4UniformRand() < ProbOfDiffraction)
{
if(G4UniformRand() < ProbProjectileDiffraction)
{ //-------- projectile diffraction ---------------
//G4cout<<"projectile diffraction"<<G4endl;
do {
// Generate pt
// if (whilecount++ >= 500 && (whilecount%100)==0)
// G4cout << "G4DiffractiveExcitation::ExciteParticipants possibly looping"
// << ", loop count/ maxPtSquare : "
// << whilecount << " / " << maxPtSquare << G4endl;
// whilecount++;
if (whilecount > 1000 )
{
Qmomentum=G4LorentzVector(0.,0.,0.,0.);
target->SetStatus(2); return false; // Ignore this interaction
};
// --------------- Check that the interaction is possible -----------
ProjMassT2=ProjectileDiffStateMinMass2;
ProjMassT =ProjectileDiffStateMinMass;
TargMassT2=M0target2;
TargMassT =M0target;
//G4cout<<"Masses "<<ProjMassT<<" "<<TargMassT<<" "<<SqrtS<<" "<<ProjMassT+TargMassT<<G4endl;
PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
/4./S;
//G4cout<<"PZcms2 PrD"<<PZcms2<<G4endl;
if(PZcms2 < 0 )
{
target->SetStatus(2);
@@ -555,6 +720,7 @@ G4bool G4DiffractiveExcitation::
PMinusNew=ChooseP(PMinusMin, PMinusMax);
// PMinusNew=1./sqrt(1./PMinusMin-G4UniformRand()*(1./PMinusMin-1./PMinusMax));
//PMinusNew=1./sqr(1./std::sqrt(PMinusMin)-G4UniformRand()*(1./std::sqrt(PMinusMin)-1./std::sqrt(PMinusMax)));
TMinusNew=SqrtS-PMinusNew;
Qminus=Ptarget.minus()-TMinusNew;
@@ -563,23 +729,29 @@ G4bool G4DiffractiveExcitation::
Qmomentum.setPz( (Qplus-Qminus)/2 );
Qmomentum.setE( (Qplus+Qminus)/2 );
} while (
((Pprojectile+Qmomentum).mag2() < ProjectileDiffStateMinMass2) || //No without excitation
((Ptarget -Qmomentum).mag2() < M0target2 ));
} while ((Pprojectile+Qmomentum).mag2() < ProjectileDiffStateMinMass2); //||
//Repeat the sampling because there was not any excitation
//((Ptarget -Qmomentum).mag2() < M0target2 )) );
}
else
{ // -------------- Target diffraction ----------------
//G4cout<<"Target diffraction"<<G4endl;
do {
// Generate pt
// if (whilecount++ >= 500 && (whilecount%100)==0)
// G4cout << "G4DiffractiveExcitation::ExciteParticipants possibly looping"
// << ", loop count/ maxPtSquare : "
// << whilecount << " / " << maxPtSquare << G4endl;
// whilecount++;
if (whilecount > 1000 )
{
Qmomentum=G4LorentzVector(0.,0.,0.,0.);
target->SetStatus(2); return false; // Ignore this interaction
};
//G4cout<<"Qm while "<<Qmomentum<<" "<<whilecount<<G4endl;
// --------------- Check that the interaction is possible -----------
ProjMassT2=M0projectile2;
ProjMassT =M0projectile;
@@ -591,6 +763,7 @@ G4bool G4DiffractiveExcitation::
2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
/4./S;
//G4cout<<"PZcms2 TrD <0 "<<PZcms2<<" return"<<G4endl;
if(PZcms2 < 0 )
{
target->SetStatus(2);
@@ -599,6 +772,8 @@ G4bool G4DiffractiveExcitation::
maxPtSquare=PZcms2;
Qmomentum=G4LorentzVector(GaussianPt(AveragePt2,maxPtSquare),0);
//G4cout<<"Qm while "<<Qmomentum<<" "<<whilecount<<G4endl;
Pt2=G4ThreeVector(Qmomentum.vect()).mag2();
ProjMassT2=M0projectile2+Pt2;
@@ -611,6 +786,7 @@ G4bool G4DiffractiveExcitation::
2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
/4./S;
//G4cout<<"PZcms2 <0 "<<PZcms2<<" continue"<<G4endl;
if(PZcms2 < 0 ) continue;
PZcms =std::sqrt(PZcms2);
@@ -618,6 +794,7 @@ G4bool G4DiffractiveExcitation::
TPlusMax=SqrtS-ProjMassT;
TPlusNew=ChooseP(TPlusMin, TPlusMax);
//TPlusNew=1./sqr(1./std::sqrt(TPlusMin)-G4UniformRand()*(1./std::sqrt(TPlusMin)-1./std::sqrt(TPlusMax)));
//TPlusNew=TPlusMax;
@@ -629,19 +806,35 @@ G4bool G4DiffractiveExcitation::
Qmomentum.setPz( (Qplus-Qminus)/2 );
Qmomentum.setE( (Qplus+Qminus)/2 );
} while (
((Pprojectile+Qmomentum).mag2() < M0projectile2 ) || //No without excitation
((Ptarget -Qmomentum).mag2() < TargetDiffStateMinMass2));
}
/*
G4cout<<(Pprojectile+Qmomentum).mag()<<" "<<M0projectile<<G4endl;
G4bool First=(Pprojectile+Qmomentum).mag2() < M0projectile2;
G4cout<<First<<G4endl;
G4cout<<(Ptarget -Qmomentum).mag()<<" "<<TargetDiffStateMinMass<<" "<<TargetDiffStateMinMass2<<G4endl;
G4bool Seco=(Ptarget -Qmomentum).mag2() < TargetDiffStateMinMass2;
G4cout<<Seco<<G4endl;
*/
} while ((Ptarget -Qmomentum).mag2() < TargetDiffStateMinMass2);
// Repeat the sampling because there was not any excitation
// (((Pprojectile+Qmomentum).mag2() < M0projectile2 ) || //No without excitation
// ((Ptarget -Qmomentum).mag2() < TargetDiffStateMinMass2)) );
//G4cout<<"Go out"<<G4endl;
} // End of if(G4UniformRand() < ProbProjectileDiffraction)
}
else //----------- Non-diffraction process ------------
{
//G4cout<<"Non-diffraction process"<<G4endl;
do {
// Generate pt
// if (whilecount++ >= 500 && (whilecount%100)==0)
// G4cout << "G4DiffractiveExcitation::ExciteParticipants possibly looping"
// << ", loop count/ maxPtSquare : "
// << whilecount << " / " << maxPtSquare << G4endl;
// whilecount++;
if (whilecount > 1000 )
{
Qmomentum=G4LorentzVector(0.,0.,0.,0.);
@@ -676,6 +869,7 @@ G4bool G4DiffractiveExcitation::
PZcms2=(S*S + ProjMassT2*ProjMassT2 + TargMassT2*TargMassT2-
2.*S*ProjMassT2-2.*S*TargMassT2-2.*ProjMassT2*TargMassT2)
/4./S;
//G4cout<<"PZcms2 ND"<<PZcms2<<G4endl;
if(PZcms2 < 0 ) continue;
PZcms =std::sqrt(PZcms2);
@@ -697,33 +891,41 @@ G4bool G4DiffractiveExcitation::
Qmomentum.setPz( (Qplus-Qminus)/2 );
Qmomentum.setE( (Qplus+Qminus)/2 );
/*
G4cout<<(Pprojectile+Qmomentum).mag2()<<" "<<ProjectileNonDiffStateMinMass2<<G4endl;
G4cout<<(Ptarget -Qmomentum).mag2()<<" "<<TargetNonDiffStateMinMass2<<G4endl;
G4int Uzhi; G4cin>>Uzhi;
*/
} while (
((Pprojectile+Qmomentum).mag2() < ProjectileNonDiffStateMinMass2) || //No double Diffraction
((Ptarget -Qmomentum).mag2() < TargetNonDiffStateMinMass2 ));
}
}
Pprojectile += Qmomentum;
Ptarget -= Qmomentum;
Pprojectile += Qmomentum;
Ptarget -= Qmomentum;
//G4cout<<"Pr Y "<<Pprojectile.rapidity()<<" Tr Y "<<Ptarget.rapidity()<<G4endl;
// Transform back and update SplitableHadron Participant.
Pprojectile.transform(toLab);
Ptarget.transform(toLab);
Pprojectile.transform(toLab);
Ptarget.transform(toLab);
// Calculation of the creation time ---------------------
projectile->SetTimeOfCreation(target->GetTimeOfCreation());
projectile->SetPosition(target->GetPosition());
projectile->SetTimeOfCreation(target->GetTimeOfCreation());
projectile->SetPosition(target->GetPosition());
// Creation time and position of target nucleon were determined at
// ReggeonCascade() of G4FTFModel
// ------------------------------------------------------
projectile->Set4Momentum(Pprojectile);
target->Set4Momentum(Ptarget);
//G4cout<<"Mproj "<<Pprojectile.mag()<<G4endl;
//G4cout<<"Mtarg "<<Ptarget.mag()<<G4endl;
projectile->Set4Momentum(Pprojectile);
target->Set4Momentum(Ptarget);
projectile->IncrementCollisionCount(1);
target->IncrementCollisionCount(1);
projectile->IncrementCollisionCount(1);
target->IncrementCollisionCount(1);
return true;
return true;
}
// ---------------------------------------------------------------------
@@ -37,6 +37,9 @@ G4DiffractiveHHScatterer::G4DiffractiveHHScatterer()
theStringFragmentation(new G4LundStringFragmentation())
{}
G4DiffractiveHHScatterer::~G4DiffractiveHHScatterer()
{}
void G4DiffractiveHHScatterer::CreateStrings()
/*
G4VSplitableHadron * aHadron,
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4DiffractiveSplitableHadron.cc,v 1.8 2009/07/31 11:03:00 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4DiffractiveSplitableHadron.cc,v 1.9 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// ------------------------------------------------------------
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FTFModel.cc,v 1.34 2009/12/15 19:14:31 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4FTFModel.cc,v 1.37 2010/11/15 10:02:38 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// ------------------------------------------------------------
@@ -98,7 +98,13 @@ int G4FTFModel::operator!=(const G4FTFModel &right) const
void G4FTFModel::Init(const G4Nucleus & aNucleus, const G4DynamicParticle & aProjectile)
{
theProjectile = aProjectile;
theParticipants.Init(aNucleus.GetN(),aNucleus.GetZ());
//G4cout<<"FTF init Pro "<<theProjectile.GetMass()<<" "<<theProjectile.GetMomentum()<<G4endl;
//G4cout<<"FTF init A Z "<<aNucleus.GetA_asInt()<<" "<<aNucleus.GetZ_asInt()<<G4endl;
//G4cout<<" "<<aNucleus.GetN()<<" "<<aNucleus.GetZ()<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
theParticipants.Init(aNucleus.GetA_asInt(),aNucleus.GetZ_asInt());
//G4cout<<"End nucl init"<<G4endl;
// ----------- N-mass number Z-charge -------------------------
// --- cms energy
@@ -108,10 +114,15 @@ void G4FTFModel::Init(const G4Nucleus & aNucleus, const G4DynamicParticle & aPro
if( theParameters != 0 ) delete theParameters;
theParameters = new G4FTFParameters(theProjectile.GetDefinition(),
aNucleus.GetN(),aNucleus.GetZ(),
aNucleus.GetA_asInt(),aNucleus.GetZ_asInt(),
s);
// theParameters = new G4FTFParameters(theProjectile.GetDefinition(),
// aNucleus.GetN(),aNucleus.GetZ(),
// s);
//theParameters->SetProbabilityOfElasticScatt(0.);
//G4cout<<theParameters->GetProbabilityOfElasticScatt()<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
// To turn on/off (1/0) elastic scattering
}
@@ -124,18 +135,20 @@ struct DeleteVSplitableHadron { void operator()(G4VSplitableHadron * aH){ delete
G4ExcitedStringVector * G4FTFModel::GetStrings()
{
G4ExcitedStringVector * theStrings(0);
//G4cout<<"GetString"<<G4endl;
theParticipants.GetList(theProjectile,theParameters);
//G4cout<<"Reggeon"<<G4endl;
ReggeonCascade();
G4bool Success(true);
if( PutOnMassShell() )
{
//G4cout<<"PutOn mass Shell OK"<<G4endl;
if( ExciteParticipants() )
{
//G4cout<<"Excite partic OK"<<G4endl;
theStrings = BuildStrings();
//G4cout<<"Build String OK"<<G4endl;
GetResidualNucleus();
if( theParameters != 0 )
@@ -193,7 +206,7 @@ void G4FTFModel::ReggeonCascade()
TheInvolvedNucleon[NumberOfInvolvedNucleon]=TargetNucleon;
NumberOfInvolvedNucleon++;
//G4cout<<"Prim NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
G4double XofWoundedNucleon = TargetNucleon->GetPosition().x();
G4double YofWoundedNucleon = TargetNucleon->GetPosition().y();
@@ -213,6 +226,7 @@ void G4FTFModel::ReggeonCascade()
TheInvolvedNucleon[NumberOfInvolvedNucleon]=Neighbour;
NumberOfInvolvedNucleon++;
//G4cout<<"Seco NumberOfInvolvedNucleon "<<NumberOfInvolvedNucleon<<G4endl;
G4VSplitableHadron *targetSplitable;
targetSplitable = new G4DiffractiveSplitableHadron(*Neighbour);
@@ -273,6 +287,7 @@ G4bool G4FTFModel::PutOnMassShell()
G4VSplitableHadron * primary = theParticipants.GetInteraction().GetProjectile();
G4LorentzVector Pprojectile=primary->Get4Momentum();
//G4cout<<"Pprojectile "<<Pprojectile<<G4endl;
// To get original projectile particle
if(Pprojectile.z() < 0.){return false;}
@@ -283,12 +298,13 @@ G4bool G4FTFModel::PutOnMassShell()
G4LorentzVector Psum = Pprojectile;
G4double SumMasses = Mprojectile + 20.*MeV; // 13.12.09
// Separation energy for projectile
//G4cout<<"SumMasses Pr "<<SumMasses<<G4endl;
//--------------- Target nucleus ------------------------------
G4V3DNucleus *theNucleus = GetWoundedNucleus();
G4Nucleon * aNucleon;
G4int ResidualMassNumber=theNucleus->GetMassNumber();
G4int ResidualCharge =theNucleus->GetCharge();
ResidualExcitationEnergy=0.;
G4LorentzVector PnuclearResidual(0.,0.,0.,0.);
@@ -304,6 +320,7 @@ G4bool G4FTFModel::PutOnMassShell()
Psum += aNucleon->Get4Momentum();
SumMasses += aNucleon->GetDefinition()->GetPDGMass();
SumMasses += 20.*MeV; // 13.12.09 Separation energy for a nucleon
//G4cout<<"SumMasses Tr "<<SumMasses<<G4endl;
ResidualMassNumber--;
ResidualCharge-=(G4int) aNucleon->GetDefinition()->GetPDGCharge();
ResidualExcitationEnergy+=ExcitationEnergyPerWoundedNucleon;
@@ -315,7 +332,7 @@ G4bool G4FTFModel::PutOnMassShell()
} // end of while (theNucleus->GetNextNucleon())
Psum += PnuclearResidual;
//G4cout<<"ResidualCharge ,ResidualMassNumber "<<ResidualCharge<<" "<<ResidualMassNumber<<G4endl;
G4double ResidualMass(0.);
if(ResidualMassNumber == 0)
{
@@ -330,13 +347,16 @@ G4bool G4FTFModel::PutOnMassShell()
}
// ResidualMass +=ResidualExcitationEnergy; // Will be given after checks
//G4cout<<"SumMasses And ResidualMass "<<SumMasses<<" "<<ResidualMass<<G4endl;
SumMasses += ResidualMass;
//G4cout<<"SumMasses + ResM "<<SumMasses<<G4endl;
//G4cout<<"Psum "<<Psum<<G4endl;
//-------------------------------------------------------------
G4double SqrtS=Psum.mag();
G4double S=Psum.mag2();
//G4cout<<"SqrtS < SumMasses "<<SqrtS<<" "<<SumMasses<<G4endl;
if(SqrtS < SumMasses) {return false;} // It is impossible to simulate
// after putting nuclear nucleons
// on mass-shell
@@ -345,7 +365,7 @@ G4bool G4FTFModel::PutOnMassShell()
ResidualMass +=ResidualExcitationEnergy;
SumMasses +=ResidualExcitationEnergy;
//G4cout<<"ResidualMass "<<ResidualMass<<" "<<SumMasses<<G4endl;
//-------------------------------------------------------------
// Sampling of nucleons what are transfered to delta-isobars --
G4int MaxNumberOfDeltas = (int)((SqrtS - SumMasses)/(400.*MeV));
@@ -372,6 +392,7 @@ G4bool G4FTFModel::PutOnMassShell()
} // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
} // end of if(theNucleus.GetMassNumber() != 1)
//-------------------------------------------------------------
G4LorentzRotation toCms(-1*Psum.boostVector());
G4LorentzVector Ptmp=toCms*Pprojectile;
if ( Ptmp.pz() <= 0. )
@@ -392,7 +413,7 @@ G4bool G4FTFModel::PutOnMassShell()
G4double AveragePt2 = theParameters->GetPt2ofNuclearDestruction();
G4double maxPtSquare = theParameters->GetMaxPt2ofNuclearDestruction();
//G4cout<<"Dcor "<<Dcor<<" AveragePt2 "<<AveragePt2<<G4endl;
G4double M2target(0.);
G4double WminusTarget(0.);
G4double WplusProjectile(0.);
@@ -408,6 +429,7 @@ G4bool G4FTFModel::PutOnMassShell()
{ // while (DecayMomentum < 0.)
NumberOfTries++;
//G4cout<<"NumberOfTries "<<NumberOfTries<<G4endl;
if(NumberOfTries == 100*(NumberOfTries/100)) // 100
{ // At large number of tries it would be better to reduce the values
ScaleFactor/=2.;
@@ -438,6 +460,7 @@ G4bool G4FTFModel::PutOnMassShell()
XminusSum+=Xminus;
G4LorentzVector tmp(tmpPt.x(),tmpPt.y(),Xminus,0.);
//G4cout<<"Inv i mom "<<i<<" "<<tmp<<G4endl;
aNucleon->SetMomentum(tmp);
} // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
@@ -446,6 +469,7 @@ G4bool G4FTFModel::PutOnMassShell()
G4double DeltaY(0.);
G4double DeltaXminus(0.);
//G4cout<<"ResidualMassNumber "<<ResidualMassNumber<<" "<<PtSum<<G4endl;
if(ResidualMassNumber == 0)
{
DeltaX = PtSum.x()/NumberOfInvolvedNucleon;
@@ -456,7 +480,7 @@ G4bool G4FTFModel::PutOnMassShell()
{
DeltaXminus = -1./theNucleus->GetMassNumber();
}
//G4cout<<"Dx y xmin "<<DeltaX<<" "<<DeltaY<<" "<<DeltaXminus<<G4endl;
XminusSum=1.;
M2target =0.;
@@ -466,10 +490,16 @@ G4bool G4FTFModel::PutOnMassShell()
Xminus = aNucleon->Get4Momentum().pz() - DeltaXminus;
XminusSum-=Xminus;
//G4cout<<" i X-sum "<<i<<" "<<Xminus<<" "<<XminusSum<<G4endl;
if(ResidualMassNumber == 0) // Uzhi 5.07.10
{
if((Xminus <= 0.) || (Xminus > 1.)) {InerSuccess=false; break;}
} else
{
if((Xminus <= 0.) || (Xminus > 1.) ||
(XminusSum <=0.) || (XminusSum > 1.)) {InerSuccess=false; break;}
} // Uzhi 5.07.10
if((Xminus <= 0.) || (Xminus > 1.) ||
(XminusSum <=0.) || (XminusSum > 1.)) {InerSuccess=false; break;}
G4double Px=aNucleon->Get4Momentum().px() - DeltaX;
G4double Py=aNucleon->Get4Momentum().py() - DeltaY;
@@ -481,10 +511,14 @@ G4bool G4FTFModel::PutOnMassShell()
aNucleon->SetMomentum(tmp);
} // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
//G4cout<<"Rescale O.K."<<G4endl;
if(InerSuccess && (ResidualMassNumber != 0))
{
M2target +=(ResidualMass*ResidualMass + PtSum.mag2())/XminusSum;
}
//G4cout<<"InerSuccess "<<InerSuccess<<G4endl;
//G4int Uzhi;G4cin>>Uzhi;
} while(!InerSuccess);
} while (SqrtS < Mprojectile + std::sqrt(M2target));
//-------------------------------------------------------------
@@ -494,6 +528,7 @@ G4bool G4FTFModel::PutOnMassShell()
WminusTarget=(S-M2projectile+M2target+std::sqrt(DecayMomentum2))/2./SqrtS;
WplusProjectile=SqrtS - M2target/WminusTarget;
//G4cout<<"DecayMomentum2 "<<DecayMomentum2<<G4endl;
//-------------------------------------------------------------
for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
{
@@ -510,6 +545,7 @@ G4bool G4FTFModel::PutOnMassShell()
if( E+Pz > WplusProjectile ){OuterSuccess=false; break;}
} // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
//G4int Uzhi;G4cin>>Uzhi;
} while(!OuterSuccess);
//-------------------------------------------------------------
@@ -519,6 +555,7 @@ G4bool G4FTFModel::PutOnMassShell()
Pprojectile.transform(toLab); // The work with the projectile
primary->Set4Momentum(Pprojectile); // is finished at the moment.
//G4cout<<"Final proj mom "<<primary->Get4Momentum()<<G4endl;
//-------------------------------------------------------------
G4ThreeVector Residual3Momentum(0.,0.,1.);
@@ -549,19 +586,26 @@ G4bool G4FTFModel::PutOnMassShell()
} // end of for(G4int i=0; i < NumberOfInvolvedNucleon; i++ )
//G4cout<<"ResidualMassNumber and Mom "<<ResidualMassNumber<<" "<<Residual3Momentum<<G4endl;
G4double Mt2Residual=sqr(ResidualMass) +
sqr(Residual3Momentum.x())+sqr(Residual3Momentum.y());
G4double PzResidual=-WminusTarget*Residual3Momentum.z()/2. +
//==========================
//G4cout<<"WminusTarget Residual3Momentum.z() "<<WminusTarget<<" "<<Residual3Momentum.z()<<G4endl;
G4double PzResidual=0.;
G4double EResidual =0.;
if(ResidualMassNumber != 0)
{
PzResidual=-WminusTarget*Residual3Momentum.z()/2. +
Mt2Residual/(2.*WminusTarget*Residual3Momentum.z());
G4double EResidual = WminusTarget*Residual3Momentum.z()/2. +
EResidual = WminusTarget*Residual3Momentum.z()/2. +
Mt2Residual/(2.*WminusTarget*Residual3Momentum.z());
}
//==========================
Residual4Momentum.setPx(Residual3Momentum.x());
Residual4Momentum.setPy(Residual3Momentum.y());
Residual4Momentum.setPz(PzResidual);
Residual4Momentum.setE(EResidual);
//G4cout<<"Residual4Momentum "<<Residual4Momentum<<G4endl;
Residual4Momentum.transform(toLab);
//-------------------------------------------------------------
return true;
@@ -574,15 +618,38 @@ G4bool G4FTFModel::ExciteParticipants()
// do { // } while (Successfull == false) // Closed 15.12.09
Successfull=false;
theParticipants.StartLoop();
G4int MaxNumOfInelCollisions=G4int(theParameters->GetMaxNumberOfCollisions());
G4double NumberOfInel(0.);
//
if(MaxNumOfInelCollisions > 0)
{ // Plab > Pbound, Normal application of FTF is possible
G4double ProbMaxNumber=theParameters->GetMaxNumberOfCollisions()-MaxNumOfInelCollisions;
if(G4UniformRand() < ProbMaxNumber) {MaxNumOfInelCollisions++;}
NumberOfInel=MaxNumOfInelCollisions;
} else
{ // Plab < Pbound, Normal application of FTF is impossible, low energy corrections
if(theParticipants.theNucleus->GetMassNumber() > 1)
{
NumberOfInel = theParameters->GetProbOfInteraction();
MaxNumOfInelCollisions = 1;
} else
{ // Special case for hadron-nucleon interactions
NumberOfInel = 1.;
MaxNumOfInelCollisions = 1;
}
} // end of if(MaxNumOfInelCollisions > 0)
//
while (theParticipants.Next())
{
const G4InteractionContent & collision=theParticipants.GetInteraction();
G4VSplitableHadron * projectile=collision.GetProjectile();
G4VSplitableHadron * target=collision.GetTarget();
//G4cout<<"ProbabilityOfElasticScatt "<<theParameters->GetProbabilityOfElasticScatt()<<G4endl;
if(G4UniformRand()< theParameters->GetProbabilityOfElasticScatt())
{ // Elastic scattering -------------------------
//G4cout<<"Elastic FTF"<<G4endl;
if(theElastic->ElasticScattering(projectile, target, theParameters))
{
Successfull = Successfull || true;
@@ -594,6 +661,7 @@ G4bool G4FTFModel::ExciteParticipants()
}
else
{ // Inelastic scattering ----------------------
/*
if(theExcitation->ExciteParticipants(projectile, target,
theParameters, theElastic))
{
@@ -603,6 +671,31 @@ G4bool G4FTFModel::ExciteParticipants()
Successfull = Successfull || false;
target->SetStatus(2);
}
*/
//G4cout<<"InElastic FTF"<<G4endl;
if(G4UniformRand()< NumberOfInel/MaxNumOfInelCollisions)
{
if(theExcitation->ExciteParticipants(projectile, target,
theParameters, theElastic))
{
Successfull = Successfull || true;
NumberOfInel--;
} else
{
Successfull = Successfull || false;
target->SetStatus(2);
}
} else // If NumOfInel
{
if(theElastic->ElasticScattering(projectile, target, theParameters))
{
Successfull = Successfull || true;
} else
{
Successfull = Successfull || false;
target->SetStatus(2);
}
} // end if NumOfInel
}
} // end of while (theParticipants.Next())
// } while (Successfull == false); // Closed 15.12.09
@@ -623,7 +716,7 @@ G4ExcitedStringVector * G4FTFModel::BuildStrings()
G4ExcitedString * SecondString(0); // two strings will be produced.
theParticipants.StartLoop(); // restart a loop
//
while ( theParticipants.Next() )
{
const G4InteractionContent & interaction=theParticipants.GetInteraction();
@@ -633,7 +726,7 @@ G4ExcitedStringVector * G4FTFModel::BuildStrings()
interaction.GetProjectile()) )
primaries.push_back(interaction.GetProjectile());
}
unsigned int ahadron;
for ( ahadron=0; ahadron < primaries.size() ; ahadron++)
{
@@ -649,7 +742,7 @@ G4ExcitedStringVector * G4FTFModel::BuildStrings()
if(FirstString != 0) strings->push_back(FirstString);
if(SecondString != 0) strings->push_back(SecondString);
}
//
for (G4int ahadron=0; ahadron < NumberOfInvolvedNucleon ; ahadron++)
{
if(TheInvolvedNucleon[ahadron]->GetSplitableHadron()->GetStatus() !=0) //== 2)
@@ -668,7 +761,6 @@ G4ExcitedStringVector * G4FTFModel::BuildStrings()
std::for_each(primaries.begin(), primaries.end(), DeleteVSplitableHadron());
primaries.clear();
return strings;
}
// ------------------------------------------------------------
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FTFParameters.cc,v 1.13 2009/12/16 17:51:15 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4FTFParameters.cc,v 1.15 2010/11/15 10:02:38 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#include "G4FTFParameters.hh"
@@ -41,9 +41,13 @@ G4FTFParameters::~G4FTFParameters()
{;}
//**********************************************************************************************
//G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
// G4double theA,
// G4double theZ,
// G4double s)
G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
G4double theA,
G4double theZ,
G4int theA,
G4int theZ,
G4double s)
{
G4int PDGcode = particle->GetPDGEncoding();
@@ -55,16 +59,21 @@ G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
(2*TargetMass);
G4double Plab = std::sqrt(Elab * Elab - ProjectileMass*ProjectileMass);
G4double Ylab=0.5*std::log((Elab+Plab)/(Elab-Plab));
Plab/=GeV; // Uzhi 8.07.10
G4double LogPlab = std::log( Plab );
G4double sqrLogPlab = LogPlab * LogPlab;
G4int NumberOfTargetProtons = (G4int) theZ;
G4int NumberOfTargetNeutrons = (G4int) theA- (G4int) theZ;
G4int NumberOfTargetProtons = theZ;
G4int NumberOfTargetNeutrons = theA-theZ;
// G4int NumberOfTargetProtons = (G4int) theZ;
// G4int NumberOfTargetNeutrons = (G4int) theA- (G4int) theZ;
G4int NumberOfTargetNucleons = NumberOfTargetProtons + NumberOfTargetNeutrons;
G4double Xtotal, Xelastic;
if( absPDGcode > 1000 ) //------Projectile is baryon --------
if( PDGcode > 1000 ) //------Projectile is baryon --------
{
G4double XtotPP = 48.0 + 0. *std::pow(Plab, 0. ) + 0.522*sqrLogPlab - 4.51*LogPlab;
G4double XtotPN = 47.3 + 0. *std::pow(Plab, 0. ) + 0.513*sqrLogPlab - 4.27*LogPlab;
@@ -72,6 +81,19 @@ G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
G4double XelPP = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
G4double XelPN = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
Xtotal = ( NumberOfTargetProtons * XtotPP +
NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPP +
NumberOfTargetNeutrons * XelPN ) / NumberOfTargetNucleons;
}
else if( PDGcode < -1000 ) //------Projectile is anti_baryon --------
{
G4double XtotPP = 38.4 + 77.6*std::pow(Plab,-0.64) + 0.26*sqrLogPlab - 1.2*LogPlab;
G4double XtotPN = 0. + 133.6*std::pow(Plab,-0.70) + 1.22*sqrLogPlab +13.7*LogPlab;
G4double XelPP = 10.2 + 52.7*std::pow(Plab,-1.16) + 0.125*sqrLogPlab - 1.28*LogPlab;
G4double XelPN = 36.5 + 0. *std::pow(Plab, 0. ) + 0. *sqrLogPlab -11.9 *LogPlab;
Xtotal = ( NumberOfTargetProtons * XtotPP +
NumberOfTargetNeutrons * XtotPN ) / NumberOfTargetNucleons;
Xelastic = ( NumberOfTargetProtons * XelPP +
@@ -180,11 +202,34 @@ G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
// Xtotal and Xelastic in mb
// For Pi- P interactions only!
if(std::abs(Plab-1.4) < 0.05) {Xtotal=3.500599e+01; Xelastic= 1.150032e+01;}
if(std::abs(Plab-1.5) < 0.05) {Xtotal=3.450591e+01; Xelastic= 1.050038e+01;}
if(std::abs(Plab-1.6) < 0.05) {Xtotal=3.430576e+01; Xelastic= 9.800433e+00;}
if(std::abs(Plab-1.7) < 0.05) {Xtotal=3.455560e+01; Xelastic= 9.300436e+00;}
if(std::abs(Plab-1.8) < 0.05) {Xtotal=3.480545e+01; Xelastic= 8.800438e+00;}
if(std::abs(Plab-2.0) < 0.05) {Xtotal=3.570503e+01; Xelastic= 8.200370e+00;}
if(std::abs(Plab-2.2) < 0.05) {Xtotal=3.530495e+01; Xelastic= 7.800362e+00;}
if(std::abs(Plab-2.5) < 0.05) {Xtotal=3.410484e+01; Xelastic= 7.350320e+00;}
if(std::abs(Plab-2.75) < 0.05){Xtotal=3.280479e+01; Xelastic= 7.050273e+00;}
if(std::abs(Plab-3.0) < 0.05) {Xtotal=3.180473e+01; Xelastic= 6.800258e+00;}
if(std::abs(Plab-4.0) < 0.05) {Xtotal=2.910441e+01; Xelastic= 6.100229e+00;}
if(std::abs(Plab-5.0) < 0.05) {Xtotal=2.820372e+01; Xelastic= 5.700275e+00;}
if(std::abs(Plab-6.0) < 0.05) {Xtotal=2.760367e+01; Xelastic= 5.400255e+00;}
if(std::abs(Plab-7.0) < 0.05) {Xtotal=2.725366e+01; Xelastic= 5.150256e+00;}
if(std::abs(Plab-8.0) < 0.05) {Xtotal=2.690365e+01; Xelastic= 4.900258e+00;}
if(std::abs(Plab-10.0) < 0.05){Xtotal=2.660342e+01; Xelastic= 4.600237e+00;}
if(std::abs(Plab-12.0) < 0.05){Xtotal=2.632341e+01; Xelastic= 4.480229e+00;}
if(std::abs(Plab-14.0) < 0.05){Xtotal=2.604340e+01; Xelastic= 4.360221e+00;}
if(std::abs(Plab-20.0) < 0.05){Xtotal=2.520337e+01; Xelastic= 4.000197e+00;}
if(std::abs(Plab-30.0) < 0.05){Xtotal=2.505334e+01; Xelastic= 3.912679e+00;}
//
//----------- Geometrical parameters ------------------------------------------------
SetTotalCrossSection(Xtotal);
SetElastisCrossSection(Xelastic);
SetInelasticCrossSection(Xtotal-Xelastic);
//G4cout<<"Plab Xtotal, Xelastic Xinel "<<Plab<<" "<<Xtotal<<" "<<Xelastic<<Xtotal-Xelastic)<<G4endl;
// // Interactions with elastic and inelastic collisions
SetProbabilityOfElasticScatt(Xtotal, Xelastic);
SetRadiusOfHNinteractions2(Xtotal/pi/10.);
@@ -195,6 +240,7 @@ G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
*/ //=======================================================
//-----------------------------------------------------------------------------------
SetSlope( Xtotal*Xtotal/16./pi/Xelastic/0.3894 ); // Slope parameter of elastic scattering
// (GeV/c)^(-2))
//-----------------------------------------------------------------------------------
@@ -206,36 +252,56 @@ G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
SetAvaragePt2ofElasticScattering(1./(Xtotal*Xtotal/16./pi/Xelastic/0.3894)*GeV*GeV);
//----------- Parameters of excitations ---------------------------------------------
if( absPDGcode > 1000 ) //------Projectile is baryon --------
if( PDGcode > 1000 ) //------Projectile is baryon --------
{
SetMagQuarkExchange(3.4); //3.8);
SetSlopeQuarkExchange(1.2);
SetDeltaProbAtQuarkExchange(0.1); //(0.1*4.);
SetMagQuarkExchange(1.84);//(3.63);
SetSlopeQuarkExchange(0.7);//(1.2);
SetDeltaProbAtQuarkExchange(0.);
if(NumberOfTargetNucleons > 26) {SetProbOfSameQuarkExchange(1.);}
else {SetProbOfSameQuarkExchange(0.);}
SetProjMinDiffMass(1.1); // GeV
SetProjMinNonDiffMass(1.1); // GeV
SetProbabilityOfProjDiff(0.76*std::pow(s/GeV/GeV,-0.35));
SetProjMinDiffMass(1.16); // GeV
SetProjMinNonDiffMass(1.16); // GeV
SetProbabilityOfProjDiff(0.805*std::exp(-0.35*Ylab));// 0.5
SetTarMinDiffMass(1.1); // GeV
SetTarMinNonDiffMass(1.1); // GeV
SetProbabilityOfTarDiff(0.76*std::pow(s/GeV/GeV,-0.35));
SetTarMinDiffMass(1.16); // GeV
SetTarMinNonDiffMass(1.16); // GeV
SetProbabilityOfTarDiff(0.805*std::exp(-0.35*Ylab));// 0.5
SetAveragePt2(0.3); // GeV^2
SetAveragePt2(0.15); // 0.15 GeV^2
}
if( PDGcode < -1000 ) //------Projectile is anti_baryon --------
{
SetMagQuarkExchange(0.);
SetSlopeQuarkExchange(0.);
SetDeltaProbAtQuarkExchange(0.);
SetProbOfSameQuarkExchange(0.);
SetProjMinDiffMass(1.16); // GeV
SetProjMinNonDiffMass(1.16); // GeV
SetProbabilityOfProjDiff(0.805*std::exp(-0.35*Ylab));// 0.5
SetTarMinDiffMass(1.16); // GeV
SetTarMinNonDiffMass(1.16); // GeV
SetProbabilityOfTarDiff(0.805*std::exp(-0.35*Ylab));// 0.5
SetAveragePt2(0.15); // 0.15 GeV^2
}
else if( absPDGcode == 211 || PDGcode == 111) //------Projectile is Pion -----------
{
SetMagQuarkExchange(120.); // 210.
SetSlopeQuarkExchange(2.0);
SetDeltaProbAtQuarkExchange(0.6);
SetMagQuarkExchange(240.);
SetSlopeQuarkExchange(2.);
SetDeltaProbAtQuarkExchange(0.56); //(0.35);
SetProjMinDiffMass(0.5); // GeV
SetProjMinNonDiffMass(0.3); // GeV
SetProbabilityOfProjDiff(0.*0.62*std::pow(s/GeV/GeV,-0.51)); // 40/32 X-dif/X-inel
SetProjMinNonDiffMass(0.5); // GeV 0.3
SetProbabilityOfProjDiff(0.);//(0.*0.62*std::pow(s/GeV/GeV,-0.51)); // 40/32 X-dif/X-inel
SetTarMinDiffMass(1.1); // GeV
SetTarMinNonDiffMass(1.1); // GeV
SetProbabilityOfTarDiff(2.*0.62*std::pow(s/GeV/GeV,-0.51)); // 40/32 X-dif/X-inel
SetTarMinDiffMass(1.16); // GeV
SetTarMinNonDiffMass(1.16); // GeV
// SetProbabilityOfTarDiff(1.);//(2.*0.62*std::pow(s/GeV/GeV,-0.51));
// SetProbabilityOfTarDiff(2.6*std::exp(-0.46*Ylab));
SetProbabilityOfTarDiff(0.8*std::exp(-0.6*(Ylab-3.)));
SetAveragePt2(0.3); // GeV^2
}
@@ -285,21 +351,72 @@ G4FTFParameters::G4FTFParameters(const G4ParticleDefinition * particle,
if( absPDGcode < 1000 )
{
SetCofNuclearDestruction(1.); //1.0); // for meson projectile
} else if( theA > 20. )
SetMaxNumberOfCollisions(1000.,1.); //(Plab,2.); //3.); ##############################
// SetCofNuclearDestruction(0.); //1.0); // for meson projectile
// SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1))));
//G4cout<<Ylab<<" "<<0.62*std::exp(4.*(Ylab-4.5))/(1.+std::exp(4.*(Ylab-4.5)))<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
// SetMaxNumberOfCollisions(Plab,2.); //4.); // ##############################
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
//------------------------------------------
// SetDofNuclearDestruction(0.4);
// SetPt2ofNuclearDestruction(0.17*GeV*GeV);
// SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
// SetExcitationEnergyPerWoundedNucleon(100*MeV);
SetDofNuclearDestruction(0.4);
SetPt2ofNuclearDestruction((0.035+
0.04*std::exp(4.*(Ylab-2.5))/(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
SetExcitationEnergyPerWoundedNucleon(75.*MeV);
} else // for baryon projectile
{
SetCofNuclearDestruction(0.2); //2); // for baryon projectile and heavy target
} else
{
SetCofNuclearDestruction(0.2); //1.0); // for baryon projectile and light target
SetMaxNumberOfCollisions(Plab,2.); //4.); // ##############################
SetCofNuclearDestruction(1.*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1)))); //0.62 1.0
//G4cout<<Ylab<<" "<<0.62*std::exp(4.*(Ylab-2.1))/(1.+std::exp(4.*(Ylab-2.1)))<<G4endl;
//G4int Uzhi; G4cin>>Uzhi;
SetDofNuclearDestruction(0.4);
SetPt2ofNuclearDestruction((0.035+
0.04*std::exp(4.*(Ylab-2.5))/(1.+std::exp(4.*(Ylab-2.5))))*GeV*GeV); //0.09
SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
SetExcitationEnergyPerWoundedNucleon(75.*MeV);
}
SetR2ofNuclearDestruction(1.5*fermi*fermi);
SetExcitationEnergyPerWoundedNucleon(100*MeV);
//SetCofNuclearDestruction(0.47*std::exp(2.*(Ylab-2.5))/(1.+std::exp(2.*(Ylab-2.5))));
//SetPt2ofNuclearDestruction((0.035+0.1*std::exp(4.*(Ylab-3.))/(1.+std::exp(4.*(Ylab-3.))))*GeV*GeV);
//SetMagQuarkExchange(120.); // 210. PipP
//SetSlopeQuarkExchange(2.0);
//SetDeltaProbAtQuarkExchange(0.6);
//SetProjMinDiffMass(0.7); // GeV 1.1
//SetProjMinNonDiffMass(0.7); // GeV
//SetProbabilityOfProjDiff(0.85*std::pow(s/GeV/GeV,-0.5)); // 40/32 X-dif/X-inel
//SetTarMinDiffMass(1.1); // GeV
//SetTarMinNonDiffMass(1.1); // GeV
//SetProbabilityOfTarDiff(0.85*std::pow(s/GeV/GeV,-0.5)); // 40/32 X-dif/X-inel
//
//SetAveragePt2(0.3); // GeV^2
//------------------------------------
//SetProbabilityOfElasticScatt(1.,1.); //(Xtotal, Xelastic);
//SetProbabilityOfProjDiff(1.*0.62*std::pow(s/GeV/GeV,-0.51)); // 0->1
//SetProbabilityOfTarDiff(4.*0.62*std::pow(s/GeV/GeV,-0.51)); // 2->4
//SetAveragePt2(0.3); //(0.15);
//SetAvaragePt2ofElasticScattering(0.);
//SetMaxNumberOfCollisions(4.*(Plab+0.01),Plab); //6.); // ##############################
//SetCofNuclearDestruction(0.2); //(0.4);
//SetExcitationEnergyPerWoundedNucleon(0.*MeV); //(75.*MeV);
//SetDofNuclearDestruction(0.4); //(0.4);
//SetPt2ofNuclearDestruction(0.1*GeV*GeV); //(0.168*GeV*GeV);
SetDofNuclearDestruction(0.4);
SetPt2ofNuclearDestruction(0.17*GeV*GeV);
SetMaxPt2ofNuclearDestruction(1.0*GeV*GeV);
}
//**********************************************************************************************
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FTFParticipants.cc,v 1.16 2009/11/25 09:14:03 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4FTFParticipants.cc,v 1.17 2010/09/20 15:50:46 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// ------------------------------------------------------------
// GEANT 4 class implementation file
@@ -0,0 +1,18 @@
#------------------------------------------------------------------------------
# CMakeLists.txt
# Module : G4had_string_frag
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_frag
#
# CMakeLists.txt for building a single granular library.
#
# Generated on : 24/9/2010
#
# $Id: CMakeLists.txt,v 1.1 2010/09/29 19:04:53 bmorgan Exp $
#
#------------------------------------------------------------------------------
if(GEANT4_BUILD_GRANULAR_LIBS)
include(Geant4MacroLibraryTargets)
GEANT4_GRANULAR_LIBRARY_TARGET(COMPONENT sources.cmake)
endif()
@@ -1,4 +1,4 @@
$Id: History,v 1.10 2009/07/17 12:30:45 vuzhinsk Exp $
$Id: History,v 1.18 2010/11/03 17:11:31 gunter Exp $
-------------------------------------------------------------------
==========================================================
@@ -14,18 +14,52 @@ code and to keep track of all tags.
---------------------------------------------------------------
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
17-July-2009 V. Uzhinsky (had-hadronization-V09-02-03)
Some small optimization are done.
---------------------------------------------------------------------
3 Nov 2010, Gunter Folger (had-hadronization-V09-03-02)
- fix minor coverity warnings in G4HadronBuilder
22-September-2010 V. Uzhinsky (had-hadronization-V09-03-01)
--------------------------------------------------------------
- Warning messages are erased in G4LundStringFragmentation.cc
20-September-2010 V. Uzhinsky
------------------------------
- Phase space restrictions are introduced at small mass string
fragmentation.
5-August-2010 V. Uzhinsky
--------------------------
- Small re-organization is done in G4ExcitedStringDecay.hh. Inline
methods were moved to G4ExcitedStringDecay.cc.
- An action is introduced in FragmentStrings. It acts when
EnergyAndMomentumCorrector can not be done due to large sum masses
of produced hadrons. This led to energy-momentum violation. Now
string fragmentation is repeted 100 times in a bad case.
21-June-2010 V. Uzhinsky (had-hadronization-V09-03-00)
--------------------------------------------------------------
- Lund string fragmentation is improved. The inselfconsistency
between LightFragmentationTest and Lund fragmentation is erased.
Energy conservation in FTF is recovered.
6-December-2010 V. Uzhinsky, (had-hadronization-V09-02-04)
--------------------------------------------------------------
- Lund string fragm. improved, start fragmentation.
17-July-2009 V. Uzhinsky (had-hadronization-V09-02-03)
--------------------------------------------------------------
- Some small optimization are done.
9-July-2009 V. Uzhinsky (had-hadronization-V09-02-02)
---------------------------------------------------------------------
--------------------------------------------------------------
- Bug was fixed in G4VLongitudinalStringDecay.cc at calculation of
formation/creation time, c_light was inserted.
- String tension parameter was set to the usual value (1 GeV/fm) in
G4LundStringFragmentation.cc
--------------------------------------------------------------
22-May-2009 Gunter Folger (had-hadronization-V09-02-01)
--------------------------------------------------------------
- remove temporary workaround - fix is now in QGS
- change pt sampling in G4LundStringFragmentation to avoid near endless
loop; this should improve overall performance slightly.
@@ -33,34 +67,33 @@ code and to keep track of all tags.
implemented; affected .hh and .cc for new optional argument of max Pt
to SampleQuarkPt()
18-May-2009 Gunter Folger (had-hadronization-V09-02-00)
---------------------------------------------------------------------
- reset formatting changes by MK with tags hadr-prtn-hadr-V09-02-xx
- temporary workaround for wrong PDG codes created on wrong input from QGS
when used for e.g. antiproton.
when used for e.g. antiproton.
2-May 2007 Gunter Folger (had-hadronization-V08-02-03)
---------------------------------------------------------------------
- G4ExcitedStringDecay.hh: protect againt divide by 0 when KTsum1.e()
is 0.
- G4ExcitedStringDecay.hh: protect againt divide by 0 when KTsum1.e() is 0.
24-April 2007 Gunter Folger (had-hadronization-V08-02-02)
---------------------------------------------------------------------
- Seperate FTF and QGS fragmentation dir methods where V.Uzhinsky
modified the algorithm for FTF.
- Seperate FTF and QGS fragmentation dir methods where V.Uzhinsky
modified the algorithm for FTF.
2-March 2007 G.Folger (had-hadronization-V08-02-01)
2-March 2007 Gunter Folger (had-hadronization-V08-02-01)
---------------------------------------------------------------------
- G4ExcitedStringDecay::EnergyAndMomentumCorrector no longer causes Exception
when no converging. Add more info when failing. Return correct status.
when no converging. Add more info when failing. Return correct status.
24-Jan 2007 Gunter Folger (had-hadronization-V08-02-00)
--------------------------------------------------------------
- G4ExcitedStringDecay::EnergyAndMomentumCorrector :
Correct bug which did stop correction even if not yet converged;
check on convergence must check that scale-1 is close to 0,
and not less than 0
24-Jan 2007 GF: tag had-hadronization-V08-02-00
G4ExcitedStringDecay::EnergyAndMomentumCorrector :
Correct bug which did stop correction even if not yet converged;
check on convergence must check that scale-1 is close to 0,
and not less than 0
26-May 2006 GF: Fix ( finally?) the charge check in G4HadronBuilder.cc
26-May 2006 Gunter Folger
--------------------------------------------------------------
- Fix ( finally?) the charge check in G4HadronBuilder.cc
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4ExcitedStringDecay.hh,v 1.10 2009/10/05 12:52:48 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4ExcitedStringDecay.hh,v 1.13 2010/08/05 08:44:37 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#ifndef G4ExcitedStringDecay_h
#define G4ExcitedStringDecay_h 1
@@ -41,7 +41,7 @@ class G4ExcitedStringDecay: public G4VStringFragmentation
public:
G4ExcitedStringDecay();
G4ExcitedStringDecay(G4VLongitudinalStringDecay * aStringDecay);
~G4ExcitedStringDecay();
virtual ~G4ExcitedStringDecay();
private:
G4ExcitedStringDecay(const G4ExcitedStringDecay &right);
@@ -61,92 +61,6 @@ class G4ExcitedStringDecay: public G4VStringFragmentation
};
inline
G4KineticTrackVector *G4ExcitedStringDecay::
FragmentString(const G4ExcitedString &theString)
{
if ( theStringDecay == NULL )
theStringDecay=new G4LundStringFragmentation();
return theStringDecay->FragmentString(theString);
}
inline
G4KineticTrackVector *G4ExcitedStringDecay::
FragmentStrings(const G4ExcitedStringVector * theStrings)
{
G4KineticTrackVector * theResult = new G4KineticTrackVector;
G4LorentzVector KTsum;
G4LorentzVector KTsecondaries;
G4bool NeedEnergyCorrector=false;
//G4cout<<"Number of strings "<<theStrings->size()<<G4endl; // Vova
for ( unsigned int astring=0; astring < theStrings->size(); astring++)
{
//G4cout<<"String# "<<astring<<" 4mom "<<theStrings->operator[](astring)->Get4Momentum()<<G4endl; // Vova
KTsum+= theStrings->operator[](astring)->Get4Momentum();
//G4cout<<"KTsum "<<KTsum<<G4endl;
if( !(KTsum.e()<1) && !(KTsum.e()>-1) )
{
throw G4HadronicException(__FILE__, __LINE__,
"G4ExcitedStringDecay::FragmentStrings received nan string...");
}
G4KineticTrackVector * generatedKineticTracks = NULL;
if ( theStrings->operator[](astring)->IsExcited() )
{
generatedKineticTracks=FragmentString(*theStrings->operator[](astring));
} else {
generatedKineticTracks = new G4KineticTrackVector;
generatedKineticTracks->push_back(theStrings->operator[](astring)->GetKineticTrack());
}
if (generatedKineticTracks == NULL)
{
G4cerr << "G4VPartonStringModel:No KineticTracks produced" << G4endl;
continue;
}
//G4cout<<" prod had "<<generatedKineticTracks->size()<<G4endl; // Vova
G4LorentzVector KTsum1;
for ( unsigned int aTrack=0; aTrack<generatedKineticTracks->size();aTrack++)
{
theResult->push_back(generatedKineticTracks->operator[](aTrack));
KTsum1+= (*generatedKineticTracks)[aTrack]->Get4Momentum();
}
KTsecondaries+=KTsum1;
if ( KTsum1.e() > 0 && std::abs((KTsum1.e()-theStrings->operator[](astring)->Get4Momentum().e()) / KTsum1.e()) > perMillion )
{
//--debug-- G4cout << "String secondaries(" <<generatedKineticTracks->size()<< ") momentum: "
//--debug-- << theStrings->operator[](astring)->Get4Momentum() << " " << KTsum1 << G4endl;
NeedEnergyCorrector=true;
}
// clean up
delete generatedKineticTracks;
}
//--DEBUG G4cout << "Strings/secs total 4 momentum " << KTsum << " " <<KTsecondaries << G4endl;
G4bool success=true;
if ( NeedEnergyCorrector ) success=EnergyAndMomentumCorrector(theResult, KTsum);
#ifdef debug_ExcitedStringDecay
G4LorentzVector KTsum1=0;
for ( unsigned int aTrack=0; aTrack<theResult->size();aTrack++)
{
G4cout << " corrected tracks .. " << (*theResult)[aTrack]->GetDefinition()->GetParticleName()
<<" " << (*theResult)[aTrack]->Get4Momentum() << G4endl;
KTsum1+= (*theResult)[aTrack]->Get4Momentum();
}
G4cout << "Needcorrector/success " << NeedEnergyCorrector << "/" << success << ", Corrected total 4 momentum " << KTsum1 << G4endl;
if ( ! success ) G4cout << "failed to correct E/p" << G4endl;
#endif
return theResult;
}
#endif
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4FragmentingString.hh,v 1.4 2007/12/20 15:38:06 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4FragmentingString.hh,v 1.5 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#ifndef G4FragmentingString_h
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4HadronBuilder.hh,v 1.5 2009/05/18 09:43:40 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4HadronBuilder.hh,v 1.6 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -----------------------------------------------------------------------------
// GEANT 4 class header file
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4LundStringFragmentation.hh,v 1.6 2008/04/25 14:20:14 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-02 $ Maxim Komogorov
// $Id: G4LundStringFragmentation.hh,v 1.7 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $ Maxim Komogorov
//
// -----------------------------------------------------------------------------
// GEANT 4 class implementation file
@@ -77,7 +77,9 @@ private:
G4int PartonEncoding,
G4ParticleDefinition* pHadron,
G4double Px, G4double Py);
G4double lambda(G4double s, G4double m1_Sqr, G4double m2_Sqr);
private:
// ------ For estimation of a minimal string mass ---------------
G4double Mass_of_light_quark;
@@ -88,6 +90,14 @@ private:
G4double MinimalStringMass2;
// ------ Minimal invariant mass used at a string fragmentation -
G4double WminLUND;
G4int Meson[3][3][6];
G4double MesonWeight[3][3][6];
G4int Baryon[3][3][3][4];
G4double BaryonWeight[3][3][3][4];
G4double Prob_QQbar[3];
};
//**************************************************************************************************************
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4QGSMFragmentation.hh,v 1.5 2007/12/20 15:38:07 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4QGSMFragmentation.hh,v 1.6 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -----------------------------------------------------------------------------
// GEANT 4 class implementation file
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VKinkyStringDecay.hh,v 1.3 2006/06/29 20:54:53 gunter Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4VKinkyStringDecay.hh,v 1.4 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
// Maxim Komogorov
//
// -----------------------------------------------------------------------------
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VLongitudinalStringDecay.hh,v 1.7 2009/05/22 16:35:47 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4VLongitudinalStringDecay.hh,v 1.8 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
// Maxim Komogorov
//
// -----------------------------------------------------------------------------
@@ -0,0 +1,99 @@
#------------------------------------------------------------------------------
# sources.cmake
# Module : G4had_string_frag
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_frag
#
# Sources description for a library.
# Lists the sources and headers of the code explicitely.
# Lists include paths needed.
# Lists the internal granular and global dependencies of the library.
# Source specific properties should be added at the end.
#
# Generated on : 24/9/2010
#
# $Id: sources.cmake,v 1.1 2010/09/29 19:05:01 bmorgan Exp $
#
#------------------------------------------------------------------------------
# List external includes needed.
include_directories(${CLHEP_INCLUDE_DIRS})
# List internal includes needed.
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/volumes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPGeometry/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPNumerics/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPRandom/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/materials/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/bosons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/barions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/ions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/mesons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/leptons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/shortlived/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/cross_sections/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/parton_string/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/processes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/track/include)
#
# Define the Geant4 Module.
#
include(Geant4MacroDefineModule)
GEANT4_DEFINE_MODULE(NAME G4had_string_frag
HEADERS
G4ExcitedStringDecay.hh
G4FragmentingString.hh
G4HadronBuilder.hh
G4LundStringFragmentation.hh
G4QGSMFragmentation.hh
G4VKinkyStringDecay.hh
G4VLongitudinalStringDecay.hh
SOURCES
G4ExcitedStringDecay.cc
G4FragmentingString.cc
G4HadronBuilder.cc
G4LundStringFragmentation.cc
G4QGSMFragmentation.cc
G4VKinkyStringDecay.cc
G4VLongitudinalStringDecay.cc
GRANULAR_DEPENDENCIES
G4baryons
G4bosons
G4geometrymng
G4globman
G4had_mod_man
G4had_mod_util
G4had_string_man
G4hadronic_mgt
G4hadronic_proc
G4hadronic_util
G4hadronic_xsect
G4hepnumerics
G4ions
G4leptons
G4materials
G4mesons
G4partman
G4procman
G4shortlived
G4track
G4volumes
GLOBAL_DEPENDENCIES
G4geometry
G4global
G4materials
G4particles
G4track
LINK_LIBRARIES
)
# List any source specific properties here
@@ -60,8 +60,106 @@ int G4ExcitedStringDecay::operator!=(const G4ExcitedStringDecay &) const
return 1;
}
G4bool G4ExcitedStringDecay::
EnergyAndMomentumCorrector(G4KineticTrackVector* Output, G4LorentzVector& TotalCollisionMom)
G4KineticTrackVector *G4ExcitedStringDecay::FragmentString
(const G4ExcitedString &theString)
{
if ( theStringDecay == NULL )
theStringDecay=new G4LundStringFragmentation();
return theStringDecay->FragmentString(theString);
}
G4KineticTrackVector *G4ExcitedStringDecay::FragmentStrings
(const G4ExcitedStringVector * theStrings)
{
G4LorentzVector KTsum(0.,0.,0.,0.);
for ( unsigned int astring=0; astring < theStrings->size(); astring++)
{
KTsum+= theStrings->operator[](astring)->Get4Momentum();
if( !(KTsum.e()<1) && !(KTsum.e()>-1) )
{
throw G4HadronicException(__FILE__, __LINE__,
"G4ExcitedStringDecay::FragmentStrings received nan string...");
}
}
G4KineticTrackVector * theResult = new G4KineticTrackVector;
G4int attempts(0);
G4bool success=false;
do {
std::for_each(theResult->begin() , theResult->end() , DeleteKineticTrack());
theResult->clear();
attempts++;
G4LorentzVector KTsecondaries(0.,0.,0.,0.);
G4bool NeedEnergyCorrector=false;
for ( unsigned int astring=0; astring < theStrings->size(); astring++)
{
//G4cout<<G4endl<<"String No "<<astring+1<<" "<<theStrings->operator[](astring)->Get4Momentum().mag()<<G4endl;
G4KineticTrackVector * generatedKineticTracks = NULL;
if ( theStrings->operator[](astring)->IsExcited() )
{
generatedKineticTracks=FragmentString(*theStrings->operator[](astring));
} else {
generatedKineticTracks = new G4KineticTrackVector;
generatedKineticTracks->push_back(theStrings->operator[](astring)->GetKineticTrack());
}
if (generatedKineticTracks == NULL)
{
G4cerr << "G4VPartonStringModel:No KineticTracks produced" << G4endl;
continue;
}
G4LorentzVector KTsum1(0.,0.,0.,0.);
for ( unsigned int aTrack=0; aTrack<generatedKineticTracks->size();aTrack++)
{
//G4cout<<" Prod part "<<(*generatedKineticTracks)[aTrack]->GetDefinition()->GetParticleName()<<" "<<(*generatedKineticTracks)[aTrack]->Get4Momentum()<<G4endl;
theResult->push_back(generatedKineticTracks->operator[](aTrack));
KTsum1+= (*generatedKineticTracks)[aTrack]->Get4Momentum();
}
KTsecondaries+=KTsum1;
if ( KTsum1.e() > 0 && std::abs((KTsum1.e()-theStrings->operator[](astring)->Get4Momentum().e()) / KTsum1.e()) > perMillion )
{
//--debug-- G4cout << "String secondaries(" <<generatedKineticTracks->size()<< ") momentum: "
//--debug-- << theStrings->operator[](astring)->Get4Momentum() << " " << KTsum1 << G4endl;
NeedEnergyCorrector=true;
}
// clean up
delete generatedKineticTracks;
}
//--DEBUG G4cout << "Strings/secs total 4 momentum " << KTsum << " " <<KTsecondaries << G4endl;
success=true;
if ( NeedEnergyCorrector ) success=EnergyAndMomentumCorrector(theResult, KTsum);
} while(!success && (attempts < 100));
#ifdef debug_ExcitedStringDecay
G4LorentzVector KTsum1=0;
for ( unsigned int aTrack=0; aTrack<theResult->size();aTrack++)
{
G4cout << " corrected tracks .. " << (*theResult)[aTrack]->GetDefinition()->GetParticleName()
<<" " << (*theResult)[aTrack]->Get4Momentum() << G4endl;
KTsum1+= (*theResult)[aTrack]->Get4Momentum();
}
G4cout << "Needcorrector/success " << NeedEnergyCorrector << "/" << success << ", Corrected total 4 momentum " << KTsum1 << G4endl;
if ( ! success ) G4cout << "failed to correct E/p" << G4endl;
#endif
return theResult;
}
G4bool G4ExcitedStringDecay::EnergyAndMomentumCorrector
(G4KineticTrackVector* Output, G4LorentzVector& TotalCollisionMom)
{
const int nAttemptScale = 500;
const double ErrLimit = 1.E-5;
@@ -70,11 +168,14 @@ EnergyAndMomentumCorrector(G4KineticTrackVector* Output, G4LorentzVector& TotalC
G4LorentzVector SumMom;
G4double SumMass = 0;
G4double TotalCollisionMass = TotalCollisionMom.m();
if( !(TotalCollisionMass<1) && !(TotalCollisionMass>-1) )
{
std::cout << "TotalCollisionMomentum = "<<TotalCollisionMom<<G4endl;
throw G4HadronicException(__FILE__, __LINE__, "G4ExcitedStringDecay received nan mass...");
}
//G4cout<<G4endl<<"EnergyAndMomentumCorrector "<<Output->size()<<G4endl;
// Calculate sum hadron 4-momenta and summing hadron mass
unsigned int cHadron;
for(cHadron = 0; cHadron < Output->size(); cHadron++)
@@ -90,9 +191,12 @@ EnergyAndMomentumCorrector(G4KineticTrackVector* Output, G4LorentzVector& TotalC
throw G4HadronicException(__FILE__, __LINE__, "G4ExcitedStringDecay::EnergyAndMomentumCorrector() received nan mass...");
}
}
//G4cout<<"SumMass TotalCollisionMass "<<SumMass<<" "<<TotalCollisionMass<<G4endl;
// Cannot correct a single particle
if (Output->size() < 2) return FALSE;
if (SumMass > TotalCollisionMass) return FALSE;
SumMass = SumMom.m2();
if (SumMass < 0) return FALSE;
@@ -147,12 +251,6 @@ EnergyAndMomentumCorrector(G4KineticTrackVector* Output, G4LorentzVector& TotalC
// Compute c.m.s. interaction velocity and KTV back boost
Beta = TotalCollisionMom.boostVector();
Output->Boost(Beta);
/* // Uzhi
G4cout<<"Number of produced hadrons // correct E and P "<<Output->size()<<G4endl; // Uzhi
for(cHadron = 0; cHadron < Output->size(); cHadron++)
{
G4cout<<cHadron<<" "<<Output->operator[](cHadron)->Get4Momentum()<<" "<<Output->operator[](cHadron)->Get4Momentum().mag()<<Output->operator[](cHadron)->GetDefinition()->GetParticleName()<<G4endl;
}
*/ // Uzhi
return success;
}
@@ -79,28 +79,18 @@ G4FragmentingString::G4FragmentingString(const G4FragmentingString &old,
decaying=None;
if ( old.decaying == Left )
{
//G4cout<<" Left "<<G4endl;
//G4cout<<"Pt right "<<Ptright<<G4endl;
//G4cout<<"Pt left "<<Ptleft <<G4endl;
RightParton= old.RightParton;
Ptright = old.Ptright;
LeftParton = newdecay;
Ptleft = old.Ptleft - momentum->vect();
Ptleft.setZ(0.);
//G4cout<<"Pt right "<<Ptright<<G4endl;
//G4cout<<"Pt left "<<Ptleft <<G4endl;
} else if ( old.decaying == Right )
{
//G4cout<<" Right "<<G4endl;
//G4cout<<"Pt right "<<Ptright<<G4endl;
//G4cout<<"Pt left "<<Ptleft <<G4endl;
RightParton = newdecay;
Ptright = old.Ptright - momentum->vect();
Ptright.setZ(0.);
LeftParton = old.LeftParton;
Ptleft = old.Ptleft;
//G4cout<<"Pt right "<<Ptright<<G4endl;
//G4cout<<"Pt left "<<Ptleft <<G4endl;
} else
{
throw G4HadronicException(__FILE__, __LINE__, "G4FragmentingString::G4FragmentingString: no decay Direction defined");
@@ -115,19 +105,19 @@ G4FragmentingString::G4FragmentingString(const G4FragmentingString &old,
//---------------------------------------------------------------------------------
G4FragmentingString::G4FragmentingString(const G4FragmentingString &old, // Uzhi
G4ParticleDefinition * newdecay) // Uzhi
{ // Uzhi
decaying=None; // Uzhi
if ( old.decaying == Left ) // Uzhi
{ // Uzhi
RightParton= old.RightParton; // Uzhi
LeftParton = newdecay; // Uzhi
} else if ( old.decaying == Right ) // Uzhi
{ // Uzhi
RightParton = newdecay; // Uzhi
LeftParton = old.LeftParton; // Uzhi
} else // Uzhi
G4FragmentingString::G4FragmentingString(const G4FragmentingString &old,
G4ParticleDefinition * newdecay)
{
decaying=None;
if ( old.decaying == Left )
{
RightParton= old.RightParton;
LeftParton = newdecay;
} else if ( old.decaying == Right )
{
RightParton = newdecay;
LeftParton = old.LeftParton;
} else
{
throw G4HadronicException(__FILE__, __LINE__, "G4FragmentingString::G4FragmentingString: no decay Direction defined");
}
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4HadronBuilder.cc,v 1.10 2009/05/22 16:34:31 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4HadronBuilder.cc,v 1.12 2010/11/03 17:11:42 gunter Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -----------------------------------------------------------------------------
// GEANT 4 class implementation file
@@ -155,10 +155,8 @@ G4ParticleDefinition * G4HadronBuilder::Meson(G4ParticleDefinition * black,
if (MesonDef == 0 ) {
G4cerr << " G4HadronBuilder - Warning: No particle for PDGcode= "
<< PDGEncoding << G4endl;
}
if ( ( black->GetPDGCharge()
+ white->GetPDGCharge()
- MesonDef->GetPDGCharge() ) > perCent ) {
} else if ( ( black->GetPDGCharge() + white->GetPDGCharge()
- MesonDef->GetPDGCharge() ) > perCent ) {
G4cerr << " G4HadronBuilder - Warning: Incorrect Charge : "
<< " Quark1/2 = "
<< black->GetParticleName() << " / "
@@ -260,10 +258,8 @@ G4ParticleDefinition * G4HadronBuilder::Barion(G4ParticleDefinition * black,
if (BarionDef == 0 ) {
G4cerr << " G4HadronBuilder - Warning: No particle for PDGcode= "
<< PDGEncoding << G4endl;
}
if ( ( black->GetPDGCharge()
+ white->GetPDGCharge()
- BarionDef->GetPDGCharge() ) > perCent ) {
} else if ( ( black->GetPDGCharge() + white->GetPDGCharge()
- BarionDef->GetPDGCharge() ) > perCent ) {
G4cerr << " G4HadronBuilder - Warning: Incorrect Charge : "
<< " DiQuark/Quark = "
<< black->GetParticleName() << " / "
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4QGSMFragmentation.cc,v 1.9 2008/06/23 08:35:55 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4QGSMFragmentation.cc,v 1.10 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -----------------------------------------------------------------------------
// GEANT 4 class implementation file
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VKinkyStringDecay.cc,v 1.4 2008/04/25 14:20:14 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4VKinkyStringDecay.cc,v 1.5 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
// Maxim Komogorov
//
// -----------------------------------------------------------------------------
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VLongitudinalStringDecay.cc,v 1.18 2009/08/03 13:21:25 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4VLongitudinalStringDecay.cc,v 1.22 2010/09/20 12:46:23 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// -----------------------------------------------------------------------------
// GEANT 4 class implementation file
@@ -70,7 +70,7 @@ G4VLongitudinalStringDecay::G4VLongitudinalStringDecay()
ClusterLoopInterrupt = 500;
// Changable Parameters below.
SigmaQT = 0.5 * GeV;
SigmaQT = 0.5 * GeV; // 0.5
StrangeSuppress = 0.44; // 27 % strange quarks produced, ie. u:d:s=1:1:0.27
DiquarkSuppress = 0.07;
@@ -178,9 +178,6 @@ G4KineticTrackVector* G4VLongitudinalStringDecay::LightFragmentationTest(const
<< "string .. " << string->Get4Momentum() << " "
<< string->Get4Momentum().m() << G4endl;
#endif
G4cout << "VlongSF Warning replacing string by single hadron " <<G4endl;
G4cout << hadrons.first->GetParticleName() << " string .. " <<G4endl;
G4cout << string->Get4Momentum() << " " << string->Get4Momentum().m() << G4endl;
*/
G4ThreeVector Mom3 = string->Get4Momentum().vect();
G4LorentzVector Mom(Mom3,
@@ -201,8 +198,6 @@ G4cout << string->Get4Momentum() << " " << string->Get4Momentum().m() << G4endl;
<< string->Get4Momentum().m() << G4endl;
#endif
// Uzhi Formation time in the case???
G4LorentzVector Mom1, Mom2;
Sample4Momentum(&Mom1, hadrons.first->GetPDGMass(),
&Mom2,hadrons.second->GetPDGMass(),
@@ -254,6 +249,7 @@ G4double G4VLongitudinalStringDecay::FragmentationMass(
Hadron1 = (minMassHadronizer->*build)(string->GetLeftParton(),
string->GetRightParton());
//G4cout<<"Hadron1 "<<Hadron1->GetParticleName()<<G4endl;
mass= (Hadron1)->GetPDGMass();
} else
{
@@ -327,8 +323,7 @@ G4KineticTrack * G4VLongitudinalStringDecay::Splitup(
G4FragmentingString *string,
G4FragmentingString *&newString)
{
//G4cout<<"In G4VLong String Dec######################"<<G4endl;
//G4cout<<"Start SplitUP"<<G4endl;
//... random choice of string end to use for creating the hadron (decay)
SideOfDecay = (G4UniformRand() < 0.5)? 1: -1;
if (SideOfDecay < 0)
@@ -347,13 +342,16 @@ G4KineticTrack * G4VLongitudinalStringDecay::Splitup(
} else {
HadronDefinition= DiQuarkSplitup(string->GetDecayParton(), newStringEnd);
}
//G4cout<<"New had "<<HadronDefinition->GetParticleName()<<G4endl;
// create new String from old, ie. keep Left and Right order, but replace decay
newString=new G4FragmentingString(*string,newStringEnd); // To store possible
// quark containt of new string
//G4cout<<"SplitEandP "<<G4endl;
G4LorentzVector* HadronMomentum=SplitEandP(HadronDefinition, string, newString);
delete newString; newString=0; // Uzhi 20.06.08
delete newString; newString=0;
G4KineticTrack * Hadron =0;
if ( HadronMomentum != 0 ) {
@@ -364,16 +362,9 @@ G4KineticTrack * G4VLongitudinalStringDecay::Splitup(
newString=new G4FragmentingString(*string,newStringEnd,
HadronMomentum);
//G4cout<<"Out G4VLong String Dec######################"<<G4endl;
//G4cout<<"newString 4Mom"<<newString->Get4Momentum()<<G4endl;
//G4cout<<"newString Pl "<<newString->LightConePlus()<<G4endl;
//G4cout<<"newString Mi "<<newString->LightConeMinus()<<G4endl;
//G4cout<<"newString Pts "<<newString->StablePt()<<G4endl;
//G4cout<<"newString Ptd "<<newString->DecayPt()<<G4endl;
//G4cout<<"newString M2 "<<newString->Mass2()<<G4endl;
//G4cout<<"newString M2 "<<newString->Mass()<<G4endl;
delete HadronMomentum;
}
//G4cout<<"End SplitUP"<<G4endl;
return Hadron;
}
@@ -473,16 +464,6 @@ G4VLongitudinalStringDecay::pDefPair G4VLongitudinalStringDecay::CreatePartonPai
}
//-----------------------------------------------------------------------------
// G4ThreeVector G4VLongitudinalStringDecay::SampleQuarkPt()
// {
// G4double width_param= 2.0 * GeV*GeV;
// G4double R = G4UniformRand();
// G4double Pt = std::sqrt(width_param*R/(1-R));
// G4double phi = 2.*pi*G4UniformRand();
// return G4ThreeVector(Pt * std::cos(phi),Pt * std::sin(phi),0);
// }
G4ThreeVector G4VLongitudinalStringDecay::SampleQuarkPt(G4double ptMax)
{
G4double Pt;
@@ -504,11 +485,8 @@ void G4VLongitudinalStringDecay::CalculateHadronTimePosition(G4double theInitial
{
// `yo-yo` formation time
// const G4double kappa = 1.0 * GeV/fermi/4.; // Uzhi String tension 1.06.08
G4double kappa = GetStringTensionParameter();
//G4cout<<"Kappa "<<kappa<<G4endl; // Uzhi 20.06.08
//G4int Uzhi; G4cin>>Uzhi; // Uzhi 20.06.08
//G4cout<<"Number of hadrons "<<Hadrons->size()<<G4endl; // Vova
// const G4double kappa = 1.0 * GeV/fermi/4.;
G4double kappa = GetStringTensionParameter();
for(size_t c1 = 0; c1 < Hadrons->size(); c1++)
{
G4double SumPz = 0;
@@ -521,57 +499,17 @@ void G4VLongitudinalStringDecay::CalculateHadronTimePosition(G4double theInitial
G4double HadronE = Hadrons->operator[](c1)->Get4Momentum().e();
G4double HadronPz = Hadrons->operator[](c1)->Get4Momentum().pz();
Hadrons->operator[](c1)->SetFormationTime(
(theInitialStringMass - 2.*SumPz + HadronE - HadronPz)/(2.*kappa)/c_light); //Uzhi1.07.09c_light
(theInitialStringMass - 2.*SumPz + HadronE - HadronPz)/(2.*kappa)/c_light);
G4ThreeVector aPosition(0, 0,
(theInitialStringMass - 2.*SumE - HadronE + HadronPz)/(2.*kappa));
Hadrons->operator[](c1)->SetPosition(aPosition);
/*
G4cout<<"kappa "<<kappa<<G4endl;
G4cout<<c1<<" Partic time, position Old "<<
(theInitialStringMass - 2.*SumPz + HadronE - HadronPz)/(2.*kappa)<<' '<<
(theInitialStringMass - 2.*SumE - HadronE + HadronPz)/(2.*kappa)<<G4endl;
G4cout<<c1<<" Partic time, position New "<<
(theInitialStringMass - 2.*SumPz + HadronE - HadronPz)/(2.*kappa)/c_light<<' '<<
(theInitialStringMass - 2.*SumE - HadronE + HadronPz)/(2.*kappa)<<G4endl;
G4cout<<"fermi "<<fermi<<" 1/fermi "<<1./fermi<<' '<<"1*fermi/c "<<1.*fermi/c_light<<G4endl;
G4int Uzhi; G4cin>>Uzhi; // Uzhi 20.06.08
*/
}
}
//-----------------------------------------------------------------------------
/*
void G4VLongitudinalStringDecay::CalculateHadronTimePosition(G4double theInitialStringMass, G4KineticTrackVector* Hadrons)
{
// 'constituent' formation time
const G4double kappa = 1.0 * GeV/fermi;
for(G4int c1 = 0; c1 < Hadrons->length(); c1++)
{
G4double SumPz = 0;
G4double SumE = 0;
for(G4int c2 = 0; c2 <= c1; c2++)
{
SumPz += Hadrons->at(c2)->Get4Momentum().pz();
SumE += Hadrons->at(c2)->Get4Momentum().e();
}
Hadrons->at(c1)->SetFormationTime((theInitialStringMass - 2.*SumPz)/(2.*kappa));
G4ThreeVector aPosition(0, 0, (theInitialStringMass - 2.*SumE)/(2.*kappa));
Hadrons->at(c1)->SetPosition(aPosition);
}
c1 = Hadrons->length()-1;
Hadrons->at(c1)->SetFormationTime(Hadrons->at(c1-1)->GetFormationTime());
Hadrons->at(c1)->SetPosition(Hadrons->at(c1-1)->GetPosition());
}
*/
//*****************************************************************************
void G4VLongitudinalStringDecay::SetSigmaTransverseMomentum(G4double aValue)
{
if ( PastInitPhase ) {
@@ -0,0 +1,18 @@
#------------------------------------------------------------------------------
# CMakeLists.txt
# Module : G4had_string_man
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_man
#
# CMakeLists.txt for building a single granular library.
#
# Generated on : 24/9/2010
#
# $Id: CMakeLists.txt,v 1.1 2010/09/29 19:05:09 bmorgan Exp $
#
#------------------------------------------------------------------------------
if(GEANT4_BUILD_GRANULAR_LIBS)
include(Geant4MacroLibraryTargets)
GEANT4_GRANULAR_LIBRARY_TARGET(COMPONENT sources.cmake)
endif()
@@ -1,4 +1,4 @@
$Id: History,v 1.7 2009/07/17 12:41:20 vuzhinsk Exp $
$Id: History,v 1.10 2010/11/30 16:11:25 vuzhinsk Exp $
-------------------------------------------------------------------
==========================================================
@@ -14,6 +14,17 @@ code and to keep track of all tags.
---------------------------------------------------------------
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
30 Nov. 2010 V. Uzhinsky (had-partonstring-mgt-V09-03-01)
Member G4int Status in G4VSplitableHadron was changed
into G4int curStatus
8-Sept-2010, G.Folger (had-partonstring-mgt-V09-03-00)
use integer interface of G4Nucleus for A&Z
6 Dec. 2009, V. Uzhinsky (had-partonstring-mgt-V09-02-02)
Repeatation of string fragmentation if
energy corr. can not be done is implemented.
17-July-2009 V. Uzhinsky (had-partonstring-mgt-V09-02-01)
A Status of nuclear nucleon involved in an interaction is introdused.
Status: 0 - spectator, 1 - involved nucleon, 2 - absorbed nucleon
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VParticipants.hh,v 1.6 2009/11/19 14:23:09 gunter Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4VParticipants.hh,v 1.7 2010/09/08 16:58:04 gunter Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#ifndef G4VParticipants_h
@@ -58,7 +58,7 @@ class G4VParticipants
int operator==(const G4VParticipants &right) const;
int operator!=(const G4VParticipants &right) const;
void Init(G4double theZ, G4double theA);
void Init(G4int theZ, G4int theA);
void SetNucleus(G4V3DNucleus * aNucleus);
G4V3DNucleus * GetWoundedNucleus() const;
@@ -85,7 +85,7 @@ inline void G4VParticipants::SetNucleus(G4V3DNucleus * aNucleus)
theNucleus = aNucleus;
}
inline void G4VParticipants::Init(G4double theA, G4double theZ)
inline void G4VParticipants::Init(G4int theA, G4int theZ)
{
if ( theNucleus == NULL ) theNucleus = new G4Fancy3DNucleus();
theNucleus->Init(theA, theZ);
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VSplitableHadron.hh,v 1.6 2009/07/17 12:36:41 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4VSplitableHadron.hh,v 1.7 2010/11/30 16:07:35 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
#ifndef G4VSplitableHadron_h
@@ -108,7 +108,7 @@ class G4VSplitableHadron
G4ThreeVector thePosition;
G4int theCollisionCount;
G4int Status; // Uzhi 17.07.09
G4int curStatus; // Uzhi 17.07.09
G4bool isSplit;
};
@@ -170,12 +170,12 @@ inline const G4ThreeVector & G4VSplitableHadron::GetPosition() const
inline void G4VSplitableHadron::SetStatus(G4int aStatus) // Uzhi 17.07.09
{
Status=aStatus;
curStatus=aStatus;
}
inline G4int G4VSplitableHadron::GetStatus() // Uzhi 17.07.09
{
return Status;
return curStatus;
}
@@ -0,0 +1,97 @@
#------------------------------------------------------------------------------
# sources.cmake
# Module : G4had_string_man
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4had_string_man
#
# Sources description for a library.
# Lists the sources and headers of the code explicitely.
# Lists include paths needed.
# Lists the internal granular and global dependencies of the library.
# Source specific properties should be added at the end.
#
# Generated on : 24/9/2010
#
# $Id: sources.cmake,v 1.1 2010/09/29 19:05:17 bmorgan Exp $
#
#------------------------------------------------------------------------------
# List external includes needed.
include_directories(${CLHEP_INCLUDE_DIRS})
# List internal includes needed.
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/volumes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPGeometry/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPNumerics/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPRandom/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/materials/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/bosons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/barions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/ions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/mesons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/leptons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/shortlived/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/track/include)
#
# Define the Geant4 Module.
#
include(Geant4MacroDefineModule)
GEANT4_DEFINE_MODULE(NAME G4had_string_man
HEADERS
G4EventGenerator.hh
G4InteractionCode.hh
G4InteractionContent.hh
G4PomeronCrossSection.hh
G4StringModel.hh
G4VParticipants.hh
G4VPartonStringModel.hh
G4VSplitableHadron.hh
G4VStringFragmentation.hh
G4VertexCode.hh
SOURCES
G4EventGenerator.cc
G4InteractionContent.cc
G4PomeronCrossSection.cc
G4StringModel.cc
G4VParticipants.cc
G4VPartonStringModel.cc
G4VSplitableHadron.cc
G4VStringFragmentation.cc
GRANULAR_DEPENDENCIES
G4baryons
G4bosons
G4geometrymng
G4globman
G4had_mod_man
G4had_mod_util
G4hadronic_mgt
G4hadronic_util
G4hepnumerics
G4ions
G4leptons
G4materials
G4mesons
G4partman
G4procman
G4shortlived
G4track
G4volumes
GLOBAL_DEPENDENCIES
G4geometry
G4global
G4materials
G4particles
G4track
LINK_LIBRARIES
)
# List any source specific properties here
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VPartonStringModel.cc,v 1.6 2009/10/05 12:52:48 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4VPartonStringModel.cc,v 1.7 2009/12/06 11:29:33 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
//// ------------------------------------------------------------
// GEANT 4 class implementation file
@@ -104,6 +104,7 @@ G4KineticTrackVector * G4VPartonStringModel::Scatter(const G4Nucleus &theNucleus
G4KineticTrackVector * theResult = 0;
G4double stringEnergy(0);
G4LorentzVector SumStringMom(0.,0.,0.,0.);
for ( unsigned int astring=0; astring < strings->size(); astring++)
{
@@ -111,8 +112,11 @@ G4KineticTrackVector * G4VPartonStringModel::Scatter(const G4Nucleus &theNucleus
stringEnergy += (*strings)[astring]->GetLeftParton()->Get4Momentum().t();
stringEnergy += (*strings)[astring]->GetRightParton()->Get4Momentum().t();
(*strings)[astring]->LorentzRotate(toLab);
SumStringMom+=(*strings)[astring]->Get4Momentum();
}
G4double InvMass=SumStringMom.mag();
#ifdef debug_PartonStringModel
G4V3DNucleus * fancynucleus=theThis->GetWoundedNucleus();
@@ -134,16 +138,29 @@ G4KineticTrackVector * G4VPartonStringModel::Scatter(const G4Nucleus &theNucleus
<< Ptmp.e() << " "
<< stringEnergy - 939.*hits - Ptmp.e()<< G4endl;
#endif
theResult = stringFragmentationModel->FragmentStrings(strings);
/*
G4cout<<"Size "<<theResult->size()<<G4endl;
for ( unsigned int i=0; i < theResult->size(); i++)
{
G4double SumMass(0.);
attempts = 0;
maxAttempts=100;
do
{
attempts++;
if(theResult != 0)
{
std::for_each(theResult->begin(), theResult->end(), DeleteKineticTrack());
theResult->clear();
}
theResult = stringFragmentationModel->FragmentStrings(strings);
if(attempts > maxAttempts ) break;
SumMass=0.;
for ( unsigned int i=0; i < theResult->size(); i++)
{
SumMass+=(*theResult)[i]->GetDefinition()->GetPDGMass();
}
} while(SumMass > InvMass);
G4cout<<(*theResult)[i]->Get4Momentum()<<" "<<(*theResult)[i]->Get4Momentum().mag()<<G4endl;;
}
*/
std::for_each(strings->begin(), strings->end(), DeleteString() );
delete strings;
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4VSplitableHadron.cc,v 1.7 2009/07/17 12:36:41 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-03 $
// $Id: G4VSplitableHadron.cc,v 1.8 2010/11/30 16:07:35 vuzhinsk Exp $
// GEANT4 tag $Name: geant4-09-04 $
//
// ------------------------------------------------------------
@@ -42,13 +42,13 @@
G4VSplitableHadron::G4VSplitableHadron()
: theDefinition(NULL), TimeOfCreation(0.), theCollisionCount(0), // Uzhi 8.05.08
Status(0), isSplit(false) // Uzhi 17.07.09
curStatus(0), isSplit(false) // Uzhi 17.07.09
{
}
G4VSplitableHadron::G4VSplitableHadron(const G4ReactionProduct & aPrimary)
: TimeOfCreation(0.), theCollisionCount(0), // Uzhi 8.05.08
Status(0), isSplit(false) // Uzhi 17.07.09
curStatus(0), isSplit(false) // Uzhi 17.07.09
{
theDefinition=aPrimary.GetDefinition();
the4Momentum.setVect(aPrimary.GetMomentum());
@@ -63,7 +63,7 @@ G4VSplitableHadron::G4VSplitableHadron(const G4Nucleon & aNucleon)
theDefinition =aNucleon.GetParticleType();
the4Momentum =aNucleon.GetMomentum();
thePosition =aNucleon.GetPosition();
Status = 0; // Uzhi 17.07.09
curStatus = 0; // Uzhi 17.07.09
}
G4VSplitableHadron::G4VSplitableHadron(const G4VKineticNucleon * aNucleon)
@@ -74,7 +74,7 @@ G4VSplitableHadron::G4VSplitableHadron(const G4VKineticNucleon * aNucleon)
theDefinition =aNucleon->GetDefinition();
the4Momentum =aNucleon->Get4Momentum();
thePosition =aNucleon->GetPosition();
Status = 0; // Uzhi 17.07.09
curStatus = 0; // Uzhi 17.07.09
}
G4VSplitableHadron::G4VSplitableHadron(const G4VSplitableHadron &right)
@@ -85,7 +85,7 @@ G4VSplitableHadron::G4VSplitableHadron(const G4VSplitableHadron &right)
theDefinition = right.GetDefinition();
the4Momentum = right.Get4Momentum();
thePosition = right.GetPosition();
Status = 0; // Uzhi 17.07.09
curStatus = 0; // Uzhi 17.07.09
}
@@ -0,0 +1,18 @@
#------------------------------------------------------------------------------
# CMakeLists.txt
# Module : G4hadronic_qgstring
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4hadronic_qgstring
#
# CMakeLists.txt for building a single granular library.
#
# Generated on : 24/9/2010
#
# $Id: CMakeLists.txt,v 1.1 2010/09/29 19:05:25 bmorgan Exp $
#
#------------------------------------------------------------------------------
if(GEANT4_BUILD_GRANULAR_LIBS)
include(Geant4MacroLibraryTargets)
GEANT4_GRANULAR_LIBRARY_TARGET(COMPONENT sources.cmake)
endif()
@@ -1,4 +1,4 @@
$Id: History,v 1.8 2009/05/19 12:48:42 gunter Exp $
$Id: History,v 1.10 2010/09/08 15:51:28 gunter Exp $
-------------------------------------------------------------------
==========================================================
@@ -15,6 +15,14 @@ code and to keep track of all tags.
* Please list in reverse chronological order (last date on top)
---------------------------------------------------------------
8 Sep 2010, G.Folger (hadr-qgsm-V09-03-01)
-----------------------------------------------------
- G4QGSModel.icc: use integer (A,Z) interface of nucleus
12-Mar-2010, G.Folger (hadr-qgsm-V09-03-00)
- remove G4PartonStringAnnihilator.{hh,cc} not used anywhere
19 May 2009, G.Folger (hadr-qgsm-V09-02-02)
-----------------------------------------------------
- fix in G4SPBaryon: for antibaryon, a diquark & quark was given instead of
@@ -1,71 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
// $Id: G4PartonStringAnnihilator.hh,v 1.2 2006/06/29 20:56:11 gunter Exp $
// -----------------------------------------------------------------------------
// GEANT 4 class implementation file
//
// History: first implementation, Maxim Komogorov, 9-Oct-1998
// -----------------------------------------------------------------------------
#ifndef G4PartonStringAnnihilator_h
#define G4PartonStringAnnihilator_h 1
#include "G4KineticTrack.hh"
#include "G4ExcitedString.hh"
#include "G4MesonSplitter.hh"
#include "G4BaryonSplitter.hh"
class G4PartonStringAnnihilator
{
public:
G4PartonStringAnnihilator();
public:
G4double GetCrossSection(G4KineticTrack& aTarget, G4KineticTrack& aProjectile);
G4ExcitedString* GetString(G4KineticTrack& Target, G4KineticTrack& Projectile);
G4bool SplitUpBarion(G4int Encoding, G4int* q_or_qqbar, G4int* qbar_or_qq); //!
G4bool isMeson(G4int Encoding);
G4bool isBarion(G4int Encoding);
G4bool isAntiParticle(G4int Encoding);
private:
G4bool GetStringEnds(G4int Projectile, G4int Target, G4int* Left, G4int* Right);
G4bool FindDiquark(G4int Encoding, G4int Quark, G4int* Diquark);
G4bool FindQuark(G4int Encoding, G4int Diquark, G4int* Quark);
private:
G4double widthOfPtSquare;
G4MesonSplitter theMesonSplitter;
G4BaryonSplitter theBaryonSplitter;
};
// *************************************************************************************************
#endif
@@ -45,7 +45,7 @@ template<class ParticipantType>
void G4QGSModel<ParticipantType>::Init(const G4Nucleus & aNucleus, const G4DynamicParticle & aProjectile)
{
// clean-up and consistency with design, HPW Feb 1999
theParticipants.Init(aNucleus.GetN(),aNucleus.GetZ());
theParticipants.Init(aNucleus.GetA_asInt(),aNucleus.GetZ_asInt());
theCurrentVelocity.setX(0);
theCurrentVelocity.setY(0);
// HPW Feb 1999
@@ -0,0 +1,120 @@
#------------------------------------------------------------------------------
# sources.cmake
# Module : G4hadronic_qgstring
# Package: Geant4.src.G4processes.G4hadronic.G4hadronic_models.G4had_string.G4hadronic_qgstring
#
# Sources description for a library.
# Lists the sources and headers of the code explicitely.
# Lists include paths needed.
# Lists the internal granular and global dependencies of the library.
# Source specific properties should be added at the end.
#
# Generated on : 24/9/2010
#
# $Id: sources.cmake,v 1.1 2010/09/29 19:05:33 bmorgan Exp $
#
#------------------------------------------------------------------------------
# List external includes needed.
include_directories(${CLHEP_INCLUDE_DIRS})
# List internal includes needed.
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/geometry/volumes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPGeometry/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPNumerics/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/HEPRandom/include)
include_directories(${CMAKE_SOURCE_DIR}/source/global/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/materials/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/bosons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/barions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/ions/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/hadrons/mesons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/leptons/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/particles/shortlived/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/cross_sections/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/parton_string/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/models/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/processes/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/hadronic/util/include)
include_directories(${CMAKE_SOURCE_DIR}/source/processes/management/include)
include_directories(${CMAKE_SOURCE_DIR}/source/track/include)
#
# Define the Geant4 Module.
#
include(Geant4MacroDefineModule)
GEANT4_DEFINE_MODULE(NAME G4hadronic_qgstring
HEADERS
G4ASCCrossSection.hh
G4AnnihilationCrossSection.hh
G4BaryonSplitter.hh
G4DiffractiveStringBuilder.hh
G4GammaAnnCrossSection.hh
G4GammaParticipants.hh
G4MesonSplitter.hh
G4PartonPair.hh
G4QGSDiffractiveExcitation.hh
G4QGSMParameters.hh
G4QGSMSplitableHadron.hh
G4QGSModel.hh
G4QGSModel.icc
G4QGSParticipants.hh
G4SPBaryon.hh
G4SPBaryonTable.hh
G4SPPartonInfo.hh
G4SingleDiffractiveExcitation.hh
G4SoftStringBuilder.hh
G4VAnnihilationCrossSection.hh
SOURCES
G4ASCCrossSection.cc
G4AnnihilationCrossSection.cc
G4BaryonSplitter.cc
G4DiffractiveStringBuilder.cc
G4GammaAnnCrossSection.cc
G4GammaParticipants.cc
G4MesonSplitter.cc
G4PartonPair.cc
G4QGSDiffractiveExcitation.cc
G4QGSMParameters.cc
G4QGSMSplitableHadron.cc
G4QGSParticipants.cc
G4SPBaryon.cc
G4SingleDiffractiveExcitation.cc
G4SoftStringBuilder.cc
GRANULAR_DEPENDENCIES
G4baryons
G4bosons
G4geometrymng
G4globman
G4had_mod_man
G4had_mod_util
G4had_string_man
G4hadronic_mgt
G4hadronic_proc
G4hadronic_util
G4hadronic_xsect
G4hepnumerics
G4ions
G4leptons
G4materials
G4mesons
G4partman
G4procman
G4shortlived
G4track
G4volumes
GLOBAL_DEPENDENCIES
G4geometry
G4global
G4materials
G4particles
G4track
LINK_LIBRARIES
)
# List any source specific properties here
@@ -1,25 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//