Geant4-11
Public Member Functions | Private Types | Private Member Functions | Private Attributes
G4CascadeCoalescence Class Reference

#include <G4CascadeCoalescence.hh>

Public Member Functions

void FindClusters (G4CollisionOutput &finalState)
 
 G4CascadeCoalescence (G4int verbose=0)
 
void setVerboseLevel (G4int verbose)
 
virtual ~G4CascadeCoalescence ()
 

Private Types

typedef std::vector< size_t > ClusterCandidate
 

Private Member Functions

bool allNucleons (const ClusterCandidate &clus) const
 
G4int clusterType (const ClusterCandidate &aCluster) const
 
void createNuclei ()
 
void fillCluster (size_t idx1, size_t idx2)
 
void fillCluster (size_t idx1, size_t idx2, size_t idx3)
 
void fillCluster (size_t idx1, size_t idx2, size_t idx3, size_t idx4)
 
G4LorentzVector getClusterMomentum (const ClusterCandidate &aCluster) const
 
const G4InuclElementaryParticlegetHadron (size_t idx) const
 
bool goodCluster (const ClusterCandidate &clus) const
 
bool makeLightIon (const ClusterCandidate &aCluster)
 
G4double maxDeltaP (const ClusterCandidate &aCluster) const
 
bool nucleonUsed (size_t idx) const
 
void removeNucleons ()
 
void reportArgs (const G4String &name, const ClusterCandidate &clus) const
 
void reportResult (const G4String &name, const G4InuclNuclei &nucl) const
 
void selectCandidates ()
 
void tryClusters (size_t idx1, size_t idx2)
 
void tryClusters (size_t idx1, size_t idx2, size_t idx3)
 
void tryClusters (size_t idx1, size_t idx2, size_t idx3, size_t idx4)
 

Private Attributes

std::vector< ClusterCandidateallClusters
 
const G4double dpMaxAlpha
 
const G4double dpMaxDoublet
 
const G4double dpMaxTriplet
 
G4LorentzVector pCluster
 
ClusterCandidate thisCluster
 
G4CollisionOutputthisFinalState
 
const std::vector< G4InuclElementaryParticle > * thisHadrons
 
G4InuclNuclei thisLightIon
 
std::set< size_t > usedNucleons
 
G4int verboseLevel
 

Detailed Description

Definition at line 52 of file G4CascadeCoalescence.hh.

Member Typedef Documentation

◆ ClusterCandidate

typedef std::vector<size_t> G4CascadeCoalescence::ClusterCandidate
private

Definition at line 63 of file G4CascadeCoalescence.hh.

Constructor & Destructor Documentation

◆ G4CascadeCoalescence()

G4CascadeCoalescence::G4CascadeCoalescence ( G4int  verbose = 0)

◆ ~G4CascadeCoalescence()

G4CascadeCoalescence::~G4CascadeCoalescence ( )
virtual

Definition at line 72 of file G4CascadeCoalescence.cc.

72{}

Member Function Documentation

◆ allNucleons()

bool G4CascadeCoalescence::allNucleons ( const ClusterCandidate clus) const
private

Definition at line 287 of file G4CascadeCoalescence.cc.

287 {
288 bool result = true;
289 for (size_t i=0; i<clus.size(); i++)
290 result &= getHadron(clus[0]).nucleon();
291 return result;
292}
const G4InuclElementaryParticle & getHadron(size_t idx) const

References getHadron(), and G4InuclElementaryParticle::nucleon().

Referenced by goodCluster().

◆ clusterType()

G4int G4CascadeCoalescence::clusterType ( const ClusterCandidate aCluster) const
private

Definition at line 247 of file G4CascadeCoalescence.cc.

248 {
249 G4int type = 0;
250 for (size_t i=0; i<aCluster.size(); i++) {
251 const G4InuclElementaryParticle& had = getHadron(aCluster[i]);
252 type += had.nucleon() ? had.type() : 0;
253 }
254
255 return type;
256}
int G4int
Definition: G4Types.hh:85

References getHadron(), G4InuclElementaryParticle::nucleon(), and G4InuclElementaryParticle::type().

Referenced by goodCluster(), and makeLightIon().

◆ createNuclei()

void G4CascadeCoalescence::createNuclei ( )
private

Definition at line 179 of file G4CascadeCoalescence.cc.

