ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ParticleHPEnAngCorrelation.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4ParticleHPEnAngCorrelation.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 // particle_hp -- source file
27 // J.P. Wellisch, Nov-1996
28 // A prototype of the low energy neutron transport model.
29 //
30 // 100413 Fix bug in incidence energy by T. Koi
31 //
32 // P. Arce, June-2014 Conversion neutron_hp to particle_hp
33 //
34 // June-2019 - E. Mendoza --> Part of the code trying to preserve the baryonic number has been deleted. One has to assume that it is not preserved when using ENDF-6 data and it caused problems.
35 
37 #include "G4LorentzRotation.hh"
38 #include "G4LorentzVector.hh"
39 #include "G4RotationMatrix.hh"
40 #include "G4IonTable.hh"
41 
43 {
44  G4ReactionProduct * result = new G4ReactionProduct;
45 
46  // do we have an appropriate distribution
47  if(nProducts!=1) throw G4HadronicException(__FILE__, __LINE__, "More than one product in SampleOne");
48 
49  // get the result
50  G4ReactionProductVector * temp=0;
51  G4int i=0;
52 
53  G4int icounter=0;
54  G4int icounter_max=1024;
55  while(temp == 0) {
56  icounter++;
57  if ( icounter > icounter_max ) {
58  G4cout << "Loop-counter exceeded the threshold value at " << __LINE__ << "th line of " << __FILE__ << "." << G4endl;
59  break;
60  }
61  temp = theProducts[i++].Sample(anEnergy,1);
62  }
63 
64  // is the multiplicity correct
65  if(temp->size()!=1) throw G4HadronicException(__FILE__, __LINE__, "SampleOne: Yield not correct");
66 
67  // fill result
68  result = temp->operator[](0);
69 
70  // some garbage collection
71  delete temp;
72 
73  // return result
74  return result;
75 }
76 
78 {
80  G4int i;
82  G4ReactionProduct theCMS;
84 
85  if(frameFlag==2
86  || frameFlag==3) // Added for particle HP
87  {
88  // simplify and double check @
89  G4ThreeVector the3IncidentPart = fCache.Get().theProjectileRP->GetMomentum(); //theProjectileRP has value in LAB
90  G4double nEnergy = fCache.Get().theProjectileRP->GetTotalEnergy();
91  G4ThreeVector the3Target = fCache.Get().theTarget->GetMomentum(); //theTarget has value in LAB
92  G4double tEnergy = fCache.Get().theTarget->GetTotalEnergy();
93  G4double totE = nEnergy+tEnergy;
94  G4ThreeVector the3CMS = the3Target+the3IncidentPart;
95  theCMS.SetMomentum(the3CMS);
96  G4double cmsMom = std::sqrt(the3CMS*the3CMS);
97  G4double sqrts = std::sqrt((totE-cmsMom)*(totE+cmsMom));
98  theCMS.SetMass(sqrts);
99  theCMS.SetTotalEnergy(totE);
100  G4ReactionProduct aIncidentPart;
101  aIncidentPart.Lorentz(*fCache.Get().theProjectileRP, theCMS);
102  //TKDB 100413
103  //ENDF-6 Formats Manual ENDF-102
104  //CHAPTER 6. FILE 6: PRODUCT ENERGY-ANGLE DISTRIBUTIONS
105  //LCT Reference system for secondary energy and angle (incident energy is always given in the LAB system)
106  //anEnergy = aIncidentPart.GetKineticEnergy();
107  anEnergy = fCache.Get().theProjectileRP->GetKineticEnergy(); //should be same argumment of "anEnergy"
108 
109  G4LorentzVector Ptmp (aIncidentPart.GetMomentum(), aIncidentPart.GetTotalEnergy());
110 
111  toZ.rotateZ(-1*Ptmp.phi());
112  toZ.rotateY(-1*Ptmp.theta());
113  }
114  fCache.Get().theTotalMeanEnergy=0;
115  G4LorentzRotation toLab(toZ.inverse()); //toLab only change axis NOT to LAB system
116 
117  for(i=0; i<nProducts; i++)
118  {
119  G4int nPart = theProducts[i].GetMultiplicity(anEnergy);
120  //- if( nParticles[i] == 0 ) continue;
121  it = theProducts[i].Sample(anEnergy,nPart);
123  // if( getenv("G4PHPTEST") ) G4cout << " EnAnG energy sampled " << it->operator[](0)->GetKineticEnergy() << " aMeanEnergy " << aMeanEnergy << G4endl; // GDEB
124  //if(aMeanEnergy>0)
125  //151120 TK Modified for solving reproducibility problem
126  //This change may have side effect.
127  if(aMeanEnergy>=0)
128  {
129  fCache.Get().theTotalMeanEnergy += aMeanEnergy;
130  }
131  else
132  {
133  fCache.Get().theTotalMeanEnergy = anEnergy/nProducts+theProducts[i].GetQValue();
134  }
135  if(it!=0)
136  {
137  for(unsigned int ii=0; ii<it->size(); ii++)
138  {
139  //if(!std::getenv("G4PHP_NO_LORENTZ_BOOST")) {
140  G4LorentzVector pTmp1 (it->operator[](ii)->GetMomentum(),
141  it->operator[](ii)->GetTotalEnergy());
142  pTmp1 = toLab*pTmp1;
143  if( std::getenv("G4PHPTEST") ) G4cout << " G4particleHPEnAngCorrelation COS THETA " << std::cos(it->operator[](ii)->GetMomentum().theta()) << G4endl;
144  it->operator[](ii)->SetMomentum(pTmp1.vect());
145  it->operator[](ii)->SetTotalEnergy(pTmp1.e());
146  if( std::getenv("G4PHPTEST") ) G4cout << " G4particleHPEnAngCorrelation COS THETA after toLab " << std::cos(it->operator[](ii)->GetMomentum().theta()) << G4endl;
147 
148  if(frameFlag==1) // target rest //TK 100413 should be LAB?
149  {
150  it->operator[](ii)->Lorentz(*(it->operator[](ii)), -1.*(*fCache.Get().theTarget)); //TK 100413 Is this really need?
151  }
152  else if(frameFlag==2 ) // CMS
153  {
154 #ifdef G4PHPDEBUG
155  if( std::getenv("G4ParticleHPDebug") )
156  G4cout <<"G4ParticleHPEnAngCorrelation: before Lorentz boost "<<
157  it->at(ii)->GetKineticEnergy()<<" "<<
158  it->at(ii)->GetMomentum()<<G4endl;
159 #endif
160  it->operator[](ii)->Lorentz(*(it->operator[](ii)), -1.*theCMS);
161 #ifdef G4PHPDEBUG
162  if( std::getenv("G4ParticleHPDebug") )
163  G4cout <<"G4ParticleHPEnAngCorrelation: after Lorentz boost "<<
164  it->at(ii)->GetKineticEnergy()<<" "<<
165  it->at(ii)->GetMomentum()<<G4endl;
166 #endif
167  }
168  //TK120515 migrate frameFlag (MF6 LCT) = 3
169  else if(frameFlag==3) // CMS A<=4 other LAB
170  {
171  if ( theProducts[i].GetMassCode() > 2004.5 ) //Alpha AWP 3.96713
172  {
173  //LAB
174  it->operator[](ii)->Lorentz(*(it->operator[](ii)), -1.*(*fCache.Get().theTarget)); //TK 100413 Is this really need?
175 #ifdef G4PHPDEBUG
176  if( std::getenv("G4ParticleHPDebug") )
177  G4cout <<"G4ParticleHPEnAngCorrelation: after Lorentz boost "<<
178  it->at(ii)->GetKineticEnergy()<<" "<<
179  it->at(ii)->GetMomentum()<<G4endl;
180 #endif
181  }
182  else
183  {
184  //CMS
185  it->operator[](ii)->Lorentz(*(it->operator[](ii)), -1.*theCMS);
186 #ifdef G4PHPDEBUG
187  if( std::getenv("G4ParticleHPDebug") )
188  G4cout <<"G4ParticleHPEnAngCorrelation: after Lorentz boost "<<
189  it->at(ii)->GetKineticEnergy()<<" "<<
190  it->at(ii)->GetMomentum()<<G4endl;
191 #endif
192  }
193  }
194  else
195  {
196  throw G4HadronicException(__FILE__, __LINE__, "G4ParticleHPEnAngCorrelation::Sample: The frame of the finalstate is not specified");
197  }
198  if( std::getenv("G4PHPTEST") ) G4cout << frameFlag << " G4particleHPEnAngCorrelation COS THETA after Lorentz " << std::cos(it->operator[](ii)->GetMomentum().theta()) << G4endl;
199 
200  // }//getenv("G4PHP_NO_LORENTZ_BOOST"))
201  // G4cout << ii << " EnAnG energy after boost " << it->operator[](ii)->GetKineticEnergy() << G4endl; //GDEB
202  result->push_back(it->operator[](ii));
203  }
204  delete it;
205  }
206  }
207 
208  return result;
209 }
210