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

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

update

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