ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
XrayFluoPlaneDetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file XrayFluoPlaneDetectorConstruction.cc
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 // Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it)
29 //
30 // History:
31 // -----------
32 // 29 aug 2003 Alfonso Mantero Created
33 // -------------------------------------------------------------------
34 
37 #include "XrayFluoSD.hh"
38 #include "XrayFluoNistMaterials.hh"
39 #include "G4PhysicalConstants.hh"
40 #include "G4SystemOfUnits.hh"
41 #include "G4Material.hh"
42 #include "G4ThreeVector.hh"
43 #include "G4Box.hh"
44 #include "G4Sphere.hh"
45 #include "G4LogicalVolume.hh"
46 #include "G4PVPlacement.hh"
48 #include "G4SDManager.hh"
49 #include "G4RunManager.hh"
50 #include "G4VisAttributes.hh"
51 #include "G4Colour.hh"
52 #include "G4PVReplica.hh"
53 #include "G4UserLimits.hh"
54 #include "G4GeometryManager.hh"
55 #include "G4PhysicalVolumeStore.hh"
56 #include "G4LogicalVolumeStore.hh"
57 #include "G4SolidStore.hh"
58 #include "G4SDManager.hh"
59 
60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
61 
62 
64  : detectorType(0),planeGranularity(false), DeviceSizeX(0),
65  DeviceSizeY(0),DeviceThickness(0),
66  solidWorld(0),logicWorld(0),physiWorld(0),
67  solidHPGe(0),logicHPGe(0),physiHPGe(0),
68  solidScreen(0),logicScreen(0),physiScreen(0),
69  solidPlane (0),logicPlane(0),physiPlane (0),
70  solidOhmicPos(0),logicOhmicPos(0), physiOhmicPos(0),
71  solidOhmicNeg(0),logicOhmicNeg(0), physiOhmicNeg(0),
72  solidPixel(0),logicPixel(0), physiPixel(0),
73  screenMaterial(0),OhmicPosMaterial(0), OhmicNegMaterial(0),
74  pixelMaterial(0),planeMaterial(0),
75  defaultMaterial(0),HPGeSD(0)
76 
77 {
79 
81 
82  NbOfPixelRows = 1; // should be 1
83  NbOfPixelColumns = 1; // should be 1
85  PixelSizeXY = 5 * cm; // should be 5
86  PixelThickness = 3.5 * mm; //changed should be 3.5 mm
87 
88  G4cout << "PixelThickness(mm): "<< PixelThickness/mm << G4endl;
89  G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/cm << G4endl;
90 
91  ContactSizeXY = 5 * cm; //should be the same as pixelSizeXY
92  planeThickness = 5 * cm;
93  planeSizeXY = 5. * m;
94 
95  OhmicNegThickness = 0.005*mm;
96  OhmicPosThickness = 0.005*mm;
97 
98  screenThickness = 5 * mm;
99 
100  ThetaHPGe = 0. * deg;
101  PhiHPGe = 0. * deg;
102 
103 
104  DistDe = 0.5 * m;
105 
107 
108  grainDia = 1 * mm;
109 
110 
111  PixelCopyNb=0;
112  grainCopyNb=0;
113  G4String defaultDetectorType = "sili";
115  SetDetectorType(defaultDetectorType);
116 
117  // create commands for interactive definition of the apparate
118 
120  G4cout << "XrayFluoPlaneDetectorConstruction created" << G4endl;
121 }
122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
123 
124 
126 
128 {
129  if (instance == 0)
130  {
132 
133  }
134  return instance;
135 }
136 
138 {
139 
140  if (type=="sili")
141  {
143  }
144  else if (type=="hpge")
145  {
147  }
148  else
149  {
151  execp << type + "detector type unknown";
152  G4Exception("XrayFluoPlaneDetectorConstruction::SetDetectorType()","example-xray_fluorescence03",
153  FatalException, execp);
154  }
155 }
156 
157 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
158 
160 {
161  return detectorType;
162 }
163 
164 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
165 
167 
168 {
169  delete detectorMessenger;
170  delete detectorType;
171  G4cout << "XrayFluoPlaneDetectorConstruction deleted" << G4endl;
172 }
173 
174 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
175 
177 {
178  return ConstructApparate();
179 }
180 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
181 
183 {
184 
185 
186  //define materials of the apparate
187 
188  planeMaterial = materials->GetMaterial("Anorthosite");
190  pixelMaterial = materials->GetMaterial("G4_Si");
193  defaultMaterial = materials->GetMaterial("G4_Galactic");
194 }
195 
196 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
197 
199 {
200  // complete the apparate parameters definition
201 
202  //ComputeApparateParameters();
203 
204  //world
205 
206  solidWorld = new G4Box("World", //its name
207  WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/2); //its size
208 
209  logicWorld = new G4LogicalVolume(solidWorld, //its solid
210  defaultMaterial, //its material
211  "World"); //its name
212  physiWorld = new G4PVPlacement(0, //no rotation
213  G4ThreeVector(), //at (0,0,0)
214  "World", //its name
215  logicWorld, //its logical volume
216  0, //its mother volume
217  false, //no boolean operation
218  0); //copy number
219 
220  //detector
221 
222  solidHPGe = 0; physiHPGe = 0; logicHPGe=0;
224 
225  if (DeviceThickness > 0.)
226  {
227  solidHPGe = new G4Box("HPGeDetector", //its name
229 
230 
231  logicHPGe = new G4LogicalVolume(solidHPGe, //its solid
232  defaultMaterial, //its material
233  "HPGeDetector"); //its name
234 
236  G4double x,y,z;
237 
238  z = -1. * DistDe; //* std::cos(ThetaHPGe);
239  y = 0.*cm; //distScreen * std::sin(ThetaHPGe);
240  x = 0.*cm;
241 
243  "HPGeDetector", //its name
244  logicHPGe, //its logical volume
245  physiWorld, //its mother volume
246  false, //no boolean operation
247  0); //copy number
248  }
249  // Pixel
250 
251 
252 
253 
254  for ( G4int j=0; j < NbOfPixelColumns ; j++ )
255  { for ( G4int i=0; i < NbOfPixelRows ; i++ )
256  {
258  if (PixelThickness > 0.)
259  solidPixel = new G4Box("Pixel",
261 
263  pixelMaterial, //its material
264  "Pixel"); //its name
265 
266  /*
267  zRotPhiHPGe.rotateX(PhiHPGe);
268  G4double x,y,z;
269  z = DistDe * std::cos(ThetaHPGe);
270  y =DistDe * std::sin(ThetaHPGe);
271  x = 0.*cm;*/
272  physiPixel = new G4PVPlacement(0,
273  G4ThreeVector(0,
274  i*PixelSizeXY,
275  j*PixelSizeXY ),
276  "Pixel",
277  logicPixel, //its logical volume
278  physiHPGe, //its mother volume
279  false, //no boolean operation
280  PixelCopyNb);//copy number
281 
282 
283 
284 
285 
286 
287  // OhmicNeg
288 
290 
291  if (OhmicNegThickness > 0.)
292  { solidOhmicNeg = new G4Box("OhmicNeg", //its name
293  PixelSizeXY/2,PixelSizeXY/2,OhmicNegThickness/2);
294 
295  logicOhmicNeg = new G4LogicalVolume(solidOhmicNeg, //its solid
296  OhmicNegMaterial, //its material
297  "OhmicNeg"); //its name
298 
301  (0.,
302  0.,
304  "OhmicNeg", //its name
305  logicOhmicNeg, //its logical volume
306  physiHPGe, //its mother
307  false, //no boulean operat
308  PixelCopyNb); //copy number
309 
310  }
311  // OhmicPos
313 
314  if (OhmicPosThickness > 0.)
315  { solidOhmicPos = new G4Box("OhmicPos", //its name
316  PixelSizeXY/2,PixelSizeXY/2,OhmicPosThickness/2);
317 
318  logicOhmicPos = new G4LogicalVolume(solidOhmicPos, //its solid
319  OhmicPosMaterial, //its material
320  "OhmicPos"); //its name
321 
322  physiOhmicPos = new G4PVPlacement(0,
323  G4ThreeVector(0.,
324  0.,
326  "OhmicPos",
328  physiHPGe,
329  false,
330  PixelCopyNb);
331 
332  }
333 
335  G4cout << "PixelCopyNb: " << PixelCopyNb << G4endl;
336  }
337 
338  }
339 
340  // Screen
341 
342  if (DeviceThickness > 0.)
343  {
344  solidScreen = new G4Box("DetectorScreen", //its name
346 
347 
348  logicScreen = new G4LogicalVolume(solidScreen, //its solid
349  defaultMaterial, //its material
350  "DetectorScreen"); //its name
351 
352  //zRotPhiHPGe.rotateX(PhiHPGe);
353  G4double x,y,z;
354  G4cout << "distScreen: "<< distScreen/m <<G4endl;
355  z = -1 * distScreen; //* std::cos(ThetaHPGe);
356  y = 0.*cm; //distScreen * std::sin(ThetaHPGe);
357  x = 0.*cm;
359  "DetectorScreen", //its name
360  logicScreen, //its logical volume
361  physiWorld, //its mother volume
362  false, //no boolean operation
363  0); //copy number
364  }
365 
366  //Plane
367 
368  if (planeGranularity) {
369 
371  if (planeThickness > 0.)
372  {
373  solidPlane = new G4Box("Plane", //its name
375 
376  logicPlane= new G4LogicalVolume(solidPlane, //its solid
377  defaultMaterial, //its material
378  "Plane"); //its name
379 
380  physiPlane = new G4PVPlacement(0, //no rotation
381  G4ThreeVector(), //at (0,0,0)
382  "Plane", //its name
383  logicPlane, //its logical volume
384  physiWorld, //its mother volume
385  false, //no boolean operation
386  0); //copy number
387 
388  }
389 
390 
391 
392 
393  G4int nbOfGrainsX = ((G4int)(planeSizeXY/grainDia)) -1 ;
394 
395  // y dim of a max density plane is 2rn-(n-1)ar, wehere a = (1-(std::sqrt(3)/2)), n is
396  // number of rows and r the radius of the grain. so the Y-dim of the plane must
397  // be greater or equal to this. It results that nmust be <= (PlaneY-a)/(1-a).
398  // Max Y shift of the planes superimposing along Z axis is minor (2/std::sqrt(3)r)
399 
400  G4double a = (1.-(std::sqrt(3.)/2.));
401  G4int nbOfGrainsY = (G4int) ( ((planeSizeXY/(grainDia/2.)) -a)/(2.-a) ) -1;
402 
403  // same for the z axis, but a = 2 * (std::sqrt(3) - std::sqrt(2))/std::sqrt(3)
404 
405  G4double b = 2. * (std::sqrt(3.) - std::sqrt(2.))/std::sqrt(3.);
406  G4int nbOfGrainsZ = (G4int) ( ((planeThickness/(grainDia/2.)) -b)/(2.-b) )-1;
407 
408  if (planeThickness > 0.){
409 
411  solidGrain = new G4Sphere("Grain",0.,
412  grainDia/2,0., twopi, 0., pi);
413 
415  planeMaterial, //its material
416  "Grain"); //its name
417  G4ThreeVector grainPosition;
418  G4double grainInitPositionX = 0;
419  G4double grainInitPositionY = 0;
420  G4double grainInitPositionZ = (-1.*planeThickness/2.+grainDia/2.);
421  G4double grainStepX = grainDia = 0;
422  G4double grainStepY = grainDia*(1.-(0.5-(std::sqrt(3.)/4.)));
423  G4double grainStepZ = grainDia*std::sqrt(2./3.);
424 
425  for ( G4int k=0; k < nbOfGrainsZ ; k++ ) {
426  for ( G4int j=0; j < nbOfGrainsY ; j++ ) {
427  for ( G4int i=0; i < nbOfGrainsX ; i++ ) {
428 
429  // Now we identify the layer and the row where the grain is , to place it in the right position
430 
431 
432 
433  if (k%3 == 0) { // first or (4-multiple)th layer: structure is ABCABC
434  grainInitPositionY = (-1.*planeSizeXY/2.+grainDia/2.);
435  if (j%2 ==0) { //first or (3-multiple)th row
436  grainInitPositionX = (-1.*planeSizeXY/2.+grainDia/2.);
437  }
438 
439  else if ( ((j+1) % 2) == 0 ) {
440  grainInitPositionX = (-1.*planeSizeXY/2.+ grainDia);
441  }
442 
443  }
444  else if ( ((k+2) % 3) == 0 ) { // B-layer
445 
446  grainInitPositionY = ( (-1.*planeSizeXY/2.) + (grainDia/2.)*(1. + (1./std::sqrt(3.)) ) );
447 
448  if (j%2 ==0) { //first or (3-multiple)th row
449  grainInitPositionX = (-1.*planeSizeXY/2.+grainDia);
450  }
451 
452  else if ( (j+1)%2 == 0 ) {
453  grainInitPositionX = (-1.*planeSizeXY/2.+grainDia/2);
454  }
455 
456  }
457 
458  else if ( (k+1)%3 == 0 ) { // B-layer
459 
460  grainInitPositionY = (-1.*planeSizeXY/2.+(grainDia/2.)*(1.+2./std::sqrt(3.)) );
461 
462  if (j%2 ==0) { //first or (3-multiple)th row
463  grainInitPositionX = (-1.*planeSizeXY/2.+grainDia/2.);
464  }
465 
466  else if ( (j+1)%2 == 0 ) {
467  grainInitPositionX = (-1.*planeSizeXY/2.+grainDia);
468  }
469 
470  }
471 
472  physiGrain = new G4PVPlacement(0,
473  G4ThreeVector( grainInitPositionX + i*grainStepX,
474  grainInitPositionY + j*grainStepY,
475  grainInitPositionZ + k*grainStepZ),
476  "Grain",
477  logicGrain, //its logical volume
478  physiPlane, //its mother volume
479  false, //no boolean operation
480  grainCopyNb);//copy number
481 
482  grainCopyNb = grainCopyNb +1;
483  }
484  }
485  }
486  }
487  }
488  else {
489 
491  if (planeThickness > 0.)
492  {
493  solidPlane = new G4Box("Plane", //its name
495 
496  logicPlane= new G4LogicalVolume(solidPlane, //its solid
497  planeMaterial, //its material
498  "Plane"); //its name
499 
500  physiPlane = new G4PVPlacement(0, //no rotation
501  G4ThreeVector(), //at (0,0,0)
502  "Plane", //its name
503  logicPlane, //its logical volume
504  physiWorld, //its mother volume
505  false, //no boolean operation
506  0); //copy number
507 
508  }
509  }
510 
511  // Visualization attributes
512 
514  G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
515  G4VisAttributes * yellow= new G4VisAttributes( G4Colour(255/255. ,255/255. ,51/255. ));
516  G4VisAttributes * red= new G4VisAttributes( G4Colour(255/255. , 0/255. , 0/255. ));
517  G4VisAttributes * blue= new G4VisAttributes( G4Colour(0/255. , 0/255. , 255/255. ));
518  G4VisAttributes * grayc= new G4VisAttributes( G4Colour(128/255. , 128/255. , 128/255. ));
519  G4VisAttributes * lightGray= new G4VisAttributes( G4Colour(178/255. , 178/255. , 178/255. ));
520  yellow->SetVisibility(true);
521  yellow->SetForceSolid(true);
522  red->SetVisibility(true);
523  red->SetForceSolid(true);
524  blue->SetVisibility(true);
525  grayc->SetVisibility(true);
526  grayc->SetForceSolid(true);
527  lightGray->SetVisibility(true);
528  lightGray->SetForceSolid(true);
529  simpleBoxVisAtt->SetVisibility(true);
530 
531  logicPixel->SetVisAttributes(red); //modified!!!
533 
534  logicPlane->SetVisAttributes(lightGray);
535 
536 
540 
541 
542 
544 
545  //always return the physical World
546 
548 
549  return physiWorld;
550 }
551 
552 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...
553 
555 {
556  //
557  // Sensitive Detectors
558  //
559  if (HPGeSD.Get() == 0)
560  {
561  XrayFluoSD* SD = new XrayFluoSD ("HPGeSD",this);
562  HPGeSD.Put( SD );
563  }
565  if (logicPixel)
567 }
568 
569 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
570 
572 {
573  G4cout << "-----------------------------------------------------------------------"
574  << G4endl
575  << "The plane is a box whose size is: "
576  << G4endl
577  << planeThickness/cm
578  << " cm * "
579  << planeSizeXY/cm
580  << " cm * "
581  << planeSizeXY/cm
582  << " cm"
583  << G4endl
584  <<" Material: " << logicPlane->GetMaterial()->GetName()
585  <<G4endl
586  <<"The Detector is a slice " << DeviceThickness/(1.e-6*m) << " micron thick of " << pixelMaterial->GetName()
587  <<G4endl
588 
589 
590 <<"-------------------------------------------------------------------------"
591  << G4endl;
592 }
593 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
594 
596 {
601 
603  //Triggers a new call of Construct() and of all the geometry resets.
605 }
606 
607 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
608 
610 {
611  if (planeGranularity) {
612  delete solidGrain;
613  delete logicGrain;
614  delete physiGrain;
615  }
616 
617 }
618 
619 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
620 
622 {
623  //G4cout << "Material!!!!" << newMaterial << G4endl;
626  //GeometryHasBeenModified is called by the messenger
627 
628 }
629 
630 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
631 
632 
633 
634 
635 
636 
637 
638 
639 
640 
641 
642