CMS 3D CMS Logo

OutputMagneticFieldDDToDDL.cc
Go to the documentation of this file.
15 
16 #include <cstddef>
17 #include <fstream>
18 #include <iomanip>
19 #include <map>
20 #include <memory>
21 #include <ostream>
22 #include <set>
23 #include <string>
24 #include <utility>
25 #include <vector>
26 
27 namespace {
29  struct ddsvaluesCmp {
30  bool operator()(const DDsvalues_type& sv1, const DDsvalues_type& sv2) const;
31  };
32 } // namespace
33 
34 class OutputMagneticFieldDDToDDL : public edm::one::EDAnalyzer<edm::one::WatchRuns> {
35 public:
36  explicit OutputMagneticFieldDDToDDL(const edm::ParameterSet& iConfig);
37  ~OutputMagneticFieldDDToDDL(void) override;
38 
39  void beginJob() override {}
40  void beginRun(edm::Run const& iEvent, edm::EventSetup const&) override;
41  void analyze(edm::Event const& iEvent, edm::EventSetup const&) override {}
42  void endRun(edm::Run const& iEvent, edm::EventSetup const&) override {}
43  void endJob() override {}
44 
45 private:
46  void addToMatStore(const DDMaterial& mat, std::set<DDMaterial>& matStore);
47  void addToSolStore(const DDSolid& sol, std::set<DDSolid>& solStore, std::set<DDRotation>& rotStore);
48  void addToSpecStore(const DDLogicalPart& lp,
49  std::map<const DDsvalues_type, std::set<const DDPartSelection*>, ddsvaluesCmp>& specStore);
50 
53  std::ostream* m_xos;
55 };
56 
57 bool ddsvaluesCmp::operator()(const DDsvalues_type& sv1, const DDsvalues_type& sv2) const {
58  if (sv1.size() < sv2.size())
59  return true;
60  if (sv2.size() < sv1.size())
61  return false;
62  size_t ind = 0;
63  for (; ind < sv1.size(); ++ind) {
64  if (sv1[ind].first < sv2[ind].first)
65  return true;
66  if (sv2[ind].first < sv1[ind].first)
67  return false;
68  if (sv1[ind].second < sv2[ind].second)
69  return true;
70  if (sv2[ind].second < sv1[ind].second)
71  return false;
72  }
73  return false;
74 }
75 
77  m_rotNumSeed = iConfig.getParameter<int>("rotNumSeed");
78  m_fname = iConfig.getUntrackedParameter<std::string>("fileName");
79  if (m_fname.empty()) {
80  m_xos = &std::cout;
81  } else {
82  m_xos = new std::ofstream(m_fname.c_str());
83  }
84 
85  (*m_xos) << "<?xml version=\"1.0\"?>\n";
86  (*m_xos) << "<DDDefinition xmlns=\"http://www.cern.ch/cms/DDL\"\n";
87  (*m_xos) << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
88  (*m_xos) << "xsi:schemaLocation=\"http://www.cern.ch/cms/DDL ../../../DetectorDescription/Schema/DDLSchema.xsd\">\n";
89  (*m_xos) << std::fixed << std::setprecision(18);
90 
91  ddToken_ = esConsumes<DDCompactView, IdealMagneticFieldRecord>();
92 }
93 
95  (*m_xos) << "</DDDefinition>\n";
96  (*m_xos) << std::endl;
97  m_xos->flush();
98 }
99 
101  edm::LogInfo("OutputMagneticFieldDDToDDL") << "OutputMagneticFieldDDToDDL::beginRun";
102 
104 
105  const auto& gra = pDD->graph();
106 
107  // Temporary stores:
108  std::set<DDLogicalPart> lpStore;
109  std::set<DDMaterial> matStore;
110  std::set<DDSolid> solStore;
111 
112  std::map<const DDsvalues_type, std::set<const DDPartSelection*>, ddsvaluesCmp> specStore;
113  std::set<DDRotation> rotStore;
114 
116 
117  std::string rn = m_fname;
118  size_t foundLastDot = rn.find_last_of('.');
119  size_t foundLastSlash = rn.find_last_of('/');
120 
121  if (foundLastSlash > foundLastDot && foundLastSlash != std::string::npos) {
122  edm::LogError("OutputMagneticFieldDDToDDL")
123  << "What? last . before last / in path for filename... this should die...";
124  }
125  if (foundLastDot != std::string::npos && foundLastSlash != std::string::npos) {
126  out.ns_ = rn.substr(foundLastSlash, foundLastDot);
127  } else if (foundLastDot != std::string::npos) {
128  out.ns_ = rn.substr(0, foundLastDot);
129  } else {
130  edm::LogError("OutputMagneticFieldDDToDDL")
131  << "What? no file name? Attempt at namespace =\"" << out.ns_ << "\" filename was " << m_fname;
132  }
133 
134  edm::LogInfo("OutputMagneticFieldDDToDDL") << "m_fname=" << m_fname << " namespace = " << out.ns_;
135  std::string ns_ = out.ns_;
136 
137  (*m_xos) << std::fixed << std::setprecision(18);
138 
139  using Graph = DDCompactView::Graph;
141 
142  adjl_iterator git = gra.begin();
143  adjl_iterator gend = gra.end();
144 
145  Graph::index_type i = 0;
146  (*m_xos) << "<PosPartSection label=\"" << ns_ << "\">\n";
147  git = gra.begin();
148  for (; git != gend; ++git) {
149  const DDLogicalPart& ddLP = gra.nodeData(git);
150  if (lpStore.find(ddLP) != lpStore.end()) {
151  addToSpecStore(ddLP, specStore);
152  }
153  lpStore.insert(ddLP);
154  addToMatStore(ddLP.material(), matStore);
155  addToSolStore(ddLP.solid(), solStore, rotStore);
156  ++i;
157  if (!git->empty()) {
158  // ask for children of ddLP
159  auto cit = git->begin();
160  auto cend = git->end();
161  for (; cit != cend; ++cit) {
162  const DDLogicalPart& ddcurLP = gra.nodeData(cit->first);
163  if (lpStore.find(ddcurLP) != lpStore.end()) {
164  addToSpecStore(ddcurLP, specStore);
165  }
166  lpStore.insert(ddcurLP);
167  addToMatStore(ddcurLP.material(), matStore);
168  addToSolStore(ddcurLP.solid(), solStore, rotStore);
169  rotStore.insert(gra.edgeData(cit->second)->ddrot());
170  out.position(ddLP, ddcurLP, gra.edgeData(cit->second), m_rotNumSeed, *m_xos);
171  } // iterate over children
172  } // if (children)
173  } // iterate over graph nodes
174 
175  (*m_xos) << "</PosPartSection>\n";
176 
177  (*m_xos) << std::scientific << std::setprecision(18);
178  std::set<DDMaterial>::const_iterator it(matStore.begin()), ed(matStore.end());
179  (*m_xos) << "<MaterialSection label=\"" << ns_ << "\">\n";
180  for (; it != ed; ++it) {
181  if (!it->isDefined().second)
182  continue;
183  out.material(*it, *m_xos);
184  }
185  (*m_xos) << "</MaterialSection>\n";
186 
187  (*m_xos) << "<RotationSection label=\"" << ns_ << "\">\n";
188  (*m_xos) << std::fixed << std::setprecision(18);
189  std::set<DDRotation>::iterator rit(rotStore.begin()), red(rotStore.end());
190  for (; rit != red; ++rit) {
191  if (!rit->isDefined().second)
192  continue;
193  if (rit->toString() != ":") {
194  const DDRotation& r(*rit);
195  out.rotation(r, *m_xos);
196  }
197  }
198  (*m_xos) << "</RotationSection>\n";
199 
200  (*m_xos) << std::fixed << std::setprecision(18);
201  std::set<DDSolid>::const_iterator sit(solStore.begin()), sed(solStore.end());
202  (*m_xos) << "<SolidSection label=\"" << ns_ << "\">\n";
203  for (; sit != sed; ++sit) {
204  if (!sit->isDefined().second)
205  continue;
206  out.solid(*sit, *m_xos);
207  }
208  (*m_xos) << "</SolidSection>\n";
209 
210  std::set<DDLogicalPart>::iterator lpit(lpStore.begin()), lped(lpStore.end());
211  (*m_xos) << "<LogicalPartSection label=\"" << ns_ << "\">\n";
212  for (; lpit != lped; ++lpit) {
213  if (!lpit->isDefined().first)
214  continue;
215  const DDLogicalPart& lp = *lpit;
216  out.logicalPart(lp, *m_xos);
217  }
218  (*m_xos) << "</LogicalPartSection>\n";
219 
220  (*m_xos) << std::fixed << std::setprecision(18);
221  std::map<DDsvalues_type, std::set<const DDPartSelection*> >::const_iterator mit(specStore.begin()),
222  mend(specStore.end());
223  (*m_xos) << "<SpecParSection label=\"" << ns_ << "\">\n";
224  for (; mit != mend; ++mit) {
225  out.specpar(*mit, *m_xos);
226  }
227  (*m_xos) << "</SpecParSection>\n";
228 }
229 
230 void OutputMagneticFieldDDToDDL::addToMatStore(const DDMaterial& mat, std::set<DDMaterial>& matStore) {
231  matStore.insert(mat);
232  if (mat.noOfConstituents() != 0) {
234  int findex(0);
235  while (findex < mat.noOfConstituents()) {
236  if (matStore.find(mat.constituent(findex).first) == matStore.end()) {
237  addToMatStore(mat.constituent(findex).first, matStore);
238  }
239  ++findex;
240  }
241  }
242 }
243 
245  std::set<DDSolid>& solStore,
246  std::set<DDRotation>& rotStore) {
247  solStore.insert(sol);
248  if (sol.shape() == DDSolidShape::ddunion || sol.shape() == DDSolidShape::ddsubtraction ||
249  sol.shape() == DDSolidShape::ddintersection) {
250  const DDBooleanSolid& bs(sol);
251  if (solStore.find(bs.solidA()) == solStore.end()) {
252  addToSolStore(bs.solidA(), solStore, rotStore);
253  }
254  if (solStore.find(bs.solidB()) == solStore.end()) {
255  addToSolStore(bs.solidB(), solStore, rotStore);
256  }
257  rotStore.insert(bs.rotation());
258  }
259 }
260 
262  const DDLogicalPart& lp,
263  std::map<const DDsvalues_type, std::set<const DDPartSelection*>, ddsvaluesCmp>& specStore) {
264  std::vector<std::pair<const DDPartSelection*, const DDsvalues_type*> >::const_iterator spit(
265  lp.attachedSpecifics().begin()),
266  spend(lp.attachedSpecifics().end());
267  for (; spit != spend; ++spit) {
268  specStore[*spit->second].insert(spit->first);
269  }
270 }
271 
math::Graph< DDLogicalPart, DDPosData * > Graph
Definition: DDCompactView.h:83
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::ESGetToken< DDCompactView, IdealMagneticFieldRecord > ddToken_
std::vector< double >::size_type index_type
Definition: Graph.h:15
void beginRun(edm::Run const &iEvent, edm::EventSetup const &) override
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:45
void addToMatStore(const DDMaterial &mat, std::set< DDMaterial > &matStore)
Log< level::Error, false > LogError
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:57
T getUntrackedParameter(std::string const &, T const &) const
U second(std::pair< T, U > const &p)
int iEvent
Definition: GenABIO.cc:224
void analyze(edm::Event const &iEvent, edm::EventSetup const &) override
std::vector< std::pair< unsigned int, DDValue > > DDsvalues_type
Definition: DDsvalues.h:12
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void addToSolStore(const DDSolid &sol, std::set< DDSolid > &solStore, std::set< DDRotation > &rotStore)
Graph::const_adj_iterator adjl_iterator
void addToSpecStore(const DDLogicalPart &lp, std::map< const DDsvalues_type, std::set< const DDPartSelection *>, ddsvaluesCmp > &specStore)
const DDMaterial & material(void) const
Returns a reference object of the material this LogicalPart is made of.
Log< level::Info, false > LogInfo
FractionV::value_type constituent(int i) const
returns the i-th compound material and its fraction-mass
Definition: DDMaterial.cc:74
constexpr float sol
Definition: Config.h:56
int noOfConstituents() const
returns the number of compound materials or 0 for elementary materials
Definition: DDMaterial.cc:72
OutputMagneticFieldDDToDDL(const edm::ParameterSet &iConfig)
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:141
const std::vector< std::pair< const DDPartSelection *, const DDsvalues_type * > > & attachedSpecifics(void) const
void endRun(edm::Run const &iEvent, edm::EventSetup const &) override
adj_list::const_iterator const_adj_iterator
Definition: Graph.h:105
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
Definition: Run.h:45