Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ExcitedStringDecay.cc
Go to the documentation of this file.
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// Historic fragment from M.Komogorov; clean-up still necessary @@@
27
29#include "G4SystemOfUnits.hh"
30#include "G4KineticTrack.hh"
31
33 theStringDecay(0)
34{}
35
38 theStringDecay(aStringDecay)
39{}
40
43 theStringDecay(0)
44{
45 throw G4HadronicException(__FILE__, __LINE__, "G4ExcitedStringDecay::copy ctor not accessible");
46}
47
49{
50}
51
52const G4ExcitedStringDecay & G4ExcitedStringDecay::operator=(const G4ExcitedStringDecay &)
53{
54 throw G4HadronicException(__FILE__, __LINE__, "G4ExcitedStringDecay::operator= meant to not be accessable");
55 return *this;
56}
57
58int G4ExcitedStringDecay::operator==(const G4ExcitedStringDecay &) const
59{
60 return 0;
61}
62
63int G4ExcitedStringDecay::operator!=(const G4ExcitedStringDecay &) const
64{
65 return 1;
66}
67
68G4KineticTrackVector *G4ExcitedStringDecay::FragmentString
69 (const G4ExcitedString &theString)
70{
71 if ( theStringDecay == NULL )
72
73 theStringDecay=new G4LundStringFragmentation();
74
75 return theStringDecay->FragmentString(theString);
76}
77
79 (const G4ExcitedStringVector * theStrings)
80{
81 G4LorentzVector KTsum(0.,0.,0.,0.);
82
83//G4cout<<"theStrings->size() "<<theStrings->size()<<G4endl;
84 for ( unsigned int astring=0; astring < theStrings->size(); astring++)
85 {
86 KTsum+= theStrings->operator[](astring)->Get4Momentum();
87 }
88
90 G4int attempts(0);
91 G4bool success=false;
92 G4bool NeedEnergyCorrector=false;
93 do {
94 //G4cout<<"Check of momentum at string fragmentations. New try."<<G4endl;
95 std::for_each(theResult->begin() , theResult->end() , DeleteKineticTrack());
96 theResult->clear();
97
98 attempts++;
99 //G4cout<<G4endl<<"attempts "<<attempts<<G4endl;
100 G4LorentzVector KTsecondaries(0.,0.,0.,0.);
101 NeedEnergyCorrector=false;
102
103 for ( unsigned int astring=0; astring < theStrings->size(); astring++)
104 {
105 //G4cout<<"String No "<<astring+1<<" "<<theStrings->operator[](astring)->Get4Momentum().mag2()<<" "<<theStrings->operator[](astring)->GetRightParton()->GetPDGcode()<<" "<<theStrings->operator[](astring)->GetLeftParton()->GetPDGcode()<<" "<<theStrings->operator[](astring)->Get4Momentum()<<G4endl;
106 //G4int Uzhi; G4cin >>Uzhi;
107 G4KineticTrackVector * generatedKineticTracks = NULL;
108 if ( theStrings->operator[](astring)->IsExcited() )
109 {
110 //G4cout<<"Fragment String"<<G4endl;
111 generatedKineticTracks=FragmentString(*theStrings->operator[](astring));
112 } else {
113 generatedKineticTracks = new G4KineticTrackVector;
114 generatedKineticTracks->push_back(theStrings->operator[](astring)->GetKineticTrack());
115 }
116
117 if (generatedKineticTracks == NULL)
118 {
119 G4cerr << "G4VPartonStringModel:No KineticTracks produced" << G4endl;
120 continue;
121 }
122
123 G4LorentzVector KTsum1(0.,0.,0.,0.);
124 for ( unsigned int aTrack=0; aTrack<generatedKineticTracks->size();aTrack++)
125 {
126 //--debug-- G4cout<<"Prod part "<<(*generatedKineticTracks)[aTrack]->GetDefinition()->GetParticleName()<<" "<<(*generatedKineticTracks)[aTrack]->Get4Momentum()<<G4endl;
127 theResult->push_back(generatedKineticTracks->operator[](aTrack));
128 KTsum1+= (*generatedKineticTracks)[aTrack]->Get4Momentum();
129 }
130 KTsecondaries+=KTsum1;
131
132 //--debug--G4cout << "String secondaries(" <<generatedKineticTracks->size()<< ") momentum: "
133 //--debug--<< theStrings->operator[](astring)->Get4Momentum() << " " << KTsum1 << G4endl;
134 if ( KTsum1.e() > 0 && std::abs((KTsum1.e()-theStrings->operator[](astring)->Get4Momentum().e()) / KTsum1.e()) > perMillion )
135 {
136 //--debug-- G4cout << "String secondaries(" <<generatedKineticTracks->size()<< ") momentum: "
137 //--debug-- << theStrings->operator[](astring)->Get4Momentum() << " " << KTsum1 << G4endl;
138 NeedEnergyCorrector=true;
139 }
140
141// clean up
142 delete generatedKineticTracks;
143 }
144 //--debug G4cout << "Initial Strings / secondaries total 4 momentum " << KTsum << " " <<KTsecondaries << G4endl;
145
146 success=true;
147 //G4cout<<"success "<<success<<G4endl;
148 if ( NeedEnergyCorrector ) success=EnergyAndMomentumCorrector(theResult, KTsum);
149 //G4cout<<"success after Ecorr "<<success<<G4endl;
150 } while(!success && (attempts < 10)); // It was 100 !!! Uzhi
151 //G4cout<<"End frag string"<<G4endl;
152
153#ifdef debug_ExcitedStringDecay
154 G4LorentzVector KTsum1=0;
155 for ( unsigned int aTrack=0; aTrack<theResult->size();aTrack++)
156 {
157 G4cout << " corrected tracks .. " << (*theResult)[aTrack]->GetDefinition()->GetParticleName()
158 <<" " << (*theResult)[aTrack]->Get4Momentum() << G4endl;
159 KTsum1+= (*theResult)[aTrack]->Get4Momentum();
160 }
161
162 G4cout << "Needcorrector/success " << NeedEnergyCorrector << "/" << success << ", Corrected total 4 momentum " << KTsum1 << G4endl;
163 if ( ! success ) G4cout << "failed to correct E/p" << G4endl;
164#endif
165
166 return theResult;
167}
168
169G4bool G4ExcitedStringDecay::EnergyAndMomentumCorrector
170 (G4KineticTrackVector* Output, G4LorentzVector& TotalCollisionMom)
171 {
172 const int nAttemptScale = 500;
173 const double ErrLimit = 1.E-5;
174 if (Output->empty())
175 return TRUE;
176 G4LorentzVector SumMom;
177 G4double SumMass = 0;
178 G4double TotalCollisionMass = TotalCollisionMom.m();
179
180//G4cout<<G4endl<<"EnergyAndMomentumCorrector "<<Output->size()<<G4endl;
181 // Calculate sum hadron 4-momenta and summing hadron mass
182 unsigned int cHadron;
183 for(cHadron = 0; cHadron < Output->size(); cHadron++)
184 {
185 SumMom += Output->operator[](cHadron)->Get4Momentum();
186 SumMass += Output->operator[](cHadron)->GetDefinition()->GetPDGMass();
187 }
188
189//G4cout<<"SumMass TotalCollisionMass "<<SumMass<<" "<<TotalCollisionMass<<G4endl;
190
191 // Cannot correct a single particle
192 if (Output->size() < 2) return FALSE;
193
194 if (SumMass > TotalCollisionMass) return FALSE;
195 SumMass = SumMom.m2();
196 if (SumMass < 0) return FALSE;
197 SumMass = std::sqrt(SumMass);
198
199 // Compute c.m.s. hadron velocity and boost KTV to hadron c.m.s.
200 G4ThreeVector Beta = -SumMom.boostVector();
201 Output->Boost(Beta);
202
203 // Scale total c.m.s. hadron energy (hadron system mass).
204 // It should be equal interaction mass
205 G4double Scale = 1;
206 G4int cAttempt = 0;
207 G4double Sum = 0;
208 G4bool success = false;
209 for(cAttempt = 0; cAttempt < nAttemptScale; cAttempt++)
210 {
211 Sum = 0;
212 for(cHadron = 0; cHadron < Output->size(); cHadron++)
213 {
214 G4LorentzVector HadronMom = Output->operator[](cHadron)->Get4Momentum();
215 HadronMom.setVect(Scale*HadronMom.vect());
216 G4double E = std::sqrt(HadronMom.vect().mag2() + sqr(Output->operator[](cHadron)->GetDefinition()->GetPDGMass()));
217 HadronMom.setE(E);
218 Output->operator[](cHadron)->Set4Momentum(HadronMom);
219 Sum += E;
220 }
221 Scale = TotalCollisionMass/Sum;
222#ifdef debug_G4ExcitedStringDecay
223 G4cout << "Scale-1=" << Scale -1
224 << ", TotalCollisionMass=" << TotalCollisionMass
225 << ", Sum=" << Sum
226 << G4endl;
227#endif
228 if (std::fabs(Scale - 1) <= ErrLimit)
229 {
230 success = true;
231 break;
232 }
233 }
234#ifdef debug_G4ExcitedStringDecay
235 if(!success)
236 {
237 G4cout << "G4ExcitedStringDecay::EnergyAndMomentumCorrector - Warning"<<G4endl;
238 G4cout << " Scale not unity at end of iteration loop: "<<TotalCollisionMass<<" "<<Sum<<" "<<Scale<<G4endl;
239 G4cout << " Number of secondaries: " << Output->size() << G4endl;
240 G4cout << " Wanted total energy: " << TotalCollisionMom.e() << G4endl;
241 G4cout << " Increase number of attempts or increase ERRLIMIT"<<G4endl;
242// throw G4HadronicException(__FILE__, __LINE__, "G4ExcitedStringDecay failed to correct...");
243 }
244#endif
245 // Compute c.m.s. interaction velocity and KTV back boost
246 Beta = TotalCollisionMom.boostVector();
247 Output->Boost(Beta);
248
249 return success;
250 }
std::vector< G4ExcitedString * > G4ExcitedStringVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
double mag2() const
Hep3Vector boostVector() const
Hep3Vector vect() const
void setVect(const Hep3Vector &)
virtual G4KineticTrackVector * FragmentStrings(const G4ExcitedStringVector *theStrings)
void Boost(G4ThreeVector &Velocity)
virtual G4KineticTrackVector * FragmentString(const G4ExcitedString &theString)=0
#define TRUE
Definition: globals.hh:55
#define FALSE
Definition: globals.hh:52
T sqr(const T &x)
Definition: templates.hh:145