LCDD& LCDDImp::addDetector(const Ref_t& ref_det) { DetElement det_element(ref_det); LCDDHelper helper(this); DetElement existing_det = helper.detectorByID(det_element.id()); if ( existing_det.isValid() ) { SensitiveDetector sd = helper.sensitiveDetector(existing_det); if ( sd.isValid() ) { stringstream str; str << "LCDD: The sensitive sub-detectors " << det_element.name() << " and " << existing_det.name() << " have the identical ID:" << det_element.id() << "."; printout(ERROR,"LCDD",str.str()); throw runtime_error(str.str()); } } m_detectors.append(ref_det); det_element->flag |= DetElement::Object::IS_TOP_LEVEL_DETECTOR; Volume volume = det_element.placement()->GetMotherVolume(); if ( volume == m_worldVol ) { printout(DEBUG,"LCDD","Added detector %s to the world instance.",det_element.name()); m_world.add(det_element); return *this; } // The detector's placement must be one of the existing detectors for(HandleMap::iterator i = m_detectors.begin(); i!=m_detectors.end(); ++i) { DetElement parent((*i).second); Volume vol = parent.placement().volume(); if ( vol == volume ) { printout(INFO,"LCDD","Added detector %s to the parent:%s.",det_element.name(),parent.name()); parent.add(det_element); return *this; } } throw runtime_error("LCDD: The detector " + string(det_element.name()) + " has no known parent."); }
/// Load 'levels' Children into the geometry scene void Display::LoadGeoChildren(TEveElement* start, int levels, bool redraw) { using namespace DD4hep::Geometry; DetElement world = m_lcdd->world(); if ( world.children().size() == 0 ) { MessageBox(INFO,"It looks like there is no\nGeometry loaded.\nNo event display availible.\n"); } else if ( levels > 0 ) { if ( 0 == start ) { TEveElementList& sens = GetGeoTopic("Sensitive"); TEveElementList& struc = GetGeoTopic("Structure"); const DetElement::Children& c = world.children(); printout(INFO,"Display","+++ Load children of %s to %d levels", world.placement().name(), levels); for (DetElement::Children::const_iterator i = c.begin(); i != c.end(); ++i) { DetElement de = (*i).second; SensitiveDetector sd = m_lcdd->sensitiveDetector(de.name()); TEveElementList& parent = sd.isValid() ? sens : struc; pair<bool,TEveElement*> e = Utilities::LoadDetElement(de,levels,&parent); if ( e.second && e.first ) { parent.AddElement(e.second); } } } else { TGeoNode* n = (TGeoNode*)start->GetUserData(); printout(INFO,"Display","+++ Load children of %s to %d levels",Utilities::GetName(start),levels); if ( 0 != n ) { TGeoHMatrix mat; const char* node_name = n->GetName(); int level = Utilities::findNodeWithMatrix(lcdd().world().placement().ptr(),n,&mat); if ( level > 0 ) { pair<bool,TEveElement*> e(false,0); const DetElement::Children& c = world.children(); for (DetElement::Children::const_iterator i = c.begin(); i != c.end(); ++i) { DetElement de = (*i).second; if ( de.placement().ptr() == n ) { e = Utilities::createEveShape(0, levels, start, n, mat, de.name()); break; } } if ( !e.first && !e.second ) { e = Utilities::createEveShape(0, levels, start, n, mat, node_name); } if ( e.first ) { // newly created start->AddElement(e.second); } printout(INFO,"Display","+++ Import geometry node %s with %d levels.",node_name, levels); } else { printout(INFO,"Display","+++ FAILED to import geometry node %s with %d levels.",node_name, levels); } } else { LoadGeoChildren(0,levels,false); } } } if ( redraw ) { manager().Redraw3D(); } }