/[PAMELA software]/PamVMC_update/macro/PamG4Libs.C
ViewVC logotype

Contents of /PamVMC_update/macro/PamG4Libs.C

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Tue Oct 15 15:51:34 2013 UTC (11 years, 1 month ago) by formato
Branch: MAIN, rel
CVS Tags: reltag, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/plain
PamVMC update

1 // $Id: g4libs.C 496 2010-05-19 15:55:27Z ivana $
2
3 //------------------------------------------------
4 // The Virtual Monte Carlo examples
5 // Copyright (C) 2007, Ivana Hrivnacova
6 // All rights reserved.
7 //
8 // For the licensing terms see geant4_vmc/LICENSE.
9 // Contact: vmc@pcroot.cern.ch
10 //-------------------------------------------------
11
12 /// \file g4libs.C
13 /// \brief Macro for loading Geant4 and Geant4 VMC libraries
14 ///
15 /// A new macro for loading Geant4 and Geant4 VMC libraries
16 /// with using liblist utility provided in Geant4
17 ///
18 /// \author Christian Holm Christensen, NBI;
19 /// Dmitry Naumov, JINR
20 //
21 // Macro for loading Geant4 and Geant4 VMC libraries
22
23 #if !defined(__CINT__) || defined(__MAKECINT__)
24
25 #include <vector>
26 #include <string>
27 #include <sstream>
28 #include <iostream>
29 #include <iomanip>
30
31 #include <TSystem.h>
32 #include <Riostream.h>
33 #include <TCint.h>
34 #include <TError.h>
35 #include <TMath.h>
36 #include <TApplication.h>
37 #include <TROOT.h>
38
39 #endif
40
41 void loadg4libs();
42
43 void PamG4Libs()
44 {
45 /// Function for loading all libraries for running VMC with Geant4
46 loadg4libs();
47
48 gSystem->SetFPEMask(0);
49 }
50
51 string NoSpaces(string s)
52 {
53 /// ???
54
55 std::stringstream str(s);
56 std::string token;
57 std::getline(str, token, '\n');
58 return token;
59 }
60
61 Bool_t isLibrary(const char* libName)
62 {
63 /// Helper function which testes the existence of the given library
64 /// \param libName The library name
65
66 if (TString(gSystem->DynamicPathName(libName, kTRUE)) != TString(""))
67 return kTRUE;
68 else
69 return kFALSE;
70 }
71
72 Bool_t isBatch()
73 {
74 /// Helper function which testes if Root was started in batch mode
75
76 for ( Int_t i=0; i<gApplication->Argc(); ++i )
77 if ( TString(gROOT->GetApplication()->Argv(i)) == "-b" ) return true;
78
79 return false;
80 }
81
82 Bool_t isSet(const char* variable)
83 {
84 /// Helper function which checks if the specified environment variable
85 /// is set.
86 /// \param variable The environment variable name
87
88 TString value = gSystem->Getenv(variable);
89 if ( value != "") return true;
90
91 return false;
92 }
93
94 void vgmlibs()
95 {
96 /// Function for loading VGM libraries.
97
98 if ( isSet("USE_VGM") ) {
99 cout << "Loading VGM libraries ... " << endl;
100 gSystem->Load("libClhepVGM");
101 gSystem->Load("libBaseVGM");
102 gSystem->Load("libGeant4GM");
103 gSystem->Load("libRootGM");
104 gSystem->Load("libXmlVGM");
105 }
106 }
107
108 void GetLinkLine(string& all_lines)
109 {
110 /// Build the string with the list of libraries using liblist
111
112 // Geant4 lib directory
113 TString g4lib = gSystem->Getenv("G4LIB");
114 if ( g4lib.Length() == 0 )
115 g4lib = gSystem->Getenv("G4INSTALL") + TString("/lib");
116 g4lib += "/"+TString(gSystem->Getenv("G4SYSTEM"));
117
118 // Build the string with the list of libraries using liblist
119 TString command
120 // = "echo -L"+g4lib+" `" + g4lib+"/liblist -m "+g4lib +" < " + g4lib+"/libname.map`";
121 = "echo -L"+g4lib+" `cd " +g4lib+"; for file in \\`ls -L *.so | sed s/ib// | sed s/.so//\\`; do echo -$file; done`";
122
123 std::cout << "Executing: " << command << std::endl;
124
125 FILE* pipe = gSystem->OpenPipe(command, "r");
126 char line[100];
127 while ( fgets(line, sizeof(line), pipe ) != NULL ) {
128 all_lines += line;
129 }
130
131 std::cout << all_lines << std::endl;
132
133 }
134
135 void HandleLinkLine(const char* str, const char* what)
136 {
137 /// Tokenize the input string and load/unload the libraries
138 /// from the list.
139 /// \param str The string output from Geant4 liblist
140 /// \param what The option specifying whether we want to load ('l') or
141 /// unload ('u') libraries
142
143 // Fill the libs names in the vector
144 std::vector<std::string> libs;
145 std::stringstream sstream(str);
146 unsigned int w = 0;
147 while ( ! sstream.eof() ) {
148 // Read one string
149 std::string token;
150 std::getline(sstream, token, ' ');
151
152 // Check stream status
153 if ( sstream.bad() ) break;
154
155 // Check that we got a meaningful tokenonent
156 if ( token.empty() || std::isspace(token[0]) ) continue;
157
158 if ( token[0] != '-' ) {
159 Warning("LoadLibraryList", "Unknown element %s", token.c_str());
160 continue;
161 }
162
163 std::string dir_or_file = token.substr(2,token.size()-2);
164 if ( token[1] == 'L' ) {
165 std::stringstream path;
166 path << gSystem->GetDynamicPath() << ":"
167 << dir_or_file;
168 gSystem->SetDynamicPath(path.str().c_str());
169 }
170 else if ( token[1] == 'l' ) {
171 std::stringstream ln;
172 ln << "lib" << NoSpaces(dir_or_file) << '.' << gSystem->GetSoExt();
173 std::string lib(ln.str());
174 libs.push_back(lib);
175 if ( lib.length() > w ) w = lib.length();
176 }
177 else {
178 Warning("LoadLibraryList", "Unknown option %s in",
179 token.c_str(), str);
180 continue;
181 }
182 }
183
184 // Process the vector with libs names and load libraries
185 size_t n = libs.size();
186 TString sWhat(what);
187 Bool_t load = sWhat.Contains("l");
188 if (!load && !sWhat.Contains("u")) {
189 std::cerr << " Unknown load action " << what << std::endl;
190 return;
191 }
192
193 for ( size_t i = 0; i < n; ++i ) {
194 size_t idx = n - i - 1;
195
196 // Uncomment to debug
197 // size_t m = TMath::Log10(n)+1;
198 // string say=" Loading ";
199 // if ( TString(what).Contains("u") ) say = " Unloading ";
200 // std::cout << say << std::setw(m) << (i+1)
201 // << "/" << std::setw(m) << n
202 // << ": " << std::setw(w) << libs[idx] // << std::endl;
203 // << std::flush;
204
205 int result = 0;
206 if ( libs[idx].c_str() ) {
207 if (load)
208 result = gSystem->Load(libs[idx].c_str());
209 else
210 gSystem->Unload(libs[idx].c_str());
211 }
212 // Uncomment to debug
213 // if ( TString(what).Contains("l") )
214 // std::cout << ( result < 0 ? " failed" : " ok" ) << "\r";
215 }
216 // std::cout << "\n Done" << std::endl;
217 }
218
219 void loadg4libs()
220 {
221 /// The function to unload Geant4 libraries
222
223 // CLHEP
224 gSystem->Load("libCLHEP");
225
226 // xerces-c library if GDML is activated
227 if ( isSet("G4LIB_BUILD_GDML") ) {
228 gSystem->Load("libxerces-c");
229 }
230
231 // Get the string with the list of libraries
232 string all_lines;
233 GetLinkLine(all_lines);
234
235 // Load Geant4 libraries
236 cout << "Loading Geant4 libraries ..." << endl;
237 HandleLinkLine(all_lines.c_str(),"l");
238
239 // VGM librares
240 vgmlibs();
241
242 // G4Root library (if available)
243 if ( isLibrary("libg4root") ) {
244 cout << "Loading g4root library ..." << endl;
245 gSystem->Load("libg4root");
246 }
247
248 // Geant4 VMC library
249 cout << "Loading geant4vmc library ..." << endl;
250 gSystem->Load("libgeant4vmc");
251
252 // Geant4 VMC GUI library
253 // (if available and Root is not running in batch mode)
254 if ( isLibrary("libgeant4vmc_gui") && ! isBatch() ) {
255 cout << "Loading geant4vmc_gui library ... " << endl;
256 gSystem->Load("libgeant4vmc_gui");
257 }
258 }
259
260 void unloadg4libs()
261 {
262 /// The function to unload Geant4 libraries
263
264 // Get the string with the list of libraries
265 string all_lines;
266 GetLinkLine(all_lines);
267
268 // Load Geant4 libraries
269 cout << "Unloading Geant4 libraries ..." << endl;
270 HandleLinkLine(all_lines.c_str(),"u");
271 }
272

  ViewVC Help
Powered by ViewVC 1.1.23