00001 #ifndef BDSMultilayerScreen_h 00002 #define BDSMultilayerScreen_h 00003 00004 #include "globals.hh" 00005 #include "G4LogicalVolume.hh" 00006 #include "G4UserLimits.hh" 00007 #include "G4VSolid.hh" 00008 #include "G4TwoVector.hh" 00009 #include "BDSScreenLayer.hh" 00010 00011 class BDSMultilayerScreen 00012 { 00013 public: 00014 BDSMultilayerScreen(G4TwoVector xysize, G4String name); //X-Y size 00015 ~BDSMultilayerScreen(); 00016 G4LogicalVolume* log(); 00017 inline G4String name(){return _name;} 00018 inline G4ThreeVector size(){return _size;} 00019 void screenLayer(G4double thickness, G4String material, G4String name, G4double grooveWidth, G4double grooveSpatialFrequency); 00020 void screenLayer(BDSScreenLayer* layer); 00021 inline BDSScreenLayer* screenLayer(G4int layer){return _screenLayers[layer];} 00022 BDSScreenLayer* screenLayer(G4String layer); 00023 inline G4double nLayers(){return _screenLayers.size();} 00024 void build(); 00025 inline void phys(G4PVPlacement* phys){_phys = phys;} 00026 inline G4PVPlacement* phys(){return _phys;} 00027 virtual void place(G4RotationMatrix* rot, G4ThreeVector pos, G4LogicalVolume* motherVol); 00028 void reflectiveSurface(G4int layer1, G4int layer2); 00029 void roughSurface(G4int layer1, G4int layer2); 00030 00031 private: 00032 G4TwoVector _xysize; 00033 G4String _name; 00034 G4ThreeVector _size; 00035 // Geometrical objects: 00036 G4LogicalVolume* _log; 00037 G4PVPlacement* _phys; 00038 G4VSolid* _solid; 00039 std::vector<BDSScreenLayer*> _screenLayers; 00040 std::vector<G4double> _screenLayerZPos; 00041 void computeDimensions(); 00042 void buildMotherVolume(); 00043 void placeLayers(); 00044 00045 }; 00046 00047 #endif