source: trunk/source/geometry/solids/test/OpticalEscape/src/AXPETDetectorConstruction.cc @ 1347

Last change on this file since 1347 was 1347, checked in by garnier, 13 years ago

geant4 tag 9.4

File size: 26.0 KB
Line 
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// $Id: AXPETDetectorConstruction.cc,v 1.2 2010/11/16 13:35:53 tnikitin Exp $
27// ------------------------------------------------------------
28// Geant4 class implementation file
29//
30// 03/09/2008, by T.Nikitina
31// ------------------------------------------------------------
32
33#include "AXPETDetectorConstruction.hh"
34#include "AXPETDetectorMessenger.hh"
35
36//Solids
37#include "G4Box.hh"
38#include "G4Tubs.hh"
39#include "G4Sphere.hh"
40#include "G4Orb.hh"
41#include "G4Cons.hh"
42#include "G4Hype.hh"
43#include "G4Para.hh"
44#include "G4Paraboloid.hh"
45#include "G4Torus.hh"
46#include "G4Trd.hh"
47#include "G4Ellipsoid.hh"
48#include "G4EllipticalTube.hh"
49#include "G4EllipticalCone.hh"
50
51#include "G4Trap.hh"
52#include "G4Trd.hh"
53#include "G4Tet.hh"
54#include "G4GenericTrap.hh"
55#include "G4TessellatedSolid.hh"
56#include "G4ExtrudedSolid.hh"
57
58#include "G4Polycone.hh"
59#include "G4Polyhedra.hh"
60
61#include "G4TwistedTubs.hh"
62#include "G4TwistedBox.hh"
63#include "G4TwistedTrd.hh"
64#include "G4TwistedTrap.hh"
65
66#include "G4TwoVector.hh"
67#include "G4TriangularFacet.hh"
68#include "G4QuadrangularFacet.hh"
69
70#include "G4BooleanSolid.hh"
71#include "G4DisplacedSolid.hh"
72#include "G4UnionSolid.hh"
73#include "G4IntersectionSolid.hh"
74#include "G4SubtractionSolid.hh"
75#include "G4ReflectedSolid.hh"
76#include "G4RotationMatrix.hh"
77#include "G4BREPSolidBox.hh"
78//
79#include "G4LogicalVolume.hh"
80#include "G4PVPlacement.hh"
81#include "G4PVReplica.hh"
82#include "G4ThreeVector.hh"
83#include "G4RotationMatrix.hh"
84
85#include "G4RunManager.hh"
86#include "G4GeometryManager.hh"
87#include "G4PhysicalVolumeStore.hh"
88#include "G4LogicalVolumeStore.hh"
89#include "G4SolidStore.hh"
90
91#include "G4MaterialPropertiesTable.hh"
92#include "G4OpticalSurface.hh"
93#include "G4LogicalSkinSurface.hh"
94#include "G4LogicalBorderSurface.hh"
95#include "AXPETMaterial.hh"
96
97#include "G4VisAttributes.hh"
98#include "G4Colour.hh"
99
100#include "globals.hh"
101
102AXPETDetectorConstruction::AXPETDetectorConstruction():
103WorldVolume(0),LogWorldVolume(0),PhysWorldVolume(0), 
104                                                      LYSOVolume(0),LogLYSOVolume(0), PhysLYSOVolume(0)//,
105  //InterVolume(0),LogInterVolume(0), PhysInterVolume(0),
106  //DetecVolume(0),LogDetecVolume(0), PhysDetecVolume(0)
107{
108 pttoMaterial = new AXPETMaterial();
109
110 worldXsize  = 20. *cm;
111 worldYsize  = 20. *cm;
112 worldZsize  = 20. *cm;
113
114 lysoIz   =  2.0 *mm;
115 lysoDz   =  0.1 *mm;
116 lysoR    =  6.0 *mm;
117
118 detectorMessenger = new AXPETDetectorMessenger(this);
119 fval="Tubs";
120
121 xRot=0.0;
122 yRot=0.0;
123 zRot=0.0;
124 fAbort=0;
125}
126
127AXPETDetectorConstruction::~AXPETDetectorConstruction()
128{    delete detectorMessenger;     }
129
130
131
132void AXPETDetectorConstruction::SwitchDetector()
133{
134   
135   G4RunManager::GetRunManager()->DefineWorldVolume(PhysWorldVolume);
136 
137}
138G4VSolid*
139AXPETDetectorConstruction::SelectDetector( const G4String& val )
140{
141
142  G4Box* b1 = new G4Box ( "b1", 1*mm, 0.5*mm, 0.50*mm );
143  G4Box* b2 = new G4Box ( "b2", 0.5*mm, 1*mm, 0.5*mm );
144
145  fval = val ;
146  G4double fTrackerR1,fTrackerR2,fPhi,fPhiSegment,fTheta,fThetaSegment ; 
147  G4double fSemiAxisX,fSemiAxisY,fSemiAxisZ  ;
148  G4double fTrackerR,fTrackerpDx1,fTrackerpDy1,fTrackerpDz;
149  if (val == "Sphere")
150  {
151    // only solid sphere is supportet for now
152      fTrackerR1 = 0*mm ;
153      fTrackerR2 = (lysoR-0.01*mm)/2. ;
154      fPhi = 0*deg ;
155      fPhiSegment = 360*deg ;
156      fTheta = 0*deg ;
157      fThetaSegment = 180*deg ;
158      aVolume = new G4Sphere ("aSphere",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
159  }
160
161  else if (val == "HalfSphere")
162  {
163    // only solid sphere is supportet for now
164      fTrackerR1 = 0. ;
165      fTrackerR2 = (lysoR-0.01*mm)/2. ;
166      fPhi = 0*deg ;
167      fPhiSegment = 180*deg ;
168      fTheta = 0*deg ;
169      fThetaSegment = 180*deg ;
170      aVolume = new G4Sphere ("aHalfSphere",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
171
172  }
173  else if (val == "HollowSphere")
174  {
175    // only solid sphere is supportet for now
176      fTrackerR1 = (lysoR-0.01*mm)/4.;
177      fTrackerR2 = (lysoR-0.01*mm)/2. ;
178      fPhi = 0*deg ;
179      fPhiSegment = 360*deg ;
180      fTheta = 0*deg ;
181      fThetaSegment = 180*deg ;
182      aVolume = new G4Sphere ("aHollowSphere",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
183
184  }
185  else if (val == "HalfHollowSphere")
186  {
187    // only solid sphere is supportet for now
188      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
189      fTrackerR2 =(lysoR-0.01*mm)/2. ;
190      fPhi = 0*deg ;
191      fPhiSegment = 180*deg ;
192      fTheta = 0*deg ;
193      fThetaSegment = 180*deg ;
194      aVolume = new G4Sphere ("aHalfHollowSphere",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
195
196  }
197  else if (val == "Q1Shell")
198  {
199    // only solid sphere is supportet for now
200      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
201      fTrackerR2 =(lysoR-0.01*mm)/2. ;
202      fPhi = 0*deg ;
203      fPhiSegment = 90*deg ;
204      fTheta = 0*deg ;
205      fThetaSegment = 90*deg ;
206      aVolume = new G4Sphere ("aQ1Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
207
208  }
209  else if (val == "Q2Shell")
210  {
211    // only solid sphere is supportet for now
212      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
213      fTrackerR2 =(lysoR-0.01*mm)/2. ;
214      fPhi = 90*deg ;
215      fPhiSegment = 90*deg ;
216      fTheta = 0*deg ;
217      fThetaSegment = 90*deg ;
218      aVolume = new G4Sphere ("aQ2Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
219
220  } 
221  else if (val == "Q3Shell")
222  {
223    // only solid sphere is supportet for now
224      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
225      fTrackerR2 =(lysoR-0.01*mm)/2. ;
226      fPhi = 180*deg ;
227      fPhiSegment = 90*deg ;
228      fTheta = 0*deg ;
229      fThetaSegment = 90*deg ;
230      aVolume = new G4Sphere ("aQ3Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
231
232  }
233  else if (val == "Q4Shell")
234  {
235    // only solid sphere is supportet for now
236      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
237      fTrackerR2 =(lysoR-0.01*mm)/2. ;
238      fPhi = 270*deg ;
239      fPhiSegment = 90*deg ;
240      fTheta = 0*deg ;
241      fThetaSegment = 90*deg ;
242      aVolume = new G4Sphere ("aQ4Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
243
244  }
245  else if (val == "Q5Shell")
246  {
247    // only solid sphere is supportet for now
248       fTrackerR1 =(lysoR-0.01*mm)/4.  ;
249      fTrackerR2 =(lysoR-0.01*mm)/2. ;
250      fPhi = 0*deg ;
251      fPhiSegment = 90*deg ;
252      fTheta = 90*deg ;
253      fThetaSegment = 90*deg ;
254      aVolume = new G4Sphere ("aQ5Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
255
256  }
257else if (val == "Q6Shell")
258  {
259    // only solid sphere is supportet for now
260      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
261      fTrackerR2 =(lysoR-0.01*mm)/2. ;
262      fPhi = 90*deg ;
263      fPhiSegment = 90*deg ;
264      fTheta = 90*deg ;
265      fThetaSegment = 90*deg ;
266      aVolume = new G4Sphere ("aQ5Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
267
268  } 
269  else if (val == "Q7Shell")
270  {
271    // only solid sphere is supportet for now
272       fTrackerR1 =(lysoR-0.01*mm)/4.  ;
273      fTrackerR2 =(lysoR-0.01*mm)/2. ;
274      fPhi = 180*deg ;
275      fPhiSegment = 90*deg ;
276      fTheta = 90*deg ;
277      fThetaSegment = 90*deg ;
278      aVolume = new G4Sphere ("aQ7Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
279
280  }
281  else if (val == "Q8Shell")
282  {
283    // only solid sphere is supportet for now
284      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
285      fTrackerR2 =(lysoR-0.01*mm)/2. ;
286      fPhi = 270*deg ;
287      fPhiSegment = 90*deg ;
288      fTheta = 90*deg ;
289      fThetaSegment = 90*deg ;
290      aVolume = new G4Sphere ("aQ8Shell",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
291
292  }
293
294
295  else if (val == "Shell")
296  {
297   
298 // Test for Problem Report with Optical Photons and Sphere or Ellipsoid
299     G4Sphere *newSOut = new G4Sphere("Crystal",0.,lysoR-0.01/mm,0,twopi,0,pi/2);
300     G4Sphere *newSIn = new G4Sphere("Crystal",0.,lysoR-4.01/mm,0,twopi,0,twopi);
301
302     // Box was added in user application in order to avoid problem with Sphere with theta=90 deg
303     // Not need anymore, this bug in Sphere was repared in 4.9.2. 
304     // G4Box* farMirrorBox2 = new G4Box("nearMirrorBox", lysoR-0.01/mm,
305     // lysoR-0.01/mm,  lysoR-0.01/mm);
306     // aVolume = new G4IntersectionSolid("GlassMirror", farMirrorBox2,shell,0,G4ThreeVector(0,0,-lysoR));
307   aVolume = new G4SubtractionSolid("OutsideminInside", newSOut, newSIn);     
308
309  }
310  else if (val == "Ring")
311  {
312    // only solid sphere is supportet for now
313      fTrackerR1 =(lysoR-0.01*mm)/4.  ;
314      fTrackerR2 =(lysoR-0.01*mm)/2. ;
315      fPhi = 30*deg ;
316      fPhiSegment = 120*deg ;
317      fTheta = 10*deg ;
318      fThetaSegment = 40*deg ;
319      aVolume = new G4Sphere ("aRing",  fTrackerR1, fTrackerR2 ,fPhi, fPhiSegment, fTheta, fThetaSegment);
320
321  }
322  else if ( val == "Ellipsoid" ) {
323
324    fSemiAxisX = (lysoR-0.01*mm)/4. ;
325    fSemiAxisY = (lysoR-0.01*mm)/2. ;
326    fSemiAxisZ = (lysoR-0.01*mm)/2. ;
327
328    aVolume = new  G4Ellipsoid("aEllipsoid",
329                               fSemiAxisX,
330                               fSemiAxisY,
331                               fSemiAxisZ,
332                               -fSemiAxisX,fSemiAxisX);
333
334
335  }
336  else if (val == "Orb")
337  {
338
339    fTrackerR = (lysoR-0.01*mm)/2. ;
340    aVolume = new G4Orb ( "aOrb", fTrackerR );
341
342  }
343  else if (val == "Box") 
344  {         
345
346    fTrackerpDx1 = (lysoR-0.01*mm)/2. ;
347    fTrackerpDy1 = (lysoR-0.01*mm)/2. ;
348    fTrackerpDz  = (lysoR-0.01*mm)/2. ;
349
350    aVolume = new G4Box ( "aBox", fTrackerpDx1, fTrackerpDy1, fTrackerpDz );
351  }
352  else if (val == "Cons")
353  {       
354
355    fTrackerpDz =(lysoR-0.01*mm)/2.  ;
356    fTrackerR1 =(lysoR-0.01*mm)/4.  ;
357    fTrackerR2 =(lysoR-0.01*mm)/2.  ;
358
359    aVolume = new G4Cons ( "aCons", 0.8*fTrackerR1 , fTrackerR1, 0.8*fTrackerR2, fTrackerR2, fTrackerpDz, 10*deg, 220.*deg  ); 
360
361  }
362  else if (val == "manyCons")
363  {       
364    aVolume = new G4Cons ( "aCone", 2*mm, 3*mm, 2*mm, 4*mm,
365                           3.*mm, 10*deg, 300*deg ); 
366  //  10*cm, 10*deg, 300*deg );
367                           //  0., pi);
368
369 
370  }
371  else if (val == "Tubs")
372  {
373
374    // only solid Tube is supported.
375 
376    aVolume = new G4Tubs ( "aTube",0.1,5.9*mm,3.*mm,0.,180*deg) ;
377
378  }
379  else if (val == "Hype")
380  {
381    aVolume = new G4Hype ("aHype", 0.7, 1, 40*deg, 40*deg, 4. );
382  }
383  else if (val == "Torus")
384  {
385
386    fPhi = 40*deg ;
387    fPhiSegment = 200*deg ;
388
389    fTrackerR1 = 1.*mm ;
390    fTrackerR2 = 2.*mm ;
391    fTrackerR  = (lysoR-0.01*mm) ;
392
393    aVolume = new G4Torus("aTorus", fTrackerR1, fTrackerR2 ,fTrackerR, fPhi, fPhiSegment) ;
394
395  }
396  else if (val == "Para")
397  {
398    aVolume = new G4Para ("aPara", 0.8, 1.0, 1.2, 30*deg, 45*deg, 60*deg);
399  }
400  else if (val == "Paraboloid")
401  {
402    aVolume = new G4Paraboloid ("aParaboloid", 1., 0.5, 1.2);
403  }
404  else if (val == "PolyconeGen")
405  {
406    G4double rr[]={1,1.20,1.40,1.20};
407    G4double zz[]={-1,-1,1,1};
408    aVolume = new G4Polycone ("aPolycone",0*deg,90*deg, 4, rr,zz);
409 }
410 else if (val == "PolyconeGenComplex")
411   { //has to be apdated
412    G4double        zPlanes[]       =       {-11640.*mm,    -11640.*mm,     -11570.722*mm,  -9766.005*mm, 
413                                                -4487.828*mm,   4487.828*mm,    9766.005*mm,    11570.722*mm, 
414                                                11640.*mm,      11640.*mm,      11580.*mm,      9750.*mm,
415                                            4500.*mm,       -4500.*mm,      -9750.*mm,      -11580.*mm,
416                                             -11640.*mm};
417 
418        G4double        radius[]        =       {250.*mm,       305.*mm,        305.*mm,        2770.461*mm,
419                                                4932.*mm,       4932.*mm,       2770.461*mm,    305.*mm,
420                                                305.*mm,        250.*mm,        250.*mm,        2750.*mm,
421                                                 4900.*mm,       4900.*mm,       2750.*mm,       250.*mm,
422                                                   250.*mm};
423         aVolume = new G4Polycone ("aPolycone",0*deg,360*deg, 16, radius,zPlanes);
424    G4VSolid*       SolidPumpPort   =       new     G4Tubs("PumpPort temp tube", 0 * mm, 1750 / 2 * mm, (11161 - 4500) / 2 * mm-1*mm, 0, 360 * deg);
425           for (int i=0;i<2;i++)
426        {
427               G4RotationMatrix*       Rot     =       new G4RotationMatrix();
428               Rot->rotateZ(45*(-i-1) * deg );
429                G4double        X       =       std::cos(45*(i+1)*deg)*-(3050+4750)/2*mm;
430                G4double        Y       =       std::sin(45*(i+1)*deg)*-(3050+4750)/2*mm;
431                aVolume        =       new G4SubtractionSolid("Main Spectrometer", aVolume, SolidPumpPort,
432            Rot, G4ThreeVector(X, Y,(11161+4500)/2*mm - 100 * mm));
433         }
434
435
436
437 }
438  else if (val == "Polycone")
439  {
440    G4double rIn[]={1.00,1.20,0,0,1.20,1.20};
441    G4double rOut[]={1.20,1.40,1.40,1.20,1.40,1.60};
442    G4double zPlane[]={-2.00,-1.00,0,1.00,2.00,3.00};
443    aVolume = new G4Polycone ("aPolycone",0*deg,260*deg, 6,zPlane, rIn,rOut);
444  }
445 else if (val == "PolyhedraGen")
446  {
447    G4double rr[]={1.00,1.20,1.40,1.20};
448    G4double zz[]={-1.00,-1.00,1.00,1.00};
449    aVolume = new G4Polyhedra ("aPolycone",0*deg,90*deg,8, 4, rr,zz);
450  }
451 else if (val == "PolyhedraGenComplex")
452  {
453    G4double rr[]={ 1.00, 1.20,   0,  0,1.40,1.20,1.50,1.50,1.50,1.40, 1.30};
454    G4double zz[]={-1.50,-1.00,-1.00,-0.50,  0,2.00,2.00,1.00,0,  -0.50,-1.00};
455    aVolume = new G4Polyhedra ("aPolycone",0*deg,260*deg,8, 11, rr,zz);
456  }
457 else if (val == "Polyhedra")
458  {
459    G4double rOut[5]={2.100,0.600,1.500,1.500,3.800};
460    G4double rIn[5]={0,0.500,0,0.700,0.100};
461    G4double zPlane[5]={-0.100,1.000,1.500,2.500,3.000};
462    aVolume = new G4Polyhedra ("aPolycone",0*deg,260*deg,6, 5,zPlane, rIn,rOut);
463  }
464 
465  else if (val == "Trd")
466  {
467    aVolume = new G4Trd ("aTrd", 0.80, 1.00, 0.70,0.90, 1.00);
468  }
469  else if (val == "b1Ub2") 
470  {         
471    aVolume = new G4UnionSolid("b1Ub2",b1,b2);
472 
473  }
474  else if (val == "b1Ib2") 
475  {         
476    aVolume = new G4IntersectionSolid("b1Ib2",b1,b2);
477  }
478  else if (val == "b1Sb2") 
479  {         
480    aVolume = new G4SubtractionSolid("b1Sb2",b1,b2);
481  }
482  else if (val == "b1Ib1") 
483  {         
484    aVolume = new G4IntersectionSolid("b1Ib1",b1,b1);
485  }
486  else if (val == "b1Ub1") 
487  {         
488    aVolume = new G4UnionSolid("b1Ub1",b1,b1);
489  }
490  else if (val == "b1Sb1") 
491  {         
492    aVolume = new G4SubtractionSolid("b1Sb1",b1,b1);
493  }
494
495  else if ( val == "Tet" ) 
496  {
497    G4ThreeVector anchor = G4ThreeVector(  0,    0, 0);
498    G4ThreeVector     p2 = G4ThreeVector(1.0,  0.5, 0);
499    G4ThreeVector     p3 = G4ThreeVector(0.5,  1.0, 0);
500    G4ThreeVector     p4 = G4ThreeVector(0.5,  0.5, 1.0);
501   
502    aVolume = new G4Tet("aTet",anchor,p2,p3,p4);
503  }
504  else if ( val == "Trap") 
505  {
506      fTrackerpDz = 0.80;
507    fTheta = 10*deg ;
508    fPhi  =  40*deg ;
509    fTrackerpDy1 = 1.6 ;
510    fTrackerpDx1 = 2.4 ;
511    G4double fTrackerpDx2 = 1.4 ;
512    G4double fTrackerpDy2 = 0.8 ;
513    G4double fTrackerpDx3 = 1.6 ;
514    G4double fTrackerpDx4 = 1.1 ;
515    G4double fAlph = 50*deg    ;
516
517    aVolume = new G4Trap("aTrap",
518                                fTrackerpDz,         // half z length
519                                fTheta,              // direction between end planes
520                                fPhi,                // defined by polar and azimutal angles.
521                                fTrackerpDy1,        // half y length at -pDz
522                                fTrackerpDx1,        // half x length at -pDz,-pDy
523                                fTrackerpDx2,        // half x length at -pDz,+pDy
524                                fAlph,                // tilt angle at +pDz
525                                fTrackerpDy2,        // half y length at +pDz
526                                fTrackerpDx3,        // half x length at +pDz,-pDy
527                                fTrackerpDx4,        // half x length at +pDz,+pDy
528                                fAlph                // tilt angle at +pDz
529                                ) ;
530   
531 
532  }
533  else if ( val == "EllipticalCone" ) 
534  {
535    aVolume = new G4EllipticalCone("aEllipticalCone",
536                        0.5,       // xSemiAxis
537                        1,       // ySemiAxis
538                        4.0,      // zheight
539                        2.5) ;    // zTopCut
540
541  }
542  else if ( val == "EllipticalTube" ) 
543  {
544    aVolume = new G4EllipticalTube("aEllipticalTube" ,
545                                   2,   // xSemiAxis
546                                   4,   // ySemiAxis
547                                   3.5) ;  // zheight
548
549  }
550
551 else if (val == "TwistedBox")
552  {
553    aVolume = new G4TwistedBox("aTwistedBox",40*deg,0.5,1.0,1.5);
554  }
555  else if (val == "TwistedTrd")
556  { 
557    aVolume = new G4TwistedTrd("aTwistedTrd",0.5,1.0,0.8,1.5,1.8,20*deg);
558  }
559  else if (val == "TwistedTrap")
560  {
561    aVolume = new G4TwistedTrap("aTwistedTrap",40*deg,0.5,1.0,0.8,1.5);
562  }
563  else if ( val == "TwistedTrap2") 
564  {
565    aVolume = new G4TwistedTrap("aTwistedTrap2",
566                                   20*deg,    // twist angle
567                                   0.80,         // half z length
568                                   10*deg,      // direction between end planes
569                                   40*deg,        // defined by polar and azimutal angles.
570                                   0.8,        // half y length at -pDz
571                                   1.1,        // half x length at -pDz,-pDy
572                                   1.6,        // half x length at -pDz,+pDy
573                                   0.8,        // half y length at +pDz
574                                   1.1,         // half x length at +pDz,-pDy
575                                   1.6,        // half x length at +pDz,+pDy
576                                   -50*deg        // tilt angle at +pDz
577                                   ) ;
578  }
579  else if ( val == "TwistedTubs")
580  {
581    aVolume = new G4TwistedTubs("aTwistedTubs",10.*deg,1.0,2.,4.,171.*deg);
582
583  }
584 else if (val == "GenericTrap" ){
585   std::vector<G4TwoVector> vertices;
586   vertices.push_back(G4TwoVector( -4.5, -4.5));
587   vertices.push_back(G4TwoVector( -4.5,  4.5));
588   vertices.push_back(G4TwoVector(  4.5,  4.5));
589   vertices.push_back(G4TwoVector(  4.5, -4.5));
590   vertices.push_back(G4TwoVector( -3.5, -3.5));
591   vertices.push_back(G4TwoVector( -3.5,  3.5));
592   vertices.push_back(G4TwoVector(  3.5,  3.5));
593   vertices.push_back(G4TwoVector(  3.5, -2.5));     
594   aVolume = new G4GenericTrap("aGenTrd",4.,vertices);
595  }
596else if(val == "TessellatedSolid")
597  { 
598    G4double targetSize = 2.;
599    G4TessellatedSolid* aVolume1 = new G4TessellatedSolid("aTessellatedSolid");
600    G4TriangularFacet *facet1 = new
601    G4TriangularFacet (G4ThreeVector(-targetSize,-targetSize,        0.0),
602                     G4ThreeVector(+targetSize,-targetSize,        0.0),
603                     G4ThreeVector(        0.0,        0.0,+targetSize),
604                     ABSOLUTE);
605    G4TriangularFacet *facet2 = new
606    G4TriangularFacet (G4ThreeVector(+targetSize,-targetSize,        0.0),
607                     G4ThreeVector(+targetSize,+targetSize,        0.0),
608                     G4ThreeVector(        0.0,        0.0,+targetSize),
609                     ABSOLUTE);
610    G4TriangularFacet *facet3 = new
611    G4TriangularFacet (G4ThreeVector(+targetSize,+targetSize,        0.0),
612                     G4ThreeVector(-targetSize,+targetSize,        0.0),
613                     G4ThreeVector(        0.0,        0.0,+targetSize),
614                     ABSOLUTE);
615    G4TriangularFacet *facet4 = new
616    G4TriangularFacet (G4ThreeVector(-targetSize,+targetSize,        0.0),
617                     G4ThreeVector(-targetSize,-targetSize,        0.0),
618                     G4ThreeVector(        0.0,        0.0,+targetSize),
619                     ABSOLUTE);
620    G4QuadrangularFacet *facet5 = new
621    G4QuadrangularFacet (G4ThreeVector(-targetSize,-targetSize,        0.0),
622                     G4ThreeVector(-targetSize,+targetSize,        0.0),
623                     G4ThreeVector(+targetSize,+targetSize,        0.0),
624                     G4ThreeVector(+targetSize,-targetSize,        0.0),
625                     ABSOLUTE);
626
627    aVolume1->AddFacet((G4VFacet*) facet1);
628    aVolume1->AddFacet((G4VFacet*) facet2);
629    aVolume1->AddFacet((G4VFacet*) facet3);
630    aVolume1->AddFacet((G4VFacet*) facet4);
631    aVolume1->AddFacet((G4VFacet*) facet5);
632 
633    aVolume1->SetSolidClosed(true);
634
635    aVolume = aVolume1;
636
637  }
638  else if (val == "ExtrudedSolid")
639  {
640   std::vector<G4TwoVector> polygon;
641   polygon.push_back(G4TwoVector(-3., -3.0));
642   polygon.push_back(G4TwoVector(-3.,  3.0));
643   polygon.push_back(G4TwoVector( 3.,  3.0));
644   polygon.push_back(G4TwoVector( 3., -3.0));
645   polygon.push_back(G4TwoVector( 1.5, -3.0));
646   polygon.push_back(G4TwoVector( 1.5,  1.5));
647   polygon.push_back(G4TwoVector(-1.5,  1.5));
648   polygon.push_back(G4TwoVector(-1.5, -3.0));
649 
650   std::vector<G4ExtrudedSolid::ZSection> zsections;
651   zsections.push_back(G4ExtrudedSolid::ZSection(-4.0, G4TwoVector(-2.0, 1.0), 1.5));
652   zsections.push_back(G4ExtrudedSolid::ZSection( 1.0, G4TwoVector(  0,  0), 0.5));
653   zsections.push_back(G4ExtrudedSolid::ZSection( 1.5, G4TwoVector(  0,  0), 0.7));
654   zsections.push_back(G4ExtrudedSolid::ZSection( 4.0, G4TwoVector( 2.0, 2.0), 0.9));
655
656   aVolume = new G4ExtrudedSolid("aExtrudedSolid", polygon, zsections);
657  }
658
659
660  else
661    { G4cout <<"DetectorConstruction tried to select "<<val<<G4endl;
662    G4Exception("DetectorConstruction::SelectDetector() - Invalid shape!");
663  }
664
665  return aVolume;
666
667}
668G4VPhysicalVolume* AXPETDetectorConstruction::Construct()
669{
670 //***********************************************
671  // Clear all Stores
672  //***********************************************
673
674   G4GeometryManager::GetInstance()->OpenGeometry();
675   G4PhysicalVolumeStore::GetInstance()->Clean();
676   G4LogicalVolumeStore::GetInstance()->Clean();
677   G4SolidStore::GetInstance()->Clean();
678
679 pttoMaterial->DefineMaterials();
680 
681 air = pttoMaterial->GetMat("AIR");
682 lyso= pttoMaterial->GetMat("LYSO");
683 vacuum= pttoMaterial->GetMat("Galactic");
684
685
686  //***********************************************
687  // Defining the world volume
688  //***********************************************
689
690 WorldVolume = new G4Box("World",worldXsize,worldYsize,worldZsize);
691
692 LogWorldVolume = new G4LogicalVolume(WorldVolume, 
693                                           vacuum, 
694                                           "logicWorld", 
695                                            0,0,0);
696
697 PhysWorldVolume = new G4PVPlacement(0, G4ThreeVector(),
698                                         "physicalWorld", 
699                                          LogWorldVolume, 
700                                          0,false,0);
701
702
703  //***********************************************
704  // Defining the lyso-Solid volume
705  //***********************************************
706
707 
708 LYSOVolume=SelectDetector(fval);
709 LogLYSOVolume = new G4LogicalVolume(LYSOVolume, 
710                                        lyso, 
711                                        "logicLYSO", 
712                                         0,0,0);
713
714 G4RotationMatrix *mat=new G4RotationMatrix();
715 if(xRot!=0.)mat->rotateX(xRot*deg);
716 if(yRot!=0.)mat->rotateY(xRot*deg);
717 if(zRot!=0.)mat->rotateZ(xRot*deg);
718 // mat->rotateY(180.*deg);
719 // mat->rotateZ(10.*deg);
720 G4ThreeVector position=G4ThreeVector(1.0,1.0,1.0);
721
722 PhysLYSOVolume = new G4PVPlacement(mat,G4ThreeVector(0.0,0.0,0.0),
723                                        LogLYSOVolume,
724                                        "physicalLYSO", 
725                                      LogWorldVolume, 
726                                         0,false,0);
727                                         
728  G4cout << "The LYSO crystal is built as "<<fval << G4endl;
729
730
731
732
733  //************************************************************************
734  //Al coated surface properties
735  //************************************************************************
736
737  const G4int nEntries = 11;
738  const G4double refl = 0.85;
739 
740  G4double PhotonEnergy[nEntries] = {2.478*eV, 2.53*eV, 2.58*eV, 2.636*eV, 2.69*eV, 2.75*eV, 2.816*eV, 2.88*eV, 2.95*eV, 3.022*eV, 3.097*eV};
741
742  G4double Reflectivity[nEntries]   = {refl, refl,refl, refl, refl, refl, refl, refl, refl, refl, refl};
743  G4double Efficiency[nEntries]     = {0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0}; 
744  G4double specularlobe[nEntries]   = {0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0}; 
745  G4double specularspike[nEntries]  = {0.9, 0.9,0.9, 0.9,0.9, 0.9,0.9, 0.9,0.9, 0.9,0.9}; 
746  G4double backscatter[nEntries]    = {0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0}; 
747  G4double rindex[nEntries]         = {1.39, 1.39,1.39, 1.39,1.39,1.39,1.39, 1.39,1.39, 1.39,1.39}; 
748
749
750  G4OpticalSurface* alcoated_opsurf=  new G4OpticalSurface("alcoated_opsurf");
751   new G4LogicalBorderSurface("alcoated_surf",PhysLYSOVolume,PhysWorldVolume, alcoated_opsurf);
752 
753
754  G4MaterialPropertiesTable* alcoated_mt = new G4MaterialPropertiesTable();
755  alcoated_mt->AddProperty("RINDEX",  PhotonEnergy,rindex,  nEntries );
756  alcoated_mt->AddProperty("EFFICIENCY",  PhotonEnergy,Efficiency,  nEntries );
757  alcoated_mt->AddProperty("REFLECTIVITY",PhotonEnergy,Reflectivity,nEntries);
758  alcoated_mt->AddProperty("SPECULARLOBECONSTANT",PhotonEnergy,specularlobe,nEntries);
759  alcoated_mt->AddProperty("SPECULARSPIKECONSTANT",PhotonEnergy,specularspike,nEntries);
760  alcoated_mt->AddProperty("BACKSCATTERCONSTANT",PhotonEnergy,backscatter,nEntries);
761
762
763  alcoated_opsurf->SetType(dielectric_metal);
764  alcoated_opsurf->SetModel(unified);
765  alcoated_opsurf->SetFinish(groundbackpainted/*polished*/);
766 
767
768  alcoated_opsurf->SetMaterialPropertiesTable(alcoated_mt);
769
770
771  G4VisAttributes* WhiteVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0));//red
772  WhiteVisAtt->SetVisibility(true);
773  WhiteVisAtt->SetForceSolid(true);
774
775  G4VisAttributes* LysoVisAtt= new G4VisAttributes(G4Colour(0.0,0.0,1.0));//red
776  LysoVisAtt->SetVisibility(true);
777  LysoVisAtt->SetForceSolid(true);
778
779  G4VisAttributes* DeteVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,0.0));//yellow
780  DeteVisAtt->SetVisibility(true);
781  DeteVisAtt->SetForceSolid(true);
782 
783  LogLYSOVolume->SetVisAttributes(LysoVisAtt);
784  LogWorldVolume->SetVisAttributes(G4VisAttributes::GetInvisible());
785
786  return PhysWorldVolume;
787 
788 }
789
Note: See TracBrowser for help on using the repository browser.