CMS 3D CMS Logo

DDLDivision Class Reference

DDLDivision processes Division elements. More...

#include <DetectorDescription/Parser/src/DDLDivision.h>

Inheritance diagram for DDLDivision:

DDXMLElement

List of all members.

Public Member Functions

 DDLDivision ()
 Constructor.
void preProcessElement (const std::string &name, const std::string &nmspace)
 Called by loadAttributes AFTER attributes are loaded.
void processElement (const std::string &name, const std::string &nmspace)
 Processing the element.
 ~DDLDivision ()
 Destructor.

Private Member Functions

DDDividedGeometryObjectmakeDivider (const DDDivision &div)


Detailed Description

DDLDivision processes Division elements.

Author:
Michael Case
DDLDivision.h - description ------------------- begin: Friday, April 23, 2004 email: case@ucdhep.ucdavis.edu

Definition at line 23 of file DDLDivision.h.


Constructor & Destructor Documentation

DDLDivision::DDLDivision (  ) 

Constructor.

Definition at line 43 of file DDLDivision.cc.

00044 {
00045 }

DDLDivision::~DDLDivision (  ) 

Destructor.

Definition at line 47 of file DDLDivision.cc.

00048 {
00049 }


Member Function Documentation

DDDividedGeometryObject * DDLDivision::makeDivider ( const DDDivision div  )  [private]

Definition at line 127 of file DDLDivision.cc.

References DDDivision::axis(), dd_not_init, ddbox, ddcons, ddintersection, ddpolycone_rrz, ddpolycone_rz, ddpolyhedra_rrz, ddpolyhedra_rz, ddpseudotrap, ddreflected, ddshapeless, ddsubtraction, ddtrap, ddtrunctubs, ddtubs, ddunion, DDAxesNames::name(), DDSolidShapesName::name(), DDName::name(), DDBase< N, C >::name(), DDName::ns(), NULL, DDDivision::parent(), phi, rho, s, DDSolid::shape(), DDLogicalPart::solid(), DDXMLElement::throwError(), x, y, and z.

Referenced by processElement().

