00001 #include "BDSGlobalConstants.hh"
00002 #include "BDSGeometrySQL.hh"
00003 #include "G4Box.hh"
00004 #include "G4Trap.hh"
00005 #include "G4Tubs.hh"
00006 #include "G4EllipticalTube.hh"
00007 #include "G4Cons.hh"
00008 #include "G4EllipticalCone.hh"
00009 #include "G4Torus.hh"
00010 #include "G4SubtractionSolid.hh"
00011 #include "G4IntersectionSolid.hh"
00012 #include "G4UnionSolid.hh"
00013 #include "G4Polycone.hh"
00014 #include "G4VisAttributes.hh"
00015 #include "G4LogicalVolume.hh"
00016 #include "G4VPhysicalVolume.hh"
00017 #include "G4PVPlacement.hh"
00018 #include "G4UserLimits.hh"
00019 #include "BDSMySQLWrapper.hh"
00020 #include "BDSMaterials.hh"
00021 #include "G4SDManager.hh"
00022 #include "BDSSamplerSD.hh"
00023 #include "BDSSampler.hh"
00024 #include "BDSOutput.hh"
00025 #include "BDSPCLTube.hh"
00026 #include <vector>
00027 #include <map>
00028 #include <cstdlib>
00029 #include "G4ClassicalRK4.hh"
00030 #include <cstring>
00031
00032 using namespace std;
00033
00034 extern BDSSamplerSD* BDSSamplerSensDet;
00035
00036 extern G4RotationMatrix* RotY90;
00037 extern BDSOutput* bdsOutput;
00038
00039
00040 BDSGeometrySQL::BDSGeometrySQL(G4String DBfile, G4double markerlength):
00041 rotateComponent(NULL),itsMarkerVol(NULL),itsMagField(NULL),SensDet(NULL)
00042 {
00043 itsMarkerLength = markerlength;
00044 G4cout << "BDSGeometrySQL constructor: loading SQL file " << DBfile << G4endl;
00045 ifs.open(DBfile.c_str());
00046 G4String exceptionString = "Unable to load SQL database file: " + DBfile;
00047 if(!ifs) G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00048 align_in_volume = NULL;
00049 align_out_volume = NULL;
00050 HasFields = false;
00051 nPoleField = 0;
00052 HasUniformField = false;
00053 }
00054
00055 BDSGeometrySQL::~BDSGeometrySQL(){
00056 delete rotateComponent;
00057 }
00058
00059 void BDSGeometrySQL::Construct(G4LogicalVolume *marker)
00060 {
00061 itsMarkerVol = marker;
00062 VOL_LIST.push_back(itsMarkerVol);
00063 G4String file;
00064 char buffer[1000];
00065 while (ifs>>file)
00066 {
00067 if(file.contains("#")) ifs.getline(buffer,1000);
00068 else BuildSQLObjects(file);
00069 }
00070
00071
00072 ifs.close();
00073 }
00074
00075 void BDSGeometrySQL::BuildSQLObjects(G4String file)
00076 {
00077 G4cout << "BDSGeometrySQL::BuildSQLObjects Loading file " << file << G4endl;
00078
00079 G4String fullpath = BDSGlobalConstants::Instance()->GetBDSIMHOME();
00080 fullpath += file;
00081 G4cout << "BDSGeometrySQL::BuildSQLObjects Full path is " << fullpath << G4endl;
00082
00083 BDSMySQLWrapper sql(fullpath);
00084 itsSQLTable=sql.ConstructTable();
00085
00086 for (G4int i=0; i<(G4int)itsSQLTable.size(); i++)
00087 {
00088
00089 G4String TableName = itsSQLTable[i]->GetName();
00090 G4int pos = TableName.find("_");
00091 G4String ObjectType = TableName.substr(pos+1,TableName.length() - pos);
00092 G4String::caseCompare cmpmode = G4String::ignoreCase;
00093 if(ObjectType.compareTo("CONE",cmpmode)==0) BuildCone(itsSQLTable[i]);
00094 else if(ObjectType.compareTo("ELLIPTICALCONE",cmpmode)==0) BuildEllipticalCone(itsSQLTable[i]);
00095 else if(ObjectType.compareTo("POLYCONE",cmpmode)==0) BuildPolyCone(itsSQLTable[i]);
00096 else if(ObjectType.compareTo("BOX",cmpmode)==0) BuildBox(itsSQLTable[i]);
00097 else if(ObjectType.compareTo("TRAP",cmpmode)==0) BuildTrap(itsSQLTable[i]);
00098 else if(ObjectType.compareTo("TORUS",cmpmode)==0) BuildTorus(itsSQLTable[i]);
00099 else if(ObjectType.compareTo("SAMPLER",cmpmode)==0) BuildSampler(itsSQLTable[i]);
00100 else if(ObjectType.compareTo("TUBE",cmpmode)==0) BuildTube(itsSQLTable[i]);
00101 else if(ObjectType.compareTo("ELLIPTICALTUBE",cmpmode)==0) BuildEllipticalTube(itsSQLTable[i]);
00102 else if(ObjectType.compareTo("PCLTUBE",cmpmode)==0) BuildPCLTube(itsSQLTable[i]);
00103 }
00104
00105 }
00106
00107 void BDSGeometrySQL::BuildCone(BDSMySQLTable* aSQLTable)
00108 {
00109 G4int NVariables = aSQLTable->GetVariable("LENGTH")->GetNVariables();
00110
00111 G4double length;
00112 G4double rInnerStart;
00113 G4double rInnerEnd;
00114 G4double rOuterStart;
00115 G4double rOuterEnd;
00116 G4double VisRed;
00117 G4double VisGreen;
00118 G4double VisBlue;
00119 G4String VisType;
00120 G4String Material;
00121 G4String TableName = aSQLTable->GetName();
00122 G4String Name;
00123 G4double sphi;
00124 G4double dphi;
00125
00126 for(G4int k=0; k<NVariables; k++)
00127 {
00128
00129 sphi =0.0;
00130 dphi = twopi*radian;
00131 length = rOuterStart = rOuterEnd = 10.*mm;
00132 rInnerStart = rInnerEnd = 0.0;
00133 VisRed = VisGreen = VisBlue = 0.;
00134 VisType = "S";
00135 Material = "VACUUM";
00136
00137 if(aSQLTable->GetVariable("RED")!=NULL)
00138 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00139 if(aSQLTable->GetVariable("BLUE")!=NULL)
00140 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00141 if(aSQLTable->GetVariable("GREEN")!=NULL)
00142 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00143 if(aSQLTable->GetVariable("VISATT")!=NULL)
00144 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00145 if(aSQLTable->GetVariable("LENGTH")!=NULL)
00146 length = aSQLTable->GetVariable("LENGTH")->GetDblValue(k);
00147 if(aSQLTable->GetVariable("RINNERSTART")!=NULL)
00148 rInnerStart = aSQLTable->GetVariable("RINNERSTART")->GetDblValue(k);
00149 if(aSQLTable->GetVariable("RINNEREND")!=NULL)
00150 rInnerEnd = aSQLTable->GetVariable("RINNEREND")->GetDblValue(k);
00151 if(aSQLTable->GetVariable("ROUTERSTART")!=NULL)
00152 rOuterStart = aSQLTable->GetVariable("ROUTERSTART")->GetDblValue(k);
00153 if(aSQLTable->GetVariable("ROUTEREND")!=NULL)
00154 rOuterEnd = aSQLTable->GetVariable("ROUTEREND")->GetDblValue(k);
00155 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00156 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00157 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00158 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00159 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00160 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00161 if(aSQLTable->GetVariable("NAME")!=NULL)
00162 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00163
00164 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00165
00166
00167 Name = itsMarkerVol->GetName()+"_"+Name;
00168
00169 G4Cons* aCone = new G4Cons(Name+"_Cone",
00170 rInnerStart,
00171 rOuterStart,
00172 rInnerEnd,
00173 rOuterEnd,
00174 length/2,
00175 sphi,
00176 dphi);
00177
00178 G4LogicalVolume* aConeVol =
00179 new G4LogicalVolume(aCone,
00180 BDSMaterials::Instance()->GetMaterial(Material),
00181 Name+"_LogVol");
00182 #ifndef NOUSERLIMITS
00183 G4UserLimits* ConeUserLimits = new G4UserLimits();
00184 ConeUserLimits->SetMaxAllowedStep(length*5);
00185 ConeUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00186 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00187 ConeUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00188 }
00189 aConeVol->SetUserLimits(ConeUserLimits);
00190 #endif
00191 G4VisAttributes* VisAtt =
00192 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00193 switch (VisType(0))
00194 {
00195 case 'W': VisAtt->SetForceWireframe(true); break;
00196 case 'I': VisAtt->SetVisibility(false); break;
00197 case 'S': VisAtt->SetForceSolid(true); break;
00198 case 'w': VisAtt->SetForceWireframe(true); break;
00199 case 'i': VisAtt->SetVisibility(false); break;
00200 case 's': VisAtt->SetForceSolid(true); break;
00201 }
00202 aConeVol->SetVisAttributes(VisAtt);
00203
00204 VOL_LIST.push_back(aConeVol);
00205
00206 }
00207
00208 PlaceComponents(aSQLTable, VOL_LIST);
00209 }
00210
00211 void BDSGeometrySQL::BuildEllipticalCone(BDSMySQLTable* aSQLTable)
00212 {
00213 G4int NVariables = aSQLTable->GetVariable("LENGTHZ")->GetNVariables();
00214
00215 G4double lengthZ = 0;
00216 G4double pxSemiAxis = 0;
00217 G4double pySemiAxis = 0;
00218 G4double pzTopCut = 0;
00219 G4double VisRed;
00220 G4double VisGreen;
00221 G4double VisBlue;
00222 G4String VisType;
00223 G4String Material;
00224 G4String TableName = aSQLTable->GetName();
00225 G4String Name = "";
00226
00227 for(G4int k=0; k<NVariables; k++)
00228 {
00229
00230 lengthZ = 10.*mm;
00231 VisRed = VisGreen = VisBlue = 0.;
00232 VisType = "S";
00233 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00234
00235 if(aSQLTable->GetVariable("RED")!=NULL)
00236 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00237 if(aSQLTable->GetVariable("BLUE")!=NULL)
00238 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00239 if(aSQLTable->GetVariable("GREEN")!=NULL)
00240 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00241 if(aSQLTable->GetVariable("VISATT")!=NULL)
00242 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00243 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00244 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00245 if(aSQLTable->GetVariable("XSEMIAXIS")!=NULL)
00246 pxSemiAxis = aSQLTable->GetVariable("XSEMIAXIS")->GetDblValue(k);
00247 if(aSQLTable->GetVariable("YSEMIAXIS")!=NULL)
00248 pySemiAxis = aSQLTable->GetVariable("YSEMIAXIS")->GetDblValue(k);
00249 if(aSQLTable->GetVariable("ZCUT")!=NULL)
00250 pzTopCut = aSQLTable->GetVariable("ZCUT")->GetDblValue(k);
00251 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00252 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00253 if(aSQLTable->GetVariable("NAME")!=NULL)
00254 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00255
00256 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00257
00258
00259 Name = itsMarkerVol->GetName()+"_"+Name;
00260
00261 G4EllipticalCone* aEllipticalCone = new G4EllipticalCone(Name+"_EllipticalCone",
00262 pxSemiAxis,
00263 pySemiAxis,
00264 lengthZ/2,
00265 pzTopCut);
00266
00267 G4LogicalVolume* aEllipticalConeVol =
00268 new G4LogicalVolume(aEllipticalCone,
00269 BDSMaterials::Instance()->GetMaterial(Material),
00270 Name+"_LogVol");
00271 #ifndef NOUSERLIMITS
00272 G4UserLimits* EllipticalConeUserLimits = new G4UserLimits();
00273 EllipticalConeUserLimits->SetMaxAllowedStep(lengthZ*5);
00274 EllipticalConeUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00275 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00276 EllipticalConeUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00277 }
00278 aEllipticalConeVol->SetUserLimits(EllipticalConeUserLimits);
00279 #endif
00280 G4VisAttributes* VisAtt =
00281 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00282 switch (VisType(0))
00283 {
00284 case 'W': VisAtt->SetForceWireframe(true); break;
00285 case 'I': VisAtt->SetVisibility(false); break;
00286 case 'S': VisAtt->SetForceSolid(true); break;
00287 case 'w': VisAtt->SetForceWireframe(true); break;
00288 case 'i': VisAtt->SetVisibility(false); break;
00289 case 's': VisAtt->SetForceSolid(true); break;
00290 }
00291 aEllipticalConeVol->SetVisAttributes(VisAtt);
00292
00293 VOL_LIST.push_back(aEllipticalConeVol);
00294
00295 }
00296
00297 PlaceComponents(aSQLTable, VOL_LIST);
00298 }
00299
00300 void BDSGeometrySQL::BuildPolyCone(BDSMySQLTable* aSQLTable)
00301 {
00302 G4int NVariables = aSQLTable->GetVariable("NZPLANES")->GetNVariables();
00303
00304 G4int numZplanes;
00305 G4double* rInner = NULL;
00306 G4double* rOuter = NULL;
00307 G4double* zPos = NULL;
00308 G4double VisRed;
00309 G4double VisGreen;
00310 G4double VisBlue;
00311 G4String VisType;
00312 G4String Material;
00313 G4String TableName = aSQLTable->GetName();
00314 G4String Name;
00315 G4double sphi;
00316 G4double dphi;
00317
00318 for(G4int k=0; k<NVariables; k++)
00319 {
00320
00321 sphi = 0.0;
00322 dphi = twopi*radian;
00323 numZplanes = 0;
00324 VisRed = VisGreen = VisBlue = 0.;
00325 VisType = "S";
00326 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00327
00328 if(aSQLTable->GetVariable("NZPLANES")!=NULL)
00329 numZplanes = aSQLTable->GetVariable("NZPLANES")->GetIntValue(k);
00330 rInner = new G4double[numZplanes+1];
00331 rOuter = new G4double[numZplanes+1];
00332 zPos = new G4double[numZplanes+1];
00333
00334 for(G4int planenum=0; planenum<numZplanes; planenum++)
00335 {
00336 G4String rInner_ID = "RINNER" + BDSGlobalConstants::Instance()->StringFromInt(planenum+1);
00337 G4String rOuter_ID = "ROUTER" + BDSGlobalConstants::Instance()->StringFromInt(planenum+1);
00338 G4String zPos_ID = "PLANEPOS" + BDSGlobalConstants::Instance()->StringFromInt(planenum+1);
00339
00340 if(aSQLTable->GetVariable(rInner_ID)!=NULL)
00341 rInner[planenum] = aSQLTable->GetVariable(rInner_ID)->GetDblValue(k);
00342 if(aSQLTable->GetVariable(rOuter_ID)!=NULL)
00343 rOuter[planenum] = aSQLTable->GetVariable(rOuter_ID)->GetDblValue(k);
00344
00345 if(aSQLTable->GetVariable(zPos_ID)!=NULL)
00346 zPos[planenum] = aSQLTable->GetVariable(zPos_ID)->GetDblValue(k);
00347 }
00348
00349 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00350 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00351 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00352 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00353 if(aSQLTable->GetVariable("RED")!=NULL)
00354 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00355 if(aSQLTable->GetVariable("BLUE")!=NULL)
00356 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00357 if(aSQLTable->GetVariable("GREEN")!=NULL)
00358 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00359 if(aSQLTable->GetVariable("VISATT")!=NULL)
00360 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00361 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00362 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00363 if(aSQLTable->GetVariable("NAME")!=NULL)
00364 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00365
00366 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00367
00368
00369 Name = itsMarkerVol->GetName()+"_"+Name;
00370
00371 G4Polycone* aPolyCone = new G4Polycone(Name+"_PolyCone",
00372 sphi,
00373 dphi,
00374 numZplanes,
00375 zPos,
00376 rInner,
00377 rOuter);
00378
00379 G4LogicalVolume* aPolyConeVol =
00380 new G4LogicalVolume(aPolyCone,
00381 BDSMaterials::Instance()->GetMaterial(Material),
00382 Name+"_LogVol");
00383 #ifndef NOUSERLIMITS
00384 G4UserLimits* PolyConeUserLimits = new G4UserLimits();
00385 PolyConeUserLimits->SetMaxAllowedStep(fabs(zPos[0]-zPos[numZplanes-1])/2);
00386 PolyConeUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00387 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00388 PolyConeUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00389 }
00390 aPolyConeVol->SetUserLimits(PolyConeUserLimits);
00391 #endif
00392 G4VisAttributes* VisAtt =
00393 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00394 switch (VisType(0))
00395 {
00396 case 'W': VisAtt->SetForceWireframe(true); break;
00397 case 'I': VisAtt->SetVisibility(false); break;
00398 case 'S': VisAtt->SetForceSolid(true); break;
00399 case 'w': VisAtt->SetForceWireframe(true); break;
00400 case 'i': VisAtt->SetVisibility(false); break;
00401 case 's': VisAtt->SetForceSolid(true); break;
00402 }
00403 aPolyConeVol->SetVisAttributes(VisAtt);
00404
00405 VOL_LIST.push_back(aPolyConeVol);
00406
00407 delete [] rInner;
00408 rInner = NULL;
00409 delete [] rOuter;
00410 rOuter = NULL;
00411 delete [] zPos;
00412 zPos = NULL;
00413
00414 }
00415
00416 PlaceComponents(aSQLTable, VOL_LIST);
00417 }
00418
00419 void BDSGeometrySQL::BuildBox(BDSMySQLTable* aSQLTable)
00420 {
00421 G4int NVariables = aSQLTable->GetVariable("LENGTHX")->GetNVariables();
00422
00423 G4double lengthX;
00424 G4double lengthY;
00425 G4double lengthZ;
00426 G4double VisRed;
00427 G4double VisGreen;
00428 G4double VisBlue;
00429 G4String VisType;
00430 G4String Material;
00431 G4String TableName = aSQLTable->GetName();
00432
00433 G4String Name;
00434
00435 for(G4int k=0; k<NVariables; k++)
00436 {
00437 lengthX = lengthY = lengthZ = 10.*mm;
00438 VisRed = VisGreen = VisBlue = 0.;
00439 VisType = "S";
00440 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00441 if(aSQLTable->GetVariable("RED")!=NULL)
00442 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00443 if(aSQLTable->GetVariable("BLUE")!=NULL)
00444 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00445 if(aSQLTable->GetVariable("GREEN")!=NULL)
00446 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00447 if(aSQLTable->GetVariable("VISATT")!=NULL)
00448 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00449 if(aSQLTable->GetVariable("LENGTHX")!=NULL)
00450 lengthX = aSQLTable->GetVariable("LENGTHX")->GetDblValue(k);
00451 if(aSQLTable->GetVariable("LENGTHY")!=NULL)
00452 lengthY = aSQLTable->GetVariable("LENGTHY")->GetDblValue(k);
00453 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00454 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00455 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00456 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00457 if(aSQLTable->GetVariable("NAME")!=NULL)
00458 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00459
00460 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00461
00462
00463 Name = itsMarkerVol->GetName()+"_"+Name;
00464
00465 G4Box* aBox = new G4Box(Name+"_Box",
00466 lengthX/2,
00467 lengthY/2,
00468 lengthZ/2);
00469
00470 G4LogicalVolume* aBoxVol =
00471 new G4LogicalVolume(aBox,
00472 BDSMaterials::Instance()->GetMaterial(Material),
00473 Name+"_LogVol");
00474 #ifndef NOUSERLIMITS
00475 G4UserLimits* BoxUserLimits = new G4UserLimits();
00476 BoxUserLimits->SetMaxAllowedStep(lengthZ*5);
00477 BoxUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00478 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00479 BoxUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00480 }
00481 aBoxVol->SetUserLimits(BoxUserLimits);
00482 #endif
00483 G4VisAttributes* VisAtt =
00484 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00485 switch (VisType(0))
00486 {
00487 case 'W': VisAtt->SetForceWireframe(true); break;
00488 case 'I': VisAtt->SetVisibility(false); break;
00489 case 'S': VisAtt->SetForceSolid(true); break;
00490 case 'w': VisAtt->SetForceWireframe(true); break;
00491 case 'i': VisAtt->SetVisibility(false); break;
00492 case 's': VisAtt->SetForceSolid(true); break;
00493 }
00494 aBoxVol->SetVisAttributes(VisAtt);
00495
00496 VOL_LIST.push_back(aBoxVol);
00497 }
00498
00499 PlaceComponents(aSQLTable, VOL_LIST);
00500 }
00501
00502 void BDSGeometrySQL::BuildTrap(BDSMySQLTable* aSQLTable)
00503 {
00504 G4int NVariables = aSQLTable->GetVariable("LENGTHXPLUS")->GetNVariables();
00505
00506 G4double trapTheta = 0;
00507 G4double lengthXPlus = 0;
00508 G4double lengthXMinus = 0;
00509 G4double lengthYPlus = 0;
00510 G4double lengthYMinus = 0;
00511 G4double lengthZ = 0;
00512 G4double VisRed;
00513 G4double VisGreen;
00514 G4double VisBlue;
00515 G4String VisType;
00516 G4String Material;
00517 G4String TableName = aSQLTable->GetName();
00518
00519 G4String Name = "";
00520
00521 for(G4int k=0; k<NVariables; k++)
00522 {
00523 VisRed = VisGreen = VisBlue = 0.;
00524 VisType = "S";
00525 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00526 if(aSQLTable->GetVariable("TRAPTHETA")!=NULL)
00527 trapTheta = aSQLTable->GetVariable("TRAPTHETA")->GetDblValue(k);
00528 if(aSQLTable->GetVariable("RED")!=NULL)
00529 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00530 if(aSQLTable->GetVariable("BLUE")!=NULL)
00531 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00532 if(aSQLTable->GetVariable("GREEN")!=NULL)
00533 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00534 if(aSQLTable->GetVariable("VISATT")!=NULL)
00535 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00536 if(aSQLTable->GetVariable("LENGTHXPLUS")!=NULL)
00537 lengthXPlus = aSQLTable->GetVariable("LENGTHXPLUS")->GetDblValue(k);
00538 if(aSQLTable->GetVariable("LENGTHXMINUS")!=NULL)
00539 lengthXMinus = aSQLTable->GetVariable("LENGTHXMINUS")->GetDblValue(k);
00540 if(aSQLTable->GetVariable("LENGTHYPLUS")!=NULL)
00541 lengthYPlus = aSQLTable->GetVariable("LENGTHYPLUS")->GetDblValue(k);
00542 if(aSQLTable->GetVariable("LENGTHYMINUS")!=NULL)
00543 lengthYMinus = aSQLTable->GetVariable("LENGTHYMINUS")->GetDblValue(k);
00544 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00545 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00546 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00547 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00548 if(aSQLTable->GetVariable("NAME")!=NULL)
00549 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00550
00551 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00552
00553
00554 Name = itsMarkerVol->GetName()+"_"+Name;
00555
00556 G4Trap* aTrap = new G4Trap(Name+"_Trd",
00557 lengthZ/2,
00558 trapTheta, 0,
00559 lengthYPlus/2,
00560 lengthXPlus/2,
00561 lengthXPlus/2,
00562 0,
00563 lengthYMinus/2,
00564 lengthXMinus/2,
00565 lengthXMinus/2,
00566 0);
00567
00568
00569 G4LogicalVolume* aTrapVol =
00570 new G4LogicalVolume(aTrap,
00571 BDSMaterials::Instance()->GetMaterial(Material),
00572 Name+"_LogVol");
00573 #ifndef NOUSERLIMITS
00574 G4UserLimits* TrapUserLimits = new G4UserLimits();
00575 TrapUserLimits->SetMaxAllowedStep(lengthZ*5);
00576 TrapUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00577 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00578 TrapUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00579 }
00580 aTrapVol->SetUserLimits(TrapUserLimits);
00581 #endif
00582 G4VisAttributes* VisAtt =
00583 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00584 switch (VisType(0))
00585 {
00586 case 'W': VisAtt->SetForceWireframe(true); break;
00587 case 'I': VisAtt->SetVisibility(false); break;
00588 case 'S': VisAtt->SetForceSolid(true); break;
00589 case 'w': VisAtt->SetForceWireframe(true); break;
00590 case 'i': VisAtt->SetVisibility(false); break;
00591 case 's': VisAtt->SetForceSolid(true); break;
00592 }
00593 aTrapVol->SetVisAttributes(VisAtt);
00594
00595 VOL_LIST.push_back(aTrapVol);
00596 }
00597
00598 PlaceComponents(aSQLTable, VOL_LIST);
00599 }
00600
00601 void BDSGeometrySQL::BuildTorus(BDSMySQLTable* aSQLTable)
00602 {
00603 G4int NVariables = aSQLTable->GetVariable("RINNER")->GetNVariables();
00604
00605 G4double rInner;
00606 G4double rOuter;
00607 G4double rSwept;
00608 G4double sphi;
00609 G4double dphi;
00610 G4double VisRed;
00611 G4double VisGreen;
00612 G4double VisBlue;
00613 G4String VisType;
00614 G4String Material;
00615 G4String TableName = aSQLTable->GetName();
00616 G4String Name;
00617
00618 for(G4int k=0; k<NVariables; k++)
00619 {
00620
00621 rSwept = 20.*mm;
00622 rOuter = 10.*mm;
00623 rInner = 0.0;
00624 sphi = 0.0;
00625 dphi=2*pi*radian;
00626 VisRed = VisGreen = VisBlue = 0.;
00627 VisType = "S";
00628 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00629
00630 if(aSQLTable->GetVariable("RED")!=NULL)
00631 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00632 if(aSQLTable->GetVariable("BLUE")!=NULL)
00633 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00634 if(aSQLTable->GetVariable("GREEN")!=NULL)
00635 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00636 if(aSQLTable->GetVariable("VISATT")!=NULL)
00637 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00638 if(aSQLTable->GetVariable("RINNER")!=NULL)
00639 rInner = aSQLTable->GetVariable("RINNER")->GetDblValue(k);
00640 if(aSQLTable->GetVariable("ROUTER")!=NULL)
00641 rOuter = aSQLTable->GetVariable("ROUTER")->GetDblValue(k);
00642 if(aSQLTable->GetVariable("RSWEPT")!=NULL)
00643 rSwept = aSQLTable->GetVariable("RSWEPT")->GetDblValue(k);
00644 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00645 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00646 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00647 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00648 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00649 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00650 if(aSQLTable->GetVariable("NAME")!=NULL)
00651 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00652
00653 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00654
00655
00656 Name = itsMarkerVol->GetName()+"_"+Name;
00657
00658 G4Torus* aTorus = new G4Torus(Name+"_Torus",
00659 rInner,
00660 rOuter,
00661 rSwept,
00662 sphi,
00663 dphi);
00664
00665
00666 G4LogicalVolume* aTorusVol =
00667 new G4LogicalVolume(aTorus,
00668 BDSMaterials::Instance()->GetMaterial(Material),
00669 Name+"_LogVol");
00670 #ifndef NOUSERLIMITS
00671 G4UserLimits* TorusUserLimits = new G4UserLimits();
00672 TorusUserLimits->SetMaxAllowedStep(rOuter*5);
00673 TorusUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00674 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00675 TorusUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00676 }
00677 aTorusVol->SetUserLimits(TorusUserLimits);
00678 #endif
00679 G4VisAttributes* VisAtt =
00680 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00681 switch (VisType(0))
00682 {
00683 case 'W': VisAtt->SetForceWireframe(true); break;
00684 case 'I': VisAtt->SetVisibility(false); break;
00685 case 'S': VisAtt->SetForceSolid(true); break;
00686 case 'w': VisAtt->SetForceWireframe(true); break;
00687 case 'i': VisAtt->SetVisibility(false); break;
00688 case 's': VisAtt->SetForceSolid(true); break;
00689 }
00690 aTorusVol->SetVisAttributes(VisAtt);
00691
00692 VOL_LIST.push_back(aTorusVol);
00693
00694 }
00695
00696 PlaceComponents(aSQLTable, VOL_LIST);
00697 }
00698 void BDSGeometrySQL::BuildSampler(BDSMySQLTable* aSQLTable)
00699 {
00700 G4int NVariables = aSQLTable->GetVariable("LENGTH")->GetNVariables();
00701
00702 G4double length;
00703 G4double rInnerStart;
00704 G4double rInnerEnd;
00705 G4double rOuterStart;
00706 G4double rOuterEnd;
00707 G4double VisRed;
00708 G4double VisGreen;
00709 G4double VisBlue;
00710 G4String VisType;
00711 G4String Material;
00712 G4String TableName = aSQLTable->GetName();
00713 G4String Name;
00714
00715 for(G4int k=0; k<NVariables; k++)
00716 {
00717
00718 length = rOuterStart = rOuterEnd = 10.*mm;
00719 rInnerStart = rInnerEnd = 0.0;
00720 VisRed = VisGreen = VisBlue = 0.;
00721 VisType = "S";
00722 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00723
00724 if(aSQLTable->GetVariable("RED")!=NULL)
00725 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00726 if(aSQLTable->GetVariable("BLUE")!=NULL)
00727 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00728 if(aSQLTable->GetVariable("GREEN")!=NULL)
00729 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00730 if(aSQLTable->GetVariable("VISATT")!=NULL)
00731 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00732 if(aSQLTable->GetVariable("LENGTH")!=NULL)
00733 length = aSQLTable->GetVariable("LENGTH")->GetDblValue(k);
00734 if(aSQLTable->GetVariable("RINNERSTART")!=NULL)
00735 rInnerStart = aSQLTable->GetVariable("RINNERSTART")->GetDblValue(k);
00736 if(aSQLTable->GetVariable("RINNEREND")!=NULL)
00737 rInnerEnd = aSQLTable->GetVariable("RINNEREND")->GetDblValue(k);
00738 if(aSQLTable->GetVariable("ROUTERSTART")!=NULL)
00739 rOuterStart = aSQLTable->GetVariable("ROUTERSTART")->GetDblValue(k);
00740 if(aSQLTable->GetVariable("ROUTEREND")!=NULL)
00741 rOuterEnd = aSQLTable->GetVariable("ROUTEREND")->GetDblValue(k);
00742 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00743 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00744 if(aSQLTable->GetVariable("NAME")!=NULL)
00745 {
00746 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00747 aSQLTable->GetVariable("NAME")->SetStrValue(k,Name+"_SQL");
00748 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00749 }
00750 if(Name=="_SQL") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k)+"_SQL";
00751
00752
00753 Name = itsMarkerVol->GetName()+"_"+Name;
00754
00755 G4Cons* aSampler = new G4Cons(Name+"_samp",
00756 rInnerStart,
00757 rOuterStart,
00758 rInnerEnd,
00759 rOuterEnd,
00760 length/2,
00761 0,
00762 twopi*radian);
00763
00764 G4LogicalVolume* aSamplerVol =
00765 new G4LogicalVolume(aSampler,
00766 BDSMaterials::Instance()->GetMaterial(Material),
00767 Name+"_LogVol");
00768 #ifndef NOUSERLIMITS
00769 G4UserLimits* SamplerUserLimits = new G4UserLimits();
00770 SamplerUserLimits->SetMaxAllowedStep(length*5);
00771 SamplerUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00772 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00773 SamplerUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00774 }
00775 aSamplerVol->SetUserLimits(SamplerUserLimits);
00776 #endif
00777 G4VisAttributes* VisAtt =
00778 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00779 switch (VisType(0))
00780 {
00781 case 'W': VisAtt->SetForceWireframe(true); break;
00782 case 'I': VisAtt->SetVisibility(false); break;
00783 case 'S': VisAtt->SetForceSolid(true); break;
00784 case 'w': VisAtt->SetForceWireframe(true); break;
00785 case 'i': VisAtt->SetVisibility(false); break;
00786 case 's': VisAtt->SetForceSolid(true); break;
00787 }
00788 aSamplerVol->SetVisAttributes(VisAtt);
00789
00790 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
00791 if(BDSSampler::GetNSamplers()==0){
00792 BDSSamplerSensDet = new BDSSamplerSD(Name, "plane");
00793 SDMan->AddNewDetector(BDSSamplerSensDet);
00794 }
00795 aSamplerVol->SetSensitiveDetector(BDSSamplerSensDet);
00796
00797 BDSSampler::AddExternalSampler();
00798 bdsOutput->SampName.push_back(BDSGlobalConstants::Instance()->StringFromInt(
00799 BDSSampler::GetNSamplers())+"_"+Name+"_1");
00800
00801 VOL_LIST.push_back(aSamplerVol);
00802 }
00803
00804 PlaceComponents(aSQLTable, VOL_LIST);
00805 }
00806 void BDSGeometrySQL::BuildTube(BDSMySQLTable* aSQLTable)
00807 {
00808 G4int NVariables = aSQLTable->GetVariable("RINNER")->GetNVariables();
00809
00810 G4double rInner;
00811 G4double rOuter;
00812 G4double length;
00813 G4double sphi;
00814 G4double dphi;
00815 G4double VisRed;
00816 G4double VisGreen;
00817 G4double VisBlue;
00818 G4String VisType;
00819 G4String Material;
00820 G4String TableName = aSQLTable->GetName();
00821 G4String Name;
00822
00823 for(G4int k=0; k<NVariables; k++)
00824 {
00825
00826 length = 100.*mm;
00827 rOuter = 10.*mm;
00828 rInner = 0.0;
00829 sphi = 0.0;
00830 dphi=2*pi*radian;
00831 VisRed = VisGreen = VisBlue = 0.;
00832 VisType = "S";
00833 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00834
00835 if(aSQLTable->GetVariable("RED")!=NULL)
00836 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00837 if(aSQLTable->GetVariable("BLUE")!=NULL)
00838 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00839 if(aSQLTable->GetVariable("GREEN")!=NULL)
00840 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00841 if(aSQLTable->GetVariable("VISATT")!=NULL)
00842 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00843 if(aSQLTable->GetVariable("RINNER")!=NULL)
00844 rInner = aSQLTable->GetVariable("RINNER")->GetDblValue(k);
00845 if(aSQLTable->GetVariable("ROUTER")!=NULL)
00846 rOuter = aSQLTable->GetVariable("ROUTER")->GetDblValue(k);
00847 if(aSQLTable->GetVariable("LENGTH")!=NULL)
00848 length = aSQLTable->GetVariable("LENGTH")->GetDblValue(k);
00849 if(aSQLTable->GetVariable("STARTPHI")!=NULL)
00850 sphi = aSQLTable->GetVariable("STARTPHI")->GetDblValue(k);
00851 if(aSQLTable->GetVariable("DELTAPHI")!=NULL)
00852 dphi = aSQLTable->GetVariable("DELTAPHI")->GetDblValue(k);
00853 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00854 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00855 if(aSQLTable->GetVariable("NAME")!=NULL)
00856 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00857
00858 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00859
00860
00861 Name = itsMarkerVol->GetName()+"_"+Name;
00862
00863 G4Tubs* aTubs = new G4Tubs(Name+"_Tubs",
00864 rInner,
00865 rOuter,
00866 length/2,
00867 sphi,
00868 dphi);
00869
00870
00871 G4LogicalVolume* aTubsVol =
00872 new G4LogicalVolume(aTubs,
00873 BDSMaterials::Instance()->GetMaterial(Material),
00874 Name+"_LogVol");
00875 #ifndef NOUSERLIMITS
00876 G4UserLimits* TubsUserLimits = new G4UserLimits();
00877 TubsUserLimits->SetMaxAllowedStep(length*5);
00878 TubsUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00879 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00880 TubsUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00881 }
00882 aTubsVol->SetUserLimits(TubsUserLimits);
00883 #endif
00884 G4VisAttributes* VisAtt =
00885 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00886 switch (VisType(0))
00887 {
00888 case 'W': VisAtt->SetForceWireframe(true); break;
00889 case 'I': VisAtt->SetVisibility(false); break;
00890 case 'S': VisAtt->SetForceSolid(true); break;
00891 case 'w': VisAtt->SetForceWireframe(true); break;
00892 case 'i': VisAtt->SetVisibility(false); break;
00893 case 's': VisAtt->SetForceSolid(true); break;
00894 }
00895 aTubsVol->SetVisAttributes(VisAtt);
00896
00897 VOL_LIST.push_back(aTubsVol);
00898
00899 }
00900
00901 PlaceComponents(aSQLTable, VOL_LIST);
00902 }
00903
00904 void BDSGeometrySQL::BuildEllipticalTube(BDSMySQLTable* aSQLTable)
00905 {
00906 G4int NVariables = aSQLTable->GetVariable("LENGTHX")->GetNVariables();
00907
00908 G4double lengthX;
00909 G4double lengthY;
00910 G4double lengthZ;
00911 G4double VisRed;
00912 G4double VisGreen;
00913 G4double VisBlue;
00914 G4String VisType;
00915 G4String Material;
00916 G4String TableName = aSQLTable->GetName();
00917 G4String Name;
00918
00919 for(G4int k=0; k<NVariables; k++)
00920 {
00921
00922 lengthX = 100.*mm;
00923 lengthY = 50.*mm;
00924 lengthZ = 200.*mm;
00925 VisRed = VisGreen = VisBlue = 0.;
00926 VisType = "S";
00927 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
00928
00929 if(aSQLTable->GetVariable("RED")!=NULL)
00930 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
00931 if(aSQLTable->GetVariable("BLUE")!=NULL)
00932 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
00933 if(aSQLTable->GetVariable("GREEN")!=NULL)
00934 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
00935 if(aSQLTable->GetVariable("VISATT")!=NULL)
00936 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
00937 if(aSQLTable->GetVariable("LENGTHX")!=NULL)
00938 lengthX = aSQLTable->GetVariable("LENGTHX")->GetDblValue(k);
00939 if(aSQLTable->GetVariable("LENGTHY")!=NULL)
00940 lengthY = aSQLTable->GetVariable("LENGTHY")->GetDblValue(k);
00941 if(aSQLTable->GetVariable("LENGTHZ")!=NULL)
00942 lengthZ = aSQLTable->GetVariable("LENGTHZ")->GetDblValue(k);
00943 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
00944 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
00945 if(aSQLTable->GetVariable("NAME")!=NULL)
00946 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
00947
00948 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
00949
00950
00951 Name = itsMarkerVol->GetName()+"_"+Name;
00952
00953 G4EllipticalTube* aEllipticalTube = new G4EllipticalTube(Name+"_EllipticalTube",
00954 lengthX/2,
00955 lengthY/2,
00956 lengthZ/2
00957 );
00958
00959
00960 G4LogicalVolume* aEllipticalTubeVol =
00961 new G4LogicalVolume(aEllipticalTube,
00962 BDSMaterials::Instance()->GetMaterial(Material),
00963 Name+"_LogVol");
00964 #ifndef NOUSERLIMITS
00965 G4UserLimits* EllipticalTubeUserLimits = new G4UserLimits();
00966 G4double maxLength = lengthX;
00967 if (lengthY>lengthX&&lengthY>lengthZ){
00968 maxLength = lengthY;
00969 }
00970 else if(lengthZ>lengthY&&lengthZ>lengthX){
00971 maxLength = lengthZ;
00972 }
00973 EllipticalTubeUserLimits->SetMaxAllowedStep(maxLength*5);
00974 EllipticalTubeUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00975 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00976 EllipticalTubeUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00977 }
00978 aEllipticalTubeVol->SetUserLimits(EllipticalTubeUserLimits);
00979 #endif
00980 G4VisAttributes* VisAtt =
00981 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
00982 switch (VisType(0))
00983 {
00984 case 'W': VisAtt->SetForceWireframe(true); break;
00985 case 'I': VisAtt->SetVisibility(false); break;
00986 case 'S': VisAtt->SetForceSolid(true); break;
00987 case 'w': VisAtt->SetForceWireframe(true); break;
00988 case 'i': VisAtt->SetVisibility(false); break;
00989 case 's': VisAtt->SetForceSolid(true); break;
00990 }
00991 aEllipticalTubeVol->SetVisAttributes(VisAtt);
00992
00993 VOL_LIST.push_back(aEllipticalTubeVol);
00994
00995 }
00996 PlaceComponents(aSQLTable, VOL_LIST);
00997 }
00998
00999
01000 void BDSGeometrySQL::BuildPCLTube(BDSMySQLTable* aSQLTable)
01001 {
01002 G4int NVariables = aSQLTable->GetVariable("LENGTH")->GetNVariables();
01003
01004 G4double aperX;
01005 G4double aperYUp;
01006 G4double aperYDown;
01007 G4double aperDy;
01008 G4double thickness;
01009 G4double length;
01010 G4double VisRed;
01011 G4double VisGreen;
01012 G4double VisBlue;
01013 G4String VisType;
01014 G4String Material;
01015 G4String TableName = aSQLTable->GetName();
01016 G4String Name;
01017
01018 for(G4int k=0; k<NVariables; k++)
01019 {
01020
01021
01022 aperX = 100.*mm;
01023 aperYUp = 50.*mm;
01024 aperYDown = 200.*mm;
01025 aperDy = 0.*mm;
01026 thickness = BDSGlobalConstants::Instance()->GetBeampipeThickness();
01027 length = 200.0*mm;
01028 VisRed = VisGreen = VisBlue = 0.;
01029 VisType = "S";
01030 Material = BDSGlobalConstants::Instance()->GetVacuumMaterial();
01031
01032 if(aSQLTable->GetVariable("RED")!=NULL)
01033 VisRed = aSQLTable->GetVariable("RED")->GetDblValue(k);
01034 if(aSQLTable->GetVariable("BLUE")!=NULL)
01035 VisBlue = aSQLTable->GetVariable("BLUE")->GetDblValue(k);
01036 if(aSQLTable->GetVariable("GREEN")!=NULL)
01037 VisGreen = aSQLTable->GetVariable("GREEN")->GetDblValue(k);
01038 if(aSQLTable->GetVariable("VISATT")!=NULL)
01039 VisType = aSQLTable->GetVariable("VISATT")->GetStrValue(k);
01040 if(aSQLTable->GetVariable("APERX")!=NULL)
01041 aperX = aSQLTable->GetVariable("APERX")->GetDblValue(k);
01042 if(aSQLTable->GetVariable("APERYUP")!=NULL)
01043 aperYUp = aSQLTable->GetVariable("APERYUP")->GetDblValue(k);
01044 if(aSQLTable->GetVariable("APERYDOWN")!=NULL)
01045 aperYDown = aSQLTable->GetVariable("APERYDOWN")->GetDblValue(k);
01046 if(aSQLTable->GetVariable("APERDY")!=NULL)
01047 aperDy = aSQLTable->GetVariable("APERDY")->GetDblValue(k);
01048 if(aSQLTable->GetVariable("THICKNESS")!=NULL)
01049 thickness = aSQLTable->GetVariable("THICKNESS")->GetDblValue(k);
01050 if(aSQLTable->GetVariable("LENGTH")!=NULL)
01051 length = aSQLTable->GetVariable("LENGTH")->GetDblValue(k);
01052 if(aSQLTable->GetVariable("MATERIAL")!=NULL)
01053 Material = aSQLTable->GetVariable("MATERIAL")->GetStrValue(k);
01054 if(aSQLTable->GetVariable("NAME")!=NULL)
01055 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
01056
01057 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
01058
01059
01060 Name = itsMarkerVol->GetName()+"_"+Name;
01061
01062 BDSPCLTube* aPCLTubeBuilder = new BDSPCLTube(aperX, aperYUp, aperYDown, aperDy, thickness, length, Name+"_PCLTube");
01063 G4VSolid* aPCLTube = aPCLTubeBuilder->GetSolid();
01064
01065
01066 G4LogicalVolume* aPCLTubeVol =
01067 new G4LogicalVolume(aPCLTube,
01068 BDSMaterials::Instance()->GetMaterial(Material),
01069 Name+"_LogVol");
01070 #ifndef NOUSERLIMITS
01071 G4UserLimits* PCLTubeUserLimits = new G4UserLimits();
01072 G4double totalYLength = aperDy+aperYUp+aperYDown+thickness;
01073 G4double totalXLength = aperX+thickness;
01074 G4double maxLength = length;
01075 if (totalYLength>length&&totalYLength>totalXLength){
01076 maxLength = totalYLength;
01077 }
01078 else if(totalXLength>totalYLength&&totalXLength>length){
01079 maxLength = totalXLength;
01080 }
01081 PCLTubeUserLimits->SetMaxAllowedStep(maxLength*5);
01082 PCLTubeUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
01083 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
01084 PCLTubeUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
01085 }
01086 aPCLTubeVol->SetUserLimits(PCLTubeUserLimits);
01087 #endif
01088 G4VisAttributes* VisAtt =
01089 new G4VisAttributes(G4Colour(VisRed, VisGreen, VisBlue));
01090 switch (VisType(0))
01091 {
01092 case 'W': VisAtt->SetForceWireframe(true); break;
01093 case 'I': VisAtt->SetVisibility(false); break;
01094 case 'S': VisAtt->SetForceSolid(true); break;
01095 case 'w': VisAtt->SetForceWireframe(true); break;
01096 case 'i': VisAtt->SetVisibility(false); break;
01097 case 's': VisAtt->SetForceSolid(true); break;
01098 }
01099 aPCLTubeVol->SetVisAttributes(VisAtt);
01100
01101 VOL_LIST.push_back(aPCLTubeVol);
01102 delete aPCLTubeBuilder;
01103 }
01104 PlaceComponents(aSQLTable, VOL_LIST);
01105 }
01106
01107 G4RotationMatrix* BDSGeometrySQL::RotateComponent(G4double psi,G4double phi,G4double theta)
01108 {
01109 rotateComponent = new G4RotationMatrix;
01110 if(psi==0 && phi==0 && theta==0) return rotateComponent;
01111
01112 G4RotationMatrix LocalRotation;
01113 G4ThreeVector localX = G4ThreeVector(1.,0.,0.);
01114 G4ThreeVector localY = G4ThreeVector(0.,1.,0.);
01115 G4ThreeVector localZ = G4ThreeVector(0.,0.,1.);
01116
01117 LocalRotation.rotate(psi,localZ);
01118 localX.rotate(psi,localZ);
01119 localY.rotate(psi,localZ);
01120
01121
01122 LocalRotation.rotate(phi,localY);
01123 localX.rotate(phi,localY);
01124 localZ.rotate(phi,localY);
01125
01126
01127 LocalRotation.rotate(theta,localX);
01128 localY.rotate(theta,localX);
01129 localZ.rotate(theta,localX);
01130
01131 rotateComponent->transform(LocalRotation);
01132 rotateComponent->invert();
01133
01134 return rotateComponent;
01135 }
01136
01137
01138 void BDSGeometrySQL::PlaceComponents(BDSMySQLTable* aSQLTable, vector<G4LogicalVolume*> VOL_LIST)
01139 {
01140 G4double PosX;
01141 G4double PosY;
01142 G4double PosZ;
01143 G4double RotPsi;
01144 G4double RotTheta;
01145 G4double RotPhi;
01146 G4double K1,K2,K3,K4;
01147 G4String PARENTNAME;
01148 G4String InheritStyle;
01149 G4String Parameterisation;
01150 G4String Name;
01151 G4String MagType;
01152 G4String TableName = aSQLTable->GetName();
01153 G4int NVariables = aSQLTable->GetVariable("POSX")->GetNVariables();
01154 G4int align_in;
01155 G4int align_out;
01156 G4int SetSensitive;
01157 G4double FieldX, FieldY, FieldZ;
01158
01159 for(G4int k=0; k<NVariables; k++)
01160 {
01161
01162 PosX = PosY = PosZ = 0.;
01163 RotPsi = RotTheta = RotPhi = 0.;
01164 K1 = K2 = K3 = K4 = 0.;
01165 PARENTNAME = "";
01166 InheritStyle = "";
01167 Parameterisation = "";
01168 align_in=0;
01169 align_out=0;
01170 SetSensitive=0;
01171 MagType = "";
01172 FieldX = FieldY = FieldZ = 0.0;
01173 if(aSQLTable->GetVariable("PARENTNAME")!=NULL)
01174 PARENTNAME = aSQLTable->GetVariable("PARENTNAME")->GetStrValue(k);
01175 if(aSQLTable->GetVariable("POSX")!=NULL)
01176 PosX = aSQLTable->GetVariable("POSX")->GetDblValue(k);
01177 if(aSQLTable->GetVariable("POSY")!=NULL)
01178 PosY = aSQLTable->GetVariable("POSY")->GetDblValue(k);
01179 if(aSQLTable->GetVariable("POSZ")!=NULL)
01180 PosZ = aSQLTable->GetVariable("POSZ")->GetDblValue(k);
01181 if(aSQLTable->GetVariable("ROTPSI")!=NULL)
01182 RotPsi = aSQLTable->GetVariable("ROTPSI")->GetDblValue(k);
01183 if(aSQLTable->GetVariable("ROTTHETA")!=NULL)
01184 RotTheta = aSQLTable->GetVariable("ROTTHETA")->GetDblValue(k);
01185 if(aSQLTable->GetVariable("ROTPHI")!=NULL)
01186 RotPhi = aSQLTable->GetVariable("ROTPHI")->GetDblValue(k);
01187 if(aSQLTable->GetVariable("K1")!=NULL)
01188 K1 = aSQLTable->GetVariable("K1")->GetDblValue(k);
01189 if(aSQLTable->GetVariable("K2")!=NULL)
01190 K2 = aSQLTable->GetVariable("K2")->GetDblValue(k);
01191 if(aSQLTable->GetVariable("K3")!=NULL)
01192 K3 = aSQLTable->GetVariable("K3")->GetDblValue(k);
01193 if(aSQLTable->GetVariable("K4")!=NULL)
01194 K4 = aSQLTable->GetVariable("K4")->GetDblValue(k);
01195 if(aSQLTable->GetVariable("MAGTYPE")!=NULL)
01196 MagType = aSQLTable->GetVariable("MAGTYPE")->GetStrValue(k);
01197 if(aSQLTable->GetVariable("FIELDX")!=NULL)
01198 FieldX = aSQLTable->GetVariable("FIELDX")->GetDblValue(k);
01199 if(aSQLTable->GetVariable("FIELDY")!=NULL)
01200 FieldY = aSQLTable->GetVariable("FIELDY")->GetDblValue(k);
01201 if(aSQLTable->GetVariable("FIELDZ")!=NULL)
01202 FieldZ = aSQLTable->GetVariable("FIELDZ")->GetDblValue(k);
01203 if(aSQLTable->GetVariable("ALIGNIN")!=NULL)
01204 align_in = aSQLTable->GetVariable("ALIGNIN")->GetIntValue(k);
01205 if(aSQLTable->GetVariable("ALIGNOUT")!=NULL)
01206 align_out = aSQLTable->GetVariable("ALIGNOUT")->GetIntValue(k);
01207 if(aSQLTable->GetVariable("SETSENSITIVE")!=NULL)
01208 SetSensitive = aSQLTable->GetVariable("SETSENSITIVE")->GetIntValue(k);
01209 if(aSQLTable->GetVariable("INHERITSTYLE")!=NULL)
01210 InheritStyle = aSQLTable->GetVariable("INHERITSTYLE")->GetStrValue(k);
01211 if(aSQLTable->GetVariable("PARAMETERISATION")!=NULL)
01212 Parameterisation = aSQLTable->GetVariable("PARAMETERISATION")->GetStrValue(k);
01213 if(aSQLTable->GetVariable("NAME")!=NULL)
01214 Name = aSQLTable->GetVariable("NAME")->GetStrValue(k);
01215 if(Name=="_SQL") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k) + "_SQL";
01216 if(Name=="") Name = TableName+BDSGlobalConstants::Instance()->StringFromInt(k);
01217
01218
01219 Name = itsMarkerVol->GetName()+"_"+Name;
01220
01221 if(PARENTNAME=="") PosZ-=itsMarkerLength/2;
01222
01223 PARENTNAME=itsMarkerVol->GetName()+"_"+PARENTNAME;
01224 G4String::caseCompare cmpmode = G4String::ignoreCase;
01225
01226 G4int PARENTID=0;
01227 if(PARENTNAME!=""){
01228 PARENTNAME+="_LogVol";
01229 for(G4int i=0; i<(G4int)VOL_LIST.size(); i++)
01230 {
01231 if(PARENTNAME.compareTo(VOL_LIST[i]->GetName(),cmpmode)==0)
01232 {
01233 PARENTID = i;
01234 continue;
01235 }
01236 }
01237 }
01238
01239
01240 G4String tmpname = Name+"_LogVol";
01241 G4int ID=0;
01242 for(G4int i=0; i<(G4int)VOL_LIST.size(); i++)
01243 {
01244 if(tmpname.compareTo(VOL_LIST[i]->GetName(),cmpmode)==0)
01245 {
01246 ID = i;
01247 continue;
01248 }
01249 }
01250
01251 if(SetSensitive) SensitiveComponents.push_back(VOL_LIST[ID]);
01252
01253 G4ThreeVector PlacementPoint(PosX,PosY,PosZ);
01254
01255 if(InheritStyle.compareTo("",cmpmode)){
01256 if(InheritStyle.compareTo("SUBTRACT",cmpmode)==0)
01257 {
01258 G4VSolid* original = VOL_LIST[PARENTID]->GetSolid();
01259 G4VSolid* sub = VOL_LIST[ID]->GetSolid();
01260 VOL_LIST[PARENTID]->SetSolid(new G4SubtractionSolid(VOL_LIST[PARENTID]->GetName(),
01261 original,
01262 sub,
01263 RotateComponent(RotPsi,RotPhi,RotTheta),
01264 PlacementPoint));
01265
01266 }else if(InheritStyle.compareTo("INTERSECT",cmpmode)==0){
01267 G4VSolid* original = VOL_LIST[PARENTID]->GetSolid();
01268 G4VSolid* sub = VOL_LIST[ID]->GetSolid();
01269 VOL_LIST[PARENTID]->SetSolid(new G4IntersectionSolid(VOL_LIST[PARENTID]->GetName(),
01270 original,
01271 sub,
01272 RotateComponent(RotPsi,RotPhi,RotTheta),
01273 PlacementPoint));
01274
01275 } else if(InheritStyle.compareTo("UNION",cmpmode)==0)
01276 {
01277 G4VSolid* original = VOL_LIST[PARENTID]->GetSolid();
01278 G4VSolid* sub = VOL_LIST[ID]->GetSolid();
01279 VOL_LIST[PARENTID]->SetSolid(new G4UnionSolid(VOL_LIST[PARENTID]->GetName(),
01280 original,
01281 sub,
01282 RotateComponent(RotPsi,RotPhi,RotTheta),
01283 PlacementPoint));
01284 }
01285 }
01286
01287 if(Parameterisation.compareTo("GFLASH",cmpmode)==0){
01288 itsGFlashComponents.push_back(VOL_LIST[ID]);
01289 }
01290
01291 G4VPhysicalVolume* PhysiComp =
01292 new G4PVPlacement(RotateComponent(RotPsi,RotPhi,RotTheta),
01293 PlacementPoint,
01294 VOL_LIST[ID],
01295 Name,
01296 VOL_LIST[PARENTID],
01297 false,
01298 0, BDSGlobalConstants::Instance()->GetCheckOverlaps());
01299 SetMultiplePhysicalVolumes(PhysiComp);
01300 if(align_in)
01301 {
01302
01303 if(align_in_volume!=NULL)
01304 {
01305 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;
01306 G4Exception("Aborting Program", "-1", FatalException, "");
01307
01308 }
01309
01310 else
01311 align_in_volume=PhysiComp;
01312
01313 }
01314
01315 if(align_out)
01316 {
01317 if(align_out_volume!=NULL)
01318 {
01319 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;
01320 G4Exception("Aborting Program", "-1", FatalException, "");
01321
01322 }
01323
01324 else
01325 align_out_volume=PhysiComp;
01326 }
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336 G4double charge = BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGCharge();
01337
01338 G4double momentum = BDSGlobalConstants::Instance()->GetBeamMomentum();
01339
01340 G4double brho = ( (momentum/GeV) / (0.299792458 * charge));
01341
01342 brho *= (tesla*m);
01343
01344 if(MagType.compareTo("QUAD",cmpmode)==0)
01345 {
01346 HasFields = true;
01347 nPoleField = 1;
01348 QuadBgrad.push_back(- brho * K1 / (m*m));
01349 Quadvol.push_back(PhysiComp->GetName());
01350 QuadVolBgrad[PhysiComp->GetName()]=(- brho * K1 / (m*m));
01351 }
01352
01353 if(MagType.compareTo("SEXT",cmpmode)==0)
01354 {
01355 HasFields = true;
01356 nPoleField = 2;
01357 SextBgrad.push_back(- brho * K2 / (m*m*m));
01358 Sextvol.push_back(PhysiComp->GetName());
01359 SextVolBgrad[PhysiComp->GetName()]=(- brho * K2 / (m*m*m));
01360 }
01361
01362 if(MagType.compareTo("OCT",cmpmode)==0)
01363 {
01364 HasFields = true;
01365 nPoleField = 3;
01366 OctBgrad.push_back(- brho * K3 / (m*m*m*m));
01367 Octvol.push_back(PhysiComp->GetName());
01368 OctVolBgrad[PhysiComp->GetName()]=(- brho * K3 / (m*m*m*m));
01369 }
01370
01371 if(FieldX || FieldY || FieldZ)
01372 {
01373 HasFields = true;
01374 HasUniformField=true;
01375 G4cout << "BDSGeometrySQL> volume " << PhysiComp->GetName() << " has the following uniform field: " << FieldX << " " << FieldY << " " << FieldZ << " " << endl;
01376 UniformField.push_back(G4ThreeVector(FieldX*tesla,FieldY*tesla,FieldZ*tesla));
01377 Fieldvol.push_back(PhysiComp->GetName());
01378 UniformFieldVolField[PhysiComp->GetName()]=G4ThreeVector(FieldX*tesla,FieldY*tesla,FieldZ*tesla);
01379 }
01380 }
01381 }