ATLAS Offline Software
Loading...
Searching...
No Matches
VP1GeometrySystem::Imp Class Reference

Classes

class  SubSystemInfo

Public Member Functions

 Imp (VP1GeometrySystem *gs, const VP1GeoFlags::SubSystemFlags &ssf)
void addSubSystem (const VP1GeoFlags::SubSystemFlag &, const QString &treetopregexp, const QString &childrenregexp="", const std::string &matname="", bool negatetreetopregexp=false, bool negatechildrenregexp=false, const QString &grandchildrenregexp="", bool negategrandchildrenregexp=false)
SubSystemInfochamberPVToMuonSubSystemInfo (const GeoPVConstLink &chamberPV)
void ensureInitVisAttributes ()
void buildSystem (SubSystemInfo *)
void updateTouchedMuonChamber (VolumeHandle *chamberhandle)
std::pair< SbVec3f, SbVec3f > getClosestMuonDriftTubeDirections (const SbVec3f &cameraDirection, const SbVec3f &cameraUpDirection, VolumeHandle *chamberhandle)
std::pair< SbVec3f, SbVec3f > getClosestCSCOrTGCEdgeDirections (const SbVec3f &cameraDirection, VolumeHandle *chamberhandle)
void changeStateOfVisibleNonStandardVolumesRecursively (VolumeHandle *, VP1GeoFlags::VOLSTATE)
void expandVisibleVolumesRecursively (VolumeHandle *, const QRegExp &, bool bymatname)
void iconifyVisibleVolumesRecursively (VolumeHandle *, const QRegExp &, bool bymatname)
void ensureInitPV2MuonStationMap ()
void updatePV2MuonStationMap (const MuonGM::MuonReadoutElement *elem)
QStringList stationInfo (const MuonGM::MuonStation *)
void expandAllChildren (VolumeHandle *, bool isPixel, bool brl, bool ecA, bool ecC)
void showPixelModules (VolumeHandle *)
void showITkPixelModules (VolumeHandle *, bool brl, bool ecA, bool ecC)
void showITkStripModules (VolumeHandle *, bool brl, bool ecA, bool ecC)
void showSCTBarrelModules (VolumeHandle *)
void showSCTEndcapModules (VolumeHandle *)
void applyTopVolStates (const QMap< quint32, QByteArray > &, bool disablenotif=false)
void createPathExtras (const VolumeHandle *, QString &, QStack< QString > &)

Static Public Member Functions

static double exclusiveMass (const PVConstLink &pv)
static double inclusiveMass (const PVConstLink &pv)
static double volume (const PVConstLink &pv)
static void catchKbdState (void *userData, SoEventCallback *CB)

Public Attributes

VP1GeometrySystemtheclass
SoSeparator * sceneroot
std::map< SoSeparator *, VolumeHandle * > sonodesep2volhandle
QList< SubSystemInfo * > subsysInfoList
DetVisAttributesdetVisAttributes
MatVisAttributesmatVisAttributes
VolVisAttributesvolVisAttributes
VP1GeoFlags::SubSystemFlags initialSubSystemsTurnedOn
GeoSysControllercontroller
PhiSectorManagerphisectormanager
VolumeTreeModelvolumetreemodel
const SoKeyboardEvent * kbEvent
std::map< PVConstLink, VolumeHandle * > muonchambers_pv2handles
std::map< QObject *, std::set< GeoPVConstLink > > sender2ChamberList
VolumeHandlepreviousAlignedChamberHandle
int last_appropriatemdtprojections
SoSeparator * m_textSep
 Separator used to hold all visible labels.
std::map< GeoPVConstLink, const MuonGM::MuonStation * > pv2MuonStation
bool pv2MuonStationInit
QMap< quint32, QByteArray > restoredTopvolstates
QList< const std::map< GeoPVConstLink, float > * > chamberT0s

Detailed Description

Definition at line 94 of file VP1GeometrySystem.cxx.

Constructor & Destructor Documentation

◆ Imp()

VP1GeometrySystem::Imp::Imp ( VP1GeometrySystem * gs,
const VP1GeoFlags::SubSystemFlags & ssf )
inline

Definition at line 96 of file VP1GeometrySystem.cxx.

97 : theclass(gs), sceneroot(0),
102 #ifndef BUILDVP1LIGHT
103 ,pv2MuonStationInit(false)
104 #endif
105 {
106 const unsigned n_chamber_t0_sources=2;
107 for (unsigned i=0;i<n_chamber_t0_sources;++i)
108 chamberT0s.append(0);
109 }
VP1GeometrySystem * theclass
VP1GeoFlags::SubSystemFlags initialSubSystemsTurnedOn
SoSeparator * m_textSep
Separator used to hold all visible labels.
PhiSectorManager * phisectormanager
VolumeHandle * previousAlignedChamberHandle
DetVisAttributes * detVisAttributes
VolVisAttributes * volVisAttributes
GeoSysController * controller
const SoKeyboardEvent * kbEvent
QList< const std::map< GeoPVConstLink, float > * > chamberT0s
MatVisAttributes * matVisAttributes
VolumeTreeModel * volumetreemodel

Member Function Documentation

◆ addSubSystem()

void VP1GeometrySystem::Imp::addSubSystem ( const VP1GeoFlags::SubSystemFlag & f,
const QString & treetopregexp,
const QString & childrenregexp = "",
const std::string & matname = "",
bool negatetreetopregexp = false,
bool negatechildrenregexp = false,
const QString & grandchildrenregexp = "",
bool negategrandchildrenregexp = false )

Definition at line 365 of file VP1GeometrySystem.cxx.

369{
370 theclass->messageDebug("VP1GeometrySystem::Imp::addSubSystem - flag: '" + QString(f) + "' - matName: '" + str(matname.c_str()) + "'." );
371
372 QCheckBox * cb = controller->subSystemCheckBox(f);
373 if (!cb) {
374 theclass->message("Error: Problems retrieving checkbox for subsystem "+str(f));
375 return;
376 }
377 subsysInfoList << new SubSystemInfo(cb,QRegExp(treetopregexp),negatetreetopregexp,
378 QRegExp(childrenregexp),negatechildrenregexp,f,matname,
379 QRegExp(grandchildrenregexp), negategrandchildrenregexp);
380 //FIXME: DELETE!!!
381}
QList< SubSystemInfo * > subsysInfoList

◆ applyTopVolStates()

void VP1GeometrySystem::Imp::applyTopVolStates ( const QMap< quint32, QByteArray > & topvolstates,
bool disablenotif = false )

Definition at line 1386 of file VP1GeometrySystem.cxx.

1387{
1388 if (disablenotif)
1389 phisectormanager->largeChangesBegin();
1390 QMap<quint32,QByteArray>::const_iterator topvolstatesItr;
1391 for (Imp::SubSystemInfo * subsys : subsysInfoList) {
1392 VolumeHandle::VolumeHandleListItr it(subsys->vollist.begin()),itE(subsys->vollist.end());
1393 for (;it!=itE;++it) {
1394 topvolstatesItr = topvolstates.find((*it)->hashID());
1395 if (topvolstatesItr!=topvolstates.end())
1396 (*it)->applyPersistifiableState(topvolstatesItr.value());
1397 }
1398 }
1399 if (disablenotif) {
1400 phisectormanager->updateRepresentationsOfVolsAroundZAxis();
1401 phisectormanager->largeChangesEnd();
1402 }
1403}
VolumeHandleList::iterator VolumeHandleListItr

◆ buildSystem()

void VP1GeometrySystem::Imp::buildSystem ( SubSystemInfo * si)

Definition at line 1098 of file VP1GeometrySystem.cxx.

