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.
4 
9  : walker_(0),w2_(cpv.graph(),cpv.root()), trans_(DDTranslation()), rot_(DDRotationMatrix()),
10  depth_(0), worldpos_(0)
11 {
12  // std::cout << "Building a DDExpandedView" << std::endl;
13  // MEC:2010-02-08 - consider the ROOT as where you want to start LOOKING at
14  // the DDD, and worldpos_ as the "real" root node of the graph. MOVE all this
15  // logic to DDCompactView. This should really be just the traverser...
16  DDRotation::StoreT::instance().setReadOnly(false);
18  DDRotation::StoreT::instance().setReadOnly(true);
19 
20  walker_ = &w2_;
21 
22  // std::cout << "Walker: current.first=" << (*walker_).current().first << std::endl;
23  // std::cout << "Walker: current.second=" << (*walker_).current().second << std::endl;
24 
25  DDPosData * pd((*walker_).current().second);
26  if (!pd)
27  pd = worldpos_;
28  DDExpandedNode expn((*walker_).current().first,
29  pd,
30  trans_,
31  rot_,
32  0);
33 
34  // starting point for position calculations, == root of expanded view
35  history_.push_back(expn);
36 }
37 
38 
40 
41 
43 {
44  return history_.back().logp_;
45 }
46 
47 
49 {
50  return history_.back().trans_;
51 }
52 
53 
55 {
56  return history_.back().rot_;
57 }
58 
59 
61 {
62  return history_;
63 }
64 
65 
67 {
68  return depth_;
69 }
70 
71 
73 {
74  return history_.back().copyno();
75  //return (*walker_).current().second->copyno_;
76 }
77 
78 
79 namespace {
80 
81  struct Counter {
82  int same;
83  int diff;
84  ~Counter() {
85  }
86 
87  };
88 
89  inline Counter & counter() {
90  static Counter local;
91  return local;
92  }
93 
94 
95 }
96 
97 
104 {
105  bool result(false);
106  if (scope_.size() && history_.back() == scope_.back()) {
107  ; // no-next-sibling, if current node is the root of the scope!
108  }
109  else {
110  if ((*walker_).nextSibling()) {
111  DDExpandedNode & expn(history_.back()); // back of history_ is always current node
112  DDCompactView::walker_type::value_type curr = (*walker_).current();
113  DDPosData const * posdOld = expn.posd_;
114  expn.logp_=curr.first;
115  expn.posd_=curr.second;
116 
117  DDGeoHistory::size_type hsize = history_.size();
118 
119 
120  if (hsize>1) {
121  const DDExpandedNode & expnBefore(history_[hsize-2]);
122 
123  // T = T1 + INV[R1] * T2
124  expn.trans_ = expnBefore.trans_ + (expnBefore.rot_ * expn.posd_->trans_);
125 
126  // R = R1*INV[R2]
127  // VI in principle we can do this
128  if ( !(expn.posd_->rot()==posdOld->rot()) ) {
129  expn.rot_ = expnBefore.rot_ * expn.posd_->rot();//.inverse();
130  ++counter().diff;
131  }else ++counter().same;
132 
133  }
134  else {
135  expn.trans_ = expn.posd_->trans_;
136  expn.rot_ = expn.posd_->rot();//.inverse();
137  }
138  ++expn.siblingno_;
139  result = true;
140  }
141  }
142  return result;
143 }
144 
145 
151 {
152  bool result(false);
153  bool depthNotReached(true);
154 
155  // Check for the depth within the scope ...
156  if (depth_) {
157  if ( (history_.size()-scope_.size())==depth_ ) {
158  depthNotReached=false;
159  }
160  }
161  if (depthNotReached) {
162  if ((*walker_).firstChild()) {
163  DDExpandedNode & expnBefore(history_.back());
164  DDCompactView::walker_type::value_type curr = (*walker_).current();
165 
166  DDPosData * newPosd = curr.second;
167 
168  // T = ... (see nextSiblinig())
169  DDTranslation newTrans = expnBefore.trans_ + expnBefore.rot_ * newPosd->trans_;
170 
171  // R = ... (see nextSibling())
172  DDRotationMatrix newRot = expnBefore.rot_ * newPosd->rot();//.inverse();
173 
174  // create a new Expanded node and push it to the history ...
175  DDExpandedNode expn(curr.first, curr.second,
176  newTrans, newRot, 0);
177 
178  history_.push_back(expn);
179 
180  /* debug output
181  edm::LogInfo("DDExpandedView") << "FIRSTCHILD: name=" << expn.logicalPart().ddname()
182  << " rot=";
183 
184  if (expn.absRotation().isIdentity())
185  edm::LogInfo("DDExpandedView") << "[none]" << std::endl;
186  else
187  edm::LogInfo("DDExpandedView") << expn.absRotation() << std::endl;
188  */
189 
190  result = true;
191  } // if firstChild
192  } // if depthNotReached
193  return result;
194 }
195 
196 
202 {
203  bool result(false);
204  bool scopeRoot(false);
205 
206  // check for a scope
207  if (scope_.size()) {
208  if (scope_.back() == history_.back()) {
209  // the current node is the root of the scope
210  scopeRoot = true;
211  }
212  }
213 
214  if (!scopeRoot) {
215  if ((*walker_).parent()) {
216  history_.pop_back();
217  result = true;
218  }
219  }
220 
221  return result;
222 }
223 
224 /*
225 bool DDExpandedView::hasChildren() const
226 {
227  bool result = false;
228 
229  return result;
230 }
231 */
232 
233 // same implementation as in GraphWalker !
249 {
250  bool res(false);
251  if(firstChild())
252  res=true;
253  else if(nextSibling())
254  res=true;
255  else {
256  while(parent()) {
257  //DCOUT('C', "pa=" << logicalPart() );
258  if(nextSibling()) {
259  //DCOUT('C', "ns=" << logicalPart() );
260  res=true;
261  break;
262  }
263  }
264  //DCOUT('C', current().first << " "<< current().second );
265  }
266  return res;
267 }
268 
269 
272 {
273  bool res(false);
274  return res;
275 }
276 
277 
278 void dump(const DDGeoHistory & h)
279 {
280  DDGeoHistory::const_iterator it = h.begin();
281  edm::LogInfo("DDExpandedView") << "--GeoHistory-Dump--[" << std::endl;
282  int i=0;
283  for (; it != h.end(); ++it) {
284  edm::LogInfo("DDExpandedView") << " " << i << it->logicalPart() << std::endl;
285  /*
286  << " " << it->logicalPart().material() << std::endl
287  << " " << it->logicalPart().solid() << std::endl;
288  */
289  ++i;
290  }
291  edm::LogInfo("DDExpandedView") << "]---------" << std::endl;
292 }
293 
302 std::vector< const DDsvalues_type *> DDExpandedView::specifics() const
303 {
304  // backward compatible
305  std::vector<const DDsvalues_type * > result;
306  specificsV(result);
307  return result;
308 }
309 
310 void DDExpandedView::specificsV(std::vector<const DDsvalues_type * > & result) const
311 {
312  unsigned int i(0);
313  //edm::LogInfo("DDExpandedView") << " in ::specifics " << std::endl;
314  const std::vector<std::pair<DDPartSelection*, DDsvalues_type*> > & specs = logicalPart().attachedSpecifics();
315  if (specs.size()) { // do only if SpecPar has data defined
316  //edm::LogInfo("DDExpandedView") << " found: specifics size=" << specs.size() << std::endl;
317  result.reserve(specs.size());
318  for (; i<specs.size(); ++i) {
319  const std::pair<DDPartSelection*,DDsvalues_type*>& sp = specs[i];
320  // a part selection
321  const DDPartSelection & psel = *(sp.first);
322  //edm::LogInfo("DDExpandedView") << " partsel.size = " << psel.size() << std::endl;
323  //edm::LogInfo("DDExpandedView") << " geohistory = " << geoHistory() << std::endl;
324  const DDGeoHistory & hist = geoHistory();
325 
326  //dump(hist);
327  //dump(psel);
328 
329  if (DDCompareEqual(hist, psel)()) //edm::LogInfo("DDExpandedView") << "MATCH!!!!" << std::endl;
330  result.push_back( sp.second );
331  }
332  }
333 }
334 
335 
337  DDsvalues_type merged;
338  mergedSpecificsV(merged);
339  return merged;
340 }
341 
342 
344 {
345 
346  merged.clear();
347  const std::vector<std::pair<DDPartSelection*, DDsvalues_type*> > & specs = logicalPart().attachedSpecifics();
348  if (specs.empty()) return;
349  const DDGeoHistory & hist = geoHistory();
350  for (size_t i=0; i<specs.size(); ++i) {
351  const std::pair<DDPartSelection*,DDsvalues_type*>& sp = specs[i];
352  const DDPartSelection & psel = *(sp.first);
353  if (DDCompareEqual(hist, psel)())
354  merge(merged,*sp.second);
355  }
356  // std::sort(merged.begin(),merged.end());
357 }
358 
359 
367 {
368  return scope_;
369 }
370 
372 {
373  scope_.clear();
374  depth_=0;
375 }
376 
377 
379 {
380  clearScope();
381  while(parent())
382  ;
383 }
384 
385 
396 bool DDExpandedView::setScope(const DDGeoHistory & sc, int depth)
397 {
398  bool result(false);
399 
400  DDGeoHistory buf = scope_; // save current scope
401  scope_.clear(); // sets scope to global (full) scope
402 
403  while (parent()) ; // move up to the root of the expanded-view
404 
405  if (descend(sc)) { // try to move down the given scope-history ...
406  scope_ = sc;
407  depth_ = depth;
408  result = true;
409  }
410  else {
411  scope_ = buf;
412  }
413 
414  return result;
415 }
416 
417 
425 {
426  bool result = true;
427  int tempD = depth_;
428  //DCOUT('G', " goto- target= " << pos );
429  DDGeoHistory tempScope = scope_;
430  reset();
431  DDGeoHistory::size_type s = pos.size();
432  for( DDGeoHistory::size_type j=1; j<s; ++j) {
433  if (! firstChild()) {
434  result = false;
435  //edm::LogError("DDExpandedView") << " ERROR! , wrong usage of DDExpandedView::goTo! " << std::endl;
436  //exit(1);
437  break;
438  }
439  int i=0;
440  for (; i<pos[j].siblingno(); ++i) {
441  if (! nextSibling()) {
442  //edm::LogError("DDExpandedView") << " ERROR! , wrong usage of DDExpandedView::goTo! " << std::endl;
443  result = false;
444  }
445  }
446  }
447 
448  if (!result) {
449  reset();
450  setScope(tempScope, tempD);
451  }
452  else {
453  scope_ = tempScope;
454  depth_ = tempD;
455  }
456 
457  //DCOUT('G', " goto-result = " << history_ );
458  return result;
459 }
460 
463 {
464  DDGeoHistory::size_type mxx = sc.size();
465  DDGeoHistory::size_type cur = 0;
466  bool result(false);
467 
468  /* algo: compare currerent node in expanded-view with current-node in sc
469  if matching:
470  (A)go to first child in expanded-view, go one level deeper in sc
471  iterate over all children in expanded-view until one of them
472  matches the current node in sc.
473  if no one matches, return false
474  else continue at (A)
475  else return false
476  */
477  const DDExpandedNode & curNode = history_.back();
478 
479  if (sc.size()) {
480  //DCOUT('x', "curN=" << curNode.logicalPart() << " scope[0]=" << sc[cur].logicalPart() );
481  if (curNode==sc[cur]) {
482  bool res(false);
483  while(cur+1 < mxx && firstChild()) {
484  ++cur;
485  //DCOUT('x', "fc-curN=" << history_.back().logicalPart() << " scope[x]=" << sc[cur].logicalPart() );
486  if (!(history_.back()==sc[cur])) {
487  while(nextSibling()) {
488  //DCOUT('x', "ns-curN=" << history_.back().logicalPart() << " scope[x]=" << sc[cur].logicalPart() );
489  if (history_.back()==sc[cur]) {
490  res=true;
491  break;
492  }
493  }
494  }
495  else {
496  res=true;
497  }
498  if (res==false)
499  break;
500  }
501  result = res;
502  }
503  }
504  return result;
505 }
506 
507 
508 bool DDExpandedView::goTo(const nav_type & newpos) {
509  return goTo(&newpos.front(),newpos.size());
510 
511 }
512 
514  return goTo(newpos.first,newpos.second);
515 }
516 
517 bool DDExpandedView::goTo(int const * newpos, size_t sz)
518 {
519  bool result(false);
520 
521  // save the current position
522  //nav_type savedPos = navPos();
523  DDGeoHistory savedPos = history_;
524 
525  // reset to root node
526  //FIXME: reset to root of scope!!
527  reset();
528 
529  // try to navigate down to the newpos
530  for (size_t i = 1; i < sz; ++i) {
531  result = firstChild();
532  if (result) {
533  int pos = newpos[i];
534  for(int k=0; k<pos; ++k) {
535  result = nextSibling();
536  }
537  }
538  else {
539  break;
540  }
541  }
542 
543  if (!result) {
544  goToHistory(savedPos);
545  }
546  return result;
547 }
548 
549 
551 {
554  nav_type pos(j);
555 
556  for (;i<j;++i)
557  pos[i] = history_[i].siblingno();
558 
559  return pos;
560 }
561 
563 {
565  DDGeoHistory::size_type sz = history_.size();
566  nav_type result(sz);
567 
568  for (; it < sz; ++it) {
569  result[it] = history_[it].copyno();
570  }
571  return result;
572 }
573 
574 std::ostream & printNavType(std::ostream & os, int const * n, size_t sz){
575  os << '(' ;
576  for (int const * it=n; it != n+sz; ++it) {
577  os << *it << ',';
578  }
579  os << ')';
580  return os;
581 }
582 
583 
584 
585 //THIS IS WRONG, THIS IS WRONG, THIS IS WRONG (not functional wrong but in any other case!)
586 //THIS IS WRONG, THIS IS STUPID, i bin a depp ...
587 /*
588 void doit(DDGeoHistory& h) {
589  DDRotationMatrix m1, m2, m3;
590  DDGeoHistory::size_type s(h.size());
591  std::vector<DDRotationMatrix> rotVec(s);
592  std::vector<DDTranslation> transVec(s);
593 
594  DDGeoHistory::size_type c(s);
595  for (int i=0; i<s; ++i) {
596  rotVec[i] = h[i].posd_->rot_;
597  transVec[i] = h[i].posd_->trans_;
598  }
599 
600  if (s>1) {
601  for (int i=1; i<s; ++i) {
602  rotVec[i] = rotVec[i-1]*rotVec[i];
603  //h[i].rot_ = h[i-1].posd_->rot_ * h[i].posd_->rot_;
604  }
605 
606  for (int i=1; i<s; ++i)
607  transVec[i] = transVec[i-1] + rotVec[i-1]*transVec[i];
608  //h[i].trans_ = h[i-1].trans_ + h[i-1].rot_ * h[i]
609  }
610  h[s-1].trans_ = transVec[s-1];
611  h[s-1].rot_ = rotVec[s-1];
612 
613 }
614 */
615 
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:16
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()
std::ostream & printNavType(std::ostream &, int const *n, size_t sz)
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:81
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 ...
const DDGeoHistory & geoHistory() const
The list of ancestors up to the root-node of the current node.
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
DDRotationMatrix rot_
const std::vector< std::pair< DDPartSelection *, DDsvalues_type * > > & attachedSpecifics() const
static value_type & instance()
DDTranslation trans_
void specificsV(std::vector< const DDsvalues_type * > &vc) const
graph< DDLogicalPart, DDPosData * >::value_type value_type
Definition: graphwalker.h:38
DDPosData * worldpos_
???
unsigned int(* Counter)(align::ID)
Definition: Counters.h:26
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.
tuple result
Definition: query.py:137
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:41
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:95
DDTranslation trans_
Definition: DDPosData.h:47
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
int k[5][pyjets_maxn]
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:15
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
string s
Definition: asciidump.py:422
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the expanded-view.
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
DDGeoHistory scope_
scope of the expanded view
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
string root
initialization
Definition: dbtoconf.py:70