source: trunk/examples/extended/geometry/olap/src/OlapManager.cc @ 1342

Last change on this file since 1342 was 1342, checked in by garnier, 14 years ago

update ti head

File size: 10.0 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: OlapManager.cc,v 1.4 2010/08/24 07:57:14 gcosmo Exp $
28// GEANT4 tag $Name: examples-V09-03-09 $
29//
30//
31// --------------------------------------------------------------
32// OlapManager
33//
34// Author: Martin Liendl - Martin.Liendl@cern.ch
35//
36// --------------------------------------------------------------
37//
38#include <stdlib.h>
39
40#include <vector>
41
42#include "OlapManager.hh"
43#include "OlapDetConstr.hh"
44#include "OlapManagerMessenger.hh"
45#include "OlapGenerator.hh"
46#include "OlapEventAction.hh"
47#include "G4GeoNav.hh"
48#include "G4GeometryTolerance.hh"
49#include "G4RunManager.hh"
50#include "globals.hh"
51
52OlapManager * OlapManager::theInstance = 0;
53
54OlapManager::OlapManager()
55  : olapGenerator(0), eventsPerRun(27), lvPos(0),
56    polyMode(false), interrupt(false) 
57{
58   theMessenger = new OlapManagerMessenger(this);
59   theLVStore = G4LogicalVolumeStore::GetInstance();
60   // for SUN
61   //std::vector<G4LogicalVolume*>::iterator aIt = theLVStore->begin();
62   //G4LogicalVolumeStore::iterator aIt = theLVStore->begin();
63
64   delta = G4GeometryTolerance::GetInstance()->GetAngularTolerance();
65   theRunManager = G4RunManager::GetRunManager();
66   const G4VUserDetectorConstruction * aTmp =
67      theRunManager->GetUserDetectorConstruction(); 
68   
69   const OlapDetConstr * aConstDetConstr =
70     dynamic_cast<const OlapDetConstr*>(aTmp);
71   if (!aConstDetConstr) {
72     G4cerr << "OlapManger(): can't get the OlapDetConstr instance!" << G4endl;
73     G4cerr << "              exiting ..." << G4endl;
74     G4Exception("ERROR - OlapManager::OlapManager()");
75   } 
76 
77   // need a  non-const instance for building NewWords!         
78   theDet = const_cast<OlapDetConstr*>(aConstDetConstr);
79   
80   // instantiate the logical volume tree & add it to the Gui
81   theGeoNav = new G4GeoNav(theDet->GetFullWorld()->GetLogicalVolume());
82   
83   std::vector<G4LogicalVolume*>::iterator aIt2;
84   for (aIt2=theLVStore->begin(); aIt2 != theLVStore->end(); aIt2++)
85     NoOlapMap[*aIt2] = false;
86}
87
88
89OlapManager::~OlapManager()
90{
91   delete theMessenger;
92   delete theGeoNav;
93   delete olapGenerator;
94}
95
96
97OlapManager * OlapManager::GetOlapManager()
98{
99   if (!theInstance)
100      theInstance = new OlapManager();
101   
102   return theInstance;   
103}   
104
105
106void OlapManager::SetRotation(G4double theta, G4double phi, G4double alpha)
107{
108  theDet->SetRotation(theta,phi,alpha);
109 
110  // ?? set the current new-world again to activate the rotation??
111}
112
113
114
115void OlapManager::TriggerRun()
116{
117   const OlapGenerator * aGen = dynamic_cast<const OlapGenerator *>
118         (G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction());
119   OlapGenerator * aNonConstGen = 0;
120   if ( aGen )
121   {
122        aNonConstGen = const_cast<OlapGenerator*>(aGen);
123   }
124   else
125   {
126      G4cerr << "Warning: Primary generator is not OlapGenerator!" << G4endl
127                   << "Overlap Detection will not work!" << G4endl;
128      return;
129   }             
130   //while
131   aNonConstGen->SetAutoIncrement(true); 
132   theRunManager->BeamOn(eventsPerRun);
133   aNonConstGen->SetAutoIncrement(false);
134}
135
136
137void OlapManager::TriggerFull(G4int trg)
138{
139   const OlapGenerator * aGen = dynamic_cast<const OlapGenerator *>
140         (G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction());
141   OlapGenerator * aNonConstGen = 0;
142   if ( aGen )
143   {
144        aNonConstGen = const_cast<OlapGenerator*>(aGen);
145   }
146   else
147   {
148      G4cerr << "Warning: Primary generator is not OlapGenerator!" << G4endl
149             << "Overlap Detection will not work!" << G4endl;
150      return;
151   }             
152   //while
153   aNonConstGen->SetAutoIncrement(true); 
154   
155   interrupt = false; // can be changed to 'true' in the following loop
156                      // by subclasses of OlapNotify. In that case,
157                      // the triggerFull-command will be stopped.
158   
159   while (Next() && trg)
160   {
161      if (theDet->GetNewWorld()->GetLogicalVolume()->GetDaughter(0)->
162          GetLogicalVolume()->GetNoDaughters())
163      {
164         theRunManager->BeamOn(eventsPerRun);   
165         trg--;
166         if (interrupt)
167         {
168           break;
169         }
170      }         
171   }
172   aNonConstGen->SetAutoIncrement(false);
173}
174
175G4VPhysicalVolume * OlapManager::GetNewWorld() 
176{
177  return theDet->GetNewWorld();
178}       
179
180
181G4VPhysicalVolume * OlapManager::GetFullWorld() 
182{
183  return theDet->GetFullWorld();
184}       
185
186G4bool OlapManager::Next()
187{ 
188   G4LogicalVolume * nextlv = theGeoNav->NextLV();
189   if(nextlv)
190   {
191      theDet->SetNewWorld(nextlv);
192      G4cout << nextlv->GetName() << G4endl;
193      return true;
194   }
195   return false;
196}
197
198/*
199G4bool OlapManager::SetNextWorld(G4int aOffs)
200{
201   if (aOffs >= theLVs.size())
202   {
203      G4cout << aOffs << ">" << theLVs.size() -1 << G4endl;
204      return false;
205   }
206   else
207   {
208      G4cout << "no daughters: " << (*theLVit)->GetNoDaughters() << G4endl;
209      theDet->SetNewWorld(theLVs[aOffs]);
210      lvPos=aOffs;
211      return true;
212   }
213   
214}
215*/
216
217/*
218G4bool OlapManager::SetPrevWorld(G4int aOffs)
219{
220   //FIXME: OlapManager::SetPrevWorld(int) - remove this method!
221   G4cerr << "DON'T CALL OlapManager::SetPrevWorld(..)!" << G4endl;
222   G4Exception("ERROR - OlapManager::SetPrevWorld()");
223   
224   for (G4int i=1; i<aOffs; i++)
225   {
226      if (theLVit == theLVs.begin())
227      {
228        theDet->SetNewWorld(*theLVit);
229        return true;
230      }
231      theLVit--;       
232   }       
233       
234   if (theLVit != theLVs.begin())
235   {
236     theLVit--;
237     if ( *theLVit != 0)
238     {
239        theDet->SetNewWorld(*theLVit);   
240        return true;
241     }       
242   }
243     
244   return false;
245}
246*/
247 
248void OlapManager::ListLV(const G4String & aRegexStr)
249{
250    G4cout << "logical volumes matching " << aRegexStr << ":" <<G4endl;
251   
252    std::vector<G4LogicalVolume *> aLVVec;
253    G4int c = theGeoNav->FilterLV(aRegexStr,aLVVec);
254 
255    for(G4int i=0; i<c; i++)
256    {
257        G4cout << " " << (aLVVec[i])->GetName() << G4endl;
258    }
259}
260
261
262void OlapManager::LsLV()
263{
264   std::vector<G4LogicalVolume *> lvs;
265   G4int c = theGeoNav->LsLV(lvs);
266   for (G4int i = 0; i<c; i++)
267      G4cout << "   " << (lvs[i])->GetName() << G4endl;
268}
269
270void OlapManager::PwdLV()
271{
272    std::vector<G4LogicalVolume *> lvs;
273    theGeoNav->PwdLV(lvs);
274    G4String temp;
275    G4cout << "/ = ";
276    for (G4int i=lvs.size()-1; i>=0; i--)
277    {
278      G4cout << temp << (lvs[i])->GetName() << G4endl;
279      temp = temp + G4String("   ");
280    }
281}
282
283
284G4int OlapManager::GetNrLVs()
285{ 
286   return theDet->GetNrLVs(); 
287}
288
289
290void OlapManager::ChangeLV(const G4String & aDir)
291{
292   G4LogicalVolume * aLv = theGeoNav->ChangeLV(aDir);
293   if (aLv)
294   {
295       G4cout << "new world: " << aLv->GetName() << G4endl;
296       theDet->SetNewWorld(aLv);
297       notifyNewWorld(theDet->GetNewWorld()->GetLogicalVolume());
298   }
299}
300
301void OlapManager::GotoLV(const G4String & aRegexStr)
302{
303    std::vector<G4LogicalVolume*> lvs; 
304    if (theGeoNav->FilterLV(aRegexStr,lvs,true))
305    {
306       G4cout << "new world: " << (lvs[0])->GetName() << G4endl;
307       theDet->SetNewWorld((lvs[0]));
308       notifyNewWorld(theDet->GetNewWorld()->GetLogicalVolume());
309    }   
310}
311
312
313void OlapManager::SetNewWorld(G4LogicalVolume * nw)
314{
315   if (nw)
316   {
317     theDet->SetNewWorld(nw);
318     notifyNewWorld(theDet->GetNewWorld()->GetLogicalVolume());
319   } 
320}
321
322void OlapManager::SetGrid(G4int x, G4int y, G4int z)
323{
324   // try to find the OlapGenerator and set the new grid
325   const OlapGenerator * aGen = dynamic_cast<const OlapGenerator *>
326         (G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction());
327   OlapGenerator * aNonConstGen = 0;
328   if ( aGen )
329   {
330        aNonConstGen = const_cast<OlapGenerator*>(aGen);
331        aNonConstGen->SetGrid(x,y,z);
332   }
333   else
334   {
335      G4cerr << "Warning: Primary generator is not OlapGenerator!" << G4endl
336             << "Overlap Detection will not work!" << G4endl;
337      return;
338   }     
339   
340   eventsPerRun = x*y + y*z + x*z; 
341   G4cout << "/olap/trigger will trigger "
342          << eventsPerRun
343          << " events." << G4endl;
344}
345
346
347void OlapManager::notifyNewWorld(G4LogicalVolume* nw)
348{
349   //G4cout << G4endl << "NewWorld-Notif: " << nw->GetName() << G4endl;
350   std::set<OlapNotify*>::iterator i = theNotifs.begin();
351   for(;i!=theNotifs.end();++i)
352     (*i)->worldChanged(nw);   
353}
354
355
356void OlapManager::notifyOlaps(const std::vector<OlapInfo*> & ov)
357{
358   std::set<OlapNotify*>::iterator i = theNotifs.begin();
359   for(;i!=theNotifs.end();++i) 
360     (*i)->overlaps(ov);   
361}
362
363
364G4LogicalVolume* OlapManager::GetOriginalWorld()
365{
366   if (theDet)
367   {
368     return theDet->GetOriginalWorld();
369   }
370   return 0;
371}
Note: See TracBrowser for help on using the repository browser.