GEMC  2.2
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  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  // cout << dname
96 
97  if(var != "ordered:")
98  {
99  rot.rotateX(get_number(var,1));
100  vars >> var; rot.rotateY(get_number(var,1));
101  vars >> var; rot.rotateZ(get_number(var,1));
102  }
103  else
104  {
105  string order;
106  vars >> order;
107  if(order == "xzy")
108  {
109  vars >> var; rot.rotateX(get_number(var,1));
110  vars >> var; rot.rotateZ(get_number(var,1));
111  vars >> var; rot.rotateY(get_number(var,1));
112  }
113  else if(order == "yxz")
114  {
115  vars >> var; rot.rotateY(get_number(var,1));
116  vars >> var; rot.rotateX(get_number(var,1));
117  vars >> var; rot.rotateZ(get_number(var,1));
118  }
119  else if(order == "yzx")
120  {
121  vars >> var; rot.rotateY(get_number(var,1));
122  vars >> var; rot.rotateZ(get_number(var,1));
123  vars >> var; rot.rotateX(get_number(var,1));
124  }
125  else if(order == "zxy")
126  {
127  vars >> var; rot.rotateZ(get_number(var,1));
128  vars >> var; rot.rotateX(get_number(var,1));
129  vars >> var; rot.rotateY(get_number(var,1));
130  }
131  else if(order == "zyx")
132  {
133  vars >> var; rot.rotateZ(get_number(var,1));
134  vars >> var; rot.rotateY(get_number(var,1));
135  vars >> var; rot.rotateX(get_number(var,1));
136  }
137  else
138  {
139  cout << " >> ERROR: Ordered rotation <" << order << "> for " << dname << " is wrong, it's none of the following:"
140  << " xzy, yxz, yzx, zxy or zyx. Exiting." << endl;
141  exit(0);
142  }
143  }
144 
145  return rot;
146 
147 }
148 
149 
150 // calculate shift from input string (MYSQL version)
151 G4ThreeVector calc_position(string v)
152 {
153 
154  G4ThreeVector pos(0, 0, 0);
155  stringstream vars(v);
156  string var;
157 
158  vars >> var; pos.setX(get_number(var,1));
159  vars >> var; pos.setY(get_number(var,1));
160  vars >> var; pos.setZ(get_number(var,1));
161 
162  return pos;
163 }
164 
165 
166 // returns a G4Colour from a string
167 G4Colour gcol(string cvar)
168 {
169  G4Colour thisCol;
170 
171  // if color is 6 digits then it's only rrggbb. Setting transparency to zero
172  if(cvar.size() == 6)
173  thisCol = G4Colour(strtol(cvar.substr(0, 2).c_str(), NULL, 16)/255.0,
174  strtol(cvar.substr(2, 2).c_str(), NULL, 16)/255.0,
175  strtol(cvar.substr(4, 2).c_str(), NULL, 16)/255.0,
176  1);
177 
178  // Transparency 0 to 5 where 5=max transparency (default is 0 if nothing is specified)
179  else if(cvar.size() == 7)
180  thisCol = G4Colour(strtol(cvar.substr(0, 2).c_str(), NULL, 16)/255.0,
181  strtol(cvar.substr(2, 2).c_str(), NULL, 16)/255.0,
182  strtol(cvar.substr(4, 2).c_str(), NULL, 16)/255.0,
183  1.0 - stringToDouble(cvar.substr(6, 1))/5.0);
184 
185  return thisCol;
186 }
187 
188 
189 // gets last id from table, variation, run number
190 int getLastId(QSqlDatabase db, string t, string v, int run)
191 {
192  string dbexecute = " select max(id) from " + t ;
193  dbexecute += " where variation = '" + v ;
194  dbexecute += "' and rmin <= " + stringify(run) + " and rmax >= " + stringify(run) ;
195 
196  QSqlQuery q;
197  if(!q.exec(dbexecute.c_str()))
198  {
199  cout << " !!! Failed to execute MYSQL query " << dbexecute << ". This is a fatal error. Exiting." << endl;
200  qDebug() << q.lastError();
201  exit(0);
202  }
203  // Warning if nothing is found
204  if(q.size() == 0)
205  {
206  cout << endl << " >> WARNING: nothing found on \"" << t
207  << "\" with variation \"" << v << "\" for run number " << run << endl << endl;
208  return 0;
209  }
210  else
211  {
212  q.next();
213  return get_number(qv_tostring(q.value(0)));
214  }
215 
216 }
217 
218 
219 // open database according to options
220 QSqlDatabase openGdb(goptions gemcOpt)
221 {
222  string database = gemcOpt.optMap["DATABASE"].args;
223  string dbhost = gemcOpt.optMap["DBHOST"].args;
224  string dbUser = gemcOpt.optMap["DBUSER"].args;
225  string dbPswd = gemcOpt.optMap["DBPSWD"].args;
226  int dbPort = (int) gemcOpt.optMap["DBPORT"].arg;
227 
228  // getting connection if it's already opened.
229  // Otherwise creating a new one
230  QSqlDatabase db = QSqlDatabase::database();
231  if(!db.isOpen())
232  db = QSqlDatabase::addDatabase("QMYSQL");
233 
234  db.setHostName(dbhost.c_str());
235  db.setDatabaseName(database.c_str());
236  db.setUserName( dbUser.c_str() );
237  if(dbPort) db.setPort(dbPort);
238 
239  if(dbPswd != "no") db.setPassword( dbPswd.c_str() );
240 
241  bool ok = db.open();
242 
243  if(!ok)
244  {
245  cout << " Error! Cannot connect to database " << database << ". Exiting." << endl;
246  exit(-1);
247  }
248 
249  else
250  return db;
251 }
252 
253 
254 void closeGdb(QSqlDatabase db)
255 {
256  // closing db
257  db.close();
258  // remove connection
259  QSqlDatabase::removeDatabase("QMYSQL");
260 }
261 
262 
263 
264 map<string, string> getFilesInDirectory(string directory)
265 {
266  map<string, string> filesMap;
267 
268  DIR *dir;
269  struct dirent *ent;
270  dir = opendir(directory.c_str());
271  if (dir != NULL)
272  {
273  int len;
274  while ((ent = readdir (dir)) != NULL)
275  {
276  len = strlen(ent->d_name);
277 
278  // checking various extensions
279  if(strcmp(".dat", &(ent->d_name[len - 4])) == 0)
280  filesMap[directory + "/" + ent->d_name] = "ASCII" ;
281 
282  if(strcmp(".txt", &(ent->d_name[len - 4])) == 0)
283  filesMap[directory + "/" + ent->d_name] = "ASCII" ;
284 
285  }
286  closedir (dir);
287  }
288  else
289  {
290  cout << " Error: directory " << directory << " could not be opened." << endl;
291  }
292 
293  return filesMap;
294 }
295 
296 string assignAttribute(QDomElement e, string attribute, string defaultValue)
297 {
298  if(e.attributeNode(attribute.c_str()).isAttr())
299  return TrimSpaces(e.attributeNode(attribute.c_str()).value().toStdString());
300 
301  // otherwise
302  return defaultValue;
303 }
304 int assignAttribute(QDomElement e, string attribute, int defaultValue)
305 {
306  if(e.attributeNode(attribute.c_str()).isAttr())
307  return get_number(TrimSpaces(e.attributeNode(attribute.c_str()).value().toStdString()));
308 
309  return defaultValue;
310 }
311 double assignAttribute(QDomElement e, string attribute, double defaultValue)
312 {
313  if(e.attributeNode(attribute.c_str()).isAttr())
314  return get_number(TrimSpaces(e.attributeNode(attribute.c_str()).value().toStdString()));
315 
316  return defaultValue;
317 }
318 
319 #include "ctime"
320 string timeStamp()
321 {
322 
323  time_t now = time(NULL);
324  struct tm * ptm = localtime(&now);
325  char buffer[32];
326  // Format: Mo, 15.06.2009 20:20:00
327  strftime (buffer, 32, "%a, %m.%d.%Y %H:%M:%S", ptm);
328 
329  return string(buffer);
330 }
331 
332 
333 
334 // returns value + best units as a string
335 string bestValueUnits(double value, string unitType)
336 {
337  stringstream bestVU;
338  bestVU << G4BestUnit(value, unitType);
339  string var, uni;
340  bestVU >> var >> uni;
341 
342  return var + "*" + uni;
343 
344 }
345 
346 
347 
348 ostream &operator<<(ostream &stream, gtable gt)
349 {
350  cout << endl;
351 
352  for(unsigned i=0; i<gt.data.size(); i++)
353  cout << " data # " << i << ": " << gt.data[i] << endl;
354 
355  return stream;
356 }
357 
358 
359 
360 
361 
362 
363 
364 vector<double> convertVintVdouble(vector<int> input)
365 {
366  vector<double> out;
367 
368  for(unsigned i=0; i<input.size(); i++)
369  out.push_back(input[i]);
370 
371  return out;
372 }
373 
374 
375 
376 
377 
378 
379 
380 
string timeStamp()
Definition: utils.cc:320
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:254
QSqlDatabase openGdb(goptions gemcOpt)
Definition: utils.cc:220
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:190
vector< double > convertVintVdouble(vector< int > input)
Definition: utils.cc:364
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:151
string assignAttribute(QDomElement e, string attribute, string defaultValue)
Definition: utils.cc:296
string bestValueUnits(double value, string unitType)
Definition: utils.cc:335
G4RotationMatrix calc_rotation(string r, string dname)
Definition: utils.cc:85
string stringify(double x)
map< string, aopt > optMap
Options map.
Definition: options.h:71
G4Colour gcol(string cvar)
Definition: utils.cc:167
bool qt
Definition: utils.h:33
double stringToDouble(string v)
ostream & operator<<(ostream &stream, gtable gt)
Definition: utils.cc:348
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:264
~gui_splash()
Definition: utils.cc:48
QPixmap * splash_i
Definition: utils.h:37