Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/microbeam/src/DetectorConstruction.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 #include "G4AutoDelete.hh"
 40 
 41 DetectorConstruction::DetectorConstruction()
 42   
 43   :fDefaultMaterial(nullptr),fCollimatorMaterial(nullptr),fBoiteMaterial(nullptr),
 44    fCathodeMaterial(nullptr),fVerreMaterial(nullptr),fVerre2Material(nullptr),   
 45    fKgmMaterial(nullptr),fBoite2Material(nullptr),fBoite3Material(nullptr),
 46    fNucleusMaterial1(nullptr),fCytoplasmMaterial1(nullptr),
 47    fNucleusMaterial2(nullptr),fCytoplasmMaterial2(nullptr),
 48    fNucleusMaterial3(nullptr),fCytoplasmMaterial3(nullptr),
 49    fPhysiWorld(nullptr),fLogicWorld(nullptr),fSolidWorld(nullptr),
 50    fPhysiVol(nullptr),fLogicVol(nullptr),fSolidVol(nullptr),
 51    fPhysiBoite(nullptr),fLogicBoite(nullptr),fSolidBoite(nullptr),
 52    fPhysiYoke1(nullptr),fLogicYoke1(nullptr),fSolidYoke1(nullptr),
 53    fPhysi1Gap(nullptr),fLogic1Gap(nullptr),fSolid1Gap(nullptr),
 54    fPhysi2Gap(nullptr),fLogic2Gap(nullptr),fSolid2Gap(nullptr), 
 55    fPhysi3Gap(nullptr),fLogic3Gap(nullptr),fSolid3Gap(nullptr),
 56    fPhysiYoke2(nullptr),fLogicYoke2(nullptr),fSolidYoke2(nullptr),
 57    fPhysi4Gap(nullptr),fLogic4Gap(nullptr),fSolid4Gap(nullptr),
 58    fPhysi5Gap(nullptr),fLogic5Gap(nullptr),fSolid5Gap(nullptr), 
 59    fPhysiBoiteIso(nullptr),fLogicBoiteIso(nullptr),fSolidBoiteIso(nullptr),
 60    fPhysiCathode(nullptr),fLogicCathode(nullptr),fSolidCathode(nullptr), 
 61    fPhysiIso(nullptr),fLogicIso(nullptr),fSolidIso(nullptr),
 62    fPhysiVerre(nullptr),fLogicVerre(nullptr),fSolidVerre(nullptr),
 63    fPhysiBoite2(nullptr),fLogicBoite2(nullptr),fSolidBoite2(nullptr),
 64    fPhysiBoite3(nullptr),fLogicBoite3(nullptr),fSolidBoite3(nullptr),
 65    fPhysiKgm(nullptr),fLogicKgm(nullptr),fSolidKgm(nullptr),
 66    fPhysiVerre2(nullptr),fLogicVerre2(nullptr),fSolidVerre2(nullptr),
 67    fPhysiPhantom(nullptr),fLogicPhantom(nullptr),fSolidPhantom(nullptr)
 68   
 69 {
 70   DefineMaterials();
 71   
 72   // Initialisation of variables which 
 73   // will then be appropriately fixed in methods of this class
 74   // to implement the simulation geometry set-up
 75   fDensityPhantom = 0.; // in g/cm3
 76   fDensityNucleus = 0.; // in g/cm3
 77   fDensityCytoplasm = 0.; // in g/cm3
 78   fWorldSizeXY=fWorldSizeZ=0.; 
 79   fCollObjSizeXY = 0.;
 80   fCollObjSizeZ = 0.;
 81    
 82   // TARGET POSITION
 83   fCiblePositionX = 0.;
 84   fCiblePositionY = 0.;
 85   fCiblePositionZ = 0.;
 86 
 87    // MICROBEAM LINE ANGLE
 88   fLineAngle = 0.;
 89   
 90   fNbOfPixelsInPhantom=0;
 91 }  
 92 
 93 DetectorConstruction::~DetectorConstruction()
 94 {}
 95 
 96 G4VPhysicalVolume* DetectorConstruction::Construct()
 97 {
 98   if(fPhysiWorld) { return fPhysiWorld; }
 99   return ConstructLine();
100 }
101 
102 void DetectorConstruction::DefineMaterials()
103 { 
104   G4String name, symbol;             
105   G4double density;            
106   
107   G4int ncomponents, natoms,nel;
108   G4double z, a;
109   G4double fractionmass;
110   G4double temperature, pressure;
111   
112   // Define Elements 
113   
114   G4Element*   H  = new G4Element ("Hydrogen", "H", 1. ,  1.01*g/mole);
115   G4Element*   N  = new G4Element ("Nitrogen", "N", 7., 14.01*g/mole);
116   G4Element*   O  = new G4Element ("Oxygen"  , "O", 8. , 16.00*g/mole);
117   G4Element*   Ar = new G4Element ("Argon" , "Ar", 18., 39.948*g/mole );
118   G4Element*    C = new G4Element ("Carbon","C", 6., 12.011*g/mole);
119   G4Element *  Si = new G4Element ("Silicon","Si",14., 28.0855*g/mole);
120   G4Element *  Cu = new G4Element ("Cuivre","Cu",29., 63.546*g/mole);
121   G4Element *  Zn = new G4Element ("Zinc","Zn",30.,65.409*g/mole);
122   G4Element *  P  = new G4Element ("Phosphorus","P",15.,30.973761*g/mole);
123  
124   // Vacuum standard definition...
125   
126   density = universe_mean_density;
127   G4Material* vacuum = new G4Material(name="Vacuum", z=1., a=1.01*g/mole,
128               density);  
129   // Water 
130   
131   density = 1.000*g/cm3;
132   G4Material* H2O = new G4Material(name="H2O"  , density, ncomponents=2);
133   H2O->AddElement(H, natoms=2);
134   H2O->AddElement(O, natoms=1);
135  
136   // Air
137   
138   density = 1.290*mg/cm3;
139   pressure = 1*atmosphere;
140   temperature = 293.16*kelvin;
141   G4Material* Air = new G4Material(name="Air"  , density, ncomponents=2, kStateGas, temperature, pressure);
142   Air->AddElement(N, fractionmass=0.7);
143   Air->AddElement(O, fractionmass=0.3);
144   
145   // Low Pressure air
146   
147   density = (5e-6/1013.)*1.290*mg/cm3; // 5e-6 mbar is the usual beam pipe air pressure
148   pressure = 1*atmosphere;
149   temperature = 293.16*kelvin;
150   G4Material* LPAir = new G4Material(name="LPAir"  , density, ncomponents=3, kStateGas, temperature, pressure);
151   LPAir->AddElement(N, fractionmass=0.715);
152   LPAir->AddElement(O, fractionmass=0.25);
153   LPAir->AddElement(Ar, fractionmass=0.035);
154   
155   // Platinum
156   
157   a = 195.09*g/mole;
158   density = 21.4*g/cm3;
159   G4Material* Pt = new G4Material(name="Pl", z=78., a, density);
160  
161   // Butane @ 10 mbar
162   
163   density = 2.552e-2*mg/cm3;
164   pressure = 0.01*bar;
165   temperature = 293.16*kelvin;
166   G4Material* Butane = new G4Material(name = "Butane", density, nel = 2, kStateGas, temperature, pressure);
167   Butane->AddElement (C, natoms=4);
168   Butane->AddElement (H, natoms=10);
169   
170   // Polypropylene
171   
172   density = 0.9*g/cm3;
173   G4Material* Polyprop = new G4Material(name = "Polyprop", density, nel = 2);
174   Polyprop->AddElement (C,3);
175   Polyprop->AddElement (H,6);
176 
177   // Si3N4
178   
179   density = 3.44*g/cm3;
180   G4Material* Si3N4 = new G4Material(name = "Si3N4", density, nel = 2);
181   Si3N4->AddElement (Si, natoms=3);
182   Si3N4->AddElement (N, natoms=4);
183   
184   // SiO2
185   
186   density = 2.5*g/cm3;
187   G4Material* SiO2 = new G4Material(name = "SiO2", density, nel = 2);
188   SiO2->AddElement (Si, natoms=1);
189   SiO2->AddElement (O, natoms=2);
190     
191   // Brass
192   
193   density = 8.5*g/cm3;
194   G4Material* Laiton = new G4Material(name = "Laiton", density, nel = 2);
195   Laiton->AddElement (Cu,1);
196   Laiton->AddElement (Zn,1);
197 
198   // Phantom
199   
200   fDensityPhantom = 1.; // in g/cm3
201 
202   // Nucleus composition from Alard et al., Rad. Res. 158, 650 (2002) and
203   // Comp. Math. Meth. Med. 147252 (2012) 
204   //
205   // Cytoplasm composition is assumed to be water
206   
207   // Cytoplasm
208   
209   fDensityCytoplasm = 1.; // in g/cm3
210   density = fDensityCytoplasm*g/cm3;
211   G4Material* Cytoplasm1 = new G4Material(name="Cytoplasm1"  , density, ncomponents=2);
212   Cytoplasm1->AddElement(H, fractionmass=0.112);
213   Cytoplasm1->AddElement(O, fractionmass=0.888);
214  
215   // Nucleoli
216   
217   fDensityCytoplasm = 1.;  
218   // in g/cm3 (nucleoli are assumed to have the same chemical comp. as nucleus)
219   density = fDensityCytoplasm*g/cm3;
220   G4Material* Cytoplasm2 = new G4Material(name="Cytoplasm2"  , density, ncomponents=5);
221   Cytoplasm2->AddElement(H, fractionmass=0.1064);
222   Cytoplasm2->AddElement(O, fractionmass=0.745);
223   Cytoplasm2->AddElement(C, fractionmass=0.0904);
224   Cytoplasm2->AddElement(N, fractionmass=0.0321);
225   Cytoplasm2->AddElement(P, fractionmass=0.0261);
226  
227   // default is water
228   
229   fDensityCytoplasm = 1.; // in g/cm3
230   density = fDensityCytoplasm*g/cm3;
231   G4Material* Cytoplasm3 = new G4Material(name="Cytoplasm3"  , density, ncomponents=2);
232   Cytoplasm3->AddElement(H, fractionmass=0.112);
233   Cytoplasm3->AddElement(O, fractionmass=0.888);
234  
235   // Nucleus chemical composition
236 
237   fDensityNucleus = 1.; // in g/cm3
238   density = fDensityNucleus*g/cm3;
239   G4Material* Nucleus1 = new G4Material(name="Nucleus1"  , density, ncomponents=5);
240   Nucleus1->AddElement(H, fractionmass=0.1064);
241   Nucleus1->AddElement(O, fractionmass=0.745);
242   Nucleus1->AddElement(C, fractionmass=0.0904);
243   Nucleus1->AddElement(N, fractionmass=0.0321);
244   Nucleus1->AddElement(P, fractionmass=0.0261);
245  
246   fDensityNucleus = 1.; // in g/cm3
247   density = fDensityNucleus*g/cm3;
248   G4Material* Nucleus2 = new G4Material(name="Nucleus2"  , density, ncomponents=5);
249   Nucleus2->AddElement(H, fractionmass=0.1064);
250   Nucleus2->AddElement(O, fractionmass=0.745);
251   Nucleus2->AddElement(C, fractionmass=0.0904);
252   Nucleus2->AddElement(N, fractionmass=0.0321);
253   Nucleus2->AddElement(P, fractionmass=0.0261);
254  
255   // default
256   
257   fDensityNucleus = 1.; // in g/cm3
258   density = fDensityNucleus*g/cm3;
259   G4Material* Nucleus3 = new G4Material(name="Nucleus3"  , density, ncomponents=5);
260   Nucleus3->AddElement(H, fractionmass=0.1064);
261   Nucleus3->AddElement(O, fractionmass=0.745);
262   Nucleus3->AddElement(C, fractionmass=0.0904);
263   Nucleus3->AddElement(N, fractionmass=0.0321);
264   Nucleus3->AddElement(P, fractionmass=0.0261);
265  
266   // Materials in setup
267   
268   fDefaultMaterial  = vacuum;
269   fCollimatorMaterial   = Pt;
270   fBoiteMaterial    = Butane;
271   fCathodeMaterial      = Laiton;
272   fVerreMaterial        = Si3N4;
273   fVerre2Material   = SiO2;
274   fKgmMaterial    = H2O;
275   fBoite2Material       = Air;
276   fBoite3Material       = Polyprop;
277   
278   fNucleusMaterial1   = Nucleus1;
279   fCytoplasmMaterial1   = Cytoplasm1;
280   fNucleusMaterial2   = Nucleus2;
281   fCytoplasmMaterial2   = Cytoplasm2;
282   fNucleusMaterial3   = Nucleus3;
283   fCytoplasmMaterial3   = Cytoplasm3;
284   
285   // DISPLAY MATERIALS
286   G4cout << G4endl << *(G4Material::GetMaterialTable()) << G4endl;
287 
288 }
289 
290 G4VPhysicalVolume* DetectorConstruction::ConstructLine()
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            
331   fLogicVol = new G4LogicalVolume(fSolidVol,         
332           fDefaultMaterial,     
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   
362   fLogicBoite = new G4LogicalVolume(fSolidBoite, fDefaultMaterial, "Boite");
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, twopi);
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, twopi);
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, twopi);
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  
431   fLogicYoke2 = new G4LogicalVolume(fSolidYoke2, fCollimatorMaterial, "_CollDet_yoke_");
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, twopi);
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, twopi);
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   
471   fLogicBoiteIso = new G4LogicalVolume(fSolidBoiteIso, fBoiteMaterial, "Isobutane");
472   
473   fPhysiBoiteIso = new G4PVPlacement(0,
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", 
476          fLogicBoiteIso,
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   
485   fLogicCathode = new G4LogicalVolume(fSolidCathode, fCathodeMaterial, "_Laiton_");
486   
487   fPhysiCathode = new G4PVPlacement(0,
488            G4ThreeVector(0,0,1.25*mm),
489            "_Laiton_", 
490            fLogicCathode,
491            fPhysiBoiteIso,
492            false, 0);
493 
494   // --> ISOBUTANE GAS  
495   
496   fSolidIso = new G4Box("_Iso_", 1.*mm, 1.*mm, 0.499925*mm);
497   
498   fLogicIso = new G4LogicalVolume(fSolidIso, fBoiteMaterial, "_Iso_");
499   
500   fPhysiIso = new G4PVPlacement(0, 
501              G4ThreeVector(0,0,-0.000075*mm),
502              "_Iso_", 
503              fLogicIso,
504              fPhysiCathode,
505              false, 
506              0);
507 
508   // --> Si3N4 WINDOW
509   
510   fSolidVerre = new G4Box("_Si3N4_", 0.5*mm, 0.5*mm, 0.075*micrometer);
511   
512   fLogicVerre = new G4LogicalVolume(fSolidVerre, fVerreMaterial, "_Si3N4_");
513   
514   
515   fPhysiVerre = new G4PVPlacement(0,
516          G4ThreeVector(0,0,0.499925*mm),
517          "_Si3N4_", 
518          fLogicVerre,
519          fPhysiCathode,
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   
528   fLogicBoite2 = new G4LogicalVolume(fSolidBoite2, fBoite2Material, "_Air_");
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   
544   fLogicBoite3 = new G4LogicalVolume(fSolidBoite3, fBoite3Material, "Polyprop");
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 
559   fLogicKgm = new G4LogicalVolume(fSolidKgm, fKgmMaterial, "KGM");
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   
575   fLogicVerre2 = new G4LogicalVolume(fSolidVerre2, fVerre2Material, "_Lame_");
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 
602   fMyCellParameterisation = new CellParameterisation
603         (fNucleusMaterial1,fCytoplasmMaterial1,
604    fNucleusMaterial2,fCytoplasmMaterial2,
605    fNucleusMaterial3,fCytoplasmMaterial3);
606 
607   fSolidPhantom = new G4Box("Phantom", 
608     fMyCellParameterisation->GetPixelSizeX()/2, 
609   fMyCellParameterisation->GetPixelSizeY()/2, 
610   fMyCellParameterisation->GetPixelSizeZ()/2); 
611   
612   fLogicPhantom = new G4LogicalVolume(fSolidPhantom,fDefaultMaterial,"Phantom",0,0,0);
613     
614   SetNbOfPixelsInPhantom (fMyCellParameterisation->GetPhantomTotalPixels());
615 
616   SetMassNucleus(fMyCellParameterisation->GetNucleusMass());
617 
618   SetMassCytoplasm(fMyCellParameterisation->GetCytoplasmMass());
619 
620   fPhysiPhantom = new G4PVParameterised(
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 void DetectorConstruction::ConstructSDandField()
694 {
695   EMField* field = new EMField();
696   G4AutoDelete::Register(field);
697   
698   G4EqMagElectricField* fEquation = new G4EqMagElectricField(field);
699   G4MagIntegratorStepper* fStepper = new G4ClassicalRK4 (fEquation,8);
700   G4FieldManager* fFieldMgr = 
701     G4TransportationManager::GetTransportationManager()->GetFieldManager();
702 
703   // Relaxed
704   G4MagInt_Driver* fIntgrDriver = 
705     new G4MagInt_Driver(1*mm,fStepper,fStepper->GetNumberOfVariables() );
706 
707   G4ChordFinder* fChordFinder = new G4ChordFinder(fIntgrDriver);
708   fFieldMgr->SetChordFinder(fChordFinder);
709   fFieldMgr->SetDetectorField(field);
710 
711   // FOLLOWING PARAMETERS TUNED FROM RAY-TRACING SIMULATIONS OF THE AIFIRA NANOBEAM LINE
712   /*
713   fFieldMgr->GetChordFinder()->SetDeltaChord(1e-9*m);
714   fFieldMgr->SetDeltaIntersection(1e-9*m);
715   fFieldMgr->SetDeltaOneStep(1e-9*m);     
716       
717   fPropInField =
718     G4TransportationManager::GetTransportationManager()->GetPropagatorInField();
719   fPropInField->SetMinimumEpsilonStep(1e-16); // instead of 11
720   fPropInField->SetMaximumEpsilonStep(1e-15); // instead of 10
721   */
722 }
723