CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | Friends
DDG4SolidConverter Class Reference

#include <DDG4SolidConverter.h>

Public Types

typedef G4VSolid *(* FNPTR )(const DDSolid &)
 

Public Member Functions

G4VSolid * convert (const DDSolid &)
 
 DDG4SolidConverter ()
 
 ~DDG4SolidConverter ()
 

Static Private Member Functions

static G4VSolid * box (const DDSolid &)
 
static G4VSolid * cons (const DDSolid &)
 
static G4VSolid * ellipsoid (const DDSolid &)
 
static G4VSolid * ellipticaltube (const DDSolid &)
 
static G4VSolid * intersection (const DDSolid &)
 
static G4VSolid * orb (const DDSolid &)
 
static G4VSolid * para (const DDSolid &)
 
static G4VSolid * polycone_rrz (const DDSolid &)
 
static G4VSolid * polycone_rz (const DDSolid &)
 
static G4VSolid * polyhedra_rrz (const DDSolid &)
 
static G4VSolid * polyhedra_rz (const DDSolid &)
 
static G4VSolid * pseudotrap (const DDSolid &s)
 
static G4VSolid * reflected (const DDSolid &)
 
static G4VSolid * shapeless (const DDSolid &)
 
static G4VSolid * sphere (const DDSolid &)
 
static G4VSolid * subtraction (const DDSolid &)
 
static G4VSolid * torus (const DDSolid &)
 
static G4VSolid * trap (const DDSolid &)
 
static G4VSolid * trunctubs (const DDSolid &)
 
static G4VSolid * tubs (const DDSolid &)
 
static G4VSolid * unionsolid (const DDSolid &)
 

Private Attributes

std::map< DDSolidShape, FNPTRconvDispatch_
 

Static Private Attributes

static const std::vector
< double > * 
par_ = 0
 

Friends

class testPseudoTrap
 
class testTruncTubs
 

Detailed Description

Definition at line 12 of file DDG4SolidConverter.h.

Member Typedef Documentation

typedef G4VSolid*(* DDG4SolidConverter::FNPTR)(const DDSolid &)

Definition at line 17 of file DDG4SolidConverter.h.

Constructor & Destructor Documentation

DDG4SolidConverter::DDG4SolidConverter ( )

Definition at line 13 of file DDG4SolidConverter.cc.

References box(), cons(), ddbox, ddcons, ddellipsoid, ddellipticaltube, ddintersection, ddorb, ddparallelepiped, ddpolycone_rrz, ddpolycone_rz, ddpolyhedra_rrz, ddpolyhedra_rz, ddpseudotrap, ddreflected, ddsphere, ddsubtraction, ddtorus, ddtrap, ddtrunctubs, ddtubs, ddunion, ellipsoid(), ellipticaltube(), intersection(), orb(), para(), polycone_rrz(), polycone_rz(), polyhedra_rrz(), polyhedra_rz(), pseudotrap(), reflected(), sphere(), subtraction(), torus(), trap(), trunctubs(), tubs(), and unionsolid().

14 {
15  // could also be done 'dynamically' from outside
16  // would then need to have a 'register' method ...
17  par_=0;
38 }
static G4VSolid * polyhedra_rrz(const DDSolid &)
static const std::vector< double > * par_
static G4VSolid * orb(const DDSolid &)
static G4VSolid * ellipsoid(const DDSolid &)
static G4VSolid * trap(const DDSolid &)
static G4VSolid * cons(const DDSolid &)
static G4VSolid * tubs(const DDSolid &)
static G4VSolid * sphere(const DDSolid &)
static G4VSolid * pseudotrap(const DDSolid &s)
static G4VSolid * reflected(const DDSolid &)
static G4VSolid * para(const DDSolid &)
static G4VSolid * box(const DDSolid &)
static G4VSolid * ellipticaltube(const DDSolid &)
static G4VSolid * polycone_rz(const DDSolid &)
static G4VSolid * intersection(const DDSolid &)
static G4VSolid * unionsolid(const DDSolid &)
static G4VSolid * trunctubs(const DDSolid &)
static G4VSolid * torus(const DDSolid &)
static G4VSolid * polyhedra_rz(const DDSolid &)
static G4VSolid * polycone_rrz(const DDSolid &)
std::map< DDSolidShape, FNPTR > convDispatch_
static G4VSolid * subtraction(const DDSolid &)
DDG4SolidConverter::~DDG4SolidConverter ( )