1099{
1100 VP1Msg::messageDebug("VP1GeometrySystem::Imp::buildSystem()" );
1101
1102 if (!si||si->isbuilt)
1103 return;
1104 si->isbuilt = true;
1105 int ichild(0);
1106
1108 #ifndef BUILDVP1LIGHT
1109 ensureInitPV2MuonStationMap(); // Needed for Muon Station names.
1110 #endif
1111
1112// // DEBUG
1113// for (Imp::SubSystemInfo*si : m_d->subsysInfoList) {
1114// VP1Msg::messageDebug("vol: " + QString((si->flag).str_c()) );
1115// }
1116
1117 assert(si->soswitch);
1118 SoSeparator * subsystemsep = new SoSeparator;
1119 phisectormanager->registerSubSystemSeparator(si->flag,subsystemsep);
1120 phisectormanager->largeChangesBegin();
1121
1122 SbBool save = si->soswitch->enableNotify(false);
1123
1124 if (si->geomodelchildrenregexp.isEmpty()) {
1125 //Loop over the treetop's that we previously selected:
1126 std::vector<SubSystemInfo::TreetopInfo>::const_iterator it, itE = si->treetopinfo.end();
1127 for (it=si->treetopinfo.begin();it!=itE;++it)
1128 {
1129 VP1Msg::messageDebug("toptree vol: " + QString(it->volname.c_str()) );
1130
1131 //Find material:
1132 SoMaterial*m = detVisAttributes->get(it->volname);
1133 if (!m) {
1134 theclass->message("Warning: Did not find a predefined material for volume: "+QString(it->volname.c_str()));
1135 }
1136 VolumeHandleSharedData* volhandle_subsysdata = new VolumeHandleSharedData(controller,si->flag,&sonodesep2volhandle,it->pV,phisectormanager,
1138 controller->zappedVolumeListModel(),controller->volumeTreeBrowser(), m_textSep);
1139 SbMatrix matr;
1141 VolumeHandle * vh = new VolumeHandle(volhandle_subsysdata,0,it->pV,ichild++,VolumeHandle::NONMUONCHAMBER,matr);
1142 si->vollist.push_back(vh);
1143 // std::cout<<"Non muon chamber VH="<<vh<<std::endl;
1144 }
1145 } else {
1146 //Loop over the children of the physical volumes of the treetops that we previously selected:
1147 std::vector<SubSystemInfo::TreetopInfo>::const_iterator it, itE = si->treetopinfo.end();
1148 for (it=si->treetopinfo.begin();it!=itE;++it) {
1149
1150 VP1Msg::messageDebug("group name: " + QString(si->matname.c_str()) );
1151
1152 //NB: Here we use the si->matname. Above we use the si->volname. Historical reasons!
1153
1154 //Find material for top-nodes:
1155 SoMaterial*mat_top(0);
1156 if (si->matname!="")
1157 mat_top = detVisAttributes->get(si->matname);
1158
1159 VolumeHandleSharedData* volhandle_subsysdata = new VolumeHandleSharedData(controller,si->flag,&sonodesep2volhandle,it->pV,phisectormanager,
1161 controller->zappedVolumeListModel(),controller->volumeTreeBrowser(),m_textSep);
1162 volhandle_subsysdata->ref();
1163
1164 const bool hasMuonChambers=si->hasMuonChambers();
1165
1166 GeoVolumeCursor av(it->pV);
1167 //unsigned int count=0;
1168 while (!av.atEnd()) {
1169
1170 // DEBUG
1171// VP1Msg::messageDebug("child vol: " + QString(av.getName().c_str()) );
1172
1173 //Use the childrenregexp to select the correct child volumes:
1174 if (si->childrenRegExpNameCompatible(av.getName().c_str())) {
1175 PVConstLink pVD = av.getVolume();
1176 SbMatrix matr;
1178 VolumeHandle * vh=0;
1179 // std::cout<<count++<<": dump SubSystemInfo\n"<<"---"<<std::endl;
1180 // si->dump();
1181 // std::cout<<"---"<<std::endl;
1182 if (hasMuonChambers){
1183 #ifndef BUILDVP1LIGHT
1184 vh = new MuonVolumeHandle(volhandle_subsysdata,0,pVD,ichild++,VolumeHandle::MUONCHAMBER_DIRTY,matr,pv2MuonStation[pVD],chamberT0s);
1185 #endif
1186 #ifdef BUILDVP1LIGHT
1187 vh = new VolumeHandle(volhandle_subsysdata,0,pVD,ichild++,VolumeHandle::MUONCHAMBER_DIRTY,matr);
1188 #endif
1189 muonchambers_pv2handles[pVD] = vh;
1190 if(VP1Msg::debug()){
1191 std::cout<<"Has muon chamber VH="<<vh<<std::endl;
1192 }
1193
1194 } else {
1195
1196 vh = new VolumeHandle(volhandle_subsysdata,0,pVD,ichild++,
1198 // std::cout<<"Does not have muon chamber (weird one) VH="<<vh<<std::endl;
1199 }
1200
1201 // DEBUG
1202// VP1Msg::messageDebug("granchild vol: " + vh->getName() + " - " + vh->getDescriptiveName() );
1203
1204 if (si->geomodelgrandchildrenregexp.isEmpty()) {
1205 // append the volume to the current list
1206 theclass->messageDebug("grandchild inserted : " + vh->getDescriptiveName() + " - " + vh->getName() );
1207 si->vollist.push_back(vh);
1208
1209 } else {
1210 VP1Msg::messageDebug("filtering at grandchild level...");
1211 if (si->grandchildrenRegExpNameCompatible(vh->getName().toStdString() ) ) {
1212 VP1Msg::messageDebug("filtered grandchild inserted : " + vh->getDescriptiveName() + " - " + vh->getName() );
1213 // append the volume to the current list
1214 si->vollist.push_back(vh);
1215 } else {
1216 theclass->message("Zapping this volumehandle because it's probably junk."+vh->getDescriptiveName() + " - " + vh->getName());
1217 vh->setState(VP1GeoFlags::ZAPPED); // FIXME - better solution for this? Maybe just don't create them?
1218
1219 // std::cout<<"Not adding "<<vh->getName().toStdString()<<"["<<vh<<"] to vollist"<<std::endl;
1220 }
1221 }
1222 }
1223 av.next(); // increment volume cursor.
1224 }
1225 volhandle_subsysdata->unref();//To ensure it is deleted if it was not used.
1226 }
1227 }
1228
1229 if (VP1Msg::debug()) si->dump();
1230
1231 VP1Msg::messageDebug("volumetreemodel->addSubSystem...");
1232 volumetreemodel->addSubSystem( si->flag, si->vollist );
1233
1234 //NB: We let the destructor of volumetreemodel take care of deleting
1235 //our (top) volume handles, since it has to keep a list of them
1236 //anyway.
1237
1238
1239 //Perform auto expansion of all ether volumes (needed for muon dead material):
1240 VP1Msg::messageDebug("Perform auto expansion of all ether volumes (needed for muon dead material)");
1241 VolumeHandle::VolumeHandleListItr it, itE(si->vollist.end());
1242 //int idx=0; // for debug
1243 for (it = si->vollist.begin(); it!=itE; ++it){
1244 //VP1Msg::messageDebug("\nexpanding idx: " + QString::number(++idx));
1245 (*it)->expandMothersRecursivelyToNonEther();
1246 //VP1Msg::messageDebug("expand DONE.");
1247 }
1248
1249
1250 VP1Msg::messageDebug("addChild...");
1251 phisectormanager->updateRepresentationsOfVolsAroundZAxis();
1252 phisectormanager->largeChangesEnd();
1253 si->soswitch->addChild(subsystemsep);
1254 si->soswitch->enableNotify(save);
1255 if (save)
1256 si->soswitch->touch();
1257 VP1Msg::messageDebug("END of VP1GeometrySystem::Imp::buildSystem() " );
1258}
std::map< PVConstLink, VolumeHandle * > muonchambers_pv2handles
std::map< GeoPVConstLink, const MuonGM::MuonStation * > pv2MuonStation
std::map< SoSeparator *, VolumeHandle * > sonodesep2volhandle
static void transformToMatrix(SoTransform *xf, SbMatrix &result)
static bool debug()
Definition VP1Msg.h:32
static void messageDebug(const QString &)
Definition VP1Msg.cxx:39
void setState(const VP1GeoFlags::VOLSTATE &state)
QString getName() const
virtual QString getDescriptiveName() const
HepGeom::Transform3D EigenTransformToCLHEP(const Amg::Transform3D &eigenTransf)
Converts an Eigen-based Amg::Transform3D into a CLHEP-based HepGeom::Transform3D.

◆ catchKbdState()

void VP1GeometrySystem::Imp::catchKbdState ( void * userData,
SoEventCallback * CB )
static

Definition at line 505 of file VP1GeometrySystem.cxx.

505 {
506 VP1GeometrySystem::Imp *This=static_cast<VP1GeometrySystem::Imp*>(address);
507 if (This)
508 This->kbEvent = static_cast<const SoKeyboardEvent *>(CB->getEvent());
509}

◆ chamberPVToMuonSubSystemInfo()

VP1GeometrySystem::Imp::SubSystemInfo * VP1GeometrySystem::Imp::chamberPVToMuonSubSystemInfo ( const GeoPVConstLink & chamberPV)

Definition at line 1746 of file VP1GeometrySystem.cxx.

1747{
1748 VP1Msg::messageDebug("VP1GeometrySystem::Imp::chamberPVToMuonSubSystemInfo()");
1749
1750 std::string name = chamberPV->getLogVol()->getName();
1751
1752 VP1Msg::messageDebug("name: " + QString::fromStdString(name) );
1753
1754 for (SubSystemInfo * subsys : subsysInfoList) {
1755 if (!subsys->hasMuonChambers())
1756 continue;
1757 if (subsys->childrenRegExpNameCompatible(name)) {
1758 //NB: We assume once again that all muon chambers are to be
1759 //compared with childrenRegExp.
1760 return subsys;
1761 }
1762 }
1763 return 0;
1764}
const QString & name() const

◆ changeStateOfVisibleNonStandardVolumesRecursively()

void VP1GeometrySystem::Imp::changeStateOfVisibleNonStandardVolumesRecursively ( VolumeHandle * handle,
VP1GeoFlags::VOLSTATE target )

Definition at line 2005 of file VP1GeometrySystem.cxx.

2006{
2007 assert(target!=VP1GeoFlags::CONTRACTED);
2008 if (handle->isAttached()) {
2009 //The volume is visible, so ignore daughters
2011 if (target!=VP1GeoFlags::EXPANDED||handle->nChildren()>0)
2012 handle->setState(target);
2013 }
2014 return;
2015 } else if (handle->state()==VP1GeoFlags::ZAPPED)
2016 return;
2017 //Must be expanded: Let us call on any (initialised) children instead.
2018 if (handle->nChildren()==0||!handle->childrenAreInitialised())
2019 return;
2021 for(;it!=itE;++it)
2023
2024}
void changeStateOfVisibleNonStandardVolumesRecursively(VolumeHandle *, VP1GeoFlags::VOLSTATE)
bool childrenAreInitialised() const
VP1GeoFlags::VOLSTATE state() const
VolumeHandleListItr childrenBegin()
VolumeHandleListItr childrenEnd()
bool isAttached() const
bool isInitialisedAndHasNonStandardShape() const
unsigned nChildren() const

