00001
00002
00003
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
00022
00023
00024 #include "G4Trap.hh"
00025
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
00045 precisionRegion=1;
00046
00047
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
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
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
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
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
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
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
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
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
00257 BuildCameraScoringPlane();
00258 PlaceScreen();
00259
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
00285
00286
00287
00288
00289 G4cout << "BDSAwakeScintillatorScreen: finished building geometry" << G4endl;
00290 }
00291
00292 void BDSAwakeScintillatorScreen::PlaceScreen(){
00293 double zOffset = 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
00304 _cameraScreenDist=4*213*CLHEP::mm;
00305
00306 _screenWidth=_mlScreen->size().x();
00307 _screenHeight=_mlScreen->size().y();
00308
00309
00310 _scoringPlaneThickness=1*CLHEP::um;
00311
00312 _screenThickness = _mlScreen->size().z();
00313
00314 _totalThickness =
00315 _screenThickness + 2*_scoringPlaneThickness;
00316
00317
00318
00319
00320
00321 G4double z_wid = _screenWidth * std::sin(std::abs(_screenAngle));
00322 G4double z_thi = _totalThickness * std::cos(std::abs(_screenAngle));
00323 G4double x_wid = _screenWidth * std::cos(std::abs(_screenAngle));
00324 G4double x_thi = _totalThickness * std::sin(std::abs(_screenAngle));
00325
00326
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);
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 }