00001 #include "DetectorDescription/Core/interface/DDSolid.h"
00002 #include "DetectorDescription/Core/src/Solid.h"
00003
00004 #include "DetectorDescription/Core/src/Box.h"
00005 #include "DetectorDescription/Core/src/Polycone.h"
00006 #include "DetectorDescription/Core/src/Polyhedra.h"
00007 #include "DetectorDescription/Core/src/Boolean.h"
00008 #include "DetectorDescription/Core/src/Reflection.h"
00009 #include "DetectorDescription/Core/src/Shapeless.h"
00010 #include "DetectorDescription/Core/src/Torus.h"
00011 #include "DetectorDescription/Core/src/Trap.h"
00012 #include "DetectorDescription/Core/src/Tubs.h"
00013 #include "DetectorDescription/Core/src/Cons.h"
00014 #include "DetectorDescription/Core/src/PseudoTrap.h"
00015 #include "DetectorDescription/Core/src/TruncTubs.h"
00016 #include "DetectorDescription/Core/src/Sphere.h"
00017 #include "DetectorDescription/Core/src/Orb.h"
00018 #include "DetectorDescription/Core/src/EllipticalTube.h"
00019 #include "DetectorDescription/Core/src/Ellipsoid.h"
00020 #include "DetectorDescription/Core/src/Parallelepiped.h"
00021 #include <algorithm>
00022
00023
00024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00025
00026 using DDI::Solid;
00027
00028
00029
00030
00031
00032 std::ostream &
00033 operator<<(std::ostream & os, const DDSolid & solid)
00034 {
00035 DDBase<DDName,DDI::Solid*>::def_type defined(solid.isDefined());
00036 if (defined.first) {
00037 os << *(defined.first) << " ";
00038 if (defined.second) {
00039 os << " " << DDSolidShapesName::name(solid.shape()) << ": ";
00040 solid.rep().stream(os);
00041 }
00042 else {
00043 os << "* solid not defined * ";
00044 }
00045 }
00046 else {
00047 os << "* solid not declared * ";
00048 }
00049 return os;
00050 }
00051
00052
00053
00054
00055 DDSolid::DDSolid() : DDBase<DDName,Solid*>() { }
00056
00057
00058 DDSolid::DDSolid(const DDName & n) : DDBase<DDName,Solid*>()
00059 {
00060 prep_ = StoreT::instance().create(n);
00061 }
00062
00063 DDSolid::DDSolid(const DDName & n, Solid * s) : DDBase<DDName,Solid*>()
00064 {
00065 prep_ = StoreT::instance().create(n,s);
00066 }
00067
00068
00069 DDSolid::DDSolid(const DDName & n, DDSolidShape s, const std::vector<double> & p)
00070 {
00071 DDI::Solid * solid(0);
00072 std::vector<double> dummy;
00073 switch(s) {
00074 case ddbox:
00075 solid = new DDI::Box(0,0,0);
00076 break;
00077 case ddtubs:
00078 solid = new DDI::Tubs(0,0,0,0,0);
00079 break;
00080 case ddcons:
00081 solid = new DDI::Cons(0,0,0,0,0,0,0);
00082 break;
00083 case ddpseudotrap:
00084 solid = new DDI::PseudoTrap(0,0,0,0,0,0,0);
00085 break;
00086 case ddshapeless:
00087 solid = new DDI::Shapeless();
00088 break;
00089 case ddtrap:
00090 solid = new DDI::Trap(0,0,0,0,0,0,0,0,0,0,0);
00091 break;
00092 case ddpolyhedra_rz:
00093 solid = new DDI::Polyhedra(0,0,0,dummy,dummy);
00094 break;
00095 case ddpolyhedra_rrz:
00096 solid = new DDI::Polyhedra(0,0,0,dummy,dummy,dummy);
00097 break;
00098 case ddpolycone_rz:
00099 solid = new DDI::Polycone(0,0,dummy,dummy);
00100 break;
00101 case ddpolycone_rrz:
00102 solid = new DDI::Polycone(0,0,dummy,dummy,dummy);
00103 break;
00104 case ddtrunctubs:
00105 solid = new DDI::TruncTubs(0,0,0,0,0,0,0,0);
00106 break;
00107 case ddtorus:
00108 solid = new DDI::Torus(0,0,0,0,0);
00109 break;
00110 case ddsphere:
00111 solid = new DDI::Sphere(0,0,0,0,0,0);
00112 break;
00113 case ddorb:
00114 solid = new DDI::Orb(0);
00115 break;
00116 case ddellipticaltube:
00117 solid = new DDI::EllipticalTube(0,0,0);
00118 break;
00119 case ddellipsoid:
00120 solid = new DDI::Ellipsoid(0,0,0,0,0);
00121 break;
00122 case ddparallelepiped:
00123 solid = new DDI::Parallelepiped(0,0,0,0,0,0);
00124 break;
00125 default:
00126 throw cms::Exception("DDException") << "DDSolid::DDSolid(DDName,DDSolidShape,std::vector<double>: wrong shape";
00127 }
00128 solid->setParameters(p);
00129 prep_ = StoreT::instance().create(n,solid);
00130 }
00131
00132
00133 double DDSolid::volume() const
00134 {
00135 return rep().volume();
00136 }
00137
00138
00139
00140
00141
00142
00143
00144 DDSolidShape DDSolid::shape() const
00145 {
00146 return rep().shape();
00147 }
00148
00149
00150 const std::vector<double> & DDSolid::parameters() const
00151 {
00152 return rep().parameters();
00153 }
00154
00155
00156
00157
00158 DDTrap::DDTrap(const DDSolid & s) : DDSolid(s)
00159 {
00160 if (s.shape() != ddtrap) {
00161 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is no DDTrap.\n";
00162 ex = ex + "Use a different solid interface!";
00163 throw cms::Exception("DDException") << ex;
00164 }
00165 }
00166
00167 double DDTrap::halfZ() const { return rep().parameters()[0]; }
00168
00169 double DDTrap::theta() const { return rep().parameters()[1]; }
00170
00171 double DDTrap::phi() const { return rep().parameters()[2]; }
00172
00173 double DDTrap::y1() const { return rep().parameters()[3]; }
00174
00175 double DDTrap::x1() const { return rep().parameters()[4]; }
00176
00177 double DDTrap::x2() const { return rep().parameters()[5]; }
00178
00179 double DDTrap::alpha1() const { return rep().parameters()[6]; }
00180
00181 double DDTrap::y2() const { return rep().parameters()[7]; }
00182
00183 double DDTrap::x3() const { return rep().parameters()[8]; }
00184
00185 double DDTrap::x4() const { return rep().parameters()[9]; }
00186
00187 double DDTrap::alpha2() const { return rep().parameters()[10]; }
00188
00189
00190
00191 DDTruncTubs::DDTruncTubs(const DDSolid & s) : DDSolid(s)
00192 {
00193 if (s.shape() != ddtrunctubs) {
00194 edm::LogError ("DDSolid") << "s.shape()=" << s.shape() << " " << s << std::endl;
00195 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is no DDTruncTubs\n";
00196 ex = ex + "Use a different solid interface!";
00197 throw cms::Exception("DDException") << ex;
00198 }
00199 }
00200
00201 double DDTruncTubs::zHalf() const { return rep().parameters()[0];}
00202
00203 double DDTruncTubs::rIn() const { return rep().parameters()[1];}
00204
00205 double DDTruncTubs::rOut() const { return rep().parameters()[2];}
00206
00207 double DDTruncTubs::startPhi() const { return rep().parameters()[3];}
00208
00209 double DDTruncTubs::deltaPhi() const { return rep().parameters()[4];}
00210
00211 double DDTruncTubs::cutAtStart() const { return rep().parameters()[5];}
00212
00213 double DDTruncTubs::cutAtDelta() const { return rep().parameters()[6];}
00214
00215 bool DDTruncTubs::cutInside() const { return bool(rep().parameters()[7]);}
00216
00217
00218
00219 DDPseudoTrap::DDPseudoTrap(const DDSolid & s) : DDSolid(s)
00220 {
00221 if (s.shape() != ddpseudotrap) {
00222 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is no DDPseudoTrap\n";
00223 ex = ex + "Use a different solid interface!";
00224 throw cms::Exception("DDException") << ex;
00225 }
00226 }
00227
00228 double DDPseudoTrap::halfZ() const { return rep().parameters()[4]; }
00229
00230 double DDPseudoTrap::x1() const { return rep().parameters()[0]; }
00231
00232 double DDPseudoTrap::x2() const { return rep().parameters()[1]; }
00233
00234 double DDPseudoTrap::y1() const { return rep().parameters()[2]; }
00235
00236 double DDPseudoTrap::y2() const { return rep().parameters()[3]; }
00237
00238 double DDPseudoTrap::radius() const { return rep().parameters()[5]; }
00239
00240 bool DDPseudoTrap::atMinusZ() const { return rep().parameters()[6]; }
00241
00242
00243
00244 DDBox::DDBox(const DDSolid & s)
00245 : DDSolid(s)
00246 {
00247 if (s.shape() != ddbox) {
00248 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDBox.\n";
00249 ex = ex + "Use a different solid interface!";
00250 throw cms::Exception("DDException") << ex;
00251 }
00252 }
00253
00254 double DDBox::halfX() const
00255 { return rep().parameters()[0]; }
00256 double DDBox::halfY() const
00257 { return rep().parameters()[1]; }
00258 double DDBox::halfZ() const
00259 { return rep().parameters()[2]; }
00260
00261
00262
00263
00264 DDReflectionSolid::DDReflectionSolid(const DDSolid & s)
00265 : DDSolid(s), reflected_(0)
00266 {
00267
00268 reflected_ = dynamic_cast<DDI::Reflection*>(&s.rep());
00269 }
00270
00271
00272 DDSolid DDReflectionSolid::unreflected() const
00273 { return reflected_->solid();}
00274
00275
00276
00277
00278 DDShapelessSolid::DDShapelessSolid (const DDSolid & s) : DDSolid(s)
00279 {
00280 if (s.shape() != ddshapeless) {
00281 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDShapelessSolid.\n";
00282 ex = ex + "Use a different solid interface!";
00283 throw cms::Exception("DDException") << ex;
00284 }
00285 }
00286
00287
00288
00289
00290 DDUnion::DDUnion(const DDSolid & s)
00291 : DDBooleanSolid(s)
00292 {
00293 if (s.shape() != ddunion) {
00294 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDUnion.\n";
00295 ex = ex + "Use a different solid interface!";
00296 throw cms::Exception("DDException") << ex;
00297 }
00298 }
00299
00300
00301
00302
00303 DDIntersection::DDIntersection(const DDSolid & s)
00304 : DDBooleanSolid(s)
00305 {
00306 if (s.shape() != ddunion) {
00307 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDIntersection.\n";
00308 ex = ex + "Use a different solid interface!";
00309 throw cms::Exception("DDException") << ex;
00310 }
00311 }
00312
00313
00314
00315
00316 DDSubtraction::DDSubtraction(const DDSolid & s)
00317 : DDBooleanSolid(s)
00318 {
00319 if (s.shape() != ddsubtraction) {
00320 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is no DDSubtraction.\n";
00321 ex = ex + "Use a different solid interface!";
00322 throw cms::Exception("DDException") << ex;
00323 }
00324 }
00325
00326
00327
00328
00329 DDPolySolid::DDPolySolid(const DDSolid & s)
00330 : DDSolid(s)
00331 { }
00332
00333 std::vector<double> DDPolySolid::getVec (const size_t& which,
00334 const size_t& offset,
00335 const size_t& numVecs) const {
00336
00337
00338
00339 std::string locErr;
00340
00341 std::vector<double> tvec;
00342 if ( (rep().parameters().size() - offset) % numVecs != 0 ) {
00343 locErr = std::string("Could not find equal sized components of std::vectors in a PolySolid description.");
00344 edm::LogError ("DDSolid") << "rep().parameters().size()=" << rep().parameters().size() << " numVecs=" << numVecs
00345 << " offset=" << offset << std::endl;
00346 }
00347
00348
00349
00350 for (size_t i = offset + which; i < rep().parameters().size(); i = i + numVecs) {
00351 tvec.push_back(rep().parameters()[i]);
00352 }
00353 return tvec;
00354 }
00355
00356
00357
00358 DDPolycone::DDPolycone(const DDSolid & s)
00359 : DDPolySolid(s)
00360 {
00361 if (s.shape() != ddpolycone_rz && s.shape() != ddpolycone_rrz) {
00362 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDPolycone.\n";
00363 ex = ex + "Use a different solid interface!";
00364 throw cms::Exception("DDException") << ex;
00365 }
00366 }
00367
00368 double DDPolycone::startPhi() const { return rep().parameters()[0]; }
00369
00370 double DDPolycone::deltaPhi() const { return rep().parameters()[1]; }
00371
00372 std::vector<double> DDPolycone::rVec() const {
00373 std::vector<double> tvec;
00374 if (shape() == ddpolycone_rz)
00375 tvec = getVec(1, 2, 2);
00376 return tvec;
00377 }
00378
00379 std::vector<double> DDPolycone::zVec() const {
00380 if (shape() == ddpolycone_rz)
00381 return getVec(0, 2, 2);
00382 else
00383 return getVec(0, 2, 3);
00384 }
00385
00386 std::vector<double> DDPolycone::rMinVec() const {
00387 std::vector<double> tvec;
00388 if (shape() == ddpolycone_rrz)
00389 tvec = getVec(1, 2, 3);
00390 return tvec;
00391 }
00392
00393 std::vector<double> DDPolycone::rMaxVec() const {
00394 std::vector<double> tvec;
00395 if (shape() == ddpolycone_rrz)
00396 tvec = getVec(2, 2, 3);
00397 return tvec;
00398 }
00399
00400
00401
00402
00403 DDPolyhedra::DDPolyhedra(const DDSolid & s)
00404 : DDPolySolid(s)
00405 {
00406 if (s.shape() != ddpolyhedra_rz && s.shape() != ddpolyhedra_rrz) {
00407 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDPolyhedra.\n";
00408 ex = ex + "Use a different solid interface!";
00409 throw cms::Exception("DDException") << ex;
00410 }
00411 }
00412
00413 int DDPolyhedra::sides() const { return int(rep().parameters()[0]); }
00414
00415 double DDPolyhedra::startPhi() const { return rep().parameters()[1]; }
00416
00417 double DDPolyhedra::deltaPhi() const { return rep().parameters()[2]; }
00418
00419 std::vector<double> DDPolyhedra::rVec() const {
00420 std::vector<double> tvec;
00421 if (shape() == ddpolyhedra_rz)
00422 tvec = getVec(1, 3, 2);
00423 return tvec;
00424 }
00425
00426 std::vector<double> DDPolyhedra::zVec() const {
00427 if (shape() == ddpolyhedra_rz)
00428 return getVec(0, 3, 2);
00429 else
00430 return getVec(0, 3, 3);
00431 }
00432
00433 std::vector<double> DDPolyhedra::rMinVec() const {
00434 std::vector<double> tvec;
00435 if (shape() == ddpolyhedra_rrz)
00436 tvec = getVec(1, 3, 3);
00437 return tvec;
00438 }
00439
00440 std::vector<double> DDPolyhedra::rMaxVec() const {
00441 std::vector<double> tvec;
00442 if (shape() == ddpolyhedra_rrz)
00443 tvec = getVec(2, 3, 3);
00444 return tvec;
00445 }
00446
00447
00448
00449 DDCons::DDCons(const DDSolid& s)
00450 : DDSolid(s) {
00451 if (s.shape() != ddcons) {
00452 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDCons.\n";
00453 ex = ex + "Use a different solid interface!";
00454 throw cms::Exception("DDException") << ex;
00455 }
00456 }
00457
00458 double DDCons::zhalf() const { return rep().parameters()[0]; }
00459
00460 double DDCons::rInMinusZ() const { return rep().parameters()[1]; }
00461
00462 double DDCons::rOutMinusZ () const { return rep().parameters()[2]; }
00463
00464 double DDCons::rInPlusZ() const { return rep().parameters()[3]; }
00465
00466 double DDCons::rOutPlusZ() const { return rep().parameters()[4]; }
00467
00468 double DDCons::phiFrom() const { return rep().parameters()[5]; }
00469
00470 double DDCons::deltaPhi() const { return rep().parameters()[6]; }
00471
00472
00473
00474 DDTorus::DDTorus(const DDSolid& s)
00475 : DDSolid(s) {
00476 if (s.shape() != ddtorus) {
00477 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDTorus.\n";
00478 ex = ex + "Use a different solid interface!";
00479 throw cms::Exception("DDException") << ex;
00480 }
00481 }
00482
00483 double DDTorus::rMin() const { return rep().parameters()[0]; }
00484
00485 double DDTorus::rMax() const { return rep().parameters()[1]; }
00486
00487 double DDTorus::rTorus () const { return rep().parameters()[2]; }
00488
00489 double DDTorus::startPhi() const { return rep().parameters()[3]; }
00490
00491 double DDTorus::deltaPhi() const { return rep().parameters()[4]; }
00492
00493
00494
00495
00496 DDTubs::DDTubs(const DDSolid& s)
00497 : DDSolid(s) {
00498 if (s.shape() != ddtubs) {
00499 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDTubs.\n";
00500 ex = ex + "Use a different solid interface!";
00501 throw cms::Exception("DDException") << ex;
00502 }
00503 }
00504
00505 double DDTubs::zhalf() const { return rep().parameters()[0]; }
00506
00507 double DDTubs::rIn() const { return rep().parameters()[1]; }
00508
00509 double DDTubs::rOut() const { return rep().parameters()[2]; }
00510
00511 double DDTubs::startPhi() const { return rep().parameters()[3]; }
00512
00513 double DDTubs::deltaPhi() const { return rep().parameters()[4]; }
00514
00515
00516
00517
00518
00519 DDSolid DDSolidFactory::box(const DDName & name,
00520 double xHalf,
00521 double yHalf,
00522 double zHalf)
00523 {
00524 return DDSolid(name, new DDI::Box(xHalf, yHalf, zHalf ));
00525 }
00526
00527
00528 DDBooleanSolid::DDBooleanSolid(const DDSolid &s)
00529 : DDSolid(s), boolean_(0)
00530 {
00531 boolean_ = dynamic_cast<DDI::BooleanSolid*>(&s.rep());
00532 }
00533
00534
00535 DDRotation DDBooleanSolid::rotation() const
00536 {
00537 return boolean_->r();
00538 }
00539
00540 DDTranslation DDBooleanSolid::translation() const
00541 {
00542 return boolean_->t();
00543 }
00544
00545 DDSolid DDBooleanSolid::solidA() const
00546 {
00547 return boolean_->a();
00548 }
00549
00550 DDSolid DDBooleanSolid::solidB() const
00551 {
00552 return boolean_->b();
00553 }
00554
00555
00556
00557 DDSphere::DDSphere(const DDSolid& s)
00558 : DDSolid(s) {
00559 if (s.shape() != ddsphere) {
00560 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDSphere (or sphere section).\n";
00561 ex = ex + "Use a different solid interface!";
00562 throw cms::Exception("DDException") << ex;
00563 }
00564 }
00565
00566 double DDSphere::innerRadius() const { return rep().parameters()[0]; }
00567
00568 double DDSphere::outerRadius() const { return rep().parameters()[1]; }
00569
00570 double DDSphere::startPhi () const { return rep().parameters()[2]; }
00571
00572 double DDSphere::deltaPhi() const { return rep().parameters()[3]; }
00573
00574 double DDSphere::startTheta() const { return rep().parameters()[4]; }
00575
00576 double DDSphere::deltaTheta() const { return rep().parameters()[5]; }
00577
00578
00579
00580 DDOrb::DDOrb(const DDSolid& s)
00581 : DDSolid(s) {
00582 if (s.shape() != ddorb) {
00583 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDOrb.\n";
00584 ex = ex + "Use a different solid interface!";
00585 throw cms::Exception("DDException") << ex;
00586 }
00587 }
00588
00589 double DDOrb::radius() const { return rep().parameters()[0]; }
00590
00591
00592
00593 DDEllipticalTube::DDEllipticalTube(const DDSolid& s)
00594 : DDSolid(s) {
00595 if (s.shape() != ddellipticaltube) {
00596 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDEllipticalTube.\n";
00597 ex = ex + "Use a different solid interface!";
00598 throw cms::Exception("DDException") << ex;
00599 }
00600 }
00601
00602 double DDEllipticalTube::xSemiAxis() const { return rep().parameters()[0]; }
00603
00604 double DDEllipticalTube::ySemiAxis() const { return rep().parameters()[1]; }
00605
00606 double DDEllipticalTube::zHeight() const { return rep().parameters()[2]; }
00607
00608
00609
00610 DDEllipsoid::DDEllipsoid(const DDSolid& s)
00611 : DDSolid(s) {
00612 if (s.shape() != ddellipsoid) {
00613 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDEllipsoid (or truncated ellipsoid).\n";
00614 ex = ex + "Use a different solid interface!";
00615 throw cms::Exception("DDException") << ex;
00616 }
00617 }
00618
00619 double DDEllipsoid::xSemiAxis() const { return rep().parameters()[0]; }
00620
00621 double DDEllipsoid::ySemiAxis() const { return rep().parameters()[1]; }
00622
00623 double DDEllipsoid::zSemiAxis() const { return rep().parameters()[2]; }
00624
00625 double DDEllipsoid::zBottomCut() const { return rep().parameters()[3]; }
00626
00627 double DDEllipsoid::zTopCut() const { return rep().parameters()[4]; }
00628
00629
00630
00631 DDParallelepiped::DDParallelepiped(const DDSolid& s)
00632 : DDSolid(s) {
00633 if (s.shape() != ddparallelepiped) {
00634 std::string ex = "Solid [" + s.name().ns() + ":" + s.name().name() + "] is not a DDParallelepiped.\n";
00635 ex = ex + "Use a different solid interface!";
00636 throw cms::Exception("DDException") << ex;
00637 }
00638 }
00639
00640 double DDParallelepiped::xHalf() const { return rep().parameters()[0]; }
00641
00642 double DDParallelepiped::yHalf() const { return rep().parameters()[1]; }
00643
00644 double DDParallelepiped::zHalf () const { return rep().parameters()[2]; }
00645
00646 double DDParallelepiped::alpha() const { return rep().parameters()[3]; }
00647
00648 double DDParallelepiped::theta() const { return rep().parameters()[4]; }
00649
00650 double DDParallelepiped::phi() const { return rep().parameters()[5]; }
00651
00652
00653
00654
00655
00656 DDSolid DDSolidFactory::polycone(const DDName & name, double startPhi, double deltaPhi,
00657 const std::vector<double> & z,
00658 const std::vector<double> & rmin,
00659 const std::vector<double> & rmax)
00660 {
00661 return DDSolid(name, new DDI::Polycone(startPhi, deltaPhi, z, rmin, rmax));
00662 }
00663
00664
00665 DDSolid DDSolidFactory::polycone(const DDName & name, double startPhi, double deltaPhi,
00666 const std::vector<double> & z,
00667 const std::vector<double> & r)
00668 {
00669 return DDSolid(name, new DDI::Polycone(startPhi, deltaPhi, z, r));
00670 }
00671
00672
00673 DDSolid DDSolidFactory::polyhedra(const DDName & name,
00674 int sides,
00675 double startPhi,
00676 double deltaPhi,
00677 const std::vector<double> & z,
00678 const std::vector<double> & rmin,
00679 const std::vector<double> & rmax)
00680 {
00681 return DDSolid(name, new DDI::Polyhedra(sides, startPhi, deltaPhi, z, rmin,rmax));
00682 }
00683
00684
00685 DDSolid DDSolidFactory::polyhedra(const DDName & name,
00686 int sides,
00687 double startPhi,
00688 double deltaPhi,
00689 const std::vector<double> & z,
00690 const std::vector<double> & r)
00691 {
00692 return DDSolid(name, new DDI::Polyhedra(sides, startPhi, deltaPhi, z, r));
00693 }
00694
00695
00696 DDSolid DDSolidFactory::unionSolid(const DDName & name,
00697 const DDSolid & a, const DDSolid & b,
00698 const DDTranslation & t,
00699 const DDRotation & r)
00700 {
00701 return DDSolid(name, new DDI::Union(a,b,t,r));
00702 }
00703
00704
00705 DDSolid DDSolidFactory::subtraction(const DDName & name,
00706 const DDSolid & a, const DDSolid & b,
00707 const DDTranslation & t,
00708 const DDRotation & r)
00709 {
00710 return DDSolid(name, new DDI::Subtraction(a,b,t,r));
00711 }
00712
00713
00714 DDSolid DDSolidFactory::intersection(const DDName & name,
00715 const DDSolid & a, const DDSolid & b,
00716 const DDTranslation & t,
00717 const DDRotation & r)
00718 {
00719 return DDSolid(name, new DDI::Intersection(a,b,t,r));
00720 }
00721
00722
00723 DDSolid DDSolidFactory::trap(const DDName & name,
00724 double pDz,
00725 double pTheta, double pPhi,
00726 double pDy1, double pDx1, double pDx2,
00727 double pAlp1,
00728 double pDy2, double pDx3, double pDx4,
00729 double pAlp2)
00730 {
00731 return DDSolid(name, new DDI::Trap(pDz, pTheta, pPhi,
00732 pDy1, pDx1, pDx2, pAlp1,
00733 pDy2, pDx3, pDx4, pAlp2));
00734 }
00735
00736
00737 DDSolid DDSolidFactory::pseudoTrap(const DDName & name,
00738 double pDx1,
00739 double pDx2,
00740 double pDy1,
00741 double pDy2,
00742 double pDz,
00743 double radius,
00744 bool atMinusZ
00745 )
00746 {
00747 return DDSolid(name, new DDI::PseudoTrap(pDx1, pDx2, pDy1, pDy2, pDz, radius, atMinusZ));
00748 }
00749
00750 DDSolid DDSolidFactory::truncTubs(const DDName & name,
00751 double zHalf,
00752 double rIn,
00753 double rOut,
00754 double startPhi,
00755 double deltaPhi,
00756 double cutAtStart,
00757 double cutAtDelta,
00758 bool cutInside )
00759 {
00760 return DDSolid(name, new DDI::TruncTubs(zHalf,rIn,rOut,startPhi,deltaPhi,cutAtStart,cutAtDelta,cutInside));
00761 }
00762
00763 DDSolid DDSolidFactory::cons(const DDName & name,
00764 double zhalf,
00765 double rInMinusZ,
00766 double rOutMinusZ,
00767 double rInPlusZ,
00768 double rOutPlusZ,
00769 double phiFrom,
00770 double deltaPhi)
00771 {
00772 return DDSolid(name, new DDI::Cons(zhalf,
00773 rInMinusZ, rOutMinusZ,
00774 rInPlusZ, rOutPlusZ,
00775 phiFrom, deltaPhi));
00776 }
00777
00778 DDSolid DDSolidFactory::torus(const DDName & name,
00779 double rMin,
00780 double rMax,
00781 double rTorus,
00782 double startPhi,
00783 double deltaPhi)
00784 {
00785 return DDSolid(name, new DDI::Torus(rMin, rMax, rTorus, startPhi, deltaPhi));
00786 }
00787
00788 DDSolid DDSolidFactory::tubs(const DDName & name,
00789 double zhalf,
00790 double rIn, double rOut,
00791 double phiFrom, double deltaPhi)
00792 {
00793 return DDSolid(name, new DDI::Tubs(zhalf,rIn,rOut,phiFrom,deltaPhi));
00794 }
00795
00796
00797 DDSolid DDSolidFactory::sphere(const DDName & name,
00798 double innerRadius,
00799 double outerRadius,
00800 double startPhi,
00801 double deltaPhi,
00802 double startTheta,
00803 double deltaTheta)
00804 {
00805 return DDSolid(name, new DDI::Sphere(innerRadius, outerRadius,
00806 startPhi, deltaPhi,
00807 startTheta, deltaTheta));
00808 }
00809
00810 DDSolid DDSolidFactory::orb(const DDName & name, double radius)
00811 {
00812 return DDSolid(name, new DDI::Orb(radius));
00813 }
00814
00815 DDSolid DDSolidFactory::ellipticalTube(const DDName & name,
00816 double xSemiAxis, double ySemiAxis, double zHeight)
00817 {
00818 return DDSolid(name, new DDI::EllipticalTube(xSemiAxis, ySemiAxis, zHeight));
00819 }
00820
00821 DDSolid DDSolidFactory::ellipsoid(const DDName & name,
00822 double xSemiAxis,
00823 double ySemiAxis,
00824 double zSemiAxis,
00825 double zBottomCut,
00826 double zTopCut
00827 )
00828
00829 {
00830 return DDSolid(name, new DDI::Ellipsoid( xSemiAxis,
00831 ySemiAxis,
00832 zSemiAxis,
00833 zBottomCut,
00834 zTopCut
00835 ));
00836 }
00837
00838 DDSolid DDSolidFactory::parallelepiped(const DDName & name,
00839 double xHalf, double yHalf, double zHalf,
00840 double alpha, double theta, double phi)
00841 {
00842 return DDSolid(name, new DDI::Parallelepiped(xHalf, yHalf, zHalf,
00843 alpha, theta, phi));
00844 }
00845
00846 DDSolid DDSolidFactory::shapeless(const DDName & name)
00847 {
00848 return DDSolid(name, new DDI::Shapeless());
00849 }
00850
00851
00852 DDSolid DDSolidFactory::reflection(const DDName & name,
00853 const DDSolid & s)
00854 {
00855 return DDSolid(name, new DDI::Reflection(s));
00856 }
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939