Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/electromagnetic/TestEm11/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 ]

Diff markup

Differences between /examples/extended/electromagnetic/TestEm11/src/DetectorConstruction.cc (Version 11.3.0) and /examples/extended/electromagnetic/TestEm11/src/DetectorConstruction.cc (Version 9.6.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 /// \file electromagnetic/TestEm11/src/Detecto     26 /// \file electromagnetic/TestEm11/src/DetectorConstruction.cc
 27 /// \brief Implementation of the DetectorConst     27 /// \brief Implementation of the DetectorConstruction class
 28 //                                                 28 //
                                                   >>  29 // $Id$
 29 //                                                 30 //
 30 //....oooOO0OOooo........oooOO0OOooo........oo     31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 31 //....oooOO0OOooo........oooOO0OOooo........oo     32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 32                                                    33 
 33 #include "DetectorConstruction.hh"                 34 #include "DetectorConstruction.hh"
 34                                                << 
 35 #include "DetectorMessenger.hh"                    35 #include "DetectorMessenger.hh"
 36                                                    36 
 37 #include "G4AutoDelete.hh"                     <<  37 #include "G4NistManager.hh"
                                                   >>  38 #include "G4Material.hh"
 38 #include "G4Box.hh"                                39 #include "G4Box.hh"
 39 #include "G4GeometryManager.hh"                << 
 40 #include "G4GlobalMagFieldMessenger.hh"        << 
 41 #include "G4LogicalVolume.hh"                      40 #include "G4LogicalVolume.hh"
 42 #include "G4LogicalVolumeStore.hh"             << 
 43 #include "G4Material.hh"                       << 
 44 #include "G4NistManager.hh"                    << 
 45 #include "G4PVPlacement.hh"                        41 #include "G4PVPlacement.hh"
 46 #include "G4PVReplica.hh"                          42 #include "G4PVReplica.hh"
 47 #include "G4PhysicalConstants.hh"              <<  43 #include "G4UniformMagField.hh"
                                                   >>  44 
                                                   >>  45 #include "G4GeometryManager.hh"
 48 #include "G4PhysicalVolumeStore.hh"                46 #include "G4PhysicalVolumeStore.hh"
 49 #include "G4RunManager.hh"                     <<  47 #include "G4LogicalVolumeStore.hh"
 50 #include "G4SolidStore.hh"                         48 #include "G4SolidStore.hh"
 51 #include "G4SystemOfUnits.hh"                  <<  49 
 52 #include "G4UImanager.hh"                          50 #include "G4UImanager.hh"
 53 #include "G4UniformMagField.hh"                << 
 54 #include "G4UnitsTable.hh"                         51 #include "G4UnitsTable.hh"
 55                                                <<  52 #include "G4PhysicalConstants.hh"
                                                   >>  53 #include "G4SystemOfUnits.hh"
 56 #include <iomanip>                                 54 #include <iomanip>
 57                                                    55 
 58 //....oooOO0OOooo........oooOO0OOooo........oo     56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 59                                                    57 
 60 DetectorConstruction::DetectorConstruction()       58 DetectorConstruction::DetectorConstruction()
                                                   >>  59 :fDefaultMaterial(0),fPhysiWorld(0),fMagField(0)
 61 {                                                  60 {
 62   // default parameter values of the absorbers     61   // default parameter values of the absorbers
 63   fNbOfAbsor = 1;                                  62   fNbOfAbsor = 1;
 64   fAbsorThickness[0] = 0. * mm;  // dummy, for <<  63   fAbsorThickness[0] = 0*mm;        //dummy, for initialization   
 65   fAbsorThickness[1] = 1. * mm;                <<  64   fAbsorThickness[1] = 1*mm;  
 66   fAbsorSizeYZ = 1. * mm;                      <<  65   fAbsorSizeYZ       = 1.*mm;
 67   for (G4int iAbs = 0; iAbs < kMaxAbsor; iAbs+ <<  66   for (G4int iAbs=0; iAbs<MaxAbsor; iAbs++) {
 68     fNbOfDivisions[iAbs] = 1;                  <<  67     fNbOfDivisions[iAbs]  = 1;
 69   }                                            <<  68   }  
 70   ComputeParameters();                             69   ComputeParameters();
 71                                                    70 
 72   // materials                                     71   // materials
 73   DefineMaterials();                               72   DefineMaterials();
 74   SetAbsorMaterial(1, "G4_Si");                <<  73   SetAbsorMaterial(1,"G4_Si");
 75                                                    74 
 76   // create commands for interactive definitio     75   // create commands for interactive definition of the calorimeter
 77   fDetectorMessenger = new DetectorMessenger(t     76   fDetectorMessenger = new DetectorMessenger(this);
 78 }                                                  77 }
 79                                                    78 
 80 //....oooOO0OOooo........oooOO0OOooo........oo     79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 81                                                    80 
 82 DetectorConstruction::~DetectorConstruction()      81 DetectorConstruction::~DetectorConstruction()
 83 {                                                  82 {
 84   delete fDetectorMessenger;                       83   delete fDetectorMessenger;
 85 }                                                  84 }
 86                                                    85 
 87 //....oooOO0OOooo........oooOO0OOooo........oo     86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 88                                                    87 
 89 G4VPhysicalVolume* DetectorConstruction::Const     88 G4VPhysicalVolume* DetectorConstruction::Construct()
 90 {                                                  89 {
 91   return ConstructVolumes();                       90   return ConstructVolumes();
 92 }                                                  91 }
 93                                                    92 
 94 //....oooOO0OOooo........oooOO0OOooo........oo     93 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 95                                                    94 
 96 void DetectorConstruction::DefineMaterials()       95 void DetectorConstruction::DefineMaterials()
 97 {                                                  96 {
 98   G4NistManager* man = G4NistManager::Instance     97   G4NistManager* man = G4NistManager::Instance();
 99                                                <<  98   
100   man->FindOrBuildMaterial("G4_Al");           <<  99   G4bool isotopes = false;
101   man->FindOrBuildMaterial("G4_Si");           << 100   
102   man->FindOrBuildMaterial("G4_Fe");           << 101   man->FindOrBuildMaterial("G4_Al", isotopes);
103   man->FindOrBuildMaterial("G4_Cu");           << 102   man->FindOrBuildMaterial("G4_Si", isotopes);
104   man->FindOrBuildMaterial("G4_Ge");           << 103   man->FindOrBuildMaterial("G4_Fe", isotopes);
105   man->FindOrBuildMaterial("G4_Mo");           << 104   man->FindOrBuildMaterial("G4_Cu", isotopes);  
106   man->FindOrBuildMaterial("G4_Ta");           << 105   man->FindOrBuildMaterial("G4_Ge", isotopes);
107   man->FindOrBuildMaterial("G4_W");            << 106   man->FindOrBuildMaterial("G4_Mo", isotopes);
108   man->FindOrBuildMaterial("G4_Au");           << 107   man->FindOrBuildMaterial("G4_Ta", isotopes);
109   man->FindOrBuildMaterial("G4_Pb");           << 108   man->FindOrBuildMaterial("G4_W" , isotopes);
110   man->FindOrBuildMaterial("G4_PbWO4");        << 109   man->FindOrBuildMaterial("G4_Au", isotopes);
111   man->FindOrBuildMaterial("G4_SODIUM_IODIDE") << 110   man->FindOrBuildMaterial("G4_Pb", isotopes);  
112                                                << 111   man->FindOrBuildMaterial("G4_PbWO4", isotopes);
113   man->FindOrBuildMaterial("G4_AIR");          << 112   man->FindOrBuildMaterial("G4_SODIUM_IODIDE", isotopes);
114   man->FindOrBuildMaterial("G4_WATER");        << 113   
115                                                << 114   man->FindOrBuildMaterial("G4_AIR"  , isotopes);
116   G4Element* H = man->FindOrBuildElement("H"); << 115   man->FindOrBuildMaterial("G4_WATER", isotopes);
117   G4Element* O = man->FindOrBuildElement("O"); << 116   
118                                                << 117   G4Element* H = man->FindOrBuildElement("H", isotopes); 
119   G4Material* H2O = new G4Material("Water", 1. << 118   G4Element* O = man->FindOrBuildElement("O", isotopes);
                                                   >> 119   
                                                   >> 120   G4Material* H2O = 
                                                   >> 121   new G4Material("Water", 1.000*g/cm3, 2);
120   H2O->AddElement(H, 2);                          122   H2O->AddElement(H, 2);
121   H2O->AddElement(O, 1);                          123   H2O->AddElement(O, 1);
122   H2O->GetIonisation()->SetMeanExcitationEnerg << 124   H2O->GetIonisation()->SetMeanExcitationEnergy(78.0*eV);
123                                                << 
124   G4double density = universe_mean_density;  / << 
125   G4double pressure = 3.e-18 * pascal;         << 
126   G4double temperature = 2.73 * kelvin;        << 
127   G4Material* Galactic =                       << 
128     new G4Material("Galactic", 1., 1.008 * g / << 
129                                                   125 
                                                   >> 126   G4double density     = universe_mean_density;    //from PhysicalConstants.h
                                                   >> 127   G4double pressure    = 3.e-18*pascal;
                                                   >> 128   G4double temperature = 2.73*kelvin;
                                                   >> 129   G4Material* Galactic =   
                                                   >> 130   new G4Material("Galactic", 1., 1.008*g/mole, density,
                                                   >> 131                              kStateGas,temperature,pressure);
                                                   >> 132                              
130   fDefaultMaterial = Galactic;                    133   fDefaultMaterial = Galactic;
131                                                << 134   
132   //  G4cout << *(G4Material::GetMaterialTable    135   //  G4cout << *(G4Material::GetMaterialTable()) << G4endl;
133 }                                                 136 }
134                                                   137 
135 //....oooOO0OOooo........oooOO0OOooo........oo    138 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
136                                                   139 
137 void DetectorConstruction::ComputeParameters()    140 void DetectorConstruction::ComputeParameters()
138 {                                                 141 {
139   // Compute total thickness of absorbers         142   // Compute total thickness of absorbers
140   fAbsorSizeX = 0.;                               143   fAbsorSizeX = 0.;
141   for (G4int iAbs = 1; iAbs <= fNbOfAbsor; iAb << 144   for (G4int iAbs=1; iAbs<=fNbOfAbsor; iAbs++) {
142     fAbsorSizeX += fAbsorThickness[iAbs];         145     fAbsorSizeX += fAbsorThickness[iAbs];
143   }                                               146   }
144 }                                                 147 }
145                                                   148 
146 //....oooOO0OOooo........oooOO0OOooo........oo    149 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
147                                                   150 
148 G4VPhysicalVolume* DetectorConstruction::Const    151 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
149 {                                                 152 {
150   // complete the Calor parameters definition     153   // complete the Calor parameters definition
151   ComputeParameters();                            154   ComputeParameters();
152                                                   155 
153   // Cleanup old geometry                         156   // Cleanup old geometry
154   G4GeometryManager::GetInstance()->OpenGeomet    157   G4GeometryManager::GetInstance()->OpenGeometry();
155   G4PhysicalVolumeStore::GetInstance()->Clean(    158   G4PhysicalVolumeStore::GetInstance()->Clean();
156   G4LogicalVolumeStore::GetInstance()->Clean()    159   G4LogicalVolumeStore::GetInstance()->Clean();
157   G4SolidStore::GetInstance()->Clean();           160   G4SolidStore::GetInstance()->Clean();
158                                                   161 
159   //                                              162   //
160   // World                                        163   // World
161   //                                              164   //
162   G4Box* solidWorld = new G4Box("World",  // n << 165   G4Box* solidWorld =
163                                 fAbsorSizeX /  << 166     new G4Box("World",                                                //name
164                                                << 167                fAbsorSizeX/2,fAbsorSizeYZ/2,fAbsorSizeYZ/2);        //size
165   G4LogicalVolume* logicWorld = new G4LogicalV << 168 
166                                                << 169   G4LogicalVolume* logicWorld =
167                                                << 170     new G4LogicalVolume(solidWorld,                //solid
168                                                << 171                         fDefaultMaterial,        //material
169   fPhysiWorld = new G4PVPlacement(0,  // no ro << 172                         "World");                //name
170                                   G4ThreeVecto << 173 
171                                   logicWorld,  << 174   fPhysiWorld = 
172                                   "World",  // << 175     new G4PVPlacement(0,                        //no rotation
173                                   0,  // mothe << 176                         G4ThreeVector(),                //at (0,0,0)
174                                   false,  // n << 177                       logicWorld,                //logical volume
175                                   0);  // copy << 178                       "World",                        //name
176                                                << 179                        0,                        //mother volume
                                                   >> 180                        false,                        //no boolean operation
                                                   >> 181                        0);                       //copy number
                                                   >> 182                                  
177   //                                              183   //
178   // Absorbers                                    184   // Absorbers
179   //                                              185   //
180   fXfront[0] = -0.5 * fAbsorSizeX;             << 186   fXfront[0] = -0.5*fAbsorSizeX;
181   //                                              187   //
182   for (G4int k = 1; k <= fNbOfAbsor; k++) {    << 188   for (G4int k=1; k<=fNbOfAbsor; k++) {
183     G4Material* material = fAbsorMaterial[k];     189     G4Material* material = fAbsorMaterial[k];
184     G4String matname = material->GetName();       190     G4String matname = material->GetName();
185                                                << 191       
186     G4Box* solidAbsor =                           192     G4Box* solidAbsor =
187       new G4Box(matname, fAbsorThickness[k] /  << 193       new G4Box(matname,fAbsorThickness[k]/2,fAbsorSizeYZ/2,fAbsorSizeYZ/2);
188                                                << 
189     G4LogicalVolume* logicAbsor = new G4Logica << 
190                                                << 
191                                                << 
192                                                << 
193     fXfront[k] = fXfront[k - 1] + fAbsorThickn << 
194     G4double xcenter = fXfront[k] + 0.5 * fAbs << 
195     G4ThreeVector position = G4ThreeVector(xce << 
196                                                << 
197     new G4PVPlacement(0,  // no rotation       << 
198                       position,  // position   << 
199                       logicAbsor,  // logical  << 
200                       matname,  // name        << 
201                       logicWorld,  // mother   << 
202                       false,  // no boulean op << 
203                       k);  // copy number      << 
204                                                   194 
                                                   >> 195     G4LogicalVolume* logicAbsor =
                                                   >> 196       new G4LogicalVolume(solidAbsor,            // solid
                                                   >> 197                           material,                 // material
                                                   >> 198                           matname);             // name
                                                   >> 199                                      
                                                   >> 200     fXfront[k] = fXfront[k-1] + fAbsorThickness[k-1];    
                                                   >> 201     G4double xcenter = fXfront[k]+0.5*fAbsorThickness[k];
                                                   >> 202     G4ThreeVector position = G4ThreeVector(xcenter,0.,0.);
                                                   >> 203   
                                                   >> 204       new G4PVPlacement(0,                           //no rotation
                                                   >> 205                               position,                   //position
                                                   >> 206                         logicAbsor,             //logical volume        
                                                   >> 207                         matname,                   //name
                                                   >> 208                         logicWorld,                //mother
                                                   >> 209                         false,                     //no boulean operat
                                                   >> 210                         k);                       //copy number
                                                   >> 211     
205     // divisions, if any                          212     // divisions, if any
206     //                                            213     //
207     G4double LayerThickness = fAbsorThickness[ << 214     G4double LayerThickness = fAbsorThickness[k]/fNbOfDivisions[k];
208     G4Box* solidLayer = new G4Box(matname, Lay << 215     G4Box* solidLayer =   
209                                                << 216       new G4Box(matname,LayerThickness/2,fAbsorSizeYZ/2,fAbsorSizeYZ/2);
210     G4LogicalVolume* logicLayer = new G4Logica << 217                        
211                                                << 218     G4LogicalVolume* logicLayer =
212                                                << 219       new G4LogicalVolume(solidLayer,        //solid
213                                                << 220                           material,        //material
214     new G4PVReplica(matname,  // name          << 221                           matname);         //name
215                     logicLayer,  // logical vo << 222                                        
216                     logicAbsor,  // mother     << 223       new G4PVReplica(matname,                        //name
217                     kXAxis,  // axis of replic << 224                             logicLayer,                //logical volume
218                     fNbOfDivisions[k],  // num << 225                             logicAbsor,                //mother
219                     LayerThickness);  // witdt << 226                       kXAxis,                        //axis of replication
                                                   >> 227                       fNbOfDivisions[k],                //number of replica
                                                   >> 228                       LayerThickness);                //witdth of replica    
220   }                                               229   }
221                                                   230 
                                                   >> 231 
222   PrintParameters();                              232   PrintParameters();
223                                                   233 
224   // always return the physical World          << 234   //always return the physical World
225   //                                              235   //
226   return fPhysiWorld;                             236   return fPhysiWorld;
227 }                                                 237 }
228                                                   238 
229 //....oooOO0OOooo........oooOO0OOooo........oo    239 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
230                                                   240 
231 void DetectorConstruction::PrintParameters()      241 void DetectorConstruction::PrintParameters()
232 {                                                 242 {
233   G4cout << "\n-------------------------------    243   G4cout << "\n-------------------------------------------------------------"
234          << "\n ---> The Absorber is " << fNbO    244          << "\n ---> The Absorber is " << fNbOfAbsor << " layers of:";
235   for (G4int i = 1; i <= fNbOfAbsor; i++) {    << 245   for (G4int i=1; i<=fNbOfAbsor; i++)
236     G4cout << "\n \t" << std::setw(16) << fAbs << 246      {
237            << G4BestUnit(fAbsorThickness[i], " << 247       G4cout << "\n \t" << std::setw(12) << fAbsorMaterial[i]->GetName() <<": "
238            << " slices";                       << 248               << std::setw(6) << G4BestUnit(fAbsorThickness[i],"Length")
239   }                                            << 249               << "  divided in " << fNbOfDivisions[i] << " slices";
240   G4cout << "\n------------------------------- << 250      }
                                                   >> 251   G4cout << "\n-------------------------------------------------------------\n"
                                                   >> 252          << G4endl;
241 }                                                 253 }
242                                                   254 
243 //....oooOO0OOooo........oooOO0OOooo........oo    255 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
244                                                   256 
245 void DetectorConstruction::SetNbOfAbsor(G4int     257 void DetectorConstruction::SetNbOfAbsor(G4int ival)
246 {                                                 258 {
247   // set the number of Absorbers                  259   // set the number of Absorbers
248   //                                              260   //
249   if (ival < 1 || ival > (kMaxAbsor - 1)) {    << 261   if (ival < 1 || ival > (MaxAbsor-1))
250     G4cout << "\n ---> warning from SetfNbOfAb << 262     { G4cout << "\n ---> warning from SetfNbOfAbsor: "
251            << kMaxAbsor - 1 << ". Command refu << 263              << ival << " must be at least 1 and and most " << MaxAbsor-1
252     return;                                    << 264              << ". Command refused" << G4endl;
253   }                                            << 265       return;
                                                   >> 266     }
254   fNbOfAbsor = ival;                              267   fNbOfAbsor = ival;
255   G4RunManager::GetRunManager()->ReinitializeG << 
256 }                                                 268 }
257                                                   269 
258 //....oooOO0OOooo........oooOO0OOooo........oo    270 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
259                                                   271 
260 void DetectorConstruction::SetAbsorMaterial(G4    272 void DetectorConstruction::SetAbsorMaterial(G4int iabs, const G4String& material)
261 {                                                 273 {
262   // search the material by its name              274   // search the material by its name
263   //                                              275   //
264   if (iabs > fNbOfAbsor || iabs <= 0) {        << 276   if (iabs > fNbOfAbsor || iabs <= 0)
265     G4cout << "\n --->warning from SetfAbsorMa << 277     { G4cout << "\n --->warning from SetfAbsorMaterial: absor number "
266            << " out of range. Command refused" << 278              << iabs << " out of range. Command refused" << G4endl;
267     return;                                    << 279       return;
268   }                                            << 280     }
269                                                   281 
270   G4Material* pttoMaterial = G4NistManager::In << 282   G4Material* pttoMaterial = 
271   if (pttoMaterial) {                          << 283     G4NistManager::Instance()->FindOrBuildMaterial(material);
272     fAbsorMaterial[iabs] = pttoMaterial;       << 284   if (pttoMaterial) fAbsorMaterial[iabs] = pttoMaterial;
273     G4RunManager::GetRunManager()->PhysicsHasB << 
274     G4cout << "\n " << pttoMaterial << G4endl; << 
275   }                                            << 
276 }                                                 285 }
277                                                   286 
278 //....oooOO0OOooo........oooOO0OOooo........oo    287 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
279                                                   288 
280 void DetectorConstruction::SetAbsorThickness(G << 289 void DetectorConstruction::SetAbsorThickness(G4int iabs,G4double val)
281 {                                                 290 {
282   // change Absorber thickness                    291   // change Absorber thickness
283   //                                              292   //
284   if (iabs > fNbOfAbsor || iabs <= 0) {        << 293   if (iabs > fNbOfAbsor || iabs <= 0)
285     G4cout << "\n --->warning from SetfAbsorTh << 294     { G4cout << "\n --->warning from SetfAbsorThickness: absor number "
286            << " out of range. Command refused" << 295              << iabs << " out of range. Command refused" << G4endl;
287     return;                                    << 296       return;
288   }                                            << 297     }
289   if (val <= DBL_MIN) {                        << 298   if (val <= DBL_MIN)
290     G4cout << "\n --->warning from SetfAbsorTh << 299     { G4cout << "\n --->warning from SetfAbsorThickness: thickness "
291            << " out of range. Command refused" << 300              << val  << " out of range. Command refused" << G4endl;
292     return;                                    << 301       return;
293   }                                            << 302     }
294   fAbsorThickness[iabs] = val;                    303   fAbsorThickness[iabs] = val;
295   G4RunManager::GetRunManager()->ReinitializeG << 
296 }                                                 304 }
297                                                   305 
298 //....oooOO0OOooo........oooOO0OOooo........oo    306 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
299                                                   307 
300 void DetectorConstruction::SetAbsorSizeYZ(G4do    308 void DetectorConstruction::SetAbsorSizeYZ(G4double val)
301 {                                                 309 {
302   // change the transverse size                   310   // change the transverse size
303   //                                              311   //
304   if (val <= DBL_MIN) {                        << 312   if (val <= DBL_MIN)
305     G4cout << "\n --->warning from SetfAbsorSi << 313     { G4cout << "\n --->warning from SetfAbsorSizeYZ: thickness "
306            << " out of range. Command refused" << 314              << val  << " out of range. Command refused" << G4endl;
307     return;                                    << 315       return;
308   }                                            << 316     }
309   fAbsorSizeYZ = val;                             317   fAbsorSizeYZ = val;
310   G4RunManager::GetRunManager()->ReinitializeG << 
311 }                                                 318 }
312                                                   319 
313 //....oooOO0OOooo........oooOO0OOooo........oo    320 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
314                                                   321 
315 void DetectorConstruction::SetNbOfDivisions(G4    322 void DetectorConstruction::SetNbOfDivisions(G4int iabs, G4int ival)
316 {                                                 323 {
317   // set the number of divisions                  324   // set the number of divisions
318   //                                              325   //
319   if (iabs > fNbOfAbsor || iabs < 1) {         << 326   if (iabs > fNbOfAbsor || iabs < 1)
320     G4cout << "\n --->warning from SetNbOfDivi << 327     { G4cout << "\n --->warning from SetNbOfDivisions: absor number "
321            << " out of range. Command refused" << 328              << iabs << " out of range. Command refused" << G4endl;
322     return;                                    << 329       return;
323   }                                            << 330     }
324                                                << 331       
325   if (ival < 1) {                              << 332   if (ival < 1)
326     G4cout << "\n --->warning from SetNbOfDivi << 333     { G4cout << "\n --->warning from SetNbOfDivisions: "
327            << " must be at least 1. Command re << 334              << ival << " must be at least 1. Command refused" << G4endl;
328     return;                                    << 335       return;
329   }                                            << 336     }
330   fNbOfDivisions[iabs] = ival;                    337   fNbOfDivisions[iabs] = ival;
331   G4RunManager::GetRunManager()->ReinitializeG << 
332 }                                                 338 }
333                                                   339 
334 //....oooOO0OOooo........oooOO0OOooo........oo    340 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
335                                                   341 
336 void DetectorConstruction::ConstructSDandField << 342 #include "G4FieldManager.hh"
                                                   >> 343 #include "G4TransportationManager.hh"
                                                   >> 344 
                                                   >> 345 void DetectorConstruction::SetMagField(G4double fieldValue)
337 {                                                 346 {
338   if (fFieldMessenger.Get() == 0) {            << 347   //apply a global uniform magnetic field along Z axis
339     // Create global magnetic field messenger. << 348   //
340     // Uniform magnetic field is then created  << 349   G4FieldManager* fieldMgr
341     // the field value is not zero.            << 350    = G4TransportationManager::GetTransportationManager()->GetFieldManager();
342     G4ThreeVector fieldValue = G4ThreeVector() << 351 
343     G4GlobalMagFieldMessenger* msg = new G4Glo << 352   if(fMagField) delete fMagField;                //delete the existing magn field
344     // msg->SetVerboseLevel(1);                << 353 
345     G4AutoDelete::Register(msg);               << 354   if(fieldValue!=0.)                        // create a new one if non nul
346     fFieldMessenger.Put(msg);                  << 355   { fMagField = new G4UniformMagField(G4ThreeVector(0.,0.,fieldValue));
                                                   >> 356     fieldMgr->SetDetectorField(fMagField);
                                                   >> 357     fieldMgr->CreateChordFinder(fMagField);
                                                   >> 358   } else {
                                                   >> 359     fMagField = 0;
                                                   >> 360     fieldMgr->SetDetectorField(fMagField);
347   }                                               361   }
                                                   >> 362 }
                                                   >> 363 
                                                   >> 364 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
                                                   >> 365 
                                                   >> 366 #include "G4RunManager.hh"
                                                   >> 367 
                                                   >> 368 void DetectorConstruction::UpdateGeometry()
                                                   >> 369 {
                                                   >> 370   G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes());
348 }                                                 371 }
349                                                   372 
350 //....oooOO0OOooo........oooOO0OOooo........oo    373 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
351                                                   374