Geant4  10.02.p01
G4ExtDEDXTable.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 // $Id: G4ExtDEDXTable.cc 91868 2015-08-07 15:19:52Z gcosmo $
27 //
28 // ===========================================================================
29 // GEANT4 class source file
30 //
31 // Class: G4ExtDEDXTable
32 //
33 // Base class: G4VIonDEDXTable
34 //
35 // Author: Anton Lechner (Anton.Lechner@cern.ch)
36 //
37 // First implementation: 29. 02. 2009
38 //
39 // Modifications:
40 // 03.11.2009 A. Lechner: Added new methods BuildPhysicsVector according
41 // to interface changes in base class G4VIonDEDXTable.
42 // 25.10.2010 V.Ivanchenko fixed bug in usage of iterators reported by the
43 // Coverity tool
44 // 01.11.2010 V.Ivanchenko fixed remaining bugs reported by Coverity
45 //
46 //
47 // Class description:
48 // Utility class for users to add their own electronic stopping powers
49 // for ions. This class is dedicated for use with G4IonParametrisedLossModel
50 // of the low-energy electromagnetic package.
51 //
52 // Comments:
53 //
54 // ===========================================================================
55 //
56 
57 #include "G4ExtDEDXTable.hh"
58 #include "G4PhysicsVector.hh"
59 #include "G4PhysicsVectorType.hh"
60 #include "G4LPhysicsFreeVector.hh"
61 #include "G4PhysicsLogVector.hh"
62 #include "G4PhysicsFreeVector.hh"
64 #include "G4PhysicsLinearVector.hh"
65 #include "G4PhysicsLnVector.hh"
66 #include <fstream>
67 #include <sstream>
68 #include <iomanip>
69 
70 
71 // #########################################################################
72 
74 
75 }
76 
77 // #########################################################################
78 
80 
81  ClearTable();
82 }
83 
84 // #########################################################################
85 
87 
88  return IsApplicable( ionZ, matZ );
89 }
90 
91 
92 // #########################################################################
93 
95  const G4String& matName) {
96 
97  return IsApplicable( ionZ, matName );
98 }
99 
100 // #########################################################################
101 
103  G4int atomicNumberIon, // Atomic number of ion
104  G4int atomicNumberElem // Atomic number of elemental material
105  ) {
106  G4bool isApplicable = true;
107  G4IonDEDXKeyElem key = std::make_pair(atomicNumberIon, atomicNumberElem);
108 
109  G4IonDEDXMapElem::iterator iter = dedxMapElements.find(key);
110 
111  if(iter == dedxMapElements.end()) isApplicable = false;
112 
113  return isApplicable;
114 }
115 
116 // #########################################################################
117 
119  G4int atomicNumberIon, // Atomic number of ion
120  const G4String& matIdentifier // Name or chemical formula of material
121  ) {
122  G4bool isApplicable = true;
123  G4IonDEDXKeyMat key = std::make_pair(atomicNumberIon, matIdentifier);
124 
125  G4IonDEDXMapMat::iterator iter = dedxMapMaterials.find(key);
126 
127  if(iter == dedxMapMaterials.end()) isApplicable = false;
128 
129  return isApplicable;
130 }
131 
132 // #########################################################################
133 
135  G4int atomicNumberIon, // Atomic number of ion
136  G4int atomicNumberElem // Atomic number of elemental material
137  ) {
138 
139  G4PhysicsVector* physVector = 0;
140 
141  G4IonDEDXKeyElem key = std::make_pair(atomicNumberIon, atomicNumberElem);
142 
143  G4IonDEDXMapElem::iterator iter = dedxMapElements.find(key);
144 
145  if(iter != dedxMapElements.end()) physVector = iter -> second;
146 
147  return physVector;
148 }
149 
150 // #########################################################################
151 
153  G4int atomicNumberIon, // Atomic number of ion
154  const G4String& matIdentifier // Name or chemical formula of material
155  ) {
156 
157  G4PhysicsVector* physVector = 0;
158 
159  G4IonDEDXKeyMat key = std::make_pair(atomicNumberIon, matIdentifier);
160 
161  G4IonDEDXMapMat::iterator iter = dedxMapMaterials.find(key);
162 
163  if(iter != dedxMapMaterials.end()) physVector = iter -> second;
164 
165  return physVector;
166 }
167 
168 // #########################################################################
169 
171  G4double kinEnergyPerNucleon, // Kinetic energy per nucleon
172  G4int atomicNumberIon, // Atomic number of ion
173  G4int atomicNumberElem // Atomic number of elemental material
174  ) {
175  G4double dedx = 0;
176 
177  G4IonDEDXKeyElem key = std::make_pair(atomicNumberIon, atomicNumberElem);
178 
179  G4IonDEDXMapElem::iterator iter = dedxMapElements.find(key);
180 
181  if( iter != dedxMapElements.end() ) {
182  G4PhysicsVector* physicsVector = iter -> second;
183 
184  G4bool b;
185  dedx = physicsVector -> GetValue( kinEnergyPerNucleon, b );
186  }
187 
188  return dedx;
189 }
190 
191 // #########################################################################
192 
194  G4double kinEnergyPerNucleon, // Kinetic energy per nucleon
195  G4int atomicNumberIon, // Atomic number of ion
196  const G4String& matIdentifier // Name or chemical formula of material
197  ) {
198  G4double dedx = 0;
199 
200  G4IonDEDXKeyMat key = std::make_pair(atomicNumberIon, matIdentifier);
201 
202  G4IonDEDXMapMat::iterator iter = dedxMapMaterials.find(key);
203 
204  if(iter != dedxMapMaterials.end()) {
205  G4PhysicsVector* physicsVector = iter -> second;
206 
207  G4bool b;
208  dedx = physicsVector -> GetValue( kinEnergyPerNucleon, b );
209  }
210 
211  return dedx;
212 }
213 
214 // #########################################################################
215 
217  G4PhysicsVector* physicsVector, // Physics vector
218  G4int atomicNumberIon, // Atomic number of ion
219  const G4String& matIdentifier, // Name of elemental material
220  G4int atomicNumberElem // Atomic number of elemental material
221  ) {
222 
223  if(physicsVector == 0) {
224 
225 #ifdef G4VERBOSE
226  G4cout << "G4IonDEDXTable::AddPhysicsVector() Error: Pointer to vector"
227  << " is null-pointer."
228  << G4endl;
229 #endif
230 
231  return false;
232  }
233 
234  if(matIdentifier.empty()) {
235 
236 #ifdef G4VERBOSE
237  G4cout << "G4IonDEDXTable::AddPhysicsVector() Error: "
238  << "Cannot add physics vector. Invalid name."
239  << G4endl;
240 #endif
241 
242  return false;
243  }
244 
245  if(atomicNumberIon <= 2) {
246 
247 #ifdef G4VERBOSE
248  G4cout << "G4IonDEDXTable::AddPhysicsVector() Error: "
249  << "Cannot add physics vector. Illegal atomic number."
250  << G4endl;
251 #endif
252 
253  return false;
254  }
255 
256  if(atomicNumberElem > 0) {
257 
258  G4IonDEDXKeyElem key = std::make_pair(atomicNumberIon, atomicNumberElem);
259 
260  if(dedxMapElements.count(key) == 1) {
261 
262 #ifdef G4VERBOSE
263  G4cout << "G4IonDEDXTable::AddPhysicsVector() Error: "
264  << "Vector already exists. Remove first before replacing."
265  << G4endl;
266 #endif
267  return false;
268  }
269 
270  dedxMapElements[key] = physicsVector;
271  }
272 
273  G4IonDEDXKeyMat mkey = std::make_pair(atomicNumberIon, matIdentifier);
274 
275  if(dedxMapMaterials.count(mkey) == 1) {
276 
277 #ifdef G4VERBOSE
278  G4cout << "G4IonDEDXTable::AddPhysicsVector() Error: "
279  << "Vector already exists. Remove first before replacing."
280  << G4endl;
281 #endif
282 
283  return false;
284  }
285 
286  dedxMapMaterials[mkey] = physicsVector;
287 
288  return true;
289 }
290 
291 // #########################################################################
292 
294  G4int atomicNumberIon, // Atomic number of ion
295  const G4String& matIdentifier // Name or chemical formula of material
296  ) {
297 
298  G4PhysicsVector* physicsVector = 0;
299 
300  // Deleting key of physics vector from material map
301  G4IonDEDXKeyMat key = std::make_pair(atomicNumberIon, matIdentifier);
302 
303  G4IonDEDXMapMat::iterator iter = dedxMapMaterials.find(key);
304 
305  if(iter == dedxMapMaterials.end()) {
306 
307 #ifdef G4VERBOSE
308  G4cout << "G4IonDEDXTable::RemovePhysicsVector() Warning: "
309  << "Cannot remove physics vector. Vector not found."
310  << G4endl;
311 #endif
312 
313  return false;
314  }
315 
316  physicsVector = (*iter).second;
317  dedxMapMaterials.erase(key);
318 
319  // Deleting key of physics vector from elemental material map (if it exists)
320  G4IonDEDXMapElem::iterator it;
321 
322  for(it=dedxMapElements.begin(); it!=dedxMapElements.end(); ++it) {
323 
324  if( (*it).second == physicsVector ) {
325  dedxMapElements.erase(it);
326  break;
327  }
328  }
329 
330  // Deleting physics vector
331  delete physicsVector;
332 
333  return true;
334 }
335 
336 // #########################################################################
337 
339  const G4String& fileName // File name
340  ) {
341  G4bool success = true;
342 
343  std::ofstream ofilestream;
344 
345  ofilestream.open( fileName, std::ios::out );
346 
347  if( !ofilestream ) {
348 
349 #ifdef G4VERBOSE
350  G4cout << "G4ExtDEDXTable::StorePhysicsVector() "
351  << " Cannot open file "<< fileName
352  << G4endl;
353 #endif
354 
355  success = false;
356  }
357  else {
358 
359  size_t nmbMatTables = dedxMapMaterials.size();
360 
361  ofilestream << nmbMatTables << G4endl << G4endl;
362 
363  G4IonDEDXMapMat::iterator iterMat = dedxMapMaterials.begin();
364  G4IonDEDXMapMat::iterator iterMat_end = dedxMapMaterials.end();
365 
366  for(;iterMat != iterMat_end; iterMat++) {
367  G4IonDEDXKeyMat key = iterMat -> first;
368  G4PhysicsVector* physicsVector = iterMat -> second;
369 
370  G4int atomicNumberIon = key.first;
371  G4String matIdentifier = key.second;
372 
373  G4int atomicNumberElem = FindAtomicNumberElement(physicsVector);
374 
375  if(physicsVector != 0) {
376  ofilestream << atomicNumberIon << " " << matIdentifier;
377 
378  if(atomicNumberElem > 0) ofilestream << " " << atomicNumberElem;
379 
380  ofilestream << " # <Atomic number ion> <Material name> ";
381 
382  if(atomicNumberElem > 0) ofilestream << "<Atomic number element>";
383 
384  ofilestream << G4endl << physicsVector -> GetType() << G4endl;
385 
386  physicsVector -> Store(ofilestream, true);
387 
388  ofilestream << G4endl;
389  }
390  else {
391 
392 #ifdef G4VERBOSE
393  G4cout << "G4ExtDEDXTable::StorePhysicsVector() "
394  << " Cannot store physics vector."
395  << G4endl;
396 #endif
397 
398  }
399  }
400  }
401 
402  ofilestream.close();
403 
404  return success;
405 }
406 
407 // #########################################################################
408 
410 {
411  std::ifstream ifilestream;
412  ifilestream.open( fileName, std::ios::in|std::ios::binary );
413  if( ! ifilestream ) {
414 #ifdef G4VERBOSE
415  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
416  << " Cannot open file "<< fileName
417  << G4endl;
418 #endif
419  return false;
420  }
421 
422  //std::string::size_type nmbVectors;
423  G4int nmbVectors = 0;
424  ifilestream >> nmbVectors;
425  if( ifilestream.fail() || nmbVectors <= 0) {
426  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
427  << " File content of " << fileName << " ill-formated."
428  << " Nvectors= " << nmbVectors
429  << G4endl;
430  ifilestream.close();
431  return false;
432  }
433 
434  for(G4int i = 0; i<nmbVectors; ++i) {
435 
436  G4String line = "";
437  // Loop checking, 07-Aug-2015, Vladimir Ivanchenko
438  while( line.empty() ) {
439 
440  getline( ifilestream, line );
441  if( ifilestream.fail() ) {
442 #ifdef G4VERBOSE
443  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
444  << " File content of " << fileName << " ill-formated."
445  << G4endl;
446 #endif
447  ifilestream.close();
448  return false;
449  }
450 
451  std::string::size_type pos = line.find_first_of("#");
452  if(pos != std::string::npos && pos > 0) {
453  line = line.substr(0, pos);
454  }
455  }
456 
457  std::istringstream headerstream( line );
458 
459  std::string::size_type atomicNumberIon;
460  headerstream >> atomicNumberIon;
461 
462  G4String materialName;
463  headerstream >> materialName;
464 
465  if( headerstream.fail() || std::string::npos == atomicNumberIon) {
466 
467 #ifdef G4VERBOSE
468  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
469  << " File content of " << fileName << " ill-formated "
470  << " (vector header)."
471  << G4endl;
472 #endif
473  ifilestream.close();
474  return false;
475  }
476 
477  std::string::size_type atomicNumberMat;
478  headerstream >> atomicNumberMat;
479 
480  if( headerstream.eof() || std::string::npos == atomicNumberMat) {
481  atomicNumberMat = 0;
482  }
483 
484  G4int vectorType;
485  ifilestream >> vectorType;
486 
487  G4PhysicsVector* physicsVector = CreatePhysicsVector(vectorType);
488 
489  if(physicsVector == 0) {
490 #ifdef G4VERBOSE
491  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable "
492  << " illegal physics Vector type " << vectorType
493  << " in " << fileName
494  << G4endl;
495 #endif
496  ifilestream.close();
497  return false;
498  }
499 
500  if( !physicsVector -> Retrieve(ifilestream, true) ) {
501 
502 #ifdef G4VERBOSE
503  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
504  << " File content of " << fileName << " ill-formated."
505  << G4endl;
506 #endif
507  ifilestream.close();
508  return false;
509  }
510 
511  physicsVector -> SetSpline(true);
512 
513  // Retrieved vector is added to material store
514  if( !AddPhysicsVector(physicsVector, (G4int)atomicNumberIon,
515  materialName, (G4int)atomicNumberMat) ) {
516 
517  delete physicsVector;
518  ifilestream.close();
519  return false;
520  }
521  }
522 
523  ifilestream.close();
524 
525  return true;
526 }
527 
528 // #########################################################################
529 
531 
532  G4PhysicsVector* physicsVector = 0;
533 
534  switch (vectorType) {
535 
537  physicsVector = new G4PhysicsLinearVector();
538  break;
539 
540  case T_G4PhysicsLogVector:
541  physicsVector = new G4PhysicsLogVector();
542  break;
543 
544  case T_G4PhysicsLnVector:
545  physicsVector = new G4PhysicsLnVector();
546  break;
547 
548  case T_G4PhysicsFreeVector:
549  physicsVector = new G4PhysicsFreeVector();
550  break;
551 
553  physicsVector = new G4PhysicsOrderedFreeVector();
554  break;
555 
557  physicsVector = new G4LPhysicsFreeVector();
558  break;
559 
560  default:
561  break;
562  }
563  return physicsVector;
564 }
565 
566 // #########################################################################
567 
569  G4PhysicsVector* physicsVector
570  ) {
571 
572  G4int atomicNumber = 0;
573 
574  G4IonDEDXMapElem::iterator iter = dedxMapElements.begin();
575  G4IonDEDXMapElem::iterator iter_end = dedxMapElements.end();
576 
577  for(;iter != iter_end; iter++) {
578 
579  if( (*iter).second == physicsVector ) {
580 
581  G4IonDEDXKeyElem key = (*iter).first;
582  atomicNumber = key.second;
583  }
584  }
585 
586  return atomicNumber;
587 }
588 
589 // #########################################################################
590 
592 
593  G4IonDEDXMapMat::iterator iterMat = dedxMapMaterials.begin();
594  G4IonDEDXMapMat::iterator iterMat_end = dedxMapMaterials.end();
595 
596  for(;iterMat != iterMat_end; iterMat++) {
597 
598  G4PhysicsVector* vec = iterMat -> second;
599 
600  if(vec != 0) delete vec;
601  }
602 
603  dedxMapElements.clear();
604  dedxMapMaterials.clear();
605 }
606 
607 // #########################################################################
608 
610 
611  G4IonDEDXMapMat::iterator iterMat = dedxMapMaterials.begin();
612  G4IonDEDXMapMat::iterator iterMat_end = dedxMapMaterials.end();
613 
614  G4cout << std::setw(15) << std::right
615  << "Atomic nmb ion"
616  << std::setw(25) << std::right
617  << "Material name"
618  << std::setw(25) << std::right
619  << "Atomic nmb material"
620  << G4endl;
621 
622  for(;iterMat != iterMat_end; iterMat++) {
623  G4IonDEDXKeyMat key = iterMat -> first;
624  G4PhysicsVector* physicsVector = iterMat -> second;
625 
626  G4int atomicNumberIon = key.first;
627  G4String matIdentifier = key.second;
628 
629  G4int atomicNumberElem = FindAtomicNumberElement(physicsVector);
630 
631  if(physicsVector != 0) {
632  G4cout << std::setw(15) << std::right
633  << atomicNumberIon
634  << std::setw(25) << std::right
635  << matIdentifier
636  << std::setw(25) << std::right;
637 
638  if(atomicNumberElem > 0) G4cout << atomicNumberElem;
639  else G4cout << "N/A";
640 
641  G4cout << G4endl;
642  }
643  }
644 
645 }
646 
647 // #########################################################################
648 
std::pair< G4int, G4String > G4IonDEDXKeyMat
G4double GetDEDX(G4double kinEnergyPerNucleon, G4int atomicNumberIon, G4int atomicNumberElem)
G4bool RetrievePhysicsTable(const G4String &fileName)
G4PhysicsVector * CreatePhysicsVector(G4int vectorType)
G4bool RemovePhysicsVector(G4int atomicNumberIon, const G4String &matIdentifier)
G4IonDEDXMapElem dedxMapElements
int G4int
Definition: G4Types.hh:78
G4int FindAtomicNumberElement(G4PhysicsVector *physicsVector)
std::pair< G4int, G4int > G4IonDEDXKeyElem
G4GLOB_DLL std::ostream G4cout
bool G4bool
Definition: G4Types.hh:79
static const double second
Definition: G4SIunits.hh:156
G4bool AddPhysicsVector(G4PhysicsVector *physicsVector, G4int atomicNumberIon, const G4String &matIdenfier, G4int atomicNumberElem=0)
G4PhysicsVector * GetPhysicsVector(G4int atomicNumberIon, G4int atomicNumberElem)
G4bool StorePhysicsTable(const G4String &fileName)
G4bool BuildPhysicsVector(G4int ionZ, const G4String &matName)
#define G4endl
Definition: G4ios.hh:61
virtual ~G4ExtDEDXTable()
double G4double
Definition: G4Types.hh:76
static const G4double pos
G4IonDEDXMapMat dedxMapMaterials
G4bool IsApplicable(G4int atomicNumberIon, G4int atomicNumberElem)