179 {
180 if (verboseLevel)
181 G4cout << " >>> G4CascadeCoalescence::createNuclei()" << G4endl;
182
183 usedNucleons.clear();
184
185 for (size_t i=0; i<allClusters.size(); i++) {
186 if (verboseLevel>1) G4cout << " attempting candidate #" << i << G4endl;
187
188 const ClusterCandidate& cand = allClusters[i];
189 if (makeLightIon(cand)) { // Success, put ion in output
191 usedNucleons.insert(cand.begin(), cand.end());
192 }
193 }
194}
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
std::vector< ClusterCandidate > allClusters
std::vector< size_t > ClusterCandidate
bool makeLightIon(const ClusterCandidate &aCluster)
std::set< size_t > usedNucleons
void addOutgoingNucleus(const G4InuclNuclei &nuclei)

References G4CollisionOutput::addOutgoingNucleus(), allClusters, G4cout, G4endl, makeLightIon(), thisFinalState, thisLightIon, usedNucleons, and verboseLevel.

Referenced by FindClusters().

◆ fillCluster() [1/3]

void G4CascadeCoalescence::fillCluster ( size_t  idx1,
size_t  idx2 
)
private

Definition at line 261 of file G4CascadeCoalescence.cc.

261 {
262 thisCluster.clear();
263 thisCluster.push_back(idx1);
264 thisCluster.push_back(idx2);
265}
ClusterCandidate thisCluster

References thisCluster.

Referenced by tryClusters().

◆ fillCluster() [2/3]

void G4CascadeCoalescence::fillCluster ( size_t  idx1,
size_t  idx2,
size_t  idx3 
)
private

Definition at line 267 of file G4CascadeCoalescence.cc.

267 {
268 thisCluster.clear();
269 thisCluster.push_back(idx1);
270 thisCluster.push_back(idx2);
271 thisCluster.push_back(idx3);
272}

References thisCluster.

◆ fillCluster() [3/3]

void G4CascadeCoalescence::fillCluster ( size_t  idx1,
size_t  idx2,
size_t  idx3,
size_t  idx4 
)
private

Definition at line 274 of file G4CascadeCoalescence.cc.

275 {
276 thisCluster.clear();
277 thisCluster.push_back(idx1);
278 thisCluster.push_back(idx2);
279 thisCluster.push_back(idx3);
280 thisCluster.push_back(idx4);
281}

References thisCluster.

◆ FindClusters()

void G4CascadeCoalescence::FindClusters ( G4CollisionOutput finalState)

Definition at line 77 of file G4CascadeCoalescence.cc.

77 {
78 if (verboseLevel)
79 G4cout << " >>> G4CascadeCoalescence::FindClusters()" << G4endl;
80
81 thisFinalState = &finalState; // Save pointers for use in processing
82 thisHadrons = &finalState.getOutgoingParticles();
83
85
89
91}
void printCollisionOutput(std::ostream &os=G4cout) const
const std::vector< G4InuclElementaryParticle > & getOutgoingParticles() const

References createNuclei(), G4cout, G4endl, G4CollisionOutput::getOutgoingParticles(), G4CollisionOutput::printCollisionOutput(), removeNucleons(), selectCandidates(), thisFinalState, thisHadrons, and verboseLevel.

Referenced by G4IntraNucleiCascader::finishCascade().

◆ getClusterMomentum()

G4LorentzVector G4CascadeCoalescence::getClusterMomentum ( const ClusterCandidate aCluster) const
private

Definition at line 215 of file G4CascadeCoalescence.cc.

215 {
216 pCluster.set(0.,0.,0.,0.);
217 for (size_t i=0; i<aCluster.size(); i++)
218 pCluster += getHadron(aCluster[i]).getMomentum();
219
220 return pCluster;
221}
void set(double x, double y, double z, double t)
G4LorentzVector getMomentum() const

References getHadron(), G4InuclParticle::getMomentum(), pCluster, and CLHEP::HepLorentzVector::set().

Referenced by makeLightIon(), and maxDeltaP().

◆ getHadron()

const G4InuclElementaryParticle & G4CascadeCoalescence::getHadron ( size_t  idx) const
inlineprivate

Definition at line 106 of file G4CascadeCoalescence.hh.

106 {
107 return (*thisHadrons)[idx];
108 }

References thisHadrons.

Referenced by allNucleons(), clusterType(), getClusterMomentum(), maxDeltaP(), reportArgs(), and selectCandidates().

◆ goodCluster()

bool G4CascadeCoalescence::goodCluster ( const ClusterCandidate clus) const
private

Definition at line 297 of file G4CascadeCoalescence.cc.

