static long exec_SimpleGDMLWriter(LCDD& lcdd, int argc, char** argv) { if ( argc > 1 ) { string output = argv[1]; ofstream out(output.c_str()+1,ios_base::out); SimpleGDMLWriter dmp(out); dmp.create(lcdd.world()); } else { SimpleGDMLWriter dmp(cout); dmp.create(lcdd.world()); } return 1; }
/** Basic entry point to print out the volume hierarchy * * @author M.Frank * @version 1.0 * @date 01/04/2014 */ static long detelement_cache(LCDD& lcdd, int , char** ) { struct Actor { static long cache(DetElement de) { const DetElement::Children& c = de.children(); de.worldTransformation(); de.parentTransformation(); de.placementPath(); de.path(); for (DetElement::Children::const_iterator i = c.begin(); i != c.end(); ++i) cache((*i).second); return 1; } }; return Actor::cache(lcdd.world()); }
/** Basic entry point to print out the detector element hierarchy * * @author M.Frank * @version 1.0 * @date 01/04/2014 */ template <int flag> long dump_detelement_tree(LCDD& lcdd, int argc, char** argv) { struct Actor { static long dump(DetElement de,int level, bool sensitive_only) { const DetElement::Children& c = de.children(); if ( !sensitive_only || 0 != de.volumeID() ) { PlacedVolume place = de.placement(); const TGeoNode* node = place.ptr(); char sens = place.volume().isSensitive() ? 'S' : ' '; int value = flag; char fmt[128]; switch(value) { case 0: ::snprintf(fmt,sizeof(fmt),"%03d %%-%ds %%s #Dau:%%d VolID:%%08X Place:%%p %%c",level+1,2*level+1); printout(INFO,"DetectorDump",fmt,"",de.path().c_str(),int(c.size()), (unsigned long)de.volumeID(), (void*)node, sens); break; case 1: ::snprintf(fmt,sizeof(fmt),"%03d %%-%ds Detector: %%s #Dau:%%d VolID:%%p",level+1,2*level+1); printout(INFO,"DetectorDump", fmt, "", de.path().c_str(), int(c.size()), (void*)de.volumeID()); ::snprintf(fmt,sizeof(fmt),"%03d %%-%ds Placement: %%s %%c",level+1,2*level+3); printout(INFO,"DetectorDump",fmt,"", de.placementPath().c_str(), sens); break; default: break; } } for (DetElement::Children::const_iterator i = c.begin(); i != c.end(); ++i) dump((*i).second,level+1,sensitive_only); return 1; } }; bool sensitive_only = false; for(int i=0; i<argc; ++i) { if ( ::strcmp(argv[i],"--sensitive")==0 ) { sensitive_only = true; } } return Actor::dump(lcdd.world(),0,sensitive_only); }
static long exec_GeometryTreeDump(LCDD& lcdd, int, char** ) { GeometryTreeDump dmp; dmp.create(lcdd.world()); return 1; }
/** Basic entry point to print out the volume hierarchy * * @author M.Frank * @version 1.0 * @date 01/04/2014 */ static long dump_volume_tree(LCDD& lcdd, int argc, char** argv) { struct Actor { typedef PlacedVolume::VolID VID; typedef PlacedVolume::VolIDs VIDs; bool m_printVolIDs; bool m_printPositions; bool m_printSensitivesOnly; Actor(int ac, char** av) : m_printVolIDs(false), m_printPositions(false), m_printSensitivesOnly(false) { for(int i=0; i<ac; ++i) { char c = ::tolower(av[i][0]); if ( c == 'v' ) m_printVolIDs = true; else if ( c == 'p' ) m_printPositions = true; else if ( c == 's' ) m_printSensitivesOnly = true; } } long dump(TGeoNode* ideal, TGeoNode* aligned,int level, VIDs volids) const { char fmt[128]; string opt_info; PlacedVolume pv(ideal); bool sensitive = false; if ( m_printPositions || m_printVolIDs ) { stringstream log; if ( m_printPositions ) { const double* trans = ideal->GetMatrix()->GetTranslation(); ::snprintf(fmt, sizeof(fmt), "Pos: (%f,%f,%f) ",trans[0],trans[1],trans[2]); log << fmt; } // Top level volume! have no volume ids if ( m_printVolIDs && ideal && ideal->GetMotherVolume() ) { VIDs vid = pv.volIDs(); if ( !vid.empty() ) { sensitive = true; log << " VolID: "; volids.std::vector<VID>::insert(volids.end(),vid.begin(),vid.end()); for(VIDs::const_iterator i=volids.begin(); i!=volids.end(); ++i) { ::snprintf(fmt, sizeof(fmt), "%s:%2d ",(*i).first.c_str(), (*i).second); log << fmt; } } } opt_info = log.str(); } TGeoVolume* volume = ideal->GetVolume(); if ( !m_printSensitivesOnly || (m_printSensitivesOnly && sensitive) ) { char sens = pv.volume().isSensitive() ? 'S' : ' '; if ( ideal == aligned ) { ::snprintf(fmt,sizeof(fmt),"%03d %%-%ds %%s (%%s: %%s) \t[%p] %c %%s", level+1,2*level+1,(void*)ideal, sens); } else { ::snprintf(fmt,sizeof(fmt),"%03d %%-%ds %%s (%%s: %%s) Ideal:%p Aligned:%p %c %%s", level+1,2*level+1,(void*)ideal,(void*)aligned, sens); } printout(INFO,"+++",fmt,"", aligned->GetName(), volume->GetTitle(), volume->GetShape()->IsA()->GetName(), opt_info.c_str()); } for (Int_t idau = 0, ndau = aligned->GetNdaughters(); idau < ndau; ++idau) { TGeoNode* ideal_daughter = ideal->GetDaughter(idau); const char* daughter_name = ideal_daughter->GetName(); TGeoNode* aligned_daughter = volume->GetNode(daughter_name); dump(ideal_daughter, aligned_daughter, level+1, volids); } return 1; } }; string place = lcdd.world().placementPath(); DetectorTools::PlacementPath path; DetectorTools::placementPath(lcdd.world(), path); PlacedVolume pv = DetectorTools::findNode(lcdd.world().placement(),place); Actor actor(argc,argv); return actor.dump(lcdd.world().placement().ptr(),pv.ptr(),0,PlacedVolume::VolIDs()); }