Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ChiralInvariantPhaseSpace.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 
27 // Modified:
28 // 24.08.10 A. Dotti (andrea.dotti@cern.ch) handle exceptions
29 // thrown by Q4QEnvironment::Fragment retying interaction
30 // 17.06.10 A. Dotti (andrea.dotti@cern.ch) handle case in which
31 // Q4QEnvironment returns a 90000000 fragment (see code comments)
32 
33 // Created:
34 // 16.01.08 V.Ivanchenko use initialization similar to other CHIPS models
35 //
36 
38 #include "G4SystemOfUnits.hh"
39 #include "G4ParticleTable.hh"
40 #include "G4LorentzVector.hh"
41 #include "G4DynamicParticle.hh"
42 #include "G4IonTable.hh"
43 #include "G4Neutron.hh"
44 #include "G4Gamma.hh"
45 
47 {}
48 
50 {}
51 
53  const G4HadProjectile& aTrack,
54  G4Nucleus& aTargetNucleus,
55  G4HadFinalState * aChange)
56 {
57  G4HadFinalState * aResult;
58  if(aChange != 0)
59  {
60  aResult = aChange;
61  }
62  else
63  {
64  aResult = & theResult;
65  aResult->Clear();
66  aResult->SetStatusChange(stopAndKill);
67  }
68  //projectile properties needed in constructor of quasmon
69  G4LorentzVector proj4Mom;
70  proj4Mom = aTrack.Get4Momentum();
71  G4int projectilePDGCode = aTrack.GetDefinition()
72  ->GetPDGEncoding();
73 
74  //target properties needed in constructor of quasmon
75  G4int targetZ = aTargetNucleus.GetZ_asInt();
76  G4int targetA = aTargetNucleus.GetA_asInt();
77  G4int targetPDGCode = 90000000 + 1000*targetZ + (targetA-targetZ);
78  // NOT NECESSARY ______________
80  ->GetIonMass(targetZ, targetA);
81  G4LorentzVector targ4Mom(0.,0.,0.,targetMass);
82  // END OF NOT NECESSARY^^^^^^^^
83 
84  // V.Ivanchenko set the same value as for other CHIPS models
85  G4int nop = 152;
86  //G4int nop = 164; // nuclear clusters up to A=21
87  G4double fractionOfSingleQuasiFreeNucleons = 0.4;
88  G4double fractionOfPairedQuasiFreeNucleons = 0.0;
89  if(targetA>27) fractionOfPairedQuasiFreeNucleons = 0.04;
90  G4double clusteringCoefficient = 4.;
91  G4double temperature = 180.;
92  G4double halfTheStrangenessOfSee = 0.1; // = s/d = s/u
93  G4double etaToEtaPrime = 0.3;
94 
95  // construct and fragment the quasmon
96  //G4QCHIPSWorld aWorld(nop); // Create CHIPS World of nop particles
97  G4QCHIPSWorld::Get()->GetParticles(nop); // Create CHIPS World of nop particles
98  G4QNucleus::SetParameters(fractionOfSingleQuasiFreeNucleons,
99  fractionOfPairedQuasiFreeNucleons,
100  clusteringCoefficient);
101  G4Quasmon::SetParameters(temperature,
102  halfTheStrangenessOfSee,
103  etaToEtaPrime);
104  // G4QEnvironment::SetParameters(solidAngle);
105 // G4cout << "Input info "<< projectilePDGCode << " "
106 // << targetPDGCode <<" "
107 // << 1./MeV*proj4Mom<<" "
108 // << 1./MeV*targ4Mom << " "
109 // << nop << G4endl;
110  G4QHadronVector projHV;
111  G4QHadron* iH = new G4QHadron(projectilePDGCode, 1./MeV*proj4Mom);
112  projHV.push_back(iH);
113 
114  //AND
115  //A. Dotti 24 Aug. : Trying to handle situation when G4QEnvironment::Fragment throws an exception
116  // Seen by ATLAS for gamma+Nuclear interaction for Gamma@2.4GeV on Al
117  // The poor-man solution here is to re-try interaction if a G4QException is catched
118  // Warning: G4QExcpetion does NOT inherit from base class G4HadException
119  G4QHadronVector* output=0;
120 
121  bool retry=true;
122  int retryes=0;
123  int maxretries=10;
124 
125  while ( retry && retryes < maxretries )
126  {
127  G4QEnvironment* pan= new G4QEnvironment(projHV, targetPDGCode);
128 
129  try
130  {
131  ++retryes;
132  output = pan->Fragment();
133  retry=false;//If here, Fragment did not throw! (AND)
134  }
135  catch( ... )
136  {
137  G4cerr << "***WARNING*** Exception thrown passing through G4ChiralInvariantPhaseSpace "<<G4endl;
138  G4cerr << " targetPDGCode = "<< targetPDGCode <<G4endl;
139  G4cerr << " Dumping the information in the pojectile list"<<G4endl;
140  for(size_t i=0; i< projHV.size(); i++)
141  {
142  G4cerr <<" Incoming 4-momentum and PDG code of "<<i<<"'th hadron: "
143  <<" "<< projHV[i]->Get4Momentum()<<" "<<projHV[i]->GetPDGCode()<<G4endl;
144  }
145  G4cerr << "Retrying interaction "<<G4endl; //AND
146  //throw; //AND
147  }
148  delete pan;
149  } //AND
150  if ( retryes >= maxretries ) //AND
151  {
152  G4cerr << "***ERROR*** Maximum number of retries ("<<maxretries<<") reached for G4QEnvironment::Fragment(), exception is being thrown" << G4endl;
153  throw G4HadronicException(__FILE__,__LINE__,"G4ChiralInvariantPhaseSpace::ApplyYourself(...) - Maximum number of re-tries reached, abandon interaction");
154  }
155 
156  // Fill the particle change.
157  G4DynamicParticle * theSec;
158 #ifdef CHIPSdebug
159  G4cout << "G4ChiralInvariantPhaseSpace: NEW EVENT #ofHadrons="
160  <<output->size()<<G4endl;
161 #endif
162 
163 
164  unsigned int particle;
165  for( particle = 0; particle < output->size(); particle++)
166  {
167  if(output->operator[](particle)->GetNFragments() != 0)
168  {
169  delete output->operator[](particle);
170  continue;
171  }
172  theSec = new G4DynamicParticle;
173  G4int pdgCode = output->operator[](particle)->GetPDGCode();
174 #ifdef CHIPSdebug
175  G4cout << "G4ChiralInvariantPhaseSpace: h#"<<particle
176  <<", PDG="<<pdgCode<<G4endl;
177 #endif
178  G4ParticleDefinition * theDefinition;
179  // Note that I still have to take care of strange nuclei
180  // For this I need the mass calculation, and a changed interface
181  // for ion-tablel ==> work for Hisaya @@@@@@@
182  // Then I can sort out the pdgCode. I also need a decau process
183  // for strange nuclei; may be another chips interface
184  if(pdgCode>90000000)
185  {
186  G4int aZ = (pdgCode-90000000)/1000;
187  G4int anN = pdgCode-90000000-1000*aZ;
188  theDefinition = G4ParticleTable::GetParticleTable()->FindIon(aZ,anN+aZ,0,aZ);
189  if(aZ == 0 && anN == 1) theDefinition = G4Neutron::Neutron();
190  }
191  //AND
192  else if ( pdgCode == 90000000 && output->operator[](particle)->Get4Momentum().m()<1*MeV )
193  {
194  //A. Dotti:
195  //We cure the case the model returns a (A,Z)=0,0 G4QHadron with a very small mass
196  //We convert this to a gamma. According to the author of the model this is the
197  //correct thing to do and it is done also in other parts of the CHIPS package
198  theDefinition = G4Gamma::Gamma();
199  }
200  //AND
201  else
202  {
203  theDefinition = G4ParticleTable::GetParticleTable()
204  ->FindParticle(output->operator[](particle)->GetPDGCode());
205  }
206 
207  //AND
208  //A. Dotti: Handle problematic cases in which one of the products has not been recognized
209  // This should never happen but we want to add an extra-protection
210  if ( theDefinition == NULL )
211  {
212  //If we arrived here something bad really happened. We do not know how to handle the products of the interaction, we give up, resetting the
213  //result and keeping the primary alive.
214  G4cerr<<"**WARNING*** G4ChiralInvariantPhaseSpace::ApplyYourself(...) : G4QEnvironment::Fragment() returns an invalid fragment\n with fourMom(MeV)=";
215  G4cerr<<output->operator[](particle)->Get4Momentum()<<" and mass(MeV)="<<output->operator[](particle)->Get4Momentum().m();
216  G4cerr<<". Offending PDG is:"<<pdgCode<<" abandon interaction. \n Taget PDG was:"<<targetPDGCode<<" \n Dumping the information in the projectile list:\n";
217  for(size_t i=0; i< projHV.size(); i++)
218  {
219  G4cerr <<" Incoming 4-momentum and PDG code of "<<i<<"'th hadron: "
220  <<" "<< projHV[i]->Get4Momentum()<<" "<<projHV[i]->GetPDGCode()<<"\n";
221  }
222  G4cerr<<"\n Please report as bug \n***END OF MESSAGE***"<<G4endl;
223 
224  for ( unsigned int cparticle=0 ; cparticle<output->size();++cparticle)
225  delete output->operator[](cparticle);
226  delete output;
227  std::for_each(projHV.begin(), projHV.end(), DeleteQHadron());
228  projHV.clear();
229 
230  aResult->Clear();
231  aResult->SetStatusChange(isAlive);
232  aResult->SetEnergyChange(aTrack.GetKineticEnergy());
233  aResult->SetMomentumChange(aTrack.Get4Momentum().vect().unit());
234  return aResult;
235  }
236  //AND
237 
238 
239  theSec->SetDefinition(theDefinition);
240  theSec->SetMomentum(output->operator[](particle)->Get4Momentum().vect());
241  aResult->AddSecondary(theSec);
242  delete output->operator[](particle);
243  }
244  delete output;
245  std::for_each(projHV.begin(), projHV.end(), DeleteQHadron());
246  projHV.clear();
247  return aResult;
248 }
249