Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 67044 2013-01-30 08:50:06Z 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;
424  ifilestream >> nmbVectors;
425  if( ifilestream.fail() ) {
426  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
427  << " File content of " << fileName << " ill-formated."
428  << G4endl;
429  ifilestream.close();
430  return false;
431  }
432 
433  // if(nmbVectors == std::string::npos) {
434  /*
435  if(nmbVectors <= 0) {
436 #ifdef G4VERBOSE
437  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
438  << " The file is corrupted " << G4endl;
439 #endif
440  return false;
441  }
442  */
443  //size_t nm = size_t(nmbVectors);
444  for(G4int i = 0; i<nmbVectors; ++i) {
445 
446  G4String line = "";
447  while( line.empty() ) {
448 
449  getline( ifilestream, line );
450  if( ifilestream.fail() ) {
451 #ifdef G4VERBOSE
452  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
453  << " File content of " << fileName << " ill-formated."
454  << G4endl;
455 #endif
456  ifilestream.close();
457  return false;
458  }
459 
460  std::string::size_type pos = line.find_first_of("#");
461  if(pos != std::string::npos && pos > 0) {
462  line = line.substr(0, pos);
463  }
464  }
465 
466  std::istringstream headerstream( line );
467 
468  std::string::size_type atomicNumberIon;
469  headerstream >> atomicNumberIon;
470 
471  G4String materialName;
472  headerstream >> materialName;
473 
474  if( headerstream.fail() || std::string::npos == atomicNumberIon) {
475 
476 #ifdef G4VERBOSE
477  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
478  << " File content of " << fileName << " ill-formated "
479  << " (vector header)."
480  << G4endl;
481 #endif
482  ifilestream.close();
483  return false;
484  }
485 
486  std::string::size_type atomicNumberMat;
487  headerstream >> atomicNumberMat;
488 
489  if( headerstream.eof() || std::string::npos == atomicNumberMat) {
490  atomicNumberMat = 0;
491  }
492 
493  G4int vectorType;
494  ifilestream >> vectorType;
495 
496  G4PhysicsVector* physicsVector = CreatePhysicsVector(vectorType);
497 
498  if(physicsVector == 0) {
499 #ifdef G4VERBOSE
500  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable "
501  << " illegal physics Vector type " << vectorType
502  << " in " << fileName
503  << G4endl;
504 #endif
505  ifilestream.close();
506  return false;
507  }
508 
509  if( !physicsVector -> Retrieve(ifilestream, true) ) {
510 
511 #ifdef G4VERBOSE
512  G4cout << "G4ExtDEDXTable::RetrievePhysicsTable() "
513  << " File content of " << fileName << " ill-formated."
514  << G4endl;
515 #endif
516  ifilestream.close();
517  return false;
518  }
519 
520  physicsVector -> SetSpline(true);
521 
522  // Retrieved vector is added to material store
523  if( !AddPhysicsVector(physicsVector, (G4int)atomicNumberIon,
524  materialName, (G4int)atomicNumberMat) ) {
525 
526  delete physicsVector;
527  ifilestream.close();
528  return false;
529  }
530  }
531 
532  ifilestream.close();
533 
534  return true;
535 }
536 
537 // #########################################################################
538 
539 G4PhysicsVector* G4ExtDEDXTable::CreatePhysicsVector(G4int vectorType) {
540 
541  G4PhysicsVector* physicsVector = 0;
542 
543  switch (vectorType) {
544 
546  physicsVector = new G4PhysicsLinearVector();
547  break;
548 
549  case T_G4PhysicsLogVector:
550  physicsVector = new G4PhysicsLogVector();
551  break;
552 
553  case T_G4PhysicsLnVector:
554  physicsVector = new G4PhysicsLnVector();
555  break;
556 
557  case T_G4PhysicsFreeVector:
558  physicsVector = new G4PhysicsFreeVector();
559  break;
560 
562  physicsVector = new G4PhysicsOrderedFreeVector();
563  break;
564 
566  physicsVector = new G4LPhysicsFreeVector();
567  break;
568 
569  default:
570  break;
571  }
572  return physicsVector;
573 }
574 
575 // #########################################################################
576 
577 G4int G4ExtDEDXTable::FindAtomicNumberElement(
578  G4PhysicsVector* physicsVector
579  ) {
580 
581  G4int atomicNumber = 0;
582 
583  G4IonDEDXMapElem::iterator iter = dedxMapElements.begin();
584  G4IonDEDXMapElem::iterator iter_end = dedxMapElements.end();
585 
586  for(;iter != iter_end; iter++) {
587 
588  if( (*iter).second == physicsVector ) {
589 
590  G4IonDEDXKeyElem key = (*iter).first;
591  atomicNumber = key.second;
592  }
593  }
594 
595  return atomicNumber;
596 }
597 
598 // #########################################################################
599 
601 
602  G4IonDEDXMapMat::iterator iterMat = dedxMapMaterials.begin();
603  G4IonDEDXMapMat::iterator iterMat_end = dedxMapMaterials.end();
604 
605  for(;iterMat != iterMat_end; iterMat++) {
606 
607  G4PhysicsVector* vec = iterMat -> second;
608 
609  if(vec != 0) delete vec;
610  }
611 
612  dedxMapElements.clear();
613  dedxMapMaterials.clear();
614 }
615 
616 // #########################################################################
617 
619 
620  G4IonDEDXMapMat::iterator iterMat = dedxMapMaterials.begin();
621  G4IonDEDXMapMat::iterator iterMat_end = dedxMapMaterials.end();
622 
623  G4cout << std::setw(15) << std::right
624  << "Atomic nmb ion"
625  << std::setw(25) << std::right
626  << "Material name"
627  << std::setw(25) << std::right
628  << "Atomic nmb material"
629  << G4endl;
630 
631  for(;iterMat != iterMat_end; iterMat++) {
632  G4IonDEDXKeyMat key = iterMat -> first;
633  G4PhysicsVector* physicsVector = iterMat -> second;
634 
635  G4int atomicNumberIon = key.first;
636  G4String matIdentifier = key.second;
637 
638  G4int atomicNumberElem = FindAtomicNumberElement(physicsVector);
639 
640  if(physicsVector != 0) {
641  G4cout << std::setw(15) << std::right
642  << atomicNumberIon
643  << std::setw(25) << std::right
644  << matIdentifier
645  << std::setw(25) << std::right;
646 
647  if(atomicNumberElem > 0) G4cout << atomicNumberElem;
648  else G4cout << "N/A";
649 
650  G4cout << G4endl;
651  }
652  }
653 
654 }
655 
656 // #########################################################################
657