#include <CheckOverlap.h>
Public Member Functions | |
CheckOverlap (edm::ParameterSet const &p) | |
~CheckOverlap () | |
Private Member Functions | |
void | checkHierarchyLeafPVLV (G4LogicalVolume *lv, unsigned int leafDepth) |
void | checkPV (G4VPhysicalVolume *pv, unsigned int leafDepth) |
void | dumpLV (G4LogicalVolume *lv, std::string str) |
G4VPhysicalVolume * | getTopPV () |
void | update (const BeginOfRun *run) |
This routine will be called when the appropriate signal arrives. | |
Private Attributes | |
std::vector< std::string > | nodeNames |
int | nPoints |
std::vector< G4LogicalVolume * > | topLV |
Definition at line 19 of file CheckOverlap.h.
CheckOverlap::CheckOverlap | ( | edm::ParameterSet const & | p | ) |
Definition at line 21 of file CheckOverlap.cc.
References edm::ParameterSet::getUntrackedParameter(), nodeNames, and nPoints.
: topLV(0) { std::vector<std::string> defNames; nodeNames = p.getUntrackedParameter<std::vector<std::string> >("NodeNames", defNames); nPoints = p.getUntrackedParameter<int>("Resolution", 1000); edm::LogInfo("G4cout") << "CheckOverlap:: initialised with " << nodeNames.size() << " Node Names and Resolution " << nPoints << " the names are:"; for (unsigned int ii=0; ii<nodeNames.size(); ii++) edm::LogInfo("G4cout") << "CheckOverlap:: Node[" << ii << "] : " << nodeNames[ii]; }
CheckOverlap::~CheckOverlap | ( | ) |
Definition at line 32 of file CheckOverlap.cc.
{}
void CheckOverlap::checkHierarchyLeafPVLV | ( | G4LogicalVolume * | lv, |
unsigned int | leafDepth | ||
) | [private] |
Definition at line 66 of file CheckOverlap.cc.
References checkPV().
Referenced by update().
{ //----- Get LV daughters from list of PV daughters mmlvpv lvpvDaughters; std::set< G4LogicalVolume * > lvDaughters; int NoDaughters = lv->GetNoDaughters(); while ((NoDaughters--)>0) { G4VPhysicalVolume * pvD = lv->GetDaughter(NoDaughters); lvpvDaughters.insert(mmlvpv::value_type(pvD->GetLogicalVolume(), pvD)); lvDaughters.insert(pvD->GetLogicalVolume()); } std::set< G4LogicalVolume * >::const_iterator scite; mmlvpv::const_iterator mmcite; //----- Check daughters of LV for (scite = lvDaughters.begin(); scite != lvDaughters.end(); scite++) { std::pair< mmlvpv::iterator, mmlvpv::iterator > mmER = lvpvDaughters.equal_range(*scite); //----- Check daughters PV of this LV for (mmcite = mmER.first ; mmcite != mmER.second; mmcite++) checkPV((*mmcite).second, leafDepth+1); //----- Check daughters LV checkHierarchyLeafPVLV(*scite, leafDepth+1); } }
void CheckOverlap::checkPV | ( | G4VPhysicalVolume * | pv, |
unsigned int | leafDepth | ||
) | [private] |
Definition at line 93 of file CheckOverlap.cc.
References dumpLV(), nPoints, and convertSQLiteXML::ok.
Referenced by checkHierarchyLeafPVLV().
{ //----- PV info #ifndef G4V7 std::string mother = "World"; if (pv->GetMotherLogical()) mother = pv->GetMotherLogical()->GetName(); if (!pv->IsReplicated()) { G4PVPlacement* pvplace = dynamic_cast<G4PVPlacement* >(pv); G4bool ok = pvplace->CheckOverlaps(nPoints); edm::LogInfo("G4cout") << "Placed PV " << pvplace->GetName() << " Number " << pvplace->GetCopyNo() << " in mother " << mother << " at depth " << leafDepth << " Status " << ok; if (ok) { if(pv->GetRotation() == 0) { edm::LogInfo("G4cout") << "Translation " << pv->GetTranslation() << " and with no rotation"; } else { edm::LogInfo("G4cout") << "Translation " << pv->GetTranslation() << " and with rotation "<< *(pv->GetRotation()); } G4LogicalVolume* lv = pv->GetLogicalVolume(); dumpLV(lv, "Self"); if (pv->GetMotherLogical()) { lv = pv->GetMotherLogical(); dumpLV (lv, "Mother"); } } } else { if (pv->GetParameterisation() != 0) { G4PVParameterised* pvparam = dynamic_cast<G4PVParameterised* >(pv); G4bool ok = pvparam->CheckOverlaps(nPoints); edm::LogInfo("G4cout") << "Parametrized PV " << pvparam->GetName() << " in mother " << mother << " at depth " << leafDepth << " Status " << ok; } } #endif }
void CheckOverlap::dumpLV | ( | G4LogicalVolume * | lv, |
std::string | str | ||
) | [private] |
Definition at line 138 of file CheckOverlap.cc.
Referenced by checkPV().
{ edm::LogInfo("G4cout") << "Dump of " << str << " Logical Volume " << lv->GetName() << " Solid: " << lv->GetSolid()->GetName() << " Material: " << lv->GetMaterial()->GetName(); edm::LogInfo("G4cout") << *(lv->GetSolid()); }
G4VPhysicalVolume * CheckOverlap::getTopPV | ( | ) | [private] |
Definition at line 133 of file CheckOverlap.cc.
Referenced by update().
{
return G4TransportationManager::GetTransportationManager()
->GetNavigatorForTracking()->GetWorldVolume();
}
void CheckOverlap::update | ( | const BeginOfRun * | ) | [private, virtual] |
This routine will be called when the appropriate signal arrives.
Implements Observer< const BeginOfRun * >.
Definition at line 34 of file CheckOverlap.cc.
References checkHierarchyLeafPVLV(), getTopPV(), i, nodeNames, and topLV.
{ if (nodeNames.size() > 0) { const G4LogicalVolumeStore * lvs = G4LogicalVolumeStore::GetInstance(); std::vector<G4LogicalVolume *>::const_iterator lvcite; int i = 0; for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) { for (unsigned int ii=0; ii<nodeNames.size(); ii++) { if ((*lvcite)->GetName() == (G4String)(nodeNames[ii])) { topLV.push_back((*lvcite)); break; } } edm::LogInfo("G4cout") << "Name of node " << (++i) << " : " << (*lvcite)->GetName(); if (topLV.size() == nodeNames.size()) break; } } else { G4VPhysicalVolume * theTopPV = getTopPV(); topLV.push_back(theTopPV->GetLogicalVolume()); } if (topLV.size() == 0) { edm::LogInfo("G4cout") << "No Top LV Found"; } else { for (unsigned int ii=0; ii<topLV.size(); ii++) { edm::LogInfo("G4cout") << "Top LV Name " << topLV[ii]->GetName(); checkHierarchyLeafPVLV(topLV[ii], 0); } } }
std::vector<std::string> CheckOverlap::nodeNames [private] |
Definition at line 37 of file CheckOverlap.h.
Referenced by CheckOverlap(), and update().
int CheckOverlap::nPoints [private] |
Definition at line 38 of file CheckOverlap.h.
Referenced by CheckOverlap(), and checkPV().
std::vector<G4LogicalVolume*> CheckOverlap::topLV [private] |
Definition at line 39 of file CheckOverlap.h.
Referenced by update().