◆ createPathExtras()

void VP1GeometrySystem::Imp::createPathExtras ( const VolumeHandle * volhandle,
QString & prefix,
QStack< QString > & entries )

Definition at line 1406 of file VP1GeometrySystem.cxx.

1407{
1408 switch(volhandle->subsystem()){
1409 case VP1GeoFlags::Pixel: {
1410 prefix = QString("Pixel::");
1411 entries.push("IDET::IDET");
1413 entries.push("ITkPixel::ITkPixel");
1414 else
1415 entries.push("Pixel::Pixel");
1416 return;
1417 }
1418 case VP1GeoFlags::SCT:{
1419 prefix = QString("SCT::");
1420 entries.push("IDET::IDET");
1422 entries.push("ITkStrip::ITkStrip");
1423 else
1424 entries.push("SCT::SCT");
1425 return;
1426 }
1427 case VP1GeoFlags::TRT:{
1428 prefix = QString("TRT::");
1429 entries.push("IDET::IDET");
1430 entries.push("TRT::TRT");
1431 return;
1432 }
1434 prefix = QString("InDetServMat::");
1435 entries.push("IDET::IDET");
1436 return;
1437 }
1438 case VP1GeoFlags::LAr:{
1439 prefix = QString("LArMgr::");
1440 entries.push("CALO::CALO");
1441 entries.push("LArMgr::LArMgr");
1442 return;
1443 }
1444 case VP1GeoFlags::Tile:{
1445 prefix = QString("Tile::");
1446 entries.push("CALO::CALO");
1447 entries.push("Tile::Tile");
1448 return;
1449 }
1463 prefix = QString("Muon::");
1464 entries.push("MUONQ02::MUONQ02");
1465 entries.push("Muon::MuonSys");
1466 return;
1467 }
1469 prefix = QString("BeamPipe::");
1470 entries.push("BeamPipe::BeamPipe");
1471 return;
1472 }
1473 case VP1GeoFlags::None:
1475 case VP1GeoFlags::LUCID:
1476 case VP1GeoFlags::ZDC:
1477 case VP1GeoFlags::ALFA:
1478 case VP1GeoFlags::AFP:
1481 default:{
1482 return;
1483 }
1484 }
1485}
@ MuonEndcapStationTGC
Definition VP1GeoFlags.h:47
@ AllUnrecognisedVolumes
Definition VP1GeoFlags.h:73
@ MuonBarrelStationInner
Definition VP1GeoFlags.h:42
@ MuonBarrelStationMiddle
Definition VP1GeoFlags.h:44
@ MuonBarrelStationOuter
Definition VP1GeoFlags.h:45
@ MuonEndcapStationCSC
Definition VP1GeoFlags.h:46
@ MuonEndcapStationMDT
Definition VP1GeoFlags.h:49
static bool hasITkGeometry()
VP1GeoFlags::SubSystemFlag subsystem() const
double entries
Definition listroot.cxx:49

◆ ensureInitPV2MuonStationMap()

void VP1GeometrySystem::Imp::ensureInitPV2MuonStationMap ( )

Definition at line 2189 of file VP1GeometrySystem.cxx.

2190{
2191 if (pv2MuonStationInit) {
2192 VP1Msg::messageDebug("MuonStation map already initialized.");
2193 return;
2194 }
2195 pv2MuonStationInit = true;
2196 theclass->messageVerbose("Initializing physical volume link -> MuonStation map.");
2197
2198 const MuonGM::MuonDetectorManager * mgr = VP1DetInfo::muonDetMgr();
2199 if (!mgr) {
2200 VP1Msg::message("WARNING: Could not get muon detector manager to construct volume -> muon station map!");
2201 return;
2202 }
2203 if (mgr->nMdtRE()) {
2204 for (auto det_el = mgr->mdtIdHelper()->detectorElement_begin();
2205 det_el != mgr->mdtIdHelper()->detectorElement_end(); ++det_el) {
2206 updatePV2MuonStationMap(mgr->getMdtReadoutElement(*det_el));
2207 }
2208 }
2209 if (mgr->nRpcRE()) {
2210 for (auto det_el = mgr->rpcIdHelper()->detectorElement_begin();
2211 det_el != mgr->rpcIdHelper()->detectorElement_end(); ++det_el) {
2212 updatePV2MuonStationMap(mgr->getRpcReadoutElement(*det_el));
2213 }
2214 }
2215 if (mgr->nCscRE()) {
2216 for (auto det_el = mgr->cscIdHelper()->detectorElement_begin();
2217 det_el != mgr->cscIdHelper()->detectorElement_end(); ++det_el) {
2218 updatePV2MuonStationMap(mgr->getCscReadoutElement(*det_el));
2219 }
2220 }
2221 if (mgr->nTgcRE()) {
2222 for (auto det_el = mgr->tgcIdHelper()->detectorElement_begin();
2223 det_el != mgr->tgcIdHelper()->detectorElement_end(); ++det_el) {
2224 updatePV2MuonStationMap(mgr->getTgcReadoutElement(*det_el));
2225 }
2226 }
2227
2228 VP1Msg::messageDebug("Initialised physical volume link -> MuonStation map. Found "+str(pv2MuonStation.size())+" stations.");
2229
2230}
static const MuonGM::MuonDetectorManager * muonDetMgr()
void updatePV2MuonStationMap(const MuonGM::MuonReadoutElement *elem)
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30

