00001 #include "BDSGlobalConstants.hh"
00002 #include "BDSGeometrySQL.hh"
00003 #include "G4Box.hh"
00004 #include "G4Trap.hh"
00005 #include "G4Tubs.hh"
00006 #include "G4Cons.hh"
00007 #include "G4EllipticalCone.hh"
00008 #include "G4Torus.hh"
00009 #include "G4SubtractionSolid.hh"
00010 #include "G4Polycone.hh"
00011 #include "G4VisAttributes.hh"
00012 #include "G4LogicalVolume.hh"
00013 #include "G4VPhysicalVolume.hh"
00014 #include "G4PVPlacement.hh"
00015 #include "G4UserLimits.hh"
00016 #include "BDSMySQLWrapper.hh"
00017 #include "BDSMaterials.hh"
00018 #include "G4SDManager.hh"
00019 #include "BDSSamplerSD.hh"
00020 #include "BDSSampler.hh"
00021 #include "BDSOutput.hh"
00022 #include <vector>
00023 #include <map>
00024 #include <cstdlib>
00025 #include "G4ClassicalRK4.hh"
00026 #include <cstring>
00027
00028 using namespace std;
00029
00030 extern BDSSamplerSD* BDSSamplerSensDet;
00031
00032 extern BDSMaterials* theMaterials;
00033 extern G4RotationMatrix* RotY90;
00034 extern BDSOutput bdsOutput;
00035 extern BDSGlobalConstants* BDSGlobals;
00036
00037 BDSGeometrySQL::BDSGeometrySQL(G4String DBfile, G4double markerlength)
00038 {
00039 itsMarkerLength = markerlength;
00040 ifs.open(DBfile.c_str());
00041 if(!ifs) G4Exception("Unable to load SQL database file: " + DBfile);
00042 align_in_volume = NULL;
00043 align_out_volume = NULL;
00044 HasFields = false;
00045 }
00046
00047 BDSGeometrySQL::~BDSGeometrySQL()
00048 {;}
00049
00050 void BDSGeometrySQL::Construct(G4LogicalVolume *marker)
00051 {
00052 itsMarkerVol = marker;
00053 VOL_LIST.push_back(itsMarkerVol);
00054 G4String file;
00055 char buffer[1000];
00056 while (ifs>>file)
00057 {
00058 if(file.contains("#")) ifs.getline(buffer,1000);
00059 else BuildSQLObjects(file);
00060 }
00061
00062
00063 ifs.close();
00064 }
00065
00066 void BDSGeometrySQL::BuildSQLObjects(G4String file)
00067 {
00068
00069 BDSMySQLWrapper sql(file);
00070 itsSQLTable=sql.ConstructTable();
00071
00072 for (G4int i=0; i<(G4int)itsSQLTable.size(); i++)
00073 {
00074
00075 G4String TableName = itsSQLTable[i]->GetName();
00076 G4int pos = TableName.find("_");
00077 G4String ObjectType = TableName.substr(pos+1,TableName.length() - pos);
00078 G4String::caseCompare cmpmode = G4String::ignoreCase;
00079 if(ObjectType.compareTo("CONE",cmpmode)==0) BuildCone(itsSQLTable[i]);
00080 else if(ObjectType.compareTo("ELLIPTICALCONE",cmpmode)==0) BuildEllipticalCone(itsSQLTable[i]);
00081 else if(ObjectType.compareTo("POLYCONE",cmpmode)==0) BuildPolyCone(itsSQLTable[i]);
00082 else if(ObjectType.compareTo("BOX",cmpmode)==0) BuildBox(itsSQLTable[i]);
00083 else if(ObjectType.compareTo("TRAP",cmpmode)==0) BuildTrap(itsSQLTable[i]);
00084 else if(ObjectType.compareTo("TORUS",cmpmode)==0) BuildTorus(itsSQLTable[i]);
00085 else if(ObjectType.compareTo("SAMPLER",cmpmode)==0) BuildSampler(itsSQLTable[i]);
00086 }
00087
00088 }
00089
00090 void BDSGeometrySQL::BuildCone(BDSMySQLTable* aSQLTable)
00091 {
00092 G4int NVariables = aSQLTable->GetVariable("LENGTH")->GetNVariables();
00093
00094 G4double length;
00095 G4double rInnerStart;
00096 G4double rInnerEnd;
00097 G4double rOuterStart;
00098 G4double rOuterEnd;
00099 G4double VisRed;
00100 G4double VisGreen;
00101 G4double VisBlue;
00102 G4String VisType;
00103 G4String Material;
00104 G4String TableName = aSQLTable->GetName();
00105 G4String Name;
00106 G4double sphi;
00107 G4double dphi;
00108
00109 for(G4int k=0; k<NVariables; k++)
00110 {
00111
00112 sphi =0.0;
00113 dphi = twopi*radian;
00114 length = rOuterStart = rOuterEnd = 10.*mm;
00115 rInnerStart = rInnerEnd = 0.0;
00116 VisRed = VisGreen = VisBlue = 0.;
00117 VisType = "S";
00118 Material = "VACUUM";
00119
00120 if(aSQLTable->GetVariable("RED")!=NULL)
00121 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00122 if(aSQLTable->GetVariable("BLUE")!=NULL)
00123 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00124 if(aSQLTable->GetVariable("GREEN")!=NULL)
00125 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00126 if(aSQLTable->GetVariable("VISATT")!=NULL)
00127 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00128 if(aSQLTable->GetVariable("LENGTH")!=NULL)
00129 length = aSQLTable->GetVariable("LENGTH")->GetDblValue(k);
00130 if(aSQLTable->GetVariable("RINNERSTART")!=NULL)
00131 rInnerStart = aSQLTable->GetVariable("RINNERSTART")->GetDblValue(k);
00132 if(aSQLTable->GetVariable("RINNEREND")!=NULL)
00133 rInnerEnd = aSQLTable->GetVariable("RINNEREND")->GetDblValue(k);
00134 if(aSQLTable->GetVariable("ROUTERSTART")!=NULL)
00135 rOuterStart = aSQLTable->GetVariable("ROUTERSTART")->GetDblValue(k);
00136 if(aSQLTable->GetVariable("ROUTEREND")!=NULL)
00137 rOuterEnd = aSQLTable->GetVariable("ROUTEREND")->GetDblValue(k);
00138 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00139 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00140 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00141 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00142 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00143 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00144 if(aSQLTable->GetVariable("NAME")!=NULL)
00145 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00146
00147 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00148
00149
00150 Name = itsMarkerVol->GetName()+"_"+Name;
00151
00152 G4Cons* aCone = new G4Cons(Name+"_Cone",
00153 rInnerStart,
00154 rOuterStart,
00155 rInnerEnd,
00156 rOuterEnd,
00157 length/2,
00158 sphi,
00159 dphi);
00160
00161 G4LogicalVolume* aConeVol =
00162 new G4LogicalVolume(aCone,
00163 theMaterials->GetMaterial(Material),
00164 Name+"_LogVol");
00165
00166 G4UserLimits* ConeUserLimits = new G4UserLimits();
00167 ConeUserLimits->SetMaxAllowedStep(length);
00168 aConeVol->SetUserLimits(ConeUserLimits);
00169 G4VisAttributes* VisAtt =
00170 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00171 switch (VisType(0))
00172 {
00173 case 'W': VisAtt->SetForceWireframe(true); break;
00174 case 'I': VisAtt->SetVisibility(false); break;
00175 case 'S': VisAtt->SetForceSolid(true); break;
00176 case 'w': VisAtt->SetForceWireframe(true); break;
00177 case 'i': VisAtt->SetVisibility(false); break;
00178 case 's': VisAtt->SetForceSolid(true); break;
00179 }
00180 aConeVol->SetVisAttributes(VisAtt);
00181
00182 VOL_LIST.push_back(aConeVol);
00183
00184 }
00185
00186 PlaceComponents(aSQLTable, VOL_LIST);
00187 }
00188
00189 void BDSGeometrySQL::BuildEllipticalCone(BDSMySQLTable* aSQLTable)
00190 {
00191 G4int NVariables = aSQLTable->GetVariable("LENGTHZ")->GetNVariables();
00192
00193 G4double lengthZ = 0;
00194 G4double pxSemiAxis = 0;
00195 G4double pySemiAxis = 0;
00196 G4double pzTopCut = 0;
00197 G4double VisRed;
00198 G4double VisGreen;
00199 G4double VisBlue;
00200 G4String VisType;
00201 G4String Material;
00202 G4String TableName = aSQLTable->GetName();
00203 G4String Name = "";
00204
00205 for(G4int k=0; k<NVariables; k++)
00206 {
00207
00208 lengthZ = 10.*mm;
00209 VisRed = VisGreen = VisBlue = 0.;
00210 VisType = "S";
00211 Material = "VACUUM";
00212
00213 if(aSQLTable->GetVariable("RED")!=NULL)
00214 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00215 if(aSQLTable->GetVariable("BLUE")!=NULL)
00216 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00217 if(aSQLTable->GetVariable("GREEN")!=NULL)
00218 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00219 if(aSQLTable->GetVariable("VISATT")!=NULL)
00220 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00221 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00222 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00223 if(aSQLTable->GetVariable("XSEMIAXIS")!=NULL)
00224 pxSemiAxis = aSQLTable->GetVariable("XSEMIAXIS")->GetDblValue(k);
00225 if(aSQLTable->GetVariable("YSEMIAXIS")!=NULL)
00226 pySemiAxis = aSQLTable->GetVariable("YSEMIAXIS")->GetDblValue(k);
00227 if(aSQLTable->GetVariable("ZCUT")!=NULL)
00228 pzTopCut = aSQLTable->GetVariable("ZCUT")->GetDblValue(k);
00229 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00230 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00231 if(aSQLTable->GetVariable("NAME")!=NULL)
00232 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00233
00234 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00235
00236
00237 Name = itsMarkerVol->GetName()+"_"+Name;
00238
00239 G4EllipticalCone* aEllipticalCone = new G4EllipticalCone(Name+"_EllipticalCone",
00240 pxSemiAxis,
00241 pySemiAxis,
00242 lengthZ/2,
00243 pzTopCut);
00244
00245 G4LogicalVolume* aEllipticalConeVol =
00246 new G4LogicalVolume(aEllipticalCone,
00247 theMaterials->GetMaterial(Material),
00248 Name+"_LogVol");
00249
00250 G4UserLimits* EllipticalConeUserLimits = new G4UserLimits();
00251 EllipticalConeUserLimits->SetMaxAllowedStep(lengthZ);
00252 aEllipticalConeVol->SetUserLimits(EllipticalConeUserLimits);
00253 G4VisAttributes* VisAtt =
00254 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00255 switch (VisType(0))
00256 {
00257 case 'W': VisAtt->SetForceWireframe(true); break;
00258 case 'I': VisAtt->SetVisibility(false); break;
00259 case 'S': VisAtt->SetForceSolid(true); break;
00260 case 'w': VisAtt->SetForceWireframe(true); break;
00261 case 'i': VisAtt->SetVisibility(false); break;
00262 case 's': VisAtt->SetForceSolid(true); break;
00263 }
00264 aEllipticalConeVol->SetVisAttributes(VisAtt);
00265
00266 VOL_LIST.push_back(aEllipticalConeVol);
00267
00268 }
00269
00270 PlaceComponents(aSQLTable, VOL_LIST);
00271 }
00272
00273 void BDSGeometrySQL::BuildPolyCone(BDSMySQLTable* aSQLTable)
00274 {
00275 G4int NVariables = aSQLTable->GetVariable("NZPLANES")->GetNVariables();
00276
00277 G4int numZplanes;
00278 G4double* rInner = NULL;
00279 G4double* rOuter = NULL;
00280 G4double* zPos = NULL;
00281 G4double VisRed;
00282 G4double VisGreen;
00283 G4double VisBlue;
00284 G4String VisType;
00285 G4String Material;
00286 G4String TableName = aSQLTable->GetName();
00287 G4String Name;
00288 G4double sphi;
00289 G4double dphi;
00290
00291 for(G4int k=0; k<NVariables; k++)
00292 {
00293
00294 sphi = 0.0;
00295 dphi = twopi*radian;
00296 numZplanes = 0;
00297 VisRed = VisGreen = VisBlue = 0.;
00298 VisType = "S";
00299 Material = "VACUUM";
00300
00301 if(aSQLTable->GetVariable("NZPLANES")!=NULL)
00302 numZplanes = aSQLTable->GetVariable("NZPLANES")->GetIntValue(k);
00303 rInner = new G4double[numZplanes+1];
00304 rOuter = new G4double[numZplanes+1];
00305 zPos = new G4double[numZplanes+1];
00306
00307 for(G4int planenum=0; planenum<numZplanes; planenum++)
00308 {
00309 G4String rInner_ID = "RINNER" + BDSGlobals->StringFromInt(planenum+1);
00310 G4String rOuter_ID = "ROUTER" + BDSGlobals->StringFromInt(planenum+1);
00311 G4String zPos_ID = "PLANEPOS" + BDSGlobals->StringFromInt(planenum+1);
00312
00313 if(aSQLTable->GetVariable(rInner_ID)!=NULL)
00314 rInner[planenum] = aSQLTable->GetVariable(rInner_ID)->GetDblValue(k);
00315 if(aSQLTable->GetVariable(rOuter_ID)!=NULL)
00316 rOuter[planenum] = aSQLTable->GetVariable(rOuter_ID)->GetDblValue(k);
00317
00318 if(aSQLTable->GetVariable(zPos_ID)!=NULL)
00319 zPos[planenum] = aSQLTable->GetVariable(zPos_ID)->GetDblValue(k);
00320 }
00321
00322 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00323 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00324 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00325 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00326 if(aSQLTable->GetVariable("RED")!=NULL)
00327 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00328 if(aSQLTable->GetVariable("BLUE")!=NULL)
00329 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00330 if(aSQLTable->GetVariable("GREEN")!=NULL)
00331 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00332 if(aSQLTable->GetVariable("VISATT")!=NULL)
00333 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00334 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00335 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00336 if(aSQLTable->GetVariable("NAME")!=NULL)
00337 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00338
00339 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00340
00341
00342 Name = itsMarkerVol->GetName()+"_"+Name;
00343
00344 G4Polycone* aPolyCone = new G4Polycone(Name+"_PolyCone",
00345 sphi,
00346 dphi,
00347 numZplanes,
00348 zPos,
00349 rInner,
00350 rOuter);
00351
00352 G4LogicalVolume* aPolyConeVol =
00353 new G4LogicalVolume(aPolyCone,
00354 theMaterials->GetMaterial(Material),
00355 Name+"_LogVol");
00356
00357 G4UserLimits* ConeUserLimits = new G4UserLimits();
00358 ConeUserLimits->SetMaxAllowedStep(fabs(zPos[0]-zPos[numZplanes-1]));
00359 aPolyConeVol->SetUserLimits(ConeUserLimits);
00360 G4VisAttributes* VisAtt =
00361 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00362 switch (VisType(0))
00363 {
00364 case 'W': VisAtt->SetForceWireframe(true); break;
00365 case 'I': VisAtt->SetVisibility(false); break;
00366 case 'S': VisAtt->SetForceSolid(true); break;
00367 case 'w': VisAtt->SetForceWireframe(true); break;
00368 case 'i': VisAtt->SetVisibility(false); break;
00369 case 's': VisAtt->SetForceSolid(true); break;
00370 }
00371 aPolyConeVol->SetVisAttributes(VisAtt);
00372
00373 VOL_LIST.push_back(aPolyConeVol);
00374
00375 delete [] rInner;
00376 rInner = NULL;
00377 delete [] rOuter;
00378 rOuter = NULL;
00379 delete [] zPos;
00380 zPos = NULL;
00381
00382 }
00383
00384 PlaceComponents(aSQLTable, VOL_LIST);
00385 }
00386
00387 void BDSGeometrySQL::BuildBox(BDSMySQLTable* aSQLTable)
00388 {
00389 G4int NVariables = aSQLTable->GetVariable("LENGTHX")->GetNVariables();
00390
00391 G4double lengthX;
00392 G4double lengthY;
00393 G4double lengthZ;
00394 G4double VisRed;
00395 G4double VisGreen;
00396 G4double VisBlue;
00397 G4String VisType;
00398 G4String Material;
00399 G4String TableName = aSQLTable->GetName();
00400
00401 G4String Name;
00402
00403 for(G4int k=0; k<NVariables; k++)
00404 {
00405 lengthX = lengthY = lengthZ = 10.*mm;
00406 VisRed = VisGreen = VisBlue = 0.;
00407 VisType = "S";
00408 Material = "VACUUM";
00409 if(aSQLTable->GetVariable("RED")!=NULL)
00410 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00411 if(aSQLTable->GetVariable("BLUE")!=NULL)
00412 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00413 if(aSQLTable->GetVariable("GREEN")!=NULL)
00414 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00415 if(aSQLTable->GetVariable("VISATT")!=NULL)
00416 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00417 if(aSQLTable->GetVariable("LENGTHX")!=NULL)
00418 lengthX = aSQLTable->GetVariable("LENGTHX")->GetDblValue(k);
00419 if(aSQLTable->GetVariable("LENGTHY")!=NULL)
00420 lengthY = aSQLTable->GetVariable("LENGTHY")->GetDblValue(k);
00421 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00422 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00423 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00424 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00425 if(aSQLTable->GetVariable("NAME")!=NULL)
00426 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00427
00428 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00429
00430
00431 Name = itsMarkerVol->GetName()+"_"+Name;
00432
00433 G4Box* aBox = new G4Box(Name+"_Box",
00434 lengthX/2,
00435 lengthY/2,
00436 lengthZ/2);
00437
00438 G4LogicalVolume* aBoxVol =
00439 new G4LogicalVolume(aBox,
00440 theMaterials->GetMaterial(Material),
00441 Name+"_LogVol");
00442
00443 G4UserLimits* BoxUserLimits = new G4UserLimits();
00444 BoxUserLimits->SetMaxAllowedStep(lengthZ);
00445 aBoxVol->SetUserLimits(BoxUserLimits);
00446 G4VisAttributes* VisAtt =
00447 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00448 switch (VisType(0))
00449 {
00450 case 'W': VisAtt->SetForceWireframe(true); break;
00451 case 'I': VisAtt->SetVisibility(false); break;
00452 case 'S': VisAtt->SetForceSolid(true); break;
00453 case 'w': VisAtt->SetForceWireframe(true); break;
00454 case 'i': VisAtt->SetVisibility(false); break;
00455 case 's': VisAtt->SetForceSolid(true); break;
00456 }
00457 aBoxVol->SetVisAttributes(VisAtt);
00458
00459 VOL_LIST.push_back(aBoxVol);
00460 }
00461
00462 PlaceComponents(aSQLTable, VOL_LIST);
00463 }
00464
00465 void BDSGeometrySQL::BuildTrap(BDSMySQLTable* aSQLTable)
00466 {
00467 G4int NVariables = aSQLTable->GetVariable("LENGTHXPLUS")->GetNVariables();
00468
00469 G4double lengthXPlus = 0;
00470 G4double lengthXMinus = 0;
00471 G4double lengthYPlus = 0;
00472 G4double lengthYMinus = 0;
00473 G4double lengthZ = 0;
00474 G4double VisRed;
00475 G4double VisGreen;
00476 G4double VisBlue;
00477 G4String VisType;
00478 G4String Material;
00479 G4String TableName = aSQLTable->GetName();
00480
00481 G4String Name = "";
00482
00483 for(G4int k=0; k<NVariables; k++)
00484 {
00485 VisRed = VisGreen = VisBlue = 0.;
00486 VisType = "S";
00487 Material = "VACUUM";
00488 if(aSQLTable->GetVariable("RED")!=NULL)
00489 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00490 if(aSQLTable->GetVariable("BLUE")!=NULL)
00491 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00492 if(aSQLTable->GetVariable("GREEN")!=NULL)
00493 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00494 if(aSQLTable->GetVariable("VISATT")!=NULL)
00495 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00496 if(aSQLTable->GetVariable("LENGTHXPLUS")!=NULL)
00497 lengthXPlus = aSQLTable->GetVariable("LENGTHXPLUS")->GetDblValue(k);
00498 if(aSQLTable->GetVariable("LENGTHXMINUS")!=NULL)
00499 lengthXMinus = aSQLTable->GetVariable("LENGTHXMINUS")->GetDblValue(k);
00500 if(aSQLTable->GetVariable("LENGTHYPLUS")!=NULL)
00501 lengthYPlus = aSQLTable->GetVariable("LENGTHYPLUS")->GetDblValue(k);
00502 if(aSQLTable->GetVariable("LENGTHYMINUS")!=NULL)
00503 lengthYMinus = aSQLTable->GetVariable("LENGTHYMINUS")->GetDblValue(k);
00504 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00505 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00506 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00507 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00508 if(aSQLTable->GetVariable("NAME")!=NULL)
00509 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00510
00511 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00512
00513
00514 Name = itsMarkerVol->GetName()+"_"+Name;
00515
00516 G4Trap* aTrap = new G4Trap(Name+"_Trd",
00517 lengthXPlus/2,
00518 lengthXMinus/2,
00519 lengthYPlus/2,
00520 lengthYMinus/2,
00521 lengthZ/2);
00522
00523 G4LogicalVolume* aTrapVol =
00524 new G4LogicalVolume(aTrap,
00525 theMaterials->GetMaterial(Material),
00526 Name+"_LogVol");
00527
00528 G4UserLimits* TrapUserLimits = new G4UserLimits();
00529 TrapUserLimits->SetMaxAllowedStep(lengthZ);
00530 aTrapVol->SetUserLimits(TrapUserLimits);
00531 G4VisAttributes* VisAtt =
00532 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00533 switch (VisType(0))
00534 {
00535 case 'W': VisAtt->SetForceWireframe(true); break;
00536 case 'I': VisAtt->SetVisibility(false); break;
00537 case 'S': VisAtt->SetForceSolid(true); break;
00538 case 'w': VisAtt->SetForceWireframe(true); break;
00539 case 'i': VisAtt->SetVisibility(false); break;
00540 case 's': VisAtt->SetForceSolid(true); break;
00541 }
00542 aTrapVol->SetVisAttributes(VisAtt);
00543
00544 VOL_LIST.push_back(aTrapVol);
00545 }
00546
00547 PlaceComponents(aSQLTable, VOL_LIST);
00548 }
00549
00550 void BDSGeometrySQL::BuildTorus(BDSMySQLTable* aSQLTable)
00551 {
00552 G4int NVariables = aSQLTable->GetVariable("RINNER")->GetNVariables();
00553
00554 G4double rInner;
00555 G4double rOuter;
00556 G4double rSwept;
00557 G4double sphi;
00558 G4double dphi;
00559 G4double VisRed;
00560 G4double VisGreen;
00561 G4double VisBlue;
00562 G4String VisType;
00563 G4String Material;
00564 G4String TableName = aSQLTable->GetName();
00565 G4String Name;
00566
00567 for(G4int k=0; k<NVariables; k++)
00568 {
00569
00570 rSwept = 20.*mm;
00571 rOuter = 10.*mm;
00572 rInner = 0.0;
00573 sphi = 0.0;
00574 dphi=2*pi*radian;
00575 VisRed = VisGreen = VisBlue = 0.;
00576 VisType = "S";
00577 Material = "VACUUM";
00578
00579 if(aSQLTable->GetVariable("RED")!=NULL)
00580 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00581 if(aSQLTable->GetVariable("BLUE")!=NULL)
00582 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00583 if(aSQLTable->GetVariable("GREEN")!=NULL)
00584 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00585 if(aSQLTable->GetVariable("VISATT")!=NULL)
00586 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00587 if(aSQLTable->GetVariable("RINNER")!=NULL)
00588 rInner = aSQLTable->GetVariable("RINNER")->GetDblValue(k);
00589 if(aSQLTable->GetVariable("ROUTER")!=NULL)
00590 rOuter = aSQLTable->GetVariable("ROUTER")->GetDblValue(k);
00591 if(aSQLTable->GetVariable("RSWEPT")!=NULL)
00592 rSwept = aSQLTable->GetVariable("RSWEPT")->GetDblValue(k);
00593 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00594 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00595 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00596 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00597 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00598 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00599 if(aSQLTable->GetVariable("NAME")!=NULL)
00600 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00601
00602 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00603
00604
00605 Name = itsMarkerVol->GetName()+"_"+Name;
00606
00607 G4Torus* aTorus = new G4Torus(Name+"_Torus",
00608 rInner,
00609 rOuter,
00610 rSwept,
00611 sphi,
00612 dphi);
00613
00614
00615 G4LogicalVolume* aTorusVol =
00616 new G4LogicalVolume(aTorus,
00617 theMaterials->GetMaterial(Material),
00618 Name+"_LogVol");
00619
00620 G4UserLimits* TorusUserLimits = new G4UserLimits();
00621 TorusUserLimits->SetMaxAllowedStep(rInner);
00622 aTorusVol->SetUserLimits(TorusUserLimits);
00623 G4VisAttributes* VisAtt =
00624 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00625 switch (VisType(0))
00626 {
00627 case 'W': VisAtt->SetForceWireframe(true); break;
00628 case 'I': VisAtt->SetVisibility(false); break;
00629 case 'S': VisAtt->SetForceSolid(true); break;
00630 case 'w': VisAtt->SetForceWireframe(true); break;
00631 case 'i': VisAtt->SetVisibility(false); break;
00632 case 's': VisAtt->SetForceSolid(true); break;
00633 }
00634 aTorusVol->SetVisAttributes(VisAtt);
00635
00636 VOL_LIST.push_back(aTorusVol);
00637
00638 }
00639
00640 PlaceComponents(aSQLTable, VOL_LIST);
00641 }
00642 void BDSGeometrySQL::BuildSampler(BDSMySQLTable* aSQLTable)
00643 {
00644 G4int NVariables = aSQLTable->GetVariable("LENGTH")->GetNVariables();
00645
00646 G4double length;
00647 G4double rInnerStart;
00648 G4double rInnerEnd;
00649 G4double rOuterStart;
00650 G4double rOuterEnd;
00651 G4double VisRed;
00652 G4double VisGreen;
00653 G4double VisBlue;
00654 G4String VisType;
00655 G4String Material;
00656 G4String TableName = aSQLTable->GetName();
00657 G4String Name;
00658
00659 for(G4int k=0; k<NVariables; k++)
00660 {
00661
00662 length = rOuterStart = rOuterEnd = 10.*mm;
00663 rInnerStart = rInnerEnd = 0.0;
00664 VisRed = VisGreen = VisBlue = 0.;
00665 VisType = "S";
00666 Material = "VACUUM";
00667
00668 if(aSQLTable->GetVariable("RED")!=NULL)
00669 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00670 if(aSQLTable->GetVariable("BLUE")!=NULL)
00671 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00672 if(aSQLTable->GetVariable("GREEN")!=NULL)
00673 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00674 if(aSQLTable->GetVariable("VISATT")!=NULL)
00675 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00676 if(aSQLTable->GetVariable("LENGTH")!=NULL)
00677 length = aSQLTable->GetVariable("LENGTH")->GetDblValue(k);
00678 if(aSQLTable->GetVariable("RINNERSTART")!=NULL)
00679 rInnerStart = aSQLTable->GetVariable("RINNERSTART")->GetDblValue(k);
00680 if(aSQLTable->GetVariable("RINNEREND")!=NULL)
00681 rInnerEnd = aSQLTable->GetVariable("RINNEREND")->GetDblValue(k);
00682 if(aSQLTable->GetVariable("ROUTERSTART")!=NULL)
00683 rOuterStart = aSQLTable->GetVariable("ROUTERSTART")->GetDblValue(k);
00684 if(aSQLTable->GetVariable("ROUTEREND")!=NULL)
00685 rOuterEnd = aSQLTable->GetVariable("ROUTEREND")->GetDblValue(k);
00686 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00687 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00688 if(aSQLTable->GetVariable("NAME")!=NULL)
00689 {
00690 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00691 aSQLTable->GetVariable("NAME")->SetStrValue(k,Name+"_SQL");
00692 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00693 }
00694 if(Name=="_SQL") Name = TableName+BDSGlobals->StringFromInt(k)+"_SQL";
00695
00696
00697 Name = itsMarkerVol->GetName()+"_"+Name;
00698
00699 G4Cons* aSampler = new G4Cons(Name+"_samp",
00700 rInnerStart,
00701 rOuterStart,
00702 rInnerEnd,
00703 rOuterEnd,
00704 length/2,
00705 0,
00706 twopi*radian);
00707
00708 G4LogicalVolume* aSamplerVol =
00709 new G4LogicalVolume(aSampler,
00710 theMaterials->GetMaterial(Material),
00711 Name+"_LogVol");
00712
00713 G4UserLimits* SamplerUserLimits = new G4UserLimits();
00714 SamplerUserLimits->SetMaxAllowedStep(length);
00715 aSamplerVol->SetUserLimits(SamplerUserLimits);
00716 G4VisAttributes* VisAtt =
00717 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00718 switch (VisType(0))
00719 {
00720 case 'W': VisAtt->SetForceWireframe(true); break;
00721 case 'I': VisAtt->SetVisibility(false); break;
00722 case 'S': VisAtt->SetForceSolid(true); break;
00723 case 'w': VisAtt->SetForceWireframe(true); break;
00724 case 'i': VisAtt->SetVisibility(false); break;
00725 case 's': VisAtt->SetForceSolid(true); break;
00726 }
00727 aSamplerVol->SetVisAttributes(VisAtt);
00728
00729 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
00730 if(BDSSampler::GetNSamplers==0){
00731 BDSSamplerSensDet = new BDSSamplerSD(Name, "plane");
00732 SDMan->AddNewDetector(BDSSamplerSensDet);
00733 }
00734 aSamplerVol->SetSensitiveDetector(BDSSamplerSensDet);
00735
00736 BDSSampler::AddExternalSampler();
00737 bdsOutput.SampName.push_back(BDSGlobals->StringFromInt(
00738 BDSSampler::GetNSamplers())+"_"+Name+"_1");
00739
00740 VOL_LIST.push_back(aSamplerVol);
00741 }
00742
00743 PlaceComponents(aSQLTable, VOL_LIST);
00744 }
00745
00746 G4RotationMatrix* BDSGeometrySQL::RotateComponent(G4double psi,G4double phi,G4double theta)
00747 {
00748 G4RotationMatrix *rotateComponent = new G4RotationMatrix;
00749 if(psi==0 && phi==0 && theta==0) return rotateComponent;
00750
00751 G4RotationMatrix LocalRotation;
00752 G4ThreeVector localX = G4ThreeVector(1.,0.,0.);
00753 G4ThreeVector localY = G4ThreeVector(0.,1.,0.);
00754 G4ThreeVector localZ = G4ThreeVector(0.,0.,1.);
00755
00756 LocalRotation.rotate(psi,localZ);
00757 localX.rotate(psi,localZ);
00758 localY.rotate(psi,localZ);
00759
00760
00761 LocalRotation.rotate(phi,localY);
00762 localX.rotate(phi,localY);
00763 localZ.rotate(phi,localY);
00764
00765
00766 LocalRotation.rotate(theta,localX);
00767 localY.rotate(theta,localX);
00768 localZ.rotate(theta,localX);
00769
00770 rotateComponent->transform(LocalRotation);
00771 rotateComponent->invert();
00772
00773 return rotateComponent;
00774 }
00775
00776
00777 void BDSGeometrySQL::PlaceComponents(BDSMySQLTable* aSQLTable, vector<G4LogicalVolume*> VOL_LIST)
00778 {
00779 G4double PosX;
00780 G4double PosY;
00781 G4double PosZ;
00782 G4double RotPsi;
00783 G4double RotTheta;
00784 G4double RotPhi;
00785 G4double K1,K2,K3,K4;
00786 G4String PARENTNAME;
00787 G4String InheritStyle;
00788 G4String Name;
00789 G4String MagType;
00790 G4String TableName = aSQLTable->GetName();
00791 G4int NVariables = aSQLTable->GetVariable("POSX")->GetNVariables();
00792 G4int align_in;
00793 G4int align_out;
00794 G4int SetSensitive;
00795 G4double FieldX, FieldY, FieldZ;
00796
00797 for(G4int k=0; k<NVariables; k++)
00798 {
00799
00800 PosX = PosY = PosZ = 0.;
00801 RotPsi = RotTheta = RotPhi = 0.;
00802 K1 = K2 = K3 = K4 = 0.;
00803 PARENTNAME = "";
00804 InheritStyle = "";
00805 align_in=0;
00806 align_out=0;
00807 SetSensitive=0;
00808 MagType = "";
00809 FieldX = FieldY = FieldZ = 0.0;
00810 if(aSQLTable->GetVariable("PARENTNAME")!=NULL)
00811 PARENTNAME = aSQLTable->GetVariable("PARENTNAME")->GetStrValue(k);
00812 if(aSQLTable->GetVariable("POSX")!=NULL)
00813 PosX = aSQLTable->GetVariable("POSX")->GetDblValue(k);
00814 if(aSQLTable->GetVariable("POSY")!=NULL)
00815 PosY = aSQLTable->GetVariable("POSY")->GetDblValue(k);
00816 if(aSQLTable->GetVariable("POSZ")!=NULL)
00817 PosZ = aSQLTable->GetVariable("POSZ")->GetDblValue(k);
00818 if(aSQLTable->GetVariable("ROTPSI")!=NULL)
00819 RotPsi = aSQLTable->GetVariable("ROTPSI")->GetDblValue(k);
00820 if(aSQLTable->GetVariable("ROTTHETA")!=NULL)
00821 RotTheta = aSQLTable->GetVariable("ROTTHETA")->GetDblValue(k);
00822 if(aSQLTable->GetVariable("ROTPHI")!=NULL)
00823 RotPhi = aSQLTable->GetVariable("ROTPHI")->GetDblValue(k);
00824 if(aSQLTable->GetVariable("K1")!=NULL)
00825 K1 = aSQLTable->GetVariable("K1")->GetDblValue(k);
00826 if(aSQLTable->GetVariable("K2")!=NULL)
00827 K2 = aSQLTable->GetVariable("K2")->GetDblValue(k);
00828 if(aSQLTable->GetVariable("K3")!=NULL)
00829 K3 = aSQLTable->GetVariable("K3")->GetDblValue(k);
00830 if(aSQLTable->GetVariable("K4")!=NULL)
00831 K4 = aSQLTable->GetVariable("K4")->GetDblValue(k);
00832 if(aSQLTable->GetVariable("MAGTYPE")!=NULL)
00833 MagType = aSQLTable->GetVariable("MAGTYPE")->GetStrValue(k);
00834 if(aSQLTable->GetVariable("FIELDX")!=NULL)
00835 FieldX = aSQLTable->GetVariable("FIELDX")->GetDblValue(k);
00836 if(aSQLTable->GetVariable("FIELDY")!=NULL)
00837 FieldY = aSQLTable->GetVariable("FIELDY")->GetDblValue(k);
00838 if(aSQLTable->GetVariable("FIELDZ")!=NULL)
00839 FieldZ = aSQLTable->GetVariable("FIELDZ")->GetDblValue(k);
00840 if(aSQLTable->GetVariable("ALIGNIN")!=NULL)
00841 align_in = aSQLTable->GetVariable("ALIGNIN")->GetIntValue(k);
00842 if(aSQLTable->GetVariable("ALIGNOUT")!=NULL)
00843 align_out = aSQLTable->GetVariable("ALIGNOUT")->GetIntValue(k);
00844 if(aSQLTable->GetVariable("SETSENSITIVE")!=NULL)
00845 SetSensitive = aSQLTable->GetVariable("SETSENSITIVE")->GetIntValue(k);
00846 if(aSQLTable->GetVariable("INHERITSTYLE")!=NULL)
00847 InheritStyle = aSQLTable->GetVariable("INHERITSTYLE")->GetStrValue(k);
00848 if(aSQLTable->GetVariable("NAME")!=NULL)
00849 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00850 if(Name=="_SQL") Name = TableName+BDSGlobals->StringFromInt(k) + "_SQL";
00851 if(Name=="") Name = TableName+BDSGlobals->StringFromInt(k);
00852
00853
00854 Name = itsMarkerVol->GetName()+"_"+Name;
00855
00856 if(PARENTNAME=="") PosZ-=itsMarkerLength/2;
00857
00858 PARENTNAME=itsMarkerVol->GetName()+"_"+PARENTNAME;
00859 G4String::caseCompare cmpmode = G4String::ignoreCase;
00860
00861 G4int PARENTID=0;
00862 if(PARENTNAME!=""){
00863 PARENTNAME+="_LogVol";
00864 for(G4int i=0; i<(G4int)VOL_LIST.size(); i++)
00865 {
00866 if(PARENTNAME.compareTo(VOL_LIST[i]->GetName(),cmpmode)==0)
00867 {
00868 PARENTID = i;
00869 continue;
00870 }
00871 }
00872 }
00873
00874
00875 G4String tmpname = Name+"_LogVol";
00876 G4int ID=0;
00877 for(G4int i=0; i<(G4int)VOL_LIST.size(); i++)
00878 {
00879 if(tmpname.compareTo(VOL_LIST[i]->GetName(),cmpmode)==0)
00880 {
00881 ID = i;
00882 continue;
00883 }
00884 }
00885
00886 if(SetSensitive) SensitiveComponents.push_back(VOL_LIST[ID]);
00887
00888 G4ThreeVector PlacementPoint(PosX,PosY,PosZ);
00889
00890 if(InheritStyle.compareTo("SUBTRACT",cmpmode)==0)
00891 {
00892 G4VSolid* original = VOL_LIST[PARENTID]->GetSolid();
00893 G4VSolid* sub = VOL_LIST[ID]->GetSolid();
00894 VOL_LIST[PARENTID]->SetSolid(new G4SubtractionSolid(VOL_LIST[PARENTID]->GetName(),
00895 original,
00896 sub,
00897 RotateComponent(RotPsi,RotPhi,RotTheta),
00898 PlacementPoint));
00899 }
00900
00901
00902 G4VPhysicalVolume* PhysiComp =
00903 new G4PVPlacement(RotateComponent(RotPsi,RotPhi,RotTheta),
00904 PlacementPoint,
00905 VOL_LIST[ID],
00906 Name,
00907 VOL_LIST[PARENTID],
00908 false,
00909 0);
00910
00911 if(align_in)
00912 {
00913
00914 if(align_in_volume!=NULL)
00915 {
00916 G4cerr<<"\nBDSGeometrySQL.cc:486: Trying to align in-beam to SQL volume to " << PhysiComp->GetName() << " but alignment already set to " << align_in_volume->GetName() << G4endl;
00917 G4Exception("Aborting Program");
00918
00919 }
00920
00921 else
00922 align_in_volume=PhysiComp;
00923
00924 }
00925
00926 if(align_out)
00927 {
00928 if(align_out_volume!=NULL)
00929 {
00930 G4cerr<<"\nBDSGeometrySQL.cc:486: Trying to align out-beam to SQL volume to " << PhysiComp->GetName() << " but alignment already set to " << align_out_volume->GetName() << G4endl;
00931 G4Exception("Aborting Program");
00932
00933 }
00934
00935 else
00936 align_out_volume=PhysiComp;
00937 }
00938
00939 G4double P0 = BDSGlobals->GetBeamTotalEnergy();
00940 G4double brho=
00941 sqrt(pow(P0,2)- pow(electron_mass_c2,2))/(0.299792458 * (GeV/(tesla*m)));
00942 if(MagType.compareTo("QUAD",cmpmode)==0)
00943 {
00944 HasFields = true;
00945 QuadBgrad.push_back(brho * K1 * tesla / m);
00946 Quadvol.push_back(PhysiComp->GetName());
00947 }
00948
00949 if(MagType.compareTo("SEXT",cmpmode)==0)
00950 {
00951 HasFields = true;
00952 SextBgrad.push_back(brho * K2 * tesla / (m*m));
00953 Sextvol.push_back(PhysiComp->GetName());
00954 }
00955
00956 if(MagType.compareTo("OCT",cmpmode)==0)
00957 {
00958 HasFields = true;
00959 OctBgrad.push_back(brho * K3 * tesla / (m*m*m));
00960 Octvol.push_back(PhysiComp->GetName());
00961 }
00962
00963 if(FieldX || FieldY || FieldZ)
00964 {
00965 HasFields = true;
00966 UniformField.push_back(G4ThreeVector(FieldX*tesla,FieldY*tesla,FieldZ*tesla));
00967 Fieldvol.push_back(PhysiComp->GetName());
00968 }
00969 }
00970 }