ATLAS Offline Software
Loading...
Searching...
No Matches
PhiSectorManager Class Reference

#include <PhiSectorManager.h>

Inheritance diagram for PhiSectorManager:
Collaboration diagram for PhiSectorManager:

Classes

class  Imp

Public Member Functions

 PhiSectorManager (PhiSectionWidget *, IVP1System *, QObject *parent=0)
virtual ~PhiSectorManager ()
void registerSubSystemSeparator (VP1GeoFlags::SubSystemFlag flag, SoSeparator *subsystemsep)
int getVolumeType (const SbMatrix &transform, SoNode *shape) const
VP1ExtraSepLayerHelpergetSepHelperForNode (VP1GeoFlags::SubSystemFlag flag, int iphi)
VP1ExtraSepLayerHelpergetLabelSepHelperForNode (VP1GeoFlags::SubSystemFlag flag, int iphi)
 Addition to handle label separators, in exactly the same way as getSepHelperForNode(...)
VP1ExtraSepLayerHelperregisterVolumeAroundZAxis (VP1GeoFlags::SubSystemFlag flag, SoSwitch *sw, const SbMatrix &tranformation)
void updateRepresentationsOfVolsAroundZAxis ()
void largeChangesBegin ()
void largeChangesEnd ()

Protected Slots

void enabledPhiSectorsChanged ()
void updateEnabledPhiSections (int)

Private Attributes

Impm_d

Detailed Description

Definition at line 30 of file PhiSectorManager.h.

Constructor & Destructor Documentation

◆ PhiSectorManager()

PhiSectorManager::PhiSectorManager ( PhiSectionWidget * psw,
IVP1System * sys,
QObject * parent = 0 )

Definition at line 262 of file PhiSectorManager.cxx.

263 : QObject(parent), m_d(new Imp)
264{
265 m_d->phisectionwidget = psw;
266 m_d->system=sys;
267 m_d->nactivelargechanges = 0;
268 m_d->currentlyEnabledPhiSectors = QVector<bool>(NPHISECTORS,false);
269 QList<int> l; l << 4 << 6 << 9 << 12 << 18 << NPHISECTORS;//NB: All must be divisors in NPHISECTORS
270 psw->setNumberOfSectors(12);
272
273 connect(psw,SIGNAL(enabledPhiRangesChanged(const QList<VP1Interval>&)),this,SLOT(enabledPhiSectorsChanged()));
275}
#define NPHISECTORS
void setAllowedNumberOfSectors(QList< int > allowedNSectors, bool allowCustom=false)
void setNumberOfSectors(int, bool forceAllEnabled=false)
l
Printing final latex table to .tex output file.

◆ ~PhiSectorManager()

PhiSectorManager::~PhiSectorManager ( )
virtual

Definition at line 278 of file PhiSectorManager.cxx.

279{
280
281 std::map<VP1GeoFlags::SubSystemFlag,std::map<int,VP1ExtraSepLayerHelper*> >::iterator it, itE = m_d->subsysflag_2_iphi2sephelper.end();
282 for (it = m_d->subsysflag_2_iphi2sephelper.begin();it!=itE;++it) {
283 std::map<int,VP1ExtraSepLayerHelper*>::iterator it2(it->second.begin()),it2E(it->second.end());
284 for (;it2!=it2E;++it2) {
285 SoSeparator * sep = it2->second->topSeparator();
286 delete (it2->second);
287 sep->unref();
288 }
289 }
290
291 std::map<VP1GeoFlags::SubSystemFlag,std::map<int,VP1ExtraSepLayerHelper*> >::iterator it4, itE4 = m_d->subsysflag_2_iphi2labelsephelper.end();
292 for (it4 = m_d->subsysflag_2_iphi2labelsephelper.begin();it4!=itE4;++it4) {
293 std::map<int,VP1ExtraSepLayerHelper*>::iterator it5(it4->second.begin()),it5E(it4->second.end());
294 for (;it5!=it5E;++it5) {
295 SoSeparator * sep = it5->second->topSeparator();
296 delete (it5->second);
297 sep->unref();
298 }
299 }
300 std::map<VP1GeoFlags::SubSystemFlag,VP1ExtraSepLayerHelper*>::iterator it3,it3E = m_d->subsysflag_2_volAroundZSepHelper.end();
301 for (it3 = m_d->subsysflag_2_volAroundZSepHelper.begin();it3!=it3E;++it3) {
302 SoSeparator * sep = it3->second->topSeparator();
303 delete (it3->second);
304 sep->unref();
305 }
306 delete m_d; m_d=0;
307}