00128 {
00129   DDDividedGeometryObject* dg = NULL;
00130 
00131   switch (div.parent().solid().shape()) 
00132     {
00133     case ddbox:
00134       if (div.axis() == x)
00135         dg = new DDDividedBoxX(div);
00136       else if (div.axis() == y)
00137         dg = new DDDividedBoxY(div);
00138       else if (div.axis() == z)
00139         dg = new DDDividedBoxZ(div);
00140       else {
00141         std::string s = "DDLDivision can not divide a ";
00142         s += DDSolidShapesName::name(div.parent().solid().shape());
00143         s += " along axis " + DDAxesNames::name(div.axis());
00144         s += ".";
00145         s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00146         s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00147         throwError(s);
00148       }
00149       break;
00150 
00151     case ddtubs:
00152       if (div.axis() == rho)
00153         dg = new DDDividedTubsRho(div);
00154       else if (div.axis() == phi)
00155         dg = new DDDividedTubsPhi(div);
00156       else if (div.axis() == z)
00157         dg = new DDDividedTubsZ(div);
00158       else {
00159         std::string s = "DDLDivision can not divide a ";
00160         s += DDSolidShapesName::name(div.parent().solid().shape());
00161         s += " along axis " + DDAxesNames::name(div.axis());
00162         s += ".";
00163         s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00164         s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00165         throwError(s);
00166       }
00167       break;
00168 
00169     case ddtrap:
00170       if (div.axis() == x)
00171         dg = new DDDividedTrdX(div);
00172       else if (div.axis() == y )
00173         dg = new DDDividedTrdY(div);
00174       else if (div.axis() == z )
00175         dg = new DDDividedTrdZ(div);
00176       else {
00177         std::string s = "DDLDivision can not divide a ";
00178         s += DDSolidShapesName::name(div.parent().solid().shape());
00179         s += " along axis ";
00180         s += DDAxesNames::name(div.axis());
00181         s += ".";
00182         s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00183         s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00184         throwError(s);
00185       }
00186       break;
00187 
00188     case ddcons:
00189       if (div.axis() == rho)
00190         dg = new DDDividedConsRho(div);
00191       else if (div.axis() == phi)
00192         dg = new DDDividedConsPhi(div);
00193       else if (div.axis() == z)
00194         dg = new DDDividedConsZ(div);
00195       else {
00196         std::string s = "DDLDivision can not divide a ";
00197         s += DDSolidShapesName::name(div.parent().solid().shape());
00198         s += " along axis " + DDAxesNames::name(div.axis());
00199         s += ".";
00200         s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00201         s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00202         throwError(s);
00203       }
00204       break;
00205 
00206     case ddpolycone_rrz:
00207       if (div.axis() == rho)
00208         dg = new DDDividedPolyconeRho(div);
00209       else if (div.axis() == phi)
00210         dg = new DDDividedPolyconePhi(div);
00211       else if (div.axis() == z)
00212         dg = new DDDividedPolyconeZ(div);
00213       else {
00214         std::string s = "DDLDivision can not divide a ";
00215         s += DDSolidShapesName::name(div.parent().solid().shape());
00216         s += " along axis ";
00217         s += DDAxesNames::name(div.axis());
00218         s += ".";
00219         s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00220         s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00221         throwError(s);
00222       }
00223       break;
00224 
00225     case ddpolyhedra_rrz:
00226       if (div.axis() == rho)
00227         dg = new DDDividedPolyhedraRho(div);
00228       else if (div.axis() == phi)
00229         dg = new DDDividedPolyhedraPhi(div);
00230       else if (div.axis() == z)
00231         dg = new DDDividedPolyhedraZ(div);
00232       else {
00233         std::string s = "DDLDivision can not divide a ";
00234         s += DDSolidShapesName::name(div.parent().solid().shape());
00235         s += " along axis ";
00236         s += DDAxesNames::name(div.axis());
00237         s += ".";
00238         s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00239         s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00240         throwError(s);
00241       }
00242       break;
00243 
00244     case ddpolycone_rz:
00245     case ddpolyhedra_rz: {
00246       std::string s = "ERROR:  A Polycone or Polyhedra can not be divided on any axis if it's\n";
00247       s += "original definition used r and z instead of ZSections. This has\n";
00248       s += "not (yet) been implemented.";
00249       s += "\n    name= " + div.name().ns() + ":" + div.name().name() ;
00250       s += "\n    parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
00251     }
00252       break;
00253 
00254     case ddunion: 
00255     case ddsubtraction: 
00256     case ddintersection: 
00257     case ddreflected: 
00258     case ddshapeless: 
00259     case ddpseudotrap: 
00260     case ddtrunctubs:
00261     case dd_not_init: {
00262       std::string s = "DDLDivision can not divide a ";
00263       s += DDSolidShapesName::name(div.parent().solid().shape());
00264       s += " at all (yet?).  Requested axis was ";
00265       s += DDAxesNames::name(div.axis());
00266       s += ".\n";
00267       throwError(s);
00268     }
00269       break;
00270     default:
00271       break;
00272     }
00273   return dg;
00274 
00275 }

void DDLDivision::preProcessElement ( const std::string &  name,
const std::string &  nmspace 
) [virtual]

Called by loadAttributes AFTER attributes are loaded.

The preProcessElement method can assume that the attributes are loaded and perform any code that is necessary at the start of an element.

This would allow users to call their own code to setup anything necessary for the continued processing of the child elements.

Reimplemented from DDXMLElement.

Definition at line 52 of file DDLDivision.cc.

00053 {
00054 
00055 }

void DDLDivision::processElement ( const std::string &  name,
const std::string &  nmspace 
) [virtual]

Processing the element.

The processElement method completes any necessary work to process the XML element.

For example, this can be used to call the DDCore to make the geometry in memory. There is a default for this so that if not declared in the inheriting class, no processing is done.

