test
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 
9 
18 
21 
23 
25 
26 #include "G4RunManagerKernel.hh"
27 #include "G4TransportationManager.hh"
28 
29 #include <iostream>
30 
31 static
33  std::vector<std::shared_ptr<SimWatcher> >& oWatchers,
34  std::vector<std::shared_ptr<SimProducer> >& oProds)
35 {
36  using namespace std;
37  using namespace edm;
38  std::vector<ParameterSet> watchers;
39  try { watchers = iP.getParameter<vector<ParameterSet> >("Watchers"); }
40  catch(edm::Exception) {}
41 
42  for(std::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()==nullptr) {
48  throw cms::Exception("SimG4CoreGeometryProducer",
49  " createWatchers: Unable to find the requested Watcher");
50  }
51 
52  std::shared_ptr<SimWatcher> watcherTemp;
53  std::shared_ptr<SimProducer> producerTemp;
54  maker->make(*itWatcher,iReg,watcherTemp,producerTemp);
55  oWatchers.push_back(watcherTemp);
56  if(producerTemp) oProds.push_back(producerTemp);
57  }
58 }
59 
61  m_kernel(nullptr),
62  m_pUseMagneticField(p.getParameter<bool>("UseMagneticField")),
63  m_pField(p.getParameter<edm::ParameterSet>("MagneticField")),
64  m_pUseSensitiveDetectors(p.getParameter<bool>("UseSensitiveDetectors")),
65  m_attach(nullptr), m_p(p), m_firstRun ( true )
66 {
67  //Look for an outside SimActivityRegistry
68  //this is used by the visualization code
70  if (otherRegistry) m_registry.connect(*otherRegistry);
72  produces<int>();
73 }
74 
76 {
77  delete m_attach;
78  delete m_kernel;
79 }
80 
83  {
84  // setup the magnetic field
86  es.get<IdealMagneticFieldRecord>().get(pMF);
87  const GlobalPoint g(0.,0.,0.);
88  edm::LogInfo("GeometryProducer") << "B-field(T) at (0,0,0)(cm): " << pMF->inTesla(g);
89 
90  m_fieldBuilder = std::auto_ptr<sim::FieldBuilder>(new sim::FieldBuilder(&(*pMF), m_pField));
91 
92  G4TransportationManager * tM = G4TransportationManager::GetTransportationManager();
93  // update field here ...
94  m_fieldBuilder->build( tM->GetFieldManager(),tM->GetPropagatorInField());
95 
96  edm::LogInfo("GeometryProducer") << "Magentic field updated";
97  }
98 }
99 
101  // mag field can change in new lumi section
102  updateMagneticField( es );
103 }
104 
106 {}
107 
109 {}
110 
112 {
113  if ( !m_firstRun ) return;
114  m_firstRun = false;
115 
116  edm::LogInfo("GeometryProducer") << "Producing G4 Geom";
117 
118  m_kernel = G4RunManagerKernel::GetRunManagerKernel();
119  if (m_kernel==0) m_kernel = new G4RunManagerKernel();
120  edm::LogInfo("GeometryProducer") << " GeometryProducer initializing ";
121  // DDDWorld: get the DDCV from the ES and use it to build the World
123  es.get<IdealGeometryRecord>().get(pDD);
124 
126  SensitiveDetectorCatalog catalog_;
127  const DDDWorld * world = new DDDWorld(&(*pDD), map_, catalog_, false);
129 
130  updateMagneticField( es );
131 
133  {
134  edm::LogInfo("GeometryProducer") << " instantiating sensitive detectors ";
135  // instantiate and attach the sensitive detectors
136  m_trackManager = std::auto_ptr<SimTrackManager>(new SimTrackManager);
137  if (m_attach==0) m_attach = new AttachSD;
138  {
139  std::pair< std::vector<SensitiveTkDetector*>,
140  std::vector<SensitiveCaloDetector*> >
141  sensDets = m_attach->create(*world,(*pDD),catalog_,m_p,m_trackManager.get(),m_registry);
142 
143  m_sensTkDets.swap(sensDets.first);
144  m_sensCaloDets.swap(sensDets.second);
145  }
146 
147  edm::LogInfo("GeometryProducer") << " Sensitive Detector building finished; found "
148  << m_sensTkDets.size()
149  << " Tk type Producers, and " << m_sensCaloDets.size()
150  << " Calo type producers ";
151  }
152 
153  for(Producers::iterator itProd = m_producers.begin();itProd != m_producers.end();
154  ++itProd) {
155  (*itProd)->produce(e,es);
156  }
157 }
158 
T getParameter(std::string const &) const
Map map_
GeometryProducer(edm::ParameterSet const &p)
virtual void endRun(const edm::Run &r, const edm::EventSetup &c) override
void connect(Observer< const BeginOfJob * > *iObject)
edm::ParameterSet m_pField
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
virtual ~GeometryProducer() override
std::auto_ptr< SimTrackManager > m_trackManager
#define nullptr
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 void beginRun(const edm::Run &r, const edm::EventSetup &c) override
std::vector< std::shared_ptr< SimWatcher > > m_watchers
G4RunManagerKernel * m_kernel
static void createWatchers(const edm::ParameterSet &iP, SimActivityRegistry &iReg, std::vector< std::shared_ptr< SimWatcher > > &oWatchers, std::vector< std::shared_ptr< SimProducer > > &oProds)
std::vector< std::shared_ptr< SimProducer > > m_producers
SimActivityRegistry m_registry
virtual void produce(edm::Event &e, const edm::EventSetup &c) override
void updateMagneticField(edm::EventSetup const &es)
std::vector< SensitiveTkDetector * > m_sensTkDets
DDDWorldSignal dddWorldSignal_
const T & get() const
Definition: EventSetup.h:56
std::auto_ptr< sim::FieldBuilder > m_fieldBuilder
std::pair< std::vector< SensitiveTkDetector * >, std::vector< SensitiveCaloDetector * > > create(const DDDWorld &w, const DDCompactView &cpv, const SensitiveDetectorCatalog &clg, edm::ParameterSet const &p, const SimTrackManager *m, SimActivityRegistry &reg) const
Definition: AttachSD.cc:23
void beginLuminosityBlock(edm::LuminosityBlock &, edm::EventSetup const &)
edm::ParameterSet m_p
T get(const Candidate &c)
Definition: component.h:55
std::vector< SensitiveCaloDetector * > m_sensCaloDets
Definition: Run.h:42