diff --git a/DDCore/CMakeLists.txt b/DDCore/CMakeLists.txt index 21e9a380d7b6d16828a7f15604500689a21b010b..52d2cb85d467b93cefd815f14bf617675ebfc2d7 100644 --- a/DDCore/CMakeLists.txt +++ b/DDCore/CMakeLists.txt @@ -9,8 +9,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include file(GLOB sources src/*.cpp src/Evaluator/*.cpp) if(DD4HEP_USE_PYROOT) - file(GLOB detdesc_headers include/DD4hep/*.h) - ROOT_GENERATE_DICTIONARY( G__DD4hep ${detdesc_headers} LINKDEF include/ROOT/LinkDef.h) + file(GLOB headers include/DD4hep/*.h) + list(REMOVE_ITEM headers ${CMAKE_CURRENT_SOURCE_DIR}/include/DetFactoryHelper.h) + ROOT_GENERATE_DICTIONARY( G__DD4hep ${headers} LINKDEF include/ROOT/LinkDef.h) list(APPEND sources G__DD4hep.cxx) add_definitions(-DDD4HEP_USE_PYROOT) set(libraries PyROOT) diff --git a/DDExamples/CLICSiD/src/DetFactoryHelper.h b/DDCore/include/DD4hep/DetFactoryHelper.h similarity index 96% rename from DDExamples/CLICSiD/src/DetFactoryHelper.h rename to DDCore/include/DD4hep/DetFactoryHelper.h index 73906cee8e8c1cef77184fbd6a47284698531c7e..c8b0c1469be6b7d84bd02841f28ab8dfad4a58f5 100644 --- a/DDExamples/CLICSiD/src/DetFactoryHelper.h +++ b/DDCore/include/DD4hep/DetFactoryHelper.h @@ -22,7 +22,7 @@ typedef DD4hep::XML::Collection_t xml_coll_t; typedef DD4hep::XML::Handle_t xml_h; typedef DD4hep::XML::RefElement xml_ref_t; typedef DD4hep::XML::DetElement xml_det_t; -typedef xml_det_t::Component xml_comp_t; +typedef xml_det_t::Component xml_comp_t; typedef DD4hep::XML::Dimension xml_dim_t; typedef DD4hep::Geometry::LCDD lcdd_t; diff --git a/DDCore/python/lcdd.py b/DDCore/python/lcdd.py index 48694e82502672d3ef627356b6708b5b7b38c9fe..c46f0323336c606b3f9076ea8a2ace6414c4d609 100644 --- a/DDCore/python/lcdd.py +++ b/DDCore/python/lcdd.py @@ -40,23 +40,28 @@ def _getFloat(self,*attrib): sval = self.get(attrib[0], None) if not sval and len(attrib) > 1: return attrib[1] else: return float(eval(sval.replace('(int)',''), constants)) -def _getBool(self,attrib): return bool(self.get(attrib)) +def _getBool(self,attrib): return self.get(attrib).lower() in ('true', 'yes', 'on') xml._ElementInterface.getI = _getInt xml._ElementInterface.getF = _getFloat xml._ElementInterface.getB = _getBool + xml._ElementInterface.name = property(lambda self: self.get('name')) xml._ElementInterface.type = property(lambda self: self.get('type')) xml._ElementInterface.vis = property(lambda self: self.get('vis')) xml._ElementInterface.material = property(lambda self: self.get('material')) xml._ElementInterface.module = property(lambda self: self.get('module')) xml._ElementInterface.id = property(lambda self: self.getI('id')) +xml._ElementInterface.number = property(lambda self: self.getI('number')) xml._ElementInterface.x1 = property(lambda self: self.getF('x1')) xml._ElementInterface.x2 = property(lambda self: self.getF('x2')) xml._ElementInterface.x = property(lambda self: self.getF('x')) xml._ElementInterface.y = property(lambda self: self.getF('y')) xml._ElementInterface.z = property(lambda self: self.getF('z')) xml._ElementInterface.zstart = property(lambda self: self.getF('zstart')) +xml._ElementInterface.offset = property(lambda self: self.getF('offset')) +xml._ElementInterface.radius = property(lambda self: self.getF('radius')) +xml._ElementInterface.zhalf = property(lambda self: self.getF('zhalf')) xml._ElementInterface.phi0 = property(lambda self: self.getF('phi0')) xml._ElementInterface.r = property(lambda self: self.getF('r')) xml._ElementInterface.dz = property(lambda self: self.getF('dz')) @@ -66,7 +71,17 @@ xml._ElementInterface.width = property(lambda self: self.getF('width')) xml._ElementInterface.inner_r = property(lambda self: self.getF('inner_r')) xml._ElementInterface.outer_r = property(lambda self: self.getF('outer_r')) xml._ElementInterface.z_length = property(lambda self: self.getF('z_length')) +xml._ElementInterface.rmin = property(lambda self: self.getF('rmin')) +xml._ElementInterface.rmax = property(lambda self: self.getF('rmax')) + + +def getRotation(rot): + return Rotation(rot.getF('x',0.0),rot.getF('y',0.0), rot.getF('z',0.0)) +def getPosition(pos): + return Position(pos.getF('x',0.0),pos.getF('y',0.0), pos.getF('z',0.0)) +drivers['getRotation'] = getRotation +drivers['getPosition'] = getPosition #--------------------------------------------------------------------------------- @@ -202,6 +217,7 @@ def process_display(lcdd, elem): if 'drawingStyle' in v.keys() : ds = v.get('drawingStyle') if ds == 'wireframe' : visattr.setDrawingStyle(VisAttr.WIREFRAME) + print visattr.toString() lcdd.addVisAttribute(visattr) def process_limits(lcdd, elem): @@ -219,7 +235,6 @@ def process_detectors(lcdd, elem): procs = drivers.get('detector_%s'% d.get('type'), None) if procs : detector = apply(procs,(lcdd, d)) - print "Adding detector ", detector lcdd.addDetector(detector) else : print 'Detector type %s not found' % d.get('type') diff --git a/DDCore/src/LCDDImp.cpp b/DDCore/src/LCDDImp.cpp index ecceb73fe0d2a2256a312504005496ce86fbac20..2411ba0410a561a4473c27208143510bd5fe4e71 100644 --- a/DDCore/src/LCDDImp.cpp +++ b/DDCore/src/LCDDImp.cpp @@ -116,8 +116,8 @@ void LCDDImp::init() { Tube trackingSolid(lcdd,"tracking_cylinder", 0., _toDouble("tracking_region_radius"), - _toDouble("2*tracking_region_zmax"),M_PI); - Volume tracking(lcdd,"tracking_volume",trackingSolid,air); + _toDouble("2*tracking_region_zmax"),2*M_PI); + Volume tracking(lcdd,"tracking_volume",trackingSolid, air); world.placeVolume(tracking); //Ref_t ref_world(lcdd,"world",world.refName()); diff --git a/DDCore/src/LCDDImp.h b/DDCore/src/LCDDImp.h index 914755c9a5be05bad66be1395efc3a1dc39929db..d2f5a853a747a7f83f5fef748cfadb4d1546767e 100644 --- a/DDCore/src/LCDDImp.h +++ b/DDCore/src/LCDDImp.h @@ -21,28 +21,28 @@ class TGeoManager; * DD4hep namespace declaration */ namespace DD4hep { - + /* * XML namespace declaration */ namespace Geometry { - + struct Materials {}; - + class LCDDImp : public LCDD { public: struct InvalidObjectError : public std::runtime_error { InvalidObjectError(const std::string& msg) : std::runtime_error(msg) {} }; - + struct ObjectHandleMap : public HandleMap { ObjectHandleMap() {} void append_noCheck(const Ref_t& e) { if ( e.isValid() ) { std::string n = e.name(); - if ( this->find(n) != this->end() ) { - throw InvalidObjectError("Object "+n+" is already present in map!"); - } + if ( this->find(n) != this->end() ) { + throw InvalidObjectError("Object "+n+" is already present in map!"); + } this->insert(std::make_pair(n,e.ptr())); } } @@ -63,7 +63,7 @@ namespace DD4hep { throw InvalidObjectError("Attempt to add an object, which is of the wrong type."); } }; - + ObjectHandleMap m_readouts; ObjectHandleMap m_header; ObjectHandleMap m_idDict; @@ -73,44 +73,44 @@ namespace DD4hep { ObjectHandleMap m_sensitive; ObjectHandleMap m_display; ObjectHandleMap m_fields; - + // GDML fields ObjectHandleMap m_gdml; ObjectHandleMap m_define; ObjectHandleMap m_structure; ObjectHandleMap m_materials; ObjectHandleMap m_solids; - - + + Volume m_worldVol; Volume m_trackingVol; - + Material m_materialAir; Material m_materialVacuum; - + Ref_t m_setup; - + void convertMaterials(const std::string& uri); //void convertMaterials(XML::Handle_t doc_element); - + LCDDImp(); //void fromCompact(XML::Handle_t doc_element); virtual void fromCompact(const std::string& fname); - + virtual void create(); virtual void init(); virtual void addStdMaterials(); virtual void endDocument(); - + void dump() const; - + virtual Handle<TObject> getRefChild(const HandleMap& e, const std::string& name, bool throw_if_not=true) const; virtual Volume pickMotherVolume(const DetElement& sd) const; virtual Volume worldVolume() const { return m_worldVol; } virtual Volume trackingVolume() const { return m_trackingVol; } virtual Material air() const { return m_materialVacuum; } virtual Material vacuum() const { return m_materialAir; } - + virtual LimitSet limitSet(const std::string& name) const { return getRefChild(m_limits,name); } virtual VisAttr visAttributes(const std::string& name) const @@ -131,7 +131,7 @@ namespace DD4hep { { return getRefChild(m_readouts,name); } virtual DetElement detector(const std::string& name) const { return getRefChild(m_detectors,name); } - + virtual const HandleMap& header() const { return m_header; } virtual const HandleMap& constants() const { return m_define; } virtual const HandleMap& visAttributes() const { return m_display; } @@ -142,7 +142,7 @@ namespace DD4hep { virtual const HandleMap& materials() const { return m_materials; } virtual const HandleMap& readouts() const { return m_readouts; } virtual const HandleMap& detectors() const { return m_detectors; } - + virtual LCDD& add(const Constant& x) { return addConstant(x); } virtual LCDD& add(const Solid& x) { return addSolid(x); } virtual LCDD& add(const Volume& x) { return addVolume(x); } @@ -152,12 +152,12 @@ namespace DD4hep { virtual LCDD& add(const VisAttr& x) { return addVisAttribute(x); } virtual LCDD& add(const Readout& x) { return addReadout(x); } virtual LCDD& add(const DetElement& x) { return addDetector(x); } - + #define __R return *this // These are manager by the TGeoManager virtual LCDD& addSolid(const Ref_t& x); // { m_solids.append(x); __R;} virtual LCDD& addVolume(const Ref_t& x); // { m_structure.append(x); __R;} - + // These not: virtual LCDD& addConstant(const Ref_t& x) { m_define.append(x); __R;} virtual LCDD& addMaterial(const Ref_t& x) { m_materials.append(x); __R;} @@ -169,7 +169,7 @@ namespace DD4hep { virtual LCDD& addSensitiveDetector(const Ref_t& x){ m_sensitive.append(x); __R;} virtual LCDD& addDetector(const Ref_t& x) { m_detectors.append_noCheck(x); __R;} #undef __R - + }; } } /* End namespace DD4hep */ diff --git a/DDCore/src/compact/Compact2Objects.cpp b/DDCore/src/compact/Compact2Objects.cpp index 014e3bae7916a09dd376a2dd7d08022ca5ce5559..4c19c638c74a9bb2b5d21a3f18f91909f9d435ce 100644 --- a/DDCore/src/compact/Compact2Objects.cpp +++ b/DDCore/src/compact/Compact2Objects.cpp @@ -7,9 +7,10 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "DD4hep/IDDescriptor.h" #include "XML/DocumentHandler.h" +#include "xercesc/util/XMLURL.hpp" #include "Conversions.h" #include "TGeoManager.h" @@ -34,24 +35,24 @@ namespace DD4hep { namespace Geometry { struct Includes; struct GdmlFile; typedef DD4hep::IDDescriptor IDDescriptor; - + template <typename T> Handle<> toObject(LCDD& lcdd, const XML::Handle_t& xml); - + template <> Ref_t toRefObject<Constant>(lcdd_t& lcdd, const xml_h& e) { xml_ref_t constant(e); TNamed* obj = new TNamed(constant.attr<string>(_A(name)).c_str(), - constant.attr<string>(_A(value)).c_str()); + constant.attr<string>(_A(value)).c_str()); Ref_t cons(obj); _toDictionary(obj->GetName(),obj->GetTitle()); lcdd.addConstant(cons); return cons; } - + template <> Ref_t toRefObject<Atom>(lcdd_t& /* lcdd */, const xml_h& e) { /* <element Z="29" formula="Cu" name="Cu" > - <atom type="A" unit="g/mol" value="63.5456" /> - </element> - */ + <atom type="A" unit="g/mol" value="63.5456" /> + </element> + */ xml_ref_t elem(e); TGeoManager* mgr = gGeoManager; XML::Tag_t eltname = elem.name(); @@ -60,26 +61,26 @@ namespace DD4hep { namespace Geometry { if ( !element ) { xml_ref_t atom(elem.child(_X(atom))); tab->AddElement(elem.attr<string>(_A(name)).c_str(), - elem.attr<string>(_A(formula)).c_str(), - elem.attr<int>(_A(Z)), - atom.attr<int>(_A(value)) - ); + elem.attr<string>(_A(formula)).c_str(), + elem.attr<int>(_A(Z)), + atom.attr<int>(_A(value)) + ); element = tab->FindElement(eltname.c_str()); } return Ref_t(element); } - + template <> Ref_t toRefObject<Material>(lcdd_t& /* lcdd */, const xml_h& e) { /* <material name="Air"> - <D type="density" unit="g/cm3" value="0.0012"/> - <fraction n="0.754" ref="N"/> - <fraction n="0.234" ref="O"/> - <fraction n="0.012" ref="Ar"/> - </material> - <element Z="29" formula="Cu" name="Cu" > - <atom type="A" unit="g/mol" value="63.5456" /> - </element> - */ + <D type="density" unit="g/cm3" value="0.0012"/> + <fraction n="0.754" ref="N"/> + <fraction n="0.234" ref="O"/> + <fraction n="0.012" ref="Ar"/> + </material> + <element Z="29" formula="Cu" name="Cu" > + <atom type="A" unit="g/mol" value="63.5456" /> + </element> + */ xml_ref_t m(e); TGeoManager* mgr = gGeoManager; XML::Tag_t mname = m.name(); @@ -96,20 +97,20 @@ namespace DD4hep { namespace Geometry { } if ( mix ) { for(Int_t i=0, n=mix->GetNelements(); i<n; ++i) - elts.insert(mix->GetElement(i)->GetName()); + elts.insert(mix->GetElement(i)->GetName()); } for(; composites; ++composites) { std::string nam = composites.attr<string>(_X(ref)); TGeoElement* element; if ( elts.find(nam) == elts.end() ) { - double fraction = composites.attr<double>(_X(n)); - if ( 0 != (element=table->FindElement(nam.c_str())) ) - mix->AddElement(element,fraction); - else if ( 0 != (mat=mgr->GetMaterial(nam.c_str())) ) - mix->AddElement(mat,fraction); - else { - throw runtime_error("Something going very wrong. Undefined material:"+nam); - } + double fraction = composites.attr<double>(_X(n)); + if ( 0 != (element=table->FindElement(nam.c_str())) ) + mix->AddElement(element,fraction); + else if ( 0 != (mat=mgr->GetMaterial(nam.c_str())) ) + mix->AddElement(mat,fraction); + else { + throw runtime_error("Something going very wrong. Undefined material:"+nam); + } } } TGeoMedium* medium = mgr->GetMedium(matname); @@ -121,7 +122,7 @@ namespace DD4hep { namespace Geometry { } return Ref_t(medium); } - + template <> Ref_t toRefObject<IDDescriptor>(lcdd_t& /* lcdd */, const xml_h& e) { /* <id>system:6,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id> */ Value<TNamed,IDDescriptor>* id = new Value<TNamed,IDDescriptor>(); @@ -130,7 +131,7 @@ namespace DD4hep { namespace Geometry { id->SetTitle(dsc.c_str()); return Ref_t(id); } - + template <> Ref_t toRefObject<Limit>(lcdd_t& lcdd, const xml_h& e) { /* <limit name="step_length_max" particles="*" value="5.0" unit="mm" /> */ @@ -140,7 +141,7 @@ namespace DD4hep { namespace Geometry { limit.setUnit(e.attr<string>(_A(unit))); return limit; } - + template <> Ref_t toRefObject<LimitSet>(lcdd_t& lcdd, const xml_h& e) { /* <limitset name="...."> ... </limitset> */ @@ -149,7 +150,7 @@ namespace DD4hep { namespace Geometry { ls.addLimit(toRefObject<Limit>(lcdd,c)); return ls; } - + /// Convert compact visualization attribute to LCDD visualization attribute template <> Ref_t toRefObject<VisAttr>(lcdd_t& lcdd, const xml_h& e) { /* <vis name="SiVertexBarrelModuleVis" alpha="1.0" r="1.0" g="0.75" b="0.76" drawingStyle="wireframe" showDaughters="false" visible="true"/> @@ -179,7 +180,7 @@ namespace DD4hep { namespace Geometry { if ( e.hasAttr(_A(showDaughters)) ) attr.setShowDaughters(e.attr<bool>(_A(showDaughters))); return attr; } - + template <> Elt_t toObject<GridXYZ>(lcdd_t& lcdd, const xml_h& e) { GridXYZ obj(lcdd); if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<float>(_A(gridSizeX))); @@ -193,35 +194,35 @@ namespace DD4hep { namespace Geometry { if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<float>(_A(gridSizeY))); return obj; } - + template <> Elt_t toObject<CartesianGridXY>(lcdd_t& lcdd, const xml_h& e) { CartesianGridXY obj(lcdd); if ( e.hasAttr(_A(gridSizeX)) ) obj.setGridSizeX(e.attr<double>(_A(gridSizeX))); if ( e.hasAttr(_A(gridSizeY)) ) obj.setGridSizeY(e.attr<double>(_A(gridSizeY))); return obj; } - + template <> Elt_t toObject<ProjectiveCylinder>(lcdd_t& lcdd, const xml_h& e) { ProjectiveCylinder obj(lcdd); if ( e.hasAttr(_A(phiBins)) ) obj.setPhiBins(e.attr<int>(_A(phiBins))); if ( e.hasAttr(_A(thetaBins)) ) obj.setThetaBins(e.attr<int>(_A(thetaBins))); return obj; } - + template <> Elt_t toObject<NonProjectiveCylinder>(lcdd_t& lcdd, const xml_h& e) { NonProjectiveCylinder obj(lcdd); if ( e.hasAttr(_A(gridSizePhi)) ) obj.setThetaBinSize(e.attr<double>(_A(gridSizePhi))); if ( e.hasAttr(_A(gridSizeZ)) ) obj.setPhiBinSize(e.attr<double>(_A(gridSizeZ))); return obj; } - + template <> Elt_t toObject<ProjectiveZPlane>(lcdd_t& lcdd, const xml_h& e) { ProjectiveZPlane obj(lcdd); if ( e.hasAttr(_A(phiBins)) ) obj.setThetaBins(e.attr<int>(_A(phiBins))); if ( e.hasAttr(_A(thetaBins)) ) obj.setPhiBins(e.attr<int>(_A(thetaBins))); return obj; } - + template <> Elt_t toObject<Segmentation>(lcdd_t& lcdd, const xml_h& e) { string seg_typ = e.attr<string>(_A(type)); if ( seg_typ == "GridXYZ" ) @@ -244,13 +245,13 @@ namespace DD4hep { namespace Geometry { cout << "Request to create UNKNOWN segmentation of type:" << seg_typ << endl; return Elt_t(0); } - + template <> Ref_t toRefObject<Readout>(lcdd_t& lcdd, const xml_h& e) { /* <readout name="HcalBarrelHits"> - <segmentation type="RegularNgonCartesianGridXY" gridSizeX="3.0*cm" gridSizeY="3.0*cm" /> - <id>system:6,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id> - </readout> - */ + <segmentation type="RegularNgonCartesianGridXY" gridSizeX="3.0*cm" gridSizeY="3.0*cm" /> + <id>system:6,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id> + </readout> + */ xml_h id, seg; string name = e.attr<string>(_A(name)); Readout ro(lcdd,name); @@ -266,26 +267,26 @@ namespace DD4hep { namespace Geometry { } return ro; } - + namespace { template <typename T> static Ref_t toRefObject(LCDD& lcdd, const xml_h& xml, SensitiveDetector& sens) { return toRefObject<T>(lcdd,xml,sens); } } - + template <> Ref_t toRefObject<SensitiveDetector>(lcdd_t& lcdd, const xml_h& e) { string nam = e.attr<string>(_A(name)); string typ = e.attr<string>(_A(type)); - + if ( e.hasAttr("calorimeterType") ) typ = "calorimeter"; else if ( typ.find("Tracker") != string::npos ) typ = "tracker"; else if ( nam.find("Tracker") != string::npos ) typ = "tracker"; - + if ( e.hasAttr(_A(readout)) ) { Readout ro = lcdd.readout(e.attr<string>(_A(readout))); Segmentation seg = ro.segmentation(); SensitiveDetector sd = SensitiveDetector(lcdd,typ,nam); if ( seg.isValid() ) { - sd.setSegmentation(seg); + sd.setSegmentation(seg); } sd.setHitsCollection(ro.name()); sd.setIDSpec(ro.idSpec()); @@ -294,12 +295,12 @@ namespace DD4hep { namespace Geometry { } return SensitiveDetector(); } - + template <> Ref_t toRefObject<Region>(lcdd_t& /* lcdd */, const xml_h& e) { xml_ref_t compact(e); return Ref_t(0); } - + template <> void Converter<Constant>::operator()(const xml_h& element) const { lcdd.addConstant(toRefObject<to_type>(lcdd,element)); } @@ -338,13 +339,13 @@ namespace DD4hep { namespace Geometry { try { SensitiveDetector sd = toRefObject<SensitiveDetector>(lcdd,element); DetElement det(Handle<TNamed>(ROOT::Reflex::PluginService::Create<TNamed*>(type,&lcdd,&element,&sd))); - + if ( det.isValid() && element.hasAttr(_A(readout)) ) { - string rdo = element.attr<string>(_A(readout)); - det.setReadout(lcdd.readout(rdo)); + string rdo = element.attr<string>(_A(readout)); + det.setReadout(lcdd.readout(rdo)); } cout << (det.isValid() ? "Converted" : "FAILED ") - << " subdetector:" << name << " of type " << type << endl; + << " subdetector:" << name << " of type " << type << endl; lcdd.addDetector(det); } catch(const exception& e) { @@ -361,8 +362,9 @@ namespace DD4hep { namespace Geometry { } template <> void Converter<GdmlFile>::operator()(const xml_h& element) const { - string fname = element.attr<string>(_A(ref)); - xml_h materials = XML::DocumentHandler().load(fname).root(); + xercesc::XMLURL base(element.ptr()->getBaseURI()); + xercesc::XMLURL ref(base, element.attr_value(_A(ref))); + xml_h materials = XML::DocumentHandler().load(_toString(ref.getURLText())).root(); Converter<Materials>(this->lcdd)(materials); } @@ -374,7 +376,7 @@ namespace DD4hep { namespace Geometry { xml_coll_t(compact,_X(define) ).for_each(_X(constant),Converter<Constant>(lcdd)); xml_coll_t(compact,_X(materials)).for_each(_X(element), Converter<Atom>(lcdd)); xml_coll_t(compact,_X(materials)).for_each(_X(material),Converter<Material>(lcdd)); - + lcdd.init(); xml_coll_t(compact,_X(limits) ).for_each(_X(limitset),Converter<LimitSet>(lcdd)); xml_coll_t(compact,_X(display) ).for_each(_X(vis), Converter<VisAttr>(lcdd)); diff --git a/DDCore/src/compact/DetFactoryHelper.h b/DDCore/src/compact/DetFactoryHelper.h deleted file mode 100644 index be09f3630795d6b836edc26c4264d4924b5152d6..0000000000000000000000000000000000000000 --- a/DDCore/src/compact/DetFactoryHelper.h +++ /dev/null @@ -1,50 +0,0 @@ -// $Id:$ -//==================================================================== -// AIDA Detector description -//-------------------------------------------------------------------- -// -// Author : M.Frank -// -//==================================================================== -#ifndef DD4hep_DETECTOR_DETFACTORYHELPER_H -#define DD4hep_DETECTOR_DETFACTORYHELPER_H - -#include "XML/XMLDetector.h" -#include "DD4hep/LCDD.h" -#include "DD4hep/Factories.h" - -// Helpers to access tags and attributes quickly without specifying explicitly namespaces -#define _X(a) DD4hep::XML::Tag_##a -#define _A(a) DD4hep::XML::Attr_##a - -// Shortcuts to elements of the XML namespace -typedef DD4hep::XML::Collection_t xml_coll_t; -typedef DD4hep::XML::Handle_t xml_h; -typedef DD4hep::XML::RefElement xml_ref_t; -typedef DD4hep::XML::DetElement xml_det_t; -typedef xml_det_t::Component xml_comp_t; -typedef DD4hep::XML::Dimension xml_dim_t; -typedef DD4hep::Geometry::LCDD lcdd_t; - -/* - * DD4hep namespace declaration - */ -namespace DD4hep { - - /* - * Geometry sub-namespace declaration - */ - namespace Geometry { - static inline std::string _toString(const XMLCh* value) - { - return XML::_toString(value); - } - - template <typename T> inline std::string _toString(T value, const char* fmt) - { - return XML::_toString(value, fmt); - } - } -} - -#endif // DD4hep_DETECTOR_DETFACTORYHELPER_H diff --git a/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py b/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py index 566d3279c24a3e86f80942c54e89dc2f137197c0..bfcf0edb82f3fad7aeaa99d5d0aefa834fdad79e 100644 --- a/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py +++ b/DDExamples/CLICSiD/drivers/SiTrackerBarrel.py @@ -1,9 +1,3 @@ -def getRotation(rot): - return Rotation(rot.getF('x',0.0),rot.getF('y',0.0), rot.getF('z',0.0)) - -def getPosition(pos): - return Position(pos.getF('x',0.0),pos.getF('y',0.0), pos.getF('z',0.0)) - def detector_SiTrackerBarrel(lcdd, det): sdet = DetElement(lcdd, det.name, det.type, det.id) mother = lcdd.trackingVolume() diff --git a/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp b/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp index acb9b9fa37e399c401e558fde67ccc50a53428e4..4ea4139b41475232e68c739ecc94b974799930cf 100644 --- a/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp +++ b/DDExamples/CLICSiD/src/CylindricalBarrelCalorimeter_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; @@ -29,42 +29,42 @@ namespace DD4hep { namespace Geometry { double rmin = dim.inner_r(); double r = rmin; int n = 0; - + for(xml_coll_t c(x_det,_X(layer)); c; ++c) { xml_comp_t x_layer = c; for(int i=0, m=0, repeat=x_layer.repeat(); i<repeat; ++i, m=0) { - string layer_name = det_name + _toString(n,"_layer%d"); - Tube layer_tub(lcdd,layer_name); - Volume layer_vol(lcdd,layer_name+"_volume",layer_tub,air); - double rlayer = r; - - for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m) { - xml_comp_t x_slice = l; - Material slice_mat = lcdd.material(x_slice.materialStr()); - string slice_name = layer_name + _toString(m,"slice%d"); - Tube slice_tube(lcdd,slice_name); - Volume slice_vol (lcdd,slice_name+"_volume",slice_tube,slice_mat); - double router = r + x_slice.thickness(); - - if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens); - slice_tube.setDimensions(r,router,z * 2); - r = router; - slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); - // Instantiate physical volume - layer_vol.placeVolume(slice_vol,IdentityPos()); - } - layer_vol.setVisAttributes(lcdd,x_layer.visStr()); - layer_tub.setDimensions(rlayer,r,z * 2); - - PlacedVolume layer_physvol = envelopeVol.placeVolume(layer_vol,IdentityPos()); - layer_physvol.addPhysVolID(_A(layer),n); - ++n; + string layer_name = det_name + _toString(n,"_layer%d"); + Tube layer_tub(lcdd,layer_name); + Volume layer_vol(lcdd,layer_name+"_volume",layer_tub,air); + double rlayer = r; + + for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m) { + xml_comp_t x_slice = l; + Material slice_mat = lcdd.material(x_slice.materialStr()); + string slice_name = layer_name + _toString(m,"slice%d"); + Tube slice_tube(lcdd,slice_name); + Volume slice_vol (lcdd,slice_name+"_volume",slice_tube,slice_mat); + double router = r + x_slice.thickness(); + + if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens); + slice_tube.setDimensions(r,router,z * 2); + r = router; + slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + // Instantiate physical volume + layer_vol.placeVolume(slice_vol,IdentityPos()); + } + layer_vol.setVisAttributes(lcdd,x_layer.visStr()); + layer_tub.setDimensions(rlayer,r,z * 2); + + PlacedVolume layer_physvol = envelopeVol.placeVolume(layer_vol,IdentityPos()); + layer_physvol.addPhysVolID(_A(layer),n); + ++n; } } envelope.setDimensions(rmin,r,2.*z); // Set region of slice envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); - + PlacedVolume physvol = lcdd.pickMotherVolume(sdet).placeVolume(envelopeVol,IdentityPos()); physvol.addPhysVolID(_A(system),sdet.id()).addPhysVolID(_A(barrel),0); sdet.addPlacement(physvol); diff --git a/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp b/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp index f63c3cc5cb4509c7b3f2df603e6b507750bd6ef1..528625533afbc0b6d038925a844527d05d98c12b 100644 --- a/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp +++ b/DDExamples/CLICSiD/src/CylindricalEndcapCalorimeter_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" #include "XML/Layering.h" @@ -32,55 +32,55 @@ namespace DD4hep { namespace Geometry { double totWidth = Layering(x_det).totalThickness(); double z = zmin; int n = 0; - + for(xml_coll_t c(x_det,_X(layer)); c; ++c) { xml_comp_t x_layer = c; double layerWidth = 0; for(xml_coll_t l(x_layer,_X(slice)); l; ++l) - layerWidth += xml_comp_t(l).thickness(); + layerWidth += xml_comp_t(l).thickness(); for(int i=0, m=0, repeat=x_layer.repeat(); i<repeat; ++i, m=0) { - double zlayer = z; - string layer_name = det_name + _toString(n,"_layer%d"); - Tube layer_tub(lcdd,layer_name,rmin,rmax,layerWidth); - Volume layer_vol(lcdd,layer_name+"_volume",layer_tub,air); - - for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m) { - xml_comp_t x_slice = l; - double w = x_slice.thickness(); - string slice_name = layer_name + _toString(m,"slice%d"); - Material slice_mat = lcdd.material(x_slice.materialStr()); - Tube slice_tube(lcdd,slice_name, rmin,rmax,w); - Volume slice_vol (lcdd,slice_name+"_volume", slice_tube, slice_mat); - - if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens); - - // Set attributes of slice - slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); - layer_vol.placeVolume(slice_vol,Position(0,0,z-zlayer-layerWidth/2+w/2)); - z += w; - } - layer_vol.setVisAttributes(lcdd,x_layer.visStr()); - - Position layer_pos(0,0,zlayer-zmin-totWidth/2+layerWidth/2); - PlacedVolume layer_phys = envelopeVol.placeVolume(layer_vol,layer_pos); - layer_phys.addPhysVolID("layer",n); - ++n; + double zlayer = z; + string layer_name = det_name + _toString(n,"_layer%d"); + Tube layer_tub(lcdd,layer_name,rmin,rmax,layerWidth); + Volume layer_vol(lcdd,layer_name+"_volume",layer_tub,air); + + for(xml_coll_t l(x_layer,_X(slice)); l; ++l, ++m) { + xml_comp_t x_slice = l; + double w = x_slice.thickness(); + string slice_name = layer_name + _toString(m,"slice%d"); + Material slice_mat = lcdd.material(x_slice.materialStr()); + Tube slice_tube(lcdd,slice_name, rmin,rmax,w); + Volume slice_vol (lcdd,slice_name+"_volume", slice_tube, slice_mat); + + if ( x_slice.isSensitive() ) slice_vol.setSensitiveDetector(sens); + + // Set attributes of slice + slice_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + layer_vol.placeVolume(slice_vol,Position(0,0,z-zlayer-layerWidth/2+w/2)); + z += w; + } + layer_vol.setVisAttributes(lcdd,x_layer.visStr()); + + Position layer_pos(0,0,zlayer-zmin-totWidth/2+layerWidth/2); + PlacedVolume layer_phys = envelopeVol.placeVolume(layer_vol,layer_pos); + layer_phys.addPhysVolID("layer",n); + ++n; } } envelope.setDimensions(rmin,rmax,totWidth,2.*M_PI); // Set attributes of slice envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); - + DetElement sdet(lcdd,det_name,det_type,x_det.id()); Volume motherVol = lcdd.pickMotherVolume(sdet); PlacedVolume phv=motherVol.placeVolume(envelopeVol,Position(0,0,zmin+totWidth/2)); phv.addPhysVolID(_A(system),sdet.id()) - .addPhysVolID(_A(barrel),1); + .addPhysVolID(_A(barrel),1); sdet.addPlacement(phv); if ( reflect ) { phv=motherVol.placeVolume(envelopeVol,Position(0,0,-zmin-totWidth/2),ReflectRot()); phv.addPhysVolID(_A(system),sdet.id()) - .addPhysVolID(_A(barrel),2); + .addPhysVolID(_A(barrel),2); } return sdet; } diff --git a/DDExamples/CLICSiD/src/DiskTracker_geo.cpp b/DDExamples/CLICSiD/src/DiskTracker_geo.cpp index fbb59802379ca2d7a2d316cb995cd0b7ea0e8146..4bddb83e1faed23b11124ea7ab8a0bcde13fc09a 100644 --- a/DDExamples/CLICSiD/src/DiskTracker_geo.cpp +++ b/DDExamples/CLICSiD/src/DiskTracker_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; @@ -15,7 +15,7 @@ using namespace DD4hep; using namespace DD4hep::Geometry; namespace DD4hep { namespace Geometry { - + template <> Ref_t DetElementFactory<DiskTracker>::create(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) { xml_det_t x_det = e; Material air = lcdd.air(); @@ -25,7 +25,7 @@ namespace DD4hep { namespace Geometry { DetElement sdet (lcdd,det_name,det_type,x_det.id()); Volume motherVol = lcdd.pickMotherVolume(sdet); int l_num = 0; - + for(xml_coll_t i(x_det,_X(layer)); i; ++i, ++l_num) { xml_comp_t x_layer = i; string l_nam = det_name+_toString(l_num,"_layer%d"); @@ -36,39 +36,39 @@ namespace DD4hep { namespace Geometry { Tube l_tub(lcdd,l_nam,rmin,rmax,2*z,2*M_PI); Volume l_vol(lcdd,l_nam+"_volume",l_tub,air); int s_num = 0; - + for(xml_coll_t j(x_layer,_X(slice)); j; ++j) { - double thickness = xml_comp_t(j).thickness(); - layerWidth += thickness; + double thickness = xml_comp_t(j).thickness(); + layerWidth += thickness; } l_vol.setVisAttributes(lcdd,x_layer.visStr()); for(xml_coll_t j(x_layer,_X(slice)); j; ++j, ++s_num) { - xml_comp_t x_slice = j; - double thick = x_slice.thickness(); - Material mat = lcdd.material(x_slice.materialStr()); - string s_nam = l_nam+_toString(s_num,"_slice%d"); - Tube s_tub(lcdd,s_nam,rmin,rmax,2*M_PI); - Volume s_vol(lcdd,s_nam+"_volume", s_tub, mat); - - if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens); - s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); - - PlacedVolume spv = l_vol.placeVolume(s_vol,Position(0,0,z-zmin-layerWidth/2+thick/2)); - spv.addPhysVolID(_X(layer),l_num); - spv.addPhysVolID(_X(slice),s_num); + xml_comp_t x_slice = j; + double thick = x_slice.thickness(); + Material mat = lcdd.material(x_slice.materialStr()); + string s_nam = l_nam+_toString(s_num,"_slice%d"); + Tube s_tub(lcdd,s_nam,rmin,rmax,2*M_PI); + Volume s_vol(lcdd,s_nam+"_volume", s_tub, mat); + + if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens); + s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + + PlacedVolume spv = l_vol.placeVolume(s_vol,Position(0,0,z-zmin-layerWidth/2+thick/2)); + spv.addPhysVolID(_X(layer),l_num); + spv.addPhysVolID(_X(slice),s_num); } - + PlacedVolume lpv = motherVol.placeVolume(l_vol,Position(0,0,zmin+layerWidth/2.)); lpv.addPhysVolID(_X(system),sdet.id()); lpv.addPhysVolID(_X(barrel),1); DetElement layer(lcdd,l_nam,det_type+"/Layer",l_num); sdet.add(layer.addPlacement(lpv)); if ( reflect ) { - PlacedVolume lpvR = motherVol.placeVolume(l_vol,Position(0,0,-zmin-layerWidth/2),ReflectRot()); - lpvR.addPhysVolID(_X(system),sdet.id()); - lpvR.addPhysVolID(_X(barrel),2); - DetElement layerR(lcdd,l_nam+"_reflect",det_type+"/Layer",l_num); - sdet.add(layerR.addPlacement(lpvR)); + PlacedVolume lpvR = motherVol.placeVolume(l_vol,Position(0,0,-zmin-layerWidth/2),ReflectRot()); + lpvR.addPhysVolID(_X(system),sdet.id()); + lpvR.addPhysVolID(_X(barrel),2); + DetElement layerR(lcdd,l_nam+"_reflect",det_type+"/Layer",l_num); + sdet.add(layerR.addPlacement(lpvR)); } } sdet.setCombineHits(x_det.attr<bool>(_A(combineHits)),sens); diff --git a/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp b/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp index 59851975f97db475b8557624fd75c780e70b1b4c..c3cafd1268d3d4f875ec07ed42e11e2b9b8f5e19 100644 --- a/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp +++ b/DDExamples/CLICSiD/src/EcalBarrel_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" #include "XML/Layering.h" #include "TGeoTrd2.h" diff --git a/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp b/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp index 543fff9bfb0d2b3ae0a3720eab08ade78652d0cc..7d0e9b2d75ae511b5094be33d857accf79aa2adf 100644 --- a/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp +++ b/DDExamples/CLICSiD/src/ForwardDetector_geo.cpp @@ -8,7 +8,7 @@ //==================================================================== #include "XML/Layering.h" -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; diff --git a/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp b/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp index 0ce1d91748b979be6c56af04663d0b9a27ebaaff..093aa9ac1cbb7313998e53797b40c31521042698 100644 --- a/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp +++ b/DDExamples/CLICSiD/src/MultiLayerTracker_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; @@ -24,7 +24,7 @@ namespace DD4hep { namespace Geometry { DetElement sdet(lcdd,det_name,det_type,x_det.id()); Volume motherVol = lcdd.pickMotherVolume(sdet); int n = 0; - + for(xml_coll_t i(x_det,_X(layer)); i; ++i, ++n) { xml_comp_t x_layer = i; string l_name = det_name+_toString(n,"_layer%d"); @@ -35,26 +35,26 @@ namespace DD4hep { namespace Geometry { double rmin = x_layer.inner_r(); double r = rmin; int m = 0; - + for(xml_coll_t j(x_layer,_X(slice)); j; ++j, ++m) { - xml_comp_t x_slice = j; - Material mat = lcdd.material(x_slice.materialStr()); - string s_name= l_name+_toString(m,"_slice%d"); - Tube s_tub(lcdd,s_name); - Volume s_vol(lcdd,s_name+"_volume", s_tub, mat); - - r += x_slice.thickness(); - s_tub.setDimensions(r,r,2*z,2*M_PI); - if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens); - // Set Attributes - s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); - PlacedVolume spv = l_vol.placeVolume(s_vol,IdentityPos()); - // Slices have no extra id. Take the ID of the layer! - spv.addPhysVolID(_X(layer),n); + xml_comp_t x_slice = j; + Material mat = lcdd.material(x_slice.materialStr()); + string s_name= l_name+_toString(m,"_slice%d"); + Tube s_tub(lcdd,s_name); + Volume s_vol(lcdd,s_name+"_volume", s_tub, mat); + + r += x_slice.thickness(); + s_tub.setDimensions(r,r,2*z,2*M_PI); + if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens); + // Set Attributes + s_vol.setAttributes(lcdd,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr()); + PlacedVolume spv = l_vol.placeVolume(s_vol,IdentityPos()); + // Slices have no extra id. Take the ID of the layer! + spv.addPhysVolID(_X(layer),n); } l_tub.setDimensions(rmin,r,2*z,2*M_PI); l_vol.setVisAttributes(lcdd,x_layer.visStr()); - + PlacedVolume lpv = motherVol.placeVolume(l_vol,IdentityPos()); lpv.addPhysVolID(_X(system),sdet.id()).addPhysVolID(_X(barrel),0); sdet.add(layer.addPlacement(lpv)); diff --git a/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp b/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp index c13a671348636993c8ed9dc2b9d243cffe4876f4..403ec19eb918de8e9933cc15950843d2c559ab09 100644 --- a/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp +++ b/DDExamples/CLICSiD/src/PolyconeSupport_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; diff --git a/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp b/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp index 53c48859bf4276e6b49e53f8d53a381cdd58679c..ce5b357fba6835cebb94f4f5420f3bcd272160a0 100644 --- a/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp +++ b/DDExamples/CLICSiD/src/PolyhedraBarrelCalorimeter2_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" #include "XML/Layering.h" diff --git a/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp b/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp index 3aab1cb59aa9ad846d5773b460279261a5a6a5dd..16e3a0eb98b39fd922aa1c65fb90282e0bdad3e0 100644 --- a/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp +++ b/DDExamples/CLICSiD/src/PolyhedraEndcapCalorimeter2_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" #include "XML/Layering.h" @@ -31,14 +31,14 @@ namespace DD4hep { namespace Geometry { double zmin = dim.zmin(); Layering layering(x_det); double totalThickness = layering.totalThickness(); - + PolyhedraRegular polyhedra(lcdd,det_name+"_polyhedra",numsides,rmin,rmax,totalThickness); Volume envelopeVol(lcdd,det_name+"_envelope",polyhedra,air); - + int l_num = 0; int layerType = 0; double layerZ = -totalThickness/2; - + for(xml_coll_t c(x_det,_X(layer)); c; ++c) { xml_comp_t x_layer = c; double l_thick = layering.layer(l_num)->thickness(); @@ -50,47 +50,47 @@ namespace DD4hep { namespace Geometry { int s_num = 0; double sliceZ = -l_thick/2; for(xml_coll_t s(x_layer,_X(slice)); s; ++s) { - xml_comp_t x_slice = s; - string s_name = l_name + _toString(s_num,"_slice%d"); - double s_thick = x_slice.thickness(); - Material s_mat = lcdd.material(x_slice.materialStr()); - PolyhedraRegular s_solid(lcdd,s_name+"_solid",numsides,rmin,rmax,s_thick); - Volume s_vol (lcdd,s_name+"_volume",s_solid,s_mat); - - if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens); - s_vol.setVisAttributes(lcdd.visAttributes(x_slice.visStr())); - sliceZ += s_thick/2; - PlacedVolume s_phv = l_vol.placeVolume(s_vol,Position(0,0,sliceZ)); - s_phv.addPhysVolID("slice",s_num); - s_num++; + xml_comp_t x_slice = s; + string s_name = l_name + _toString(s_num,"_slice%d"); + double s_thick = x_slice.thickness(); + Material s_mat = lcdd.material(x_slice.materialStr()); + PolyhedraRegular s_solid(lcdd,s_name+"_solid",numsides,rmin,rmax,s_thick); + Volume s_vol (lcdd,s_name+"_volume",s_solid,s_mat); + + if ( x_slice.isSensitive() ) s_vol.setSensitiveDetector(sens); + s_vol.setVisAttributes(lcdd.visAttributes(x_slice.visStr())); + sliceZ += s_thick/2; + PlacedVolume s_phv = l_vol.placeVolume(s_vol,Position(0,0,sliceZ)); + s_phv.addPhysVolID("slice",s_num); + s_num++; } l_vol.setVisAttributes(lcdd.visAttributes(x_layer.visStr())); if ( l_repeat <= 0 ) throw std::runtime_error(det_name+"> Invalid repeat value"); for(int j=0; j<l_repeat; ++j) { - string phys_lay = det_name + _toString(l_num,"_layer%d"); - layerZ += l_thick/2; - PlacedVolume phys_vol = envelopeVol.placeVolume(l_vol,Position(0,0,layerZ)); - phys_vol.addPhysVolID("layer", l_num); - layerZ += l_thick/2; - ++l_num; + string phys_lay = det_name + _toString(l_num,"_layer%d"); + layerZ += l_thick/2; + PlacedVolume phys_vol = envelopeVol.placeVolume(l_vol,Position(0,0,layerZ)); + phys_vol.addPhysVolID("layer", l_num); + layerZ += l_thick/2; + ++l_num; } ++layerType; } - + envelopeVol.setAttributes(lcdd,x_det.regionStr(),x_det.limitsStr(),x_det.visStr()); DetElement sdet (lcdd,det_name,det_type,x_det.id()); Volume motherVol = lcdd.pickMotherVolume(sdet); PlacedVolume physvol = motherVol.placeVolume(envelopeVol, - Position(0,0,zmin+totalThickness/2), - Rotation(0,0,M_PI/numsides)); + Position(0,0,zmin+totalThickness/2), + Rotation(0,0,M_PI/numsides)); physvol.addPhysVolID("system",det_id); physvol.addPhysVolID("barrel",1); sdet.addPlacement(physvol); - + if ( reflect ) { physvol = motherVol.placeVolume(envelopeVol, - Position(0,0,-(zmin+totalThickness/2)), - Rotation(M_PI,0,M_PI/numsides)); + Position(0,0,-(zmin+totalThickness/2)), + Rotation(M_PI,0,M_PI/numsides)); physvol.addPhysVolID("system",det_id); physvol.addPhysVolID("barrel",2); DetElement rdet(lcdd,det_name+"_reflect",det_type,x_det.id()); diff --git a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp index 37bf3e4ca0eb7a547806b418b6f985b26f40ec55..802c7999da1fb9e967a2a0717d525f5e1287bfc2 100644 --- a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp +++ b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; diff --git a/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp b/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp index ab95c523abde7b128a5e2ec39b98993f84612e19..77b3855efa99387fa924dced189c64252b6cf0c0 100644 --- a/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp +++ b/DDExamples/CLICSiD/src/SiTrackerEndcap2_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" #include <map> diff --git a/DDExamples/CLICSiD/src/TubeSegment_geo.cpp b/DDExamples/CLICSiD/src/TubeSegment_geo.cpp index 85d32aad2a0d2e115b5e34e0a3d5b7c0b81799f8..bb5058e2a7f4ac3ad06181dba79aa9a787c0a668 100644 --- a/DDExamples/CLICSiD/src/TubeSegment_geo.cpp +++ b/DDExamples/CLICSiD/src/TubeSegment_geo.cpp @@ -7,7 +7,7 @@ // //==================================================================== -#include "DetFactoryHelper.h" +#include "DD4hep/DetFactoryHelper.h" #include "CompactDetectors.h" using namespace std; using namespace DD4hep; @@ -23,14 +23,14 @@ namespace DD4hep { namespace Geometry { string name = x_det.nameStr(); Tube tub (lcdd,name+"_tube",x_tube.rmin(),x_tube.rmax(),x_tube.zhalf()); Volume vol (lcdd,name,tub,lcdd.material(x_det.materialStr())); - + vol.setVisAttributes(lcdd, x_det.visStr()); - + DetElement sdet(lcdd,name,x_det.typeStr(),x_det.id()); Volume mother = lcdd.pickMotherVolume(sdet); PlacedVolume phv = - mother.placeVolume(vol,Position(x_pos.x(),x_pos.y(),x_pos.z()), - Rotation(x_rot.x(),x_rot.y(),x_rot.z())); + mother.placeVolume(vol,Position(x_pos.x(),x_pos.y(),x_pos.z()), + Rotation(x_rot.x(),x_rot.y(),x_rot.z())); phv.addPhysVolID(_A(id),x_det.id()); sdet.addPlacement(phv); return sdet; diff --git a/DDExamples/ILDExDet/CMakeLists.txt b/DDExamples/ILDExDet/CMakeLists.txt index d20ff9b49d3538d727719d8cea119a75bda104e2..ff8aba361ba03ab3227257e96308d4faace2d8f1 100644 --- a/DDExamples/ILDExDet/CMakeLists.txt +++ b/DDExamples/ILDExDet/CMakeLists.txt @@ -1,15 +1,23 @@ cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/DDCore/include ${ROOT_INCLUDE_DIR}) - file(GLOB sources src/*.cpp) -ROOT_GENERATE_DICTIONARY( G__ILDEx include/ILDExTPC.h - LINKDEF include/LinkDef.h) +file(GLOB headers include/*.h) + +if(DD4HEP_USE_XERCESC) + file(GLOB xmlsources src/compact/*.cpp) + list(APPEND sources ${xmlsources}) + include_directories(${XERCESC_INCLUDE_DIR}) +endif() + +if(DD4HEP_USE_PYROOT) + ROOT_GENERATE_DICTIONARY(G__ILDEx ${headers} LINKDEF include/ROOT/LinkDef.h) + list(APPEND sources G__ILDEx.cxx) +endif() -add_library(ILDEx SHARED ${sources} G__ILDEx.cxx) +add_library(ILDEx SHARED ${sources}) target_link_libraries(ILDEx DD4hepCore) diff --git a/DDExamples/ILDExDet/compact/ILDEx.xml b/DDExamples/ILDExDet/compact/ILDEx.xml index 4981915bcd141bc0abfa154f05081dbe5dac4b02..31b1b8d347b9f428bc91402a0d194f55ba3e6b62 100644 --- a/DDExamples/ILDExDet/compact/ILDEx.xml +++ b/DDExamples/ILDExDet/compact/ILDEx.xml @@ -50,8 +50,8 @@ <display> <vis name="TPCVis" alpha="1.0" r="0" g="1.0" b="0.7" showDaughters="true" visible="false"/> - <vis name="TPCSupportVis" alpha="1.0" r="0" g="0" b="0.7" showDaughters="false" visible="true"/> - <vis name="TPCGasVis" alpha="1.0" r="0.7" g="0" b="0" showDaughters="false" visible="true"/> + <vis name="TPCSupportVis" alpha="1.0" r="0" g="0.4" b="0.4" showDaughters="false" visible="true"/> + <vis name="TPCGasVis" alpha="1.0" r="0.7" g="0" b="0" showDaughters="false" visible="false"/> <vis name="VXDLayerVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> <vis name="VXDSupportVis" alpha="1.0" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> <vis name="SITSupportVis" alpha="1.0" r="0.0" g="0.3" b="0.7" showDaughters="true" visible="true"/> @@ -91,7 +91,7 @@ <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/> <ladder thickness="0.1*mm" zhalf="370*mm" radius="155*mm" material="Silicon" number="10" /> </layer> - <layer id="2" vis="SITL/Users/mato/Development/AIDA/DD4hep/DDExamples/ILDExDet/compact/ILDEx.xmlayerVis"> + <layer id="2" vis="SITLayerVis"> <support thickness="0.01*mm" material="Carbon" vis="SITSupportVis"/> <ladder thickness="0.1*mm" zhalf="650*mm" radius="300*mm" material="Silicon" number="19" /> </layer> @@ -118,14 +118,14 @@ <detector name="TPC_EndA" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="2"> <material name="Carbon" /> - <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_inner_radius+TPC_inner_thickness"/> + <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/> <position x="0" y="0" z="TPC_zhalf-0.5*TPC_endcap_thickness"/> <rotation x="0" y="0" z="0"/> </detector> <detector name="TPC_EndB" type="TubeSegment" reflect="true" vis="TPCSupportVis" id="3"> <material name="Carbon" /> - <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_inner_radius+TPC_inner_thickness"/> + <tubs rmin="TPC_inner_radius+TPC_inner_thickness" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/> <position x="0" y="0" z="-(TPC_zhalf-0.5*TPC_endcap_thickness)"/> <rotation x="0" y="0" z="0"/> </detector> diff --git a/DDExamples/ILDExDet/drivers/ILDExSIT.py b/DDExamples/ILDExDet/drivers/ILDExSIT.py index 79fe0f4ed360d9bf38a4fa57db355669c5a75c5c..ff84dc1aa9fa13c9cc207660e82d16bddcfe26a3 100644 --- a/DDExamples/ILDExDet/drivers/ILDExSIT.py +++ b/DDExamples/ILDExDet/drivers/ILDExSIT.py @@ -1,51 +1,36 @@ #------------------------------------------------------------------------------------- def detector_ILDExSIT(lcdd, det): - sit = DetElement(lcdd, det.get('name'), det.get('type'), det.getI('id')) - - mother = lcdd.pickMotherVolume(sit); + sit = DetElement(lcdd, det.name, det.type, det.id) + mother = lcdd.trackingVolume() for layer in det.findall('layer'): support = layer.find('support') ladder = layer.find('ladder') - layername = det.get('name') + '_layer%d' % layer.getI('id') - nLadders = ladder.getI('number') + layername = det.name + '_layer%d'%layer.id + nLadders = ladder.number dphi = 2.*pi/nLadders - zhalf = ladder.getF('zhalf') - sens_radius = ladder.getF('radius') - sens_thick = ladder.getF('thickness') - supp_thick = support.getF('thickness') + zhalf = ladder.zhalf + sens_radius = ladder.radius + sens_thick = ladder.thickness + supp_thick = support.thickness support_radius = sens_radius + sens_thick/2. + supp_thick/2. width = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.) - sens_mat = lcdd.material(ladder.get('material')) - supp_mat = lcdd.material(support.get('material')) - ladderbox = Box(lcdd, layername+'_ladder_solid', (sens_thick+supp_thick)/2.,width/2.,zhalf) - laddervol = Volume(lcdd, layername+'_ladder_volume', ladderbox, sens_mat) - laddervol.setVisAttributes(lcdd.visAttributes(layer.get('vis'))) + ladderbox = Box(lcdd, layername+'_ladder_box', (sens_thick+supp_thick)/2.,width/2.,zhalf) + laddervol = Volume(lcdd, layername+'_ladder', ladderbox, lcdd.material('Air')) + laddervol.setVisAttributes(lcdd.visAttributes(layer.vis)) - sensbox = Box(lcdd, layername+'_sens_solid', sens_thick/2.,width/2.,zhalf) - sensvol = Volume(lcdd, layername+'_sens_volume', sensbox, sens_mat) - sensvol.setVisAttributes(lcdd.visAttributes(support.get('vis'))) - senspos = Position(lcdd,layername+'_sens_position',-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0) - laddervol.addPhysVol(sensvol,senspos) + sensbox = Box(lcdd, layername+'_sens_box', sens_thick/2.,width/2.,zhalf) + sensvol = Volume(lcdd, layername+'_sens_volume', sensbox, lcdd.material(ladder.material)) + sensvol.setVisAttributes(lcdd.visAttributes(layer.vis)) + laddervol.placeVolume(sensvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0)) - suppbox = Box(lcdd, layername+'_supp_solid', supp_thick/2.,width/2.,zhalf) - suppvol = Volume(lcdd,layername+'_supp_volume', suppbox,supp_mat) - suppvol.setVisAttributes(lcdd.visAttributes(layer.get('vis'))) - supppos = Position(lcdd,layername+'_supp_position',-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0) - laddervol.addPhysVol(suppvol,supppos) - - lcdd.add(ladderbox).add(sensbox).add(senspos).add(suppbox).add(supppos) - lcdd.add(laddervol).add(sensvol).add(suppvol) + suppbox = Box(lcdd, layername+'_supp_box', supp_thick/2.,width/2.,zhalf) + suppvol = Volume(lcdd,layername+'_supp', suppbox,lcdd.material(support.material)) + suppvol.setVisAttributes(lcdd.visAttributes(support.vis)) + laddervol.placeVolume(suppvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0)) for j in range(nLadders): laddername = layername + '_ladder%d' % j radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.) - rot = Rotation(lcdd,laddername+'_rotation',0,0,j*dphi) - pos = Position(lcdd,laddername+'_position', - radius*cos(j*dphi), - radius*sin(j*dphi),0.) - lcdd.add(rot).add(pos) - mother.addPhysVol(laddervol,pos,rot) - - sit.setVisAttributes(lcdd, det.get('vis'), laddervol); + mother.placeVolume(laddervol, Position(radius*cos(j*dphi),radius*sin(j*dphi),0.), Rotation(0,0,j*dphi)) return sit diff --git a/DDExamples/ILDExDet/drivers/ILDExTPC.py b/DDExamples/ILDExDet/drivers/ILDExTPC.py index f5a81c12d75e4bd9c489024df250fb29360c3404..f0394ab9b57dfea86ed3fcd78127d0f9c128648e 100644 --- a/DDExamples/ILDExDet/drivers/ILDExTPC.py +++ b/DDExamples/ILDExDet/drivers/ILDExTPC.py @@ -2,38 +2,29 @@ from ROOT import DD4hep #------------------------------------------------------------------------------------- def detector_ILDExTPC(lcdd, det): - name = det.get('name') - mat = lcdd.material(det.find('material').get('name')) tube = det.find('tubs') - tpc = DD4hep.ILDExTPC(lcdd, det.get('name'), det.get('type'), det.getI('id')) - tpc_tube = Tube(lcdd,name+'_envelope', tube.getF('rmin'), tube.getF('rmax'), tube.getF('zhalf')) - tpc_vol = Volume(lcdd, name+'_envelope_volume', tpc_tube, mat) - lcdd.add(tpc_tube).add(tpc_vol); - tpc.setEnvelope(tpc_tube).setVolume(tpc_vol) + material = det.find('material') + tpc_de = DD4hep.ILDExTPC(lcdd, det.name, det.type, det.id) + tpc_tube = Tube(lcdd, det.name+'_tube', tube.rmin, tube.rmax, tube.zhalf) + tpc_vol = Volume(lcdd, det.name+'_envelope', tpc_tube, lcdd.material(material.name)) - for px_det in det.findall('detector'): - px_tube = px_det.find('tubs') - px_pos = px_det.find('position') - px_rot = px_det.find('rotation') - part_name = px_det.get('name') - part_mat = lcdd.material(px_det.find('material').get('name')) - part_det = DetElement(lcdd,part_name,px_det.get('type'),px_det.getI('id')) - part_tube = Tube(lcdd,part_name+'_tube',px_tube.getF('rmin'),px_tube.getF('rmax'),px_tube.getF('zhalf')) - part_pos = Position(lcdd,part_name+'_position',px_pos.getF('x'),px_pos.getF('y'),px_pos.getF('z')) - part_rot = Rotation(lcdd,part_name+'_rotation',px_pos.getF('x'),px_pos.getF('y'),px_pos.getF('z')) - part_vol = Volume(lcdd,part_name,part_tube,part_mat) + for px in det.findall('detector'): + px_tube = px.find('tubs') + px_pos = px.find('position') + px_rot = px.find('rotation') + px_mat = px.find('material') + part_det = DetElement(lcdd, px.name, px.type, px.id) + part_tube = Tube(lcdd,px.name+'_tube',px_tube.rmin, px_tube.rmax, px_tube.zhalf) + part_vol = Volume(lcdd, px.name, part_tube, lcdd.material(px_mat.name)) + print 'Vis for %s ' %det.name, px.vis + part_vol.setVisAttributes(lcdd.visAttributes(px.vis)) + tpc_vol.placeVolume(part_vol, getPosition(px_pos), getRotation(px_rot)) - part_det.setVolume(part_vol).setEnvelope(part_tube) - part_det.setVisAttributes(lcdd,px_det.get('vis'), part_vol) - lcdd.add(part_tube).add(part_pos).add(part_rot).add(part_vol) - - tpc_vol.addPhysVol(part_vol,part_pos,part_rot) - - if part_det.id() == 0 : tpc.setInnerWall(part_det) - elif part_det.id() == 1 : tpc.setOuterWall(part_det) - elif part_det.id() == 2 : tpc.setGasVolume(part_det) - tpc.add(part_det) - - tpc.setVisAttributes(lcdd, det.get('vis'), tpc_vol) - lcdd.pickMotherVolume(tpc).addPhysVol(tpc_vol,lcdd.identity()) - return tpc + if px.id == 0 : tpc_de.setInnerWall(part_det) + elif px.id == 1 : tpc_de.setOuterWall(part_det) + elif px.id == 5 : tpc_de.setGasVolume(part_det) + tpc_de.add(part_det) + print 'vis = ', det.vis + tpc_vol.setVisAttributes(lcdd.visAttributes(det.vis)) + lcdd.pickMotherVolume(tpc_de).placeVolume(tpc_vol) + return tpc_de diff --git a/DDExamples/ILDExDet/drivers/ILDExVXD.py b/DDExamples/ILDExDet/drivers/ILDExVXD.py index c781994305a8b0339682190efbcabb56a968df01..c062d5d7843fda35bf6d61e1bb13f4afd3fd2b86 100644 --- a/DDExamples/ILDExDet/drivers/ILDExVXD.py +++ b/DDExamples/ILDExDet/drivers/ILDExVXD.py @@ -1,52 +1,36 @@ #------------------------------------------------------------------------------------- def detector_ILDExVXD(lcdd, det): - name = det.get('name') - vdx = DetElement(lcdd, det.get('name'), det.get('type'), det.getI('id')) - - mother = lcdd.pickMotherVolume(vdx); + vdx = DetElement(lcdd, det.name, det.type, det.id) + mother = lcdd.trackingVolume() for layer in det.findall('layer'): support = layer.find('support') - ladder = layer.find('ladder') - layername = name + '_layer%d' % layer.getI('id') + ladder = layer.find('ladder') + layername = det.name + '_layer%d' % layer.id nLadders = ladder.getI('number') dphi = 2.*pi/nLadders - zhalf = ladder.getF('zhalf') - offset = ladder.getF('offset') - sens_radius = ladder.getF('radius') - sens_thick = ladder.getF('thickness') - supp_thick = support.getF('thickness') - supp_radius = sens_radius + sens_thick/2. + supp_thick/2. - width = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.) - sens_mat = lcdd.material(ladder.get('material')) - supp_mat = lcdd.material(support.get('material')) - ladderbox = Box(lcdd, layername+'_ladder_solid', (sens_thick+supp_thick)/2.,width/2.,zhalf) - laddervol = Volume(lcdd, layername+'_ladder_volume', ladderbox, sens_mat) - sensbox = Box(lcdd, layername+'_sens_solid', sens_thick/2.,width/2.,zhalf) - sensvol = Volume(lcdd, layername+'_sens_volume', sensbox, sens_mat) - senspos = Position(lcdd,layername+'_sens_position',-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0) - suppbox = Box(lcdd, layername+'_supp_solid', supp_thick/2.,width/2.,zhalf) - suppvol = Volume(lcdd,layername+'_supp_volume', suppbox,supp_mat) - supppos = Position(lcdd,layername+'_supp_position',-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0) + sens_thick = ladder.thickness + supp_thick = support.thickness + supp_radius = ladder.radius + sens_thick/2. + supp_thick/2. + width = 2.*tan(dphi/2.)*(ladder.radius-sens_thick/2.) - lcdd.add(ladderbox).add(sensbox).add(senspos).add(suppbox).add(supppos) - lcdd.add(laddervol).add(sensvol).add(suppvol) + ladderbox = Box(lcdd, layername+'_ladder_box', (sens_thick+supp_thick)/2., width/2., ladder.zhalf) + laddervol = Volume(lcdd, layername+'_ladder', ladderbox, lcdd.material('Air')) - laddervol.setVisAttributes(lcdd.visAttributes(layer.get('vis'))) - suppvol.setVisAttributes(lcdd.visAttributes(layer.get('vis'))) - sensvol.setVisAttributes(lcdd.visAttributes(support.get('vis'))) + sensbox = Box(lcdd, layername+'_sens_box', sens_thick/2., width/2., ladder.zhalf) + sensvol = Volume(lcdd, layername+'_sens', sensbox, lcdd.material(ladder.material)) + sensvol.setVisAttributes(lcdd.visAttributes(layer.vis)) + laddervol.placeVolume(sensvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0)) - laddervol.addPhysVol(sensvol,senspos) - laddervol.addPhysVol(suppvol,supppos) + suppbox = Box(lcdd, layername+'_supp_box', supp_thick/2.,width/2.,ladder.zhalf) + suppvol = Volume(lcdd,layername+'_supp', suppbox, lcdd.material(support.material)) + suppvol.setVisAttributes(lcdd.visAttributes(support.vis)) + laddervol.placeVolume(suppvol, Position(-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0)) for j in range(nLadders): laddername = layername + '_ladder%d' % j - radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.) - rot = Rotation(lcdd,laddername+'_rotation',0,0,j*dphi) - pos = Position(lcdd,laddername+'_position', - radius*cos(j*dphi) - offset*sin(j*dphi), - radius*sin(j*dphi) - offset*cos(j*dphi),0.) - lcdd.add(rot).add(pos) - mother.addPhysVol(laddervol,pos,rot) - - vdx.setVisAttributes(lcdd, det.get('vis'), laddervol); + radius = ladder.radius + ((sens_thick+supp_thick)/2. - sens_thick/2.) + rot = Rotation(0,0,j*dphi) + pos = Position(radius*cos(j*dphi) - ladder.offset*sin(j*dphi), + radius*sin(j*dphi) - ladder.offset*cos(j*dphi),0.) + mother.placeVolume(laddervol, pos, rot) return vdx diff --git a/DDExamples/ILDExDet/include/ILDExVXD.h b/DDExamples/ILDExDet/include/ILDExVXD.h new file mode 100644 index 0000000000000000000000000000000000000000..3fdf50a6cbeebaafc71d6cf4d879e82ce4cd6437 --- /dev/null +++ b/DDExamples/ILDExDet/include/ILDExVXD.h @@ -0,0 +1,20 @@ +// $Id:$ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== +#ifndef DD4hep_ILDEXVXD_H +#define DD4hep_ILDEXVXD_H + +#include "DD4hep/Detector.h" + +namespace DD4hep { + struct ILDExVXD : public Geometry::DetElement { + ILDExVXD(const Geometry::LCDD& lcdd, const std::string& name, const std::string& type, int id) + : Geometry::DetElement(lcdd,name,type,id) {} + }; +} +#endif // DD4hep_ILDEXVXD_H diff --git a/DDExamples/ILDExDet/include/LinkDef.h b/DDExamples/ILDExDet/include/ROOT/LinkDef.h similarity index 100% rename from DDExamples/ILDExDet/include/LinkDef.h rename to DDExamples/ILDExDet/include/ROOT/LinkDef.h diff --git a/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..84a879a125757e0209206c36f70a71db612b1537 --- /dev/null +++ b/DDExamples/ILDExDet/src/compact/ILDExTPC_geo.cpp @@ -0,0 +1,60 @@ +// $Id:$ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== + +#include "DD4hep/DetFactoryHelper.h" +#include "ILDExTPC.h" +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +namespace DD4hep { namespace Geometry { + + template <> Ref_t DetElementFactory<ILDExTPC>::create(LCDD& lcdd, const xml_h& e, SensitiveDetector&) { + xml_det_t x_det = e; + xml_comp_t x_tube (x_det.child(_X(tubs))); + string name = x_det.nameStr(); + Material mat (lcdd.material(x_det.materialStr())); + ILDExTPC tpc (lcdd,name,x_det.typeStr(),x_det.id()); + Tube tpc_tub(lcdd,name+"_envelope",x_tube.rmin(),x_tube.rmax(),x_tube.zhalf()); + Volume tpc_vol(lcdd,name+"_envelope_volume", tpc_tub, mat); + + for(xml_coll_t c(e,_X(detector)); c; ++c) { + xml_comp_t px_det (c); + xml_comp_t px_tube (px_det.child(_X(tubs))); + xml_dim_t px_pos (px_det.child(_X(position))); + xml_dim_t px_rot (px_det.child(_X(rotation))); + xml_comp_t px_mat (px_det.child(_X(material))); + string part_nam(px_det.nameStr()); + Material part_mat(lcdd.material(px_mat.nameStr())); + DetElement part_det(lcdd,part_nam,px_det.typeStr(),px_det.id()); + Tube part_tub(lcdd,part_nam+"_tube",px_tube.rmin(),px_tube.rmax(),px_tube.zhalf()); + Volume part_vol(lcdd,part_nam,part_tub,part_mat); + Position part_pos(px_pos.x(),px_pos.y(),px_pos.z()); + Rotation part_rot(px_rot.x(),px_rot.y(),px_rot.z()); + + part_vol.setVisAttributes(lcdd,px_det.visStr()); + + PlacedVolume part_phv = tpc_vol.placeVolume(part_vol,part_pos,part_rot); + part_phv.addPhysVolID(_A(id),px_det.id()); + part_det.addPlacement(part_phv); + switch(part_det.id()) { + case 0: tpc.setInnerWall(part_det); break; + case 1: tpc.setOuterWall(part_det); break; + case 5: tpc.setGasVolume(part_det); break; + } + tpc.add(part_det); + } + tpc_vol.setVisAttributes(lcdd, x_det.visStr()); + PlacedVolume phv = lcdd.pickMotherVolume(tpc).placeVolume(tpc_vol); + tpc.addPlacement(phv); + return tpc; + } +}} + +DECLARE_NAMED_DETELEMENT_FACTORY(DD4hep,ILDExTPC); diff --git a/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..82be5eba2258533f8e70c7e31b2272567ac752ac --- /dev/null +++ b/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp @@ -0,0 +1,66 @@ +// $Id:$ +//==================================================================== +// AIDA Detector description implementation for LCD +//-------------------------------------------------------------------- +// +// Author : M.Frank +// +//==================================================================== + +#include "DD4hep/DetFactoryHelper.h" +#include "ILDExVXD.h" +using namespace std; +using namespace DD4hep; +using namespace DD4hep::Geometry; + +namespace DD4hep { namespace Geometry { + + template <> Ref_t DetElementFactory<ILDExVXD>::create(LCDD& lcdd, const xml_h& e, SensitiveDetector&) { + xml_det_t x_det = e; + string name = x_det.nameStr(); + ILDExVXD vxd (lcdd,name,x_det.typeStr(),x_det.id()); + Volume mother= lcdd.pickMotherVolume(vxd); + + for(xml_coll_t c(e,_X(layer)); c; ++c) { + xml_comp_t x_layer (c); + xml_comp_t x_support (x_layer.child(_X(support))); + xml_comp_t x_ladder (x_layer.child(_X(ladder))); + int layer_id = x_layer.id(); + int nLadders = x_ladder.number(); + string layername = name+_toString(layer_id,"_layer%d"); + double dphi = 2.*M_PI/double(nLadders); + double zhalf = x_ladder.zhalf(); + double offset = x_ladder.offset(); + double sens_radius= x_ladder.radius(); + double sens_thick = x_ladder.thickness(); + double supp_thick = x_support.thickness(); + double width = 2.*tan(dphi/2.)*(sens_radius-sens_thick/2.); + Material sens_mat = lcdd.material(x_ladder.materialStr()); + Material supp_mat = lcdd.material(x_support.materialStr()); + Box ladderbox (lcdd,layername+"_ladder_solid", (sens_thick+supp_thick)/2.,width/2.,zhalf); + Volume laddervol (lcdd,layername+"_ladder_volume", ladderbox,sens_mat); + Box sensbox (lcdd,layername+"_sens_solid", sens_thick/2.,width/2.,zhalf); + Volume sensvol (lcdd,layername+"_sens_volume", sensbox,sens_mat); + Box suppbox (lcdd,layername+"_supp_solid", supp_thick/2.,width/2.,zhalf); + Volume suppvol (lcdd,layername+"_supp_volume", suppbox,supp_mat); + Position senspos (-(sens_thick+supp_thick)/2.+sens_thick/2.,0,0); + Position supppos (-(sens_thick+supp_thick)/2.+sens_thick/2.+supp_thick/2.,0,0); + + sensvol.setVisAttributes(lcdd.visAttributes(x_layer.visStr())); + laddervol.placeVolume(sensvol,senspos); + laddervol.placeVolume(suppvol,supppos); + + for(int j=0; j<nLadders; ++j) { + string laddername = layername + _toString(j,"_ladder%d"); + double radius = sens_radius + ((sens_thick+supp_thick)/2. - sens_thick/2.); + Position pos(radius*cos(j*dphi) - offset*sin(j*dphi), + radius*sin(j*dphi) - offset*cos(j*dphi),0.); + mother.placeVolume(laddervol,pos,Rotation(0,0,j*dphi)); + } + vxd.setVisAttributes(lcdd, x_det.visStr(),laddervol); + } + return vxd; + } +}} + +DECLARE_NAMED_DETELEMENT_FACTORY(DD4hep,ILDExVXD); diff --git a/ReadMe.txt b/ReadMe.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d22b3cd1c8755ab0e38630668f2ca348736636c --- /dev/null +++ b/ReadMe.txt @@ -0,0 +1,75 @@ +Detector Description for HEP Package +------------------------------------- + +1) Package Contents +------------------- + + The DD4hep project consists of several packages. The idea has been to separate the common parts of +the detector description toolkit from concrete detector examples. + +- DDCore + + Contains the definition of the basic classes of the toolkit: Handle, DetElement, Volume, PlacedVolume, +Shapes, Material, etc. Most of these classes are ‘handles’ to ROOT TGeom classes. +The package provides the basic mechanisms for constructing the ‘Generic Detector Description Model’ +in memory from XML compact detector definition files. Two methods are currently supported: one based +on the C++ XercesC parser, and another one based on Python and using the PyROOT bindings to ROOT. + + Two configuration options selects the desired method: + + DD4HEP_USE_PYROOT:BOOL + DD4HEP_USE_XERCESC:BOOL + +- DDExamples + + Contains different detector examples (CLICSiD, ILDEx) together with example applications to illustrate +the their usage for simulation, reconstruction and visualization with an emphasis to minimize software +dependencies. For instance, the simulation application example will require to compiler and link +against Geant4 but not the reconstruction application. + + For each detector example the directory ‘compact’ contains the XML compact detector description, the +directory ‘drivers’ contains the Python functions to construct the detector from the XML, the ‘include’ +and ‘src’ contain the equivalent drivers for the XercesC parser. + +- DDExamples/ILDEx + + Contains the original example ILDEx adapted from the Geant4 example N03 + +3) Pre-requisites +----------------- + + DD4hep depends on a number of ‘external’ packages. The user will need to install these in his/her +system before building and running the examples + +- Mandatory + CMake (version 2.8 or higher) and ROOT (version 5.30 or higher) installations are mandatory. + +- Optional + If the XercesC is used to parse compact descriptions and installation of XercesC will be required. +To build and run the simulation examples Geant4 will be required. + + +2) How to build and run +----------------------- + +- Checkout code +svn co https://svnsrv.desy.de/basic/aidasoft/DD4hep/trunk DD4hep + +- Configure (for PyROOT) +mkdir build +cmake ../DD4hep + +- Configure (for XercesC) +cmake -DDD4HEP_USE_XERCESC=ON -DDD4HEP_USE_PYROOT=OFF -DXERCESC_ROOT_DIR=<xercesc> ../DD4hep + +- Run ILDEx display +DDExamples/ILDExDisplay/ILDExDisplay file:../DD4hep/DDExamples/ILDExDet/compact/ILDEx.xml + +- Run CLICSiD display +DDExamples/CLICSiD/CLICSiDtest file:../DD4hep/DDExamples/CLICSiD/compact/compact.xml + + +3) Extending +------------ + + Users may extend the models by changing the compact description or adding new drivers