297 {
298 if (verboseLevel>2) reportArgs("goodCluster?",clus);
299
300 if (!allNucleons(clus)) return false;
301
302 if (clus.size() == 2) // Deuterons (pn)
303 return (clusterType(clus) == 3 && maxDeltaP(clus) < dpMaxDoublet);
304
305 if (clus.size() == 3) // Tritons or He-3
306 return ((clusterType(clus) == 4 || clusterType(clus) == 5) // ppn OR pnn
307 && maxDeltaP(clus) < dpMaxTriplet);
308
309 if (clus.size() == 4) // Alphas (ppnn)
310 return (clusterType(clus) == 6 && maxDeltaP(clus) < dpMaxAlpha);
311
312 return false;
313}
void reportArgs(const G4String &name, const ClusterCandidate &clus) const
G4int clusterType(const ClusterCandidate &aCluster) const
bool allNucleons(const ClusterCandidate &clus) const
G4double maxDeltaP(const ClusterCandidate &aCluster) const

References allNucleons(), clusterType(), dpMaxAlpha, dpMaxDoublet, dpMaxTriplet, maxDeltaP(), reportArgs(), and verboseLevel.

Referenced by tryClusters().

◆ makeLightIon()

bool G4CascadeCoalescence::makeLightIon ( const ClusterCandidate aCluster)
private

Definition at line 319 of file G4CascadeCoalescence.cc.

319 {
320 if (verboseLevel>1) reportArgs("makeLightIon",aCluster);
321
322 thisLightIon.clear(); // Initialize nucleus buffer before filling
323
324 if (aCluster.size()<2) return false; // Sanity check
325
326 G4int A = aCluster.size();
327 G4int Z = -1;
328
329 G4int type = clusterType(aCluster);
330 if (A==2 && type==3) Z = 1; // Deuteron (pn)
331 if (A==3 && type==5) Z = 1; // Triton (pnn)
332 if (A==3 && type==4) Z = 2; // He-3 (ppn)
333 if (A==4 && type==6) Z = 2; // He-4/alpha (ppnn)
334
335 if (Z < 0) return false; // Invalid cluster content
336
337 // NOTE: Four-momentum will not be conserved due to binding energy
338 thisLightIon.fill(getClusterMomentum(aCluster), A, Z, 0.,
340
341 if (verboseLevel>1) reportResult("makeLightIon output",thisLightIon);
342 return true;
343}
const G4int Z[17]
const G4double A[17]
G4LorentzVector getClusterMomentum(const ClusterCandidate &aCluster) const
void reportResult(const G4String &name, const G4InuclNuclei &nucl) const
void fill(G4int a, G4int z, G4double exc=0., Model model=DefaultModel)

References A, G4InuclNuclei::clear(), clusterType(), G4InuclParticle::Coalescence, G4InuclNuclei::fill(), getClusterMomentum(), reportArgs(), reportResult(), thisLightIon, verboseLevel, and Z.

Referenced by createNuclei().

◆ maxDeltaP()

G4double G4CascadeCoalescence::maxDeltaP ( const ClusterCandidate aCluster) const
private

Definition at line 226 of file G4CascadeCoalescence.cc.

226 {
227 if (verboseLevel>1) reportArgs("maxDeltaP", aCluster);
228
229 G4ThreeVector boost = getClusterMomentum(aCluster).boostVector();
230
231 G4double dp, maxDP = -1.;
232 for (size_t i=0; i<aCluster.size(); i++) {
233 const G4InuclElementaryParticle& nucl = getHadron(aCluster[i]);
234
235 // NOTE: getMomentum() returns by value, event kinematics are not changed
236 if ((dp = nucl.getMomentum().boost(-boost).rho()) > maxDP) maxDP = dp;
237 }
238
239 if (verboseLevel>1) G4cout << " maxDP = " << maxDP << G4endl;
240
241 return maxDP;
242}
double G4double
Definition: G4Types.hh:83
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)

References CLHEP::HepLorentzVector::boost(), CLHEP::HepLorentzVector::boostVector(), G4cout, G4endl, getClusterMomentum(), getHadron(), G4InuclParticle::getMomentum(), reportArgs(), CLHEP::HepLorentzVector::rho(), and verboseLevel.

Referenced by goodCluster().

◆ nucleonUsed()

bool G4CascadeCoalescence::nucleonUsed ( size_t  idx) const
inlineprivate

Definition at line 96 of file G4CascadeCoalescence.hh.

96 {
97 return usedNucleons.find(idx) != usedNucleons.end();
98 }

References usedNucleons.

Referenced by tryClusters().

◆ removeNucleons()