Member Function Documentation

◆ enabledPhiSectorsChanged

void PhiSectorManager::enabledPhiSectorsChanged ( )
protectedslot

Definition at line 310 of file PhiSectorManager.cxx.

311{
312 QVector<bool> v = m_d->phisectionwidget->virtualSectorsEnabled(NPHISECTORS);
313 if (m_d->currentlyEnabledPhiSectors == v)
314 return;
315 QList<int> changedPhiSectors;
316 for (int iphi = 0; iphi < NPHISECTORS; ++iphi)
317 if (m_d->currentlyEnabledPhiSectors[iphi]!=v[iphi])
318 changedPhiSectors << iphi;
319 m_d->currentlyEnabledPhiSectors = v;
320 for (int iphi : changedPhiSectors)
322}
void updateEnabledPhiSections(int)

◆ getLabelSepHelperForNode()

VP1ExtraSepLayerHelper * PhiSectorManager::getLabelSepHelperForNode ( VP1GeoFlags::SubSystemFlag flag,
int iphi )

Addition to handle label separators, in exactly the same way as getSepHelperForNode(...)

Definition at line 118 of file PhiSectorManager.cxx.

119{
120 assert(iphi>=-1);
121 assert(m_d->subsysflag2labelsep.find(flag)!=m_d->subsysflag2labelsep.end());
122 assert(m_d->subsysflag_2_iphi2labelsephelper.find(flag)!=m_d->subsysflag_2_iphi2labelsephelper.end());
123
124 if (m_d->subsysflag_2_iphi2labelsephelper[flag].find(iphi)!=m_d->subsysflag_2_iphi2labelsephelper[flag].end()) {
125 return m_d->subsysflag_2_iphi2labelsephelper[flag][iphi];
126 }
127
128 SoSwitch * sw = new SoSwitch;
129 sw->whichChild = (iphi>=0 ? m_d->phisectionwidget->virtualSectorEnabled(iphi,NPHISECTORS):!m_d->phisectionwidget->allSectorsOff()) ? SO_SWITCH_ALL : SO_SWITCH_NONE;
130
131 m_d->iphi2Labelswitches[iphi].insert(sw);
132
133 SoSeparator * sep = new SoSeparator;
134 sep->ref();
135 VP1ExtraSepLayerHelper * sephelper = new VP1ExtraSepLayerHelper(sep);
136 m_d->subsysflag_2_iphi2labelsephelper[flag][iphi] = sephelper;
137
138 sw->addChild(sep);
139 m_d->subsysflag2labelsep[flag]->addChild(sw);
140 return sephelper;
141}
bool flag
Definition master.py:29

◆ getSepHelperForNode()

VP1ExtraSepLayerHelper * PhiSectorManager::getSepHelperForNode ( VP1GeoFlags::SubSystemFlag flag,
int iphi )

Definition at line 92 of file PhiSectorManager.cxx.

93{
94 assert(iphi>=-1);
95 assert(m_d->subsysflag2sep.find(flag)!=m_d->subsysflag2sep.end());
96 assert(m_d->subsysflag_2_iphi2sephelper.find(flag)!=m_d->subsysflag_2_iphi2sephelper.end());
97
98 if (m_d->subsysflag_2_iphi2sephelper[flag].find(iphi)!=m_d->subsysflag_2_iphi2sephelper[flag].end()) {
99 return m_d->subsysflag_2_iphi2sephelper[flag][iphi];
100 }
101
102 SoSwitch * sw = new SoSwitch;
103 sw->whichChild = (iphi>=0 ? m_d->phisectionwidget->virtualSectorEnabled(iphi,NPHISECTORS):!m_d->phisectionwidget->allSectorsOff()) ? SO_SWITCH_ALL : SO_SWITCH_NONE;
104
105 m_d->iphi2switches[iphi].insert(sw);
106
107 SoSeparator * sep = new SoSeparator;
108 sep->ref();
109 VP1ExtraSepLayerHelper * sephelper = new VP1ExtraSepLayerHelper(sep);
110 m_d->subsysflag_2_iphi2sephelper[flag][iphi] = sephelper;
111
112 sw->addChild(sep);
113 m_d->subsysflag2sep[flag]->addChild(sw);
114 return sephelper;
115}

◆ getVolumeType()

int PhiSectorManager::getVolumeType ( const SbMatrix & transform,
SoNode * shape ) const

Definition at line 215 of file PhiSectorManager.cxx.

