CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDExpandedView.cc
Go to the documentation of this file.
3 
8  : walker_(0),
9  w2_(cpv.graph(),cpv.root()),
10  trans_( DDTranslation()),
11  rot_( DDRotationMatrix()),
12  depth_( 0 ),
13  worldpos_( cpv.worldPosition())
14 {
15  walker_ = &w2_;
16 
17  const DDPosData * pd((*walker_).current().second);
18  if (!pd)
19  pd = worldpos_;
20  DDExpandedNode expn((*walker_).current().first,
21  pd,
22  trans_,
23  rot_,
24  0);
25 
26  // starting point for position calculations, == root of expanded view
27  history_.push_back(expn);
28 }
29 
31 
33 {
34  return history_.back().logp_;
35 }
36 
37 
39 {
40  return history_.back().trans_;
41 }
42 
43 
45 {
46  return history_.back().rot_;
47 }
48 
49 
51 {
52  return history_;
53 }
54 
55 
57 {
58  return depth_;
59 }
60 
61 
63 {
64  return history_.back().copyno();
65 }
66 
73 {
74  bool result(false);
75  if (scope_.size() && history_.back() == scope_.back()) {
76  ; // no-next-sibling, if current node is the root of the scope!
77  }
78  else {
79  if ((*walker_).nextSibling()) {
80  DDExpandedNode & expn(history_.back()); // back of history_ is always current node
81  DDCompactView::walker_type::value_type curr = (*walker_).current();
82  DDPosData const * posdOld = expn.posd_;
83  expn.logp_=curr.first;
84  expn.posd_=curr.second;
85 
86  DDGeoHistory::size_type hsize = history_.size();
87 
88 
89  if (hsize>1) {
90  const DDExpandedNode & expnBefore(history_[hsize-2]);
91 
92  // T = T1 + INV[R1] * T2
93  expn.trans_ = expnBefore.trans_ + (expnBefore.rot_ * expn.posd_->trans_);
94 
95  // R = R1*INV[R2]
96  // VI in principle we can do this
97  if ( !(expn.posd_->rot()==posdOld->rot()) ) {
98  expn.rot_ = expnBefore.rot_ * expn.posd_->rot();//.inverse();
99  }
100  }
101  else {
102  expn.trans_ = expn.posd_->trans_;
103  expn.rot_ = expn.posd_->rot();//.inverse();
104  }
105  ++expn.siblingno_;
106  result = true;
107  }
108  }
109  return result;
110 }
111 
112 
118 {
119  bool result(false);
120  bool depthNotReached(true);
121 
122  // Check for the depth within the scope ...
123  if (depth_) {
124  if ( (history_.size()-scope_.size())==depth_ ) {
125  depthNotReached=false;
126  }
127  }
128  if (depthNotReached) {
129  if ((*walker_).firstChild()) {
130  DDExpandedNode & expnBefore(history_.back());
131  DDCompactView::walker_type::value_type curr = (*walker_).current();
132 
133  DDPosData * newPosd = curr.second;
134 
135  // T = ... (see nextSiblinig())
136  DDTranslation newTrans = expnBefore.trans_ + expnBefore.rot_ * newPosd->trans_;
137 
138  // R = ... (see nextSibling())
139  DDRotationMatrix newRot = expnBefore.rot_ * newPosd->rot();//.inverse();
140 
141  // create a new Expanded node and push it to the history ...
142  DDExpandedNode expn(curr.first, curr.second,
143  newTrans, newRot, 0);
144 
145  history_.push_back(expn);
146  result = true;
147  } // if firstChild
148  } // if depthNotReached
149  return result;
150 }
151 
152 
158 {
159  bool result(false);
160  bool scopeRoot(false);
161 
162  // check for a scope
163  if (scope_.size()) {
164  if (scope_.back() == history_.back()) {
165  // the current node is the root of the scope
166  scopeRoot = true;
167  }
168  }
169 
170  if (!scopeRoot) {
171  if ((*walker_).parent()) {
172  history_.pop_back();
173  result = true;
174  }
175  }
176 
177  return result;
178 }
179 
180 // same implementation as in GraphWalker !
196 {
197  bool res(false);
198  if(firstChild())
199  res=true;
200  else if(nextSibling())
201  res=true;
202  else {
203  while(parent()) {
204  if(nextSibling()) {
205  res=true;
206  break;
207  }
208  }
209  }
210  return res;
211 }
212 
213 
216 {
217  bool res(false);
218  return res;
219 }
220 
221 
222 void dump(const DDGeoHistory & history)
223 {
224  edm::LogInfo("DDExpandedView") << "--GeoHistory-Dump--[" << std::endl;
225  int i=0;
226  for( const auto& it : history ) {
227  edm::LogInfo("DDExpandedView") << " " << i << it.logicalPart() << std::endl;
228  ++i;
229  }
230  edm::LogInfo("DDExpandedView") << "]---------" << std::endl;
231 }
232 
240 std::vector< const DDsvalues_type *> DDExpandedView::specifics() const
241 {
242  // backward compatible
243  std::vector<const DDsvalues_type * > result;
244  specificsV(result);
245  return result;
246 }
247 
248 void
249 DDExpandedView::specificsV(std::vector<const DDsvalues_type * > & result) const
250 {
251  const auto & specs = logicalPart().attachedSpecifics();
252  if( specs.size())
253  {
254  result.reserve(specs.size());
255  for( const auto& it : specs ) {
256  // a part selection
257  const DDPartSelection & psel = *(it.first);
258  const DDGeoHistory & hist = geoHistory();
259 
260  if (DDCompareEqual(hist, psel)())
261  result.push_back( it.second );
262  }
263  }
264 }
265 
267  DDsvalues_type merged;
268  mergedSpecificsV(merged);
269  return merged;
270 }
271 
273 {
274  merged.clear();
275  const auto& specs = logicalPart().attachedSpecifics();
276  if (specs.empty()) return;
277  const DDGeoHistory & hist = geoHistory();
278  for( const auto& it : specs ) {
279  if (DDCompareEqual(hist, *it.first)())
280  merge(merged,*it.second);
281  }
282 }
283 
291 {
292  return scope_;
293 }
294 
296 {
297  scope_.clear();
298  depth_=0;
299 }
300 
302 {
303  clearScope();
304  while(parent())
305  ;
306 }
307 
308 
320 {
321  bool result(false);
322 
323  DDGeoHistory buf = scope_; // save current scope
324  scope_.clear(); // sets scope to global (full) scope
325 
326  while (parent()) ; // move up to the root of the expanded-view
327 
328  if (descend(sc)) { // try to move down the given scope-history ...
329  scope_ = sc;
330  depth_ = depth;
331  result = true;
332  }
333  else {
334  scope_ = buf;
335  }
336 
337  return result;
338 }
339 
340 
348 {
349  bool result = true;
350  int tempD = depth_;
351  DDGeoHistory tempScope = scope_;
352  reset();
353  DDGeoHistory::size_type s = pos.size();
354  for( DDGeoHistory::size_type j=1; j<s; ++j) {
355  if (! firstChild()) {
356  result = false;
357  break;
358  }
359  int i=0;
360  for (; i<pos[j].siblingno(); ++i) {
361  if (! nextSibling()) {
362  result = false;
363  }
364  }
365  }
366 
367  if (!result) {
368  reset();
369  setScope(tempScope, tempD);
370  }
371  else {
372  scope_ = tempScope;
373  depth_ = tempD;
374  }
375 
376  return result;
377 }
378 
381 {
382  DDGeoHistory::size_type mxx = sc.size();
383  DDGeoHistory::size_type cur = 0;
384  bool result(false);
385 
386  /* algo: compare currerent node in expanded-view with current-node in sc
387  if matching:
388  (A)go to first child in expanded-view, go one level deeper in sc
389  iterate over all children in expanded-view until one of them
390  matches the current node in sc.
391  if no one matches, return false
392  else continue at (A)
393  else return false
394  */
395  const DDExpandedNode & curNode = history_.back();
396 
397  if (sc.size()) {
398  if (curNode==sc[cur]) {
399  bool res(false);
400  while(cur+1 < mxx && firstChild()) {
401  ++cur;
402  if (!(history_.back()==sc[cur])) {
403  while(nextSibling()) {
404  if (history_.back()==sc[cur]) {
405  res=true;
406  break;
407  }
408  }
409  }
410  else {
411  res=true;
412  }
413  if (res==false)
414  break;
415  }
416  result = res;
417  }
418  }
419  return result;
420 }
421 
422 
423 bool DDExpandedView::goTo(const nav_type & newpos) {
424  return goTo(&newpos.front(),newpos.size());
425 
426 }
427 
429  return goTo(newpos.first,newpos.second);
430 }
431 
432 bool DDExpandedView::goTo(int const * newpos, size_t sz)
433 {
434  bool result(false);
435 
436  // save the current position
437  DDGeoHistory savedPos = history_;
438 
439  // reset to root node
440  //FIXME: reset to root of scope!!
441  reset();
442 
443  // try to navigate down to the newpos
444  for (size_t i = 1; i < sz; ++i) {
445  result = firstChild();
446  if (result) {
447  int pos = newpos[i];
448  for(int k=0; k<pos; ++k) {
449  result = nextSibling();
450  }
451  }
452  else {
453  break;
454  }
455  }
456 
457  if (!result) {
458  goToHistory(savedPos);
459  }
460  return result;
461 }
462 
464 {
467  nav_type pos(j);
468 
469  for (;i<j;++i)
470  pos[i] = history_[i].siblingno();
471 
472  return pos;
473 }
474 
476 {
478  DDGeoHistory::size_type sz = history_.size();
479  nav_type result(sz);
480 
481  for (; it < sz; ++it) {
482  result[it] = history_[it].copyno();
483  }
484  return result;
485 }
486 
487 std::string printNavType(int const * n, size_t sz){
488  std::ostringstream oss;
489  oss << '(' ;
490  for (int const * it=n; it != n+sz; ++it) {
491  oss << *it << ',';
492  }
493  oss << ')';
494  return oss.str();
495 }
bool next()
set current node to the next node in the expanded tree
int i
Definition: DBlmapReader.cc:9
const DDRotationMatrix & rotation() const
The absolute rotation of the current node.
bool parent()
set the current node to the parent node ...
Relative position of a child-volume inside a parent-volume.
Definition: DDPosData.h:13
DDsvalues_type mergedSpecifics() const
bool descend(const DDGeoHistory &sc)
nav_type copyNumbers() const
return the stack of copy numbers
compares a given geometrical-history whether it corresponds to the given part-selector ...
Definition: DDComparator.h:13
virtual ~DDExpandedView()
DDGeoHistory history_
std::vector of DDExpandedNode
std::vector< const DDsvalues_type * > specifics() const
User specific data attached to the current node.
represents one node in the DDExpandedView
unsigned int depth_
depth of the scope, 0==unrestricted depth
type of data representation of DDCompactView
Definition: DDCompactView.h:77
uint16_t size_type
std::pair< int const *, size_t > NavRange
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
nav_type navPos() const
return the stack of sibling numbers which indicates the current position in the DDExpandedView ...
tuple result
Definition: mps_fire.py:84
const DDGeoHistory & geoHistory() const
The list of ancestors up to the root-node of the current node.
DDRotationMatrix rot_
DDTranslation trans_
void specificsV(std::vector< const DDsvalues_type * > &vc) const
graph< DDLogicalPart, DDPosData * >::value_type value_type
Definition: graphwalker.h:38
const DDTranslation trans_
DDExpandedView(const DDCompactView &)
Constructs an expanded-view based on the compact-view.
int depth() const
depth of the scope. 0 means unrestricted depth.
std::string printNavType(int const *n, size_t sz)
std::vector< std::pair< unsigned int, DDValue > > DDsvalues_type
std::maps an index to a DDValue. The index corresponds to the index assigned to the name of the std::...
Definition: DDsvalues.h:19
const DDRotationMatrix & rot() const
Definition: DDPosData.h:31
DDCompactView::walker_type * walker_
the tricky walker
int j
Definition: DBlmapReader.cc:9
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:88
DDTranslation trans_
Definition: DDPosData.h:36
bool setScope(const DDGeoHistory &hist, int depth=0)
sets the scope of the expanded view
const DDTranslation & translation() const
The absolute translation of the current node.
void clearScope()
clears the scope; the full tree is available, depth=0
std::vector< DDExpandedNode > DDGeoHistory
Geometrical &#39;path&#39; of the current node up to the root-node.
bool nextB()
broad search order of next()
Definition: adjgraph.h:12
const DDGeoHistory & scope() const
The scope of the expanded-view.
DDCompactView::walker_type w2_
void reset()
true, if a call to firstChild() would succeed (current node has at least one child) ...
int copyno() const
Copy number associated with the current node.
bool firstChild()
set the current node to the first child ...
bool nextSibling()
set the current node to the next sibling ...
const DDRotationMatrix rot_
bool goToHistory(const DDGeoHistory &sc)
bool goTo(const nav_type &)
transversed the DDExpandedView according to the given stack of sibling numbers
const DDPosData * worldpos_
???
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the expanded-view.
DDGeoHistory scope_
scope of the expanded view
const std::vector< std::pair< const DDPartSelection *, const DDsvalues_type * > > & attachedSpecifics(void) const
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
void mergedSpecificsV(DDsvalues_type &res) const
std::vector< int > nav_type
std::vector of sibling numbers