Reimplemented from DDXMLElement.

Definition at line 57 of file DDLDivision.cc.

References DDXMLElement::clear(), DCOUT_V, em, lat::endl(), ExprEvalInterface::eval(), DDDividedGeometryObject::execute(), DDXMLElement::getAttributeSet(), DDXMLElement::getDDName(), DDI::Singleton< I >::instance(), DDBase< N, C >::isDefined(), lp, makeDivider(), DDAxesNames::name(), DDName::name(), DDName::ns(), DDXMLElement::parent(), DDLogicalPart::solid(), and DDXMLElement::throwError().

00058 {
00059   DCOUT_V('P', "DDLDivision::processElement started");
00060 
00061   DDXMLAttribute atts = getAttributeSet();
00062 
00063   DDName parent = getDDName(nmspace, "parent");
00064   ExprEvalInterface & ev = ExprEvalSingleton::instance();
00065   size_t ax = 0;
00066   while (DDAxesNames::name(DDAxes(ax)) != atts.find("axis")->second &&
00067          DDAxesNames::name(DDAxes(ax)) != "undefined")
00068     ++ax;
00069 
00070   DDLogicalPart lp(parent);
00071   if ( !lp.isDefined().second || !lp.solid().isDefined().second ) {
00072     std::string em("DetectorDescription Parser DDLDivision::processElement(...) failed.");
00073     em += "  The solid of the parent logical part MUST be defined before the Division is made.";
00074     em += "\n    name= " + getDDName(nmspace).ns() + ":" + getDDName(nmspace).name() ;
00075     em += "\n    parent= " + parent.ns() + ":" + parent.name();
00076     throwError (em);
00077   }
00078 
00079   DDDivision div;
00080 
00081   if (atts.find("nReplicas") != atts.end() 
00082       && atts.find("width")  != atts.end()
00083       && atts.find("offset") != atts.end())
00084     {
00085       div = DDDivision(getDDName(nmspace)
00086                        , parent
00087                        , DDAxes(ax)
00088                        , int(ev.eval(nmspace, atts.find("nReplicas")->second))
00089                        , ev.eval(nmspace, atts.find("width")->second)
00090                        , ev.eval(nmspace, atts.find("offset")->second));
00091     }
00092   else if (atts.find("nReplicas")  != atts.end()
00093            && atts.find("offset") != atts.end())
00094     {
00095       div = DDDivision(getDDName(nmspace)
00096                        , parent
00097                        , DDAxes(ax)
00098                        , int(ev.eval(nmspace, atts.find("nReplicas")->second))
00099                        , ev.eval(nmspace, atts.find("offset")->second));
00100     }
00101   else if (atts.find("width")     != atts.end()
00102            && atts.find("offset") != atts.end())
00103     {
00104       DCOUT_V ('D', " width = " << ev.eval(nmspace, atts.find("width")->second) << std::endl);
00105       DCOUT_V ('D', " offset = " << ev.eval(nmspace, atts.find("offset")->second) << std::endl);
00106       div = DDDivision(getDDName(nmspace)
00107                        , parent
00108                        , DDAxes(ax)
00109                        , ev.eval(nmspace, atts.find("width")->second)
00110                        , ev.eval(nmspace, atts.find("offset")->second));
00111     } else {
00112       std::string em("DetectorDescription Parser DDLDivision::processElement(...) failed.");
00113       em += "  Allowed combinations are attributes width&offset OR nReplicas&offset OR nReplicas&width&offset.";
00114       em += "\n    name= " + getDDName(nmspace).ns() + ":" + getDDName(nmspace).name() ;
00115       em += "\n    parent= " + parent.ns() + ":" + parent.name();
00116       throwError (em);
00117     }
00118   DDDividedGeometryObject* dg = makeDivider(div);
00119   dg->execute();
00120   delete dg;
00121 
00122   clear();
00123 
00124   DCOUT_V('P', "DDLDivision::processElement completed");
00125 }


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:18:00 2009 for CMSSW by  doxygen 1.5.4