BmnRoot
Loading...
Searching...
No Matches
UniGeoConverter.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// ----- UniGeoConverter cxx file -----
3// ----- Created 04/08/15 by K. Gertsenberger -----
4// -------------------------------------------------------------------------
5#include "UniGeoConverter.h"
6
7#include "TFile.h"
8#include "TGeoArb8.h"
9#include "TGeoBBox.h"
10#include "TGeoCone.h"
11#include "TGeoEltu.h"
12#include "TGeoManager.h"
13#include "TGeoPara.h"
14#include "TGeoPgon.h"
15#include "TGeoShape.h"
16#include "TGeoSphere.h"
17#include "TGeoTorus.h"
18#include "TGeoTrd1.h"
19#include "TGeoTrd2.h"
20#include "TGeoTube.h"
21#include "TKey.h"
22
23#include <TSQLStatement.h>
24#include <iostream>
25using namespace std;
26
27// 0 - exit with error if it doesn't exist in DB, 1 - create in DB, 2 - skip this component
28#define Create_New_Component 1
29
30// ----- Constructor with DB connection -------------------------------
31UniGeoConverter::UniGeoConverter() {}
32// -------------------------------------------------------------------------
33
34// hierarchical writing geometry data to database
35int UniGeoConverter::RecursiveNodeChanging(TSQLServer* db_server, TGeoNode* node, int parent_node_id)
36{
37 for (int i = 0; i < node->GetNdaughters(); i++) {
38 TGeoNode* child = node->GetDaughter(i);
39 TGeoVolume* curVolume = child->GetVolume();
40 if (parent_node_id == -1)
41 cout << "Geometry for detector " << curVolume->GetName() << " is writing..." << endl;
42
43 // INSERT MEDIUM INFORMATION
44
45 // check media existence in DataBase
46 TGeoMedium* pMedium = child->GetMedium();
47 TString medium_name = pMedium->GetName();
48 medium_name.ToLower();
49 // cout<<"Medium name: "<<medium_name<<endl;
50
51 TString strStatement = TString::Format("SELECT media_name "
52 "FROM geometry_media "
53 "WHERE lower(media_name) = \"%s\"",
54 medium_name.Data());
55 TSQLStatement* stmt_select = uni_db->Statement(strStatement);
56
57 // process media selection
58 TSQLStatement* stmt_insert;
59 if (stmt_select->Process()) {
60 // store result of statement in buffer
61 stmt_select->StoreResult();
62
63 // if there is no this medium, should add it to DB
64 if (!stmt_select->NextResultRow()) {
65 TGeoMaterial* pMaterial = pMedium->GetMaterial();
66 // adding new media to DB
67 strStatement = TString::Format(
68 "INSERT INTO geometry_media(media_name, density, radiation_length, interaction_length, "
69 "sensitivity_flag, "
70 "field_flag, field_max, ang_deviation_max, step_max, energy_loss_max, b_crossing_precision, "
71 "step_min, media_desc) "
72 "VALUES (\"%s\", %f, %f, %f, %d, %d, %f, %f, %f ,%f, %f, %f, null)",
73 pMedium->GetName(), pMaterial->GetDensity(), pMaterial->GetRadLen(), pMaterial->GetIntLen(),
74 (int)pMedium->GetParam(0), (int)pMedium->GetParam(1), pMedium->GetParam(2), pMedium->GetParam(3),
75 pMedium->GetParam(4), pMedium->GetParam(5), pMedium->GetParam(6), pMedium->GetParam(7));
76 stmt_insert = uni_db->Statement(strStatement);
77
78 // process inserting the new medium
79 if (!stmt_insert->Process()) {
80 cout << "Error: insertion of new medium has been failed!" << endl;
81
82 delete stmt_insert;
83 return -20;
84 }
85
86 delete stmt_insert;
87
88 // adding medium component to DB
89 if (pMaterial->IsMixture()) {
90 stmt_insert = uni_db->Statement(
91 "INSERT INTO media_element(media_name, atomic_weight, atomic_number, relative_weight, Natoms) "
92 "VALUES (?, ?, ?, ?, ?)");
93
94 TGeoMixture* pMixture = (TGeoMixture*)pMaterial;
95 for (int j = 0; j < pMaterial->GetNelements(); j++) {
96
97 if (stmt_insert->NextIteration()) {
98 stmt_insert->SetString(0, pMedium->GetName());
99 stmt_insert->SetDouble(1, (pMixture->GetAmixt())[j]);
100 stmt_insert->SetDouble(2, (pMixture->GetZmixt())[j]);
101 stmt_insert->SetDouble(3, (pMixture->GetWmixt())[j]);
102 }
103 }
104
105 // process inserting medium component
106 if (!stmt_insert->Process()) {
107 cout << "Error: insertion of medium components (for mixture) has been failed!" << endl;
108
109 delete stmt_insert;
110 return -21;
111 }
112
113 delete stmt_insert;
114 } else {
115 strStatement = TString::Format(
116 "INSERT INTO media_element(media_name, atomic_weight, atomic_number, relative_weight, Natoms) "
117 "VALUES (\"%s\", %f, %f, null, null)",
118 pMedium->GetName(), pMaterial->GetA(), pMaterial->GetZ());
119 stmt_insert = uni_db->Statement(strStatement);
120
121 // process inserting medium component
122 if (!stmt_insert->Process()) {
123 cout << "ERROR: inserting medium component has been failed" << endl;
124
125 delete stmt_insert;
126 return -22;
127 }
128
129 delete stmt_insert;
130 }
131 } // end: if there is no this medium, should add it to DB
132 else
133 {
134 if (pMedium->GetName() != stmt_select->GetString(0))
135 pMedium->SetName(stmt_select->GetString(0));
136
137 delete stmt_select;
138 }
139 } // end: process media selection
140 else
141 {
142 cout << "ERROR: selecting geometry_media has been failed" << endl;
143
144 delete stmt_select;
145 return -10;
146 }
147
148 // DEFINE VOLUME SHAPE
149 dbShapeName curShape;
150 TGeoShape* pShape = curVolume->GetShape();
151 TString strShapeClass = pShape->ClassName();
152
153 if (pShape->TestShapeBit(TGeoShape::kGeoPgon))
154 curShape = dbGeoPgon;
155 else if (pShape->TestShapeBit(TGeoShape::kGeoPcon))
156 curShape = dbGeoPcon;
157 else if (pShape->TestShapeBit(TGeoShape::kGeoTubeSeg))
158 curShape = dbGeoTubeSeg;
159 else if (pShape->TestShapeBit(TGeoShape::kGeoTube))
160 curShape = dbGeoTube;
161 else if (pShape->TestShapeBit(TGeoShape::kGeoConeSeg))
162 curShape = dbGeoConeSeg;
163 else if (pShape->TestShapeBit(TGeoShape::kGeoCone))
164 curShape = dbGeoCone;
165 else if (pShape->TestShapeBit(TGeoShape::kGeoSph))
166 curShape = dbGeoSphere;
167 else if (pShape->TestShapeBit(TGeoShape::kGeoTorus))
168 curShape = dbGeoTorus;
169 else if (pShape->TestShapeBit(TGeoShape::kGeoTrd1))
170 curShape = dbGeoTrd1;
171 else if (pShape->TestShapeBit(TGeoShape::kGeoTrd2))
172 curShape = dbGeoTrd2;
173 else if (pShape->TestShapeBit(TGeoShape::kGeoTrap))
174 curShape = dbGeoTrap;
175 else if (pShape->TestShapeBit(TGeoShape::kGeoPara))
176 curShape = dbGeoPara;
177 else if (pShape->TestShapeBit(TGeoShape::kGeoComb))
178 curShape = dbGeoComb;
179 else if (pShape->TestShapeBit(TGeoShape::kGeoArb8))
180 curShape = dbGeoArb8;
181 else if (pShape->TestShapeBit(TGeoShape::kGeoEltu))
182 curShape = dbGeoEltu;
183 else if (pShape->TestShapeBit(TGeoShape::kGeoXtru))
184 curShape = dbGeoXtru;
185 else if (pShape->TestShapeBit(TGeoShape::kGeoBox)) {
186 if (strShapeClass == "TGeoShapeAssembly")
187 curShape = dbGeoShapeAssembly;
188 else
189 curShape = dbGeoBox;
190 } else {
191 cout << "Error: geometric shape has not been defined: " << strShapeClass << endl;
192 return -1;
193 }
194
195 /*dbShapeName curClassShape;
196 if (strShapeClass == "TGeoBBox") curClassShape = dbGeoBox;
197 else if (strShapeClass == "TGeoPgon") curClassShape = dbGeoPgon;
198 else if (strShapeClass == "TGeoPcon") curClassShape = dbGeoPcon;
199 else if (strShapeClass == "TGeoSphere") curClassShape = dbGeoSpere;
200 else if (strShapeClass == "TGeoTube") curClassShape = dbGeoTube;
201 else if (strShapeClass == "TGeoTubeSeg") curClassShape = dbGeoTubeSeg;
202 else if (strShapeClass == "TGeoTorus") curClassShape = dbGeoTorus;
203 else if (strShapeClass == "TGeoCone") curClassShape = dbGeoCone;
204 else if (strShapeClass == "TGeoConeSeg") curClassShape = dbGeoConeSeg;
205 else if (strShapeClass == "TGeoTrd1") curClassShape = dbGeoTrd1;
206 else if (strShapeClass == "TGeoTrd2") curClassShape = dbGeoTrd2;
207 else if (strShapeClass == "TGeoTrap") curClassShape = dbGeoTrap;
208 else if (strShapeClass == "TGeoCompositeShape") curClassShape = dbGeoComb;
209 else if (strShapeClass == "TGeoPara") curClassShape = dbGeoPara;
210 else if (strShapeClass == "TGeoArb8") curClassShape = dbGeoArb8;
211 else if (strShapeClass == "TGeoEltu") curClassShape = dbGeoEltu;
212 else if (strShapeClass == "TGeoXtru") curClassShape = dbGeoXtru;
213 else if (strShapeClass == "TGeoShapeAssembly") curClassShape = dbGeoShapeAssembly;
214 else
215 {
216 cout<<"Error: geometric shape has not been defined: "<<strShapeClass<<endl;
217 pShape->Dump();
218 return -1;
219 }
220
221 if (curShape != curClassShape)
222 {
223 cout<<"Error: geometric shape has not been defined correctly: "<<strShapeClass<<endl;
224 return -1;
225 }*/
226
227 // INSERT NODE INFORMATION
228
229 // if there is main detector (parent_id == -1)
230 if (parent_node_id == -1) {
231 // search for the corresponding detector in DB (component_name)
232 TString component_name = curVolume->GetName();
233 component_name.ToLower();
234 strStatement = TString::Format("SELECT component_name "
235 "FROM component "
236 "WHERE lower(component_name) = \"%s\"",
237 component_name.Data());
238 stmt_select = uni_db->Statement(strStatement);
239
240 // process selection
241 if (stmt_select->Process()) {
242 // store result of statement in buffer
243 stmt_select->StoreResult();
244
245 // if there is no this component in DB
246 if (!stmt_select->NextResultRow()) {
247 switch (Create_New_Component) {
248 // exit with error
249 case 0: {
250 cout << "ERROR: there is no such component in the database: " << curVolume->GetName()
251 << endl;
252
253 delete stmt_select;
254 return -2;
255 }
256 // skip this component
257 case 2: {
258 delete stmt_select;
259 continue;
260 }
261 // create new component in DB
262 case 1: {
263 // adding new component to DB
264 strStatement = TString::Format("INSERT INTO component(component_name, manufacturer_name, "
265 "responsible_person, description) "
266 "VALUES (\"%s\", null, null, null)",
267 curVolume->GetName());
268 stmt_insert = uni_db->Statement(strStatement);
269
270 // process inserting the new medium
271 if (!stmt_insert->Process()) {
272 cout << "Error: insertion of new component in DB has been failed!" << endl;
273
274 delete stmt_insert;
275 return -23;
276 }
277
278 delete stmt_insert;
279 }
280 } // switch (Create_New_Component)
281 }
282 // if the component exist
283 else
284 {
285 if (curVolume->GetName() != stmt_select->GetString(0))
286 curVolume->SetName(stmt_select->GetString(0));
287
288 delete stmt_select;
289 }
290 } else {
291 cout << "ERROR: selecting of the component has been failed" << endl;
292
293 delete stmt_select;
294 return -11;
295 }
296
297 strStatement =
298 TString::Format("INSERT INTO geometry_node(node_name, parent_node_id, media_name, shape_index) "
299 "VALUES (\"%s\", null, \"%s\", %d)",
300 child->GetName(), pMedium->GetName(), (int)curShape);
301 stmt_insert = uni_db->Statement(strStatement);
302
303 // process inserting geometry node
304 if (!stmt_insert->Process()) {
305 cout << "ERROR: inserting main geometry node has been failed" << endl;
306
307 delete stmt_insert;
308 return -24;
309 }
310
311 delete stmt_insert;
312 } else {
313 strStatement =
314 TString::Format("INSERT INTO geometry_node(node_name, parent_node_id, media_name, shape_index) "
315 "VALUES (\"%s\", %d, \"%s\", %d)",
316 child->GetName(), parent_node_id, pMedium->GetName(), (int)curShape);
317 stmt_insert = uni_db->Statement(strStatement);
318
319 // process inserting geometry node
320 if (!stmt_insert->Process()) {
321 cout << "ERROR: inserting child geometry node has been failed" << endl;
322
323 delete stmt_insert;
324 return -25;
325 }
326
327 delete stmt_insert;
328 }
329
330 // storing last inserted node ID
331 int last_id = parent_node_id;
332 TSQLStatement* stmt_last = db_server->Statement("SELECT LAST_INSERT_ID()");
333 // process getting last id
334 if (stmt_last->Process()) {
335 // store result of statement in buffer
336 stmt_last->StoreResult();
337
338 // if there is no last id then exit with error
339 if (!stmt_last->NextResultRow()) {
340 cout << "ERROR: there is no last ID in the database" << endl;
341
342 delete stmt_last;
343 return -3;
344 } else {
345 last_id = stmt_last->GetInt(0);
346
347 delete stmt_last;
348 }
349 } else {
350 cout << "ERROR: getting the last ID has been failed!" << endl;
351
352 delete stmt_last;
353 return -4;
354 }
355
356 // STORING SHAPE PARAMETERS
357 stmt_insert = uni_db->Statement("INSERT INTO geometry_parameter(node_id, parameter_type, parameter_value) "
358 "VALUES (?, ?, ?)");
359
360 switch (curShape) {
361 case dbGeoBox: {
362 TGeoBBox* pBox = (TGeoBBox*)pShape;
363 if (stmt_insert->NextIteration()) {
364 stmt_insert->SetInt(0, last_id);
365 stmt_insert->SetInt(1, dbParameterCenterX);
366 stmt_insert->SetDouble(2, pBox->GetOrigin()[0]);
367 }
368 if (stmt_insert->NextIteration()) {
369 stmt_insert->SetInt(0, last_id);
370 stmt_insert->SetInt(1, dbParameterCenterY);
371 stmt_insert->SetDouble(2, pBox->GetOrigin()[1]);
372 }
373 if (stmt_insert->NextIteration()) {
374 stmt_insert->SetInt(0, last_id);
375 stmt_insert->SetInt(1, dbParameterCenterZ);
376 stmt_insert->SetDouble(2, pBox->GetOrigin()[2]);
377 }
378 if (stmt_insert->NextIteration()) {
379 stmt_insert->SetInt(0, last_id);
380 stmt_insert->SetInt(1, dbParameterDXhalf);
381 stmt_insert->SetDouble(2, pBox->GetDX());
382 }
383 if (stmt_insert->NextIteration()) {
384 stmt_insert->SetInt(0, last_id);
385 stmt_insert->SetInt(1, dbParameterDYhalf);
386 stmt_insert->SetDouble(2, pBox->GetDY());
387 }
388 if (stmt_insert->NextIteration()) {
389 stmt_insert->SetInt(0, last_id);
390 stmt_insert->SetInt(1, dbParameterDZhalf);
391 stmt_insert->SetDouble(2, pBox->GetDZ());
392 }
393
394 break;
395 } // case dbGeoBox
396 case dbGeoTube: {
397 TGeoTube* pTube = (TGeoTube*)pShape;
398 if (stmt_insert->NextIteration()) {
399 stmt_insert->SetInt(0, last_id);
400 stmt_insert->SetInt(1, dbParameterRmin);
401 stmt_insert->SetDouble(2, pTube->GetRmin());
402 }
403 if (stmt_insert->NextIteration()) {
404 stmt_insert->SetInt(0, last_id);
405 stmt_insert->SetInt(1, dbParameterRmax);
406 stmt_insert->SetDouble(2, pTube->GetRmax());
407 }
408 if (stmt_insert->NextIteration()) {
409 stmt_insert->SetInt(0, last_id);
410 stmt_insert->SetInt(1, dbParameterDZhalf);
411 stmt_insert->SetDouble(2, pTube->GetDz());
412 }
413
414 break;
415 } // case dbGeoTube
416 case dbGeoTubeSeg: {
417 TGeoTubeSeg* pTubeSeg = (TGeoTubeSeg*)pShape;
418 if (stmt_insert->NextIteration()) {
419 stmt_insert->SetInt(0, last_id);
420 stmt_insert->SetInt(1, dbParameterRmin);
421 stmt_insert->SetDouble(2, pTubeSeg->GetRmin());
422 }
423 if (stmt_insert->NextIteration()) {
424 stmt_insert->SetInt(0, last_id);
425 stmt_insert->SetInt(1, dbParameterRmax);
426 stmt_insert->SetDouble(2, pTubeSeg->GetRmax());
427 }
428 if (stmt_insert->NextIteration()) {
429 stmt_insert->SetInt(0, last_id);
430 stmt_insert->SetInt(1, dbParameterDZhalf);
431 stmt_insert->SetDouble(2, pTubeSeg->GetDz());
432 }
433 if (stmt_insert->NextIteration()) {
434 stmt_insert->SetInt(0, last_id);
435 stmt_insert->SetInt(1, dbParameterPhi1);
436 stmt_insert->SetDouble(2, pTubeSeg->GetPhi1());
437 }
438 if (stmt_insert->NextIteration()) {
439 stmt_insert->SetInt(0, last_id);
440 stmt_insert->SetInt(1, dbParameterPhi2);
441 stmt_insert->SetDouble(2, pTubeSeg->GetPhi2());
442 }
443
444 break;
445 } // case dbGeoTubeSeg
446 case dbGeoPgon: {
447 TGeoPgon* pPgon = (TGeoPgon*)pShape;
448 if (stmt_insert->NextIteration()) {
449 stmt_insert->SetInt(0, last_id);
450 stmt_insert->SetInt(1, dbParameterPhi1);
451 stmt_insert->SetDouble(2, pPgon->GetPhi1());
452 }
453 if (stmt_insert->NextIteration()) {
454 stmt_insert->SetInt(0, last_id);
455 stmt_insert->SetInt(1, dbParameterDphi);
456 stmt_insert->SetDouble(2, pPgon->GetDphi());
457 }
458 if (stmt_insert->NextIteration()) {
459 stmt_insert->SetInt(0, last_id);
460 stmt_insert->SetInt(1, dbParameterNedges);
461 stmt_insert->SetDouble(2, pPgon->GetNedges());
462 }
463 if (stmt_insert->NextIteration()) {
464 stmt_insert->SetInt(0, last_id);
465 stmt_insert->SetInt(1, dbParameterNz);
466 stmt_insert->SetDouble(2, pPgon->GetNz());
467 }
468 for (int j = 0; j < pPgon->GetNz(); j++) {
469 if (stmt_insert->NextIteration()) {
470 stmt_insert->SetInt(0, last_id);
471 stmt_insert->SetInt(1, 100 + 3 * j);
472 stmt_insert->SetDouble(2, pPgon->GetZ()[j]);
473 }
474 if (stmt_insert->NextIteration()) {
475 stmt_insert->SetInt(0, last_id);
476 stmt_insert->SetInt(1, 101 + 3 * j);
477 stmt_insert->SetDouble(2, pPgon->GetRmin()[j]);
478 }
479 if (stmt_insert->NextIteration()) {
480 stmt_insert->SetInt(0, last_id);
481 stmt_insert->SetInt(1, 102 + 3 * j);
482 stmt_insert->SetDouble(2, pPgon->GetRmax()[j]);
483 }
484 }
485
486 break;
487 } // case dbGeoPgon
488 case dbGeoPcon: {
489 TGeoPcon* pPcon = (TGeoPcon*)pShape;
490 if (stmt_insert->NextIteration()) {
491 stmt_insert->SetInt(0, last_id);
492 stmt_insert->SetInt(1, dbParameterPhi1);
493 stmt_insert->SetDouble(2, pPcon->GetPhi1());
494 }
495 if (stmt_insert->NextIteration()) {
496 stmt_insert->SetInt(0, last_id);
497 stmt_insert->SetInt(1, dbParameterDphi);
498 stmt_insert->SetDouble(2, pPcon->GetDphi());
499 }
500 if (stmt_insert->NextIteration()) {
501 stmt_insert->SetInt(0, last_id);
502 stmt_insert->SetInt(1, dbParameterNz);
503 stmt_insert->SetDouble(2, pPcon->GetNz());
504 }
505 for (int j = 0; j < pPcon->GetNz(); j++) {
506 if (stmt_insert->NextIteration()) {
507 stmt_insert->SetInt(0, last_id);
508 stmt_insert->SetInt(1, 100 + 3 * j);
509 stmt_insert->SetDouble(2, pPcon->GetZ()[j]);
510 }
511 if (stmt_insert->NextIteration()) {
512 stmt_insert->SetInt(0, last_id);
513 stmt_insert->SetInt(1, 101 + 3 * j);
514 stmt_insert->SetDouble(2, pPcon->GetRmin()[j]);
515 }
516 if (stmt_insert->NextIteration()) {
517 stmt_insert->SetInt(0, last_id);
518 stmt_insert->SetInt(1, 102 + 3 * j);
519 stmt_insert->SetDouble(2, pPcon->GetRmax()[j]);
520 }
521 }
522
523 break;
524 } // case dbGeoPcon
525 case dbGeoSphere: {
526 TGeoSphere* pSphere = (TGeoSphere*)pShape;
527 if (stmt_insert->NextIteration()) {
528 stmt_insert->SetInt(0, last_id);
529 stmt_insert->SetInt(1, dbParameterRmin);
530 stmt_insert->SetDouble(2, pSphere->GetRmin());
531 }
532 if (stmt_insert->NextIteration()) {
533 stmt_insert->SetInt(0, last_id);
534 stmt_insert->SetInt(1, dbParameterRmax);
535 stmt_insert->SetDouble(2, pSphere->GetRmax());
536 }
537 if (stmt_insert->NextIteration()) {
538 stmt_insert->SetInt(0, last_id);
539 stmt_insert->SetInt(1, dbParameterTheta1);
540 stmt_insert->SetDouble(2, pSphere->GetTheta1());
541 }
542 if (stmt_insert->NextIteration()) {
543 stmt_insert->SetInt(0, last_id);
544 stmt_insert->SetInt(1, dbParameterTheta2);
545 stmt_insert->SetDouble(2, pSphere->GetTheta2());
546 }
547 if (stmt_insert->NextIteration()) {
548 stmt_insert->SetInt(0, last_id);
549 stmt_insert->SetInt(1, dbParameterPhi1);
550 stmt_insert->SetDouble(2, pSphere->GetPhi1());
551 }
552 if (stmt_insert->NextIteration()) {
553 stmt_insert->SetInt(0, last_id);
554 stmt_insert->SetInt(1, dbParameterPhi2);
555 stmt_insert->SetDouble(2, pSphere->GetPhi2());
556 }
557
558 break;
559 } // case dbGeoSphere
560 case dbGeoCone: {
561 TGeoCone* pCone = (TGeoCone*)pShape;
562 if (stmt_insert->NextIteration()) {
563 stmt_insert->SetInt(0, last_id);
564 stmt_insert->SetInt(1, dbParameterRmin);
565 stmt_insert->SetDouble(2, pCone->GetRmin1());
566 }
567 if (stmt_insert->NextIteration()) {
568 stmt_insert->SetInt(0, last_id);
569 stmt_insert->SetInt(1, dbParameterRmax);
570 stmt_insert->SetDouble(2, pCone->GetRmax1());
571 }
572 if (stmt_insert->NextIteration()) {
573 stmt_insert->SetInt(0, last_id);
574 stmt_insert->SetInt(1, dbParameterRmin2);
575 stmt_insert->SetDouble(2, pCone->GetRmin2());
576 }
577 if (stmt_insert->NextIteration()) {
578 stmt_insert->SetInt(0, last_id);
579 stmt_insert->SetInt(1, dbParameterRmax2);
580 stmt_insert->SetDouble(2, pCone->GetRmax2());
581 }
582 if (stmt_insert->NextIteration()) {
583 stmt_insert->SetInt(0, last_id);
584 stmt_insert->SetInt(1, dbParameterDZhalf);
585 stmt_insert->SetDouble(2, pCone->GetDz());
586 }
587
588 break;
589 } // case dbGeoCone
590 case dbGeoConeSeg: {
591 TGeoConeSeg* pConeSeg = (TGeoConeSeg*)pShape;
592 if (stmt_insert->NextIteration()) {
593 stmt_insert->SetInt(0, last_id);
594 stmt_insert->SetInt(1, dbParameterRmin);
595 stmt_insert->SetDouble(2, pConeSeg->GetRmin1());
596 }
597 if (stmt_insert->NextIteration()) {
598 stmt_insert->SetInt(0, last_id);
599 stmt_insert->SetInt(1, dbParameterRmax);
600 stmt_insert->SetDouble(2, pConeSeg->GetRmax1());
601 }
602 if (stmt_insert->NextIteration()) {
603 stmt_insert->SetInt(0, last_id);
604 stmt_insert->SetInt(1, dbParameterRmin2);
605 stmt_insert->SetDouble(2, pConeSeg->GetRmin2());
606 }
607 if (stmt_insert->NextIteration()) {
608 stmt_insert->SetInt(0, last_id);
609 stmt_insert->SetInt(1, dbParameterRmax2);
610 stmt_insert->SetDouble(2, pConeSeg->GetRmax2());
611 }
612 if (stmt_insert->NextIteration()) {
613 stmt_insert->SetInt(0, last_id);
614 stmt_insert->SetInt(1, dbParameterDZhalf);
615 stmt_insert->SetDouble(2, pConeSeg->GetDz());
616 }
617 if (stmt_insert->NextIteration()) {
618 stmt_insert->SetInt(0, last_id);
619 stmt_insert->SetInt(1, dbParameterPhi1);
620 stmt_insert->SetDouble(2, pConeSeg->GetPhi1());
621 }
622 if (stmt_insert->NextIteration()) {
623 stmt_insert->SetInt(0, last_id);
624 stmt_insert->SetInt(1, dbParameterPhi2);
625 stmt_insert->SetDouble(2, pConeSeg->GetPhi2());
626 }
627
628 break;
629 } // case dbGeoConeSeg
630 case dbGeoTrd1: {
631 TGeoTrd1* pTrd1 = (TGeoTrd1*)pShape;
632 if (stmt_insert->NextIteration()) {
633 stmt_insert->SetInt(0, last_id);
634 stmt_insert->SetInt(1, dbParameterDXhalf);
635 stmt_insert->SetDouble(2, pTrd1->GetDx1());
636 }
637 if (stmt_insert->NextIteration()) {
638 stmt_insert->SetInt(0, last_id);
639 stmt_insert->SetInt(1, dbParameterDXhalf2);
640 stmt_insert->SetDouble(2, pTrd1->GetDx2());
641 }
642 if (stmt_insert->NextIteration()) {
643 stmt_insert->SetInt(0, last_id);
644 stmt_insert->SetInt(1, dbParameterDYhalf);
645 stmt_insert->SetDouble(2, pTrd1->GetDy());
646 }
647 if (stmt_insert->NextIteration()) {
648 stmt_insert->SetInt(0, last_id);
649 stmt_insert->SetInt(1, dbParameterDZhalf);
650 stmt_insert->SetDouble(2, pTrd1->GetDz());
651 }
652
653 break;
654 } // case dbGeoTrd1
655 case dbGeoTrd2: {
656 TGeoTrd2* pTrd2 = (TGeoTrd2*)pShape;
657 if (stmt_insert->NextIteration()) {
658 stmt_insert->SetInt(0, last_id);
659 stmt_insert->SetInt(1, dbParameterDXhalf);
660 stmt_insert->SetDouble(2, pTrd2->GetDx1());
661 }
662 if (stmt_insert->NextIteration()) {
663 stmt_insert->SetInt(0, last_id);
664 stmt_insert->SetInt(1, dbParameterDXhalf2);
665 stmt_insert->SetDouble(2, pTrd2->GetDx2());
666 }
667 if (stmt_insert->NextIteration()) {
668 stmt_insert->SetInt(0, last_id);
669 stmt_insert->SetInt(1, dbParameterDYhalf);
670 stmt_insert->SetDouble(2, pTrd2->GetDy1());
671 }
672 if (stmt_insert->NextIteration()) {
673 stmt_insert->SetInt(0, last_id);
674 stmt_insert->SetInt(1, dbParameterDYhalf2);
675 stmt_insert->SetDouble(2, pTrd2->GetDy2());
676 }
677 if (stmt_insert->NextIteration()) {
678 stmt_insert->SetInt(0, last_id);
679 stmt_insert->SetInt(1, dbParameterDZhalf);
680 stmt_insert->SetDouble(2, pTrd2->GetDz());
681 }
682
683 break;
684 } // case dbGeoTrd2
685 case dbGeoArb8: {
686 TGeoArb8* pArb8 = (TGeoArb8*)pShape;
687 if (stmt_insert->NextIteration()) {
688 stmt_insert->SetInt(0, last_id);
689 stmt_insert->SetInt(1, dbParameterDZhalf);
690 stmt_insert->SetDouble(2, pArb8->GetDz());
691 }
692 Double_t* vert = pArb8->GetVertices();
693 for (int j = 0; j < 8; j++) {
694 stmt_insert->SetInt(0, last_id);
695 stmt_insert->SetInt(1, 100 + 3 * j);
696 stmt_insert->SetDouble(2, vert[3 * j]);
697 }
698
699 break;
700 } // case dbGeoArb8
701 case dbGeoEltu: {
702 TGeoEltu* pEltu = (TGeoEltu*)pShape;
703 if (stmt_insert->NextIteration()) {
704 stmt_insert->SetInt(0, last_id);
705 stmt_insert->SetInt(1, dbParameterDXhalf);
706 stmt_insert->SetDouble(2, pEltu->GetA());
707 }
708 if (stmt_insert->NextIteration()) {
709 stmt_insert->SetInt(0, last_id);
710 stmt_insert->SetInt(1, dbParameterDYhalf);
711 stmt_insert->SetDouble(2, pEltu->GetB());
712 }
713 if (stmt_insert->NextIteration()) {
714 stmt_insert->SetInt(0, last_id);
715 stmt_insert->SetInt(1, dbParameterDZhalf);
716 stmt_insert->SetDouble(2, pEltu->GetDz());
717 }
718
719 break;
720 } // case dbGeoEltu
721 case dbGeoPara: {
722 TGeoPara* pPara = (TGeoPara*)pShape;
723 if (stmt_insert->NextIteration()) {
724 stmt_insert->SetInt(0, last_id);
725 stmt_insert->SetInt(1, dbParameterDXhalf);
726 stmt_insert->SetDouble(2, pPara->GetX());
727 }
728 if (stmt_insert->NextIteration()) {
729 stmt_insert->SetInt(0, last_id);
730 stmt_insert->SetInt(1, dbParameterDYhalf);
731 stmt_insert->SetDouble(2, pPara->GetY());
732 }
733 if (stmt_insert->NextIteration()) {
734 stmt_insert->SetInt(0, last_id);
735 stmt_insert->SetInt(1, dbParameterDZhalf);
736 stmt_insert->SetDouble(2, pPara->GetZ());
737 }
738 if (stmt_insert->NextIteration()) {
739 stmt_insert->SetInt(0, last_id);
740 stmt_insert->SetInt(1, dbParameterAlpha1);
741 stmt_insert->SetDouble(2, pPara->GetAlpha());
742 }
743 if (stmt_insert->NextIteration()) {
744 stmt_insert->SetInt(0, last_id);
745 stmt_insert->SetInt(1, dbParameterTheta1);
746 stmt_insert->SetDouble(2, pPara->GetTheta());
747 }
748 if (stmt_insert->NextIteration()) {
749 stmt_insert->SetInt(0, last_id);
750 stmt_insert->SetInt(1, dbParameterPhi1);
751 stmt_insert->SetDouble(2, pPara->GetPhi());
752 }
753
754 break;
755 } // case dbGeoPara
756 case dbGeoTorus: {
757 TGeoTorus* pTorus = (TGeoTorus*)pShape;
758 if (stmt_insert->NextIteration()) {
759 stmt_insert->SetInt(0, last_id);
760 stmt_insert->SetInt(1, dbParameterR);
761 stmt_insert->SetDouble(2, pTorus->GetR());
762 }
763 if (stmt_insert->NextIteration()) {
764 stmt_insert->SetInt(0, last_id);
765 stmt_insert->SetInt(1, dbParameterRmin);
766 stmt_insert->SetDouble(2, pTorus->GetRmin());
767 }
768 if (stmt_insert->NextIteration()) {
769 stmt_insert->SetInt(0, last_id);
770 stmt_insert->SetInt(1, dbParameterRmax);
771 stmt_insert->SetDouble(2, pTorus->GetRmax());
772 }
773 if (stmt_insert->NextIteration()) {
774 stmt_insert->SetInt(0, last_id);
775 stmt_insert->SetInt(1, dbParameterPhi1);
776 stmt_insert->SetDouble(2, pTorus->GetPhi1());
777 }
778 if (stmt_insert->NextIteration()) {
779 stmt_insert->SetInt(0, last_id);
780 stmt_insert->SetInt(1, dbParameterDphi);
781 stmt_insert->SetDouble(2, pTorus->GetDphi());
782 }
783
784 break;
785 } // case dbGeoTorus
786 case dbGeoTrap: {
787 TGeoTrap* pTrap = (TGeoTrap*)pShape;
788 if (stmt_insert->NextIteration()) {
789 stmt_insert->SetInt(0, last_id);
790 stmt_insert->SetInt(1, dbParameterDZhalf);
791 stmt_insert->SetDouble(2, pTrap->GetDz());
792 }
793 if (stmt_insert->NextIteration()) {
794 stmt_insert->SetInt(0, last_id);
795 stmt_insert->SetInt(1, dbParameterTheta1);
796 stmt_insert->SetDouble(2, pTrap->GetTheta());
797 }
798 if (stmt_insert->NextIteration()) {
799 stmt_insert->SetInt(0, last_id);
800 stmt_insert->SetInt(1, dbParameterPhi1);
801 stmt_insert->SetDouble(2, pTrap->GetPhi());
802 }
803 if (stmt_insert->NextIteration()) {
804 stmt_insert->SetInt(0, last_id);
805 stmt_insert->SetInt(1, dbParameterH1);
806 stmt_insert->SetDouble(2, pTrap->GetH1());
807 }
808 if (stmt_insert->NextIteration()) {
809 stmt_insert->SetInt(0, last_id);
810 stmt_insert->SetInt(1, dbParameterBl1);
811 stmt_insert->SetDouble(2, pTrap->GetBl1());
812 }
813 if (stmt_insert->NextIteration()) {
814 stmt_insert->SetInt(0, last_id);
815 stmt_insert->SetInt(1, dbParameterTl1);
816 stmt_insert->SetDouble(2, pTrap->GetTl1());
817 }
818 if (stmt_insert->NextIteration()) {
819 stmt_insert->SetInt(0, last_id);
820 stmt_insert->SetInt(1, dbParameterAlpha1);
821 stmt_insert->SetDouble(2, pTrap->GetAlpha1());
822 }
823 if (stmt_insert->NextIteration()) {
824 stmt_insert->SetInt(0, last_id);
825 stmt_insert->SetInt(1, dbParameterH2);
826 stmt_insert->SetDouble(2, pTrap->GetH2());
827 }
828 if (stmt_insert->NextIteration()) {
829 stmt_insert->SetInt(0, last_id);
830 stmt_insert->SetInt(1, dbParameterBl2);
831 stmt_insert->SetDouble(2, pTrap->GetBl2());
832 }
833 if (stmt_insert->NextIteration()) {
834 stmt_insert->SetInt(0, last_id);
835 stmt_insert->SetInt(1, dbParameterTl2);
836 stmt_insert->SetDouble(2, pTrap->GetTl2());
837 }
838 if (stmt_insert->NextIteration()) {
839 stmt_insert->SetInt(0, last_id);
840 stmt_insert->SetInt(1, dbParameterAlpha2);
841 stmt_insert->SetDouble(2, pTrap->GetAlpha2());
842 }
843
844 break;
845 } // case dbGeoTrap
846 } // switch (curShape)
847
848 // process inserting geometry parameters
849 if (!stmt_insert->Process()) {
850 cout << "ERROR: inserting geometry parameters has been failed!" << endl;
851
852 delete stmt_insert;
853 return -26;
854 }
855
856 delete stmt_insert;
857
858 // recursive child nodes
859 if (child->GetNdaughters() != 0)
860 RecursiveNodeChanging(uni_db, child, last_id);
861 } // for(int i = 0; i < node->GetNdaughters(); i++)
862
863 return 0;
864}
865
866// ----- Writing detector geometry in ROOT format to database -------------------------------
867int UniGeoConverter::WriteRootGeoToDB(TString geo_file_path)
868{
869 if (geo_file_path == "") {
870 cout << "ERROR: geometry file path cannot be empty!" << endl;
871 return -1;
872 }
873
875 if (connectionUniDb == nullptr) {
876 cout << "ERROR: connection to the database cannot be established" << endl;
877 return -2;
878 }
879
880 TSQLServer* db_server = connDb->GetSQLServer();
881
882 // get detector geometry from ROOT file
883 TFile* geoFile = new TFile(geo_file_path, "READ");
884 if (!geoFile->IsOpen()) {
885 cout << "ERROR: geometry file has not be opened" << endl;
886 return -3;
887 }
888
889 // get gGeoManager from file with full geometry
890 TList* keyList = geoFile->GetListOfKeys();
891 TIter next(keyList);
892 TKey* key = (TKey*)next();
893 TString className(key->GetClassName());
894 if (className.BeginsWith("TGeoManager")) {
895 // geoMan = dynamic_cast<TGeoManager*> (key->ReadObj() );
896 key->ReadObj();
897 } else {
898 cout << "ERROR: TGeoManager is not top element in the given file: " << geo_file_path << endl;
899 return -4;
900 }
901
902 TGeoNode* N = gGeoManager->GetTopNode();
903 int db_res = RecursiveNodeChanging(uni_db, N, -1);
904
905 delete connectionUniDb;
906
907 return db_res;
908}
909
910// -------------------------------------------------------------------
int i
Definition P4_F32vec4.h:22
#define Create_New_Component
@ dbParameterDYhalf2
@ dbParameterCenterZ
@ dbParameterDYhalf
@ dbParameterDXhalf
@ dbParameterR
@ dbParameterDZhalf
@ dbParameterRmin2
@ dbParameterRmax2
@ dbParameterNz
@ dbParameterH2
@ dbParameterRmin
@ dbParameterBl1
@ dbParameterPhi2
@ dbParameterTheta2
@ dbParameterCenterX
@ dbParameterRmax
@ dbParameterTheta1
@ dbParameterTl2
@ dbParameterAlpha2
@ dbParameterNedges
@ dbParameterDphi
@ dbParameterAlpha1
@ dbParameterPhi1
@ dbParameterCenterY
@ dbParameterH1
@ dbParameterBl2
@ dbParameterDXhalf2
@ dbParameterTl1
dbShapeName
@ dbGeoTrap
@ dbGeoEltu
@ dbGeoCone
@ dbGeoComb
@ dbGeoArb8
@ dbGeoTrd1
@ dbGeoXtru
@ dbGeoTrd2
@ dbGeoTube
@ dbGeoTorus
@ dbGeoPgon
@ dbGeoPcon
@ dbGeoPara
@ dbGeoConeSeg
@ dbGeoShapeAssembly
@ dbGeoBox
@ dbGeoTubeSeg
@ dbGeoSphere
static UniConnection * Open()
TSQLServer * GetSQLServer()
static int WriteRootGeoToDB(TString geo_file_path)
STL namespace.