CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GeometryProducer.cc
Go to the documentation of this file.
2 
4 
8 
18 
21 
23 
25 
26 #include "G4RunManagerKernel.hh"
27 #include "G4TransportationManager.hh"
28 
29 #include <iostream>
30 
31 static
33  std::vector<boost::shared_ptr<SimWatcher> >& oWatchers,
34  std::vector<boost::shared_ptr<SimProducer> >& oProds)
35 {
36  using namespace std;
37  using namespace edm;
38  vector<ParameterSet> watchers;
39  try { watchers = iP.getParameter<vector<ParameterSet> >("Watchers"); }
40  catch(edm::Exception) {}
41 
42  for(vector<ParameterSet>::iterator itWatcher = watchers.begin();
43  itWatcher != watchers.end(); ++itWatcher)
44  {
45  std::auto_ptr<SimWatcherMakerBase>
46  maker(SimWatcherFactory::get()->create(itWatcher->getParameter<std::string> ("type")));
47  if(maker.get()==0) { throw SimG4Exception("Unable to find the requested Watcher"); }
48 
49  boost::shared_ptr<SimWatcher> watcherTemp;
50  boost::shared_ptr<SimProducer> producerTemp;
51  maker->make(*itWatcher,iReg,watcherTemp,producerTemp);
52  oWatchers.push_back(watcherTemp);
53  if(producerTemp) oProds.push_back(producerTemp);
54  }
55 }
56 
58  m_kernel(0),
59  m_pUseMagneticField(p.getParameter<bool>("UseMagneticField")),
60  m_pField(p.getParameter<edm::ParameterSet>("MagneticField")),
61  m_pUseSensitiveDetectors(p.getParameter<bool>("UseSensitiveDetectors")),
62  m_attach(0), m_p(p)
63 {
64  //Look for an outside SimActivityRegistry
65  //this is used by the visualization code
67  if (otherRegistry) m_registry.connect(*otherRegistry);
69  produces<int>();
70 }
71 
73 {
74  if (m_attach!=0) delete m_attach;
75  if (m_kernel!=0) delete m_kernel;
76 }
77 
79 }
80 
82 { std::cout << " GeometryProducer terminating " << std::endl; }
83 
85 {
86  m_kernel = G4RunManagerKernel::GetRunManagerKernel();
87  if (m_kernel==0) m_kernel = new G4RunManagerKernel();
88  std::cout << " GeometryProducer initializing " << std::endl;
89  // DDDWorld: get the DDCV from the ES and use it to build the World
91  es.get<IdealGeometryRecord>().get(pDD);
92 
94  SensitiveDetectorCatalog catalog_;
95  const DDDWorld * world = new DDDWorld(&(*pDD), map_, catalog_, false);
97 
99  {
100  // setup the magnetic field
102  es.get<IdealMagneticFieldRecord>().get(pMF);
103  const GlobalPoint g(0.,0.,0.);
104  std::cout << "B-field(T) at (0,0,0)(cm): " << pMF->inTesla(g) << std::endl;
105 
106  m_fieldBuilder = std::auto_ptr<sim::FieldBuilder>
107  (new sim::FieldBuilder(&(*pMF), m_pField));
108  // G4TransportationManager * tM = G4TransportationManager::GetTransportationManager();
109  // m_fieldBuilder->configure("MagneticFieldType",tM->GetFieldManager(),tM->GetPropagatorInField());
110  }
111 
113  {
114  std::cout << " instantiating sensitive detectors " << std::endl;
115  // instantiate and attach the sensitive detectors
116  m_trackManager = std::auto_ptr<SimTrackManager>(new SimTrackManager);
117  if (m_attach==0) m_attach = new AttachSD;
118  {
119  std::pair< std::vector<SensitiveTkDetector*>,
120  std::vector<SensitiveCaloDetector*> >
121  sensDets = m_attach->create(*world,(*pDD),catalog_,m_p,m_trackManager.get(),m_registry);
122 
123  m_sensTkDets.swap(sensDets.first);
124  m_sensCaloDets.swap(sensDets.second);
125  }
126 
127  std::cout << " Sensitive Detector building finished; found " << m_sensTkDets.size()
128  << " Tk type Producers, and " << m_sensCaloDets.size()
129  << " Calo type producers " << std::endl;
130  }
131  for(Producers::iterator itProd = m_producers.begin();itProd != m_producers.end();
132  ++itProd) { (*itProd)->produce(e,es); }
133 }
134 
T getParameter(std::string const &) const
std::pair< std::vector< SensitiveTkDetector * >, std::vector< SensitiveCaloDetector * > > create(const DDDWorld &w, const DDCompactView &cpv, SensitiveDetectorCatalog &clg, edm::ParameterSet const &p, const SimTrackManager *m, SimActivityRegistry &reg) const
Definition: AttachSD.cc:23
GeometryProducer(edm::ParameterSet const &p)
edm::ParameterSet m_pField
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::auto_ptr< SimTrackManager > m_trackManager
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
virtual ~GeometryProducer()
G4RunManagerKernel * m_kernel
virtual void beginJob()
SimActivityRegistry m_registry
std::vector< SensitiveTkDetector * > m_sensTkDets
std::vector< boost::shared_ptr< SimWatcher > > m_watchers
DDDWorldSignal dddWorldSignal_
const T & get() const
Definition: EventSetup.h:55
std::auto_ptr< sim::FieldBuilder > m_fieldBuilder
std::vector< boost::shared_ptr< SimProducer > > m_producers
static void createWatchers(const edm::ParameterSet &iP, SimActivityRegistry &iReg, std::vector< boost::shared_ptr< SimWatcher > > &oWatchers, std::vector< boost::shared_ptr< SimProducer > > &oProds)
tuple cout
Definition: gather_cfg.py:121
void connect(SimActivityRegistry &iOther)
forwards our signals to slots connected to iOther
virtual void endJob()
edm::ParameterSet m_p
virtual void produce(edm::Event &e, const edm::EventSetup &c)
SurfaceDeformation * create(int type, const std::vector< double > &params)
T get(const Candidate &c)
Definition: component.h:55
std::vector< SensitiveCaloDetector * > m_sensCaloDets