/scratch0/jsnuveri/BDSIM/BDSIMgit/bdsim/src/BDSMultilayerScreen.cc

00001 #include "BDSGlobalConstants.hh" 
00002 #include "BDSMultilayerScreen.hh"
00003 #include "BDSMaterials.hh"
00004 #include "G4Box.hh"
00005 #include "G4VisAttributes.hh"
00006 #include "G4LogicalVolume.hh"
00007 #include "G4PVPlacement.hh"               
00008 #include "G4OpticalSurface.hh"
00009 #include "G4LogicalBorderSurface.hh"
00010 
00011 #include "BDSMultilayerScreen.hh"
00012 
00013 //============================================================
00014 BDSMultilayerScreen::BDSMultilayerScreen (G4TwoVector xysize, G4String name):
00015   _xysize(xysize), _name(name+"_MultilayerScreen")
00016 {
00017   _size.setX(_xysize.x()); 
00018   _size.setY(_xysize.y());
00019   _size.setZ(0);
00020   _solid=NULL;
00021   _log=NULL;
00022   _phys=NULL;
00023 }
00024 
00025 void BDSMultilayerScreen::screenLayer(G4double thickness, G4String material, G4String name, G4double grooveWidth, G4double grooveSpatialFrequency){
00026   G4ThreeVector layerSize(_xysize.x(), _xysize.y(), thickness);
00027   screenLayer(new BDSScreenLayer(layerSize,_name+"_"+name ,material,grooveWidth,grooveSpatialFrequency));
00028 }
00029 
00030 void BDSMultilayerScreen::screenLayer(BDSScreenLayer* layer){
00031   _screenLayers.push_back(layer);
00032 }
00033 
00034 G4LogicalVolume* BDSMultilayerScreen::log(){
00035   return _log;
00036 }
00037 
00038 void BDSMultilayerScreen::build(){
00039   buildMotherVolume();
00040   placeLayers();
00041 }
00042 
00043 void BDSMultilayerScreen::buildMotherVolume(){
00044   computeDimensions();
00045   _solid  = new G4Box((_name+"_solid").c_str(),_size.x()/2.0,_size.y()/2.0,_size.z()/2.0);
00046   _log = new G4LogicalVolume(_solid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),(_name+"_log").c_str(),0,0,0);
00047   G4VisAttributes* visAtt = new G4VisAttributes(G4Color(0.0,0.0,1.0,0.3));
00048   visAtt->SetForceWireframe(true);
00049   _log->SetVisAttributes(visAtt);
00050 }
00051 
00052 void BDSMultilayerScreen::computeDimensions(){
00053   G4cout << "Compute dimensions..." << G4endl;
00054   G4cout << "...z size..." << G4endl;
00055   G4double temp=0;
00056   for(unsigned int i=0; i<_screenLayers.size(); i++){
00057     G4cout << "..adding z size for layer number " << i << G4endl;
00058     temp += _screenLayers[i]->size().z();
00059     //Compute the total z thickness.
00060   }
00061   _size.setZ(temp);
00062   //Compute the z positions of all the layers.
00063   G4cout << "...z positions..." << G4endl;
00064   G4double pos = _screenLayers[0]->size().z()/2.0 -1.0*_size.z()/2.0; //Position each layer after the previous one.
00065   _screenLayerZPos.push_back(pos);
00066   for(unsigned int i=1; i<_screenLayers.size(); i++){
00067     pos += (_screenLayers[i-1]->size().z()+_screenLayers[i]->size().z())/2.0;
00068     _screenLayerZPos.push_back(pos);
00069   }
00070   G4cout << "...finsished." << G4endl;
00071 }
00072 
00073 void BDSMultilayerScreen::placeLayers(){
00074   G4ThreeVector pos;
00075   pos.setX(0);
00076   pos.setY(0);
00077   pos.setZ(0);
00078 
00079   for(unsigned int i=0; i<_screenLayers.size(); i++){
00080     pos.setZ(_screenLayerZPos[i]);
00081     _screenLayers[i]->phys(new G4PVPlacement((G4RotationMatrix*)NULL,  //Create a new physical volume placement for each groove in the screen.
00082                                              pos,
00083                                              _screenLayers[i]->log(),
00084                                              (G4String)(_screenLayers[i]->name()),
00085                                              _log,
00086                                              false,
00087                                              0,
00088                                              true
00089                                              )
00090                            );
00091   }
00092 }
00093 
00094 
00095 BDSScreenLayer* BDSMultilayerScreen::screenLayer(G4String layer){
00096   for(unsigned int i=0; i<_screenLayers.size(); i++){
00097     if(screenLayer(i)->name()==layer){
00098       screenLayer(i);
00099     }
00100   }
00101   G4cerr << "BDSMultiLayer - error: screen layer \"" << layer << "\" not found. Exiting." << G4endl;
00102   exit(1);
00103 }
00104 
00105 
00106 void BDSMultilayerScreen::place(G4RotationMatrix* rot, G4ThreeVector pos, G4LogicalVolume* motherVol){
00107   phys(new G4PVPlacement(
00108                          rot,
00109                          pos,
00110                          _log,
00111                          "multilayerScreen",
00112                          motherVol,
00113                          false,
00114                          0,
00115                          true
00116                          ));                 
00117 }
00118 
00119 void BDSMultilayerScreen::reflectiveSurface(G4int layer1, G4int layer2){
00120   G4OpticalSurface* OpSurface=new G4OpticalSurface("OpSurface");
00121   //  G4LogicalBorderSurface* LogSurface =
00122   new G4LogicalBorderSurface("LogSurface", screenLayer(layer1)->phys(), screenLayer(layer2)->phys(), OpSurface);
00123   //  G4LogicalSkinSurface* LogSurface  = new G4LogicalSkinSurface("LogSurface",screenLayer(1)->log(),OpSurface);
00124   OpSurface -> SetType(dielectric_metal);
00125   OpSurface -> SetModel(unified);
00126   OpSurface -> SetFinish(polished);
00127 
00128   
00129   
00130   G4MaterialPropertiesTable* SMPT = new G4MaterialPropertiesTable();
00131   SMPT->AddConstProperty("REFLECTIVITY",0.8);
00132   
00133   /*
00134   OpSurface -> SetSigmaAlpha(0.7);
00135   SMPT->AddConstProperty("SPECULARLOBECONSTANT",1.0);
00136   SMPT->AddConstProperty("SPECULARSPIKECONSTANT",0.0);
00137   SMPT->AddConstProperty("BACKSCATTERCONSTANT",0.0);
00138   SMPT->AddConstProperty("EFFICIENCY",0.0);
00139   //  SMPT->AddConstProperty("RINDEX",1.5750);
00140   */
00141 
00142   OpSurface->SetMaterialPropertiesTable(SMPT);
00143 }
00144 
00145 
00146 void BDSMultilayerScreen::roughSurface(G4int layer1, G4int layer2){
00147   G4OpticalSurface* OpSurface=new G4OpticalSurface("OpSurface");
00148   OpSurface->SetType(dielectric_dielectric);
00149   OpSurface->SetFinish(ground);
00150   OpSurface->SetModel(unified);
00151 
00152   //  G4LogicalBorderSurface* LogSurface = 
00153   new G4LogicalBorderSurface("LogSurface", screenLayer(layer1)->phys(), screenLayer(layer2)->phys(), OpSurface);
00154 
00155   G4double sigma_alpha=0.7;
00156   OpSurface -> SetSigmaAlpha(sigma_alpha);
00157   G4MaterialPropertiesTable* SMPT = new G4MaterialPropertiesTable();
00158   SMPT->AddConstProperty("REFLECTIVITY",0.0);
00159   OpSurface->SetMaterialPropertiesTable(SMPT);
00160 }
00161 
00162 BDSMultilayerScreen::~BDSMultilayerScreen(){
00163 }

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7