ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DetectorConstruction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file DetectorConstruction.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 // This example is provided by the Geant4-DNA collaboration
27 // Any report or published results obtained using the Geant4-DNA software
28 // shall cite the following Geant4-DNA collaboration publication:
29 // Med. Phys. 37 (2010) 4692-4708
30 // The Geant4-DNA web site is available at http://geant4-dna.org
31 //
32 // If you use this example, please cite the following publication:
33 // Rad. Prot. Dos. 133 (2009) 2-11
34 
35 #include "DetectorConstruction.hh"
36 #include "G4PhysicalConstants.hh"
37 #include "G4SystemOfUnits.hh"
38 #include "G4MagIntegratorDriver.hh"
39 
40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
41 
43 
44 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
45 
47 
48  :fDefaultMaterial(nullptr),fCollimatorMaterial(nullptr),fBoiteMaterial(nullptr),
49  fCathodeMaterial(nullptr),fVerreMaterial(nullptr),fVerre2Material(nullptr),
50  fKgmMaterial(nullptr),fBoite2Material(nullptr),fBoite3Material(nullptr),
51  fNucleusMaterial1(nullptr),fCytoplasmMaterial1(nullptr),
52  fNucleusMaterial2(nullptr),fCytoplasmMaterial2(nullptr),
53  fNucleusMaterial3(nullptr),fCytoplasmMaterial3(nullptr),
54  fPhysiWorld(nullptr),fLogicWorld(nullptr),fSolidWorld(nullptr),
55  fPhysiVol(nullptr),fLogicVol(nullptr),fSolidVol(nullptr),
56  fPhysiBoite(nullptr),fLogicBoite(nullptr),fSolidBoite(nullptr),
57  fPhysiYoke1(nullptr),fLogicYoke1(nullptr),fSolidYoke1(nullptr),
58  fPhysi1Gap(nullptr),fLogic1Gap(nullptr),fSolid1Gap(nullptr),
59  fPhysi2Gap(nullptr),fLogic2Gap(nullptr),fSolid2Gap(nullptr),
60  fPhysi3Gap(nullptr),fLogic3Gap(nullptr),fSolid3Gap(nullptr),
61  fPhysiYoke2(nullptr),fLogicYoke2(nullptr),fSolidYoke2(nullptr),
62  fPhysi4Gap(nullptr),fLogic4Gap(nullptr),fSolid4Gap(nullptr),
63  fPhysi5Gap(nullptr),fLogic5Gap(nullptr),fSolid5Gap(nullptr),
64  fPhysiBoiteIso(nullptr),fLogicBoiteIso(nullptr),fSolidBoiteIso(nullptr),
65  fPhysiCathode(nullptr),fLogicCathode(nullptr),fSolidCathode(nullptr),
66  fPhysiIso(nullptr),fLogicIso(nullptr),fSolidIso(nullptr),
67  fPhysiVerre(nullptr),fLogicVerre(nullptr),fSolidVerre(nullptr),
68  fPhysiBoite2(nullptr),fLogicBoite2(nullptr),fSolidBoite2(nullptr),
69  fPhysiBoite3(nullptr),fLogicBoite3(nullptr),fSolidBoite3(nullptr),
70  fPhysiKgm(nullptr),fLogicKgm(nullptr),fSolidKgm(nullptr),
71  fPhysiVerre2(nullptr),fLogicVerre2(nullptr),fSolidVerre2(nullptr),
72  fPhysiPhantom(nullptr),fLogicPhantom(nullptr),fSolidPhantom(nullptr)
73 
74 {
77 }
78 
79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
80 
82 {
83  if(fField) {
84  delete fField;
85  fField = nullptr;
86  }
87 }
88 
89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
90 
92 
93 {
94  if(fPhysiWorld) { return fPhysiWorld; }
95  return ConstructLine();
96 }
97 
98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
99 
101 {
102  G4String name, symbol;
103  G4double density;
104 
105  G4int ncomponents, natoms,nel;
106  G4double z, a;
107  G4double fractionmass;
108  G4double temperature, pressure;
109 
110  // Define Elements
111 
112  G4Element* H = new G4Element ("Hydrogen", "H", 1. , 1.01*g/mole);
113  G4Element* N = new G4Element ("Nitrogen", "N", 7., 14.01*g/mole);
114  G4Element* O = new G4Element ("Oxygen" , "O", 8. , 16.00*g/mole);
115  G4Element* Ar = new G4Element ("Argon" , "Ar", 18., 39.948*g/mole );
116  G4Element* C = new G4Element ("Carbon","C", 6., 12.011*g/mole);
117  G4Element * Si = new G4Element ("Silicon","Si",14., 28.0855*g/mole);
118  G4Element * Cu = new G4Element ("Cuivre","Cu",29., 63.546*g/mole);
119  G4Element * Zn = new G4Element ("Zinc","Zn",30.,65.409*g/mole);
120  G4Element * P = new G4Element ("Phosphorus","P",15.,30.973761*g/mole);
121 
122  // Vacuum standard definition...
123 
124  density = universe_mean_density;
125  G4Material* vacuum = new G4Material(name="Vacuum", z=1., a=1.01*g/mole,
126  density);
127  // Water
128 
129  density = 1.000*g/cm3;
130  G4Material* H2O = new G4Material(name="H2O" , density, ncomponents=2);
131  H2O->AddElement(H, natoms=2);
132  H2O->AddElement(O, natoms=1);
133 
134  // Air
135 
136  density = 1.290*mg/cm3;
137  pressure = 1*atmosphere;
138  temperature = 293.16*kelvin;
139  G4Material* Air = new G4Material(name="Air" , density, ncomponents=2, kStateGas, temperature, pressure);
140  Air->AddElement(N, fractionmass=0.7);
141  Air->AddElement(O, fractionmass=0.3);
142 
143  // Low Pressure air
144 
145  density = (5e-6/1013.)*1.290*mg/cm3; // 5e-6 mbar is the usual beam pipe air pressure
146  pressure = 1*atmosphere;
147  temperature = 293.16*kelvin;
148  G4Material* LPAir = new G4Material(name="LPAir" , density, ncomponents=3, kStateGas, temperature, pressure);
149  LPAir->AddElement(N, fractionmass=0.715);
150  LPAir->AddElement(O, fractionmass=0.25);
151  LPAir->AddElement(Ar, fractionmass=0.035);
152 
153  // Platinum
154 
155  a = 195.09*g/mole;
156  density = 21.4*g/cm3;
157  G4Material* Pt = new G4Material(name="Pl", z=78., a, density);
158 
159  // Butane @ 10 mbar
160 
161  density = 2.552e-2*mg/cm3;
162  pressure = 0.01*bar;
163  temperature = 293.16*kelvin;
164  G4Material* Butane = new G4Material(name = "Butane", density, nel = 2, kStateGas, temperature, pressure);
165  Butane->AddElement (C, natoms=4);
166  Butane->AddElement (H, natoms=10);
167 
168  // Polypropylene
169 
170  density = 0.9*g/cm3;
171  G4Material* Polyprop = new G4Material(name = "Polyprop", density, nel = 2);
172  Polyprop->AddElement (C,3);
173  Polyprop->AddElement (H,6);
174 
175  // Si3N4
176 
177  density = 3.44*g/cm3;
178  G4Material* Si3N4 = new G4Material(name = "Si3N4", density, nel = 2);
179  Si3N4->AddElement (Si, natoms=3);
180  Si3N4->AddElement (N, natoms=4);
181 
182  // SiO2
183 
184  density = 2.5*g/cm3;
185  G4Material* SiO2 = new G4Material(name = "SiO2", density, nel = 2);
186  SiO2->AddElement (Si, natoms=1);
187  SiO2->AddElement (O, natoms=2);
188 
189  // Brass
190 
191  density = 8.5*g/cm3;
192  G4Material* Laiton = new G4Material(name = "Laiton", density, nel = 2);
193  Laiton->AddElement (Cu,1);
194  Laiton->AddElement (Zn,1);
195 
196  // Phantom
197 
198  fDensityPhantom = 1.; // in g/cm3
199 
200  // Nucleus composition from Alard et al., Rad. Res. 158, 650 (2002) and
201  // Comp. Math. Meth. Med. 147252 (2012)
202  //
203  // Cytoplasm composition is assumed to be water
204 
205  // Cytoplasm
206 
207  fDensityCytoplasm = 1.; // in g/cm3
208  density = fDensityCytoplasm*g/cm3;
209  G4Material* Cytoplasm1 = new G4Material(name="Cytoplasm1" , density, ncomponents=2);
210  Cytoplasm1->AddElement(H, fractionmass=0.112);
211  Cytoplasm1->AddElement(O, fractionmass=0.888);
212 
213  // Nucleoli
214 
215  fDensityCytoplasm = 1.;
216  // in g/cm3 (nucleoli are assumed to have the same chemical comp. as nucleus)
217  density = fDensityCytoplasm*g/cm3;
218  G4Material* Cytoplasm2 = new G4Material(name="Cytoplasm2" , density, ncomponents=5);
219  Cytoplasm2->AddElement(H, fractionmass=0.1064);
220  Cytoplasm2->AddElement(O, fractionmass=0.745);
221  Cytoplasm2->AddElement(C, fractionmass=0.0904);
222  Cytoplasm2->AddElement(N, fractionmass=0.0321);
223  Cytoplasm2->AddElement(P, fractionmass=0.0261);
224 
225  // default is water
226 
227  fDensityCytoplasm = 1.; // in g/cm3
228  density = fDensityCytoplasm*g/cm3;
229  G4Material* Cytoplasm3 = new G4Material(name="Cytoplasm3" , density, ncomponents=2);
230  Cytoplasm3->AddElement(H, fractionmass=0.112);
231  Cytoplasm3->AddElement(O, fractionmass=0.888);
232 
233  // Nucleus chemical composition
234 
235  fDensityNucleus = 1.; // in g/cm3
236  density = fDensityNucleus*g/cm3;
237  G4Material* Nucleus1 = new G4Material(name="Nucleus1" , density, ncomponents=5);
238  Nucleus1->AddElement(H, fractionmass=0.1064);
239  Nucleus1->AddElement(O, fractionmass=0.745);
240  Nucleus1->AddElement(C, fractionmass=0.0904);
241  Nucleus1->AddElement(N, fractionmass=0.0321);
242  Nucleus1->AddElement(P, fractionmass=0.0261);
243 
244  fDensityNucleus = 1.; // in g/cm3
245  density = fDensityNucleus*g/cm3;
246  G4Material* Nucleus2 = new G4Material(name="Nucleus2" , density, ncomponents=5);
247  Nucleus2->AddElement(H, fractionmass=0.1064);
248  Nucleus2->AddElement(O, fractionmass=0.745);
249  Nucleus2->AddElement(C, fractionmass=0.0904);
250  Nucleus2->AddElement(N, fractionmass=0.0321);
251  Nucleus2->AddElement(P, fractionmass=0.0261);
252 
253  // default
254 
255  fDensityNucleus = 1.; // in g/cm3
256  density = fDensityNucleus*g/cm3;
257  G4Material* Nucleus3 = new G4Material(name="Nucleus3" , density, ncomponents=5);
258  Nucleus3->AddElement(H, fractionmass=0.1064);
259  Nucleus3->AddElement(O, fractionmass=0.745);
260  Nucleus3->AddElement(C, fractionmass=0.0904);
261  Nucleus3->AddElement(N, fractionmass=0.0321);
262  Nucleus3->AddElement(P, fractionmass=0.0261);
263 
264  // Materials in setup
265 
266  fDefaultMaterial = vacuum;
267  fCollimatorMaterial = Pt;
268  fBoiteMaterial = Butane;
269  fCathodeMaterial = Laiton;
270  fVerreMaterial = Si3N4;
271  fVerre2Material = SiO2;
272  fKgmMaterial = H2O;
273  fBoite2Material = Air;
274  fBoite3Material = Polyprop;
275 
276  fNucleusMaterial1 = Nucleus1;
277  fCytoplasmMaterial1 = Cytoplasm1;
278  fNucleusMaterial2 = Nucleus2;
279  fCytoplasmMaterial2 = Cytoplasm2;
280  fNucleusMaterial3 = Nucleus3;
281  fCytoplasmMaterial3 = Cytoplasm3;
282 
283  // DISPLAY MATERIALS
285 
286 }
287 
288 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
289 
291 {
292  // WORLD
293  fWorldSizeXY = 20*m;
294  fWorldSizeZ = 40*m;
295 
296  // MICROBEAM LINE ANGLE
297  fLineAngle = 10*deg;
298 
299  // TARGET POSITION
300  fCiblePositionX = -1461.42*mm;
301  fCiblePositionY = 0*mm;
302  fCiblePositionZ = -1327 + (955*std::cos(fLineAngle))*mm;
303 
304  //*************
305  // WORLD VOLUME
306  //*************
307 
308  fSolidWorld = new G4Box("World", //its name
309  fWorldSizeXY/2,fWorldSizeXY/2,fWorldSizeZ/2); //its size
310 
311 
312  fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid
313  fDefaultMaterial, //its material
314  "World"); //its name
315 
316  fPhysiWorld = new G4PVPlacement(0, //no rotation
317  G4ThreeVector(), //at (0,0,0)
318  "World", //its name
319  fLogicWorld, //its logical volume
320  nullptr, //its mother volume
321  false, //no boolean operation
322  0); //copy number
323 
324  //*****************
325  // FULL LINE VOLUME
326  //*****************
327 
328  fSolidVol = new G4Box("Vol",
329  10.*m/2,10.*m/2,(14025)*mm/2);
330 
333  "Vol");
334 
335  fPhysiVol = new G4PVPlacement(0,
336  G4ThreeVector(0,0,-2012.5*mm),
337  "Vol",
338  fLogicVol,
339  fPhysiWorld,
340  false,
341  0);
342 
343  // *************************************************
344  // Whole microbeam line at 10 deg contained in a box
345  // *************************************************
346 
347  G4double PosX = fCiblePositionX*mm +( (6958.3/2-3.3)*std::sin(fLineAngle))*mm;
348  G4double PosZ = (fCiblePositionZ+2012.5)*mm - ((6958.3/2-3.3)*std::cos(fLineAngle))*mm;
349 
350  // Adjust box absolute position
351 
352  PosX = PosX + 1.3 * micrometer * std::cos(fLineAngle);
353  PosZ = PosZ + 1.3 * micrometer * std::sin(fLineAngle);
354 
355  G4RotationMatrix *rot = new G4RotationMatrix();
356  rot->rotateX(0*deg);
357  rot->rotateY(10*deg);
358  rot->rotateZ(0*deg);
359 
360  fSolidBoite = new G4Box("Boite", 4*cm, 4*cm, 6958.3*mm/2);
361 
363 
364  fPhysiBoite = new G4PVPlacement(rot,
365  G4ThreeVector(PosX,0,PosZ),
366  "Boite",
367  fLogicBoite,
368  fPhysiVol,
369  false,
370  0);
371 
372  //*********************************************************************
373  // OBJECT COLLIMATOR (after switching magnet, 5 micrometer in diameter)
374  //*********************************************************************
375 
376  fCollObjSizeXY = 8*cm;
377  fCollObjSizeZ = 0.07*mm;
378 
379  fSolidYoke1 = new G4Box("_CollObj_yoke1_", fCollObjSizeXY/2,fCollObjSizeXY/2,fCollObjSizeZ/2);
380 
381  fLogicYoke1 = new G4LogicalVolume(fSolidYoke1, fCollimatorMaterial, "_CollObj_yoke1_");
382 
383  fPhysiYoke1 = new G4PVPlacement( 0, G4ThreeVector(0,0,6958.3*mm/2-3.3*mm-6955*mm+0.07*mm/2), fLogicYoke1,
384  "_CollObj_yoke1_",fLogicBoite, false, 0);
385 
386  // --> FIRST PART
387 
388  fSolid1Gap = new G4Cons("_CollObj_gap1_", 0.*micrometer, 6*micrometer,
389  0.*micrometer,2.5*micrometer,
390  3.5*micrometer,
391  0, ((360*CLHEP::pi)/180));
392 
393  fLogic1Gap = new G4LogicalVolume(fSolid1Gap, fDefaultMaterial, "_CollObj_gap1_");
394 
395  fPhysi1Gap = new G4PVPlacement(0, G4ThreeVector(0,0,0.0315*mm), fLogic1Gap, "_CollObj_gap1_",
396  fLogicYoke1, false, 0);
397 
398 
399  // --> SECOND PART
400 
401  fSolid2Gap = new G4Cons("_CollObj_gap2_", 0.*micrometer, 15*micrometer,
402  0.*micrometer,6*micrometer,
403  6.5*micrometer,
404  0, ((360*CLHEP::pi)/180));
405 
406  fLogic2Gap = new G4LogicalVolume(fSolid2Gap, fDefaultMaterial, "_CollObj_gap2_");
407 
408  fPhysi2Gap = new G4PVPlacement(0, G4ThreeVector(0,0,0.0215*mm), fLogic2Gap, "_CollObj_gap2_",
409  fLogicYoke1, false, 0);
410 
411 
412  // --> THIRD PART
413 
414  fSolid3Gap = new G4Cons("_CollObj_gap3_", 0.*micrometer, 105*micrometer,
415  0.*micrometer,15*micrometer,
416  25*micrometer,
417  0, ((360*CLHEP::pi)/180));
418 
419  fLogic3Gap = new G4LogicalVolume(fSolid3Gap, fDefaultMaterial, "_CollObj_gap3_");
420 
421  fPhysi3Gap = new G4PVPlacement(0, G4ThreeVector(0,0,-0.010*mm), fLogic3Gap, "_CollObj_gap3_", fLogicYoke1,
422  false, 0);
423 
424 
425  //************************
426  // GAS DETECTOR COLLIMATOR
427  //************************
428 
429  fSolidYoke2 = new G4Box("_CollDet_yoke_", 2.5*cm, 2.5*cm, 0.035*mm);
430 
432 
433  fPhysiYoke2 = new G4PVPlacement(0,
434  G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm-0.1*mm-1*mm-2.5*mm-0.070*mm/2),
435  fLogicYoke2, "_CollDet_yoke_", fLogicBoite, false, 0);
436 
437  // --> FIRST PART
438 
439  fSolid4Gap = new G4Cons("_CollDet_gap4_", 0.*micrometer, 8*micrometer,
440  0.*micrometer,5*micrometer,
441  7.5*micrometer,
442  0, ((360*CLHEP::pi)/180));
443 
444  fLogic4Gap = new G4LogicalVolume(fSolid4Gap, fDefaultMaterial, "_CollDet_gap4_");
445 
446  fPhysi4Gap = new G4PVPlacement(0, G4ThreeVector(0,0,0.0275*mm), fLogic4Gap, "_CollDet_gap4_",
447  fLogicYoke2, false, 0);
448 
449  // --> SECOND PART
450 
451  fSolid5Gap = new G4Cons("_CollDet_gap5_", 0.*micrometer, 105*micrometer,
452  0.*micrometer,8*micrometer,
453  27.5*micrometer,
454  0, ((360*CLHEP::pi)/180));
455 
456  fLogic5Gap = new G4LogicalVolume(fSolid5Gap, fDefaultMaterial, "_CollDet_gap5_");
457 
458  fPhysi5Gap = new G4PVPlacement(0,
459  G4ThreeVector(0,0,-0.0075*mm),
460  fLogic5Gap,
461  "_CollDet_gap5_",
462  fLogicYoke2,
463  false,
464  0);
465  // ************
466  // GAS DETECTOR
467  // ************
468 
469  fSolidBoiteIso = new G4Box("Isobutane", 2.5*cm, 2.5*cm, 1.75*mm);
470 
472 
474  G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm-0.1*mm-3.5*mm/2),
475  "Isobutane",
477  fPhysiBoite,
478  false,
479  0);
480 
481  // --> GAS DETECTOR END CAP
482 
483  fSolidCathode = new G4Box("_Laiton_", 2.5*cm, 2.5*cm, 0.5*mm);
484 
486 
488  G4ThreeVector(0,0,1.25*mm),
489  "_Laiton_",
492  false, 0);
493 
494  // --> ISOBUTANE GAS
495 
496  fSolidIso = new G4Box("_Iso_", 1.*mm, 1.*mm, 0.499925*mm);
497 
499 
500  fPhysiIso = new G4PVPlacement(0,
501  G4ThreeVector(0,0,-0.000075*mm),
502  "_Iso_",
503  fLogicIso,
505  false,
506  0);
507 
508  // --> Si3N4 WINDOW
509 
510  fSolidVerre = new G4Box("_Si3N4_", 0.5*mm, 0.5*mm, 0.075*micrometer);
511 
513 
514 
515  fPhysiVerre = new G4PVPlacement(0,
516  G4ThreeVector(0,0,0.499925*mm),
517  "_Si3N4_",
518  fLogicVerre,
520  false,
521  0);
522  // *******
523  // AIR GAP
524  // *******
525 
526  fSolidBoite2 = new G4Box("_Air_", 2.5*cm, 2.5*cm, 0.1*mm/2);
527 
529 
530  fPhysiBoite2 = new G4PVPlacement(0,
531  G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm-0.1*mm/2),
532  "_Air_",
533  fLogicBoite2,
534  fPhysiBoite,
535  false,
536  0);
537 
538  //*************
539  // CELL SUPPORT
540  //*************
541 
542  fSolidBoite3 = new G4Box("Polyprop", 2.5*cm, 2.5*cm, 0.004*mm/2);
543 
545 
546  fPhysiBoite3 = new G4PVPlacement(0,
547  G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm-0.004*mm/2),
548  "Polyprop",
549  fLogicBoite3,
550  fPhysiBoite,
551  false,
552  0);
553  //****
554  // KGM
555  //****
556 
557  fSolidKgm = new G4Box("KGM", 2.5*cm, 2.5*cm, 3*mm/2);
558 
560 
561  fPhysiKgm = new G4PVPlacement(0,
562  G4ThreeVector(0,0,6958.3*mm/2-0.3*mm-3*mm/2),
563  "KGM",
564  fLogicKgm,
565  fPhysiBoite,
566  false,
567  0);
568 
569  //*****************
570  // MICROSCOPE PLATE
571  //*****************
572 
573  fSolidVerre2 = new G4Box("_Lame_", 2.5*cm, 2.5*cm, 0.150*mm);
574 
576 
577  fPhysiVerre2 = new G4PVPlacement(0,
578  G4ThreeVector(0,0,6958.3*mm/2-0.3*mm/2),
579  "_Lame_",
580  fLogicVerre2,
581  fPhysiBoite,
582  false,
583  0);
584 
585  // **************
586  // CELL CYTOPLASM
587  // **************
588 
589  // WITHIN KGM
590 /*
591  fSolidCyto=new G4Ellipsoid("CYTO",25*micrometer, 25*micrometer, 11*micrometer);
592 
593  fLogicCyto=new G4LogicalVolume (fSolidCyto, fDefaultMaterial, "CYTO");
594 
595  fPhysiCyto=new G4PVPlacement(0, G4ThreeVector(0,0,-1.5*mm+11*micrometer),"CYTO",fLogicCyto, fPhysiKgm, false, 0);
596 */
597 
598  // ************
599  // CELL PHANTOM
600  // ************
601 
606 
607  fSolidPhantom = new G4Box("Phantom",
611 
613 
615 
617 
619 
621  "Phantom", // their name
622  fLogicPhantom, // their logical volumr
623  //logicCyto, // Mother logical volume is Cyto
624  fLogicKgm, // Mother logical volume is Kgm
625  kUndefined, // Are placed along this axis
626  fMyCellParameterisation->GetPhantomTotalPixels(), // Number of boxes
627  fMyCellParameterisation,false); // The parametrisation
628 
629  G4cout << " ==========> The phantom contains " << fMyCellParameterisation->GetPhantomTotalPixels() << " voxels " << G4endl;
630  G4cout << " ==========> Nucleus mass (kg)=" << fMyCellParameterisation->GetNucleusMass() / kg << G4endl;
631  G4cout << " ==========> Cytoplasm mass (kg)=" << fMyCellParameterisation->GetCytoplasmMass()/ kg << G4endl;
632  G4cout << " ==========> Voxel size X (um)=" << fMyCellParameterisation->GetPixelSizeX()/um << G4endl;
633  G4cout << " ==========> Voxel size Y (um)=" << fMyCellParameterisation->GetPixelSizeY()/um << G4endl;
634  G4cout << " ==========> Voxel size Z (um)=" << fMyCellParameterisation->GetPixelSizeZ()/um << G4endl;
635  G4cout << G4endl;
636 
637  // VISUALISATION ATTRIBUTES (for phantom, see in Parameterisation class)
638 
639  G4VisAttributes* simpleWorldVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White
640  simpleWorldVisAtt->SetVisibility(true);
641 
642  G4VisAttributes* simplePlain= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White
643  simplePlain->SetVisibility(true);
644  simplePlain->SetForceSolid(true);
645 
646  G4VisAttributes* simpleBoxAttLine= new G4VisAttributes(G4Colour(1.0,0.0,0.0));
647  simpleBoxAttLine->SetVisibility(true);
648 
649  G4VisAttributes* simpleBoxAtt= new G4VisAttributes(G4Colour(1.0,1.0,0.0));
650  simpleBoxAtt->SetDaughtersInvisible(false);
651  simpleBoxAtt->SetForceSolid(false);
652 
653  G4VisAttributes* simpleBoxAtt2= new G4VisAttributes(G4Colour(0.0,1.0,0.0));
654  simpleBoxAtt2->SetDaughtersInvisible(false);
655  simpleBoxAtt2->SetForceSolid(false);
656 
657  G4VisAttributes* simpleBoxAttKGM= new G4VisAttributes(G4Colour(0.0,0.0,1.0));
658  simpleBoxAttKGM->SetDaughtersInvisible(false);
659  simpleBoxAttKGM->SetForceSolid(false);
660 
661  G4VisAttributes* simpleBoxAttPropyl= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
662  simpleBoxAttPropyl->SetDaughtersInvisible(true);
663  simpleBoxAttPropyl->SetForceSolid(false);
664 
665  G4VisAttributes* simpleBoxAttAir= new G4VisAttributes(G4Colour(0.0,1.0,0.0));
666  simpleBoxAttAir->SetDaughtersInvisible(true);
667  simpleBoxAttAir->SetForceSolid(false);
668 
669  G4VisAttributes* simpleBoxAtt3= new G4VisAttributes(G4Colour(0.0,0.0,1.0));
670  simpleBoxAtt3->SetDaughtersInvisible(false);
671  simpleBoxAtt3->SetForceSolid(false);
672 
673  fLogicYoke1->SetVisAttributes(simpleBoxAtt);
674  fLogic1Gap->SetVisAttributes(simpleBoxAtt);
675  fLogic2Gap->SetVisAttributes(simpleBoxAtt);
676  fLogic3Gap->SetVisAttributes(simpleBoxAtt);
677  fLogicYoke2->SetVisAttributes(simpleBoxAtt);
678  fLogic4Gap->SetVisAttributes(simpleBoxAtt);
679  fLogic5Gap->SetVisAttributes(simpleBoxAtt);
680  fLogicBoite->SetVisAttributes(simpleBoxAttLine);
681  fLogicCathode->SetVisAttributes(simpleBoxAttPropyl);
682  fLogicIso->SetVisAttributes(simpleBoxAttPropyl);
683  fLogicBoiteIso->SetVisAttributes(simpleBoxAttPropyl);
684  fLogicVerre->SetVisAttributes(simpleBoxAtt);
685  fLogicBoite2->SetVisAttributes(simpleBoxAttAir);
686  fLogicBoite3->SetVisAttributes(simpleBoxAtt);
687  fLogicKgm->SetVisAttributes(simpleBoxAttKGM);
688  fLogicVerre2->SetVisAttributes(simpleBoxAtt);
689 
690  return fPhysiWorld;
691 }
692 
693 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
694 
696 {
697  if(!fField) { fField = new EMField(); }
698 
700  G4MagIntegratorStepper* fStepper = new G4ClassicalRK4 (fEquation,8);
701  G4FieldManager* fFieldMgr =
703 
704  // Relaxed
705  G4MagInt_Driver* fIntgrDriver =
706  new G4MagInt_Driver(1*mm,fStepper,fStepper->GetNumberOfVariables() );
707 
708  G4ChordFinder* fChordFinder = new G4ChordFinder(fIntgrDriver);
709  fFieldMgr->SetChordFinder(fChordFinder);
710  fFieldMgr->SetDetectorField(fField);
711 
712  // FOLLOWING PARAMETERS TUNED FROM RAY-TRACING SIMULATIONS OF THE AIFIRA NANOBEAM LINE
713  /*
714  fFieldMgr->GetChordFinder()->SetDeltaChord(1e-9*m);
715  fFieldMgr->SetDeltaIntersection(1e-9*m);
716  fFieldMgr->SetDeltaOneStep(1e-9*m);
717 
718  fPropInField =
719  G4TransportationManager::GetTransportationManager()->GetPropagatorInField();
720  fPropInField->SetMinimumEpsilonStep(1e-16); // instead of 11
721  fPropInField->SetMaximumEpsilonStep(1e-15); // instead of 10
722  */
723 }