/DetectorDescription/Parser/src/DDLDivision.cc

https://github.com/aivanov-cern/cmssw · C++ · 262 lines · 226 code · 25 blank · 11 comment · 77 complexity · 977ab3360199ece7d08b27e04cbc5edd MD5 · raw file

  1. /***************************************************************************
  2. DDLDivision.cc - description
  3. -------------------
  4. begin : Friday, April 23, 2004
  5. email : case@ucdhep.ucdavis.edu
  6. ***************************************************************************/
  7. /***************************************************************************
  8. * *
  9. * DDDParser sub-component of DDD *
  10. * *
  11. ***************************************************************************/
  12. #include "DetectorDescription/Parser/src/DDLDivision.h"
  13. #include "DetectorDescription/Parser/src/DDDividedBox.h"
  14. #include "DetectorDescription/Parser/src/DDDividedTubs.h"
  15. #include "DetectorDescription/Parser/src/DDDividedTrd.h"
  16. #include "DetectorDescription/Parser/src/DDDividedCons.h"
  17. #include "DetectorDescription/Parser/src/DDDividedPolycone.h"
  18. #include "DetectorDescription/Parser/src/DDDividedPolyhedra.h"
  19. #include "DetectorDescription/Core/interface/DDName.h"
  20. #include "DetectorDescription/Core/interface/DDAxes.h"
  21. #include "DetectorDescription/Core/interface/DDSolid.h"
  22. #include "DetectorDescription/Core/interface/DDSolidShapes.h"
  23. #include "DetectorDescription/Core/interface/DDLogicalPart.h"
  24. #include "DetectorDescription/Base/interface/DDdebug.h"
  25. #include "DetectorDescription/ExprAlgo/interface/ClhepEvaluator.h"
  26. DDLDivision::DDLDivision( DDLElementRegistry* myreg )
  27. : DDXMLElement( myreg )
  28. {}
  29. DDLDivision::~DDLDivision( void )
  30. {}
  31. void
  32. DDLDivision::preProcessElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
  33. {}
  34. void
  35. DDLDivision::processElement( const std::string& name, const std::string& nmspace, DDCompactView& cpv )
  36. {
  37. DCOUT_V('P', "DDLDivision::processElement started");
  38. DDXMLAttribute atts = getAttributeSet();
  39. DDName parent = getDDName(nmspace, "parent");
  40. ClhepEvaluator & ev = myRegistry_->evaluator();
  41. size_t ax = 0;
  42. while (DDAxesNames::name(DDAxes(ax)) != atts.find("axis")->second &&
  43. DDAxesNames::name(DDAxes(ax)) != "undefined")
  44. ++ax;
  45. DDLogicalPart lp(parent);
  46. if ( !lp.isDefined().second || !lp.solid().isDefined().second ) {
  47. std::string em("DetectorDescription Parser DDLDivision::processElement(...) failed.");
  48. em += " The solid of the parent logical part MUST be defined before the Division is made.";
  49. em += "\n name= " + getDDName(nmspace).ns() + ":" + getDDName(nmspace).name() ;
  50. em += "\n parent= " + parent.ns() + ":" + parent.name();
  51. throwError (em);
  52. }
  53. DDDivision div;
  54. if (atts.find("nReplicas") != atts.end()
  55. && atts.find("width") != atts.end()
  56. && atts.find("offset") != atts.end())
  57. {
  58. div = DDDivision(getDDName(nmspace)
  59. , parent
  60. , DDAxes(ax)
  61. , int(ev.eval(nmspace, atts.find("nReplicas")->second))
  62. , ev.eval(nmspace, atts.find("width")->second)
  63. , ev.eval(nmspace, atts.find("offset")->second));
  64. }
  65. else if (atts.find("nReplicas") != atts.end()
  66. && atts.find("offset") != atts.end())
  67. {
  68. div = DDDivision(getDDName(nmspace)
  69. , parent
  70. , DDAxes(ax)
  71. , int(ev.eval(nmspace, atts.find("nReplicas")->second))
  72. , ev.eval(nmspace, atts.find("offset")->second));
  73. }
  74. else if (atts.find("width") != atts.end()
  75. && atts.find("offset") != atts.end())
  76. {
  77. DCOUT_V ('D', " width = " << ev.eval(nmspace, atts.find("width")->second) << std::endl);
  78. DCOUT_V ('D', " offset = " << ev.eval(nmspace, atts.find("offset")->second) << std::endl);
  79. div = DDDivision(getDDName(nmspace)
  80. , parent
  81. , DDAxes(ax)
  82. , ev.eval(nmspace, atts.find("width")->second)
  83. , ev.eval(nmspace, atts.find("offset")->second));
  84. } else {
  85. std::string em("DetectorDescription Parser DDLDivision::processElement(...) failed.");
  86. em += " Allowed combinations are attributes width&offset OR nReplicas&offset OR nReplicas&width&offset.";
  87. em += "\n name= " + getDDName(nmspace).ns() + ":" + getDDName(nmspace).name() ;
  88. em += "\n parent= " + parent.ns() + ":" + parent.name();
  89. throwError (em);
  90. }
  91. DDDividedGeometryObject* dg = makeDivider(div, &cpv);
  92. dg->execute();
  93. delete dg;
  94. clear();
  95. DCOUT_V('P', "DDLDivision::processElement completed");
  96. }
  97. DDDividedGeometryObject*
  98. DDLDivision::makeDivider( const DDDivision& div, DDCompactView* cpv )
  99. {
  100. DDDividedGeometryObject* dg = NULL;
  101. switch (div.parent().solid().shape())
  102. {
  103. case ddbox:
  104. if (div.axis() == x)
  105. dg = new DDDividedBoxX(div,cpv);
  106. else if (div.axis() == y)
  107. dg = new DDDividedBoxY(div,cpv);
  108. else if (div.axis() == z)
  109. dg = new DDDividedBoxZ(div,cpv);
  110. else {
  111. std::string s = "DDLDivision can not divide a ";
  112. s += DDSolidShapesName::name(div.parent().solid().shape());
  113. s += " along axis " + DDAxesNames::name(div.axis());
  114. s += ".";
  115. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  116. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  117. throwError(s);
  118. }
  119. break;
  120. case ddtubs:
  121. if (div.axis() == rho)
  122. dg = new DDDividedTubsRho(div,cpv);
  123. else if (div.axis() == phi)
  124. dg = new DDDividedTubsPhi(div,cpv);
  125. else if (div.axis() == z)
  126. dg = new DDDividedTubsZ(div,cpv);
  127. else {
  128. std::string s = "DDLDivision can not divide a ";
  129. s += DDSolidShapesName::name(div.parent().solid().shape());
  130. s += " along axis " + DDAxesNames::name(div.axis());
  131. s += ".";
  132. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  133. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  134. throwError(s);
  135. }
  136. break;
  137. case ddtrap:
  138. if (div.axis() == x)
  139. dg = new DDDividedTrdX(div,cpv);
  140. else if (div.axis() == y )
  141. dg = new DDDividedTrdY(div,cpv);
  142. else if (div.axis() == z )
  143. dg = new DDDividedTrdZ(div,cpv);
  144. else {
  145. std::string s = "DDLDivision can not divide a ";
  146. s += DDSolidShapesName::name(div.parent().solid().shape());
  147. s += " along axis ";
  148. s += DDAxesNames::name(div.axis());
  149. s += ".";
  150. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  151. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  152. throwError(s);
  153. }
  154. break;
  155. case ddcons:
  156. if (div.axis() == rho)
  157. dg = new DDDividedConsRho(div,cpv);
  158. else if (div.axis() == phi)
  159. dg = new DDDividedConsPhi(div,cpv);
  160. else if (div.axis() == z)
  161. dg = new DDDividedConsZ(div,cpv);
  162. else {
  163. std::string s = "DDLDivision can not divide a ";
  164. s += DDSolidShapesName::name(div.parent().solid().shape());
  165. s += " along axis " + DDAxesNames::name(div.axis());
  166. s += ".";
  167. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  168. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  169. throwError(s);
  170. }
  171. break;
  172. case ddpolycone_rrz:
  173. if (div.axis() == rho)
  174. dg = new DDDividedPolyconeRho(div,cpv);
  175. else if (div.axis() == phi)
  176. dg = new DDDividedPolyconePhi(div,cpv);
  177. else if (div.axis() == z)
  178. dg = new DDDividedPolyconeZ(div,cpv);
  179. else {
  180. std::string s = "DDLDivision can not divide a ";
  181. s += DDSolidShapesName::name(div.parent().solid().shape());
  182. s += " along axis ";
  183. s += DDAxesNames::name(div.axis());
  184. s += ".";
  185. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  186. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  187. throwError(s);
  188. }
  189. break;
  190. case ddpolyhedra_rrz:
  191. if (div.axis() == rho)
  192. dg = new DDDividedPolyhedraRho(div,cpv);
  193. else if (div.axis() == phi)
  194. dg = new DDDividedPolyhedraPhi(div,cpv);
  195. else if (div.axis() == z)
  196. dg = new DDDividedPolyhedraZ(div,cpv);
  197. else {
  198. std::string s = "DDLDivision can not divide a ";
  199. s += DDSolidShapesName::name(div.parent().solid().shape());
  200. s += " along axis ";
  201. s += DDAxesNames::name(div.axis());
  202. s += ".";
  203. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  204. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  205. throwError(s);
  206. }
  207. break;
  208. case ddpolycone_rz:
  209. case ddpolyhedra_rz: {
  210. std::string s = "ERROR: A Polycone or Polyhedra can not be divided on any axis if it's\n";
  211. s += "original definition used r and z instead of ZSections. This has\n";
  212. s += "not (yet) been implemented.";
  213. s += "\n name= " + div.name().ns() + ":" + div.name().name() ;
  214. s += "\n parent= " + div.parent().name().ns() + ":" + div.parent().name().name();
  215. }
  216. break;
  217. case ddunion:
  218. case ddsubtraction:
  219. case ddintersection:
  220. case ddreflected:
  221. case ddshapeless:
  222. case ddpseudotrap:
  223. case ddtrunctubs:
  224. case dd_not_init: {
  225. std::string s = "DDLDivision can not divide a ";
  226. s += DDSolidShapesName::name(div.parent().solid().shape());
  227. s += " at all (yet?). Requested axis was ";
  228. s += DDAxesNames::name(div.axis());
  229. s += ".\n";
  230. throwError(s);
  231. }
  232. break;
  233. default:
  234. break;
  235. }
  236. return dg;
  237. }