GEMC  2.3
Geant4 Monte-Carlo Framework
utils.cc
Go to the documentation of this file.
1 // Qt headers
2 #include <QApplication>
3 #include <QSplashScreen>
4 #include <QtWidgets>
5 
6 
7 // gemc headers
8 #include "utils.h"
9 #include "string_utilities.h"
10 #include "splash.h"
11 
12 // G4 headers
13 #include "G4UnitsTable.hh"
14 
15 
16 // C++ headers
17 #include "dirent.h"
18 
20 {
21  qt = (bool) opts.optMap["USE_GUI"].arg;
22  header = " >> gemc Init: ";
23  verbosity = opts.optMap["LOG_VERBOSITY"].arg;
24  string guistyle = opts.optMap["QTSTYLE"].args;
25 
26  if(qt)
27  {
28  // setting style if different than defulat "no"
29 // if(guistyle == "QPlastiqueStyle") qApp->setStyle(new QPlastiqueStyle);
30 // if(guistyle == "QCleanlooksStyle") qApp->setStyle(new QCleanlooksStyle);
31 // if(guistyle == "QWindowsStyle") qApp->setStyle(new QWindowsStyle);
32 // if(guistyle == "QMotifStyle") qApp->setStyle(new QMotifStyle);
33 
34  // Initializing Splash Screen
35  splash_i = new QPixmap(gsplash);
36  splash = new QSplashScreen(*splash_i);
37 
38  QFont sansFont("Helvetica", 10);
39  splash->setFont(sansFont);
40 
41  splash->show();
42  qApp->processEvents();
43  }
44 
45 
46 }
47 
49 {
50  if(qt)
51  {
52  delete splash_i ;
53  delete splash ;
54  }
55 }
56 
57 
58 // display a message on the splash screen (if GUI is on)
59 
60 void gui_splash::message(string msg)
61 {
62 
63  if(qt)
64  {
65  splash->showMessage(msg.c_str(), Qt::AlignLeft, Qt::white );
66  qApp->processEvents();
67  }
68  else if(verbosity>0)
69  cout << header << msg << endl;
70 }
71 
72 
73 // merging two <string, string>
74 // The rhs overwrites what's in the lhs
75 void mergeMaps(map<string, string>& lhs, const map<string, string>& rhs)
76 {
77  for(map<string, string>::const_iterator it = rhs.begin(); it != rhs.end(); it++)
78  {
79  lhs[it->first] = it->second;
80  }
81 }
82 
83 
84 // calculate rotation matrix from input string (MYSQL version)
85 G4RotationMatrix calc_rotation(string r, string dname)
86 {
87  G4RotationMatrix rot(G4ThreeVector(1, 0, 0),
88  G4ThreeVector(0, 1, 0),
89  G4ThreeVector(0, 0, 1));
90 
91  stringstream vars(r);
92  string var;
93  vars >> var;
94 
95  if(var != "ordered:")
96  {
97  rot.rotateX(get_number(var,1));
98  vars >> var; rot.rotateY(get_number(var,1));
99  vars >> var; rot.rotateZ(get_number(var,1));
100  }
101  else
102  {
103  string order;
104  vars >> order;
105  if(order == "xzy")
106  {
107  vars >> var; rot.rotateX(get_number(var,1));
108  vars >> var; rot.rotateZ(get_number(var,1));
109  vars >> var; rot.rotateY(get_number(var,1));
110  }
111  else if(order == "yxz")
112  {
113  vars >> var; rot.rotateY(get_number(var,1));
114  vars >> var; rot.rotateX(get_number(var,1));
115  vars >> var; rot.rotateZ(get_number(var,1));
116  }
117  else if(order == "yzx")
118  {
119  vars >> var; rot.rotateY(get_number(var,1));
120  vars >> var; rot.rotateZ(get_number(var,1));
121  vars >> var; rot.rotateX(get_number(var,1));
122  }
123  else if(order == "zxy")
124  {
125  vars >> var; rot.rotateZ(get_number(var,1));
126  vars >> var; rot.rotateX(get_number(var,1));
127  vars >> var; rot.rotateY(get_number(var,1));
128  }
129  else if(order == "zyx")
130  {
131  vars >> var; rot.rotateZ(get_number(var,1));
132  vars >> var; rot.rotateY(get_number(var,1));
133  vars >> var; rot.rotateX(get_number(var,1));
134  }
135  else
136  {
137  cout << " >> ERROR: Ordered rotation <" << order << "> for " << dname << " is wrong, it's none of the following:"
138  << " xzy, yxz, yzx, zxy or zyx. Exiting." << endl;
139  exit(0);
140  }
141  }
142 
143  return rot;
144 
145 }
146 
147 
148 // calculate shift from input string (MYSQL version)
149 G4ThreeVector calc_position(string v)
150 {
151 
152  G4ThreeVector pos(0, 0, 0);
153  stringstream vars(v);
154  string var;
155 
156  vars >> var; pos.setX(get_number(var,1));
157  vars >> var; pos.setY(get_number(var,1));
158  vars >> var; pos.setZ(get_number(var,1));
159 
160  return pos;
161 }
162 
163 
164 // returns a G4Colour from a string
165 G4Colour gcol(string cvar)
166 {
167  G4Colour thisCol;
168 
169  // if color is 6 digits then it's only rrggbb. Setting transparency to zero
170  if(cvar.size() == 6)
171  thisCol = G4Colour(strtol(cvar.substr(0, 2).c_str(), NULL, 16)/255.0,
172  strtol(cvar.substr(2, 2).c_str(), NULL, 16)/255.0,
173  strtol(cvar.substr(4, 2).c_str(), NULL, 16)/255.0,
174  1);
175 
176  // Transparency 0 to 5 where 5=max transparency (default is 0 if nothing is specified)
177  else if(cvar.size() == 7)
178  thisCol = G4Colour(strtol(cvar.substr(0, 2).c_str(), NULL, 16)/255.0,
179  strtol(cvar.substr(2, 2).c_str(), NULL, 16)/255.0,
180  strtol(cvar.substr(4, 2).c_str(), NULL, 16)/255.0,
181  1.0 - stringToDouble(cvar.substr(6, 1))/5.0);
182 
183  return thisCol;
184 }
185 
186 
187 // gets last id from table, variation, run number
188 int getLastId(QSqlDatabase db, string t, string v, int run)
189 {
190  string dbexecute = " select max(id) from " + t ;
191  dbexecute += " where variation = '" + v ;
192  dbexecute += "' and rmin <= " + stringify(run) + " and rmax >= " + stringify(run) ;
193 
194  QSqlQuery q;
195  if(!q.exec(dbexecute.c_str()))
196  {
197  cout << " !!! Failed to execute MYSQL query " << dbexecute << ". This is a fatal error. Exiting." << endl;
198  qDebug() << q.lastError();
199  exit(0);
200  }
201  // Warning if nothing is found
202  if(q.size() == 0)
203  {
204  cout << endl << " >> WARNING: nothing found on \"" << t
205  << "\" with variation \"" << v << "\" for run number " << run << endl << endl;
206  return 0;
207  }
208  else
209  {
210  q.next();
211  return get_number(qv_tostring(q.value(0)));
212  }
213 
214 }
215 
216 
217 // open database according to options
218 QSqlDatabase openGdb(goptions gemcOpt)
219 {
220  string database = gemcOpt.optMap["DATABASE"].args;
221  string dbhost = gemcOpt.optMap["DBHOST"].args;
222  string dbUser = gemcOpt.optMap["DBUSER"].args;
223  string dbPswd = gemcOpt.optMap["DBPSWD"].args;
224  int dbPort = (int) gemcOpt.optMap["DBPORT"].arg;
225 
226  // getting connection if it's already opened.
227  // Otherwise creating a new one
228  QSqlDatabase db = QSqlDatabase::database();
229  if(!db.isOpen())
230  db = QSqlDatabase::addDatabase("QMYSQL");
231 
232  db.setHostName(dbhost.c_str());
233  db.setDatabaseName(database.c_str());
234  db.setUserName( dbUser.c_str() );
235  if(dbPort) db.setPort(dbPort);
236 
237  if(dbPswd != "no") db.setPassword( dbPswd.c_str() );
238 
239  bool ok = db.open();
240 
241  if(!ok)
242  {
243  cout << " Error! Cannot connect to database " << database << ". Exiting." << endl;
244  exit(-1);
245  }
246 
247  else
248  return db;
249 }
250 
251 
252 void closeGdb(QSqlDatabase db)
253 {
254  // closing db
255  db.close();
256  // remove connection
257  QSqlDatabase::removeDatabase("QMYSQL");
258 }
259 
260 
261 
262 map<string, string> getFilesInDirectory(string directory)
263 {
264  map<string, string> filesMap;
265 
266  DIR *dir;
267  struct dirent *ent;
268  dir = opendir(directory.c_str());
269  if (dir != NULL)
270  {
271  int len;
272  while ((ent = readdir (dir)) != NULL)
273  {
274  len = strlen(ent->d_name);
275 
276  // checking various extensions
277  if(strcmp(".dat", &(ent->d_name[len - 4])) == 0)
278  filesMap[directory + "/" + ent->d_name] = "ASCII" ;
279 
280  if(strcmp(".txt", &(ent->d_name[len - 4])) == 0)
281  filesMap[directory + "/" + ent->d_name] = "ASCII" ;
282 
283  }
284  closedir (dir);
285  }
286  else
287  {
288  cout << " Error: directory " << directory << " could not be opened." << endl;
289  }
290 
291  return filesMap;
292 }
293 
294 string assignAttribute(QDomElement e, string attribute, string defaultValue)
295 {
296  if(e.attributeNode(attribute.c_str()).isAttr())
297  return TrimSpaces(e.attributeNode(attribute.c_str()).value().toStdString());
298 
299  // otherwise
300  return defaultValue;
301 }
302 int assignAttribute(QDomElement e, string attribute, int defaultValue)
303 {
304  if(e.attributeNode(attribute.c_str()).isAttr())
305  return get_number(TrimSpaces(e.attributeNode(attribute.c_str()).value().toStdString()));
306 
307  return defaultValue;
308 }
309 double assignAttribute(QDomElement e, string attribute, double defaultValue)
310 {
311  if(e.attributeNode(attribute.c_str()).isAttr())
312  return get_number(TrimSpaces(e.attributeNode(attribute.c_str()).value().toStdString()));
313 
314  return defaultValue;
315 }
316 
317 #include "ctime"
318 string timeStamp()
319 {
320 
321  time_t now = time(NULL);
322  struct tm * ptm = localtime(&now);
323  char buffer[32];
324  // Format: Mo, 15.06.2009 20:20:00
325  strftime (buffer, 32, "%a, %m.%d.%Y %H:%M:%S", ptm);
326 
327  return string(buffer);
328 }
329 
330 
331 
332 // returns value + best units as a string
333 string bestValueUnits(double value, string unitType)
334 {
335  stringstream bestVU;
336  bestVU << G4BestUnit(value, unitType);
337  string var, uni;
338  bestVU >> var >> uni;
339 
340  return var + "*" + uni;
341 
342 }
343 
344 
345 
346 ostream &operator<<(ostream &stream, gtable gt)
347 {
348  cout << endl;
349 
350  for(unsigned i=0; i<gt.data.size(); i++)
351  cout << " data # " << i << ": " << gt.data[i] << endl;
352 
353  return stream;
354 }
355 
356 
357 
358 
359 
360 
361 
362 vector<double> convertVintVdouble(vector<int> input)
363 {
364  vector<double> out;
365 
366  for(unsigned i=0; i<input.size(); i++)
367  out.push_back(input[i]);
368 
369  return out;
370 }
371 
372 
373 
374 
375 
376 
377 
378 
string timeStamp()
Definition: utils.cc:318
gui_splash(goptions)
Definition: utils.cc:19
QSplashScreen * splash
Definition: utils.h:38
double verbosity
Definition: utils.h:34
void closeGdb(QSqlDatabase db)
Definition: utils.cc:252
QSqlDatabase openGdb(goptions gemcOpt)
Definition: utils.cc:218
void message(string)
Definition: utils.cc:60
vector< string > data
Definition: utils.h:76
Definition: utils.h:65
int getLastId(QSqlDatabase db, string t, string v, int run)
Definition: utils.cc:188
vector< double > convertVintVdouble(vector< int > input)
Definition: utils.cc:362
string qv_tostring(QVariant input)
double get_number(string v, int warn_no_unit)
Returns number with dimension from string, i.e. 100*cm.
G4ThreeVector calc_position(string v)
Definition: utils.cc:149
string assignAttribute(QDomElement e, string attribute, string defaultValue)
Definition: utils.cc:294
string bestValueUnits(double value, string unitType)
Definition: utils.cc:333
G4RotationMatrix calc_rotation(string r, string dname)
Definition: utils.cc:85
string stringify(double x)
map< string, aopt > optMap
Options map.
Definition: options.h:75
G4Colour gcol(string cvar)
Definition: utils.cc:165
bool qt
Definition: utils.h:33
double stringToDouble(string v)
ostream & operator<<(ostream &stream, gtable gt)
Definition: utils.cc:346
string header
Definition: utils.h:35
string TrimSpaces(string in)
Removes leading and trailing spaces.
void mergeMaps(map< string, string > &lhs, const map< string, string > &rhs)
Definition: utils.cc:75
map< string, string > getFilesInDirectory(string directory)
Definition: utils.cc:262
~gui_splash()
Definition: utils.cc:48
QPixmap * splash_i
Definition: utils.h:37