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
00060 }
00061 _size.setZ(temp);
00062
00063 G4cout << "...z positions..." << G4endl;
00064 G4double pos = _screenLayers[0]->size().z()/2.0 -1.0*_size.z()/2.0;
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,
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
00122 new G4LogicalBorderSurface("LogSurface", screenLayer(layer1)->phys(), screenLayer(layer2)->phys(), OpSurface);
00123
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
00135
00136
00137
00138
00139
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
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 }