void G4CascadeCoalescence::removeNucleons ( )
private

Definition at line 199 of file G4CascadeCoalescence.cc.

199 {
200 if (verboseLevel>1)
201 G4cout << " >>> G4CascadeCoalescence::removeNucleons()" << G4endl;
202
203 // Remove nucleons from output from last to first (to preserve indexing)
204 std::set<size_t>::reverse_iterator usedIter;
205 for (usedIter = usedNucleons.rbegin(); usedIter != usedNucleons.rend(); ++usedIter)
207
208 usedNucleons.clear();
209}
void removeOutgoingParticle(G4int index)

References G4cout, G4endl, G4CollisionOutput::removeOutgoingParticle(), thisFinalState, usedNucleons, and verboseLevel.

Referenced by FindClusters().

◆ reportArgs()

void G4CascadeCoalescence::reportArgs ( const G4String name,
const ClusterCandidate clus 
) const
private

Definition at line 348 of file G4CascadeCoalescence.cc.

349 {
350 G4cout << " >>> G4CascadeCoalescence::" << name << " ";
351 std::copy(aCluster.begin(), aCluster.end(),
352 std::ostream_iterator<size_t>(G4cout, " "));
353 G4cout << G4endl;
354
355 if (verboseLevel>2) {
356 for (size_t i=0; i<aCluster.size(); i++)
357 G4cout << getHadron(aCluster[i]) << G4endl;
358 }
359}
const char * name(G4int ptype)
void copy(G4double dst[], const G4double src[], size_t size=G4FieldTrack::ncompSVEC)
Definition: G4FieldUtils.cc:98

References field_utils::copy(), G4cout, G4endl, getHadron(), G4InuclParticleNames::name(), and verboseLevel.

Referenced by goodCluster(), makeLightIon(), maxDeltaP(), and tryClusters().

◆ reportResult()

void G4CascadeCoalescence::reportResult ( const G4String name,
const G4InuclNuclei nucl 
) const
private

Definition at line 361 of file G4CascadeCoalescence.cc.

362 {
363 G4cout << " >>> G4CascadeCoalescence::" << name << G4endl << nucl << G4endl;
364}

References G4cout, G4endl, and G4InuclParticleNames::name().

Referenced by makeLightIon().

◆ selectCandidates()

void G4CascadeCoalescence::selectCandidates ( )
private

Definition at line 96 of file G4CascadeCoalescence.cc.

96 {
97 if (verboseLevel)
98 G4cout << " >>> G4CascadeCoalescence::selectCandidates()" << G4endl;
99
100 allClusters.clear();
101 usedNucleons.clear();
102
103 size_t nHad = thisHadrons->size();
104 for (size_t idx1=0; idx1<nHad; idx1++) {
105 if (!getHadron(idx1).nucleon()) continue;
106 for (size_t idx2=idx1+1; idx2<nHad; idx2++) {
107 if (!getHadron(idx2).nucleon()) continue;
108 for (size_t idx3=idx2+1; idx3<nHad; idx3++) {
109 if (!getHadron(idx3).nucleon()) continue;
110 for (size_t idx4=idx3+1; idx4<nHad; idx4++) {
111 if (!getHadron(idx4).nucleon()) continue;
112 tryClusters(idx1, idx2, idx3, idx4);
113 }
114 tryClusters(idx1, idx2, idx3); // If idx4 loop was empty
115 }
116 tryClusters(idx1, idx2); // If idx3 loop was empty
117 }
118 }
119
120 // All potential candidates built; report statistics
121 if (verboseLevel>1) {
122 G4cout << " Found " << allClusters.size() << " candidates, using "
123 << usedNucleons.size() << " nucleons" << G4endl;
124 }
125}
void tryClusters(size_t idx1, size_t idx2)
G4bool nucleon(G4int ityp)

References allClusters, G4cout, G4endl, getHadron(), G4InuclParticleNames::nucleon(), thisHadrons, tryClusters(), usedNucleons, and verboseLevel.

Referenced by FindClusters().

◆ setVerboseLevel()

void G4CascadeCoalescence::setVerboseLevel ( G4int  verbose)
inline

◆ tryClusters() [1/3]

void G4CascadeCoalescence::tryClusters ( size_t  idx1,
size_t  idx2 
)
private

Definition at line 163 of file G4CascadeCoalescence.cc.