Definition at line 41 of file DDG4SolidConverter.cc.

41 { }

Member Function Documentation

G4VSolid * DDG4SolidConverter::box ( const DDSolid s)
staticprivate

Definition at line 66 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

67 {
68  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: box = " << s ;
69  return new G4Box(s.name().name(), (*par_)[0],(*par_)[1],(*par_)[2]);
70 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::cons ( const DDSolid s)
staticprivate

Definition at line 104 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

105 {
106  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: cons = " << s ;
107  return new G4Cons(s.name().name(), (*par_)[1], // rmin -z
108  (*par_)[2], // rmax -z
109  (*par_)[3], // rmin +z
110  (*par_)[4], // rmax +z
111  (*par_)[0], // zHalf
112  (*par_)[5], // phistart
113  (*par_)[6]); // deltaphi
114 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::convert ( const DDSolid s)

Definition at line 43 of file DDG4SolidConverter.cc.

References Exception, DDSolid::parameters(), query::result, DDSolid::shape(), and DDBase< N, C >::toString().

Referenced by DDG4Builder::convertSolid(), intersection(), reflected(), subtraction(), and unionsolid().

44 {
45  if ( !s ) {
46  edm::LogError("SimG4CoreGeometry") <<" DDG4SolidConverter::convert(..) found an undefined DDSolid " << s.toString();
47  throw cms::Exception("SimG4CoreGeometry", "DDG4SolidConverter::convert(..) found an undefined DDSolid " + s.toString());
48  }
49  G4VSolid * result = 0;
50  par_ = &(s.parameters());
51  map<DDSolidShape,FNPTR>::iterator it = convDispatch_.find(s.shape());
52  if (it != convDispatch_.end()) {
53  result = it->second(s);
54  }
55  else {
56  throw cms::Exception("DetectorDescriptionFault")
57  << "DDG4SolidConverter::convert: conversion failed for s=" << s
58  << "\n solid.shape()=" << s.shape()
59  << std::endl;
60  }
61  return result;
62 }
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:150
static const std::vector< double > * par_
tuple result
Definition: query.py:137
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:144
std::string toString() const
Definition: DDBase.h:82
std::map< DDSolidShape, FNPTR > convDispatch_
G4VSolid * DDG4SolidConverter::ellipsoid ( const DDSolid s)
staticprivate

Definition at line 561 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), alignCSCRings::s, DDEllipsoid::xSemiAxis(), DDEllipsoid::ySemiAxis(), DDEllipsoid::zBottomCut(), DDEllipsoid::zSemiAxis(), and DDEllipsoid::zTopCut().

Referenced by DDG4SolidConverter().

562 {
563  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: ellipsoid = " << s ;
564  DDEllipsoid sp(s);
565  return new G4Ellipsoid(s.name().name(),
566  sp.xSemiAxis(),
567  sp.ySemiAxis(),
568  sp.zSemiAxis(),
569  sp.zBottomCut(),
570  sp.zTopCut());
571 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::ellipticaltube ( const DDSolid s)
staticprivate

Definition at line 550 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), alignCSCRings::s, DDEllipticalTube::xSemiAxis(), DDEllipticalTube::ySemiAxis(), and DDEllipticalTube::zHeight().

Referenced by DDG4SolidConverter().

551 {
552  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: ellipticaltube = " << s ;
553  DDEllipticalTube sp(s);
554  return new G4EllipticalTube(s.name().name(),
555  sp.xSemiAxis(),
556  sp.ySemiAxis(),
557  sp.zHeight());
558 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::intersection ( const DDSolid s)
staticprivate

Definition at line 321 of file DDG4SolidConverter.cc.

References convert(), LogDebug, DDName::name(), DDBase< N, C >::name(), DDRotation::rotation(), DDBooleanSolid::rotation(), alignCSCRings::s, DDBooleanSolid::solidA(), DDBooleanSolid::solidB(), and DDBooleanSolid::translation().

Referenced by DDG4SolidConverter().

322 {
323  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: intersection = " << s ;
324  G4IntersectionSolid * us = 0;
325  DDBooleanSolid bs(s);
326  if (bs) {
327  G4VSolid * sa = DDG4SolidConverter().convert(bs.solidA());
328  G4VSolid * sb = DDG4SolidConverter().convert(bs.solidB());
329  LogDebug("SimG4CoreGeometry") << " name:" << s.name() << " t=" << bs.translation() << flush;
330  LogDebug("SimG4CoreGeometry") << " " << bs.rotation().rotation()->Inverse() << flush;
331  std::vector<double> tdbl(9);
332  bs.rotation().rotation()->Inverse().GetComponents(tdbl.begin(), tdbl.end());
333  CLHEP::HepRep3x3 temprep(tdbl[0], tdbl[1], tdbl[2], tdbl[3], tdbl[4], tdbl[5], tdbl[6], tdbl[7], tdbl[8]);
334  CLHEP::Hep3Vector temphvec(bs.translation().X(), bs.translation().Y(), bs.translation().Z());
335  us = new G4IntersectionSolid(s.name().name(),
336  sa,
337  sb,
338  new CLHEP::HepRotation(temprep),
339  temphvec);
340  }
341  return us;
342 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::orb ( const DDSolid s)
staticprivate

Definition at line 542 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), DDOrb::radius(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

543 {
544  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: orb = " << s ;
545  DDOrb sp(s);
546  return new G4Orb(s.name().name(), sp.radius());
547 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
Definition: DDSolid.h:338
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::para ( const DDSolid s)
staticprivate

Definition at line 574 of file DDG4SolidConverter.cc.

References DDParallelepiped::alpha(), LogDebug, DDName::name(), DDBase< N, C >::name(), DDParallelepiped::phi(), alignCSCRings::s, DDParallelepiped::theta(), DDParallelepiped::xHalf(), DDParallelepiped::yHalf(), and DDParallelepiped::zHalf().

Referenced by DDG4SolidConverter().

575 {
576  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: parallelepiped = " << s ;
577  DDParallelepiped sp(s);
578  return new G4Para(s.name().name(),
579  sp.xHalf(),
580  sp.yHalf(),
581  sp.zHalf(),
582  sp.alpha(),
583  sp.theta(),
584  sp.phi());
585 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::polycone_rrz ( const DDSolid s)
staticprivate

Definition at line 148 of file DDG4SolidConverter.cc.

References prof2calltree::count, i, LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

149 {
150  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: pcon_rrz = " << s ;
151  vector<double> z_p;
152  vector<double> rmin_p;
153  vector<double> rmax_p;
154  vector<double>::const_iterator i = par_->begin()+2;
155  int count = 0;
156  for (; i!=par_->end(); ++i) {
157  LogDebug("SimG4CoreGeometry") << "z=" << *i ;
158  z_p.push_back(*i); ++i;
159  LogDebug("SimG4CoreGeometry") << "rmin=" << *i ;
160  rmin_p.push_back(*i); ++i;
161  LogDebug("SimG4CoreGeometry") << "rmax=" << *i ;
162  rmax_p.push_back(*i);
163  count++;
164  }
165  LogDebug("SimG4CoreGeometry") << "sp=" << (*par_)[0]/deg << " ep=" << (*par_)[1]/deg ;
166  /*
167  std::cout << "### Polycone_RRZ: " << "sp=" << (*par_)[0]/deg
168  << " ep=" << (*par_)[1]/deg
169  << " N= " << count << std::endl;
170  for(int i=0; i<count; ++i) {
171  std::cout << " R1= " << rmin_p[i] << " R1= " << rmax_p[i] << " Z= " << z_p[i] << std::endl;
172  }
173  */
174  return new G4Polycone(s.name().name(), (*par_)[0], (*par_)[1], // start,delta-phi
175  count, // sections
176  &(z_p[0]),
177  &(rmin_p[0]),
178  &(rmax_p[0]));
179 
180 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
static const std::vector< double > * par_
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::polycone_rz ( const DDSolid s)
staticprivate

Definition at line 118 of file DDG4SolidConverter.cc.

References prof2calltree::count, i, LogDebug, DDName::name(), DDBase< N, C >::name(), alignCSCRings::r, and alignCSCRings::s.

Referenced by DDG4SolidConverter().

119 {
120  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: pcon_rz = " << s ;
121  vector<double> r;
122  vector<double> z;
123  vector<double>::const_iterator i = (*par_).begin()+2;
124  int count=0;
125  for(; i!=(*par_).end(); ++i) {
126  LogDebug("SimG4CoreGeometry") << "z=" << *i ;
127  z.push_back(*i); ++i;
128  LogDebug("SimG4CoreGeometry") << " r=" << *i ;
129  r.push_back(*i);
130  count++;
131  }
132  LogDebug("SimG4CoreGeometry") << "sp=" << (*par_)[0]/deg << " ep=" << (*par_)[1]/deg ;
133  /*
134  std::cout << "### Polycone_RZ: " << "sp=" << (*par_)[0]/deg
135  << " ep=" << (*par_)[1]/deg
136  << " N= " << count << std::endl;
137  for(int i=0; i<count; ++i) {
138  std::cout << " R= " << r[i] << " Z= " << z[i] << std::endl;
139  }
140  */
141  return new G4Polycone(s.name().name(), (*par_)[0], (*par_)[1], // start,delta-phi
142  count, // numRZ
143  &(r[0]),
144  &(z[0]));
145 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::polyhedra_rrz ( const DDSolid s)
staticprivate

Definition at line 205 of file DDG4SolidConverter.cc.

References prof2calltree::count, i, LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

206 {
207  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: phed_rrz = " << s ;
208  vector<double> z_p;
209  vector<double> rmin_p;
210  vector<double> rmax_p;
211  vector<double>::const_iterator i = par_->begin()+3;
212  int count = 0;
213  for (; i!=par_->end(); ++i) {
214  LogDebug("SimG4CoreGeometry") << "z=" << *i ;
215  z_p.push_back(*i); ++i;
216  LogDebug("SimG4CoreGeometry") << "rmin=" << *i ;
217  rmin_p.push_back(*i); ++i;
218  LogDebug("SimG4CoreGeometry") << "rmax=" << *i ;
219  rmax_p.push_back(*i);
220  count++;
221  }
222  LogDebug("SimG4CoreGeometry") << "sp=" << (*par_)[0]/deg << " ep=" << (*par_)[1]/deg ;
223  return new G4Polyhedra(s.name().name(), (*par_)[1], (*par_)[2], int((*par_)[0]), // start,delta-phi,sides
224  count, // sections
225  &(z_p[0]),
226  &(rmin_p[0]),
227  &(rmax_p[0]));
228 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
static const std::vector< double > * par_
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::polyhedra_rz ( const DDSolid s)
staticprivate

Definition at line 184 of file DDG4SolidConverter.cc.

References prof2calltree::count, i, LogDebug, DDName::name(), DDBase< N, C >::name(), alignCSCRings::r, and alignCSCRings::s.

Referenced by DDG4SolidConverter().

185 {
186  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: phed_rz = " << s ;
187  vector<double> r;
188  vector<double> z;
189  vector<double>::const_iterator i = par_->begin()+3;
190  int count=0;
191 
192  for(; i!=par_->end(); ++i) {
193  z.push_back(*i); ++i;
194  r.push_back(*i);
195  count++;
196  }
197 
198  return new G4Polyhedra(s.name().name(), (*par_)[1], (*par_)[2], int((*par_)[0]),// start,delta-phi;sides
199  count, // numRZ
200  &(r[0]),
201  &(z[0]));
202 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
static const std::vector< double > * par_
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::pseudotrap ( const DDSolid s)
staticprivate

correct implementation, but fails to visualize due to G4/Iguana limitations

Definition at line 346 of file DDG4SolidConverter.cc.

References funct::abs(), DDPseudoTrap::atMinusZ(), delta, Exception, firstTime, h, DDPseudoTrap::halfZ(), LogDebug, DDName::name(), mergeVDriftHistosByStation::name, DDBase< N, C >::name(), EnergyCorrector::pt, alignCSCRings::r, DDPseudoTrap::radius(), query::result, makeMuonMisalignmentScenario::rot, alignCSCRings::s, mathSSE::sqrt(), x(), DDPseudoTrap::x1(), DDPseudoTrap::x2(), DDPseudoTrap::y1(), and DDPseudoTrap::y2().

Referenced by DDG4SolidConverter().

347 {
348  static G4RotationMatrix * rot = 0;
349  static bool firstTime=true;
350  if (firstTime) {
351  firstTime=false;
352  rot = new G4RotationMatrix;
353  rot->rotateX(90.*deg);
354 
355  }
356  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: pseudoTrap = " << s ;
357  G4Trd * trap = 0;
358  G4Tubs * tubs = 0;
359  G4VSolid * result = 0;
360  DDPseudoTrap pt(s); // pt...PseudoTrap
361  double r = pt.radius();
362  bool atMinusZ = pt.atMinusZ();
363  double x = 0;
364  double h = 0;
365  bool intersec = false; // union or intersection solid
366  if (pt.atMinusZ()) {
367  x = pt.x1(); // tubs radius
368  }
369  else {
370  x = pt.x2(); // tubs radius
371  }
372  double openingAngle = 2.*asin(x/abs(r));
373  //trap = new G4Trd(s.name().name(),
374  double displacement=0;
375  double startPhi=0;
376  /* calculate the displacement of the tubs w.r.t. to the trap,
377  determine the opening angle of the tubs */
378  double delta = sqrt(r*r-x*x);
379  if (r < 0 && abs(r) >= x) {
380  intersec = true; // intersection solid
381  h = pt.y1() < pt.y2() ? pt.y2() : pt.y1(); // tubs half height
382  h += h/20.; // enlarge a bit - for subtraction solid
383  if (atMinusZ) {
384  displacement = - pt.halfZ() - delta;
385  startPhi = 270.*deg - openingAngle/2.;
386  }
387  else {
388  displacement = pt.halfZ() + delta;
389  startPhi = 90.*deg - openingAngle/2.;
390  }
391  }
392  else if ( r > 0 && abs(r) >= x )
393  {
394  if (atMinusZ) {
395  displacement = - pt.halfZ() + delta;
396  startPhi = 90.*deg - openingAngle/2.;
397  h = pt.y1();
398  }
399  else {
400  displacement = pt.halfZ() - delta;
401  startPhi = 270.*deg - openingAngle/2.;
402  h = pt.y2();
403  }
404  }
405  else {
406  throw cms::Exception("DetectorDescriptionFault", "Check parameters of the PseudoTrap! name=" + pt.name().name());
407  }
408  G4ThreeVector displ(0.,0.,displacement); // displacement of the tubs w.r.t. trap
409  LogDebug("SimG4CoreGeometry") << "DDSolidConverter::pseudotrap(): displacement=" << displacement
410  << " openingAngle=" << openingAngle/deg << " x=" << x << " h=" << h;
411 
412  // Now create two solids (trd & tubs), and a boolean solid out of them
413  string name=pt.name().name();
414  trap = new G4Trd(name, pt.x1(), pt.x2(), pt.y1(), pt.y2(), pt.halfZ());
415  tubs = new G4Tubs(name,
416  0., // rMin
417  abs(r), // rMax
418  h, // half height
419  startPhi, // start angle
420  openingAngle);
421  if (intersec) {
422  result = new G4SubtractionSolid(name, trap, tubs, rot, displ);
423  }
424  else {
426  G4VSolid * tubicCap = new G4SubtractionSolid(name,
427  tubs,
428  new G4Box(name, 1.1*x, sqrt(r*r-x*x), 1.1*h),
429  0,
430  G4ThreeVector());
431  result = new G4UnionSolid(name, trap, tubicCap, rot, displ);
432 
433  // approximative implementation - also fails to visualize due to G4/Iguana limitations
434  /*
435  delete tubs;
436  tubs = new G4Tubs(name,
437  sqrt(r*r-x*x), // rMin-approximation!
438  abs(r), // rMax
439  h, // half height
440  startPhi, // start angle
441  openingAngle);
442  result = new G4UnionSolid(name, trap, tubs, rot, displ);
443  */
444  }
445  return result;
446 }
#define LogDebug(id)
dbl * delta
Definition: mlp_gen.cc:36
static G4VSolid * trap(const DDSolid &)
static G4VSolid * tubs(const DDSolid &)
bool firstTime
Definition: QTestHandle.cc:16
T sqrt(T t)
Definition: SSEVec.h:48
tuple result
Definition: query.py:137
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
G4VSolid * DDG4SolidConverter::reflected ( const DDSolid s)
staticprivate

Definition at line 248 of file DDG4SolidConverter.cc.

References convert(), LogDebug, DDName::name(), DDBase< N, C >::name(), alignCSCRings::s, and DDReflectionSolid::unreflected().

Referenced by DDG4SolidConverter().

249 {
250  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: reflected = " << s ;
251  G4ReflectedSolid * rs = 0;
252  DDReflectionSolid rfs(s);
253  if (rfs) {
254  rs = new G4ReflectedSolid(s.name().name(),
255  DDG4SolidConverter().convert(rfs.unreflected()),
256  z_reflection);
257 
258  } // else ?
259  return rs;
260 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
static G4VSolid* DDG4SolidConverter::shapeless ( const DDSolid )
staticprivate
G4VSolid * DDG4SolidConverter::sphere ( const DDSolid s)
staticprivate

Definition at line 529 of file DDG4SolidConverter.cc.

References DDSphere::deltaPhi(), DDSphere::deltaTheta(), DDSphere::innerRadius(), LogDebug, DDName::name(), DDBase< N, C >::name(), DDSphere::outerRadius(), alignCSCRings::s, DDSphere::startPhi(), and DDSphere::startTheta().

Referenced by DDG4SolidConverter().

530 {
531  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: sphere = " << s ;
532  DDSphere sp(s);
533  return new G4Sphere(s.name().name(), sp.innerRadius(),
534  sp.outerRadius(),
535  sp.startPhi(),
536  sp.deltaPhi(),
537  sp.startTheta(),
538  sp.deltaTheta());
539 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::subtraction ( const DDSolid s)
staticprivate

Definition at line 293 of file DDG4SolidConverter.cc.

References convert(), LogDebug, DDName::name(), DDBase< N, C >::name(), DDRotation::rotation(), DDBooleanSolid::rotation(), alignCSCRings::s, DDBooleanSolid::solidA(), DDBooleanSolid::solidB(), and DDBooleanSolid::translation().

Referenced by DDG4SolidConverter().

294 {
295  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: subtraction = " << s ;
296  G4SubtractionSolid * us = 0;
297  DDBooleanSolid bs(s);
298  if (bs) {
299  G4VSolid * sa = DDG4SolidConverter().convert(bs.solidA());
300  G4VSolid * sb = DDG4SolidConverter().convert(bs.solidB());
301  LogDebug("SimG4CoreGeometry") << " name:" << s.name() << " t=" << bs.translation() << flush;
302  // stringstream sst;
303  // bs.rotation().rotation()->inverse().print(sst);
304  // LogDebug("SimG4CoreGeometry") << " " << sst.str() << flush;
305  LogDebug("SimG4CoreGeometry") << " " << bs.rotation().rotation()->Inverse() << flush;
306  std::vector<double> tdbl(9);
307  bs.rotation().rotation()->Inverse().GetComponents(tdbl.begin(), tdbl.end());
308  CLHEP::HepRep3x3 temprep(tdbl[0], tdbl[1], tdbl[2], tdbl[3], tdbl[4], tdbl[5], tdbl[6], tdbl[7], tdbl[8]);
309  CLHEP::Hep3Vector temphvec(bs.translation().X(), bs.translation().Y(), bs.translation().Z());
310  us = new G4SubtractionSolid(s.name().name(),
311  sa,
312  sb,
313  new CLHEP::HepRotation(temprep),
314  temphvec);
315  }
316  return us;
317 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::torus ( const DDSolid s)
staticprivate

Definition at line 231 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

232 {
233  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: torus = " << s ;
234  return new G4Torus(s.name().name(), (*par_)[0], // rmin
235  (*par_)[1], // rmax
236  (*par_)[2], // Rtor
237  (*par_)[3], // phiStart
238  (*par_)[4]);// deltaPhi
239 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::trap ( const DDSolid s)
staticprivate

Definition at line 86 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

87 {
88  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: trap = " << s ;
89  return new G4Trap(s.name().name(), (*par_)[0], // pDz
90  (*par_)[1], // theta
91  (*par_)[2], // phi
92  (*par_)[3], // y1
93  (*par_)[4], // x1
94  (*par_)[5], // x2
95  (*par_)[6], // alpha1
96  (*par_)[7], // y2
97  (*par_)[8], // x3
98  (*par_)[9], // x4
99  (*par_)[10]);// alpha2
100 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::trunctubs ( const DDSolid s)
staticprivate

Definition at line 449 of file DDG4SolidConverter.cc.

References funct::abs(), alpha, funct::cos(), DDTruncTubs::cutAtDelta(), DDTruncTubs::cutAtStart(), DDTruncTubs::cutInside(), SiPixelRawToDigiRegional_cfi::deltaPhi, DDTruncTubs::deltaPhi(), Exception, DDName::fullname(), LogDebug, visualization-live-secondInstance_cfg::m, DDSolidShapesName::name(), DDName::name(), mergeVDriftHistosByStation::name, DDBase< N, C >::name(), dttmaxenums::R, alignCSCRings::r, query::result, DDTruncTubs::rIn(), makeMuonMisalignmentScenario::rot, DDTruncTubs::rOut(), alignCSCRings::s, DDSolid::shape(), funct::sin(), mathSSE::sqrt(), DDTruncTubs::startPhi(), groupFilesInBlocks::tt, and DDTruncTubs::zHalf().

Referenced by DDG4SolidConverter().

450 {
451  // truncated tube-section: a boolean subtraction solid:
452  // from a tube-section a box is subtracted according to the
453  // given parameters
454  LogDebug("SimG4CoreGeometry") << "MantisConverter: solidshape=" << DDSolidShapesName::name(s.shape()) << " " << s;
455  LogDebug("SimG4CoreGeometry") << "before";
456  DDTruncTubs tt(s);
457  LogDebug("SimG4CoreGeometry") << "after";
458  double rIn(tt.rIn()), rOut(tt.rOut()), zHalf(tt.zHalf()),
459  startPhi(tt.startPhi()), deltaPhi(tt.deltaPhi()),
460  cutAtStart(tt.cutAtStart()), cutAtDelta(tt.cutAtDelta());
461  bool cutInside(bool(tt.cutInside()));
462  string name=tt.name().name();
463 
464  // check the parameters
465  if (rIn <= 0 || rOut <=0 || cutAtStart <=0 || cutAtDelta <= 0) {
466  throw cms::Exception("DetectorDescriptionFault", "TruncTubs " + string(tt.name().fullname()) + ": 0 <= rIn,cutAtStart,rOut,cutAtDelta,rOut violated!");
467  }
468  if (rIn >= rOut) {
469  throw cms::Exception("DetectorDescriptionFault", "TruncTubs " + string(tt.name().fullname()) + ": rIn<rOut violated!");
470  }
471  if (startPhi != 0.) {
472  throw cms::Exception("DetectorDescriptionFault", "TruncTubs " + string(tt.name().fullname()) + ": startPhi != 0 not supported!");
473  }
474  // if (cutInside != false) {
475  // throw cms::Exception("DetectorDescriptionFault", "TruncTubs " + string(tt.name()) + " cutInside == true not supported!");
476  // }
477 
478  startPhi=0.;
479  double r(cutAtStart), R(cutAtDelta);
480  G4VSolid * result(0);
481  G4VSolid * tubs = new G4Tubs(name,rIn,rOut,zHalf,startPhi,deltaPhi);
482  LogDebug("SimG4CoreGeometry") << "G4Tubs: " << rIn << ' ' << rOut << ' ' << zHalf << ' ' << startPhi/deg << ' ' << deltaPhi/deg;
483  LogDebug("SimG4CoreGeometry") << s;
484  // length & hight of the box
485  double boxX(30.*rOut), boxY(20.*rOut); // exaggerate dimensions - does not matter, it's subtracted!
486 
487  // width of the box > width of the tubs
488  double boxZ(1.1*zHalf);
489 
490  // angle of the box w.r.t. tubs
491  double cath = r-R*cos(deltaPhi);
492  double hypo = sqrt(r*r+R*R-2.*r*R*cos(deltaPhi));
493  double cos_alpha = cath/hypo;
494 
495  double alpha = -acos(cos_alpha);
496  LogDebug("SimG4CoreGeometry") << "cath=" << cath/m;
497  LogDebug("SimG4CoreGeometry") << "hypo=" << hypo/m;
498  LogDebug("SimG4CoreGeometry") << "al=" << acos(cath/hypo)/deg;
499  LogDebug("SimG4CoreGeometry") << "deltaPhi=" << deltaPhi/deg << "\n"
500  << "r=" << r/m << "\n"
501  << "R=" << R/m;
502 
503  LogDebug("SimG4CoreGeometry") << "alpha=" << alpha/deg;
504 
505  // rotationmatrix of box w.r.t. tubs
506  G4RotationMatrix * rot = new G4RotationMatrix;
507  rot->rotateZ(-alpha);
508  LogDebug("SimG4CoreGeometry") << (*rot);
509 
510  // center point of the box
511  double xBox;
512  if (!cutInside) {
513  xBox = r+boxY/sin(abs(alpha));
514  } else {
515  xBox = -(boxY/sin(abs(alpha))-r);
516  }
517 
518  G4ThreeVector trans(xBox,0.,0.);
519  LogDebug("SimG4CoreGeometry") << "trans=" << trans;
520 
521  G4VSolid * box = new G4Box(name,boxX,boxY,boxZ);
522  result = new G4SubtractionSolid(name,tubs,box,rot,trans);
523 
524  return result;
525 
526 }
#define LogDebug(id)
float alpha
Definition: AMPTWrapper.h:95
A truncated tube section.
Definition: DDSolid.h:132
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
static G4VSolid * tubs(const DDSolid &)
static const char *const name(DDSolidShape s)
Definition: DDSolidShapes.h:21
T sqrt(T t)
Definition: SSEVec.h:48
tuple result
Definition: query.py:137
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:144
static G4VSolid * box(const DDSolid &)
G4VSolid * DDG4SolidConverter::tubs ( const DDSolid s)
staticprivate

Definition at line 74 of file DDG4SolidConverter.cc.

References LogDebug, DDName::name(), DDBase< N, C >::name(), and alignCSCRings::s.

Referenced by DDG4SolidConverter().

75 {
76  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: tubs = " << s ;
77  return new G4Tubs(s.name().name(), (*par_)[1], // rmin
78  (*par_)[2], // rmax
79  (*par_)[0], // dzHalf
80  (*par_)[3], // phiStart
81  (*par_)[4]);// deltaPhi
82 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
G4VSolid * DDG4SolidConverter::unionsolid ( const DDSolid s)
staticprivate

Definition at line 264 of file DDG4SolidConverter.cc.

References convert(), LogDebug, DDName::name(), DDBase< N, C >::name(), DDRotation::rotation(), DDBooleanSolid::rotation(), DDBooleanSolid::solidA(), DDBooleanSolid::solidB(), and DDBooleanSolid::translation().

Referenced by DDG4SolidConverter().

265 {
266  LogDebug("SimG4CoreGeometry") << "DDG4SolidConverter: unionsolid = " << s.name() ;
267  G4UnionSolid * us = 0;
268  DDBooleanSolid bs(s);
269  if (bs) {
270  LogDebug("SimG4CoreGeometry") << "SolidA=" << bs.solidA();
271  G4VSolid * sa = DDG4SolidConverter().convert(bs.solidA());
272  LogDebug("SimG4CoreGeometry") << "SolidB=" << bs.solidB();
273  G4VSolid * sb = DDG4SolidConverter().convert(bs.solidB());
274  LogDebug("SimG4CoreGeometry") << " name:" << s.name() << " t=" << bs.translation() << flush;
275  LogDebug("SimG4CoreGeometry") << " " << bs.rotation().rotation()->Inverse() << flush;
276  std::vector<double> tdbl(9);
277  bs.rotation().rotation()->Inverse().GetComponents(tdbl.begin(), tdbl.end());
278  CLHEP::HepRep3x3 temprep(tdbl[0], tdbl[1], tdbl[2], tdbl[3], tdbl[4], tdbl[5], tdbl[6], tdbl[7], tdbl[8]);
279  CLHEP::Hep3Vector temphvec(bs.translation().X(), bs.translation().Y(), bs.translation().Z());
280  us = new G4UnionSolid(s.name().name(),
281  sa,
282  sb,
283  new CLHEP::HepRotation(temprep),
284  temphvec);
285 
286  } // else?
287  return us;
288 }
#define LogDebug(id)
const N & name() const
Definition: DDBase.h:78
const std::string & name() const
Returns the name.
Definition: DDName.cc:87

Friends And Related Function Documentation

friend class testPseudoTrap
friend

Definition at line 48 of file DDG4SolidConverter.h.

friend class testTruncTubs
friend

Definition at line 47 of file DDG4SolidConverter.h.

Member Data Documentation

std::map<DDSolidShape,FNPTR> DDG4SolidConverter::convDispatch_
private

Definition at line 45 of file DDG4SolidConverter.h.

const vector< double > * DDG4SolidConverter::par_ = 0
staticprivate

Definition at line 44 of file DDG4SolidConverter.h.