/home/cern/BDSIM_new/src/BDSGeometrySQL.cc

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

Generated on Wed Mar 5 17:25:22 2008 for BDSIM by  doxygen 1.5.3