Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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$
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"
61#include "G4PhysicsLogVector.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
539G4PhysicsVector* G4ExtDEDXTable::CreatePhysicsVector(G4int vectorType) {
540
541 G4PhysicsVector* physicsVector = 0;
542
543 switch (vectorType) {
544
546 physicsVector = new G4PhysicsLinearVector();
547 break;
548
550 physicsVector = new G4PhysicsLogVector();
551 break;
552
554 physicsVector = new G4PhysicsLnVector();
555 break;
556
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
577G4int 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
@ T_G4LPhysicsFreeVector
@ T_G4PhysicsOrderedFreeVector
@ T_G4PhysicsFreeVector
@ T_G4PhysicsLinearVector
@ T_G4PhysicsLogVector
@ T_G4PhysicsLnVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4PhysicsVector * GetPhysicsVector(G4int atomicNumberIon, G4int atomicNumberElem)
G4bool BuildPhysicsVector(G4int ionZ, const G4String &matName)
G4bool IsApplicable(G4int atomicNumberIon, G4int atomicNumberElem)
G4double GetDEDX(G4double kinEnergyPerNucleon, G4int atomicNumberIon, G4int atomicNumberElem)
G4bool StorePhysicsTable(const G4String &fileName)
G4bool RemovePhysicsVector(G4int atomicNumberIon, const G4String &matIdentifier)
G4bool AddPhysicsVector(G4PhysicsVector *physicsVector, G4int atomicNumberIon, const G4String &matIdenfier, G4int atomicNumberElem=0)
virtual ~G4ExtDEDXTable()
G4bool RetrievePhysicsTable(const G4String &fileName)