diff --git a/DDCore/src/IDDescriptor.cpp b/DDCore/src/IDDescriptor.cpp index 035c643d31f885306e43d57a565b3ce8dfdc0671..25c4d82b7bdef0194fa41b5580c2eefdbf22b3a0 100644 --- a/DDCore/src/IDDescriptor.cpp +++ b/DDCore/src/IDDescriptor.cpp @@ -48,8 +48,8 @@ namespace { field.second = f.size() == 3 ? ::atoi(f[2].c_str()) : ::atoi(f[1].c_str()); pos = field.first + ::abs(field.second); if ( pos>o->maxBit ) o->maxBit = pos; - o->fieldIDs.insert(make_pair(o->fieldMap.size(),f[0])); - o->fieldMap.insert(make_pair(f[0],field)); + o->fieldIDs.push_back(make_pair(o->fieldMap.size(),f[0])); + o->fieldMap.push_back(make_pair(f[0],field)); } } } diff --git a/DDCore/src/LCDDImp.h b/DDCore/src/LCDDImp.h index cd1d4b54d6edc53615943cf86a804b19cb67c432..cc9d0f976cbd07075c6d3f5ab426812ef4f09de6 100644 --- a/DDCore/src/LCDDImp.h +++ b/DDCore/src/LCDDImp.h @@ -59,7 +59,6 @@ namespace DD4hep { }; ObjectHandleMap m_readouts; - ObjectHandleMap m_header; ObjectHandleMap m_idDict; ObjectHandleMap m_limits; ObjectHandleMap m_regions; @@ -83,7 +82,7 @@ namespace DD4hep { Material m_materialVacuum; VisAttr m_invisibleVis; OverlayedField m_field; - Ref_t m_setup; + Ref_t m_header; Properties* m_properties; /// Default constructor @@ -100,6 +99,9 @@ namespace DD4hep { virtual void dump() const; + /// Manipulate geometry using facroy converter + virtual void apply(const char* factory, int argc, char** argv); + /// Apply & lock realigments //virtual void applyAlignment(); @@ -128,6 +130,10 @@ namespace DD4hep { virtual Volume trackingVolume() const { return m_trackingVol; } /// Return handle to the combined electromagentic field description. virtual OverlayedField field() const { return m_field; } + /// Accessor to the header entry + virtual Header header() const { return m_header; } + /// Accessor to the header entry + virtual void setHeader(Header h) { m_header = h; } /// Typed access to constants: access string values virtual std::string constantAsString(const std::string& name) const; @@ -170,8 +176,6 @@ namespace DD4hep { virtual CartesianField field(const std::string& name) const { return getRefChild(m_fields,name,false); } - /// Accessor to the map of header entries - virtual const HandleMap& header() const { return m_header; } /// Accessor to the map of constants virtual const HandleMap& constants() const { return m_define; } /// Accessor to the map of visualisation attributes diff --git a/DDCore/src/Objects.cpp b/DDCore/src/Objects.cpp index e55214897bdb9cdcc6be1a7c1616b2c034ee7a41..219d18240f20e48799f9be485f23ac0ded11ec79 100644 --- a/DDCore/src/Objects.cpp +++ b/DDCore/src/Objects.cpp @@ -25,34 +25,85 @@ using namespace std; using namespace DD4hep::Geometry; -#if 0 -Header& Header::fromCompact(Document doc, Handle_t element, const string& fname) { - Element info = element; - Author aut(doc); - RefElement det(doc,Tag_detector,info.attr<cpXMLCh>(Attr_name)); - RefElement gen(doc,Tag_generator, Strng_t("GeomCnv++")); +/// Constructor to be used when creating a new DOM tree +Author::Author(LCDD& /* lcdd */) { + m_element = new TNamed("","author"); +} - gen.setAttr(Attr_file,fname); - gen.setAttr(Attr_version,"1.0"); - gen.setAttr(Attr_checksum,"None"); +/// Constructor to be used when creating a new DOM tree +Header::Header(const string& author, const string& url) { + Value<TNamed,Object>* ptr = new Value<TNamed,Object>(); + assign(ptr,author, url); +} - aut.setAttr(Attr_name,info.attr<cpXMLCh>(Tag_author)); +/// Accessor to object name +const std::string Header::name() const { + return m_element->GetName(); +} - append(gen); - append(aut); - append(doc.clone(info.child(Tag_comment),true)); - return *this; +/// Accessor: set object name +void Header::setName(const std::string& new_name) { + m_element->SetName(new_name.c_str()); } -#endif -/// Constructor to be used when creating a new DOM tree -Author::Author(LCDD& /* lcdd */) { - m_element = new TNamed("","author"); +/// Accessor to object title +const std::string Header::title() const { + return m_element->GetTitle(); } -/// Constructor to be used when creating a new DOM tree -Header::Header(LCDD& /* lcdd */) { - m_element = new TNamed("","header"); +/// Accessor: set object title +void Header::setTitle(const std::string& new_title) { + m_element->SetTitle(new_title.c_str()); +} + +/// Accessor to object url +const std::string& Header::url() const { + return data<Object>()->url; +} + +/// Accessor: set object url +void Header::setUrl(const std::string& new_url) { + data<Object>()->url = new_url; +} + +/// Accessor to object author +const std::string& Header::author() const { + return data<Object>()->author; +} + +/// Accessor: set object author +void Header::setAuthor(const std::string& new_author) { + data<Object>()->author = new_author; +} + +/// Accessor to object status +const std::string& Header::status() const { + return data<Object>()->status; +} + +/// Accessor: set object status +void Header::setStatus(const std::string& new_status) { + data<Object>()->status = new_status; +} + +/// Accessor to object version +const std::string& Header::version() const { + return data<Object>()->version; +} + +/// Accessor: set object version +void Header::setVersion(const std::string& new_version) { + data<Object>()->version = new_version; +} + +/// Accessor to object comment +const std::string& Header::comment() const { + return data<Object>()->comment; +} + +/// Accessor: set object comment +void Header::setComment(const std::string& new_comment) { + data<Object>()->comment = new_comment; } /// Constructor to be used when creating a new DOM tree @@ -407,6 +458,16 @@ bool Region::storeSecondaries() const { return _data().store_secondaries; } +/// Access the length unit +const std::string& Region::lengthUnit() const { + return _data().lunit; +} + +/// Access the energy unit +const std::string& Region::energyUnit() const { + return _data().eunit; +} + #undef setAttr #if 0 diff --git a/DDCore/src/Volumes.cpp b/DDCore/src/Volumes.cpp index 13376464cee038a4fdf2707cde896a7c31083bde..95a8728f7d49ac5dff055cece5caba2bd17fe368 100644 --- a/DDCore/src/Volumes.cpp +++ b/DDCore/src/Volumes.cpp @@ -245,6 +245,11 @@ string PlacedVolume::toString() const { return s.str(); } +Volume::Object* _data(const Volume& v) { + if ( v.ptr() && v.ptr()->IsA() == TGeoVolume::Class() ) return v.data<Volume::Object>(); + return dynamic_cast<Volume::Object*>(v.ptr()); +} + /// Constructor to be used when creating a new geometry tree. Volume::Volume(const string& name) { m_element = new Value<TGeoVolume,Volume::Object>(name.c_str()); @@ -372,14 +377,14 @@ void Volume::setVisAttributes(const VisAttr& attr) const { m_element->SetAttBit(TGeoAtt::kVisContainers,kTRUE); m_element->SetVisDaughters(vis->showDaughters ? kTRUE : kFALSE); } - data<Object>()->vis = attr; + _data(*this)->vis = attr; } /// Set Visualization attributes to the volume void Volume::setVisAttributes(const LCDD& lcdd, const string& name) const { if ( !name.empty() ) { VisAttr attr = lcdd.visAttributes(name); - data<Object>()->vis = attr; + _data(*this)->vis = attr; setVisAttributes(attr); } else { @@ -414,25 +419,25 @@ void Volume::setSolid(const Solid& solid) const /// Set the regional attributes to the volume void Volume::setRegion(const Region& obj) const -{ data<Object>()->region = obj; } +{ _data(*this)->region = obj; } /// Set the limits to the volume void Volume::setLimitSet(const LimitSet& obj) const -{ data<Object>()->limits = obj; } +{ _data(*this)->limits = obj; } /// Assign the sensitive detector structure void Volume::setSensitiveDetector(const SensitiveDetector& obj) const { //cout << "Setting sensitive detector '" << obj.name() << "' to volume:" << ptr() << " " << name() << endl; - data<Object>()->sens_det = obj; + _data(*this)->sens_det = obj; } /// Access to the handle to the sensitive detector Ref_t Volume::sensitiveDetector() const -{ return data<Object>()->sens_det; } +{ return _data(*this)->sens_det; } /// Accessor if volume is sensitive (ie. is attached to a sensitive detector) bool Volume::isSensitive() const -{ return data<Object>()->sens_det.isValid(); } +{ return _data(*this)->sens_det.isValid(); } /// Access to Solid (Shape) Solid Volume::solid() const @@ -444,15 +449,15 @@ Material Volume::material() const /// Access the visualisation attributes VisAttr Volume::visAttributes() const -{ return data<Object>()->vis; } +{ return _data(*this)->vis; } /// Access to the handle to the region structure Region Volume::region() const -{ return data<Object>()->region; } +{ return _data(*this)->region; } /// Access to the limit set LimitSet Volume::limitSet() const -{ return data<Object>()->limits; } +{ return _data(*this)->limits; } /// Constructor to be used when creating a new geometry tree. Assembly::Assembly(const string& name) { diff --git a/DDCore/src/XML/DocumentHandler.cpp b/DDCore/src/XML/DocumentHandler.cpp index 0702c525e79fc7d7a4e6e2b5c1d4d4183982f024..75d30e722b2dbacf0d735909906919524af1e320 100644 --- a/DDCore/src/XML/DocumentHandler.cpp +++ b/DDCore/src/XML/DocumentHandler.cpp @@ -166,6 +166,19 @@ Document DocumentHandler::load(const string& fname) const { return parser->adoptDocument(); } +/// Parse a standalong XML string into a document. +Document DocumentHandler::parse(const char* bytes, size_t length) const { + auto_ptr<XercesDOMParser> parser(makeParser()); + MemBufInputSource src((const XMLByte*)bytes,length,"memory"); + parser->setValidationSchemaFullChecking(true); + parser->parse(src); + DOMDocument* doc = parser->adoptDocument(); + doc->setXmlStandalone(true); + doc->setStrictErrorChecking(true); + return doc; +} + + #else #ifdef _WIN32 #include <cstdlib> @@ -247,4 +260,27 @@ Document DocumentHandler::load(const string& fname) const { return 0; } +/// Parse a standalong XML string into a document. +Document DocumentHandler::parse(const char* doc_string, size_t length) const { + TiXmlDocument* doc = new TiXmlDocument(); + try { + if ( 0 == doc->Parse(doc_string) ) { + return doc; + } + if ( doc->Error() ) { + cout << "Unknown error whaile parsing XML document with TiXml:" << endl; + cout << "Document:" << doc->Value() << endl; + cout << "Location: Line:" << doc->ErrorRow() + << " Column:" << doc->ErrorCol() << endl; + throw runtime_error(doc->ErrorDesc()); + } + throw runtime_error("Unknown error whaile parsing XML document with TiXml."); + } + catch(std::exception& e) { + cout << "parse(xml-string):" << e.what() << endl; + } + delete doc; + return 0; +} + #endif diff --git a/DDCore/src/XML/XMLDetector.cpp b/DDCore/src/XML/XMLDetector.cpp index 7949ffd11c5512eaa000bcb83ed583345869b205..37a8eaac99821fb01285d71e662749c737a26634 100644 --- a/DDCore/src/XML/XMLDetector.cpp +++ b/DDCore/src/XML/XMLDetector.cpp @@ -4,16 +4,16 @@ using namespace std; using namespace DD4hep::XML; #define XML_ATTR_ACCESSOR(type,name) type Dimension::name() const { return m_element.attr<type>(Attr_##name); } -#define XML_ATTR_ACCESSOR_DOUBLE(name) \ +#define XML_ATTR_ACCESSOR_DOUBLE(name) \ double Dimension::name(double default_val) const { \ const XmlChar* val = m_element.attr_value_nothrow(Attr_##name); \ return val ? _toDouble(val) : default_val; } -#define XML_ATTR_ACCESSOR_INT(name) \ +#define XML_ATTR_ACCESSOR_INT(name) \ int Dimension::name(int default_val) const { \ const XmlChar* val = m_element.attr_value_nothrow(Attr_##name); \ return val ? _toInt(val) : default_val; } -#define XML_ATTR_ACCESSOR_BOOL(name) \ - bool Dimension::name(bool default_val) const { \ +#define XML_ATTR_ACCESSOR_BOOL(name) \ + bool Dimension::name(bool default_val) const { \ const XmlChar* val = m_element.attr_value_nothrow(Attr_##name); \ return val ? _toBool(val) : default_val; } diff --git a/DDCore/src/XML/XMLElements.cpp b/DDCore/src/XML/XMLElements.cpp index e0acd7fbe16c7ccc40855b559587d124414ecccf..4d77dc8a3e579efb4386803bc537165d927a931e 100644 --- a/DDCore/src/XML/XMLElements.cpp +++ b/DDCore/src/XML/XMLElements.cpp @@ -14,6 +14,7 @@ // C/C++ include files #include <iostream> #include <stdexcept> +#include <map> using namespace std; using namespace DD4hep::XML; @@ -483,6 +484,43 @@ bool Handle_t::hasChild(const XmlChar* tag) const { return node_first(m_node,tag) != 0; } +/// Set the element's value +void Handle_t::setValue(const XmlChar* text) const { +#ifdef __TIXML__ + m_node->SetValue(text); +#else + m_node->setNodeValue(text); +#endif +} + +/// Set the element's value +void Handle_t::setValue(const string& text) const { +#ifdef __TIXML__ + m_node->SetValue(text.c_str()); +#else + m_node->setNodeValue(Strng(text)); +#endif +} + +/// Set the element's text +void Handle_t::setText(const XmlChar* text) const { +#ifdef __TIXML__ + m_node->LinkEndChild(new TiXmlText(text)); +#else + m_node->setNodeText(text); +#endif +} + +/// Set the element's text +void Handle_t::setText(const string& text) const { +#ifdef __TIXML__ + m_node->LinkEndChild(new TiXmlText(text.c_str())); +#else + m_node->setNodeText(Strng(text)); +#endif +} + +/// Remove all attributes of this element void Handle_t::removeAttrs() const { #ifdef __TIXML__ m_node->ClearAttributes(); @@ -496,6 +534,7 @@ void Handle_t::removeAttrs() const { #endif } +/// Set attributes as in argument handle void Handle_t::setAttrs(Handle_t e) const { removeAttrs(); #ifdef __TIXML__ @@ -514,6 +553,7 @@ void Handle_t::setAttrs(Handle_t e) const { #endif } +/// Access attribute pointer by the attribute's unicode name (throws exception if not present) Attribute Handle_t::attr_ptr(const XmlChar* t) const { Attribute a = attribute_node(m_node,t); if ( 0 != a ) return a; @@ -525,6 +565,7 @@ Attribute Handle_t::attr_ptr(const XmlChar* t) const { throw runtime_error(msg); } +/// Access attribute name (throws exception if not present) const XmlChar* Handle_t::attr_name(const Attribute attr) const { if ( attr ) { #ifdef __TIXML__ @@ -536,53 +577,67 @@ const XmlChar* Handle_t::attr_name(const Attribute attr) const { throw runtime_error("Attempt to access invalid XML attribute object!"); } +/// Access attribute value by the attribute's unicode name (throws exception if not present) const XmlChar* Handle_t::attr_value(const XmlChar* attr) const { return attribute_value(attr_ptr(attr)); } +/// Access attribute value by the attribute (throws exception if not present) const XmlChar* Handle_t::attr_value(const Attribute attr) const { return attribute_value(attr); } +/// Access attribute value by the attribute's unicode name (no exception thrown if not present) const XmlChar* Handle_t::attr_value_nothrow(const XmlChar* attr) const { Attribute a = attr_nothrow(attr); return a ? attribute_value(a) : 0; } +/// Generic attribute setter with integer value Attribute Handle_t::setAttr(const XmlChar* name, int val) const { char txt[32]; ::sprintf(txt,"%d",val); return setAttr(name, Strng_t(txt)); } +/// Generic attribute setter with boolen value Attribute Handle_t::setAttr(const XmlChar* name, bool val) const { char txt[32]; ::sprintf(txt,"%s",val ? "true" : "false"); return setAttr(name, Strng_t(txt)); } +/// Generic attribute setter with floating point value Attribute Handle_t::setAttr(const XmlChar* name, float val) const { char txt[32]; ::sprintf(txt,"%f",val); return setAttr(name, Strng_t(txt)); } +/// Generic attribute setter with double precision floating point value Attribute Handle_t::setAttr(const XmlChar* name, double val) const { char txt[32]; ::sprintf(txt,"%f",val); return setAttr(name, Strng_t(txt)); } +/// Generic attribute setter with string value +Attribute Handle_t::setAttr(const XmlChar* name, const string& val) const { + return setAttr(name, Strng_t(val.c_str())); +} + #ifndef __TIXML__ Attribute Handle_t::setAttr(const XmlChar* name, const char* v) const { - return setAttr(name,Strng_t(v)); + return setAttr(name, Strng_t(v)); } #endif +/// Generic attribute setter with XmlAttr value Attribute Handle_t::setAttr(const XmlChar* name, const Attribute v) const { return v ? setAttr(name,attribute_value(v)) : 0; } +/// Generic attribute setter with unicode value Attribute Handle_t::setAttr(const XmlChar* name, const XmlChar* value) const { #ifdef __TIXML__ m_node->SetAttribute(name,value); @@ -598,6 +653,90 @@ Attribute Handle_t::setAttr(const XmlChar* name, const XmlChar* value) const { #endif } +/// Add reference child as a new child node. The obj must have the "name" attribute! +Handle_t Handle_t::setRef(const XmlChar* tag, const XmlChar* ref_name) { + Element me(*this); + Element ref(me.document(),tag); + ref.setAttr(Attr_ref,ref_name); + me.append(ref); + return ref; +} + +/// Checksum (sub-)tree of a xml document/tree +static unsigned int adler32(unsigned int adler,const char* buf,size_t len) { +#define DO1(buf,i) {s1 +=(unsigned char)buf[i]; s2 += s1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + + static const unsigned int BASE = 65521; /* largest prime smaller than 65536 */ + /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + static const unsigned int NMAX = 5550; + unsigned int s1 = adler & 0xffff; + unsigned int s2 = (adler >> 16) & 0xffff; + int k; + + if (buf == NULL) return 1; + + while (len > 0) { + k = len < NMAX ? (int)len : NMAX; + len -= k; + while (k >= 16) { + DO16(buf); + buf += 16; + k -= 16; + } + if (k != 0) do { + s1 += (unsigned char)*buf++; + s2 += s1; + } while (--k); + s1 %= BASE; + s2 %= BASE; + } + unsigned int result = (s2 << 16) | s1; + return result; +} + +/// Checksum (sub-)tree of a xml document/tree +unsigned int Handle_t::checksum(unsigned int param,unsigned int (fcn)(unsigned int,const XmlChar*,size_t)) const { + typedef std::map<std::string,std::string> StringMap; +#ifdef __TIXML__ + TiXmlNode* n = m_node; + if ( n ) { + if ( 0 == fcn ) fcn = adler32; + switch (n->Type()) { + case TiXmlNode::ELEMENT: { + map<string,string> m; + TiXmlElement* e = n->ToElement(); + TiXmlAttribute* p=e->FirstAttribute(); + for(; p; p=p->Next()) m.insert(make_pair(p->Name(),p->Value())); + param = (*fcn)(param,e->Value(),::strlen(e->Value())); + for(StringMap::const_iterator i=m.begin();i!=m.end();++i) { + param = (*fcn)(param,(*i).first.c_str(),(*i).first.length()); + param = (*fcn)(param,(*i).second.c_str(),(*i).second.length()); + } + break; + } + case TiXmlNode::TEXT: + param = (*fcn)(param,n->ToText()->Value(),::strlen(n->ToText()->Value())); + break; + case TiXmlNode::UNKNOWN: + case TiXmlNode::COMMENT: + case TiXmlNode::DOCUMENT: + case TiXmlNode::DECLARATION: + default: + break; + } + for(TiXmlNode* c=n->FirstChild(); c; c=c->NextSibling()) + param = Handle_t(c->ToElement()).checksum(param,fcn); + } +#else + +#endif + return param; +} + /// Create DOM element Handle_t Document::createElt(const XmlChar* tag) const { #ifdef __TIXML__ diff --git a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp index ba5d58fb3401b4a951ca8b170f2718e8989083fe..7a3957a8585460ba6f77c8c735f3eb9000908424 100644 --- a/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp +++ b/DDExamples/CLICSiD/src/SiTrackerBarrel_geo.cpp @@ -34,9 +34,9 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens xml_comp_t x_comp = ci; xml_comp_t x_pos = x_comp.child(_X(position),false); xml_comp_t x_rot = x_comp.child(_X(rotation),false); - string c_nam = _toString(ncomponents,"component%d"); - Box c_box (x_comp.width(),x_comp.length(),x_comp.thickness()); - Volume c_vol (c_nam,c_box,lcdd.material(x_comp.materialStr())); + string c_nam = det_name+"_"+m_nam+_toString(ncomponents,"_component%d"); + Box c_box(x_comp.width(),x_comp.length(),x_comp.thickness()); + Volume c_vol(c_nam,c_box,lcdd.material(x_comp.materialStr())); PlacedVolume c_phv; if ( x_pos && x_rot ) { @@ -51,7 +51,7 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens c_phv = m_vol.placeVolume(c_vol,Position(x_pos.x(0),x_pos.y(0),x_pos.z(0))); } else { - c_phv = m_vol.placeVolume(c_vol,IdentityPos()); + c_phv = m_vol.placeVolume(c_vol); } if ( x_comp.isSensitive() ) { c_phv.addPhysVolID(_X(sensor),sensor_number++); @@ -72,7 +72,7 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens string m_nam = x_layer.moduleStr(); DetElement m_elt = sdet.child(m_nam); Volume m_env = volumes[m_nam]; - string lay_nam = det_name+_toString(lay_id,"_layer%d"); + string lay_nam = det_name+"_"+m_nam+_toString(lay_id,"_layer%d"); Tube lay_tub (x_barrel.inner_r(),x_barrel.outer_r(),x_barrel.z_length()); Volume lay_vol (lay_nam,lay_tub,air); // Create the layer envelope volume. double phi0 = x_layout.phi0(); // Starting phi of first module. @@ -117,10 +117,10 @@ static Ref_t create_detector(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens // Add z increment to get next z placement pos. module_z += z_incr; } - phic += phi_incr; // Increment the phi placement of module. - rc += rphi_dr; // Increment the center radius according to dr parameter. - rphi_dr *= -1; // Flip sign of dr parameter. - module_z = -z0; // Reset the Z placement parameter for module. + phic += phi_incr; // Increment the phi placement of module. + rc += rphi_dr; // Increment the center radius according to dr parameter. + rphi_dr *= -1; // Flip sign of dr parameter. + module_z = -z0; // Reset the Z placement parameter for module. } // Create the PhysicalVolume for the layer. PlacedVolume lpv = motherVol.placeVolume(lay_vol); // Place layer in mother diff --git a/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml b/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml index e2c2d4e82d3d86a3586be024ff3485e9018d5595..5a4c390c7df1b2f0468e664cd33a6c5679ccdff4 100644 --- a/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml +++ b/DDExamples/ILDExDet/compact/CLIC_ILD_CDR.xml @@ -936,16 +936,16 @@ <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id> </readout> <readout name="EcalBarrelHits"> - <id>system:6,barrel:3,layer:4,module:16</id> + <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id> </readout> <readout name="EcalEndcapHits"> - <id>system:6,barrel:3,layer:4,module:16</id> + <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id> </readout> <readout name="EcalEndcapRingHits"> - <id>system:6,barrel:3,layer:4,module:16</id> + <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id> </readout> <readout name="HcalRegularHits"> - <id>system:6,barrel:3,layer:4,module:16</id> + <id>system:6,barrel:3,layer:4,module:16,sensor:1,side:32:-2,strip:20</id> </readout> <readout name="HcalEndModuleHits"> <id>system:6,barrel:3,layer:4,module:16</id> diff --git a/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp index b9debe8b0422fab6ab59ce1ebbbd773416c7a245..cbf36f6ce0d08e5f9ba877f41278de072e79e4f5 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_ClicYoke01_geo.cpp @@ -138,9 +138,9 @@ void ClicYoke01::collectRPClayers(xml_comp_t x_rpcs) { /// Build the endcap logical volume ready for placement Volume ClicYoke01::buildEndcap() { PolyhedraRegular solid(symmetry,endcap.inner_r,endcap.outer_r,yokeThickness); - Volume envelope(name+"_endcap",solid,yokeMat); + Volume envelope(name+"_endcap_envelope",solid,yokeMat); PolyhedraRegular chamberSolid(symmetry,endcap.inner_r,barrel.outer_r,layer_thickness); - Volume chamberVol(name+"_layer",chamberSolid,lcdd->air()); + Volume chamberVol(name+"_endcap",chamberSolid,lcdd->air()); Volume gasVol; PlacedVolume pv; @@ -153,7 +153,7 @@ Volume ClicYoke01::buildEndcap() { Material m = rpc_layers[i].first; double t = rpc_layers[i].second.second; PolyhedraRegular h(symmetry,endcap.inner_r,barrel.outer_r,t); - Volume v((name+"_endcap_")+m.name(),h,m); + Volume v(name+_toString(i,"_endcap_layer%d"),h,m); if ( m.ptr() == rpcGasMat.ptr() ) { v.setLimitSet(limitSet); v.setVisAttributes(rpcGasVis); @@ -198,7 +198,6 @@ Volume ClicYoke01::buildPlug() { #endif Volume gasVol; PlacedVolume pv; - /* fg: the plug should have same outer radius as the hcal endcap note: HCAL_R_max is outer edge radius of the barrel with 16-fold symmentry -> cos(pi/16) @@ -215,7 +214,7 @@ Volume ClicYoke01::buildPlug() { PolyhedraRegular plugSolid(symmetry,endcap.inner_r,HCAL_R_max,HCAL_plug_thickness); Volume plugVol (name+"_plug",plugSolid,yokeMat); PolyhedraRegular chamberSolid(symmetry,endcap.inner_r,HCAL_R_max,layer_thickness); - Volume chamberVol (name+"_plug_layer",chamberSolid,lcdd->air()); + Volume chamberVol (name+"_plug_layers",chamberSolid,lcdd->air()); plugVol.setVisAttributes(plugVis); chamberVol.setVisAttributes(chamberVis); @@ -229,7 +228,7 @@ Volume ClicYoke01::buildPlug() { Material m = rpc_layers[i].first; double t = rpc_layers[i].second.second; PolyhedraRegular h(symmetry,endcap.inner_r,HCAL_R_max,t); - Volume v((name+"_endcap_")+m.name(),h,m); + Volume v(name+_toString(i,"_plug_layers_layer%d"),h,m); if ( m.ptr() == rpcGasMat.ptr() ) { v.setLimitSet(limitSet); v.setVisAttributes(rpcGasVis); @@ -292,8 +291,9 @@ Volume ClicYoke01::buildBarrel() { #if 0 m_barrel.sensDet->AddLayer(i+1, dx, radius_sensitive, 0.0); #endif + string chamber_name = name+_toString(i,"_barrel_stave_layer%d"); Box chamberBox(dx,layer_thickness/2.0, dy); - Volume chamberVol(name+"_stave",chamberBox,lcdd->air()); + Volume chamberVol(chamber_name,chamberBox,lcdd->air()); chamberVol.setVisAttributes(chamberVis); if ( rpc_last_layer.first+rpc_last_layer.second > chamberBox.y() ) { throw runtime_error("Overfull RPC layer in yoke barrel!"); @@ -301,7 +301,7 @@ Volume ClicYoke01::buildBarrel() { for(size_t j=0; j<rpc_layers.size(); ++j) { Material m = rpc_layers[j].first; double t = rpc_layers[j].second.second; - Volume v((name+"_barrel_")+m.name(),Box(dx,t/2,dy),m); + Volume v(chamber_name+_toString(j,"_layer%d"),Box(dx,t/2,dy),m); if ( m.ptr() == rpcGasMat.ptr() ) { v.setLimitSet(limitSet); v.setVisAttributes(rpcGasVis); @@ -433,7 +433,7 @@ DetElement ClicYoke01::construct(LCDD& l, xml_det_t x_det) { // ------------------------------------------------- if( m_hasPlug ) { Volume plugVol = buildPlug(); - pv = assembly.placeVolume(plugVol,Position(0,0, HCAL_plug_zpos),Rotation(0,tiltAngle,0));//,Rotation(0,0,M_PI)); + pv = assembly.placeVolume(plugVol,Position(0,0, HCAL_plug_zpos),Rotation(0,tiltAngle,0)); m_plugPlus.setPlacement(pv); pv = assembly.placeVolume(plugVol,Position(0,0,-HCAL_plug_zpos),Rotation(0,tiltAngle+M_PI,0)); m_plugMinus = m_plugPlus.clone(name+"_plug_minus",x_det.id()); diff --git a/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp index e48aeace42be87d66e7b6f5c307b67d06ffe983b..ff4d746a7598da4c5305b63ffb42497fc46c8e82 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_LumiCalX_geo.cpp @@ -94,12 +94,14 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) Volume sensor_vol (name+"_sensor",sensor_tube, cell_mat); sensor_vol.setVisAttributes(cell_vis); + + // Note: Problem with divisions still - hence no special attributes // Replicate strips within a theta and phi plane padded version Volume sens_theta_vol = Ref_t(sector_tube->Divide(sector_vol,(name+"_sector_theta").c_str(),1,ncell_theta,0,thetastrip_dr)); - sens_theta_vol.setVisAttributes(cell_vis); + //sens_theta_vol.setVisAttributes(cell_vis); Volume sens_phi_vol = Ref_t(sensor_tube->Divide(sensor_vol,(name+"_sensor_phi").c_str(),2,ncell_phi,0,phistrip_dphi*RAD_2_DEGREE)); - sens_phi_vol.setVisAttributes(cell_vis); + //sens_phi_vol.setVisAttributes(cell_vis); //Declare the silcon strip to be sensitive //CellLogical->SetSensitiveDetector(theLumiCalSD); diff --git a/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp index d1dcabec238a5909f46ea68b3570b5e4be89e475..4c288040d1eba45ed21fd4b381939fb53561c7ba 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_SEcal03_geo.cpp @@ -121,7 +121,7 @@ namespace DD4hep { namespace Geometry { /// Build barrel volume std::pair<DetElement,Volume> buildBarrelStave(const Barrel& barrel); /// Build slab - Volume buildSlab(bool barrel, const Dimension dim, SensitiveDetector& sd); + Volume buildSlab(const std::string& prefix, bool barrel, const Dimension dim, SensitiveDetector& sd); // Build radiator solid Volume buildRadiator(const std::string& name, const Dimension& dim, const Material& mat); }; @@ -269,18 +269,25 @@ DetElement SEcal03::construct(LCDD& l, xml_det_t x_det) { double inc_x = (x_mid-x_left ) / (y_top-y_mid); double inc_y = m_alveolus.y + fiber_inter_alveolus; + int itower = -1; for(double last_dim_x=0., y_curr=y_bot+m_alveolus.y; y_curr < y_top; y_curr += inc_y ) { m_alveolus.x = x_right - x_left - ((y_curr <= y_mid) ? 0 : (y_curr - y_mid) * inc_x); // While the towers have the same shape use the same logical volumes and parameters. if(last_dim_x != m_alveolus.x) { + ++itower; //printf("%s> Build slab x=%f y=%f\n",name().c_str(),m_alveolus.x,m_alveolus.y); - EC_TowerSlabs.push_back(buildSlab(false,Dimension(m_alveolus.y,m_slab.total_thickness,m_alveolus.x),m_endcap.sensDet)); + EC_TowerSlabs.push_back(buildSlab(name+_toString(itower,"_endcap_tower%d"),false, + Dimension(m_alveolus.y,m_slab.total_thickness,m_alveolus.x), + m_endcap.sensDet)); if( m_layers[0].nLayer > 0 ) - EC_Towers[0].push_back(buildRadiator(name+"_T1",Dimension(m_alveolus.y,m_layers[0].thickness,m_alveolus.x),m_layers[0].rad_mat)); + EC_Towers[0].push_back(buildRadiator(name+_toString(int(EC_Towers[0].size()),"_endcap_T1_layer%d"), + Dimension(m_alveolus.y,m_layers[0].thickness,m_alveolus.x),m_layers[0].rad_mat)); if( m_layers[1].nLayer > 0 ) - EC_Towers[1].push_back(buildRadiator(name+"_T2",Dimension(m_alveolus.y,m_layers[1].thickness,m_alveolus.x),m_layers[1].rad_mat)); + EC_Towers[1].push_back(buildRadiator(name+_toString(int(EC_Towers[1].size()),"_endcap_T2_layer%d"), + Dimension(m_alveolus.y,m_layers[1].thickness,m_alveolus.x),m_layers[1].rad_mat)); if( m_layers[2].nLayer > 0 ) - EC_Towers[2].push_back(buildRadiator(name+"_T3",Dimension(m_alveolus.y,m_layers[2].thickness,m_alveolus.x),m_layers[2].rad_mat)); + EC_Towers[2].push_back(buildRadiator(name+_toString(int(EC_Towers[2].size()),"_endcap_T3_layer%d"), + Dimension(m_alveolus.y,m_layers[2].thickness,m_alveolus.x),m_layers[2].rad_mat)); last_dim_x = m_alveolus.x; } else { @@ -398,22 +405,22 @@ double SEcal03::radiatorThickness(int layer_id) const { Volume SEcal03::buildRadiator(const string& name, const Dimension& dim, const Material& mat) { Box box(dim.x/2,dim.z/2,dim.y/2); //::printf("%s> Radiator: %.2f %.2f %.2f\n",name.c_str(),dim.x/2,dim.z/2,dim.y/2); - Volume vol("radiator",box,mat); + Volume vol(name+"_radiator",box,mat); vol.setVisAttributes(m_radiatorVis); return vol; } /// Build slab -Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) { +Volume SEcal03::buildSlab(const string& prefix, bool barrel, Dimension dim, SensitiveDetector& sd) { // Slab solid: hx, hz, hy Box slabBox(dim.x/2,dim.z/2,dim.y/2); - Volume slabVol("slab",slabBox,lcdd->air()); + Volume slabVol(prefix+"_slab",slabBox,lcdd->air()); slabVol.setVisAttributes(m_slab.vis); double y_slab_floor = -dim.y/2; // Ground plate Box groundBox(dim.x/2,dim.z/2,m_slab.ground_thickness/2); - Volume groundVol("ground",groundBox,m_slab.ground_mat); + Volume groundVol(prefix+"_ground",groundBox,m_slab.ground_mat); groundVol.setVisAttributes(m_slab.ground_vis); slabVol.placeVolume(groundVol,Position(0,0,y_slab_floor+m_slab.ground_thickness/2)); y_slab_floor += m_slab.ground_thickness; @@ -421,7 +428,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) { // Si layer // we place a big plane of Si and inside it the Si wafers, to simplify the gard ring placements Box siBox(dim.x/2,dim.z/2,m_slab.sensitive_thickness/2); - Volume siVol("sensitive",siBox,m_slab.sensitive_mat); + Volume siVol(prefix+"_sensitive",siBox,m_slab.sensitive_mat); siVol.setVisAttributes(m_slab.sensitive_vis); slabVol.placeVolume(siVol,Position(0,0,y_slab_floor + m_slab.sensitive_thickness/2)); @@ -444,7 +451,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) { double wafer_dim_z = N_cells_in_Z * cell_dim_z; Box waferBox(wafer_dim_x/2, wafer_dim_z/2, m_slab.sensitive_thickness/2); - Volume waferVol("wafer",waferBox,m_slab.sensitive_mat); + Volume waferVol(prefix+"_wafer",waferBox,m_slab.sensitive_mat); waferVol.setVisAttributes(m_slab.wafer_vis); waferVol.setSensitiveDetector(sd); waferVol.setLimitSet(m_limits); @@ -482,7 +489,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) { int N_cells_x_remaining = int(floor((resting_dim_x - 2 * m_guard_ring_size)/cell_dim_x)); wafer_dim_x = N_cells_x_remaining * cell_dim_x; Box waf_box(wafer_dim_x/2, wafer_dim_z/2, m_slab.sensitive_thickness/2); - Volume waf_vol("wafer_rest",waf_box,m_slab.sensitive_mat); + Volume waf_vol(prefix+"_wafer_rest",waf_box,m_slab.sensitive_mat); waf_vol.setVisAttributes(m_slab.wafer_vis); waf_vol.setSensitiveDetector(sd); waf_vol.setLimitSet(m_limits); @@ -520,7 +527,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) { int N_cells_x_remaining = int(std::floor((resting_dim_x - 2 * m_guard_ring_size)/cell_dim_z)); wafer_dim_x = N_cells_x_remaining * cell_dim_z; Box waf_box(wafer_dim_z/2, wafer_dim_x/2, m_slab.sensitive_thickness/2); - Volume waf_vol("wafer", waf_box, m_slab.sensitive_mat); + Volume waf_vol(prefix+"_wafer_rest", waf_box, m_slab.sensitive_mat); waf_vol.setVisAttributes(m_slab.sensitive_vis); waf_vol.setSensitiveDetector(sd); waf_vol.setLimitSet(m_limits); @@ -540,7 +547,7 @@ Volume SEcal03::buildSlab(bool barrel, Dimension dim, SensitiveDetector& sd) { // The PCB layer, the copper and the shielding are placed as a big G10 layer, // as the copper and the shielding ones are very tiny. Box pcbShieldBox(dim.x/2,dim.z/2,m_shield.thickness/2); - Volume pcbShieldVol("pcbshield",pcbShieldBox,m_shield.material); + Volume pcbShieldVol(prefix+"_pcbshield",pcbShieldBox,m_shield.material); pcbShieldVol.setVisAttributes(m_shield.vis); slabVol.placeVolume(pcbShieldVol,Position(0,0,y_slab_floor+m_shield.thickness/2)); return slabVol; @@ -552,11 +559,12 @@ Volume SEcal03::buildEndcap(DetElement det,bool Zminus, const Endcap& endcap, { // While waiting for more geometric details, build a simple Endcap using // a fiber polyhedra and substract the center box + string nam = det.name(); double disp = Zminus ? -m_centerTubDisplacement : m_centerTubDisplacement; Position displacement(disp,0,0); PolyhedraRegular hedra(8, 0, endcap.rmax, m_endcap.thickness); SubtractionSolid solid(hedra, m_center_tube, displacement); - Volume endcap_vol("endcap", solid,m_shield.material); + Volume endcap_vol(nam+"_endcap", solid,m_shield.material); endcap_vol.setVisAttributes(m_endcap.vis); //---------------------------------------------------- @@ -570,38 +578,38 @@ Volume SEcal03::buildEndcap(DetElement det,bool Zminus, const Endcap& endcap, double r_outer = endcap.rmax - m_lateral_face_thickness; double box_dim = (m_endcap_center_box_size - m_lateral_face_thickness)/ 2.; VisAttr ring_vis = lcdd->visAttributes("EcalRingVis"); - + if(m_layers[0].nLayer > 0 ) { PolyhedraRegular hedra_rad(8, r_inner, r_outer, m_layers[0].thickness); SubtractionSolid sol_rad(hedra_rad, m_center_tube, displacement); - vol_radL1 = Volume("ECL1_radiator",sol_rad, m_layers[0].rad_mat); + vol_radL1 = Volume(nam+"_ECL1_radiator",sol_rad, m_layers[0].rad_mat); vol_radL1.setVisAttributes(m_radiatorVis); // plate for slab in ring Box box_ring(box_dim,box_dim, m_layers[0].thickness/2); SubtractionSolid sol_ring(box_ring,m_center_tube,displacement,rot); - vol_ringL1 = Volume(name+"_ECL1_ring",sol_ring,m_layers[0].rad_mat); + vol_ringL1 = Volume(nam+"_ECL1_ring",sol_ring,m_layers[0].rad_mat); vol_ringL1.setVisAttributes(ring_vis); } if(m_layers[1].nLayer > 0 ) { PolyhedraRegular hedra_rad(8, r_inner, r_outer, m_layers[1].thickness); SubtractionSolid sol_rad(hedra_rad, m_center_tube, displacement, rot); - vol_radL2 = Volume("ECL2_radiator",sol_rad, m_layers[0].rad_mat); + vol_radL2 = Volume(nam+"_ECL2_radiator",sol_rad, m_layers[0].rad_mat); vol_radL2.setVisAttributes(m_radiatorVis); // plate for slab in ring Box box_ring(box_dim,box_dim, m_layers[1].thickness/2); SubtractionSolid sol_ring(box_ring,m_center_tube,displacement, rot); - vol_ringL2 = Volume(name+"_ECL2_ring",sol_ring,m_layers[0].rad_mat); + vol_ringL2 = Volume(nam+"_ECL2_ring",sol_ring,m_layers[0].rad_mat); vol_ringL2.setVisAttributes(ring_vis); } if(m_layers[2].nLayer > 0 ) { PolyhedraRegular hedra_rad(8, r_inner, r_outer, m_layers[2].thickness); SubtractionSolid sol_rad(hedra_rad, m_center_tube, displacement, rot); - vol_radL3 = Volume("ECL3_radiator",sol_rad, m_layers[0].rad_mat); + vol_radL3 = Volume(nam+"_ECL3_radiator",sol_rad, m_layers[0].rad_mat); vol_radL3.setVisAttributes(m_radiatorVis); // plate for slab in ring Box box_ring(box_dim,box_dim, m_layers[2].thickness/2); SubtractionSolid sol_ring(box_ring,m_center_tube,displacement, rot); - vol_ringL3 = Volume(name+"_ECL3_ring",sol_ring,m_layers[2].rad_mat); + vol_ringL3 = Volume(nam+"_ECL3_ring",sol_ring,m_layers[2].rad_mat); vol_ringL3.setVisAttributes(ring_vis); } @@ -732,9 +740,9 @@ Volume SEcal03::buildEndcap(DetElement det,bool Zminus, const Endcap& endcap, /// Barrel Standard Module pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) { - DetElement staveDet("stave",0); + DetElement staveDet(name+"_barrel_stave",0); Trapezoid staveTrd(barrel.bottom/2, barrel.top/2, barrel.dim_z/2, barrel.dim_z/2, barrel.thickness/2); - Volume staveVol("stave",staveTrd,m_barrel.material); + Volume staveVol(name+"_barrer_stave",staveTrd,m_barrel.material); staveVol.setVisAttributes(m_barrel.vis); // We count the layers starting from IP and from 1, so odd layers should be inside slabs and @@ -745,6 +753,7 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) { double z_pos; PlacedVolume pv; for(int layer_id = 1; layer_id < m_numLayer+1; layer_id+=2) {// ATTENTION, TWO LAYERS PER LOOP + string l_nam = name+_toString(layer_id,"_barrel_stave_layer%d"); DetElement layerDet(staveDet,_toString(layer_id,"layer%d"),layer_id); // build and place the several Alveolus with the slabs and the radiator layer inside. double rad_thick = radiatorThickness(layer_id); @@ -756,8 +765,9 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) { // To simplify we place each slab and the radiator layer directly into the fiber module. // // Build a slab: - Volume slabVol = buildSlab(true,Dimension(alveolus_dim_x,m_slab.total_thickness,m_alveolus.z),m_barrel.sensDet); - + Volume slabVol = buildSlab(l_nam,true, + Dimension(alveolus_dim_x,m_slab.total_thickness,m_alveolus.z), + m_barrel.sensDet); // Place the Slab and radiator inside the H, here directly into the module fiber as the // H structure is also built in fiber. double z_tower_center = -barrel.dim_z /2 + m_lateral_face_thickness @@ -765,7 +775,7 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) { + m_slab.h_fiber_thickness + m_alveolus.z /2; Dimension radDim1(alveolus_dim_x,rad_thick,m_alveolus.z); - Volume radVol1 = buildRadiator("radiator1",radDim1,barrel.radiatorMaterial); + Volume radVol1 = buildRadiator(l_nam+"_radiator1",radDim1,barrel.radiatorMaterial); for (int itow = m_barrel.numTowers; itow > 0; --itow ) { y_fl = y_floor; x_off = 0; // to be calculed @@ -818,7 +828,7 @@ pair<DetElement,Volume> SEcal03::buildBarrelStave(const Barrel& barrel) { double radiator_dim_z = barrel.dim_z - 2.*m_lateral_face_thickness - 2*N_FIBERS_W_STRUCTURE * m_fiber_thickness; Dimension radDim2(radiator_dim_x,rad_thick,radiator_dim_z); - Volume radVol2 = buildRadiator("radiator2",radDim2,barrel.radiatorMaterial); + Volume radVol2 = buildRadiator(l_nam+"_radiator2",radDim2,barrel.radiatorMaterial); pv = staveVol.placeVolume(radVol2,Position(0,0,-barrel.thickness/2+y_floor+rad_thick/2)); // update the y_floor diff --git a/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp index 3795cb4dfba2fd1e881b419923aa9c0d8d6e4e93..c94f83f949ff77c0b66e308b7565cb614019519e 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_SFtd05_geo.cpp @@ -105,9 +105,10 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_ #endif //... Disks + int cnt = 0; cylinder_t outer, inner; //... assembling detector - for(xml_coll_t c(x_disks,_U(disk)); c; ++c) { + for(xml_coll_t c(x_disks,_U(disk)); c; ++c, ++cnt) { //... Get the disk parameters xml_comp_t x_disk(c); int id = x_disk.id(); @@ -245,7 +246,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_ //... Si sensitive Tube diskTube(inner_radius,outer_radius,si_thickness/2); - Volume diskVol(disk_name+"_silicon",diskTube,siliconMat); + Volume diskVol(disk_name+_toString(cnt,"_silicon_%d"),diskTube,siliconMat); diskVol.setSensitiveDetector(sens_det); diskVol.setVisAttributes(diskVis); assembly.placeVolume(diskVol,Position(0,0, z_pos)).addPhysVolID("disk", id); @@ -253,7 +254,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_ //... Support Tube suppTube(inner_radius,outer_radius,support_thickness/2); - Volume suppVol(disk_name+"_support",suppTube,kaptonMat); + Volume suppVol(disk_name+_toString(cnt,"_support_%d"),suppTube,kaptonMat); suppVol.setVisAttributes(supportVis); assembly.placeVolume(diskVol,Position(0,0, z_pos+si_thickness/2+support_thickness/2)); assembly.placeVolume(diskVol,Position(0,0,-(z_pos+si_thickness/2+support_thickness/2))); diff --git a/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp index a5bff79a3420a14815131816b89f0a53616b0811..ac15bb69550c996db0e9ad9fdc548fcfc840869b 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_SHcalSc02_geo.cpp @@ -441,16 +441,16 @@ void SHcalSc02::constructBarrelChambers(Volume modVol,double chambers_y_off_corr Trap supportTrap1(2*z_width_supp,2*y_height, Hcal_layer_support_length + 2*y_height*tan8, Hcal_layer_support_length); - Volume supportTrapVol1(name+"_trap",supportTrap1,m_aluminum); + Volume supportTrapVol1(name+"_support1",supportTrap1,m_aluminum); supportTrapVol1.setVisAttributes(m_supportTrapVis); Trap supportTrap2(2*z_width_supp,2*y_height, Hcal_layer_support_length + 2*y_height/tan8, Hcal_layer_support_length); - Volume supportTrapVol2(name+"_trap",supportTrap1,m_aluminum); + Volume supportTrapVol2(name+"_support2",supportTrap1,m_aluminum); supportTrapVol2.setVisAttributes(m_supportTrapVis); - Box supportBox(Hcal_layer_support_length/2, z_width_supp, y_height); + Box supportBox(Hcal_layer_support_length/2,z_width_supp,y_height); Volume supportBoxVol(name+"_support",supportBox,m_aluminum); supportBoxVol.setVisAttributes(m_supportTrapVis); diff --git a/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp index b4057d80e9c64aecfbd0731ad93a24de3e957c39..18891f40a8994c499d7706faab2d5069a2da6046 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_VXD03_geo.cpp @@ -102,13 +102,13 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) layer.ladders.gap = x_ladders.gap(); vxd_data->layers.push_back(layer); - string layer_name = name+_toString(layer.id,"_layer_%d"); - DetElement layer_elt(vxd, layer_name, layer.id); + string layer_name = name+_toString(layer.id,"_layer%d"); + DetElement layer_elt(vxd, layer_name, layer.id); double ldd_len = layer.ladders.len; double ldd_width = layer.ladders.width; double ldd_gap = layer.ladders.gap; - Assembly layer_vol(name); + Assembly layer_vol(layer_name); Box ladder_supp_box(ldd_width+side_band_electronics_width, ldd_len+(2.0*end_electronics_zhalf)+ be_ladder_block_length*2., support_thickness/2.); @@ -158,7 +158,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) // ********************** Berylium annulus block ***************************************** Box box(ldd_width,len,be_ladder_block_thickness); - Volume vol(layer_name+"_Be", box, be_ladder_block_mat); + Volume vol(layer_name+_toString(i,"_ladder%d_Be"), box, be_ladder_block_mat); vol.setVisAttributes(lcdd.visAttributes("VXDBerilliumVis")); for( int i=0;i<layer.num_ladder;i++ ) { double phi = i*delta_phi; diff --git a/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp index 0ff59c3e628ac514effe8d94c0dc5d29bed66411..3d6e790fbfbf7d377292751277cbbaac70db1682 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_ftd01_geo.cpp @@ -54,10 +54,10 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) Assembly ftdVol(name); Volume motherVol = lcdd.pickMotherVolume(sdet); - xml_comp_t x_disks = x_det.child(_U(disks)); - xml_comp_t x_cables = x_det.child(_U(cables)); + xml_comp_t x_disks = x_det.child(_U(disks)); + xml_comp_t x_cables = x_det.child(_U(cables)); xml_comp_t x_cylinder = x_det.child(_U(cylinder)); - xml_comp_t x_support = x_det.child(_U(support)); + xml_comp_t x_support = x_det.child(_U(support)); xml_comp_t x_inner_support = x_support.child(_U(inner)); xml_comp_t x_outer_support = x_support.child(_U(outer)); @@ -90,7 +90,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) _Ext *ext_neg=disk_neg.addExtension<_Ext>(new _Ext()); { //... Si sensitive Tube tub(inner_r,outer_r,si_thickness/2.0); - Volume vol(_toString(id,"_disk%d_Si"),tub,diskMat); + Volume vol(name+_toString(id,"_disk%d_Si"),tub,diskMat); vol.setVisAttributes(lcdd.visAttributes(x_disk.visStr())); // This is the sensitive element: add senssitive detector vol.setSensitiveDetector(sens); @@ -105,7 +105,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) } { //... Support Tube tub(inner_r,outer_r,inner_support_thickness); - Volume vol(_toString(id,"_disk%d_support"),tub,supportMat); + Volume vol(name+_toString(id,"_disk%d_support"),tub,supportMat); double z = z_pos + si_thickness + inner_support_thickness; vol.setVisAttributes(supportVis); pv = ftdVol.placeVolume(vol,Position(0,0, z)); @@ -117,7 +117,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) } /* { //... Outer support rings Tube tub(outer_r,outer_r+outer_support.thickness,outer_support_length); - Volume vol(_toString(id,"disk%d_outer_support"),tub,supportMat); + Volume vol(name+_toString(id,"disk%d_outer_support"),tub,supportMat); vol.setVisAttributes(supportVis); pv = ftdVol.placeVolume(vol,Position(0,0, z_pos)); pv.addPhysVolID("disk",id); diff --git a/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp index b8ddabf6dc8a01466c0d62f70005d8f83432fa27..fe41efc5312a10d598d9114428aaadc4c9bfe730 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_tpc06_geo.cpp @@ -61,12 +61,12 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens_ assembly.setVisAttributes(lcdd.visAttributes(x_det.visStr())); Tube innerTube(env.inner_r, gas.inner_r, env.z); - Volume innerVol(name+"_assembly",innerTube,lcdd.material(x_inner.materialStr())); + Volume innerVol(name+"_inner",innerTube,lcdd.material(x_inner.materialStr())); innerVol.setVisAttributes(lcdd.visAttributes(x_inner.visStr())); assembly.placeVolume(innerVol); Tube outerTube(gas.outer_r, env.outer_r, env.z); - Volume outerVol(name+"_assembly",outerTube,lcdd.material(x_outer.materialStr())); + Volume outerVol(name+"_outer",outerTube,lcdd.material(x_outer.materialStr())); outerVol.setVisAttributes(lcdd.visAttributes(x_outer.visStr())); assembly.placeVolume(outerVol); diff --git a/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp b/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp index dad500164553334a3acdf94af5071ed45f4bd0b4..3d3707b252df533a82f74b32ab381a9049a1ae8a 100644 --- a/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp +++ b/DDExamples/ILDExDet/src/compact/Tesla_tubeX01_geo.cpp @@ -207,7 +207,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&) { if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) { wallCone = ConeSegment(zHalf+clipSize/2,start.inner_r,start.outer_r,end.inner_r,end.outer_r); SubtractionSolid sol(wallCone,clip,clip_pos_pos,Rotation(0,0,-clipAngle)); - Volume vol (name+"_"+nam+"_wall_solid",sol,mat); + Volume vol (name+"_"+nam+"_wall_solid_front",sol,mat); vol.setVisAttributes(vis); wall.placeVolume(vol); } @@ -218,7 +218,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&) { wall.setVisAttributes(vis); if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) { SubtractionSolid sol(wallCone,clip, clip_pos_neg, Rotation(0,0,clipAngle)); - Volume vol(name+"_"+nam+"_wall_solid",sol,mat); + Volume vol(name+"_"+nam+"_wall_solid_back",sol,mat); wall.placeVolume(vol); } assembly.placeVolumeEx(wall,Position(0,0,zPos-clipSize/2),Rotation(0,0,reflect_angle)); @@ -249,7 +249,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&) { if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) { wallCone = ConeSegment(zHalf + clipSize/2,start.inner_r,start.outer_r,end.inner_r,end.outer_r); solid = SubtractionSolid(wallCone,clip,clip_pos_pos,Rotation(0,0,-clipAngle)); - Volume wall (name+"_"+nam+"_wall_solid",solid,mat); + Volume wall (name+"_"+nam+"_wall_pos_solid",solid,mat); wall.setVisAttributes(vis); vol.placeVolume(wall); } @@ -260,7 +260,7 @@ static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector&) { vol.setVisAttributes(vis); if (start.inner_r != start.outer_r || end.inner_r != end.outer_r) { solid = SubtractionSolid(wallCone, clip, clip_pos_neg, Rotation(0,0,+clipAngle)); - Volume wall (name+"_"+nam+"_wall_solid",solid,mat); + Volume wall (name+"_"+nam+"_wall_neg_solid",solid,mat); wall.setVisAttributes(vis); vol.placeVolume(wall); }