source: trunk/examples/advanced/air_shower/src/UltraDetectorConstruction.cc@ 807

Last change on this file since 807 was 807, checked in by garnier, 17 years ago

update

File size: 22.1 KB
RevLine 
[807]1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// --------------------------------------------------------------
28// GEANT 4 - ULTRA experiment example
29// --------------------------------------------------------------
30//
31// Code developed by:
32// B. Tome, M.C. Espirito-Santo, A. Trindade, P. Rodrigues
33//
34// ****************************************************
35// * UltraDetectorConstruction.cc
36// ****************************************************
37//
38// Class used in the definition of the Ultra setup consisting of:
39// - the UVscope detector
40// - an optional reflecting surface
41// Optical photons can reach the UVscope either directly or after reflection in the
42// surface, which can be polished or diffusing.
43// The main part of the UVscope definition is the Fresnel lens construction based
44// on the UltraFresnelLens class.
45//
46#include <cmath>
47#include "UltraDetectorConstruction.hh"
48#include "UltraPMTSD.hh"
49#include "UltraFresnelLens.hh"
50
51#include "G4SDManager.hh"
52#include "G4Material.hh"
53#include "G4MaterialTable.hh"
54#include "G4Element.hh"
55#include "G4ElementTable.hh"
56#include "G4LogicalBorderSurface.hh"
57#include "G4Box.hh"
58#include "G4Sphere.hh"
59#include "G4Tubs.hh"
60#include "G4LogicalVolume.hh"
61#include "G4RotationMatrix.hh"
62#include "G4ThreeVector.hh"
63#include "G4Transform3D.hh"
64#include "G4PVPlacement.hh"
65#include "G4OpBoundaryProcess.hh"
66#include "G4VisAttributes.hh"
67#include "G4Colour.hh"
68
69//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
70
71UltraDetectorConstruction::UltraDetectorConstruction()
72{
73
74 PMTSD = 0;
75
76 // Sensitive Detector Manager
77 SDmanager = G4SDManager::GetSDMpointer();
78}
79
80//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
81
82UltraDetectorConstruction::~UltraDetectorConstruction(){;}
83
84//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
85
86G4VPhysicalVolume* UltraDetectorConstruction::Construct()
87{
88 ConstructTableMaterials();
89
90
91
92// The experimental Hall
93// ---------------------
94
95 G4double World_x = 1.*m;
96 G4double World_y = 1.*m;
97 G4double World_z = 2*m;
98
99 G4Box * World_box = new G4Box("World",World_x,World_y,World_z);
100
101 // Get Air pointer from static funcion - (G4Material::GetMaterial)
102
103G4String name;
104G4Material *Air = G4Material::GetMaterial(name = "Air");
105G4LogicalVolume *World_log ;
106World_log = new G4LogicalVolume(World_box,Air,"World",0,0,0);
107
108G4VPhysicalVolume *World_phys ;
109World_phys = new G4PVPlacement(0,G4ThreeVector(),"World",World_log,0,false,0);
110
111 G4VisAttributes* UniverseVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,1.0));
112 UniverseVisAtt->SetVisibility(true);
113 UniverseVisAtt->SetForceWireframe(true);
114 World_log->SetVisAttributes(UniverseVisAtt);
115 World_log->SetVisAttributes (G4VisAttributes::Invisible);
116
117
118
119 G4cout << "\n \n \n \n \n \n \n \n \n \n \n \n \n " << G4endl ;
120
121 G4cout << "######################################################" << G4endl ;
122 G4cout << "# #" << G4endl ;
123 G4cout << "# #" << G4endl ;
124 G4cout << "# UltraDetectorConstruction: #" << G4endl ;
125 G4cout << "# #" << G4endl ;
126 G4cout << "# #" << G4endl ;
127
128 G4VPhysicalVolume* chosenVolume;
129 chosenVolume = ConstructUVscope(World_phys);
130
131
132 G4cout << "# #" << G4endl ;
133 G4cout << "# #" << G4endl ;
134 G4cout << "######################################################" << G4endl ;
135
136
137#ifdef ULTRA_MIRROR_USE
138
139 G4cout << "Using mirror reflecting surface " << G4endl ;
140
141 G4VPhysicalVolume* Mirror ;
142 Mirror = ConstructMirror(World_phys);
143
144#elif ULTRA_GROUND_USE
145
146 G4cout << "Using ground reflecting surface " << G4endl ;
147
148 G4VPhysicalVolume* Ground ;
149 Ground = ConstructGround(World_phys);
150
151#else
152
153 G4cout << "No reflecting surface used" << G4endl ;
154
155#endif
156
157 return World_phys;
158}
159
160//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
161
162void UltraDetectorConstruction::ConstructTableMaterials()
163{
164 G4double a, z, density;
165 G4String name, symbol;
166 G4int nel;
167
168
169// ------------- Elements -------------
170 a = 1.01*g/mole;
171 G4Element* elH = new G4Element(name="Hydrogen", symbol="H", z=1., a);
172
173 a = 12.01*g/mole;
174 G4Element* elC = new G4Element(name="Carbon", symbol="C", z=6., a);
175
176 a = 14.01*g/mole;
177 G4Element* elN = new G4Element(name="Nitrogen", symbol="N", z=7., a);
178
179 a = 16.00*g/mole;
180 G4Element* elO = new G4Element(name="Oxygen", symbol="O", z=8., a);
181
182 a = 28.09*g/mole;
183 G4Element* elSi = new G4Element(name="Silicon", symbol="Si", z=14., a);
184
185
186// ------------- Materials -------------
187
188
189// Air
190// ---
191 density = 1.29e-03*g/cm3;
192 G4Material* Air = new G4Material(name="Air", density, nel=2);
193 Air->AddElement(elN, .7);
194 Air->AddElement(elO, .3);
195
196
197// Aluminum
198// ---------
199 a = 26.98*g/mole;
200 density = 2.7*g/cm3;
201 G4Material* Al ;
202 Al = new G4Material(name="Aluminum", z=13., a, density);
203
204
205// Quartz
206// -------
207// density = 2.200*g/cm3; // fused quartz
208 density = 2.64*g/cm3; // crystalline quartz (c.f. PDG)
209 G4Material *Quartz = new G4Material(name="Quartz",density, nel=2);
210 Quartz->AddElement(elSi, 1) ;
211 Quartz->AddElement(elO , 2) ;
212
213
214// PMMA C5H8O2 ( Acrylic )
215// -------------
216 density = 1.19*g/cm3;
217 G4Material* Acrylic = new G4Material(name="Acrylic", density, nel=3);
218 Acrylic->AddElement(elC, 5);
219 Acrylic->AddElement(elH, 8);
220 Acrylic->AddElement(elO, 2);
221
222
223/////////////////////////////////////////////
224// Construct Material Properties Tables
225/////////////////////////////////////////////
226
227 const G4int NUMENTRIES = 32;
228
229 // Energy bins
230 G4double X_RINDEX[NUMENTRIES] =
231 { 2.034E-9*GeV, 2.068E-9*GeV, 2.103E-9*GeV, 2.139E-9*GeV,
232 2.177E-9*GeV, 2.216E-9*GeV, 2.256E-9*GeV, 2.298E-9*GeV,
233 2.341E-9*GeV, 2.386E-9*GeV, 2.433E-9*GeV, 2.481E-9*GeV,
234 2.532E-9*GeV, 2.585E-9*GeV, 2.640E-9*GeV, 2.697E-9*GeV,
235 2.757E-9*GeV, 2.820E-9*GeV, 2.885E-9*GeV, 2.954E-9*GeV,
236 3.026E-9*GeV, 3.102E-9*GeV, 3.181E-9*GeV, 3.265E-9*GeV,
237 3.353E-9*GeV, 3.446E-9*GeV, 3.545E-9*GeV, 3.649E-9*GeV,
238 3.760E-9*GeV, 3.877E-9*GeV, 4.002E-9*GeV, 4.136E-9*GeV } ;
239
240
241 // Air
242 G4double RINDEX_AIR[NUMENTRIES] =
243 { 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
244 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
245 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
246 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00,
247 1.00, 1.00, 1.00, 1.00 } ;
248
249// Air refractive index at 20 oC and 1 atm (from PDG)
250 for(G4int j=0 ; j<NUMENTRIES ; j++){
251 RINDEX_AIR[j] = RINDEX_AIR[j] + 2.73*std::pow(10.0,-4) ;
252 }
253
254 G4MaterialPropertiesTable *MPT_Air = new G4MaterialPropertiesTable();
255 MPT_Air->AddProperty("RINDEX", X_RINDEX, RINDEX_AIR, NUMENTRIES);
256 Air->SetMaterialPropertiesTable(MPT_Air);
257
258//////////////////////////////////////////////////////////////////////////////////////
259// Photomultiplier (PMT) window
260// The refractive index is for lime glass;
261// wavelength dependence is not included and value at 400nm is used.
262//////////////////////////////////////////////////////////////////////////////////////
263
264 // Refractive index
265
266 const G4int N_RINDEX_QUARTZ = 2 ;
267 G4double X_RINDEX_QUARTZ[N_RINDEX_QUARTZ] = {0.0*eV, 10.0*eV};
268 G4double RINDEX_QUARTZ[N_RINDEX_QUARTZ] = {1.54, 1.54};
269
270 G4MaterialPropertiesTable *MPT_PMT = new G4MaterialPropertiesTable();
271 MPT_PMT->AddProperty("RINDEX", X_RINDEX_QUARTZ, RINDEX_QUARTZ, N_RINDEX_QUARTZ);
272
273 Quartz->SetMaterialPropertiesTable(MPT_PMT);
274
275
276//////////////////////////////////////////////////////////////////
277// ACRYLIC Optical properties
278//////////////////////////////////////////////////////////////////
279
280// Refractive index
281
282 const G4int N_RINDEX_ACRYLIC = 3 ;
283 G4double X_RINDEX_ACRYLIC[N_RINDEX_ACRYLIC] = {320.0, 400.0, 500.0}; // Wavelength in nanometers
284 G4double RINDEX_ACRYLIC[N_RINDEX_ACRYLIC] = {1.526, 1.507, 1.497};
285
286 // Convert from nm to GeV
287
288 for(G4int i=0;i<N_RINDEX_ACRYLIC; i++){
289 X_RINDEX_ACRYLIC[i] = ((1239.84/X_RINDEX_ACRYLIC[i])*1E-9)*GeV;
290 }
291
292 G4MaterialPropertiesTable *MPT_Acrylic = new G4MaterialPropertiesTable();
293 MPT_Acrylic->AddProperty("RINDEX", X_RINDEX_ACRYLIC, RINDEX_ACRYLIC, N_RINDEX_ACRYLIC);
294 Acrylic->SetMaterialPropertiesTable(MPT_Acrylic);
295
296
297//////////////////////////////////////////////////////////////////
298
299 G4cout << *(G4Material::GetMaterialTable()) << G4endl ;
300
301}
302//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
303
304G4VPhysicalVolume* UltraDetectorConstruction::ConstructMirror(G4VPhysicalVolume *World_phys){
305
306 G4double Mirror_x = 40.0*cm;
307 G4double Mirror_y = 40.0*cm;
308 G4double Mirror_z = 1*cm;
309
310 G4Box * boxMirror = new G4Box("Mirror",Mirror_x,Mirror_y,Mirror_z);
311
312 // Get Air pointer from static funcion - (G4Material::GetMaterial)
313
314G4String name;
315G4Material *Al = G4Material::GetMaterial(name = "Aluminum");
316G4LogicalVolume *logMirror ;
317logMirror = new G4LogicalVolume(boxMirror,Al,"Mirror",0,0,0);
318
319
320G4ThreeVector SurfacePosition = G4ThreeVector(0*m,0*m,1.5*m) ;
321
322// Rotate reflecting surface by 45. degrees around the OX axis.
323
324G4RotationMatrix *Surfrot = new G4RotationMatrix(G4ThreeVector(1.0,0.0,0.0),-pi/4.);
325
326G4VPhysicalVolume *physMirror ;
327physMirror = new G4PVPlacement(Surfrot,SurfacePosition,"MirrorPV",logMirror,World_phys,false,0);
328
329G4VisAttributes* SurfaceVisAtt = new G4VisAttributes(G4Colour(0.0,0.0,1.0));
330SurfaceVisAtt->SetVisibility(true);
331SurfaceVisAtt->SetForceWireframe(true);
332logMirror->SetVisAttributes(SurfaceVisAtt);
333
334
335//////////////////////////////////////////////////////////////////////////////////////////
336// Optical properties of the interface between the Air and Reflective Surface
337// For Mirror, reflectivity is set at 95% and specular reflection is assumed.
338
339
340G4OpticalSurface *OpticalAirMirror = new G4OpticalSurface("AirMirrorSurface");
341OpticalAirMirror->SetModel(unified);
342OpticalAirMirror->SetType(dielectric_dielectric);
343OpticalAirMirror->SetFinish(polishedfrontpainted);
344
345const G4int NUM = 2;
346G4double XX[NUM] = { 0.1E-9*GeV, 10.0E-9*GeV };
347G4double ICEREFLECTIVITY[NUM] = { 0.95, 0.95 };
348
349G4MaterialPropertiesTable *AirMirrorMPT = new G4MaterialPropertiesTable();
350AirMirrorMPT->AddProperty("REFLECTIVITY", XX, ICEREFLECTIVITY,NUM);
351OpticalAirMirror->SetMaterialPropertiesTable(AirMirrorMPT);
352
353
354G4LogicalBorderSurface *AirMirror ;
355AirMirror = new G4LogicalBorderSurface("Air/Mirror Surface",World_phys,physMirror,OpticalAirMirror);
356
357 return physMirror ;
358
359}
360
361//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
362
363G4VPhysicalVolume* UltraDetectorConstruction::ConstructGround(G4VPhysicalVolume *World_phys){
364
365 G4double Ground_x = 40.0*cm;
366 G4double Ground_y = 40.0*cm;
367 G4double Ground_z = 1*cm;
368
369 G4Box * boxGround = new G4Box("Ground",Ground_x,Ground_y,Ground_z);
370
371 // Get Air pointer from static funcion - (G4Material::GetMaterial)
372
373G4String name;
374G4Material *Al = G4Material::GetMaterial(name = "Aluminum");
375G4LogicalVolume *logGround ;
376logGround = new G4LogicalVolume(boxGround,Al,"Ground",0,0,0);
377
378
379G4ThreeVector SurfacePosition = G4ThreeVector(0*m,0*m,1.5*m) ;
380
381// Rotate reflecting surface by 45. degrees around the OX axis.
382
383G4RotationMatrix *Surfrot = new G4RotationMatrix(G4ThreeVector(1.0,0.0,0.0),-pi/4.);
384
385G4VPhysicalVolume *physGround ;
386physGround = new G4PVPlacement(Surfrot,SurfacePosition,"GroundPV",logGround,World_phys,false,0);
387
388G4VisAttributes* SurfaceVisAtt = new G4VisAttributes(G4Colour(0.0,0.0,1.0));
389SurfaceVisAtt->SetVisibility(true);
390SurfaceVisAtt->SetForceWireframe(true);
391logGround->SetVisAttributes(SurfaceVisAtt);
392
393
394//////////////////////////////////////////////////////////////////////////////////////////
395// Optical properties of the interface between the Air and Reflective Surface
396// For Ground, reflectivity is set to 95% and diffusive reflection is assumed.
397
398
399G4OpticalSurface *OpticalAirGround = new G4OpticalSurface("AirGroundSurface");
400OpticalAirGround->SetModel(unified);
401OpticalAirGround->SetType(dielectric_dielectric);
402OpticalAirGround->SetFinish(groundfrontpainted);
403
404 const G4int NUM = 2;
405G4double XX[NUM] = { 0.1E-9*GeV, 10.0E-9*GeV };
406G4double ICEREFLECTIVITY[NUM] = { 0.95, 0.95 };
407
408G4MaterialPropertiesTable *AirGroundMPT = new G4MaterialPropertiesTable();
409AirGroundMPT->AddProperty("REFLECTIVITY", XX, ICEREFLECTIVITY,NUM);
410OpticalAirGround->SetMaterialPropertiesTable(AirGroundMPT);
411
412
413G4LogicalBorderSurface *AirGround ;
414AirGround = new G4LogicalBorderSurface("Air/Ground Surface",World_phys,physGround,OpticalAirGround);
415
416 return physGround ;
417
418}
419
420
421
422//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
423
424G4VPhysicalVolume* UltraDetectorConstruction::ConstructUVscope(G4VPhysicalVolume *World_phys){
425
426// ------------- Volumes --------------
427
428////////////////////////////////////////////////////////////////////////////////////////////////////////
429
430G4cout << "# #" << G4endl ;
431G4cout << "# Building the Telescope ... #" << G4endl ;
432G4cout << "# #" << G4endl ;
433
434/////////////////////////////////////////////////////////////
435// UVscope housing is a cylinder made of 1 mm thick aluminum
436/////////////////////////////////////////////////////////////
437
438G4double UVscopeHeight = 1030.0*mm ;
439G4double UVscopeDiameter = 518.0*mm ;
440G4double UVscopeThickness = 1.0*mm ;
441G4double UVscopeBaffle = 514.0*mm ;
442
443G4double UVscopeInnerRadius = UVscopeDiameter/2.0-UVscopeThickness ;
444G4double UVscopeOuterRadius = UVscopeDiameter/2.0 ;
445
446G4ThreeVector UVscopePosition = G4ThreeVector(0.0*m,0.0*m,-1.0*m) ;
447G4String name;
448G4Material* Al = G4Material::GetMaterial(name = "Aluminum");
449
450
451G4Tubs *solidUVscope =
452 new G4Tubs("UVscopeSolid",UVscopeInnerRadius,UVscopeOuterRadius,UVscopeHeight/2.0,0.0,twopi) ;
453G4LogicalVolume *logicUVscope =
454 new G4LogicalVolume(solidUVscope,Al,"UVscopeLV",0,0,0);
455G4VPhysicalVolume *physicalUVscope =
456 new G4PVPlacement(0,UVscopePosition,"UVSCopePV",logicUVscope,World_phys,false,0);
457
458
459//////////////////////////////////////
460// Back cover of the UVscope cylinder
461//////////////////////////////////////
462
463G4Tubs *solidUVscopeBack =
464 new G4Tubs("UVscopeBackSolid",0.0,UVscopeOuterRadius,UVscopeThickness/2.0,0.0,twopi) ;
465
466G4LogicalVolume *logicUVscopeBack =
467 new G4LogicalVolume(solidUVscopeBack,Al,"UVscopeBackLV",0,0,0);
468
469G4ThreeVector UVscopeBackPosition ;
470UVscopeBackPosition = UVscopePosition+G4ThreeVector(0.0*mm,0.0*mm,-(UVscopeHeight/2.0+UVscopeThickness/2.0)) ;
471G4VPhysicalVolume *physicalUVscopeBack =
472 new G4PVPlacement(0,UVscopeBackPosition,"UVscopeBack",logicUVscopeBack,World_phys,false,0);
473
474
475
476////////////////////////////////////////////////////////////////////////////////////////////////////////
477
478 G4cout << "# #" << G4endl ;
479 G4cout << "# Building the Fresnel lens ... #" << G4endl ;
480 G4cout << "# #" << G4endl ;
481
482G4double LensDiameter = 457*mm ; // Size of the optical active area of the lens.
483G4int LensNumOfGrooves = 13 ;
484//G4int LensNumOfGrooves = 129 ;
485//G4int LensNumOfGrooves = 1287 ;
486
487G4double LensBorderThickness = 2.8*mm ; // Thickness of the border area.
488G4double LensFocalLength = 441.973*mm ; // This parameter depends on the lens geometry, etc !!
489G4Material *LensMaterial = G4Material::GetMaterial(name = "Acrylic") ;
490G4ThreeVector LensPosition = UVscopePosition+G4ThreeVector(0.0*mm,0.0*mm,UVscopeHeight/2.0-UVscopeBaffle) ;
491
492
493UltraFresnelLens *FresnelLens = new UltraFresnelLens(LensDiameter,LensNumOfGrooves,LensMaterial,World_phys,LensPosition) ;
494
495
496///////////////////////////////////
497// Lens supporting ring (aluminum)
498///////////////////////////////////
499
500G4Tubs *solidLensFrame = new G4Tubs("LensFrame",LensDiameter/2.0,UVscopeInnerRadius,LensBorderThickness/2.0,0.0,twopi) ;
501G4LogicalVolume *logicLensFrame = new G4LogicalVolume(solidLensFrame,Al,"LensFrameLV",0,0,0);
502
503G4ThreeVector LensFramePosition ;
504LensFramePosition = LensPosition+G4ThreeVector(0.0*mm,0.0*mm,-((FresnelLens->GetThickness())/2.0+solidLensFrame->GetDz())) ;
505
506G4VPhysicalVolume *physicalLensFrame =
507 new G4PVPlacement(0,LensFramePosition,"LensFramePV",logicLensFrame,World_phys,false,0);
508
509////////////////////////////////////////////////////////////////////////////////////////////////////////
510
511
512 G4cout << "# #" << G4endl ;
513 G4cout << "# Building the photomultiplier ... #" << G4endl ;
514 G4cout << "# #" << G4endl ;
515
516
517// Photomultiplier window is a spherical section made of quartz
518
519G4double PMT_thick = 1.0*mm ; // Thickness of PMT window
520G4double PMT_curv = 65.5*mm ; // Radius of curvature of PMT window
521G4double StartTheta = (180.0-31.2)*pi/180. ;
522G4double EndTheta = 31.2*pi/180. ;
523
524G4Sphere *solidPMT ;
525solidPMT = new G4Sphere("PMT_solid",PMT_curv-PMT_thick,PMT_curv,0.0,twopi,StartTheta,EndTheta);
526
527G4Material* Quartz = G4Material::GetMaterial(name = "Quartz");
528G4LogicalVolume * logicalPMT ;
529logicalPMT = new G4LogicalVolume(solidPMT,Quartz,"PMT_log",0,0,0);
530
531
532// Place PMT is at Lens Focus
533
534G4ThreeVector PMTpos = LensPosition + G4ThreeVector(0.0*cm,0.0*cm,-(LensFocalLength+PMT_curv)) ;
535
536// Rotate PMT window through the axis OX by an angle = 180. degrees
537
538G4RotationMatrix *PMTrot = new G4RotationMatrix(G4ThreeVector(1.0,0.0,0.0),pi);
539G4VPhysicalVolume *physPMT ;
540physPMT = new G4PVPlacement(PMTrot,PMTpos,"PMT1",logicalPMT,World_phys,false,0);
541
542 if(!PMTSD)
543 {
544 PMTSD = new UltraPMTSD("PMTSD");
545 SDmanager->AddNewDetector( PMTSD );
546 }
547
548 if (logicalPMT){logicalPMT->SetSensitiveDetector(PMTSD);}
549
550G4VisAttributes* PMTVisAtt = new G4VisAttributes(true,G4Colour(0.0,0.0,1.0)) ;
551logicalPMT->SetVisAttributes(PMTVisAtt);
552
553//////////////////////////////////////////////////////////////////////////////////////////
554// Optical properties of the interface between the Air and the walls of the
555// UVscope cylinder (5% reflectivity)
556
557
558 G4cout << "# Defining interface's optical properties ... #" << G4endl ;
559 G4cout << "# #" << G4endl ;
560
561
562G4OpticalSurface *OpticalAirPaint = new G4OpticalSurface("AirPaintSurface");
563OpticalAirPaint->SetModel(unified);
564OpticalAirPaint->SetType(dielectric_dielectric);
565OpticalAirPaint->SetFinish(groundfrontpainted);
566
567const G4int NUM = 2;
568G4double XX[NUM] = { 2.030E-9*GeV, 4.144E-9*GeV };
569G4double BLACKPAINTREFLECTIVITY[NUM] = { 0.05, 0.05 };
570//G4double WHITEPAINTREFLECTIVITY[NUM] = { 0.99, 0.99 };
571
572G4MaterialPropertiesTable *AirPaintMPT = new G4MaterialPropertiesTable();
573AirPaintMPT->AddProperty("REFLECTIVITY", XX, BLACKPAINTREFLECTIVITY,NUM);
574OpticalAirPaint->SetMaterialPropertiesTable(AirPaintMPT);
575
576//OpticalAirPaint->DumpInfo();
577
578G4LogicalBorderSurface *AirCylinder ;
579AirCylinder = new G4LogicalBorderSurface("Air/UVscope Cylinder Surface",World_phys,physicalUVscope,OpticalAirPaint);
580
581G4LogicalBorderSurface *AirLensFrame ;
582AirLensFrame = new G4LogicalBorderSurface("Air/LensFrame Surface",World_phys,physicalLensFrame,OpticalAirPaint);
583
584G4LogicalBorderSurface *AirBackCover ;
585AirBackCover = new G4LogicalBorderSurface("Air/UVscope Back Cover Surface",World_phys,physicalUVscopeBack,OpticalAirPaint);
586
587
588/////////////////////////////////////////////////////////////////////////////////////
589
590
591 G4VisAttributes* LensVisAtt = new G4VisAttributes(G4Colour(1.0,0.0,0.0)) ; // Red
592 LensVisAtt ->SetVisibility(true);
593
594
595 if (FresnelLens){
596 FresnelLens->GetPhysicalVolume()->GetLogicalVolume()->SetVisAttributes(LensVisAtt);
597 }
598
599 G4VisAttributes* UVscopeVisAtt = new G4VisAttributes(G4Colour(0.5,0.5,0.5)) ; // Gray
600 UVscopeVisAtt ->SetVisibility(true);
601
602 physicalUVscope ->GetLogicalVolume()->SetVisAttributes(UVscopeVisAtt);
603 physicalUVscopeBack ->GetLogicalVolume()->SetVisAttributes(UVscopeVisAtt);
604 physicalLensFrame ->GetLogicalVolume()->SetVisAttributes(UVscopeVisAtt);
605
606/////////////////////////////////////////////////////////////////////////////////////
607
608 G4cout << "# #" << G4endl ;
609 G4cout << "# UVscope is built ! ... #" << G4endl ;
610 G4cout << "# #" << G4endl ;
611
612 return physicalUVscope;
613}
614
615
616//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
617
618
619
Note: See TracBrowser for help on using the repository browser.