source: trunk/examples/advanced/xray_fluorescence/src/XrayFluoDetectorConstruction.cc@ 1237

Last change on this file since 1237 was 1230, checked in by garnier, 16 years ago

update to geant4.9.3

File size: 22.5 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//
27// $Id: XrayFluoDetectorConstruction.cc
28// GEANT4 tag $Name: xray_fluo-V03-02-00
29//
30// Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it)
31//
32// History:
33// -----------
34// 28 Nov 2001 Elena Guardincerri Created
35// Nov 2002 Alfonso Mantero materials added,
36// Material selection implementation
37// 16 Jul 2003 Alfonso Mantero Detector type selection added + minor fixes
38// -------------------------------------------------------------------
39
40#include "XrayFluoDetectorConstruction.hh"
41#include "XrayFluoDetectorMessenger.hh"
42#include "XrayFluoSD.hh"
43#include "G4Material.hh"
44#include "G4ThreeVector.hh"
45#include "G4Box.hh"
46#include "G4Sphere.hh"
47#include "G4Tubs.hh"
48#include "G4LogicalVolume.hh"
49#include "G4PVPlacement.hh"
50#include "G4TransportationManager.hh"
51#include "G4SDManager.hh"
52#include "G4RunManager.hh"
53#include "G4VisAttributes.hh"
54#include "G4Colour.hh"
55#include "G4ios.hh"
56#include "G4PVReplica.hh"
57#include "G4UserLimits.hh"
58#include "XrayFluoNistMaterials.hh"
59
60
61//#include "G4Region.hh"
62//#include "G4RegionStore.hh"
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
65
66
67XrayFluoDetectorConstruction::XrayFluoDetectorConstruction()
68 : aNavigator(0), detectorType(0),sampleGranularity(false), phaseSpaceFlag(false),
69 DeviceSizeX(0), DeviceSizeY(0),DeviceThickness(0),
70 solidWorld(0),logicWorld(0),physiWorld(0),
71 solidHPGe(0),logicHPGe(0),physiHPGe(0),
72 solidSample (0),logicSample(0),physiSample (0),
73 solidDia1(0),logicDia1(0),physiDia1(0),
74 solidDia3(0),logicDia3(0),physiDia3(0),
75 solidOhmicPos(0),logicOhmicPos(0), physiOhmicPos(0),
76 solidOhmicNeg(0),logicOhmicNeg(0), physiOhmicNeg(0),
77 solidPixel(0),logicPixel(0), physiPixel(0),
78 OhmicPosMaterial(0), OhmicNegMaterial(0),
79 pixelMaterial(0),sampleMaterial(0),
80 Dia1Material(0),Dia3Material(0),
81 defaultMaterial(0),HPGeSD(0)
82
83{
84 materials = XrayFluoNistMaterials::GetInstance();
85
86 aNavigator = new G4Navigator();
87
88 DefineDefaultMaterials();
89
90 NbOfPixelRows = 1; // should be 1
91 NbOfPixelColumns = 1; // should be 1
92 NbOfPixels = NbOfPixelRows*NbOfPixelColumns;
93 PixelSizeXY = 7 * cm;// should be std::sqrt(40) * mm
94 PixelThickness = 3.5 * mm; //should be 3.5 mm
95
96 G4cout << "PixelThickness(mm): "<< PixelThickness/mm << G4endl;
97 G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/cm << G4endl;
98
99 ContactSizeXY = PixelSizeXY; //std::sqrt(40) * mm; //should be the same as PixelSizeXY
100 SampleThickness = 4 * mm;
101 SampleSizeXY = 3. * cm;
102 Dia1Thickness = 1. *mm;
103 Dia3Thickness = 1. *mm;
104 Dia1SizeXY = 3. *cm;
105 Dia3SizeXY = 3. *cm;
106
107
108 DiaInnerSize = 1.0 * mm; //(Hole in the detector's diaphragm)
109
110
111 OhmicNegThickness = 0.005*mm;// 0.005
112 OhmicPosThickness = 0.005*mm;// 0.005
113 ThetaHPGe = 135. * deg;
114 PhiHPGe = 225. * deg;
115
116 ThetaDia1 = 135. * deg;
117 PhiDia1 = 90. * deg;
118 AlphaDia1 = 225. * deg;
119
120 AlphaDia3 = 180. * deg;
121 Dia3Dist = 66.5 * mm;
122 Dia3InnerSize = 1. * mm;
123 ThetaDia3 = 180. * deg;
124 PhiDia3 = 90. * deg;
125
126 DistDia = 66.5 * mm;
127 DistDe =DistDia+ (Dia1Thickness
128 +PixelThickness)/2+OhmicPosThickness ;
129
130 grainDia = 1 * mm;
131 PixelCopyNb=0;
132 grainCopyNb=0;
133 G4String defaultDetectorType = "sili";
134 ComputeApparateParameters();
135
136 // G4String regName = "SampleRegion";
137 //sampleRegion = new G4Region(regName);
138
139 if (!phaseSpaceFlag) SetDetectorType(defaultDetectorType);
140
141 // create commands for interactive definition of the apparate
142
143 detectorMessenger = new XrayFluoDetectorMessenger(this);
144
145 G4cout << "XrayFluoDetectorConstruction created" << G4endl;
146}
147//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
148
149
150XrayFluoDetectorConstruction* XrayFluoDetectorConstruction::instance = 0;
151
152XrayFluoDetectorConstruction* XrayFluoDetectorConstruction::GetInstance()
153{
154 if (instance == 0)
155 {
156 instance = new XrayFluoDetectorConstruction;
157
158 }
159 return instance;
160}
161
162void XrayFluoDetectorConstruction::SetDetectorType(G4String type)
163{
164
165 if (type=="sili")
166 {
167 detectorType = XrayFluoSiLiDetectorType::GetInstance();
168 }
169 else if (type=="hpge")
170 {
171 detectorType = XrayFluoHPGeDetectorType::GetInstance();
172 }
173 else
174 {
175 G4String excep = type + "detector type unknown";
176 G4Exception(excep);
177 }
178}
179
180XrayFluoVDetectorType* XrayFluoDetectorConstruction::GetDetectorType()
181{
182 return detectorType;
183}
184
185//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
186
187XrayFluoDetectorConstruction::~XrayFluoDetectorConstruction()
188
189{
190 delete detectorMessenger;
191 delete detectorType;
192 G4cout << "XrayFluoDetectorConstruction deleted" << G4endl;
193}
194
195//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
196
197G4VPhysicalVolume* XrayFluoDetectorConstruction::Construct()
198{
199 return ConstructApparate();
200}
201//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
202
203void XrayFluoDetectorConstruction::DefineDefaultMaterials()
204{
205
206
207 //define materials of the apparate
208
209 sampleMaterial = materials->GetMaterial("Dolorite");
210 Dia1Material = materials->GetMaterial("G4_Pb");
211 Dia3Material = materials->GetMaterial("Galactic");
212 pixelMaterial = materials->GetMaterial("SiLi");
213 //pixelMaterial = materials->GetMaterial(detectorType->GetDetectorMaterial());
214 OhmicPosMaterial = materials->GetMaterial("Cu");
215 OhmicNegMaterial = materials->GetMaterial("G4_Pb");
216 defaultMaterial = materials->GetMaterial("Galactic");
217
218
219}
220
221 void XrayFluoDetectorConstruction::SetOhmicPosThickness(G4double val)
222{
223
224 if (!phaseSpaceFlag) {
225
226
227 if (val == 0.0) {
228 OhmicPosMaterial = materials->GetMaterial("Galactic");
229 }
230 else {
231 OhmicPosThickness = val;
232 OhmicPosMaterial = materials->GetMaterial("Copper");
233 }
234
235 }
236 else{
237 G4cout << "Not available in this configuration" << G4cout;
238 }
239
240}
241
242
243//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
244
245G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate()
246{
247 // complete the apparate parameters definition
248
249 //ComputeApparateParameters();
250
251 //world and associated navigator
252
253 solidWorld = new G4Box("World", //its name
254 WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/2); //its size
255
256 logicWorld = new G4LogicalVolume(solidWorld, //its solid
257 defaultMaterial, //its material
258 "World"); //its name
259 physiWorld = new G4PVPlacement(0, //no rotation
260 G4ThreeVector(), //at (0,0,0)
261 "World", //its name
262 logicWorld, //its logical volume
263 0, //its mother volume
264 false, //no boolean operation
265 0); //copy number
266
267 aNavigator->SetWorldVolume(physiWorld);
268
269
270 //HPGeDetector
271
272 if (!phaseSpaceFlag) {
273
274 solidHPGe = 0; physiHPGe = 0; logicHPGe=0;
275 solidPixel=0; logicPixel=0; physiPixel=0;
276
277 if (DeviceThickness > 0.)
278 {
279 solidHPGe = new G4Box("HPGeDetector", //its name
280 DeviceSizeX/2,DeviceSizeY/2,DeviceThickness/2);//size
281
282
283 logicHPGe = new G4LogicalVolume(solidHPGe, //its solid
284 defaultMaterial, //its material
285 "HPGeDetector"); //its name
286
287 zRotPhiHPGe.rotateX(PhiHPGe);
288 G4double x,y,z;
289 z = DistDe * std::cos(ThetaHPGe);
290 y =DistDe * std::sin(ThetaHPGe);
291 x = 0.*cm;
292 physiHPGe = new G4PVPlacement(G4Transform3D(zRotPhiHPGe,G4ThreeVector(x,y,z)),
293 "HPGeDetector", //its name
294 logicHPGe, //its logical volume
295 physiWorld, //its mother volume
296 false, //no boolean operation
297 0); //copy number
298 }
299 // Pixel
300
301
302
303
304 for ( G4int j=0; j < NbOfPixelColumns ; j++ )
305 { for ( G4int i=0; i < NbOfPixelRows ; i++ )
306 {
307 solidPixel=0; logicPixel=0; physiPixel=0;
308 if (PixelThickness > 0.)
309 solidPixel = new G4Box("Pixel",
310 PixelSizeXY/2,PixelSizeXY/2, PixelThickness/2);
311
312 logicPixel = new G4LogicalVolume(solidPixel,
313 pixelMaterial, //its material
314 "Pixel"); //its name
315
316 /*
317 zRotPhiHPGe.rotateX(PhiHPGe);
318 G4double x,y,z;
319 z = DistDe * std::cos(ThetaHPGe);
320 y =DistDe * std::sin(ThetaHPGe);
321 x = 0.*cm;*/
322 physiPixel = new G4PVPlacement(0,
323 G4ThreeVector(0,
324 i*PixelSizeXY,
325 j*PixelSizeXY ),
326 "Pixel",
327 logicPixel, //its logical volume
328 physiHPGe, //its mother volume
329 false, //no boolean operation
330 PixelCopyNb);//copy number
331
332
333
334
335
336
337 // OhmicNeg
338
339 solidOhmicNeg=0; logicOhmicNeg=0; physiOhmicNeg=0;
340
341 if (OhmicNegThickness > 0.)
342 { solidOhmicNeg = new G4Box("OhmicNeg", //its name
343 PixelSizeXY/2,PixelSizeXY/2,OhmicNegThickness/2);
344
345 logicOhmicNeg = new G4LogicalVolume(solidOhmicNeg, //its solid
346 OhmicNegMaterial, //its material
347 "OhmicNeg"); //its name
348
349 physiOhmicNeg = new G4PVPlacement(0,
350 G4ThreeVector
351 (0.,
352 0.,
353 (PixelThickness+OhmicNegThickness)/2),
354 "OhmicNeg", //its name
355 logicOhmicNeg, //its logical volume
356 physiHPGe, //its mother
357 false, //no boulean operat
358 PixelCopyNb); //copy number
359
360 }
361 // OhmicPos
362 solidOhmicPos=0; logicOhmicPos=0; physiOhmicPos=0;
363
364 if (OhmicPosThickness > 0.)
365 { solidOhmicPos = new G4Box("OhmicPos", //its name
366 PixelSizeXY/2,PixelSizeXY/2,OhmicPosThickness/2);
367
368 logicOhmicPos = new G4LogicalVolume(solidOhmicPos, //its solid
369 OhmicPosMaterial, //its material
370 "OhmicPos"); //its name
371
372 physiOhmicPos = new G4PVPlacement(0,
373 G4ThreeVector(0.,
374 0.,
375 (-PixelThickness-OhmicPosThickness)/2),
376 "OhmicPos",
377 logicOhmicPos,
378 physiHPGe,
379 false,
380 PixelCopyNb);
381
382 }
383
384 PixelCopyNb += PixelCopyNb;
385 G4cout << "PixelCopyNb: " << PixelCopyNb << G4endl;
386 }
387
388 }
389
390 }
391
392 //Sample
393
394 if (sampleGranularity) {
395
396 solidSample=0; logicSample=0; physiSample=0;
397 if (SampleThickness > 0.)
398 {
399 solidSample = new G4Box("Sample", //its name
400 SampleSizeXY/2,SampleSizeXY/2,SampleThickness/2);//size
401
402 logicSample= new G4LogicalVolume(solidSample, //its solid
403 defaultMaterial, //its material
404 "Sample"); //its name
405
406 physiSample = new G4PVPlacement(0, //no rotation
407 G4ThreeVector(), //at (0,0,0)
408 "Sample", //its name
409 logicSample, //its logical volume
410 physiWorld, //its mother volume
411 false, //no boolean operation
412 0); //copy number
413
414 }
415
416
417
418
419 G4int nbOfGrainsX = ((G4int)(SampleSizeXY/grainDia)) -1 ;
420
421 // y dim of a max density plane is 2rn-(n-1)ar, wehere a = (1-(std::sqrt(3)/2)), n is
422 // number of rows and r the radius of the grain. so the Y-dim of the sample must
423 // be greater or equal to this. It results that nmust be <= (SampleY-a)/(1-a).
424 // Max Y shift of the planes superimposing along Z axis is minor (2/std::sqrt(3)r)
425
426 G4double a = (1.-(std::sqrt(3.)/2.));
427 G4int nbOfGrainsY = (G4int) ( ((SampleSizeXY/(grainDia/2.)) -a)/(2.-a) ) -1;
428
429 // same for the z axis, but a = 2 * (std::sqrt(3) - std::sqrt(2))/std::sqrt(3)
430
431 G4double b = 2. * (std::sqrt(3.) - std::sqrt(2.))/std::sqrt(3.);
432 G4int nbOfGrainsZ = (G4int) ( ((SampleThickness/(grainDia/2.)) -b)/(2.-b) )-1;
433
434 if (SampleThickness > 0.){
435
436 solidGrain=0; logicGrain=0; physiGrain=0;
437 solidGrain = new G4Sphere("Grain",0.,
438 grainDia/2,0., twopi, 0., pi);
439
440 logicGrain = new G4LogicalVolume(solidGrain,
441 sampleMaterial, //its material
442 "Grain"); //its name
443 G4ThreeVector grainPosition;
444 G4double grainInitPositionX = 0;
445 G4double grainInitPositionY = 0;
446 G4double grainInitPositionZ = (-1.*SampleThickness/2.+grainDia/2.);
447 G4double grainStepX = grainDia = 0;
448 G4double grainStepY = grainDia*(1.-(0.5-(std::sqrt(3.)/4.)));
449 G4double grainStepZ = grainDia*std::sqrt(2./3.);
450
451 for ( G4int k=0; k < nbOfGrainsZ ; k++ ) {
452 for ( G4int j=0; j < nbOfGrainsY ; j++ ) {
453 for ( G4int i=0; i < nbOfGrainsX ; i++ ) {
454
455 // Now we identify the layer and the row where the grain is , to place it in the right position
456
457
458
459 if (k%3 == 0) { // first or (4-multiple)th layer: structure is ABCABC
460 grainInitPositionY = (-1.*SampleSizeXY/2.+grainDia/2.);
461 if (j%2 ==0) { //first or (3-multiple)th row
462 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2.);
463 }
464
465 else if ( ((j+1) % 2) == 0 ) {
466 grainInitPositionX = (-1.*SampleSizeXY/2.+ grainDia);
467 }
468
469 }
470 else if ( ((k+2) % 3) == 0 ) { // B-layer
471
472 grainInitPositionY = ( (-1.*SampleSizeXY/2.) + (grainDia/2.)*(1. + (1./std::sqrt(3.)) ) );
473
474 if (j%2 ==0) { //first or (3-multiple)th row
475 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia);
476 }
477
478 else if ( (j+1)%2 == 0 ) {
479 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2);
480 }
481
482 }
483
484 else if ( (k+1)%3 == 0 ) { // B-layer
485
486 grainInitPositionY = (-1.*SampleSizeXY/2.+(grainDia/2.)*(1.+2./std::sqrt(3.)) );
487
488 if (j%2 ==0) { //first or (3-multiple)th row
489 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2.);
490 }
491
492 else if ( (j+1)%2 == 0 ) {
493 grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia);
494 }
495
496 }
497
498 physiGrain = new G4PVPlacement(0,
499 G4ThreeVector( grainInitPositionX + i*grainStepX,
500 grainInitPositionY + j*grainStepY,
501 grainInitPositionZ + k*grainStepZ),
502 "Grain",
503 logicGrain, //its logical volume
504 physiSample, //its mother volume
505 false, //no boolean operation
506 grainCopyNb);//copy number
507
508 grainCopyNb = grainCopyNb +1;
509 }
510 }
511 }
512 }
513 }
514 else {
515
516 solidSample=0; logicSample=0; physiSample=0;
517 if (SampleThickness > 0.)
518 {
519 solidSample = new G4Box("Sample", //its name
520 SampleSizeXY/2,SampleSizeXY/2,SampleThickness/2);//size
521
522 logicSample= new G4LogicalVolume(solidSample, //its solid
523 sampleMaterial, //its material
524 "Sample"); //its name
525
526 physiSample = new G4PVPlacement(0, //no rotation
527 G4ThreeVector(), //at (0,0,0)
528 "Sample", //its name
529 logicSample, //its logical volume
530 physiWorld, //its mother volume
531 false, //no boolean operation
532 0); //copy number
533
534 }
535 }
536
537 if (!phaseSpaceFlag) {
538 //Diaphragm1
539
540 solidDia1 = 0; physiDia1 = 0; logicDia1=0;
541
542 if (Dia1Thickness > 0.)
543 {
544 solidDia1 = new G4Tubs("Diaphragm1", //its name
545 DiaInnerSize/2,
546 Dia1SizeXY/2,
547 Dia1Thickness/2,
548 0,
549 360);//size
550
551
552 logicDia1 = new G4LogicalVolume(solidDia1, //its solid
553 Dia1Material, //its material
554 "Diaphragm1"); //its name
555
556 zRotPhiDia1.rotateX(AlphaDia1);
557 G4double x,y,z;
558 z = DistDia * std::cos(ThetaDia1);
559 y =DistDia * std::sin(ThetaDia1);
560 x = 0.*cm;
561 physiDia1 = new G4PVPlacement(G4Transform3D(zRotPhiDia1,G4ThreeVector(x,y,z)),
562 "Diaphragm1", //its name
563 logicDia1, //its logical volume
564 physiWorld, //its mother volume
565 false, //no boolean operation
566 0); //copy number
567 }
568
569 //Diaphragm3
570
571 solidDia3 = 0; physiDia3 = 0; logicDia3 =0;
572
573 if (Dia3Thickness > 0.)
574 {
575 solidDia3 = new G4Tubs("Diaphragm3",
576 Dia3InnerSize/2,
577 Dia3SizeXY/2,
578 Dia3Thickness/2,
579 0,
580 360);
581
582
583 logicDia3 = new G4LogicalVolume(solidDia3, //its solid
584 Dia3Material, //its material
585 "Diaphragm3"); //its name
586
587 zRotPhiDia3.rotateX(AlphaDia3);
588 G4double x,y,z;
589 z = Dia3Dist * std::cos(ThetaDia3);
590 y =Dia3Dist * std::sin(ThetaDia3);
591 x = 0.*cm;
592 physiDia3 = new G4PVPlacement(G4Transform3D(zRotPhiDia3,G4ThreeVector(x,y,z)), "Diaphragm3", //its name
593 logicDia3, //its logical volume
594 physiWorld, //its mother volume
595 false, //no boolean operation
596 0); //copy number
597 }
598 }
599
600 if (!phaseSpaceFlag) {
601
602 G4SDManager* SDman = G4SDManager::GetSDMpointer();
603
604
605 if(!HPGeSD)
606 {
607 HPGeSD = new XrayFluoSD ("HPGeSD",this);
608 SDman->AddNewDetector(HPGeSD);
609 }
610
611
612 if (logicPixel)
613 {
614 logicPixel->SetSensitiveDetector(HPGeSD);
615 }
616 }
617 // cut per region
618
619 //logicSample->SetRegion(sampleRegion);
620 //sampleRegion->AddRootLogicalVolume(logicSample);
621
622
623
624 // Visualization attributes
625
626 logicWorld->SetVisAttributes (G4VisAttributes::Invisible);
627 G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
628 G4VisAttributes * yellow= new G4VisAttributes( G4Colour(255/255. ,255/255. ,51/255. ));
629 G4VisAttributes * red= new G4VisAttributes( G4Colour(255/255. , 0/255. , 0/255. ));
630 G4VisAttributes * blue= new G4VisAttributes( G4Colour(0/255. , 0/255. , 255/255. ));
631 G4VisAttributes * gray= new G4VisAttributes( G4Colour(128/255. , 128/255. , 128/255. ));
632 G4VisAttributes * lightGray= new G4VisAttributes( G4Colour(178/255. , 178/255. , 178/255. ));
633 yellow->SetVisibility(true);
634 yellow->SetForceSolid(true);
635 red->SetVisibility(true);
636 red->SetForceSolid(true);
637 blue->SetVisibility(true);
638 gray->SetVisibility(true);
639 gray->SetForceSolid(true);
640 lightGray->SetVisibility(true);
641 lightGray->SetForceSolid(true);
642 simpleBoxVisAtt->SetVisibility(true);
643 if (!phaseSpaceFlag) {
644 logicPixel->SetVisAttributes(red); //modified!!!
645 logicHPGe->SetVisAttributes(blue);
646
647 logicDia1->SetVisAttributes(lightGray);
648 logicDia3->SetVisAttributes(lightGray);
649
650 logicOhmicNeg->SetVisAttributes(yellow);
651 logicOhmicPos->SetVisAttributes(yellow);
652
653 }
654 logicSample->SetVisAttributes(simpleBoxVisAtt);
655
656 if (sampleGranularity) logicSample->SetVisAttributes(simpleBoxVisAtt); // mandatory
657
658
659
660 if (sampleGranularity) logicGrain->SetVisAttributes(gray);
661
662 //always return the physical World
663
664 PrintApparateParameters();
665
666 return physiWorld;
667}
668
669//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
670
671void XrayFluoDetectorConstruction::PrintApparateParameters()
672{
673 G4cout << "-----------------------------------------------------------------------"
674 << G4endl
675 << "The sample is a box whose size is: "
676 << G4endl
677 << SampleThickness/cm
678 << " cm * "
679 << SampleSizeXY/cm
680 << " cm * "
681 << SampleSizeXY/cm
682 << " cm"
683 << G4endl
684 <<" Material: " << logicSample->GetMaterial()->GetName()
685 <<G4endl;
686 if (!phaseSpaceFlag) {
687 G4cout <<"The Detector is a slice " << DeviceThickness/(1.e-6*m) << " micron thick of " << pixelMaterial->GetName()
688 <<G4endl
689 << "The Anode is a slice " << OhmicPosThickness/mm << "mm thick of "<< OhmicPosMaterial->GetName()
690 <<G4endl;
691 }
692 G4cout <<"-------------------------------------------------------------------------"
693 << G4endl;
694}
695//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
696
697void XrayFluoDetectorConstruction::UpdateGeometry()
698{
699
700 if (solidPixel) delete solidPixel;
701 if (logicPixel) delete logicPixel;
702 if (physiPixel) delete physiPixel;
703 if (solidOhmicNeg) delete solidOhmicNeg;
704 if (logicOhmicNeg) delete logicOhmicNeg;
705 if (physiOhmicNeg) delete physiOhmicNeg;
706 if (solidOhmicPos) delete solidOhmicPos;
707 if (logicOhmicPos) delete logicOhmicPos;
708 if (physiOhmicPos) delete physiOhmicPos;
709 if (solidHPGe) delete solidHPGe;
710 if (logicHPGe) delete logicHPGe;
711 if (physiHPGe) delete physiHPGe;
712
713 //if (sampleRegion) sampleRegion->RemoveRootLogicalVolume(logicSample);
714 if (solidSample) delete solidSample;
715 if (logicSample) delete logicSample;
716 if (physiSample) delete physiSample;
717
718 if (solidDia1) delete solidDia1;
719 if (logicDia1) delete logicDia1;
720 if (physiDia1) delete physiDia1;
721 if (solidDia3) delete solidDia3;
722 if (logicDia3) delete logicDia3;
723 if (physiDia3) delete physiDia3;
724
725 if (solidWorld) delete solidWorld;
726 if (logicWorld) delete logicWorld;
727 if (physiWorld) delete physiWorld;
728
729 zRotPhiHPGe.rotateX(-1.*PhiHPGe);
730 zRotPhiDia1.rotateX(-1.*AlphaDia1);
731 zRotPhiDia3.rotateX(-1.*AlphaDia3);
732 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructApparate());
733
734}
735
736
737void XrayFluoDetectorConstruction::DeleteGrainObjects()
738{
739 if (sampleGranularity) {
740 delete solidGrain;
741 delete logicGrain;
742 delete physiGrain;
743 }
744
745}
746
747G4ThreeVector XrayFluoDetectorConstruction::GetDetectorPosition()
748{
749
750
751
752 G4double z = DistDe * std::cos(ThetaHPGe);
753 G4double y = DistDe * std::sin(ThetaHPGe);
754 G4double x = 0.*cm;
755
756 G4ThreeVector position(x,y,z);
757
758 return position;
759
760}
761
762void XrayFluoDetectorConstruction::SetSampleMaterial(G4String newMaterial)
763{
764
765
766 G4cout << "Material Change in Progress " << newMaterial << G4endl;
767 sampleMaterial = materials->GetMaterial(newMaterial);
768 logicSample->SetMaterial(sampleMaterial);
769 PrintApparateParameters();
770
771}
772
773//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
774
775
776
777
778
779
780
781
782
783
784
Note: See TracBrowser for help on using the repository browser.