Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GIDI.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# <<BEGIN-copyright>>
28# Copyright (c) 2010, Lawrence Livermore National Security, LLC.
29# Produced at the Lawrence Livermore National Laboratory
30# Written by Bret R. Beck, [email protected].
31# CODE-461393
32# All rights reserved.
33#
34# This file is part of GIDI. For details, see nuclear.llnl.gov.
35# Please also read the "Additional BSD Notice" at nuclear.llnl.gov.
36#
37# Redistribution and use in source and binary forms, with or without modification,
38# are permitted provided that the following conditions are met:
39#
40# 1) Redistributions of source code must retain the above copyright notice,
41# this list of conditions and the disclaimer below.
42# 2) Redistributions in binary form must reproduce the above copyright notice,
43# this list of conditions and the disclaimer (as noted below) in the
44# documentation and/or other materials provided with the distribution.
45# 3) Neither the name of the LLNS/LLNL nor the names of its contributors may be
46# used to endorse or promote products derived from this software without
47# specific prior written permission.
48#
49# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
50# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
51# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
52# SHALL LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR
53# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
54# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
56# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
58# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59# <<END-copyright>>
60*/
61
62#include <iostream>
63
64#include "G4GIDI.hh"
65
66using namespace std;
67using namespace GIDI;
68
69/*
70***************************************************************
71*/
72G4GIDI::G4GIDI( int ip, string &dataDirectory ) {
73
74 init( ip );
75 addDataDirectory( dataDirectory );
76}
77/*
78***************************************************************
79*/
80G4GIDI::G4GIDI( int ip, list<string> &dataDirectoryList ) {
81
82 list<string>::iterator iter;
83
84 init( ip );
85 for( iter = dataDirectoryList.begin( ); iter != dataDirectoryList.end( ); ++iter ) addDataDirectory( *iter );
86}
87/*
88***************************************************************
89*/
91
92 G4GIDI_target *target;
93 list<G4GIDI_map *>::iterator iter;
94
95 while( targets.size( ) > 0 ) {
96 target = targets.back( );
97 targets.pop_back( );
98 delete target;
99 }
100
101 while( ( iter = dataDirectories.begin( ) ) != dataDirectories.end( ) ) {
102 delete *iter;
103 dataDirectories.pop_front( );
104 }
105}
106/*
107***************************************************************
108*/
109int G4GIDI::init( int ip ) {
110
111 projectileID = ip;
112 return( 0 );
113}
114/*
115***************************************************************
116*/
118
119 return( dataDirectories.size( ) );
120}
121/*
122***************************************************************
123*/
124int G4GIDI::addDataDirectory( string &dataDirectory ) {
125
126 list<G4GIDI_map *>::iterator iter;
127
128 for( iter = dataDirectories.begin( ); iter != dataDirectories.end( ); iter++ ) {
129 if( (*iter)->path( ) == dataDirectory ) return( 0 );
130 }
131
132 G4GIDI_map *map = new G4GIDI_map( dataDirectory );
133 dataDirectories.push_back( map );
134
135 return( 0 );
136}
137/*
138***************************************************************
139*/
140int G4GIDI::removeDataDirectory( string &dataDirectory ) {
141
142 list<G4GIDI_map *>::iterator iter;
143
144 for( iter = dataDirectories.begin( ); iter != dataDirectories.end( ); iter++ ) {
145 if( dataDirectory == (*iter)->path( ) ) {
146
147 }
148 }
149 return( 0 );
150}
151/*
152***************************************************************
153*/
154//string G4GIDI::getDataDirectoryAtIndex( int index ) {
156
157#if 0
158 list<G4GIDI_map *>::iterator iter;
159 unsigned i = (unsigned) index;
160
161 if( i < 0 ) return( "" );
162 if( i >= dataDirectories.size( ) ) return( "" );
163 for( iter = dataDirectories.begin( ); iter != dataDirectories.end( ); iter++, i-- ) {
164 if( i == 0 ) return( (*iter)->fileName( ) );
165 }
166#endif
167 return( "" );
168}
169/*
170***************************************************************
171*/
172vector<string> *G4GIDI::getDataDirectories( void ) {
173
174 int i = 0;
175 list<G4GIDI_map *>::iterator iter;
176 vector<string> *v = new vector<string>( numberOfDataDirectories( ) );
177
178 for( iter = dataDirectories.begin( ); iter != dataDirectories.end( ); iter++, i++ ) (*v)[i] = string( (*iter)->fileName( ) );
179 return( v );
180}
181/*
182***************************************************************
183*/
184bool G4GIDI::isThisDataAvailable( string &lib_name, int iZ, int iA, int iM ) {
185
186 bool b;
187 char *targetName = G4GIDI_Misc_Z_A_m_ToName( iZ, iA, iM );
188
189 if( targetName == NULL ) return( false );
190 string targetSymbol( targetName );
191 b = isThisDataAvailable( lib_name, targetSymbol );
192 xData_free( NULL, targetName );
193 return( b );
194}
195/*
196***************************************************************
197*/
198bool G4GIDI::isThisDataAvailable( string &lib_name, string &targetName ) {
199
200 char *path = dataFilename( lib_name, targetName );
201
202 if( path != NULL ) {
203 xData_free( NULL, path );
204 return( true );
205 }
206 return( false );
207}
208/*
209***************************************************************
210*/
211char *G4GIDI::dataFilename( string &lib_name, int iZ, int iA, int iM ) {
212
213 char *targetName = G4GIDI_Misc_Z_A_m_ToName( iZ, iA, iM ), *fileName;
214
215 if( targetName == NULL ) return( NULL );
216 string targetSymbol( targetName );
217 fileName = dataFilename( lib_name, targetSymbol );
218 xData_free( NULL, targetName );
219 return( fileName );
220}
221/*
222***************************************************************
223*/
224char *G4GIDI::dataFilename( string &lib_name, string &targetSymbol ) {
225
226 //char *path, *projectile = "n_1";
227 char *path, *projectile = (char*)"n_1";
228 list<G4GIDI_map *>::iterator iter;
229
230 for( iter = dataDirectories.begin( ); iter != dataDirectories.end( ); iter++ ) {
231 if( ( path = tpia_map_findTarget( &((*iter)->smr), (*iter)->map, lib_name.c_str( ), projectile, targetSymbol.c_str( ) ) ) != NULL ) {
232 return( path );
233 }
234 }
235 return( NULL );
236}
237/*
238***************************************************************
239*/
240vector<string> *G4GIDI::getNamesOfAvailableLibraries( int iZ, int iA, int iM ) {
241
242 char *targetName = G4GIDI_Misc_Z_A_m_ToName( iZ, iA, iM );
243 vector<string> *listOfLibraries;
244
245 if( targetName == NULL ) return( new vector<string>( ) );
246 string targetSymbol( targetName );
247 listOfLibraries = getNamesOfAvailableLibraries( targetSymbol );
248 xData_free( NULL, targetName );
249 return( listOfLibraries );
250}
251/*
252***************************************************************
253*/
254vector<string> *G4GIDI::getNamesOfAvailableLibraries( string &targetName ) {
255
256 //char *projectile = "n_1";
257 char *projectile = (char*)"n_1";
258 list<G4GIDI_map *>::iterator iter;
259 vector<string> *listOfLibraries = new vector<string>( );
260
261 tpia_map *map;
262 tpia_mapEntry *entry;
263 for( iter = dataDirectories.begin( ); iter != dataDirectories.end( ); iter++ ) {
264 map = tpia_map_findAllOfTarget( &((*iter)->smr), (*iter)->map, projectile, targetName.c_str( ) );
265 for( entry = tpia_map_getFirstEntry( map ); entry != NULL; entry = tpia_map_getNextEntry( entry ) ) {
266 listOfLibraries->push_back( entry->evaluation );
267 }
268 tpia_map_free( NULL, map );
269 }
270 return( listOfLibraries );
271}
272/*
273***************************************************************
274*/
275vector<string> *G4GIDI::getNamesOfAvailableTargets( void ) {
276
277 vector<string> *listOfTargets;
278 list<G4GIDI_map *>::iterator iter_map;
279
280 listOfTargets = new vector<string>( );
281 if( listOfTargets == NULL ) return( NULL );
282 for( iter_map = dataDirectories.begin( ); iter_map != dataDirectories.end( ); iter_map++ ) {
283 if( tpia_map_walkTree( NULL, (*iter_map)->map, getNamesOfAvailableTargets_walker, (void *) listOfTargets ) != 0 ) {
284 delete listOfTargets;
285 return( NULL );
286 }
287 }
288 return( listOfTargets );
289}
290/*
291***************************************************************
292*/
293G4GIDI_target *G4GIDI::readTarget( string &lib_name, int iZ, int iA, int iM, bool bind ) {
294
295 char *targetName = G4GIDI_Misc_Z_A_m_ToName( iZ, iA, iM );
296 G4GIDI_target *target;
297
298 if( targetName == NULL ) return( NULL );
299 string targetSymbol( targetName );
300 target = readTarget( lib_name, targetSymbol, bind );
301 xData_free( NULL, targetName );
302 return( target );
303}
304/*
305***************************************************************
306*/
307G4GIDI_target *G4GIDI::readTarget( string &lib_name, string &targetName, bool bind ) {
308
309 vector<G4GIDI_target *>::iterator iter_targets;
310
311 for( iter_targets = targets.begin( ); iter_targets != targets.end( ); iter_targets++ ) {
312 if( (*iter_targets)->name == targetName ) return( NULL );
313 }
314 char *path = dataFilename( lib_name, targetName );
315 if( path == NULL ) return( NULL );
316
317 G4GIDI_target *target = new G4GIDI_target( path );
318 if( bind ) targets.push_back( target );
319 xData_free( NULL, path );
320 return( target );
321}
322/*
323***************************************************************
324*/
325G4GIDI_target *G4GIDI::getAlreadyReadTarget( int iZ, int iA, int iM ) {
326
327 char *targetName = G4GIDI_Misc_Z_A_m_ToName( iZ, iA, iM );
328 G4GIDI_target *target;
329
330 if( targetName == NULL ) return( NULL );
331 string targetSymbol( targetName );
332 target = getAlreadyReadTarget( targetSymbol );
333 xData_free( NULL, targetName );
334 return( target );
335}
336/*
337***************************************************************
338*/
340
341 vector<G4GIDI_target *>::iterator iter_targets;
342
343 for( iter_targets = targets.begin( ); iter_targets != targets.end( ); iter_targets++ ) {
344 if( ( (*iter_targets)->name == targetSymbol ) ) return( *iter_targets );
345 }
346 return( NULL );
347}
348/*
349***************************************************************
350*/
352
353 vector<G4GIDI_target *>::iterator iter_targets;
354
355 for( iter_targets = targets.begin( ); iter_targets != targets.end( ); iter_targets++ ) {
356 if( *iter_targets == target ) {
357 targets.erase( iter_targets );
358 delete target;
359 return( 0 );
360 }
361 }
362 return( 1 );
363}
364/*
365***************************************************************
366*/
367int G4GIDI::freeTarget( int iZ, int iA, int iM ) {
368
369 int status;
370 char *targetName = G4GIDI_Misc_Z_A_m_ToName( iZ, iA, iM );
371
372 if( targetName == NULL ) return( 1 );
373 string targetSymbol( targetName );
374 status = freeTarget( targetSymbol );
375 xData_free( NULL, targetName );
376 return( status );
377}
378/*
379***************************************************************
380*/
381int G4GIDI::freeTarget( string &targetSymbol ) {
382
383 vector<G4GIDI_target *>::iterator iter_targets;
384
385 for( iter_targets = targets.begin( ); iter_targets != targets.end( ); iter_targets++ ) {
386 if( (*iter_targets)->name == targetSymbol ) return( freeTarget( *iter_targets ) );
387 }
388 return( 1 );
389}
390/*
391***************************************************************
392*/
393vector<string> *G4GIDI::getListOfReadTargetsNames( void ) {
394
395 vector<G4GIDI_target *>::iterator iter_targets;
396 vector<string> *listOfTargets;
397
398 listOfTargets = new vector<string>( );
399 if( listOfTargets == NULL ) return( NULL );
400 for( iter_targets = targets.begin( ); iter_targets != targets.end( ); iter_targets++ ) {
401 listOfTargets->push_back( *(*iter_targets)->getName( ) );
402 }
403 return( listOfTargets );
404}
char * G4GIDI_Misc_Z_A_m_ToName(int iZ, int iA, int im=0)
Definition: G4GIDI_Misc.cc:76
int getNamesOfAvailableTargets_walker(GIDI::tpia_mapEntry *entry, int level, void *userData)
G4GIDI(int ip, std::string &dataDirectory)
Definition: G4GIDI.cc:72
int removeDataDirectory(std::string &dataDirectory)
Definition: G4GIDI.cc:140
G4GIDI_target * getAlreadyReadTarget(int iZ, int iA, int iM=0)
Definition: G4GIDI.cc:325
bool isThisDataAvailable(std::string &lib_name, int iZ, int iA, int iM=0)
Definition: G4GIDI.cc:184
std::vector< std::string > * getNamesOfAvailableTargets(void)
Definition: G4GIDI.cc:275
std::vector< std::string > * getDataDirectories(void)
Definition: G4GIDI.cc:172
int numberOfDataDirectories(void)
Definition: G4GIDI.cc:117
std::string getDataDirectoryAtIndex(int index)
Definition: G4GIDI.cc:155
~G4GIDI()
Definition: G4GIDI.cc:90
std::vector< std::string > * getListOfReadTargetsNames(void)
Definition: G4GIDI.cc:393
G4GIDI_target * readTarget(std::string &lib_name, int iZ, int iA, int iM=0, bool bind=true)
Definition: G4GIDI.cc:293
int freeTarget(int iZ, int iA, int iM=0)
Definition: G4GIDI.cc:367
int addDataDirectory(std::string &dataDirectory)
Definition: G4GIDI.cc:124
std::vector< std::string > * getNamesOfAvailableLibraries(int iZ, int iA, int iM=0)
Definition: G4GIDI.cc:240
char * dataFilename(std::string &lib_name, int iZ, int iA, int iM=0)
Definition: G4GIDI.cc:211
char * evaluation
Definition: tpia_map.h:67
tpia_mapEntry * tpia_map_getNextEntry(tpia_mapEntry *entry)
Definition: tpia_map.cc:222
char * tpia_map_findTarget(statusMessageReporting *smr, tpia_map *map, const char *evaluation, const char *projectile, const char *targetName)
Definition: tpia_map.cc:327
tpia_mapEntry * tpia_map_getFirstEntry(tpia_map *map)
Definition: tpia_map.cc:215
int tpia_map_walkTree(statusMessageReporting *smr, tpia_map *map, int(*handler)(tpia_mapEntry *entry, int level, void *userData), void *userData)
Definition: tpia_map.cc:457
tpia_map * tpia_map_findAllOfTarget(statusMessageReporting *smr, tpia_map *map, const char *projectile, const char *targetName)
Definition: tpia_map.cc:393
void * tpia_map_free(statusMessageReporting *smr, tpia_map *map)
Definition: tpia_map.cc:184
void * xData_free(statusMessageReporting *smr, void *p)
Definition: xDataMisc.cc:89