CMS 3D CMS Logo

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