215 {
216 if (!shape) {
217 VP1Msg::message("ERROR: getVolumeType got a NULL shape pointer");
218 return 0;
219 }
220
221 //Step 1) Find the (projected) bounding box.
222 shape->ref();
223 SbViewportRegion dummyvp;
224 SoGetBoundingBoxAction a(dummyvp);//Fixme: Cache this guy?
225 a.apply(shape);
226 SbXfBox3f xfbox = a.getXfBoundingBox();
227 xfbox.transform(transform);
228 SbBox3f box = xfbox.project();
229 shape->unrefNoDelete();
230
231 //Step 2) Does it enclose the Z-axis?
232 float minx, miny, minz, maxx, maxy, maxz;
233 box.getBounds(minx, miny, minz, maxx, maxy, maxz);
234 float x,y,z;
235 box.getCenter().getValue(x,y,z);
236 if (std::abs(x*20.0)<std::abs(std::min(minx,maxx))&&std::abs(y*20.0)<std::abs(std::min(miny,maxy))) {
237 // -> Yes: It is one of the volumes we can handle dynamically?
238 if (shape->getTypeId()==SoTubs::getClassTypeId()
239 ||shape->getTypeId()==SoPcons::getClassTypeId()
240 ||shape->getTypeId()==SoCons::getClassTypeId()
241 ||shape->getTypeId()==SoLAr::getClassTypeId()) {
242 // -> Yes:
243 return -2;
244 } else {
245 // -> No:
246 //Fixme: Move this message somewhere appropriate???
247 //shape cannot be NULL here, so 'false' case is redundant (coverity 16272)
248 //std::string Typenametest = shape ? shape->getTypeId().getName().getString() : "NULL";
249 std::string Typenametest = shape->getTypeId().getName().getString();
250 m_d->system->message("WARNING: Unknown volume type (boolean?) for volume around Z-axis (type "
251 +QString(Typenametest.c_str())+"). Phi-sector cuts won't work for this!");
252 return -1;
253 }
254 }
255
256 //Step 3: Find phi of center and return appropriate iphi:
258
259}
static Double_t a
#define y
#define x
#define z
static int phiToVirtualSectorIndex(double phi, int nSectors)
static double phiFromXY(const double &x, const double &y)
static void message(const QString &, IVP1System *sys=0)
Definition VP1Msg.cxx:30

◆ largeChangesBegin()

void PhiSectorManager::largeChangesBegin ( )

Definition at line 492 of file PhiSectorManager.cxx.

493{
494 if (++(m_d->nactivelargechanges)==1) {
495 VP1Msg::messageVerbose("PhiSectorManager disabling notifications begin");
496 std::map<VP1GeoFlags::SubSystemFlag,std::map<int,VP1ExtraSepLayerHelper*> >::iterator it, itE = m_d->subsysflag_2_iphi2sephelper.end();
497 for (it = m_d->subsysflag_2_iphi2sephelper.begin();it!=itE;++it) {
498 std::map<int,VP1ExtraSepLayerHelper*>::iterator it2(it->second.begin()),it2E(it->second.end());
499 for (;it2!=it2E;++it2)
500 it2->second->largeChangesBegin();
501 }
502 std::map<VP1GeoFlags::SubSystemFlag,VP1ExtraSepLayerHelper*>::iterator it3,it3E = m_d->subsysflag_2_volAroundZSepHelper.end();
503 for (it3 = m_d->subsysflag_2_volAroundZSepHelper.begin();it3!=it3E;++it3)
504 it3->second->largeChangesBegin();
505 VP1Msg::messageVerbose("PhiSectorManager disabling notifications end");
506 }
507}
static void messageVerbose(const QString &)
Definition VP1Msg.cxx:84

◆ largeChangesEnd()

void PhiSectorManager::largeChangesEnd ( )

Definition at line 510 of file PhiSectorManager.cxx.

511{
512 if (--(m_d->nactivelargechanges)==0) {
513 VP1Msg::messageVerbose("PhiSectorManager enabling notifications begin");
514 std::map<VP1GeoFlags::SubSystemFlag,std::map<int,VP1ExtraSepLayerHelper*> >::iterator it, itE = m_d->subsysflag_2_iphi2sephelper.end();
515 for (it = m_d->subsysflag_2_iphi2sephelper.begin();it!=itE;++it) {
516 std::map<int,VP1ExtraSepLayerHelper*>::iterator it2(it->second.begin()),it2E(it->second.end());
517 for (;it2!=it2E;++it2)
518 it2->second->largeChangesEnd();
519 }
520 std::map<VP1GeoFlags::SubSystemFlag,VP1ExtraSepLayerHelper*>::iterator it3,it3E = m_d->subsysflag_2_volAroundZSepHelper.end();
521 for (it3 = m_d->subsysflag_2_volAroundZSepHelper.begin();it3!=it3E;++it3)
522 it3->second->largeChangesEnd();
523 VP1Msg::messageVerbose("PhiSectorManager enabling notifications end");
524 }
525}