163 {
164 if (nucleonUsed(idx1) || nucleonUsed(idx2)) return;
165
166 fillCluster(idx1,idx2);
167 if (verboseLevel>1) reportArgs("tryClusters",thisCluster);
168
170 allClusters.push_back(thisCluster);
171 usedNucleons.insert(idx1);
172 usedNucleons.insert(idx2);
173 }
174}
bool goodCluster(const ClusterCandidate &clus) const
void fillCluster(size_t idx1, size_t idx2)
bool nucleonUsed(size_t idx) const

References allClusters, fillCluster(), goodCluster(), nucleonUsed(), reportArgs(), thisCluster, usedNucleons, and verboseLevel.

Referenced by selectCandidates().

◆ tryClusters() [2/3]

void G4CascadeCoalescence::tryClusters ( size_t  idx1,
size_t  idx2,
size_t  idx3 
)
private

Definition at line 148 of file G4CascadeCoalescence.cc.

148 {
149 if (nucleonUsed(idx1) || nucleonUsed(idx2) || nucleonUsed(idx3)) return;
150
151 fillCluster(idx1,idx2,idx3);
152 if (verboseLevel>1) reportArgs("tryClusters",thisCluster);
153
155 allClusters.push_back(thisCluster);
156 usedNucleons.insert(idx1);
157 usedNucleons.insert(idx2);
158 usedNucleons.insert(idx3);
159 }
160}

References allClusters, fillCluster(), goodCluster(), nucleonUsed(), reportArgs(), thisCluster, usedNucleons, and verboseLevel.

◆ tryClusters() [3/3]

void G4CascadeCoalescence::tryClusters ( size_t  idx1,
size_t  idx2,
size_t  idx3,
size_t  idx4 
)
private

Definition at line 130 of file G4CascadeCoalescence.cc.

131 {
132 if (nucleonUsed(idx1) || nucleonUsed(idx2) ||
133 nucleonUsed(idx3) || nucleonUsed(idx4)) return;
134
135 fillCluster(idx1,idx2,idx3,idx4);
136 if (verboseLevel>1) reportArgs("tryClusters",thisCluster);
137
139 allClusters.push_back(thisCluster);
140 usedNucleons.insert(idx1);
141 usedNucleons.insert(idx2);
142 usedNucleons.insert(idx3);
143 usedNucleons.insert(idx4);
144 }
145}

References allClusters, fillCluster(), goodCluster(), nucleonUsed(), reportArgs(), thisCluster, usedNucleons, and verboseLevel.

Field Documentation

◆ allClusters

std::vector<ClusterCandidate> G4CascadeCoalescence::allClusters
private

Definition at line 67 of file G4CascadeCoalescence.hh.

Referenced by createNuclei(), selectCandidates(), and tryClusters().

◆ dpMaxAlpha

const G4double G4CascadeCoalescence::dpMaxAlpha
private

Definition at line 78 of file G4CascadeCoalescence.hh.

Referenced by goodCluster().

◆ dpMaxDoublet

const G4double G4CascadeCoalescence::dpMaxDoublet
private

Definition at line 76 of file G4CascadeCoalescence.hh.

Referenced by goodCluster().

◆ dpMaxTriplet

const G4double G4CascadeCoalescence::dpMaxTriplet
private

Definition at line 77 of file G4CascadeCoalescence.hh.

Referenced by goodCluster().

◆ pCluster

G4LorentzVector G4CascadeCoalescence::pCluster
mutableprivate

Definition at line 115 of file G4CascadeCoalescence.hh.

Referenced by getClusterMomentum().

◆ thisCluster

ClusterCandidate G4CascadeCoalescence::thisCluster
private

Definition at line 73 of file G4CascadeCoalescence.hh.

Referenced by fillCluster(), and tryClusters().

◆ thisFinalState

G4CollisionOutput* G4CascadeCoalescence::thisFinalState
private

Definition at line 70 of file G4CascadeCoalescence.hh.

Referenced by createNuclei(), FindClusters(), and removeNucleons().

◆ thisHadrons

const std::vector<G4InuclElementaryParticle>* G4CascadeCoalescence::thisHadrons
private

Definition at line 71 of file G4CascadeCoalescence.hh.

Referenced by FindClusters(), getHadron(), and selectCandidates().

◆ thisLightIon

G4InuclNuclei G4CascadeCoalescence::thisLightIon
private

Definition at line 74 of file G4CascadeCoalescence.hh.

Referenced by createNuclei(), and makeLightIon().

◆ usedNucleons

std::set<size_t> G4CascadeCoalescence::usedNucleons
private

◆ verboseLevel

G4int G4CascadeCoalescence::verboseLevel
private

The documentation for this class was generated from the following files: