Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/biasing/B02/src/B02ImportanceDetectorConstruction.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/biasing/B02/src/B02ImportanceDetectorConstruction.cc (Version 11.3.0) and /examples/extended/biasing/B02/src/B02ImportanceDetectorConstruction.cc (Version 4.0)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 /// \file biasing/B02/src/B02ImportanceDetecto    
 27 /// \brief Implementation of the B02Importance    
 28 //                                                
 29 //                                                
 30 //                                                
 31                                                   
 32 #include "B02ImportanceDetectorConstruction.hh    
 33                                                   
 34 #include "G4LogicalVolume.hh"                     
 35 #include "G4Material.hh"                          
 36 #include "G4PVPlacement.hh"                       
 37 #include "G4PhysicalConstants.hh"                 
 38 #include "G4SystemOfUnits.hh"                     
 39 #include "G4ThreeVector.hh"                       
 40 #include "G4Tubs.hh"                              
 41 #include "globals.hh"                             
 42                                                   
 43 #include <sstream>                                
 44                                                   
 45 // For Primitive Scorers                          
 46 #include "G4MultiFunctionalDetector.hh"           
 47 #include "G4PSNofCollision.hh"                    
 48 #include "G4PSPopulation.hh"                      
 49 #include "G4PSTrackCounter.hh"                    
 50 #include "G4PSTrackLength.hh"                     
 51 #include "G4SDManager.hh"                         
 52 #include "G4SDParticleFilter.hh"                  
 53                                                   
 54 // for importance biasing                         
 55 #include "G4IStore.hh"                            
 56                                                   
 57 // for weight window technique                    
 58 #include "G4WeightWindowStore.hh"                 
 59                                                   
 60 //....oooOO0OOooo........oooOO0OOooo........oo    
 61                                                   
 62 B02ImportanceDetectorConstruction::B02Importan    
 63   : G4VUserParallelWorld(worldName), fLogicalV    
 64 {                                                 
 65   //  Construct();                                
 66 }                                                 
 67                                                   
 68 //....oooOO0OOooo........oooOO0OOooo........oo    
 69                                                   
 70 B02ImportanceDetectorConstruction::~B02Importa    
 71 {                                                 
 72   fLogicalVolumeVector.clear();                   
 73 }                                                 
 74                                                   
 75 //....oooOO0OOooo........oooOO0OOooo........oo    
 76                                                   
 77 void B02ImportanceDetectorConstruction::Constr    
 78 {                                                 
 79   G4cout << " constructing parallel world " <<    
 80                                                   
 81   G4Material* dummyMat = 0;                       
 82                                                   
 83   // GetWorld methods create a clone of the ma    
 84   //  via the transportation manager              
 85   fGhostWorld = GetWorld();                       
 86   G4cout << " B02ImportanceDetectorConstructio    
 87          << G4endl;                               
 88   G4LogicalVolume* worldLogical = fGhostWorld-    
 89   fLogicalVolumeVector.push_back(worldLogical)    
 90                                                   
 91   //  fPVolumeStore.AddPVolume(G4GeometryCell(    
 92   fPVolumeStore.AddPVolume(G4GeometryCell(*fGh    
 93                                                   
 94   // creating 18 slobs of 10 cm thicknes          
 95                                                   
 96   G4double innerRadiusShield = 0 * cm;            
 97   G4double outerRadiusShield = 100 * cm;          
 98   G4double heightShield = 5 * cm;                 
 99   G4double startAngleShield = 0 * deg;            
100   G4double spanningAngleShield = 360 * deg;       
101                                                   
102   G4Tubs* aShield = new G4Tubs("aShield", inne    
103                                startAngleShiel    
104                                                   
105   // logical parallel cells                       
106                                                   
107   G4LogicalVolume* aShield_log_imp = new G4Log    
108   fLogicalVolumeVector.push_back(aShield_log_i    
109                                                   
110   // physical parallel cells                      
111   G4String name = "none";                         
112   G4int i = 1;                                    
113   G4double startz = -85 * cm;                     
114   //  for (i=1; i<=18; ++i) {                     
115   for (i = 1; i <= 18; i++) {                     
116     name = GetCellName(i);                        
117                                                   
118     G4double pos_x = 0 * cm;                      
119     G4double pos_y = 0 * cm;                      
120     G4double pos_z = startz + (i - 1) * (2 * h    
121     G4VPhysicalVolume* pvol = new G4PVPlacemen    
122                                                   
123     //                        0);                 
124     G4GeometryCell cell(*pvol, i);                
125     //    G4GeometryCell cell(*pvol, 0);          
126     fPVolumeStore.AddPVolume(cell);               
127   }                                               
128                                                   
129   // filling the rest of the world volumr behi    
130   // another slob which should get the same im    
131   // last slob                                    
132   innerRadiusShield = 0 * cm;                     
133   //  outerRadiusShield = 110*cm; exceeds worl    
134   outerRadiusShield = 100 * cm;                   
135   //  heightShield       = 10*cm;                 
136   heightShield = 5 * cm;                          
137   startAngleShield = 0 * deg;                     
138   spanningAngleShield = 360 * deg;                
139                                                   
140   G4Tubs* aRest = new G4Tubs("Rest", innerRadi    
141                              startAngleShield,    
142                                                   
143   G4LogicalVolume* aRest_log = new G4LogicalVo    
144                                                   
145   fLogicalVolumeVector.push_back(aRest_log);      
146                                                   
147   name = GetCellName(19);                         
148                                                   
149   G4double pos_x = 0 * cm;                        
150   G4double pos_y = 0 * cm;                        
151   //  G4double pos_z = 100*cm;                    
152   G4double pos_z = 95 * cm;                       
153   G4VPhysicalVolume* pvol = new G4PVPlacement(    
154                                                   
155   //                      0);                     
156   G4GeometryCell cell(*pvol, 19);                 
157   //  G4GeometryCell cell(*pvol, 0);              
158   fPVolumeStore.AddPVolume(cell);                 
159                                                   
160   SetSensitive();                                 
161 }                                                 
162                                                   
163 //....oooOO0OOooo........oooOO0OOooo........oo    
164                                                   
165 const G4VPhysicalVolume&                          
166 B02ImportanceDetectorConstruction::GetPhysical    
167 {                                                 
168   return *fPVolumeStore.GetPVolume(name);         
169 }                                                 
170                                                   
171 //....oooOO0OOooo........oooOO0OOooo........oo    
172                                                   
173 G4String B02ImportanceDetectorConstruction::Li    
174 {                                                 
175   G4String names(fPVolumeStore.GetPNames());      
176   return names;                                   
177 }                                                 
178                                                   
179 //....oooOO0OOooo........oooOO0OOooo........oo    
180                                                   
181 G4String B02ImportanceDetectorConstruction::Ge    
182 {                                                 
183   std::ostringstream os;                          
184   os << "cell_";                                  
185   if (i < 10) {                                   
186     os << "0";                                    
187   }                                               
188   os << i;                                        
189   G4String name = os.str();                       
190   return name;                                    
191 }                                                 
192                                                   
193 //....oooOO0OOooo........oooOO0OOooo........oo    
194                                                   
195 G4GeometryCell B02ImportanceDetectorConstructi    
196 {                                                 
197   G4String name(GetCellName(i));                  
198   const G4VPhysicalVolume* p = 0;                 
199   p = fPVolumeStore.GetPVolume(name);             
200   if (p) {                                        
201     return G4GeometryCell(*p, 0);                 
202   }                                               
203   else {                                          
204     G4cout << "B02ImportanceDetectorConstructi    
205            << " couldn't get G4GeometryCell" <    
206     return G4GeometryCell(*fGhostWorld, -2);      
207   }                                               
208 }                                                 
209                                                   
210 //....oooOO0OOooo........oooOO0OOooo........oo    
211                                                   
212 G4VPhysicalVolume& B02ImportanceDetectorConstr    
213 {                                                 
214   return *fGhostWorld;                            
215 }                                                 
216                                                   
217 //....oooOO0OOooo........oooOO0OOooo........oo    
218                                                   
219 G4VPhysicalVolume* B02ImportanceDetectorConstr    
220 {                                                 
221   return fGhostWorld;                             
222 }                                                 
223                                                   
224 //....oooOO0OOooo........oooOO0OOooo........oo    
225                                                   
226 void B02ImportanceDetectorConstruction::SetSen    
227 {                                                 
228   //  ----------------------------------------    
229   //   The collection names of defined Primiti    
230   //   0       ConcreteSD/Collisions              
231   //   1       ConcreteSD/CollWeight              
232   //   2       ConcreteSD/Population              
233   //   3       ConcreteSD/TrackEnter              
234   //   4       ConcreteSD/SL                      
235   //   5       ConcreteSD/SLW                     
236   //   6       ConcreteSD/SLWE                    
237   //   7       ConcreteSD/SLW_V                   
238   //   8       ConcreteSD/SLWE_V                  
239   //  ----------------------------------------    
240                                                   
241   // moved to ConstructSD() for MT compliance     
242 }                                                 
243                                                   
244 //....oooOO0OOooo........oooOO0OOooo........oo    
245 void B02ImportanceDetectorConstruction::Constr    
246 {                                                 
247   G4SDManager* SDman = G4SDManager::GetSDMpoin    
248   //                                              
249   // Sensitive Detector Name                      
250   G4String concreteSDname = "ConcreteSD";         
251                                                   
252   //------------------------                      
253   // MultiFunctionalDetector                      
254   //------------------------                      
255   //                                              
256   // Define MultiFunctionalDetector with name.    
257   G4MultiFunctionalDetector* MFDet = new G4Mul    
258   SDman->AddNewDetector(MFDet);  // Register S    
259                                                   
260   G4String fltName, particleName;                 
261   G4SDParticleFilter* neutronFilter =             
262     new G4SDParticleFilter(fltName = "neutronF    
263                                                   
264   MFDet->SetFilter(neutronFilter);                
265                                                   
266   for (std::vector<G4LogicalVolume*>::iterator    
267        it != fLogicalVolumeVector.end(); it++)    
268   {                                               
269     //      (*it)->SetSensitiveDetector(MFDet)    
270     SetSensitiveDetector((*it)->GetName(), MFD    
271   }                                               
272                                                   
273   G4String psName;                                
274   G4PSNofCollision* scorer0 = new G4PSNofColli    
275   MFDet->RegisterPrimitive(scorer0);              
276                                                   
277   G4PSNofCollision* scorer1 = new G4PSNofColli    
278   scorer1->Weighted(true);                        
279   MFDet->RegisterPrimitive(scorer1);              
280                                                   
281   G4PSPopulation* scorer2 = new G4PSPopulation    
282   MFDet->RegisterPrimitive(scorer2);              
283                                                   
284   G4PSTrackCounter* scorer3 = new G4PSTrackCou    
285   MFDet->RegisterPrimitive(scorer3);              
286                                                   
287   G4PSTrackLength* scorer4 = new G4PSTrackLeng    
288   MFDet->RegisterPrimitive(scorer4);              
289                                                   
290   G4PSTrackLength* scorer5 = new G4PSTrackLeng    
291   scorer5->Weighted(true);                        
292   MFDet->RegisterPrimitive(scorer5);              
293                                                   
294   G4PSTrackLength* scorer6 = new G4PSTrackLeng    
295   scorer6->Weighted(true);                        
296   scorer6->MultiplyKineticEnergy(true);           
297   MFDet->RegisterPrimitive(scorer6);              
298                                                   
299   G4PSTrackLength* scorer7 = new G4PSTrackLeng    
300   scorer7->Weighted(true);                        
301   scorer7->DivideByVelocity(true);                
302   MFDet->RegisterPrimitive(scorer7);              
303                                                   
304   G4PSTrackLength* scorer8 = new G4PSTrackLeng    
305   scorer8->Weighted(true);                        
306   scorer8->MultiplyKineticEnergy(true);           
307   scorer8->DivideByVelocity(true);                
308   MFDet->RegisterPrimitive(scorer8);              
309 }                                                 
310                                                   
311 //....oooOO0OOooo........oooOO0OOooo........oo    
312 G4VIStore* B02ImportanceDetectorConstruction::    
313 {                                                 
314   G4cout << " B02ImportanceDetectorConstructio    
315   if (!fPVolumeStore.Size()) {                    
316     G4Exception("B02ImportanceDetectorConstruc    
317                 RunMustBeAborted, "no physical    
318   }                                               
319                                                   
320   // creating and filling the importance store    
321                                                   
322   //  G4IStore *istore = new G4IStore(*fWorldV    
323                                                   
324   G4IStore* istore = G4IStore::GetInstance(Get    
325                                                   
326   G4GeometryCell gWorldVolumeCell(GetWorldVolu    
327                                                   
328   G4double imp = 1;                               
329                                                   
330   istore->AddImportanceGeometryCell(1, gWorldV    
331                                                   
332   // set importance values and create scorers     
333   G4int cell(1);                                  
334   for (cell = 1; cell <= 18; cell++) {            
335     G4GeometryCell gCell = GetGeometryCell(cel    
336     G4cout << " adding cell: " << cell << " re    
337            << " name: " << gCell.GetPhysicalVo    
338     imp = std::pow(2.0, cell - 1);                
339                                                   
340     G4cout << "Going to assign importance: " <    
341            << ", to volume: " << gCell.GetPhys    
342     // x    aIstore.AddImportanceGeometryCell(    
343     istore->AddImportanceGeometryCell(imp, gCe    
344   }                                               
345                                                   
346   // creating the geometry cell and add both t    
347   //  G4GeometryCell gCell = GetGeometryCell(1    
348                                                   
349   // create importance geometry cell pair for     
350   // with the same importance as the last conc    
351   G4GeometryCell gCell = GetGeometryCell(19);     
352   //  G4double imp = std::pow(2.0,18);            
353   imp = std::pow(2.0, 17);                        
354   istore->AddImportanceGeometryCell(imp, gCell    
355                                                   
356   return istore;                                  
357 }                                                 
358                                                   
359 //....oooOO0OOooo........oooOO0OOooo........oo    
360                                                   
361 G4VWeightWindowStore* B02ImportanceDetectorCon    
362 {                                                 
363   G4cout << " B02ImportanceDetectorConstructio    
364   if (!fPVolumeStore.Size()) {                    
365     G4Exception("B02ImportanceDetectorConstruc    
366                 RunMustBeAborted, "no physical    
367   }                                               
368                                                   
369   // creating and filling the importance store    
370                                                   
371   //  G4IStore *istore = new G4IStore(*fWorldV    
372                                                   
373   G4WeightWindowStore* wwstore = G4WeightWindo    
374                                                   
375   // create one energy region covering the ene    
376   //                                              
377   std::set<G4double, std::less<G4double>> enBo    
378   enBounds.insert(1 * GeV);                       
379   wwstore->SetGeneralUpperEnergyBounds(enBound    
380                                                   
381   G4int n = 0;                                    
382   G4double lowerWeight = 1;                       
383   std::vector<G4double> lowerWeights;             
384                                                   
385   lowerWeights.push_back(1);                      
386   G4GeometryCell gWorldCell(GetWorldVolumeAddr    
387   wwstore->AddLowerWeights(gWorldCell, lowerWe    
388                                                   
389   G4int cell(1);                                  
390   for (cell = 1; cell <= 18; cell++) {            
391     G4GeometryCell gCell = GetGeometryCell(cel    
392     G4cout << " adding cell: " << cell << " re    
393            << " name: " << gCell.GetPhysicalVo    
394                                                   
395     lowerWeight = 1. / std::pow(2., n++);         
396     G4cout << "Going to assign lower weight: "    
397            << ", to volume: " << gCell.GetPhys    
398     lowerWeights.clear();                         
399     lowerWeights.push_back(lowerWeight);          
400     wwstore->AddLowerWeights(gCell, lowerWeigh    
401   }                                               
402                                                   
403   // the remaining part pf the geometry (rest)    
404   // lower weight bound  as the last conrete c    
405   //                                              
406                                                   
407   // create importance geometry cell pair for     
408   // with the same importance as the last conc    
409   G4GeometryCell gCell = GetGeometryCell(19);     
410   wwstore->AddLowerWeights(gCell, lowerWeights    
411                                                   
412   return wwstore;                                 
413 }                                                 
414