#include <DetectorDescription/Parser/src/DDLDivision.h>
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 | |
DDDividedGeometryObject * | makeDivider (const DDDivision &div) |
DDLDivision.h - description ------------------- begin: Friday, April 23, 2004 email: case@ucdhep.ucdavis.edu
Definition at line 23 of file DDLDivision.h.
DDLDivision::DDLDivision | ( | ) |
DDLDivision::~DDLDivision | ( | ) |
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.
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 }