◆ registerSubSystemSeparator()

void PhiSectorManager::registerSubSystemSeparator ( VP1GeoFlags::SubSystemFlag flag,
SoSeparator * subsystemsep )

Definition at line 78 of file PhiSectorManager.cxx.

79{
80 assert(m_d->subsysflag2sep.find(flag)==m_d->subsysflag2sep.end());
81 assert(m_d->subsysflag_2_iphi2sephelper.find(flag)==m_d->subsysflag_2_iphi2sephelper.end());
82 m_d->subsysflag_2_iphi2sephelper[flag] = std::map<int,VP1ExtraSepLayerHelper*>();
83 m_d->subsysflag2sep[flag] = subsystemsep;
84
85 assert(m_d->subsysflag2labelsep.find(flag)==m_d->subsysflag2labelsep.end());
86 assert(m_d->subsysflag_2_iphi2labelsephelper.find(flag)==m_d->subsysflag_2_iphi2labelsephelper.end());
87 m_d->subsysflag_2_iphi2labelsephelper[flag] = std::map<int,VP1ExtraSepLayerHelper*>();
88 m_d->subsysflag2labelsep[flag] = subsystemsep;
89}

◆ registerVolumeAroundZAxis()

VP1ExtraSepLayerHelper * PhiSectorManager::registerVolumeAroundZAxis ( VP1GeoFlags::SubSystemFlag flag,
SoSwitch * sw,
const SbMatrix & tranformation )

Definition at line 144 of file PhiSectorManager.cxx.

145{
146 //Assumes that the switch, sw, has the unsliced shape node as the
147 //first child (0) and a separator as the second child (1), under
148 //which shapes representing the phi-sliced shape will be placed.
149
150 //If not all phi sectors are visible, the sep node will be
151 //populated with children representing the shape cut up
152 //appropriately, and the switch will show the sep rather than the
153 //shapeWithAllPhiSectors.
154
155 assert(sw->getNumChildren()==2);
156// assert(sw->getChild(0)->getTypeId().isDerivedFrom(SoShape::getClassTypeId()));
157 assert(sw->getChild(1)->getTypeId()==SoSeparator::getClassTypeId());
158
159 SoNode* shape = static_cast<SoShape*>(sw->getChild(0));
160 SoSeparator* sep = static_cast<SoSeparator*>(sw->getChild(1));
161
162 //Start unsliced:
163 if (sw->whichChild.getValue() != 0)
164 sw->whichChild = 0;
165
166 // Register the shape according to type:
167 if (shape->getTypeId()==SoTubs::getClassTypeId()) {
168 m_d->volaroundZ_tubs[sw] = std::pair<SoTubs*,SoSeparator*>(static_cast<SoTubs*>(shape),sep);
169 } else if (shape->getTypeId()==SoPcons::getClassTypeId()) {
170 m_d->volaroundZ_pcons[sw] = std::pair<SoPcons*,SoSeparator*>(static_cast<SoPcons*>(shape),sep);
171 } else if (shape->getTypeId()==SoCons::getClassTypeId()) {
172 m_d->volaroundZ_cons[sw] = std::pair<SoCons*,SoSeparator*>(static_cast<SoCons*>(shape),sep);
173 } else {
174 assert(shape->getTypeId()==SoLAr::getClassTypeId());
175 m_d->volaroundZ_lar[sw] = std::pair<SoLAr*,SoSeparator*>(static_cast<SoLAr*>(shape),sep);
176 }
177
178 //Test: Are we roughly given by a rotation around the y-axis?
179 SbVec3f unitz (0.0f, 0.0f, 1.0f);
180 SbVec3f transfunitz;
181
182 SbVec3f translation; SbRotation rotation; SbVec3f scaleFactor; SbRotation scaleOrientation;
183 transf.getTransform (translation, rotation, scaleFactor, scaleOrientation);
184
185 rotation.multVec(unitz,transfunitz);
186
187 float x,y,z;
188 transfunitz.getValue(x,y,z);
189 //Look at direction in x-z plane - is it consistent with z<0 and |x|<<|z|? Then we have rotated around y:
190 bool rotaroundy = (z<0&&std::fabs(x)*10<std::fabs(z));
191
192 //Test: Whats the rough value we are rotated around z?
193 SbVec3f unitx (1.0f, 0.0f, 0.0f);
194 SbVec3f transfunitx;
195 rotation.multVec(unitx,transfunitx);
196 transfunitx.getValue(x,y,z);
197 double phirot = VP1LinAlgUtils::phiFromXY(x, y );
198 m_d->volaroundZ_switch2transfinfo[sw] = std::pair<double,bool>(phirot,rotaroundy);
199
200 //Return the sephelper for this subsystems volumes around Z:
201 if (m_d->subsysflag_2_volAroundZSepHelper.find(flag)!=m_d->subsysflag_2_volAroundZSepHelper.end())
202 return m_d->subsysflag_2_volAroundZSepHelper[flag];
203
204 SoSeparator * subsyssep_volaroundZ = new SoSeparator;
205 assert(m_d->subsysflag2sep.find(flag)!=m_d->subsysflag2sep.end());
206 m_d->subsysflag2sep[flag]->addChild(subsyssep_volaroundZ);
207
208 subsyssep_volaroundZ->ref();
209 VP1ExtraSepLayerHelper * sephelper = new VP1ExtraSepLayerHelper(subsyssep_volaroundZ);
210 m_d->subsysflag_2_volAroundZSepHelper[flag] = sephelper;
211 return sephelper;
212}

◆ updateEnabledPhiSections

void PhiSectorManager::updateEnabledPhiSections ( int iphi)
protectedslot

Definition at line 325 of file PhiSectorManager.cxx.

325 {
326 bool turnedon = m_d->currentlyEnabledPhiSectors.at(iphi);
327 if (m_d->iphi2switches.find(iphi)!=m_d->iphi2switches.end()) {
328 std::set<SoSwitch*>::iterator it, itE = m_d->iphi2switches[iphi].end();
329 for (it = m_d->iphi2switches[iphi].begin();it!=itE;++it) {
330 if ((*it)->whichChild.getValue() != (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE))
331 (*it)->whichChild = (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE);
332 }
333 }
334
335 if (m_d->iphi2Labelswitches.find(iphi)!=m_d->iphi2Labelswitches.end()) {
336 std::set<SoSwitch*>::iterator it, itE = m_d->iphi2Labelswitches[iphi].end();
337 for (it = m_d->iphi2Labelswitches[iphi].begin();it!=itE;++it) {
338 if ((*it)->whichChild.getValue() != (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE))
339 (*it)->whichChild = (turnedon?SO_SWITCH_ALL:SO_SWITCH_NONE);
340 }
341 }
342 // FIXME - need to find a way to turn on labels for recently made visible phi sections, OR build them all by default.
343
344 //Update the switches for boolean, etc., volumes around the Z axis.
345 bool alloff = m_d->phisectionwidget->allSectorsOff();
346 std::map<int,std::set<SoSwitch*> >::iterator it_zax_switches = m_d->iphi2switches.find(-1);
347 if (it_zax_switches!=m_d->iphi2switches.end()) {
348 std::set<SoSwitch*>::iterator it, itE = it_zax_switches->second.end();
349 for (it = it_zax_switches->second.begin();it!=itE;++it) {
350 if ((*it)->whichChild.getValue() != (alloff?SO_SWITCH_NONE:SO_SWITCH_ALL))
351 (*it)->whichChild = (alloff?SO_SWITCH_NONE:SO_SWITCH_ALL);
352 }
353 }
355}
void updateRepresentationsOfVolsAroundZAxis()

◆ updateRepresentationsOfVolsAroundZAxis()

void PhiSectorManager::updateRepresentationsOfVolsAroundZAxis ( )

Definition at line 483 of file PhiSectorManager.cxx.

484{
485 m_d->updateRepresentationsOfVolsAroundZAxis_Specific<SoTubs>(m_d->volaroundZ_tubs);
486 m_d->updateRepresentationsOfVolsAroundZAxis_Specific<SoPcons>(m_d->volaroundZ_pcons);
487 m_d->updateRepresentationsOfVolsAroundZAxis_Specific<SoCons>(m_d->volaroundZ_cons);
488 m_d->updateRepresentationsOfVolsAroundZAxis_Specific<SoLAr>(m_d->volaroundZ_lar);
489}

Member Data Documentation

◆ m_d

Imp* PhiSectorManager::m_d
private

Definition at line 74 of file PhiSectorManager.h.


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