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

00001 /* BDSIM code.    
00002 A scintillator screen.
00003 Work in progress.  
00004 */
00005 
00006 #include "BDSGlobalConstants.hh" 
00007 #include "BDSAwakeScintillatorScreen.hh"
00008 #include "BDSMaterials.hh"
00009 #include "BDSSampler.hh"
00010 #include "BDSSamplerSD.hh"
00011 #include "BDSCCDCamera.hh"
00012 #include "G4Box.hh"
00013 #include "G4VisAttributes.hh"
00014 #include "G4LogicalVolume.hh"
00015 #include "G4VPhysicalVolume.hh"
00016 #include "G4PVPlacement.hh"               
00017 #include "G4UserLimits.hh"
00018 #include "BDSDebug.hh"
00019 
00020 #include "BDSAwakeMultilayerScreen.hh"
00021 //#include "UltraFresnelLens.hh"
00022 //#include "UltraFresnelLensParameterisation.hh"
00023 
00024 #include "G4Trap.hh"
00025 //#include "BDSOutputBase.hh"
00026 
00027 BDSAwakeScintillatorScreen::BDSAwakeScintillatorScreen(G4String aName,
00028                                                        G4String material,
00029                                                        G4double thickness = 0.3 * CLHEP::mm,
00030                                                        G4double angle = -45*CLHEP::pi/180.0,
00031                                                        G4double windowThickness=0,
00032                                                        G4String windowMaterial="",
00033                                                        BDSTiltOffset tiltOffset):
00034   BDSAcceleratorComponent(aName, 0, 0, "awakescintillatorscreen", tiltOffset),
00035   _mlScreen(NULL),
00036   _camera(NULL),
00037   _material(material),
00038   _thickness(thickness),
00039   _screenAngle(angle),
00040   _windowThickness(windowThickness),
00041   _windowMaterial(windowMaterial)
00042 {
00043   _vacChambType=2;
00044   //Set as part of precision region (for energy loss monitoring)
00045   precisionRegion=1;
00046 
00047   //Set the rotation of the screen
00048   _screenRotationMatrix = new G4RotationMatrix();
00049     _screenRotationMatrix->rotateY(_screenAngle);
00050 
00051   _vacRotationMatrix = new G4RotationMatrix();
00052 }
00053 
00054 void BDSAwakeScintillatorScreen::SetVisAttributes()
00055 {
00056   G4VisAttributes* itsVisAttributes=new G4VisAttributes(G4Colour(0.3,0.4,0.2));
00057   itsVisAttributes->SetForceWireframe(true);
00058 
00059   _visAttFront=new G4VisAttributes(G4Colour(1.0,0.0,0.0,0.5));
00060   _visAttScint=new G4VisAttributes(G4Colour(0.0,1.0,0.0,0.5));
00061   _visAttBase =new G4VisAttributes(G4Colour(0.3,0.3,0.3,0.5));
00062   _visAttSampler=new G4VisAttributes(G4Colour(0.2,0.2,0.0,0.5));
00063   
00064 
00065   _visAttFront->SetForceSolid(true);
00066   _visAttScint->SetForceSolid(true);
00067   _visAttBase->SetForceSolid(true);
00068   _visAttSampler->SetForceSolid(true);
00069   _visAttSampler->SetVisibility(true);
00070 }
00071 
00072 void BDSAwakeScintillatorScreen::BuildCameraScoringPlane(){
00073   G4String tmp = "_cameraScoringPlane";
00074   _scoringPlaneName=name+tmp;
00075   int nThisSampler= BDSSampler::GetNSamplers() + 1;
00076   G4String ident="_camera";
00077   _samplerName = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_scoringPlaneName);
00078   _samplerName2 = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_scoringPlaneName+"_2");
00079 
00080   
00081   //Build and place the volume...
00082   itsCameraScoringPlaneSolid = new G4Box("CameraScoringPlaneSolid",100*CLHEP::mm/2.0,500*CLHEP::mm/2.0,_scoringPlaneThickness/2.0);
00083 
00084   itsCameraScoringPlaneLog = new G4LogicalVolume(itsCameraScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"CameraScoringPlaneLog",0,0,0);
00085   itsCameraScoringPlaneLog->SetVisAttributes(_visAttSampler);
00086 
00087   G4double dispX=_cameraScreenDist-_scoringPlaneThickness/2.0;
00088   G4double dispY=0;
00089   G4double dispZ=-_cameraScreenDist/2.0;;
00090 
00091   new G4PVPlacement(BDSGlobalConstants::Instance()->RotY90(),G4ThreeVector(dispX,dispY,dispZ),itsCameraScoringPlaneLog,_samplerName,
00092                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00093   
00094   itsCameraScoringPlaneLog2 = new G4LogicalVolume(itsCameraScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"CameraScoringPlaneLog2",0,0,0);
00095   itsCameraScoringPlaneLog2->SetVisAttributes(_visAttSampler);
00096 
00097   G4double dispX2=-sin(_screenAngle)*_cameraScreenDist;
00098   G4double dispY2=0;
00099   G4double dispZ2=cos(_screenAngle)*_cameraScreenDist-_cameraScreenDist/2.0;
00100 
00101 
00102   new G4PVPlacement(_screenRotationMatrix,G4ThreeVector(dispX2,dispY2,dispZ2),itsCameraScoringPlaneLog2,_samplerName2,
00103                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00104 
00105   itsCameraScoringPlaneLog->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00106   itsCameraScoringPlaneLog2->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00107   //SPM bdsOutput->nSamplers++;
00108   BDSSampler::AddExternalSampler(_samplerName+"_1");
00109   BDSSampler::AddExternalSampler(_samplerName2+"_1");
00110 
00111   _samplerName3 = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_scoringPlaneName+"_3");
00112   _samplerName4 = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_scoringPlaneName+"_4");
00113 
00114   
00115   //Build and place the volume...
00116   itsCameraScoringPlaneLog3 = new G4LogicalVolume(itsCameraScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"CameraScoringPlaneLog3",0,0,0);
00117   itsCameraScoringPlaneLog3->SetVisAttributes(_visAttSampler);
00118 
00119   G4double dispX3=_cameraScreenDist/2.0-_scoringPlaneThickness/2.0;
00120   G4double dispY3=0;
00121   G4double dispZ3=-_cameraScreenDist/2.0;;
00122 
00123   new G4PVPlacement(BDSGlobalConstants::Instance()->RotY90(),G4ThreeVector(dispX3,dispY3,dispZ3),itsCameraScoringPlaneLog3,_samplerName3,
00124                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00125   
00126   itsCameraScoringPlaneLog4 = new G4LogicalVolume(itsCameraScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"CameraScoringPlaneLog4",0,0,0);
00127   itsCameraScoringPlaneLog4->SetVisAttributes(_visAttSampler);
00128 
00129   G4double dispX4=-sin(_screenAngle)*_cameraScreenDist/2.0;
00130   G4double dispY4=0;
00131   G4double dispZ4=cos(_screenAngle)*_cameraScreenDist/2.0-_cameraScreenDist/2.0;
00132 
00133 
00134   new G4PVPlacement(_screenRotationMatrix,G4ThreeVector(dispX4,dispY4,dispZ4),itsCameraScoringPlaneLog4,_samplerName4,
00135                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00136   
00137   itsCameraScoringPlaneLog3->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00138   itsCameraScoringPlaneLog4->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00139   BDSSampler::AddExternalSampler(_samplerName3+"_1");
00140   BDSSampler::AddExternalSampler(_samplerName4+"_1");
00141 
00142   _samplerName5 = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_scoringPlaneName+"_5");
00143   _samplerName6 = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_scoringPlaneName+"_6");
00144 
00145   
00146   //Build and place the volume...
00147   itsCameraScoringPlaneLog5 = new G4LogicalVolume(itsCameraScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"CameraScoringPlaneLog5",0,0,0);
00148   itsCameraScoringPlaneLog5->SetVisAttributes(_visAttSampler);
00149 
00150   G4double dispX5=_cameraScreenDist/4.0-_scoringPlaneThickness/2.0;
00151   G4double dispY5=0;
00152   G4double dispZ5=-_cameraScreenDist/2.0;;
00153 
00154   new G4PVPlacement(BDSGlobalConstants::Instance()->RotY90(),G4ThreeVector(dispX5,dispY5,dispZ5),itsCameraScoringPlaneLog5,_samplerName5,
00155                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00156   
00157   itsCameraScoringPlaneLog6 = new G4LogicalVolume(itsCameraScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"CameraScoringPlaneLog6",0,0,0);
00158   itsCameraScoringPlaneLog6->SetVisAttributes(_visAttSampler);
00159 
00160   G4double dispX6=-sin(_screenAngle)*_cameraScreenDist/4.0;
00161   G4double dispY6=0;
00162   G4double dispZ6=cos(_screenAngle)*_cameraScreenDist/4.0-_cameraScreenDist/2.0;
00163 
00164 
00165   new G4PVPlacement(_screenRotationMatrix,G4ThreeVector(dispX6,dispY6,dispZ6),itsCameraScoringPlaneLog6,_samplerName6,
00166                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00167   
00168   itsCameraScoringPlaneLog5->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00169   itsCameraScoringPlaneLog6->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00170   BDSSampler::AddExternalSampler(_samplerName5+"_1");
00171   BDSSampler::AddExternalSampler(_samplerName6+"_1");
00172 
00173 #ifndef NOUSERLIMITS
00174   G4double maxStepFactor=0.5;
00175   G4UserLimits* itsScoringPlaneUserLimits =  new G4UserLimits();
00176   itsScoringPlaneUserLimits->SetMaxAllowedStep(_scoringPlaneThickness*maxStepFactor);
00177   itsCameraScoringPlaneLog->SetUserLimits(itsScoringPlaneUserLimits);
00178 #endif
00179 }
00180 
00181 //void BDSAwakeScintillatorScreen::BuildFresnelLens(){
00183   /*
00184   G4cout << "#                                                    #" << G4endl ;
00185   G4cout << "#           Building the Fresnel lens ...            #" << G4endl ;
00186   G4cout << "#                                                    #" << G4endl ;
00187 
00188   G4double      LensDiameter        = 457*CLHEP::mm ; // Size of the optical active area of the lens.                                                                
00189   G4int      LensNumOfGrooves    = 13 ;
00190   //G4int      LensNumOfGrooves    = 129 ;                                                                                                                    
00191   //G4int      LensNumOfGrooves    = 1287 ;                                                                                                                   
00192 
00193   G4double      LensBorderThickness = 2.8*CLHEP::mm ;     // Thickness of the border area.                                                                           
00194   G4double      LensFocalLength     = 441.973*CLHEP::mm ; // This parameter depends on the lens geometry, etc !!                                                     
00195   G4Material   *LensMaterial        = G4Material::GetMaterial(name = "Acrylic") ;
00196   G4ThreeVector LensPosition        = UVscopePosition+G4ThreeVector(0.0*CLHEP::mm,0.0*CLHEP::mm,UVscopeHeight/2.0-UVscopeBaffle) ;
00197 
00198   UltraFresnelLens *FresnelLens = new UltraFresnelLens(LensDiameter,LensNumOfGrooves,LensMaterial,_log) ;
00199   */
00200 //}
00201 
00202 
00203 void BDSAwakeScintillatorScreen::BuildScreenScoringPlane(){
00204   G4String tmp = "_screenScoringPlane";
00205   _screenScoringPlaneName=name+tmp;
00206   int nThisSampler= BDSSampler::GetNSamplers() + 1;
00207   G4String ident="_screen";
00208   _screenSamplerName = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_screenScoringPlaneName);
00209   _screenSamplerName2 = ("Sampler_"+BDSGlobalConstants::Instance()->StringFromInt(nThisSampler)+"_"+_screenScoringPlaneName+"_2");
00210   
00211   //Build and place the volume...
00212   itsScreenScoringPlaneSolid = new G4Box("ScreenScoringPlaneSolid",_screenWidth/2.0,_screenHeight/2.0,_scoringPlaneThickness/2.0);
00213   itsScreenScoringPlaneLog = new G4LogicalVolume(itsScreenScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"ScreenScoringPlaneLog",0,0,0);
00214   itsScreenScoringPlaneLog->SetVisAttributes(_visAttSampler);
00215   itsScreenScoringPlaneLog2 = new G4LogicalVolume(itsScreenScoringPlaneSolid,BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),"ScreenScoringPlaneLog2",0,0,0);
00216   itsScreenScoringPlaneLog2->SetVisAttributes(_visAttSampler);
00217   G4double dispX=0;
00218   G4double dispY=0;
00219   G4double dispZ=2*std::cos(std::abs(_screenAngle))*(_screenThickness/2.0+_scoringPlaneThickness/2.0)-_cameraScreenDist/2.0;
00220   G4double dispZ2=-2*std::cos(std::abs(_screenAngle))*(_screenThickness/2.0+_scoringPlaneThickness/2.0)-_cameraScreenDist/2.0;
00221   new G4PVPlacement(_screenRotationMatrix,G4ThreeVector(dispX,dispY,dispZ),itsScreenScoringPlaneLog,_screenSamplerName,
00222                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00223 
00224   new G4PVPlacement(_screenRotationMatrix,G4ThreeVector(dispX,dispY,dispZ2),itsScreenScoringPlaneLog2,_screenSamplerName2,
00225                     containerLogicalVolume,false,0,BDSGlobalConstants::Instance()->GetCheckOverlaps());
00226   
00227   //--
00228   itsScreenScoringPlaneLog->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00229   //-----------
00230   itsScreenScoringPlaneLog2->SetSensitiveDetector(BDSSampler::GetSensitiveDetector());
00231   //SPM bdsOutput->nSamplers++;
00232   //--
00233   BDSSampler::AddExternalSampler(_screenSamplerName+"_1");
00234   //----------
00235   BDSSampler::AddExternalSampler(_screenSamplerName2+"_1");
00236 #ifndef NOUSERLIMITS
00237   G4double maxStepFactor=0.5;
00238   G4UserLimits* itsScoringPlaneUserLimits =  new G4UserLimits();
00239   itsScoringPlaneUserLimits->SetMaxAllowedStep(_scoringPlaneThickness*maxStepFactor);
00240   itsScreenScoringPlaneLog->SetUserLimits(itsScoringPlaneUserLimits);
00241 #endif
00242 }
00243 
00244 void BDSAwakeScintillatorScreen::Build()
00245 {
00246   SetVisAttributes(); 
00247   BuildScreen();
00248   BuildCamera();        
00249   ComputeDimensions();
00250   BuildContainerLogicalVolume();
00251   if(_vacChambType==2){
00252     BuildVacuumChamber2();
00253   } else {
00254     BuildVacuumChamber1();
00255   }
00256   //      BuildScreenScoringPlane();
00257   BuildCameraScoringPlane();
00258   PlaceScreen();
00259   //      PlaceCamera();
00260 }
00261 
00262 void BDSAwakeScintillatorScreen::BuildCamera(){
00263   _camera=new BDSCCDCamera();
00264 }
00265 void BDSAwakeScintillatorScreen::PlaceCamera(){
00266   _camera->phys(new G4PVPlacement(_screenRotationMatrix,
00267                                   G4ThreeVector(-1*_cameraScreenDist*sin(_screenAngle),0,1*_cameraScreenDist*cos(_screenAngle)),
00268                                   _camera->log(),
00269                                   _camera->name()+"_phys",
00270                                   containerLogicalVolume,
00271                                   false,
00272                                   0,
00273                                   true)
00274                 );
00275 }
00276 
00277 void BDSAwakeScintillatorScreen::BuildScreen()
00278 {
00279   G4cout << "Building BDSAwakeMultilayerScreen...." << G4endl;
00280   G4double grainSize = 10*1e-6*CLHEP::m;
00281   _mlScreen = new BDSAwakeMultilayerScreen(_material,_thickness, grainSize, _windowThickness, _windowMaterial);
00282   
00283   G4cout << "finished." << G4endl;
00284   //  if(BDSGlobalConstants::Instance()->GetSensitiveComponents()){
00285   //    for(int i=0; i<_mlScreen->nLayers(); i++){
00286   //      RegisterSensitiveVolume(_mlScreen[i].log());
00287   //    }
00288   //  } 
00289   G4cout << "BDSAwakeScintillatorScreen: finished building geometry" << G4endl;
00290 }
00291 
00292 void BDSAwakeScintillatorScreen::PlaceScreen(){
00293   double zOffset = 0;//_totalThickness*cos(_screenAngle)/2.0;
00294   double xOffset = -_totalThickness*sin(_screenAngle)/2.0;
00295   _mlScreen->place(_screenRotationMatrix,
00296                    G4ThreeVector(xOffset,0,-_cameraScreenDist/2.0+zOffset),
00297                    containerLogicalVolume
00298                    );
00299 }
00300 
00301 void BDSAwakeScintillatorScreen::ComputeDimensions()
00302 {
00303   //  _cameraScreenDist=(4.0)*CLHEP::m;
00304   _cameraScreenDist=4*213*CLHEP::mm;
00305 
00306   _screenWidth=_mlScreen->size().x();
00307   _screenHeight=_mlScreen->size().y();
00308 
00309   //The scoring plane...
00310   _scoringPlaneThickness=1*CLHEP::um;
00311 
00312   _screenThickness = _mlScreen->size().z();
00313   
00314   _totalThickness =  
00315     _screenThickness + 2*_scoringPlaneThickness;
00316   
00317   
00318   //  G4double thi=_totalThickness+2*_cameraScreenDist+2*_camera->size().z()+2*_scoringPlaneThickness;
00319 
00320   //Compute the marker volume length according to the screen thickness and width.
00321   G4double z_wid = _screenWidth * std::sin(std::abs(_screenAngle));//Length due to the screen width and angle
00322   G4double z_thi = _totalThickness * std::cos(std::abs(_screenAngle));//Length due to the screen thickness
00323   G4double x_wid = _screenWidth * std::cos(std::abs(_screenAngle));//Length due to the screen width and angle
00324   G4double x_thi = _totalThickness * std::sin(std::abs(_screenAngle));//Length due to the screen thickness
00325   
00326   //Vacuum chamber dimensions.
00327   _vacThickness=2*CLHEP::mm;
00328   _vacInnerWidth=7*CLHEP::cm;
00329   _vacInnerHeight=7*CLHEP::cm;
00330   _vacHeight=_vacInnerHeight+2*_vacThickness;
00331   
00332   _vacWidth2=x_wid;
00333   _vacDispX2=-_vacWidth2/4.0;
00334   
00335   if(_vacChambType==2){
00336     _vacKevlarThickness=1e-30;
00337     _vacMylarThickness=1e-30;
00338     
00339   }else{
00340     _vacKevlarThickness=0.3*CLHEP::mm;
00341     _vacMylarThickness=0.05*CLHEP::mm;
00342   }
00343   
00344   _vacWidth1=_vacInnerWidth+_vacKevlarThickness+_vacMylarThickness+_vacThickness;
00345   _vacDispX1=-((sqrt(2.0)/2.0)/2.0)*CLHEP::m-_vacWidth1/2.0-0.15*CLHEP::mm;
00346 
00347 
00348 
00349   chordLength  = z_wid + z_thi +_cameraScreenDist;  
00350   itsXLength = (x_wid +x_thi+2*_vacWidth1)+2*_cameraScreenDist;
00351   itsYLength = std::max(_screenHeight,_camera->size().y());
00352   itsYLength = std::max(itsYLength,50*CLHEP::cm);
00353   G4cout << __METHOD_NAME__ << chordLength << " " << itsXLength << " " << itsYLength << std::endl;
00354 
00355   _vacDispZ2=(-chordLength)/2.0+(_vacWidth2)/2.0;
00356   
00357   _vacLength=chordLength;
00358 }
00359 
00360 void BDSAwakeScintillatorScreen::BuildContainerLogicalVolume()
00361 {
00362   containerSolid = new G4Box(name+"_marker_solid",
00363                              itsXLength/2.0,
00364                              itsYLength/2.0,
00365                              chordLength/2.0); //z half length 
00366   
00367   containerLogicalVolume = new G4LogicalVolume
00368     (containerSolid, 
00369      BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),
00370      name+"_lv");
00371   G4VisAttributes* visAtt = new G4VisAttributes(G4Color(0,1,0));
00372   visAtt->SetForceWireframe(true);
00373   visAtt->SetVisibility(true);
00374   containerLogicalVolume->SetVisAttributes(visAtt);
00375 #ifndef NOUSERLIMITS
00376   G4double maxStepFactor=0.5;
00377   G4UserLimits* itsMarkerUserLimits =  new G4UserLimits();
00378   itsMarkerUserLimits->SetMaxAllowedStep(chordLength*maxStepFactor);
00379   itsMarkerUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00380   containerLogicalVolume->SetUserLimits(itsMarkerUserLimits);
00381 #endif
00382 }
00383 
00384 void BDSAwakeScintillatorScreen::BuildVacuumChamber1(){
00385 
00386 
00387   G4VSolid* vacuumOuterSolid = new G4Box("vacuumSolid",_vacWidth1/2.0,
00388                                          _vacHeight/2.0, 
00389                                          _vacLength/2.0);
00390 
00391 
00392   G4VSolid* vacuumSolid = new G4Box("vacuumSolid",_vacInnerWidth/2.0, _vacInnerHeight/2.0, _vacLength/2.0);
00393 
00394   G4LogicalVolume* vacuumOuterLog = new G4LogicalVolume(vacuumOuterSolid, BDSMaterials::Instance()->GetMaterial("iron"), "vacuumOuterLog",0,0,0);
00395 
00396   new G4PVPlacement(_vacRotationMatrix, 
00397                     G4ThreeVector(_vacDispX1,0,0), 
00398                     vacuumOuterLog, 
00399                     "awakeScreenOuterVacuumPV", 
00400                     containerLogicalVolume, 
00401                     false, 
00402                     0,
00403                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00404                     );
00405 
00406   G4LogicalVolume* vacuumLog = new G4LogicalVolume(vacuumSolid, BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()), "vacuumLog",0,0,0);
00407 
00408  
00409   new G4PVPlacement(new G4RotationMatrix(), 
00410                     G4ThreeVector(_vacThickness/2.0-(_vacMylarThickness+_vacKevlarThickness)/2.0,0,0), 
00411                     vacuumLog, 
00412                     "awakeScreenVacuumPV", 
00413                     vacuumOuterLog, 
00414                     false, 
00415                     0,
00416                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00417                     );
00418  
00419 
00420   G4VSolid* vacuumWindowSolid = new G4Box("vacuumWindowSolid",(_vacMylarThickness+_vacKevlarThickness)/2.0, _vacInnerHeight/2.0, _vacLength/2.0);
00421   G4LogicalVolume* vacuumWindowLog = new G4LogicalVolume(vacuumWindowSolid, BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()), "vacuumWindowLog",0,0,0);
00422 
00423   G4VSolid* kevlarWindowSolid = new G4Box("kevlarWindowSolid",_vacKevlarThickness/2.0, _vacInnerHeight/2.0, _vacLength/2.0);
00424   G4LogicalVolume* kevlarWindowLog = new G4LogicalVolume(kevlarWindowSolid, BDSMaterials::Instance()->GetMaterial("G4_KEVLAR"), "kevlarWindowLog",0,0,0);
00425 
00426   G4VSolid* mylarWindowSolid = new G4Box("mylarWindowSolid",_vacMylarThickness/2.0, _vacInnerHeight/2.0, _vacLength/2.0);
00427   G4LogicalVolume* mylarWindowLog = new G4LogicalVolume(mylarWindowSolid, BDSMaterials::Instance()->GetMaterial("G4_MYLAR"), "mylarWindowLog",0,0,0);
00428 
00429   new G4PVPlacement(new G4RotationMatrix(), 
00430                     G4ThreeVector(_vacWidth1/2.0-(_vacMylarThickness+_vacKevlarThickness)/2.0,0,0), 
00431                     vacuumWindowLog, 
00432                     "awakeScreenVacuumWindowPV", 
00433                     vacuumOuterLog, 
00434                     false, 
00435                     0,
00436                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00437                     );
00438   
00439   new G4PVPlacement(new G4RotationMatrix(), 
00440                     G4ThreeVector((_vacKevlarThickness+_vacMylarThickness)/2.0 - _vacKevlarThickness/2.0,0,0), 
00441                     kevlarWindowLog, 
00442                     "awakeScreenKevlarVacuumWindowPV", 
00443                     vacuumWindowLog, 
00444                     false, 
00445                     0,
00446                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00447                     );
00448 
00449   new G4PVPlacement(new G4RotationMatrix(), 
00450                     G4ThreeVector(-(_vacKevlarThickness+_vacMylarThickness)/2.0 + _vacMylarThickness/2.0,0,0), 
00451                     mylarWindowLog, 
00452                     "awakeScreenMylarVacuumWindowPV", 
00453                     vacuumWindowLog, 
00454                     false, 
00455                     0,
00456                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00457                     );
00458 
00459   G4VisAttributes* vacVisAttributes=new G4VisAttributes(G4Colour(0.3,0.0,0.4,0.5));
00460   vacVisAttributes->SetForceWireframe(true);
00461   vacVisAttributes->SetVisibility(true);
00462   vacuumOuterLog->SetVisAttributes(vacVisAttributes);
00463 
00464   G4VisAttributes* winVisAttributes=new G4VisAttributes(G4Colour(1.0,0.0,0.0,0.5));
00465   winVisAttributes->SetForceSolid(true);
00466   winVisAttributes->SetVisibility(true);
00467   vacuumWindowLog->SetVisAttributes(winVisAttributes);
00468 }
00469 
00470 void BDSAwakeScintillatorScreen::BuildVacuumChamber2()
00471 {
00472   G4VSolid* vacuumOuterSolid = new G4Trap("vacuumOuterSolid",
00473                                           _vacWidth2/2.0,
00474                                           1.0*(-acos(0.0)+atan(2.0)),
00475                                           0,
00476                                           _vacThickness/2.0,
00477                                           1e-30,1e-30,
00478                                           0,
00479                                           _vacThickness/2.0,
00480                                           _vacWidth2/2.0, _vacWidth2/2.0,
00481                                           0);
00482 
00483   G4VSolid* vacuumInnerSolid = new G4Trap("vacuumInnerSolid",
00484                                           _vacWidth2/2.0,
00485                                           1.0*(-acos(0.0)+atan(2.0)),
00486                                           0,
00487                                           _vacInnerHeight/2.0,
00488                                           1e-30,1e-30,
00489                                           0,
00490                                           _vacInnerHeight/2.0,
00491                                           _vacWidth2/2.0, _vacWidth2/2.0,
00492                                           0);
00493 
00494 
00495   G4LogicalVolume* vacuumOuterLog = new G4LogicalVolume(vacuumOuterSolid, BDSMaterials::Instance()->GetMaterial("iron"), "vacuumOuterLog",0,0,0);
00496 
00497   G4LogicalVolume* vacuumInnerLog = new G4LogicalVolume(vacuumInnerSolid, BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()), "vacuumInnerLog",0,0,0);
00498 
00499   _vacRotationMatrix->rotateY(CLHEP::pi);
00500 
00501   new G4PVPlacement(_vacRotationMatrix, 
00502                     G4ThreeVector(_vacDispX2,(_vacHeight+_vacThickness)/2.0,_vacDispZ2), 
00503                     vacuumOuterLog, 
00504                     "awakeScreenUpperVacuumPV", 
00505                     containerLogicalVolume, 
00506                     false, 
00507                     0,
00508                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00509                     );
00510 
00511   new G4PVPlacement(_vacRotationMatrix, 
00512                     G4ThreeVector(_vacDispX2,-(_vacHeight+_vacThickness)/2.0,_vacDispZ2), 
00513                     vacuumOuterLog, 
00514                     "awakeScreenLowerVacuumPV", 
00515                     containerLogicalVolume, 
00516                     false, 
00517                     0,
00518                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00519                     );
00520 
00521   new G4PVPlacement(_vacRotationMatrix, 
00522                     G4ThreeVector(_vacDispX2,0,_vacDispZ2), 
00523                     vacuumInnerLog, 
00524                     "awakeScreenInnerVacuumPV", 
00525                     containerLogicalVolume, 
00526                     false, 
00527                     0,
00528                     BDSGlobalConstants::Instance()->GetCheckOverlaps()
00529                     );
00530 
00531 
00532   G4VisAttributes* vacVisAttributes=new G4VisAttributes(G4Colour(0.3,0.0,0.4,0.5));
00533   vacVisAttributes->SetForceWireframe(true);
00534   vacVisAttributes->SetVisibility(true);
00535   vacuumOuterLog->SetVisAttributes(vacVisAttributes);
00536   vacuumInnerLog->SetVisAttributes(vacVisAttributes);
00537 
00538 }
00539 
00540 
00541 BDSAwakeScintillatorScreen::~BDSAwakeScintillatorScreen()
00542 {
00543   delete _mlScreen;
00544   delete _camera;
00545   delete _vacRotationMatrix;
00546 }

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7