Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4GammaParticipants.cc
이 파일의 문서화 페이지로 가기
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 #include "globals.hh"
27 #include "G4GammaParticipants.hh"
28 #include "G4LorentzVector.hh"
29 #include "G4V3DNucleus.hh"
30 #include <utility>
31 
32 // Class G4GammaParticipants
33 
34 //#define debugGammaParticipants
35 
37 {
38  // Check reaction threshold - goes to CheckThreshold
39 
42 
43  G4LorentzVector aPrimaryMomentum(thePrimary.GetMomentum(), thePrimary.GetTotalEnergy());
44  G4LorentzVector aTargetNMomentum(0.,0.,0.,938.);
45  if((!(aPrimaryMomentum.e()>-1)) && (!(aPrimaryMomentum.e()<1)) )
46  {
47  throw G4HadronicException(__FILE__, __LINE__,
48  "G4GammaParticipants::SelectInteractions: primary nan energy.");
49  }
50  G4double S = (aPrimaryMomentum + aTargetNMomentum).mag2();
51  G4double ThresholdMass = thePrimary.GetMass() + 938.;
52  ModelMode = SOFT;
53 
54  #ifdef debugGammaParticipants
55  G4cout <<G4endl<< "Gamma Participants - SelectInteractions " << G4endl;
56  G4cout << "Energy and Nucleus Mass N "<<thePrimary.GetTotalEnergy()<<" "<<theNucleus->GetMassNumber()<<G4endl;
57  G4cout << "SqrtS ThresholdMass ModelMode " <<std::sqrt(S)<<" "<<ThresholdMass<<" "<<ModelMode<< G4endl;
58  G4cout << "ThresholdParameter QGSMThreshold "<<ThresholdParameter<<" "<<QGSMThreshold<<G4endl;
59  #endif
60 
61 
62  if (sqr(ThresholdMass + ThresholdParameter) > S)
63  {
65  }
66 
67  if (sqr(ThresholdMass + QGSMThreshold) > S)
68  {
70  }
71 
72  #ifdef debugGammaParticipants
73  G4cout << "Interaction type (ModelMode) 0 - SOFT, 1 - DIFFRACTIVE: "<<ModelMode<< G4endl;
74  #endif
75 
76  std::for_each(theInteractions.begin(), theInteractions.end(), DeleteInteractionContent());
77  theInteractions.clear();
78  G4int totalCuts = 0;
79 
80 // #ifdef debug_G4GammaParticipants
81 // G4double eK = thePrimary.GetKineticEnergy()/GeV;
82 // G4int nucleonCount = theNucleus->GetMassNumber();
83 // #endif
84 
86  G4int NucleonNo=0;
87 
89  G4Nucleon * pNucleon =0;
90 
91  while( (pNucleon = theNucleus->GetNextNucleon()) ) {if(NucleonNo == theCurrent) break; NucleonNo++;}
92 
93  if ( pNucleon ) {
94 
95  G4QGSMSplitableHadron* aTarget = new G4QGSMSplitableHadron(*pNucleon);
96  pNucleon->Hit(aTarget);
97 
98  if( (0.06 > G4UniformRand() &&(ModelMode==SOFT)) || (ModelMode==DIFFRACTIVE ) ) // (false) //
99  { // Diffractive interaction
102 
103  aInteraction->SetTarget(aTarget);
104  aInteraction->SetTargetNucleon(pNucleon);
105  aTarget->SetCollisionCount(0);
106  aTarget->SetStatus(1); // Mark that is Diffr. interaction
107 
108  aInteraction->SetNumberOfDiffractiveCollisions(1);
109  aInteraction->SetNumberOfSoftCollisions(0);
110  aInteraction->SetStatus(1);
111 
112  theInteractions.push_back(aInteraction);
113  totalCuts += 1;
114  }
115  else
116  {
117  // nondiffractive soft interaction occurs
118  aTarget->IncrementCollisionCount(1);
119  aTarget->SetStatus(0);
120  theTargets.push_back(aTarget);
121 
124 
125  G4InteractionContent * aInteraction =
127  aInteraction->SetTarget(aTarget);
128  aInteraction->SetTargetNucleon(pNucleon);
129  aInteraction->SetNumberOfSoftCollisions(1);
130  aInteraction->SetStatus(0); // Mark that is non-Diffr. interaction
131  theInteractions.push_back(aInteraction);
132  totalCuts += 1;
133  }
134  }
135  return theProjectileSplitable;
136 }
void SetStatus(const G4int aStatus)
G4QGSMSplitableHadron * theProjectileSplitable
void SetStatus(G4int aValue)
const G4double QGSMThreshold
std::vector< G4InteractionContent * > theInteractions
virtual G4VSplitableHadron * SelectInteractions(const G4ReactionProduct &thePrimary)
#define G4endl
Definition: G4ios.hh:61
double S(double temp)
G4double GetTotalEnergy() const
double G4double
Definition: G4Types.hh:76
void SetNumberOfDiffractiveCollisions(int)
#define G4UniformRand()
Definition: Randomize.hh:53
#define TRUE
Definition: globals.hh:55
G4ThreeVector GetMomentum() const
virtual G4int GetMassNumber()=0
std::vector< G4VSplitableHadron * > theTargets
virtual G4Nucleon * GetNextNucleon()=0
G4double GetMass() const
int G4int
Definition: G4Types.hh:78
void Hit(G4VSplitableHadron *aHit)
Definition: G4Nucleon.hh:89
void SetTarget(G4VSplitableHadron *aTarget)
const G4double ThresholdParameter
G4GLOB_DLL std::ostream G4cout
T sqr(const T &x)
Definition: templates.hh:145
void SetCollisionCount(G4int aCount)
void SetTargetNucleon(G4Nucleon *aNucleon)
virtual G4bool StartLoop()=0
void IncrementCollisionCount(G4int aCount)
G4V3DNucleus * theNucleus