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<std::shared_ptr<SimWatcher> >& oWatchers,
34  std::vector<std::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  std::shared_ptr<SimWatcher> watcherTemp;
50  std::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  m_attach(0), m_p(p), m_firstRun ( true )
64 {
65  //Look for an outside SimActivityRegistry
66  //this is used by the visualization code
68  if (otherRegistry) m_registry.connect(*otherRegistry);
70  produces<int>();
71 }
72 
74 {
75  if (m_attach!=0) delete m_attach;
76  if (m_kernel!=0) delete m_kernel;
77 }
78 
79 //void GeometryProducer::beginJob(){
82  {
83  // setup the magnetic field
85  es.get<IdealMagneticFieldRecord>().get(pMF);
86  const GlobalPoint g(0.,0.,0.);
87  LogDebug("GeometryProducer") << "B-field(T) at (0,0,0)(cm): " << pMF->inTesla(g) << std::endl;
88 
89  m_fieldBuilder = std::auto_ptr<sim::FieldBuilder>(new sim::FieldBuilder(&(*pMF), m_pField));
90 
91  G4TransportationManager * tM = G4TransportationManager::GetTransportationManager();
92  // update field here ...
93  m_fieldBuilder->build( tM->GetFieldManager(),tM->GetPropagatorInField());
94 
95  LogDebug("GeometryProducer") << "Magentic field updated" << std::endl;
96  }
97 
98 }
99 
100 //void GeometryProducer::endJob()
101 //{ std::cout << " GeometryProducer terminating " << std::endl; }
102 
104  // mag field can change in new lumi section
105  updateMagneticField( es );
106 }
107 
109 {
110 // m_kernel = G4RunManagerKernel::GetRunManagerKernel();
111  if ( !m_firstRun )
112  return;
113  m_firstRun = false;
114 
115  LogDebug("GeometryProducer") << "Producing G4 Geom" << std::endl;
116 
117  m_kernel = G4RunManagerKernel::GetRunManagerKernel();
118  if (m_kernel==0) m_kernel = new G4RunManagerKernel();
119  std::cout << " GeometryProducer initializing " << std::endl;
120  LogDebug("GeometryProducer") << " GeometryProducer initializing " << std::endl;
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  LogDebug("GeometryProducer") << " instantiating sensitive detectors " << std::endl;
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  LogDebug("GeometryProducer") << " Sensitive Detector building finished; found " << m_sensTkDets.size()
148  << " Tk type Producers, and " << m_sensCaloDets.size()
149  << " Calo type producers " << std::endl;
150 
151  }
152  for(Producers::iterator itProd = m_producers.begin();itProd != m_producers.end();
153  ++itProd) {
154  (*itProd)->produce(e,es);
155  }
156 
157 }
158 
#define LogDebug(id)
T getParameter(std::string const &) const
Map map_
GeometryProducer(edm::ParameterSet const &p)
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
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
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
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 &)
tuple cout
Definition: gather_cfg.py:121
edm::ParameterSet m_p
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