ATLAS Offline Software
Loading...
Searching...
No Matches
MuonCollectionSettingsButton.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Local
8#include "ui_permuoncollectionsettings_form.h"
9#include "ui_settings_cuts_form.h"
10
11//VP1
16
17//SoCoin
18
19#include "Inventor/nodes/SoDrawStyle.h"
20#include "Inventor/nodes/SoLightModel.h"
21#include "Inventor/nodes/SoMaterial.h"
22
23// Qt
24#include <QTimer>
25#include <QByteArray>
26#include <QBuffer>
27#include <QDataStream>
28#include <QMouseEvent>
29#include <QDragEnterEvent>
30#include <QDropEvent>
31#include <QShortcut>
32#include <QMimeData>
33#include <QDrag>
34
35// Misc
36#include <iostream>
37
38//____________________________________________________________________
40public:
46 QWidget * editwindow;
47 Ui::MuonCollectionSettingsForm editwindow_ui{};
48
49 VP1MaterialButton* matButton;// main collection colour
50 // VP1MaterialButton* defaultParametersMatButton;
51
52 // QList<VP1MaterialButton*> parameterTypeMatButtons;// enum used to access the specific button
53
54 SoDrawStyle * trackDrawStyle;
55 SoLightModel * trackLightModel;
56
57 //GUI - last values
62 QList<VP1Interval> last_cutAllowedPhi;
63 unsigned int last_minimumQuality;
64 ShownAssociatedObjects last_shownAssociatedObjects;
65
66 int dim;
68
69 void initEditWindow();
70};
71
72//____________________________________________________________________
74{
75 if (editwindow)
76 return;
77 theclass->messageVerbose("Initialising material editor dialog");
78 editwindow = new QWidget(0,Qt::WindowStaysOnTopHint);
80 matButton = editwindow_ui.pushButton_matButton;
81}
82
83//____________________________________________________________________
85{
86 if (m_d->editwindow)
87 m_d->editwindow->setWindowTitle(t);
88 setToolTip(t);
89}
90
91//____________________________________________________________________
93 : VP1MaterialButtonBase(parent,0,"VP1MaterialButton"), m_d(new Imp)
94{
95 m_d->dim = dim;
96
97 m_d->theclass = this;
98 m_d->initEditWindow();
99
100 //Draw Styles / Complexity:
101 VP1QtInventorUtils::setLimitsLineWidthSlider(m_d->editwindow_ui.horizontalSlider_trackWidth);
102 VP1QtInventorUtils::setValueLineWidthSlider(m_d->editwindow_ui.horizontalSlider_trackWidth,1.0);
103
104 m_d->trackDrawStyle = new SoDrawStyle;
105 m_d->trackDrawStyle->setName("MuonDrawStyle");
106 m_d->trackDrawStyle->pointSize=5.0;
107 m_d->trackDrawStyle->ref();
109 connect(m_d->editwindow_ui.horizontalSlider_trackWidth,SIGNAL(valueChanged(int)),this,SLOT(updateTrackDrawStyle()));
110
111 m_d->trackLightModel = new SoLightModel;
112 m_d->trackLightModel->setName("MuonLightModel");
113 m_d->trackLightModel->ref();
115 connect(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel,SIGNAL(toggled(bool)),this,SLOT(updateTrackLightModel(bool)));
116
117 m_d->last_trackTubeRadius=trackTubeRadius();
118 connect(m_d->editwindow_ui.checkBox_trackTubes,SIGNAL(toggled(bool)),this,SLOT(updateTrackTubeRadius()));
119 connect(m_d->editwindow_ui.doubleSpinBox_trackTubesRadiusMM,SIGNAL(valueChanged(double)),this,SLOT(updateTrackTubeRadius()));
120
121 connect(m_d->editwindow_ui.checkBox_hideactualpaths,SIGNAL(toggled(bool)),this,SLOT(updateHideActualTrackPath(bool)));
122
123 // -> cutAllowedP/Pt
124 connect(m_d->editwindow_ui.checkBox_cut_minpt,SIGNAL(toggled(bool)),this,SLOT(possibleChange_cutAllowedPt()));
125 connect(m_d->editwindow_ui.checkBox_cut_maxpt,SIGNAL(toggled(bool)),this,SLOT(possibleChange_cutAllowedPt()));
126 connect(m_d->editwindow_ui.doubleSpinBox_cut_minpt_gev,SIGNAL(valueChanged(double)),this,SLOT(possibleChange_cutAllowedPt()));
127 connect(m_d->editwindow_ui.doubleSpinBox_cut_maxpt_gev,SIGNAL(valueChanged(double)),this,SLOT(possibleChange_cutAllowedPt()));
128 connect(m_d->editwindow_ui.checkBox_cut_minpt,SIGNAL(toggled(bool)),this,SLOT(possibleChange_cutAllowedPt()));
129 connect(m_d->editwindow_ui.comboBox_momtype,SIGNAL(currentIndexChanged(int)),this,SLOT(possibleChange_cutAllowedPt()));
130
131 // -> cutAllowedEta
132 connect(m_d->editwindow_ui.etaPhiCutWidget,SIGNAL(allowedEtaChanged(const VP1Interval&)),this,SLOT(possibleChange_cutAllowedEta()));
133
134 // -> cutAllowedPhi
135 connect(m_d->editwindow_ui.etaPhiCutWidget,SIGNAL(allowedPhiChanged(const QList<VP1Interval>&)),this,SLOT(possibleChange_cutAllowedPhi()));
136
137 // -> quality
138 connect(m_d->editwindow_ui.comboBox_minimumQuality,SIGNAL(currentIndexChanged(int)),this,SLOT(possibleChange_minimumQuality()));
139 m_d->last_minimumQuality=minimumQuality();
140
141 // -> shownObjects
142 connect(m_d->editwindow_ui.checkBox_showTrackParticles,SIGNAL(toggled(bool)),this,SLOT(possibleChange_shownAssociatedObjects()));
143 connect(m_d->editwindow_ui.comboBox_shownTrackParticles,SIGNAL(currentIndexChanged(int)),this,SLOT(possibleChange_shownAssociatedObjects()));
144 m_d->last_shownAssociatedObjects=shownAssociatedObjects();
145
146 connect(this,SIGNAL(clicked()),this,SLOT(showEditMaterialDialog()));
147 connect(m_d->editwindow_ui.pushButton_close,SIGNAL(clicked()),this,SLOT(showEditMaterialDialog()));
148 connect(m_d->matButton,SIGNAL(lastAppliedChanged()),this,SLOT(updateButton()));
149 connect(m_d->matButton,SIGNAL(lastAppliedChanged()),this,SIGNAL(lastAppliedChanged()));
150 setAcceptDrops(true);
151
152 QTimer::singleShot(0, this, SLOT(updateButton()));
153
154}
155
156// QWidget& MuonCollectionSettingsButton::editWindow() {
157// if (!m_d->editwindow)
158// initEditWindow();
159// return *(m_d->editwindow);
160// }
162{
163 delete m_d->editwindow;
164 m_d->trackDrawStyle->unref();
165 m_d->trackLightModel->unref();
166 delete m_d;
167}
168
170{
171 if (objectName().isEmpty())
172 setObjectName("MuonCollectionSettingsButton");
173 messageVerbose("setColButtonProperties: color=" + str(m_d->matButton->lastAppliedDiffuseColour()));
174 VP1ColorSelectButton::setColButtonProperties(this,m_d->matButton->lastAppliedDiffuseColour(),m_d->dim);
175}
176
178{
179 if (m_d->dim == dim)
180 return;
181 m_d->dim = dim;
182 updateButton();
183}
184
186{
187 if (!m_d->editwindow)
188 m_d->initEditWindow();
189
190 if (m_d->editwindow->isHidden())
191 m_d->editwindow->show();
192 else
193 m_d->editwindow->hide();
194}
195
197{
198 // std::cout<<"MuonCollectionSettingsButton::setMaterial with mat="<<mat<<std::endl;
199 if (!m_d->matButton) m_d->initEditWindow();
200 m_d->matButton->setMaterial(mat);
201 return true;
202}
203
205{
206 if (!m_d->matButton) m_d->initEditWindow();
207 m_d->matButton->setMaterial(mat);
208}
210{
211 if (!m_d->matButton) m_d->initEditWindow();
212 return m_d->matButton->lastAppliedTransparency();
213}
215{
216 if (!m_d->matButton) m_d->initEditWindow();
217 return m_d->matButton->lastAppliedShininess();
218}
220{
221 if (!m_d->matButton) m_d->initEditWindow();
222 return m_d->matButton->lastAppliedBrightness();
223}
224
226{
227 return m_d->editwindow_ui.checkBox_trackTubes->isChecked() ?
228 m_d->editwindow_ui.doubleSpinBox_trackTubesRadiusMM->value() : 0.0;
229}
230
232{
233 if (m_d->last_trackTubeRadius==trackTubeRadius()) return;
234 m_d->last_trackTubeRadius=trackTubeRadius();
235 messageVerbose("TrackTubeRadius changed to "+str(m_d->last_trackTubeRadius));
236 emit trackTubeRadiusChanged(m_d->last_trackTubeRadius);
237 return;
238}
239
241{
242 double val = VP1QtInventorUtils::getValueLineWidthSlider(m_d->editwindow_ui.horizontalSlider_trackWidth);
243 if (m_d->trackDrawStyle->lineWidth.getValue()!=val)
244 m_d->trackDrawStyle->lineWidth = val;
245}
246
248{
249 if (m_d->trackLightModel->model.getValue()!=(base?SoLightModel::BASE_COLOR:SoLightModel::PHONG)) {
250 messageVerbose("TrackLightModel changed (base = "+str(base));
251 if (base)
252 m_d->trackLightModel->model.setValue(SoLightModel::BASE_COLOR);
253 else
254 m_d->trackLightModel->model.setValue(SoLightModel::PHONG);
255 }
256}
257
262
263
265{
266 return m_d->trackDrawStyle;
267}
268
270{
271 return m_d->trackLightModel;
272}
273
275 // return m_d->defaultParametersMatButton->handledMaterials().at(0);// Only have one material per button.
276 return 0;
277}
278
280 // return (m_d->parameterTypeMatButtons.at(static_cast<unsigned int>(position)))->handledMaterials().at(0);// Only have one material per button.
281 return 0;
282}
283
284// void setDefaultParameterMaterial(SoMaterial* mat) {
285// // m_d->defaultParametersMatButton->setObjectName("matButton_default");
286// // m_d->defaultParametersMatButton->setToolTip(matButtonToolTip());
287// m_d->defaultParametersMatButton->setMaterial(mat);
288// // connect(m_d->matButton,SIGNAL(lastAppliedChanged()),this,SLOT(possibleChangeMatTranspOrBrightness()));
289// }
290//
291// void MuonCollectionSettingsButton::setParameterMaterial(SoMaterial*, xAOD::ParameterPosition){
292// // FIXME!
293// }
294
296{
297 if (!m_d->editwindow)
298 m_d->initEditWindow();
299
300 QString text = m_d->editwindow_ui.comboBox_minimumQuality->currentText();
301 if (text=="Very Loose") return static_cast<unsigned int>(xAOD::Muon::VeryLoose);
302 if (text=="Loose") return static_cast<unsigned int>(xAOD::Muon::Loose);
303 if (text=="Medium") return static_cast<unsigned int>(xAOD::Muon::Medium);
304 if (text=="Tight") return static_cast<unsigned int>(xAOD::Muon::Tight);
305
306 message("ERROR! MuonCollectionSettingsButton::minimumQuality - unknown value! Returning 'Very Loose'.");
307 return static_cast<unsigned int>(xAOD::Muon::VeryLoose);
308}
309
310MuonCollectionSettingsButton::ShownAssociatedObjects MuonCollectionSettingsButton::shownAssociatedObjects() const
311{
312 if (!m_d->editwindow)
313 m_d->initEditWindow();
314 ShownAssociatedObjects parts = ShownAssociatedObject::Nothing;
315 // if (!m_d->ui_col.checkBox_hideactualpaths->isChecked()) parts |= TrackCommonFlags::ActualPath;
316 if (m_d->editwindow_ui.checkBox_showTrackParticles->isChecked()) {
317 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==0) parts |= ShownAssociatedObject::TrackParticlesPrimary;
318 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==1) parts |= ShownAssociatedObject::TrackParticlesCB;
319 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==2) parts |= ShownAssociatedObject::TrackParticlesID;
320 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==3) parts |= ShownAssociatedObject::TrackParticlesMS;
321 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==4) parts |= ShownAssociatedObject::TrackParticlesME;
322 }
323 if (m_d->editwindow_ui.checkBox_showCaloClusters->isChecked()) parts |= ShownAssociatedObject::CaloClusters;
324 if (m_d->editwindow_ui.checkBox_showSegments->isChecked()) parts |= ShownAssociatedObject::Segments;
325 return parts;
326}
327
329{
330 if (!m_d->editwindow)
331 m_d->initEditWindow();
332 return m_d->editwindow_ui.checkBox_hideactualpaths->isChecked();
333}
334
335//____________________________________________________________________
337{
338 if (event->button() == Qt::LeftButton)
339 m_d->dragStartPosition = event->pos();
340 QPushButton::mousePressEvent(event);
341}
342
343//____________________________________________________________________
345{
346 if (event->source()!=this && event->mimeData()->hasFormat("vp1/material"))
347 event->acceptProposedAction();
348}
349
350//____________________________________________________________________
352{
353 if (!(event->buttons() & Qt::LeftButton))
354 return;
355 if ((event->pos() - m_d->dragStartPosition).manhattanLength()
356 < QApplication::startDragDistance())
357 return;
358
359 QDrag *drag = new QDrag(this);
360 QMimeData *mimeData = new QMimeData;
361
363 // For dragging state onto other material buttons: //
365
366 QByteArray byteArray = saveState();
367
368 // buffer.close();
369 mimeData->setData("vp1/material", byteArray);
370
371 // ////////////////////////////////////////////////////////
372 // // For dragging c++ code for defining this material //
373 // // into e.g. an editor: //
374 // ////////////////////////////////////////////////////////
375 //
376 // QString s = "SoMaterial * mat = new SoMaterial;\n";
377 // QString str_ambient = m_d->toSbColTxt(m_d->lastapplied_ambient);
378 // if (str_ambient!="SbColor(0.2,0.2,0.2)")
379 // s += "mat->ambientColor.setValue("+str_ambient+");\n";
380 // QString str_diffuse = m_d->toSbColTxt(m_d->lastapplied_diffuse);
381 // if (str_diffuse!="SbColor(0.8,0.8,0.8)")
382 // s += "mat->diffuseColor.setValue("+str_diffuse+");\n";
383 // QString str_specular = m_d->toSbColTxt(m_d->lastapplied_specular);
384 // if (str_specular!="SbColor(0,0,0)")
385 // s += "mat->specularColor.setValue("+str_specular+");\n";
386 // QString str_emissive = m_d->toSbColTxt(m_d->lastapplied_emissive);
387 // if (str_emissive!="SbColor(0,0,0)")
388 // s += "mat->emissiveColor.setValue("+str_emissive+");\n";
389 // QString str_shininess = m_d->printFloat(m_d->lastapplied_shininess/100.0);
390 // if (str_shininess!="0.2")
391 // s += "mat->shininess.setValue("+str_shininess+");\n";
392 // QString str_transparency = m_d->printFloat(m_d->lastapplied_transparency/100.0);
393 // if (str_transparency!="0")
394 // s += "mat->transparency.setValue("+str_transparency+");\n";
395 // mimeData->setText(s);
396
397 //Execute drag:
398 drag->setMimeData(mimeData);//drag assumes ownership of mimeData
399 drag->exec(Qt::CopyAction | Qt::MoveAction);
400}
401
402//____________________________________________________________________
404{
405 QByteArray data = event->mimeData()->data("vp1/material");
406 event->acceptProposedAction();
408}
409
410
412 // messageVerbose("getState");
413 // if (m_d->editwindow_ui.checkBox_tracksUseBaseLightModel->isChecked()) messageVerbose("checked!");
414 VP1Serialise serialise(1/*version*/);
415
416 serialise.save(m_d->matButton);
417 // serialise.disableUnsavedChecks();
418 serialise.save(m_d->editwindow_ui.horizontalSlider_trackWidth);
419 serialise.save(m_d->editwindow_ui.checkBox_trackTubes);
420 serialise.save(m_d->editwindow_ui.doubleSpinBox_trackTubesRadiusMM);
421 serialise.save(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel);
422 serialise.save(m_d->editwindow_ui.checkBox_hideactualpaths);
423
424 serialise.widgetHandled(this);
425 serialise.warnUnsaved(this);
426 return serialise.result();
427}
428
430
431 VP1Deserialise state(ba,systemBase());
432 if (state.version()<0||state.version()>1)
433 return;//Ignore silently
434 state.restore(m_d->matButton);
435 state.restore(m_d->editwindow_ui.horizontalSlider_trackWidth);
436 state.restore(m_d->editwindow_ui.checkBox_trackTubes);
437 state.restore(m_d->editwindow_ui.doubleSpinBox_trackTubesRadiusMM);
438 state.restore(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel);
439 state.restore(m_d->editwindow_ui.checkBox_hideactualpaths);
440
441 state.widgetHandled(this);
442 state.warnUnrestored(this);
443
445 updateTrackLightModel(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel);
446 updateButton();
447 //FIXME - anything else need updating?
448}
449
450//____________________________________________________________________
452{
453 if (!m_d->editwindow)
454 m_d->initEditWindow();
455 if (!m_d->editwindow_ui.checkBox_cut_minpt)
456 return VP1Interval();
457
458 // will set range to negative if we have momcut=P
459 // if minCut unset then min=-inf
460 // if minCut set, and Pt selected, then min=-minCut
461 // if minCut set, and P selected, then min=-maxCut
462 // etc
463 bool isPCut = m_d->editwindow_ui.comboBox_momtype->currentText()=="P";
464
465 const double minFromInterface=m_d->editwindow_ui.doubleSpinBox_cut_minpt_gev->value()*1000;
466 const double maxFromInterface=m_d->editwindow_ui.doubleSpinBox_cut_maxpt_gev->value()*1000;
467
468 double min=0.0,max=0.0;
469 if (!isPCut) {
470 //Pt cut
471 min = (m_d->editwindow_ui.checkBox_cut_minpt->isChecked() ? minFromInterface : -std::numeric_limits<double>::infinity());
472 max = (m_d->editwindow_ui.checkBox_cut_maxpt->isChecked() ? maxFromInterface : std::numeric_limits<double>::infinity());
473 } else {
474 min = (m_d->editwindow_ui.checkBox_cut_maxpt->isChecked() ? -maxFromInterface : -std::numeric_limits<double>::infinity());
475 max = (m_d->editwindow_ui.checkBox_cut_minpt->isChecked() ? -minFromInterface : std::numeric_limits<double>::infinity());
476 }
477
478 //message("cutAllowedPt: min,max="+QString::number(min)+","+QString::number(max));
479
480 if (max<min)
481 return VP1Interval();
482
483 return VP1Interval( min, max );//fixme: closed interval??
484}
485
486//____________________________________________________________________
488{
489 if (!m_d->editwindow)
490 m_d->initEditWindow();
491 return m_d->editwindow_ui.etaPhiCutWidget->allowedEta();
492}
493
494//____________________________________________________________________
496{
497 if (!m_d->editwindow)
498 m_d->initEditWindow();
499 return m_d->editwindow_ui.etaPhiCutWidget->allowedPhi();
500}
501
503{
504 messageVerbose("possibleChange_cutAllowedPt() ");
505
506 if (m_d->last_cutAllowedPt==cutAllowedPt()) return;
507 messageVerbose("cutAllowedPt() changed");
508 m_d->last_cutAllowedPt= cutAllowedPt();
509 emit cutAllowedPtChanged(m_d->last_cutAllowedPt);
510}
511
513{
514 if (m_d->last_cutAllowedEta==cutAllowedEta()) return;
515 messageVerbose("cutAllowedEta() changed");
516 m_d->last_cutAllowedEta=cutAllowedEta();
517 emit cutAllowedEtaChanged(m_d->last_cutAllowedEta);
518}
519
521{
522 if (m_d->last_cutAllowedPhi==cutAllowedPhi()) return;
523 messageVerbose("cutAllowedPhi() changed");
524 m_d->last_cutAllowedPhi=cutAllowedPhi();
525 emit cutAllowedPhiChanged(m_d->last_cutAllowedPhi);
526}
527
529{
530 messageVerbose("possibleChange_minimumQuality()");
531
532 if (m_d->last_minimumQuality==minimumQuality()) return;
533 messageVerbose("minimumQuality() changed");
534 m_d->last_minimumQuality=minimumQuality();
535 emit minimumQualityChanged(m_d->last_minimumQuality);
536}
537
538// #define VP1CONTROLLERCLASSNAME MuonCollectionSettingsButton
539// #include "VP1Base/VP1ControllerMacros.h"
540// POSSIBLECHANGE_IMP(shownAssociatedObjects)
541
543{
544 messageVerbose("possibleChange_shownAssociatedObjects()");
545
546 if (m_d->last_shownAssociatedObjects==shownAssociatedObjects()) return;
547 messageVerbose("shownAssociatedObjects() changed");
548 m_d->last_shownAssociatedObjects=shownAssociatedObjects();
549 emit shownAssociatedObjectsChanged(m_d->last_shownAssociatedObjects);
550}
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
void cutAllowedPtChanged(const VP1Interval &)
void shownAssociatedObjectsChanged(MuonCollectionSettingsButton::ShownAssociatedObjects)
void cutAllowedEtaChanged(const VP1Interval &)
void minimumQualityChanged(unsigned int)
virtual void copyValuesFromMaterial(SoMaterial *)
ShownAssociatedObjects shownAssociatedObjects() const
QByteArray saveState() const
fill out with the state of the object (used for drag and drop etc)
void trackTubeRadiusChanged(const double &)
MuonCollectionSettingsButton(QWidget *parent=0, int dim=25)
SoMaterial * parameterMaterial(xAOD::ParameterPosition) const
void dragEnterEvent(QDragEnterEvent *event)
void cutAllowedPhiChanged(const QList< VP1Interval > &)
QList< VP1Interval > cutAllowedPhi() const
static void setColButtonProperties(QPushButton *, const QColor &col, int dim)
void restore(QCheckBox *sb)
void warnUnrestored(QObject *)
void widgetHandled(QWidget *)
qint32 version() const
void messageVerbose(const QString &) const
void message(const QString &) const
IVP1System * systemBase() const
VP1MaterialButtonBase(QWidget *parent, IVP1System *sys=0, const QString &helpername="")
static double getValueLineWidthSlider(const QSlider *)
static void setLimitsLineWidthSlider(QSlider *)
static void setValueLineWidthSlider(QSlider *, const double &value)
std::string base
Definition hcg.cxx:81
ParameterPosition
Enum allowing us to know where in ATLAS the parameters are defined.