◆ ensureInitVisAttributes()

void VP1GeometrySystem::Imp::ensureInitVisAttributes ( )
inline

Definition at line 236 of file VP1GeometrySystem.cxx.

236 {
237 if (!detVisAttributes) detVisAttributes = new DetVisAttributes();
238 if (!matVisAttributes) matVisAttributes = new MatVisAttributes();
239 if (!volVisAttributes) volVisAttributes = new VolVisAttributes();
240 }

◆ exclusiveMass()

double VP1GeometrySystem::Imp::exclusiveMass ( const PVConstLink & pv)
static

Definition at line 1261 of file VP1GeometrySystem.cxx.

1261 {
1262 const GeoLogVol* lv = pv->getLogVol();
1263 const GeoMaterial *material = lv->getMaterial();
1264 double density = material->getDensity();
1265 return density*volume(pv);
1266}
static double volume(const PVConstLink &pv)

◆ expandAllChildren()

void VP1GeometrySystem::Imp::expandAllChildren ( VolumeHandle * h,
bool isPixel,
bool brl,
bool ecA,
bool ecC )

Definition at line 2478 of file VP1GeometrySystem.cxx.

2478 {
2479
2480 if (h->nChildren()==0) {
2481 if (isPixel and (ecA or ecC)) {
2482 float translation_x, translation_y, translation_z, rotaxis_x, rotaxis_y, rotaxis_z, rotangle_radians;
2483 VP1LinAlgUtils::decodeTransformation( h->getGlobalTransformToVolume(),
2484 translation_x, translation_y, translation_z,
2485 rotaxis_x, rotaxis_y, rotaxis_z, rotangle_radians );
2486 if ((!ecA || !ecC) && ((ecA and (translation_z<0.)) or (ecC and (translation_z>0.) ))) {
2487 h->setState(VP1GeoFlags::ZAPPED);
2488 return;
2489 }
2490 }
2491
2492 // check if you have to select it
2493 std::vector< std::string > selected_volumes = {};
2494 if (brl) {
2495 if (isPixel) {
2496 selected_volumes.push_back("InnerBarrelSingleMod_Sensor");
2497 selected_volumes.push_back("InnerBarrelQuadMod_Sensor");
2498 selected_volumes.push_back("OuterBarrelQuadMod_Sensor");
2499 selected_volumes.push_back("LongeronCoolingTube");
2500 selected_volumes.push_back("InnerPixBarrelSupport_Stave");
2501 selected_volumes.push_back("InnerPixBarrelSupport_Stave1");
2502 selected_volumes.push_back("LongeronCornerBase");
2503 selected_volumes.push_back("LongeronCornerEnd");
2504 selected_volumes.push_back("LongeronTrussWall");
2505 selected_volumes.push_back("LongeronCapBase");
2506 selected_volumes.push_back("LongeronTopCap");
2507
2508 } else {
2509 selected_volumes.push_back("BRLSensorSS");
2510 selected_volumes.push_back("BRLSensorMS");
2511 selected_volumes.push_back("B_HybridPCB");
2512 selected_volumes.push_back("DCDC_PCB");
2513 selected_volumes.push_back("DCDC_Box");
2514 selected_volumes.push_back("Bex_HybridPCB_near");
2515 selected_volumes.push_back("Bex_HybridPCB_far");
2516 }
2517 }
2518 if (ecA or ecC) {
2519 if (isPixel) {
2520 selected_volumes.push_back("InclinedQuadMod_Sensor");
2521 selected_volumes.push_back("InnerRingSingleMod_Sensor");
2522 selected_volumes.push_back("InnerEndcapQuadMod_Sensor");
2523 selected_volumes.push_back("OuterEndcapQuadMod_Sensor");
2524 selected_volumes.push_back("L2HalfRingCoolingPipe");
2525 selected_volumes.push_back("L3HalfRingCoolingPipe");
2526 selected_volumes.push_back("L4endcapcoolingpipe");
2527 selected_volumes.push_back("InclL2HalfShell");
2528 selected_volumes.push_back("InclL2Support");
2529 selected_volumes.push_back("InclL3HalfShell");
2530 selected_volumes.push_back("InclL3Support");
2531 selected_volumes.push_back("InclL4HalfShell");
2532 selected_volumes.push_back("InclL4Support");
2533 selected_volumes.push_back("InnerPixEndcap_CoupledRingSupport");
2534 selected_volumes.push_back("InnerPixEndcap_IntermediateRingSupport");
2535 selected_volumes.push_back("InnerPixEndcap_L1RingSupport");
2536 selected_volumes.push_back("L2HalfRingCarbonFoamInner");
2537 selected_volumes.push_back("L2HalfRingCarbonFoamOuter");
2538 selected_volumes.push_back("L2HalfRingFaceSheet");
2539 selected_volumes.push_back("L3HalfRingCarbonFoamInner");
2540 selected_volumes.push_back("L3HalfRingCarbonFoamOuter");
2541 selected_volumes.push_back("L3HalfRingFaceSheet");
2542 selected_volumes.push_back("L4endcapinnerCarbonFoam");
2543 selected_volumes.push_back("L4endcapouterCarbonFoam");
2544 selected_volumes.push_back("L4endcapFaceSheet");
2545 selected_volumes.push_back("L2HalfShell");
2546 selected_volumes.push_back("L3HalfShell");
2547 selected_volumes.push_back("L4HalfShell");
2548 } else {
2549 selected_volumes.push_back("ECSensor0");
2550 selected_volumes.push_back("ECSensor1");
2551 selected_volumes.push_back("ECSensor2");
2552 selected_volumes.push_back("ECSensor3");
2553 selected_volumes.push_back("ECSensor4");
2554 selected_volumes.push_back("ECSensor5");
2555 selected_volumes.push_back("ECSensorBack0");
2556 selected_volumes.push_back("ECSensorBack1");
2557 selected_volumes.push_back("ECSensorBack2");
2558 selected_volumes.push_back("ECSensorBack3");
2559 selected_volumes.push_back("ECSensorBack4");
2560 selected_volumes.push_back("ECSensorBack5");
2561 }
2562 }
2563
2564 std::string name = h->getName().toStdString();
2565
2566 if (not isPixel and (ecA or ecC)) {
2567 // check servises in the endcap
2568 if (name.starts_with("ECHybrid") or name.starts_with("DCDC_EC"))
2569 return;
2570 }
2571
2572 if (std::find(selected_volumes.begin(), selected_volumes.end(), name) == selected_volumes.end()) {
2573 h->setState(VP1GeoFlags::ZAPPED);
2574 return;
2575 }
2576 return;
2577 } else if (not isPixel and (h->getName().toStdString()=="PetalCore" or
2578 h->getName().toStdString()=="StaveCoreSS" or
2579 h->getName().toStdString() =="StaveCoreMS")) {
2580 return;
2581 }
2582 h->initialiseChildren();
2583
2584 h->setState(VP1GeoFlags::EXPANDED);
2585 VolumeHandle::VolumeHandleListItr it(h->childrenBegin()),itE(h->childrenEnd());
2586 for (;it!=itE;++it) {
2587 expandAllChildren(*it, isPixel, brl, ecA, ecC);
2588 }
2589}
void expandAllChildren(VolumeHandle *, bool isPixel, bool brl, bool ecA, bool ecC)
static void decodeTransformation(const SbMatrix &, float &translation_x, float &translation_y, float &translation_z, float &rotaxis_x, float &rotaxis_y, float &rotaxis_z, float &rotangle_radians)

◆ expandVisibleVolumesRecursively()

void VP1GeometrySystem::Imp::expandVisibleVolumesRecursively ( VolumeHandle * handle,
const QRegExp & selregexp,
bool bymatname )

Definition at line 2095 of file VP1GeometrySystem.cxx.

2096{
2097 if (handle->state()==VP1GeoFlags::ZAPPED)
2098 return;
2099 if (handle->state()==VP1GeoFlags::CONTRACTED) {
2100 //See if we match (and have children) - if so, update state.
2101 if (handle->nChildren()>0
2102 && selregexp.exactMatch(bymatname?QString(handle->geoMaterial()->getName().c_str()):handle->getName())) {
2104 }
2105 return;
2106 }
2107 //Must be expanded: Let us call on any (initialised) children instead.
2108 if (handle->nChildren()==0||!handle->childrenAreInitialised())
2109 return;
2111 for(;it!=itE;++it)
2112 expandVisibleVolumesRecursively(*it,selregexp,bymatname);
2113}
void expandVisibleVolumesRecursively(VolumeHandle *, const QRegExp &, bool bymatname)
const GeoMaterial * geoMaterial() const

◆ getClosestCSCOrTGCEdgeDirections()

std::pair< SbVec3f, SbVec3f > VP1GeometrySystem::Imp::getClosestCSCOrTGCEdgeDirections ( const SbVec3f & cameraDirection,
VolumeHandle * chamberhandle )

Definition at line 1957 of file VP1GeometrySystem.cxx.

1959{
1960 // It turns out that the correct chamber directions for CSC/TGC chambers is the y and z axes.
1961 std::vector<SbVec3f> directions;
1962 directions.push_back(SbVec3f(0.0f,1.0f,0.0f));
1963 directions.push_back(SbVec3f(0.0f,-1.0f,0.0f));
1964 directions.push_back(SbVec3f(0.0f,0.0f,1.0f));
1965 directions.push_back(SbVec3f(0.0f,0.0f,-1.0f));
1966
1967 directions.push_back(SbVec3f(1.0f,0.0f,0.0f));
1968 directions.push_back(SbVec3f(-1.0f,0.0f,0.0f));
1969
1970 //Get local->global transformation for chamber:
1971 SbVec3f translation, scale;
1972 SbRotation rotation, scalerotation;
1973 chamberhandle->getGlobalTransformToVolume().getTransform(translation,rotation,scale,scalerotation);
1974
1975 //Put directions into global coordinates:
1976 for (unsigned i = 0; i<directions.size();++i)
1977 rotation.multVec(directions[i],directions[i]);
1978
1979 //Find the one closest to the camera:
1980 SbVec3f chamberDir(-cameraDirection);
1981 float smallestcosangle(1.1);
1982 for (unsigned i = 0; i<directions.size();++i) {
1983 if (directions.at(i).dot(cameraDirection)<smallestcosangle) {
1984 smallestcosangle = directions.at(i).dot(cameraDirection);
1985 chamberDir = directions.at(i);
1986 }
1987 }
1988
1989 //cameraUpDirection should always (0,1,0) transformed to global
1990 //coordinates:
1991 SbVec3f chamberUp;
1992 float x,y,z;
1993 chamberDir.getValue(x,y,z);
1994 if (x!=0.0f) {
1995 rotation.multVec(SbVec3f(0.0f,1.0f,0.0f),chamberUp);
1996 } else {
1997 rotation.multVec(SbVec3f(1.0f,0.0f,0.0f),chamberUp);
1998 }
1999
2000 //Done:
2001 return std::pair<SbVec3f,SbVec3f>(chamberDir,chamberUp);
2002}
#define y
#define x
#define z
const SbMatrix & getGlobalTransformToVolume() const

◆ getClosestMuonDriftTubeDirections()

std::pair< SbVec3f, SbVec3f > VP1GeometrySystem::Imp::getClosestMuonDriftTubeDirections ( const SbVec3f & cameraDirection,
const SbVec3f & cameraUpDirection,
VolumeHandle * chamberhandle )

Definition at line 1906 of file VP1GeometrySystem.cxx.

1909{
1910 //We assume chamberhandle is to an MDT station (barrel or endcap).
1911 SbVec3f closesttubedir(cameraDirection);
1912 SbVec3f closesttubeupvec(cameraUpDirection);
1913 float smallestcosangle(1.1);
1914
1915 //Barrel/Endcap MDT. Expand two levels and then check the individual tubes.
1916 chamberhandle->initialiseChildren();
1917 VolumeHandle::VolumeHandleListItr itch(chamberhandle->childrenBegin()), itchE(chamberhandle->childrenEnd());
1918 for (;itch!=itchE;++itch) {
1919 //Any daughter with the name "Ded..." should be ignored
1920 std::string name1 = (*itch)->getNameStdString();
1921 if (name1.size()>2&&name1[0]=='D'&&name1[1]=='e'&&name1[2]=='d')
1922 continue;
1923
1924 (*itch)->initialiseChildren();
1925 VolumeHandle::VolumeHandleListItr itch2((*itch)->childrenBegin()), itch2E((*itch)->childrenEnd());
1926 //Various variables needed to deal with each tube:
1927 const SbVec3f unitz(0.0f,0.0f,1.0f);
1928 const SbVec3f unity(0.0f,1.0f,0.0f);
1929 SbVec3f tubeglob;
1930 SbVec3f translation, scale;
1931 SbRotation rotation, scalerotation;
1932
1933 for (;itch2!=itch2E;++itch2) {
1934 if ((*itch2)->getNameStdString()=="MDTDriftWall") {
1935 //OK, we got the handle of a tube (wall). Lets find its direction!
1936 //->We assume that the tube, in its local coordinate system, is aligned with the z axis.
1937 //Get global rotation of tube:
1938 (*itch2)->getGlobalTransformToVolume().getTransform(translation,rotation,scale,scalerotation);
1939 rotation.multVec (unitz, tubeglob);
1940 if (tubeglob.dot(cameraDirection)<smallestcosangle) {
1941 smallestcosangle = tubeglob.dot(cameraDirection);
1942 closesttubedir = tubeglob;
1943 rotation.multVec(unity, closesttubeupvec);
1944 }
1945 if (tubeglob.dot(-cameraDirection)<smallestcosangle) {
1946 smallestcosangle = tubeglob.dot(-cameraDirection);
1947 closesttubedir = -tubeglob;
1948 rotation.multVec(unity, closesttubeupvec);
1949 }
1950 }
1951 }
1952 }
1953 return std::pair<SbVec3f,SbVec3f>(closesttubedir,closesttubeupvec);
1954}
void initialiseChildren()

◆ iconifyVisibleVolumesRecursively()

void VP1GeometrySystem::Imp::iconifyVisibleVolumesRecursively ( VolumeHandle * handle,
const QRegExp & selregexp,
bool bymatname )

Definition at line 2116 of file VP1GeometrySystem.cxx.

2117{
2118 if (handle->state()==VP1GeoFlags::ZAPPED)
2119 return;
2120
2121 if (handle->state()==VP1GeoFlags::CONTRACTED) {
2122 //See if we match -- if so, update state.
2123 if( selregexp.exactMatch(bymatname?QString(handle->geoMaterial()->getName().c_str()):handle->getName())) {
2125 }
2126 return;
2127 }
2128 //Must be expanded: Let us call on any (initialised) children instead.
2129 if (handle->nChildren()==0||!handle->childrenAreInitialised())
2130 return;
2132 for(;it!=itE;++it)
2133 iconifyVisibleVolumesRecursively(*it,selregexp,bymatname);
2134}
void iconifyVisibleVolumesRecursively(VolumeHandle *, const QRegExp &, bool bymatname)

◆ inclusiveMass()

double VP1GeometrySystem::Imp::inclusiveMass ( const PVConstLink & pv)
static

Definition at line 1278 of file VP1GeometrySystem.cxx.

1278 {
1279
1280 const GeoLogVol* lv = pv->getLogVol();
1281 const GeoMaterial *material = lv->getMaterial();
1282 double density = material->getDensity();
1283
1284 double mass = exclusiveMass(pv);
1285
1286 GeoVolumeCursor av(pv);
1287 while (!av.atEnd()) {
1288 mass += inclusiveMass(av.getVolume());
1289 mass -= volume(av.getVolume())*density;
1290 av.next();
1291 }
1292
1293 return mass;
1294}
static double inclusiveMass(const PVConstLink &pv)
static double exclusiveMass(const PVConstLink &pv)

◆ showITkPixelModules()

void VP1GeometrySystem::Imp::showITkPixelModules ( VolumeHandle * h,
bool brl,
bool ecA,
bool ecC )

Definition at line 2591 of file VP1GeometrySystem.cxx.

2592{
2593 VP1Msg::messageDebug("VP1GeometrySystem::Imp::showITkPixelModules()");
2594 h->initialiseChildren();
2595 VolumeHandle::VolumeHandleListItr it(h->childrenBegin()),itE(h->childrenEnd());
2596 // std::cout << "Processing volume with name = " << h->getName().toStdString() << " and " << h->nChildren() << " children..." << std::endl;
2597 for (;it!=itE;++it) {
2598 expandAllChildren(*it, true, brl, ecA, ecC);
2599 }
2600}

◆ showITkStripModules()

void VP1GeometrySystem::Imp::showITkStripModules ( VolumeHandle * h,
bool brl,
bool ecA,
bool ecC )

Definition at line 2603 of file VP1GeometrySystem.cxx.

2604{
2605 VP1Msg::messageDebug("VP1GeometrySystem::Imp::showITkStripModules()");
2606 h->initialiseChildren();
2607 VolumeHandle::VolumeHandleListItr it(h->childrenBegin()),itE(h->childrenEnd());
2608 // std::cout << "Processing volume with name = " << h->getName().toStdString() << " and " << h->nChildren() << " children..." << std::endl;
2609 for (;it!=itE;++it) {
2610 if (brl and (*it)->hasName("ITkStrip_Barrel")) {
2611 expandAllChildren(*it, false, brl, ecA, ecC);
2612 }
2613 else if (ecA and (*it)->hasName("ITkStrip_ForwardPlus")) {
2614 expandAllChildren(*it, false, brl, ecA, ecC);
2615 }
2616 else if (ecC and (*it)->hasName("ITkStrip_ForwardMinus")) {
2617 expandAllChildren(*it, false, brl, ecA, ecC);
2618 } else
2619 (*it)->setState(VP1GeoFlags::ZAPPED);
2620 }
2621}

◆ showPixelModules()

void VP1GeometrySystem::Imp::showPixelModules ( VolumeHandle * h)

Definition at line 2443 of file VP1GeometrySystem.cxx.

2444{
2445 VP1Msg::messageDebug("VP1GeometrySystem::Imp::showPixelModules()");
2446 h->initialiseChildren();
2447 VolumeHandle::VolumeHandleListItr it(h->childrenBegin()),itE(h->childrenEnd());
2448 for (;it!=itE;++it) {
2449 if ((*it)->hasName("moduleLog")) {
2450 (*it)->setState(VP1GeoFlags::ZAPPED);
2451 (*it)->contractDaughtersRecursively();
2452 (*it)->initialiseChildren();
2453 VolumeHandle::VolumeHandleListItr itMod((*it)->childrenBegin()),itModE((*it)->childrenEnd());
2454 for (;itMod!=itModE;++itMod) {
2455 if ((*itMod)->getName().startsWith("si"))
2456 (*itMod)->setState(VP1GeoFlags::CONTRACTED);
2457 else
2458 (*itMod)->setState(VP1GeoFlags::ZAPPED);
2459 }
2460 (*it)->setState(VP1GeoFlags::EXPANDED);
2461 continue;
2462 }
2463 if ((*it)->hasName("pigtailLog")||(*it)->hasName("omegaLog")) {
2464 (*it)->setState(VP1GeoFlags::ZAPPED);
2465 (*it)->contractDaughtersRecursively();
2466 continue;
2467 }
2468 if ((*it)->nChildren()<1) {
2469 (*it)->setState(VP1GeoFlags::ZAPPED);
2470 continue;
2471 }
2472 (*it)->setState(VP1GeoFlags::ZAPPED);
2473 showPixelModules(*it);
2474 (*it)->setState(VP1GeoFlags::EXPANDED);
2475 }
2476}
void showPixelModules(VolumeHandle *)

◆ showSCTBarrelModules()

void VP1GeometrySystem::Imp::showSCTBarrelModules ( VolumeHandle * h)

Definition at line 2624 of file VP1GeometrySystem.cxx.

2625{
2626 VP1Msg::messageDebug("VP1GeometrySystem::Imp::showSCTBarrelModules()");
2627 h->initialiseChildren();
2628 VolumeHandle::VolumeHandleListItr it(h->childrenBegin()),itE(h->childrenEnd());
2629 for (;it!=itE;++it) {
2630 if ((*it)->getName().startsWith("Layer")) {
2631 (*it)->setState(VP1GeoFlags::ZAPPED);
2632 (*it)->initialiseChildren();
2633 VolumeHandle::VolumeHandleListItr itLay((*it)->childrenBegin()),itLayE((*it)->childrenEnd());
2634 for (;itLay!=itLayE;++itLay) {
2635 if ((*itLay)->getName().endsWith("Active")&&(*itLay)->getName().startsWith("Layer")) {
2636 (*itLay)->setState(VP1GeoFlags::ZAPPED);
2637 (*itLay)->initialiseChildren();
2638 VolumeHandle::VolumeHandleListItr itActLay((*itLay)->childrenBegin()),itActLayE((*itLay)->childrenEnd());
2639 for (;itActLay!=itActLayE;++itActLay) {
2640 if ((*itActLay)->getName().startsWith("Ski")) {
2641 (*itActLay)->setState(VP1GeoFlags::ZAPPED);
2642 (*itActLay)->initialiseChildren();
2643 VolumeHandle::VolumeHandleListItr itSki((*itActLay)->childrenBegin()),itSkiE((*itActLay)->childrenEnd());
2644 for (;itSki!=itSkiE;++itSki) {
2645 //Ends with "Envelope": open, otherwise zap. Of those, zap all without "Sensor" in the name.
2646 if ((*itSki)->hasName("Module")) {
2647 //Open and zap those without "Sensor" in the name:
2648 (*itSki)->setState(VP1GeoFlags::ZAPPED);
2649 (*itSki)->initialiseChildren();
2650 VolumeHandle::VolumeHandleListItr itMod((*itSki)->childrenBegin()),itModE((*itSki)->childrenEnd());
2651 for (;itMod!=itModE;++itMod) {
2652 if ((*itMod)->getName().contains("Envelope")) {
2653 (*itMod)->setState(VP1GeoFlags::ZAPPED);
2654 (*itMod)->initialiseChildren();
2655 VolumeHandle::VolumeHandleListItr itEnv((*itMod)->childrenBegin()),itEnvE((*itMod)->childrenEnd());
2656 for(;itEnv!=itEnvE;++itEnv) {
2657 if ((*itEnv)->getName().contains("Sensor"))
2658 (*itEnv)->reset();
2659 else
2660 (*itEnv)->setState(VP1GeoFlags::ZAPPED);
2661 }
2662 (*itMod)->setState(VP1GeoFlags::EXPANDED);
2663 } else {
2664 (*itMod)->setState(VP1GeoFlags::ZAPPED);
2665 }
2666 }
2667 (*itSki)->setState(VP1GeoFlags::EXPANDED);
2668 } else {
2669 (*itSki)->setState(VP1GeoFlags::ZAPPED);
2670 }//end if-elsi "Envelope"
2671 }//endfor itSki
2672 (*itActLay)->setState(VP1GeoFlags::EXPANDED);
2673 } else {
2674 (*itActLay)->setState(VP1GeoFlags::ZAPPED);
2675 }//end if-else "Ski"
2676 }
2677 (*itLay)->setState(VP1GeoFlags::EXPANDED);
2678 } else {
2679 (*itLay)->setState(VP1GeoFlags::ZAPPED);
2680 (*itLay)->contractDaughtersRecursively();
2681 }
2682 }
2683 (*it)->setState(VP1GeoFlags::EXPANDED);
2684 } else {
2685 (*it)->setState(VP1GeoFlags::ZAPPED);
2686 (*it)->contractDaughtersRecursively();
2687 }
2688 }
2689}

◆ showSCTEndcapModules()

void VP1GeometrySystem::Imp::showSCTEndcapModules ( VolumeHandle * h)

Definition at line 2692 of file VP1GeometrySystem.cxx.

2693{
2694 VP1Msg::messageDebug("VP1GeometrySystem::Imp::showSCTEndcapModules()");
2695 h->initialiseChildren();
2696 VolumeHandle::VolumeHandleListItr it(h->childrenBegin()),itE(h->childrenEnd());
2697 for (;it!=itE;++it) {
2698 if ((*it)->getName().startsWith("Wheel")) {
2699 (*it)->setState(VP1GeoFlags::ZAPPED);
2700 (*it)->initialiseChildren();
2701 VolumeHandle::VolumeHandleListItr itWhl((*it)->childrenBegin()),itWhlE((*it)->childrenEnd());
2702 for (;itWhl!=itWhlE;++itWhl) {
2703 if ((*itWhl)->getName().startsWith("Ring")) {
2704 (*itWhl)->setState(VP1GeoFlags::ZAPPED);
2705 (*itWhl)->initialiseChildren();
2706 VolumeHandle::VolumeHandleListItr itRng((*itWhl)->childrenBegin()),itRngE((*itWhl)->childrenEnd());
2707 for (;itRng!=itRngE;++itRng) {
2708 if ((*itRng)->getName().startsWith("FwdModule")) {
2709 (*itRng)->setState(VP1GeoFlags::ZAPPED);
2710 (*itRng)->initialiseChildren();
2711 VolumeHandle::VolumeHandleListItr itMod((*itRng)->childrenBegin()),itModE((*itRng)->childrenEnd());
2712 for(;itMod!=itModE;++itMod) {
2713 if ((*itMod)->getName().startsWith("ECSensor")) {
2714 (*itMod)->reset();
2715 } else {
2716 (*itMod)->setState(VP1GeoFlags::ZAPPED);
2717 }
2718 }
2719 (*itRng)->setState(VP1GeoFlags::EXPANDED);
2720 } else {
2721 (*itRng)->setState(VP1GeoFlags::ZAPPED);
2722 }
2723 }
2724 (*itWhl)->setState(VP1GeoFlags::EXPANDED);
2725 } else {
2726 (*itWhl)->setState(VP1GeoFlags::ZAPPED);
2727 (*itWhl)->contractDaughtersRecursively();
2728 }
2729 }
2730 (*it)->setState(VP1GeoFlags::EXPANDED);
2731 } else {
2732 (*it)->setState(VP1GeoFlags::ZAPPED);
2733 (*it)->contractDaughtersRecursively();
2734 }
2735 }
2736}

◆ stationInfo()

QStringList VP1GeometrySystem::Imp::stationInfo ( const MuonGM::MuonStation * station)

Definition at line 2233 of file VP1GeometrySystem.cxx.

2234{
2235 QStringList l;
2236 if (!station) {
2237 l <<"Null ptr!";
2238 return l;
2239 }
2240 l << "Name: "+str(station->getStationName().c_str());
2241 l << "(Eta,Phi) index: ("+str(station->getEtaIndex())+", "+str(station->getPhiIndex())+")";
2242 return l;
2243}
int getEtaIndex() const
a la AMDB
int getPhiIndex() const
a la AMDB
const std::string & getStationName() const
like BMS5, T1F1, CSL1
l
Printing final latex table to .tex output file.

◆ updatePV2MuonStationMap()

void VP1GeometrySystem::Imp::updatePV2MuonStationMap ( const MuonGM::MuonReadoutElement * elem)

Definition at line 2175 of file VP1GeometrySystem.cxx.

2176{
2177 if (!elem)
2178 return;
2179 GeoPVConstLink pvlink = elem->getMaterialGeom()->getParent();
2180 const MuonGM::MuonStation * station = elem->parentMuonStation();
2181 if (!station) {
2182 theclass->message("WARNING: Ignored null station pointer");
2183 return;
2184 }
2185 pv2MuonStation[pvlink] = station;
2186}

◆ updateTouchedMuonChamber()

void VP1GeometrySystem::Imp::updateTouchedMuonChamber ( VolumeHandle * chamberhandle)

Definition at line 1621 of file VP1GeometrySystem.cxx.

1622{
1623 std::string stationname = chamberhandle->getNameStdString();
1624 if (stationname.empty()) {
1625 theclass->message("Warning: Asked to handle muon chamber (station) with empty name!");
1626 return;
1627 }
1628 //NB: For efficiency we make sure that mothers are ZAPPED while
1629 //changing state of their children.
1630
1631 //options:
1632
1633 VP1GeoFlags::MuonChamberAdaptionStyleFlags f(controller->muonChamberAdaptionStyle());
1634 bool option_openmdtchambers = f & VP1GeoFlags::OpenMDTChambers;
1635 bool option_hidetubes = f & VP1GeoFlags::HideMDTTubes;
1636 bool option_hiderpcvolumes = f & VP1GeoFlags::HideRPCVolumes;
1637 bool option_opencscchambers = f & VP1GeoFlags::OpenCSCChambers;
1638 bool option_opentgcchambers = f & VP1GeoFlags::OpenTGCChambers;
1639
1640 char firstletter = stationname[0];
1641 std::string name1,name2;
1642 if (firstletter=='E' || firstletter =='B') {
1643 //Barrel/Endcap MDT.
1644 // If we are to open it, we expand two levels.
1645 // -> and possibly zap the tubes/rpc volumes also according to options.
1646 if (option_openmdtchambers) {
1647 chamberhandle->setState(VP1GeoFlags::ZAPPED);
1648 chamberhandle->contractDaughtersRecursively();
1649 chamberhandle->initialiseChildren();
1650 VolumeHandle::VolumeHandleListItr itch(chamberhandle->childrenBegin()), itchE(chamberhandle->childrenEnd());
1651 for (;itch!=itchE;++itch) {
1652 //Any daughter with the name "Ded..." should be zapped,
1653 //otherwise we loop over the children to zap tubes/rpc vols.
1654 (*itch)->setState(VP1GeoFlags::ZAPPED);
1655 name1 = (*itch)->getNameStdString();
1656 if (name1.size()>2&&name1[0]=='D'&&name1[1]=='e'&&name1[2]=='d')
1657 continue;
1658
1659 (*itch)->initialiseChildren();
1660 VolumeHandle::VolumeHandleListItr itch2((*itch)->childrenBegin()), itch2E((*itch)->childrenEnd());
1661 for (;itch2!=itch2E;++itch2) {
1662 //Any of these daughters with the name
1663 //"MDTDriftWall"/"Rpc..."/"RPC..."/"Ded..." should be
1664 //zapped (according to options). Others should be contracted.
1665 name2 = (*itch2)->getNameStdString();
1666 bool zap = false;
1667 if (option_hidetubes&&name2=="MDTDriftWall") {
1668 zap = true;
1669 } else if (name2.size()>2&&name2[0]=='R'&&((name2[1]=='p'&&name2[2]=='c')||(name2[1]=='P'&&name2[2]=='C'))) {
1670 zap = (option_hiderpcvolumes||name2!="Rpclayer");
1671 } else if (name2.size()>2&&name2[0]=='D'&&name2[1]=='e'&&name2[2]=='d') {
1672 zap = true;
1673 }
1674 (*itch2)->setState(zap?VP1GeoFlags::ZAPPED:VP1GeoFlags::CONTRACTED);
1675 }
1676 (*itch)->setState(VP1GeoFlags::EXPANDED);
1677 }
1678 chamberhandle->setState(VP1GeoFlags::EXPANDED);
1679 } else {
1680 chamberhandle->reset();
1681 }
1682 } else {
1683 if (firstletter=='C') {
1684 //CSC: We either contract completely or expand once + zap "CscArCO2" + zap spacers
1685 chamberhandle->setState(VP1GeoFlags::ZAPPED);
1686 chamberhandle->contractDaughtersRecursively();//To put into default state
1687 if (option_opencscchambers) {
1688 //We must zap spacers, and otherwise expand down three levels and zap all "CscArCO2":
1689 chamberhandle->initialiseChildren();
1690 VolumeHandle::VolumeHandleListItr itch(chamberhandle->childrenBegin()), itchE(chamberhandle->childrenEnd());
1691 for (;itch!=itchE;++itch) {
1692 if ((*itch)->hasName("CSCspacer")) {
1693 (*itch)->setState(VP1GeoFlags::ZAPPED);
1694 continue;
1695 }
1696 if ((*itch)->nChildren()<1)
1697 continue;
1698 (*itch)->initialiseChildren();
1699 VolumeHandle::VolumeHandleListItr itch2((*itch)->childrenBegin()), itch2E((*itch)->childrenEnd());
1700 for (;itch2!=itch2E;++itch2) {
1701 if ((*itch2)->nChildren()<1)
1702 continue;
1703 (*itch2)->initialiseChildren();
1704 VolumeHandle::VolumeHandleListItr itch3((*itch2)->childrenBegin()), itch3E((*itch2)->childrenEnd());
1705 for (;itch3!=itch3E;++itch3) {
1706 if ((*itch3)->getNameStdString()=="CscArCO2")
1707 (*itch3)->setState(VP1GeoFlags::ZAPPED);
1708 }
1709 (*itch2)->setState(VP1GeoFlags::EXPANDED);
1710 }
1711 (*itch)->setState(VP1GeoFlags::EXPANDED);
1712 }
1713 chamberhandle->setState(VP1GeoFlags::EXPANDED);
1714 } else {
1715 chamberhandle->setState(VP1GeoFlags::CONTRACTED);
1716 }
1717 } else {
1718 //TGC: If 'open' we expand two levels and zap all gas volumes.
1719 chamberhandle->setState(VP1GeoFlags::ZAPPED);
1720 chamberhandle->contractDaughtersRecursively();//To put into default state
1721 if (option_opentgcchambers) {
1722 //Expand once more and then zap daughters called "muo::TGCGas"
1723 chamberhandle->initialiseChildren();
1724 VolumeHandle::VolumeHandleListItr itch(chamberhandle->childrenBegin()), itchE(chamberhandle->childrenEnd());
1725 for (;itch!=itchE;++itch) {
1726 if ((*itch)->nChildren()<1)
1727 continue;
1728 (*itch)->initialiseChildren();
1729 VolumeHandle::VolumeHandleListItr itch2((*itch)->childrenBegin()), itch2E((*itch)->childrenEnd());
1730 for (;itch2!=itch2E;++itch2) {
1731 if ((*itch2)->getNameStdString()=="muo::TGCGas")
1732 (*itch2)->setState(VP1GeoFlags::ZAPPED);
1733 }
1734 (*itch)->setState(VP1GeoFlags::EXPANDED);
1735 }
1736 chamberhandle->setState(VP1GeoFlags::EXPANDED);
1737 } else {
1738 chamberhandle->setState(VP1GeoFlags::CONTRACTED);
1739 }
1740 }
1741 }
1742 chamberhandle->setMuonChamberDirty(false);
1743}
std::string getNameStdString() const
void contractDaughtersRecursively()
void setMuonChamberDirty(bool)

◆ volume()

double VP1GeometrySystem::Imp::volume ( const PVConstLink & pv)
static

Definition at line 1270 of file VP1GeometrySystem.cxx.

1270 {
1271 const GeoLogVol * lv = pv->getLogVol();
1272 const GeoShape *shape = lv->getShape();
1273 return shape->volume();
1274}

Member Data Documentation

◆ chamberT0s

QList<const std::map<GeoPVConstLink, float>*> VP1GeometrySystem::Imp::chamberT0s

Definition at line 299 of file VP1GeometrySystem.cxx.

◆ controller

GeoSysController* VP1GeometrySystem::Imp::controller

Definition at line 244 of file VP1GeometrySystem.cxx.

◆ detVisAttributes

DetVisAttributes* VP1GeometrySystem::Imp::detVisAttributes

Definition at line 233 of file VP1GeometrySystem.cxx.

◆ initialSubSystemsTurnedOn

VP1GeoFlags::SubSystemFlags VP1GeometrySystem::Imp::initialSubSystemsTurnedOn

Definition at line 242 of file VP1GeometrySystem.cxx.

◆ kbEvent

const SoKeyboardEvent* VP1GeometrySystem::Imp::kbEvent

Definition at line 255 of file VP1GeometrySystem.cxx.

◆ last_appropriatemdtprojections

int VP1GeometrySystem::Imp::last_appropriatemdtprojections

Definition at line 268 of file VP1GeometrySystem.cxx.

◆ m_textSep

SoSeparator* VP1GeometrySystem::Imp::m_textSep

Separator used to hold all visible labels.

Definition at line 274 of file VP1GeometrySystem.cxx.

◆ matVisAttributes

MatVisAttributes* VP1GeometrySystem::Imp::matVisAttributes

Definition at line 234 of file VP1GeometrySystem.cxx.

◆ muonchambers_pv2handles

std::map<PVConstLink,VolumeHandle*> VP1GeometrySystem::Imp::muonchambers_pv2handles

Definition at line 258 of file VP1GeometrySystem.cxx.

◆ phisectormanager

PhiSectorManager* VP1GeometrySystem::Imp::phisectormanager

Definition at line 245 of file VP1GeometrySystem.cxx.

◆ previousAlignedChamberHandle

VolumeHandle* VP1GeometrySystem::Imp::previousAlignedChamberHandle

Definition at line 265 of file VP1GeometrySystem.cxx.

◆ pv2MuonStation

std::map<GeoPVConstLink,const MuonGM::MuonStation*> VP1GeometrySystem::Imp::pv2MuonStation

Definition at line 277 of file VP1GeometrySystem.cxx.

◆ pv2MuonStationInit

bool VP1GeometrySystem::Imp::pv2MuonStationInit

Definition at line 278 of file VP1GeometrySystem.cxx.

◆ restoredTopvolstates

QMap<quint32,QByteArray> VP1GeometrySystem::Imp::restoredTopvolstates

Definition at line 291 of file VP1GeometrySystem.cxx.

◆ sceneroot

SoSeparator* VP1GeometrySystem::Imp::sceneroot

Definition at line 112 of file VP1GeometrySystem.cxx.

◆ sender2ChamberList

std::map<QObject*,std::set<GeoPVConstLink> > VP1GeometrySystem::Imp::sender2ChamberList

Definition at line 260 of file VP1GeometrySystem.cxx.

◆ sonodesep2volhandle

std::map<SoSeparator*,VolumeHandle*> VP1GeometrySystem::Imp::sonodesep2volhandle

Definition at line 114 of file VP1GeometrySystem.cxx.

◆ subsysInfoList

QList<SubSystemInfo*> VP1GeometrySystem::Imp::subsysInfoList

Definition at line 225 of file VP1GeometrySystem.cxx.

◆ theclass

VP1GeometrySystem* VP1GeometrySystem::Imp::theclass

Definition at line 111 of file VP1GeometrySystem.cxx.

◆ volumetreemodel

VolumeTreeModel* VP1GeometrySystem::Imp::volumetreemodel

Definition at line 246 of file VP1GeometrySystem.cxx.

◆ volVisAttributes

VolVisAttributes* VP1GeometrySystem::Imp::volVisAttributes

Definition at line 235 of file VP1GeometrySystem.cxx.


The documentation for this class was generated from the following file: