src/BDSGeometrySQL.cc

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 //extern BDSGlobalConstants* BDSGlobalConstants::Instance();
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;  //default alignment (does nothing)
00049   align_out_volume = NULL;  //default alignment (does nothing)
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); // This is a comment line
00068       else BuildSQLObjects(file);
00069     }
00070   
00071   // Close Geomlist file
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       //Defaults
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       // make sure that each name is unique!
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       //Defaults
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       // make sure that each name is unique!
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       //Defaults
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       // make sure that each name is unique!
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       // make sure that each name is unique!
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; //Angle between faces of trapezoid
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       // make sure that each name is unique!
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       //Defaults
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       // make sure that each name is unique!
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       //Defaults
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       // make sure that each name is unique!
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 //SPM bdsOutput->nSamplers++;
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       //Defaults 
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       // make sure that each name is unique!
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       //Defaults 
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       // make sure that each name is unique!
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       //Defaults 
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       // make sure that each name is unique!
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++) // Now run through and place according to
01160     { 
01161       //Defaults
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       // make sure that each name is unique!
01219       Name = itsMarkerVol->GetName()+"_"+Name;
01220 
01221       if(PARENTNAME=="") PosZ-=itsMarkerLength/2; //Move definition of PosZ to front of element
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       // to being in line with logvol names (needed for name checking loop
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)){ //True if InheritStyle is set
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           // Make sure program stops and informs user if more than one alignment vol.
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 //      G4double P0 = BDSGlobalConstants::Instance()->GetBeamTotalEnergy();
01329 //      G4double brho=
01330 //      sqrt(pow(P0,2)- pow(electron_mass_c2,2))/(0.299792458 * (GeV/(tesla*m)));
01331 
01332       // compute magnetic rigidity brho
01333       // formula: B(Tesla)*rho(m) = p(GeV)/(0.299792458 * |charge(e)|)
01334       //
01335       // charge (in |e| units)
01336       G4double charge = BDSGlobalConstants::Instance()->GetParticleDefinition()->GetPDGCharge();  
01337       // momentum (in GeV/c)   
01338       G4double momentum = BDSGlobalConstants::Instance()->GetBeamMomentum();
01339       // rigidity (in T*m)
01340       G4double brho = ( (momentum/GeV) / (0.299792458 * charge));
01341       // rigidity (in Geant4 units)
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) //if any vols have non-zero field components
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 }

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7