ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ComponentSAIDTotalXS.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4ComponentSAIDTotalXS.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 //
27 // -------------------------------------------------------------------
28 //
29 // GEANT4 Class file
30 //
31 //
32 // File name: G4ComponentSAIDTotalXS
33 //
34 // Authors: G.Folger, V.Ivanchenko, D.Wright
35 //
36 // Modifications:
37 //
38 
40 #include "G4PhysicsVector.hh"
41 #include "G4LPhysicsFreeVector.hh"
42 
44  "","pp","np","pip","pim",
45  "pin","pie",
46  "gp_pi0p","gp_pi+n","gn_pi-p","gn_pi0n","gp_etap","gp_etapp"
47 };
48 
49 #ifdef G4MULTITHREADED
50  G4Mutex G4ComponentSAIDTotalXS::saidXSMutex = G4MUTEX_INITIALIZER;
51 #endif
52 
54  : G4VComponentCrossSection("xsSAID")
55 {
56  for(G4int i=0; i<numberOfSaidXS; ++i) {
57  elastdata[i] = nullptr;
58  inelastdata[i] = nullptr;
59  }
60 }
61 
63 {
64  for(G4int i=0; i<numberOfSaidXS; ++i) {
65  if(elastdata[i]) {
66  delete elastdata[i];
67  elastdata[i] = nullptr;
68  }
69  if(inelastdata[i]) {
70  delete inelastdata[i];
71  inelastdata[i] = nullptr;
72  }
73  }
74 }
75 
76 G4double
80 {
81  PrintWarning(part,0,Z,G4lrint(N),
82  "G4ComponentSAIDTotalXS::GetTotalElementCrossSection",
83  "Method is not implemented");
84  return 0.0;
85 }
86 
87 G4double
90  G4double kinEnergy, G4int Z, G4int N)
91 {
92  return GetInelasticIsotopeCrossSection(part,kinEnergy,Z,N)
93  + GetElasticIsotopeCrossSection(part,kinEnergy,Z,N);
94 }
95 
96 G4double
100 {
101  PrintWarning(part,0,Z,G4lrint(N),
102  "G4ComponentSAIDTotalXS::GetTotalElementCrossSection",
103  "Method is not implemented");
104  return 0.0;
105 }
106 
107 G4double
109  const G4ParticleDefinition* part,
110  G4double kinEnergy, G4int Z, G4int N)
111 {
112  G4double cross = 0.0;
113  G4SAIDCrossSectionType tp = GetType(part,0,Z,N);
114  if(saidUnknown != tp) {
115  G4int idx = G4int(tp);
116  if(!inelastdata[idx]) { Initialise(tp); }
117  if(inelastdata[idx]) {
118  cross = (inelastdata[idx])->Value(kinEnergy);
119  }
120  }
121  return cross;
122 }
123 
124 G4double
126  const G4ParticleDefinition* part,
128 {
129  PrintWarning(part,0,Z,G4lrint(N),
130  "G4ComponentSAIDTotalXS::GetTotalElementCrossSection",
131  "Method is not implemented");
132  return 0.0;
133 }
134 
135 G4double
137  const G4ParticleDefinition* part,
138  G4double kinEnergy, G4int Z, G4int N)
139 {
140  G4double cross = 0.0;
141  G4SAIDCrossSectionType tp = GetType(part,0,Z,N);
142  if(saidUnknown != tp) {
143  G4int idx = G4int(tp);
144  if(!elastdata[idx]) { Initialise(tp); }
145  if(elastdata[idx]) {
146  cross = (elastdata[idx])->Value(kinEnergy);
147  }
148  }
149  return cross;
150 }
151 
152 G4double
154  const G4ParticleDefinition* prim,
155  const G4ParticleDefinition* sec,
156  G4double kinEnergy, G4int Z, G4int N)
157 {
158  G4double cross = 0.0;
159  G4SAIDCrossSectionType tp = GetType(prim,sec,Z,N);
160  if(saidUnknown != tp) {
161  G4int idx = G4int(tp);
162  if(!inelastdata[idx]) { Initialise(tp); }
163  if(inelastdata[idx]) {
164  cross = (inelastdata[idx])->Value(kinEnergy);
165  }
166  }
167  return cross;
168 }
169 
170 void G4ComponentSAIDTotalXS::Description(std::ostream&) const
171 {
172 }
173 
176  const G4ParticleDefinition* sec,
177  G4int Z, G4int N)
178 {
180  if(1 == N && prim) {
181  G4int code = prim->GetPDGEncoding();
182 
183  // only gamma + N x-sections available
184  if(0 == Z && sec && 22 == code) {
185  G4int code1 = sec->GetPDGEncoding();
186  if(-211 == code1) { type = saidGN_PINP; }
187  else if(111 == code1) { type = saidGN_PI0N; }
188 
189  // x-sections off proton
190  } else if(1 == Z) {
191  if(sec) {
192  G4int code1 = sec->GetPDGEncoding();
193  if(-211 == code) {
194  if(111 == code1) { type = saidPINP_PI0N; }
195  else if(221 == code1) { type = saidPINP_ETAN; }
196 
197  } else if(22 == code) {
198  if(111 == code1) { type = saidGP_PI0P; }
199  else if(211 == code1) { type = saidGP_PIPN; }
200  else if(221 == code1) { type = saidGP_ETAP; }
201  else if(331 == code1) { type = saidGP_ETAPP; }
202  }
203  } else {
204  if(2212 == code) { type = saidPP; }
205  else if(2112 == code) { type = saidNP; }
206  else if(211 == code) { type = saidPIPP; }
207  else if(-211 == code) { type = saidPINP; }
208  }
209  }
210  }
211  //G4cout << "G4ComponentSAIDTotalXS::Type= " << type << G4endl;
212  return type;
213 }
214 
216 {
217  G4int idx = G4int(tp);
218 #ifdef G4MULTITHREADED
219  G4MUTEXLOCK(&saidXSMutex);
220  if(!inelastdata[idx]) {
221 #endif
222  // check environment variable
223  // Build the complete string identifying the file with the data set
224  char* path = std::getenv("G4SAIDXSDATA");
225  if (!path){
226  G4Exception("G4ComponentSAIDTotalXS::Initialise(..)","had013",
228  "Environment variable G4SAIDXSDATA is not defined");
229  return;
230  }
231  if(idx <= 4) {
234  ReadData(idx,elastdata[idx],path,"_el.dat");
235  ReadData(idx,inelastdata[idx],path,"_in.dat");
236  } else {
238  ReadData(idx,inelastdata[idx],path,".dat");
239  }
240 #ifdef G4MULTITHREADED
241  }
242  G4MUTEXUNLOCK(&saidXSMutex);
243 #endif
244 }
245 
248  const G4String& ss1,
249  const G4String& ss2)
250 {
251  std::ostringstream ost;
252  ost << ss1 << "/" << fnames[index] << ss2;
253  std::ifstream filein(ost.str().c_str());
254  if (!(filein)) {
256  ed << "Data file <" << ost.str().c_str()
257  << "> is not opened!";
258  G4Exception("G4ComponentSAIDTotalXS::ReadData(..)","had014",
259  FatalException, ed, "Check G4SAIDXSDATA");
260  } else {
261  if(GetVerboseLevel() > 1) {
262  G4cout << "File " << ost.str()
263  << " is opened by G4ComponentSAIDTotalXS" << G4endl;
264  }
265  // retrieve data from DB
266  v->Retrieve(filein, true);
268  v->SetSpline(true);
269  }
270 }
271 
272 void
274  const G4ParticleDefinition* sec,
275  G4int Z, G4int N,
276  const G4String& ss1,
277  const G4String& ss2)
278 {
279  G4cout << ss1 << ": " << ss2 << G4endl;
280  G4cout << "For Z= " << Z << " N= " << N << " of ";
281  if(prim) { G4cout << prim->GetParticleName() << " "; }
282  if(sec) { G4cout << " x-section to " << sec->GetParticleName(); }
283  G4cout << G4endl;
284 }