Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/runAndEvent/RE02/src/RE02DetectorConstruction.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/runAndEvent/RE02/src/RE02DetectorConstruction.cc (Version 11.3.0) and /examples/extended/runAndEvent/RE02/src/RE02DetectorConstruction.cc (Version 8.1.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 runAndEvent/RE02/src/RE02DetectorCon << 
 27 /// \brief Implementation of the RE02DetectorC << 
 28 //                                                 26 //
                                                   >>  27 // $Id: RE02DetectorConstruction.cc,v 1.2 2006/06/29 17:45:10 gunter Exp $
                                                   >>  28 // GEANT4 tag $Name: geant4-08-01-patch-01 $
 29 //                                                 29 //
 30 //                                             <<  30  
 31                                                << 
 32 #include "RE02DetectorConstruction.hh"             31 #include "RE02DetectorConstruction.hh"
 33                                                    32 
 34 #include "RE02NestedPhantomParameterisation.hh <<  33 #include "G4MultiFunctionalDetector.hh"
 35                                                    34 
                                                   >>  35 #include "G4PSEnergyDeposit.hh"
                                                   >>  36 //#include "G4PSDoseDeposit.hh"
                                                   >>  37 #include "G4PSNofStep.hh"
                                                   >>  38 //#include "G4PSNofSecondary.hh"
                                                   >>  39 //#include "G4PSMinKinEAtGeneration.hh"
                                                   >>  40 #include "G4PSCellFlux.hh"
                                                   >>  41 //#include "G4PSTrackLength.hh"
                                                   >>  42 //#include "G4PSPassageTrackLength.hh"
                                                   >>  43 //#include "G4PSPassageCurrent.hh"
                                                   >>  44 #include "G4PSPassageCellFlux.hh"
                                                   >>  45 #include "G4PSFlatSurfaceFlux.hh"
                                                   >>  46 #include "G4PSFlatSurfaceCurrent.hh"
                                                   >>  47 //#include "G4PSSphereSurfaceCurrent.hh"
                                                   >>  48 #include "G4SDParticleWithEnergyFilter.hh"
                                                   >>  49 #include "G4SDParticleFilter.hh"
                                                   >>  50 #include "G4SDChargedFilter.hh"
                                                   >>  51 
                                                   >>  52 #include "G4NistManager.hh"
                                                   >>  53 #include "G4Material.hh"
 36 #include "G4Box.hh"                                54 #include "G4Box.hh"
 37 #include "G4Colour.hh"                         << 
 38 #include "G4LogicalVolume.hh"                      55 #include "G4LogicalVolume.hh"
 39 #include "G4Material.hh"                       << 
 40 #include "G4NistManager.hh"                    << 
 41 #include "G4PSCellFlux3D.hh"                   << 
 42 #include "G4PSEnergyDeposit3D.hh"              << 
 43 #include "G4PSFlatSurfaceCurrent3D.hh"         << 
 44 #include "G4PSFlatSurfaceFlux3D.hh"            << 
 45 #include "G4PSNofStep3D.hh"                    << 
 46 #include "G4PSPassageCellFlux3D.hh"            << 
 47 #include "G4PVParameterised.hh"                << 
 48 #include "G4PVPlacement.hh"                        56 #include "G4PVPlacement.hh"
 49 #include "G4SDChargedFilter.hh"                << 
 50 #include "G4SDManager.hh"                          57 #include "G4SDManager.hh"
 51 #include "G4SDParticleFilter.hh"               <<  58 
 52 #include "G4SDParticleWithEnergyFilter.hh"     <<  59 #include "G4PVParameterised.hh"
 53 #include "G4SystemOfUnits.hh"                  <<  60 #include "RE02PhantomParameterisation.hh"
                                                   >>  61 
 54 #include "G4VisAttributes.hh"                      62 #include "G4VisAttributes.hh"
                                                   >>  63 #include "G4Colour.hh"
                                                   >>  64 
 55 #include "G4ios.hh"                                65 #include "G4ios.hh"
 56                                                    66 
 57 //============================================     67 //=======================================================================
 58 //  RE02DetectorConstruction                       68 //  RE02DetectorConstruction
 59 //                                                 69 //
 60 //  (Description)                                  70 //  (Description)
 61 //                                                 71 //
 62 //     Detector construction for example RE02.     72 //     Detector construction for example RE02.
 63 //                                             <<  73 //    
 64 //   [Geometry]                                <<  74 //   [Geometry] 
 65 //     The world volume is defined as 200 cm x     75 //     The world volume is defined as 200 cm x 200 cm x 200 cm box with Air.
 66 //   Water phantom is defined as  200 mm x 200     76 //   Water phantom is defined as  200 mm x 200 mm x 400 mm box with Water.
 67 //   The water phantom is divided into 100 seg <<  77 //   The water phantom is divided into 100 segments in x,y plane, and 200 segments
 68 //   replication,                              <<  78 //   perpendicular to z axis using parameterised volume.  
 69 //   and then divided into 200 segments perpen <<  79 //   These values are defined at constructor,
 70 //   parameterised volume.                     <<  80 //   e.g. the size of water phantom (fphantomSize), and number of segmentation
 71 //    These values are defined at constructor, << 
 72 //    e.g. the size of water phantom (fPhantom << 
 73 //   of water phantom (fNx, fNy, fNz).             81 //   of water phantom (fNx, fNy, fNz).
 74 //                                             <<  82 //    NIST database is used for materials.
 75 //   By default, lead plates are inserted into << 
 76 //   segments.                                 << 
 77 //   NIST database is used for materials.      << 
 78 //                                             << 
 79 //                                                 83 //
 80 //   [Scorer]                                      84 //   [Scorer]
 81 //    Assignment of G4MultiFunctionalDetector  <<  85 //    Assignment of G4MultiFunctionalDetector and G4PrimitiveScorer 
 82 //   is demonstrated in this example.              86 //   is demonstrated in this example.
 83 //       -------------------------------------     87 //       -------------------------------------------------
 84 //       The collection names of defined Primi     88 //       The collection names of defined Primitives are
 85 //        0       PhantomSD/totalEDep          <<  89 //        0       PhantomSD/totalEDep 
 86 //        1       PhantomSD/protonEDep             90 //        1       PhantomSD/protonEDep
 87 //        2       PhantomSD/protonNStep            91 //        2       PhantomSD/protonNStep
 88 //        3       PhantomSD/chargedPassCellFlu     92 //        3       PhantomSD/chargedPassCellFlux
 89 //        4       PhantomSD/chargedCellFlux    <<  93 //        4       PhantomSD/chargedCellFlux 
 90 //        5       PhantomSD/chargedSurfFlux    <<  94 //        5       PhantomSD/chargedSurfFlux 
 91 //        6       PhantomSD/gammaSurfCurr000       95 //        6       PhantomSD/gammaSurfCurr000
 92 //        7       PhantomSD/gammaSurfCurr001       96 //        7       PhantomSD/gammaSurfCurr001
 93 //        9       PhantomSD/gammaSurdCurr002       97 //        9       PhantomSD/gammaSurdCurr002
 94 //       10       PhantomSD/gammaSurdCurr003       98 //       10       PhantomSD/gammaSurdCurr003
 95 //      --------------------------------------     99 //      -------------------------------------------------
 96 //      Please see README for detail descripti    100 //      Please see README for detail description.
 97 //                                                101 //
 98 //============================================    102 //=======================================================================
 99                                                   103 
100 //....oooOO0OOooo........oooOO0OOooo........oo << 104 //
101 RE02DetectorConstruction::RE02DetectorConstruc << 105 RE02DetectorConstruction::RE02DetectorConstruction()
102 {                                                 106 {
103   // Default size of water phantom,and segment << 107     fphantomSize.setX(200.*mm);
104   fPhantomSize.setX(200. * mm);                << 108     fphantomSize.setY(200.*mm);
105   fPhantomSize.setY(200. * mm);                << 109     fphantomSize.setZ(400.*mm);
106   fPhantomSize.setZ(400. * mm);                << 110     //fNx = fNy = fNz = 100;
107   fNx = fNy = fNz = 100;                       << 111     fNx = 100; fNy = 100; fNz = 200;
108   fInsertLead = TRUE;                          << 112     //fNx = 1; fNy = 1; fNz = 200;
                                                   >> 113     G4cout << "<-- RE02DetectorConstruction -----------------" <<G4endl;
                                                   >> 114     G4cout << "  Water Phantom Size " << fphantomSize/mm << G4endl;
                                                   >> 115     G4cout << "  Segmentation  ("<< fNx<<","<<fNy<<","<<fNz<<")"<<G4endl;
                                                   >> 116     G4cout << "<---------------------------------------------"<<G4endl;
109 }                                                 117 }
110                                                   118 
111 //....oooOO0OOooo........oooOO0OOooo........oo << 119 //
112 RE02DetectorConstruction::~RE02DetectorConstru    120 RE02DetectorConstruction::~RE02DetectorConstruction()
113 {                                              << 121 {;}
114   ;                                            << 
115 }                                              << 
116                                                   122 
117 //....oooOO0OOooo........oooOO0OOooo........oo << 123 //
118 G4VPhysicalVolume* RE02DetectorConstruction::C << 124  G4VPhysicalVolume* RE02DetectorConstruction::Construct()
119 {                                                 125 {
120   //=====================                         126   //=====================
121   // Material Definitions                         127   // Material Definitions
122   //=====================                         128   //=====================
123   //                                           << 129   //  
124   //-------- NIST Materials ------------------    130   //-------- NIST Materials ----------------------------------------------------
125   //  Material Information imported from NIST     131   //  Material Information imported from NIST database.
126   //                                              132   //
127   G4NistManager* NISTman = G4NistManager::Inst    133   G4NistManager* NISTman = G4NistManager::Instance();
128   G4Material* air = NISTman->FindOrBuildMateri << 134   G4Material* Air = NISTman->FindOrBuildMaterial("G4_AIR");
129   G4Material* water = NISTman->FindOrBuildMate << 135   G4Material* H2O = NISTman->FindOrBuildMaterial("G4_WATER");
130   G4Material* lead = NISTman->FindOrBuildMater << 
131                                                   136 
132   //                                              137   //
133   // Print all the materials defined.             138   // Print all the materials defined.
134   G4cout << G4endl << "The materials defined a    139   G4cout << G4endl << "The materials defined are : " << G4endl << G4endl;
135   G4cout << *(G4Material::GetMaterialTable())     140   G4cout << *(G4Material::GetMaterialTable()) << G4endl;
136                                                   141 
                                                   >> 142 
137   //==========================================    143   //============================================================================
138   //      Definitions of Solids, Logical Volum << 144   //      Definitions of Solids, Logical Volumes, Physical Volumes 
139   //==========================================    145   //============================================================================
140                                                   146 
141   //-------------                                 147   //-------------
142   // World Volume                              << 148   // World Volume 
143   //-------------                                 149   //-------------
144                                                   150 
145   G4ThreeVector worldSize = G4ThreeVector(200  << 151   G4ThreeVector worldSize = G4ThreeVector(200*cm, 200*cm, 200*cm);
                                                   >> 152   
                                                   >> 153   G4Box * solidWorld
                                                   >> 154     = new G4Box("world", worldSize.x()/2., worldSize.y()/2., worldSize.z()/2.);
                                                   >> 155   G4LogicalVolume * logicWorld
                                                   >> 156     = new G4LogicalVolume(solidWorld, Air, "World", 0, 0, 0);
146                                                   157 
147   G4Box* solidWorld =                          << 158   // 
148     new G4Box("world", worldSize.x() / 2., wor << 
149   G4LogicalVolume* logicWorld = new G4LogicalV << 
150                                                << 
151   //                                           << 
152   //  Must place the World Physical volume unr    159   //  Must place the World Physical volume unrotated at (0,0,0).
153   G4VPhysicalVolume* physiWorld = new G4PVPlac << 160   G4VPhysicalVolume * physiWorld
154                                                << 161     = new G4PVPlacement(0,               // no rotation
155                                                << 162       G4ThreeVector(), // at (0,0,0)
156                                                << 163       logicWorld,      // its logical volume
157                                                << 164       "World",         // its name
158                                                << 165       0,               // its mother  volume
159                                                << 166       false,           // no boolean operations
160                                                << 167       0);              // copy number
                                                   >> 168          
161   //---------------                               169   //---------------
162   // Water Phantom                                170   // Water Phantom
163   //---------------                               171   //---------------
164                                                   172 
165   //................................              173   //................................
166   // Mother Volume of Water Phantom               174   // Mother Volume of Water Phantom
167   //................................              175   //................................
168                                                   176 
169   //--  Default size of water phantom is defin    177   //--  Default size of water phantom is defined at constructor.
170   G4ThreeVector phantomSize = fPhantomSize;    << 178   G4ThreeVector phantomSize = fphantomSize; 
171                                                << 179   
172   G4Box* solidPhantom =                        << 180   G4Box * solidPhantom
173     new G4Box("phantom", phantomSize.x() / 2., << 181     = new G4Box("phantom",
174   G4LogicalVolume* logicPhantom = new G4Logica << 182     phantomSize.x()/2., phantomSize.y()/2., phantomSize.z()/2.);
                                                   >> 183   G4LogicalVolume * logicPhantom
                                                   >> 184     = new G4LogicalVolume(solidPhantom, H2O, "Phantom", 0, 0, 0);  
175                                                   185 
176   G4RotationMatrix* rot = new G4RotationMatrix << 186   G4RotationMatrix* rot=new G4RotationMatrix();
177   // rot->rotateY(30.*deg);                    << 187   //rot->rotateY(30.*deg);
178   G4ThreeVector positionPhantom;                  188   G4ThreeVector positionPhantom;
179   // G4VPhysicalVolume * physiPhantom =        << 189   //G4VPhysicalVolume * physiPhantom =
180   new G4PVPlacement(rot,  // no rotation       << 190   new G4PVPlacement(rot,             // no rotation
181                     positionPhantom,  // at (x << 191         positionPhantom, // at (x,y,z)
182                     logicPhantom,  // its logi << 192         logicPhantom,    // its logical volume
183                     "Phantom",  // its name    << 193         "Phantom",       // its name
184                     logicWorld,  // its mother << 194         logicWorld,      // its mother  volume
185                     false,  // no boolean oper << 195         false,           // no boolean operations
186                     0);  // copy number        << 196         0);              // copy number 
187                                                   197 
188   //..........................................    198   //..............................................
189   // Phantom segmentation using Parameterisati    199   // Phantom segmentation using Parameterisation
190   //..........................................    200   //..............................................
191   //                                              201   //
192   G4cout << "<-- RE02DetectorConstruction::Con << 
193   G4cout << "  Water Phantom Size " << fPhanto << 
194   G4cout << "  Segmentation  (" << fNx << ","  << 
195   G4cout << "  Lead plate at even copy # (0-Fa << 
196   G4cout << "<-------------------------------- << 
197   // Number of segmentation.                      202   // Number of segmentation.
198   // - Default number of segmentation is defin    203   // - Default number of segmentation is defined at constructor.
199   G4int nxCells = fNx;                            204   G4int nxCells = fNx;
200   G4int nyCells = fNy;                            205   G4int nyCells = fNy;
201   G4int nzCells = fNz;                            206   G4int nzCells = fNz;
202                                                   207 
                                                   >> 208   G4int nCells = nxCells*nyCells*nzCells;
203   G4ThreeVector sensSize;                         209   G4ThreeVector sensSize;
204   sensSize.setX(phantomSize.x() / (G4double)nx << 210   sensSize.setX(phantomSize.x()/(G4double)nxCells);
205   sensSize.setY(phantomSize.y() / (G4double)ny << 211   sensSize.setY(phantomSize.y()/(G4double)nyCells);
206   sensSize.setZ(phantomSize.z() / (G4double)nz << 212   sensSize.setZ(phantomSize.z()/(G4double)nzCells);
207   // i.e Voxel size will be 2.0 x 2.0 x 2.0 mm    213   // i.e Voxel size will be 2.0 x 2.0 x 2.0 mm3 cube by default.
208   //                                           << 214   // 
209                                                   215 
210   // Replication of Water Phantom Volume.      << 
211   // Y Slice                                   << 
212   G4String yRepName("RepY");                   << 
213   G4VSolid* solYRep =                          << 
214     new G4Box(yRepName, phantomSize.x() / 2.,  << 
215   G4LogicalVolume* logYRep = new G4LogicalVolu << 
216   // G4PVReplica* yReplica =                   << 
217   new G4PVReplica(yRepName, logYRep, logicPhan << 
218   // X Slice                                   << 
219   G4String xRepName("RepX");                   << 
220   G4VSolid* solXRep =                          << 
221     new G4Box(xRepName, sensSize.x() / 2., sen << 
222   G4LogicalVolume* logXRep = new G4LogicalVolu << 
223   // G4PVReplica* xReplica =                   << 
224   new G4PVReplica(xRepName, logXRep, logYRep,  << 
225                                                << 
226   //                                           << 
227   //..................................            216   //..................................
228   // Voxel solid and logical volumes              217   // Voxel solid and logical volumes
229   //..................................            218   //..................................
230   // Z Slice                                   << 
231   G4String zVoxName("phantomSens");            << 
232   G4VSolid* solVoxel = new G4Box(zVoxName, sen << 
233   fLVPhantomSens = new G4LogicalVolume(solVoxe << 
234   //                                              219   //
235   //                                           << 220   G4Box * solidPhantomSens
236   std::vector<G4Material*> phantomMat(2, water << 221     = new G4Box("phantomSens",
237   if (IsLeadSegment()) phantomMat[1] = lead;   << 222     sensSize.x()/2., sensSize.y()/2., sensSize.z()/2.); 
                                                   >> 223   G4LogicalVolume * logicPhantomSens
                                                   >> 224     = new G4LogicalVolume(solidPhantomSens, H2O,"PhantomSens",0,0,0);
238   //                                              225   //
239   // Parameterisation for transformation of vo    226   // Parameterisation for transformation of voxels.
240   //  (voxel size is fixed in this example.    << 227   //  (voxel size is fixed in this example. i.e parameterisation handles
241   //  e.g. nested parameterisation handles mat << 228   //   only transfomation of voxels.)
242   RE02NestedPhantomParameterisation* paramPhan << 229   RE02PhantomParameterisation* paramPhantom
243     new RE02NestedPhantomParameterisation(sens << 230       = new RE02PhantomParameterisation(phantomSize/2.,nxCells,nyCells,nzCells);
244   // G4VPhysicalVolume * physiPhantomSens =    << 231   //G4VPhysicalVolume * physiPhantomSens =
245   new G4PVParameterised("PhantomSens",  // the << 232   new G4PVParameterised("PhantomSens",     // their name
246                         fLVPhantomSens,  // th << 233       logicPhantomSens,  // their logical volume
247                         logXRep,  // Mother lo << 234       logicPhantom,      // Mother logical volume
248                         kUndefined,  // Are pl << 235       kUndefined,        // Are placed along this axis 
249                         nzCells,  // Number of << 236       nCells,            // Number of cells
250                         paramPhantom);  // Par << 237       paramPhantom);     // Parameterisation.
251   //   Optimization flag is avaiable for,         238   //   Optimization flag is avaiable for,
252   //    kUndefined, kXAxis, kYAxis, kZAxis.       239   //    kUndefined, kXAxis, kYAxis, kZAxis.
253   //                                              240   //
254                                                   241 
255   //===============================            << 
256   //   Visualization attributes                << 
257   //===============================            << 
258                                                << 
259   G4VisAttributes* boxVisAtt = new G4VisAttrib << 
260   logicWorld->SetVisAttributes(boxVisAtt);     << 
261   // logicWorld->SetVisAttributes(G4VisAttribu << 
262                                                << 
263   // Mother volume of WaterPhantom             << 
264   G4VisAttributes* phantomVisAtt = new G4VisAt << 
265   logicPhantom->SetVisAttributes(phantomVisAtt << 
266                                                << 
267   // Replica                                   << 
268   G4VisAttributes* yRepVisAtt = new G4VisAttri << 
269   logYRep->SetVisAttributes(yRepVisAtt);       << 
270   G4VisAttributes* xRepVisAtt = new G4VisAttri << 
271   logXRep->SetVisAttributes(xRepVisAtt);       << 
272                                                << 
273   // Skip the visualization for those voxels.  << 
274   fLVPhantomSens->SetVisAttributes(G4VisAttrib << 
275                                                << 
276   return physiWorld;                           << 
277 }                                              << 
278                                                << 
279 void RE02DetectorConstruction::ConstructSDandF << 
280 {                                              << 
281   //==========================================    242   //================================================
282   // Sensitive detectors : MultiFunctionalDete    243   // Sensitive detectors : MultiFunctionalDetector
283   //==========================================    244   //================================================
284   //                                              245   //
285   //  Sensitive Detector Manager.                 246   //  Sensitive Detector Manager.
286   G4SDManager* pSDman = G4SDManager::GetSDMpoi << 247   G4SDManager* SDman = G4SDManager::GetSDMpointer();
287   //                                              248   //
288   // Sensitive Detector Name                      249   // Sensitive Detector Name
289   G4String phantomSDname = "PhantomSD";           250   G4String phantomSDname = "PhantomSD";
290                                                   251 
291   //------------------------                      252   //------------------------
292   // MultiFunctionalDetector                      253   // MultiFunctionalDetector
293   //------------------------                      254   //------------------------
294   //                                              255   //
295   // Define MultiFunctionalDetector with name.    256   // Define MultiFunctionalDetector with name.
296   G4MultiFunctionalDetector* mFDet = new G4Mul << 257   G4MultiFunctionalDetector* MFDet = new G4MultiFunctionalDetector(phantomSDname);
297   pSDman->AddNewDetector(mFDet);  // Register  << 258   SDman->AddNewDetector( MFDet );                 // Register SD to SDManager.
298   fLVPhantomSens->SetSensitiveDetector(mFDet); << 259   logicPhantomSens->SetSensitiveDetector(MFDet);  // Assign SD to the logical volume.
299                                                   260 
300   //---------------------------------------       261   //---------------------------------------
301   // SDFilter : Sensitive Detector Filters        262   // SDFilter : Sensitive Detector Filters
302   //---------------------------------------       263   //---------------------------------------
303   //                                              264   //
304   // Particle Filter for Primitive Scorer with << 265   // Particle Filter for Primitive Scorer with filter name(fltName) 
305   // and particle name(particleName),             266   // and particle name(particleName),
306   // or particle names are given by add("parti    267   // or particle names are given by add("particle name"); method.
307   //                                              268   //
308   G4String fltName, particleName;              << 269   G4String fltName,particleName;
309   //                                              270   //
310   //-- proton filter                              271   //-- proton filter
311   G4SDParticleFilter* protonFilter =           << 272   G4SDParticleFilter* protonFilter = 
312     new G4SDParticleFilter(fltName = "protonFi << 273       new G4SDParticleFilter(fltName="protonFilter", particleName="proton");
313   //                                              274   //
314   //-- electron filter                            275   //-- electron filter
315   G4SDParticleFilter* electronFilter = new G4S << 276   G4SDParticleFilter* electronFilter = 
316   electronFilter->add(particleName = "e+");  / << 277       new G4SDParticleFilter(fltName="electronFilter");
317   electronFilter->add(particleName = "e-");  / << 278   electronFilter->add(particleName="e+");   // accept electrons.
                                                   >> 279   electronFilter->add(particleName="e-");   // accept positorons.
318   //                                              280   //
319   //-- charged particle filter                    281   //-- charged particle filter
320   G4SDChargedFilter* chargedFilter = new G4SDC << 282   G4SDChargedFilter* chargedFilter = 
                                                   >> 283       new G4SDChargedFilter(fltName="chargedFilter");
321                                                   284 
322   //------------------------                      285   //------------------------
323   // PS : Primitive Scorers                       286   // PS : Primitive Scorers
324   //------------------------                      287   //------------------------
325   // Primitive Scorers are used with SDFilters    288   // Primitive Scorers are used with SDFilters according to your purpose.
326   //                                           << 289   // 
327   //                                              290   //
328   //-- Primitive Scorer for Energy Deposit.       291   //-- Primitive Scorer for Energy Deposit.
329   //      Total, by protons, by electrons.        292   //      Total, by protons, by electrons.
330   G4String psName;                                293   G4String psName;
331   G4PSEnergyDeposit3D* scorer0 = new G4PSEnerg << 294   G4PSEnergyDeposit*      scorer0 = new G4PSEnergyDeposit(psName="totalEDep");
332   G4PSEnergyDeposit3D* scorer1 = new G4PSEnerg << 295   G4PSEnergyDeposit*      scorer1 = new G4PSEnergyDeposit(psName="protonEDep");
333   scorer1->SetFilter(protonFilter);               296   scorer1->SetFilter(protonFilter);
334                                                   297 
335   //                                              298   //
336   //-- Number of Steps for protons                299   //-- Number of Steps for protons
337   G4PSNofStep3D* scorer2 = new G4PSNofStep3D(p << 300   G4PSNofStep*   scorer2 = new G4PSNofStep(psName="protonNStep");
338   scorer2->SetFilter(protonFilter);               301   scorer2->SetFilter(protonFilter);
339                                                   302 
340   //                                              303   //
341   //-- CellFlux for charged particles             304   //-- CellFlux for charged particles
342   G4PSPassageCellFlux3D* scorer3 =             << 305   G4PSPassageCellFlux*    scorer3 = new G4PSPassageCellFlux(psName="chargedPassCellFlux");
343     new G4PSPassageCellFlux3D(psName = "charge << 306   G4PSCellFlux*           scorer4 = new G4PSCellFlux(psName="chargedCellFlux");
344   G4PSCellFlux3D* scorer4 = new G4PSCellFlux3D << 307   G4PSFlatSurfaceFlux*    scorer5 = new G4PSFlatSurfaceFlux(psName="chargedSurfFlux",fFlux_InOut);
345   G4PSFlatSurfaceFlux3D* scorer5 =             << 
346     new G4PSFlatSurfaceFlux3D(psName = "charge << 
347   scorer3->SetFilter(chargedFilter);              308   scorer3->SetFilter(chargedFilter);
348   scorer4->SetFilter(chargedFilter);              309   scorer4->SetFilter(chargedFilter);
349   scorer5->SetFilter(chargedFilter);              310   scorer5->SetFilter(chargedFilter);
350                                                   311 
351   //                                              312   //
352   //------------------------------------------    313   //------------------------------------------------------------
353   //  Register primitive scorers to MultiFunct    314   //  Register primitive scorers to MultiFunctionalDetector
354   //------------------------------------------    315   //------------------------------------------------------------
355   mFDet->RegisterPrimitive(scorer0);           << 316   MFDet->RegisterPrimitive(scorer0);
356   mFDet->RegisterPrimitive(scorer1);           << 317   MFDet->RegisterPrimitive(scorer1);
357   mFDet->RegisterPrimitive(scorer2);           << 318   MFDet->RegisterPrimitive(scorer2);
358   mFDet->RegisterPrimitive(scorer3);           << 319   MFDet->RegisterPrimitive(scorer3);
359   mFDet->RegisterPrimitive(scorer4);           << 320   MFDet->RegisterPrimitive(scorer4);
360   mFDet->RegisterPrimitive(scorer5);           << 321   MFDet->RegisterPrimitive(scorer5);
                                                   >> 322 
361                                                   323 
362   //========================                      324   //========================
363   // More additional Primitive Scoreres           325   // More additional Primitive Scoreres
364   //========================                      326   //========================
365   //                                              327   //
366   //--- Surface Current for gamma with energy     328   //--- Surface Current for gamma with energy bin.
367   // This example creates four primitive score    329   // This example creates four primitive scorers.
368   //  4 bins with energy   ---   Primitive Sco    330   //  4 bins with energy   ---   Primitive Scorer Name
369   //    1.     to  10 KeV,        gammaSurfCur    331   //    1.     to  10 KeV,        gammaSurfCurr000
370   //   10 keV  to 100 KeV,        gammaSurfCur    332   //   10 keV  to 100 KeV,        gammaSurfCurr001
371   //  100 keV  to   1 MeV,        gammaSurfCur    333   //  100 keV  to   1 MeV,        gammaSurfCurr002
372   //    1 MeV  to  10 MeV.        gammaSurfCur    334   //    1 MeV  to  10 MeV.        gammaSurfCurr003
373   //                                              335   //
374   for (G4int i = 0; i < 4; i++) {              << 336   char name[16];
375     std::ostringstream name;                   << 337   for ( G4int i = 0; i < 4; i++){
376     name << "gammaSurfCurr" << std::setfill('0 << 338       std::sprintf(name,"gammaSurfCurr%03d",i);
377     G4String psgName = name.str();             << 339       G4String psgName(name);
378     G4double kmin = std::pow(10., (G4double)i) << 340       G4double kmin = std::pow(10.,(G4double)i)*keV;
379     G4double kmax = std::pow(10., (G4double)(i << 341       G4double kmax = std::pow(10.,(G4double)(i+1))*keV;
380     //-- Particle with kinetic energy filter.  << 342       //-- Particle with kinetic energy filter.
381     G4SDParticleWithEnergyFilter* pkinEFilter  << 343       G4SDParticleWithEnergyFilter* pkinEFilter =
382       new G4SDParticleWithEnergyFilter(fltName << 344   new G4SDParticleWithEnergyFilter(fltName="gammaE filter",kmin,kmax);
383     pkinEFilter->add("gamma");  // Accept only << 345       pkinEFilter->add("gamma");  // Accept only gamma.
384     pkinEFilter->show();  // Show accepting co << 346       pkinEFilter->show();        // Show accepting condition to stdout.
385     //-- Surface Current Scorer which scores   << 347       //-- Surface Current Scorer which scores  number of tracks in unit area.
386     G4PSFlatSurfaceCurrent3D* scorer =         << 348       G4PSFlatSurfaceCurrent* scorer =
387       new G4PSFlatSurfaceCurrent3D(psgName, fC << 349     new G4PSFlatSurfaceCurrent(psgName,fCurrent_InOut);
388     scorer->SetFilter(pkinEFilter);  // Assign << 350       scorer->SetFilter(pkinEFilter);    // Assign filter.
389     mFDet->RegisterPrimitive(scorer);  // Regi << 351       MFDet->RegisterPrimitive(scorer);  // Register it to MultiFunctionalDetector.
390   }                                               352   }
                                                   >> 353   //
                                                   >> 354 
                                                   >> 355   //=============================== 
                                                   >> 356  //   Visualization attributes 
                                                   >> 357   //===============================
                                                   >> 358 
                                                   >> 359   G4VisAttributes* BoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0));
                                                   >> 360   logicWorld  ->SetVisAttributes(BoxVisAtt);  
                                                   >> 361   //logicWorld->SetVisAttributes(G4VisAttributes::Invisible);  
                                                   >> 362   
                                                   >> 363   G4VisAttributes* PhantomVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,0.0));
                                                   >> 364   logicPhantom->SetVisAttributes(PhantomVisAtt);
                                                   >> 365 
                                                   >> 366   // If number of segmentation of water phantom is too large,
                                                   >> 367   // skip the visualization for those voxels.
                                                   >> 368   if ( nCells > 1000 ) {
                                                   >> 369       logicPhantomSens->SetVisAttributes(G4VisAttributes::Invisible);
                                                   >> 370   }
                                                   >> 371   
                                                   >> 372   return physiWorld;
391 }                                                 373 }
                                                   >> 374 
392                                                   375