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 using Quality=xAOD::Muon::Quality;
302 if (text=="Very Loose") return static_cast<unsigned int>(Quality::VeryLoose);
303 if (text=="Loose") return static_cast<unsigned int>(Quality::Loose);
304 if (text=="Medium") return static_cast<unsigned int>(Quality::Medium);
305 if (text=="Tight") return static_cast<unsigned int>(Quality::Tight);
306
307 message("ERROR! MuonCollectionSettingsButton::minimumQuality - unknown value! Returning 'Very Loose'.");
308 return static_cast<unsigned int>(Quality::VeryLoose);
309}
310
311MuonCollectionSettingsButton::ShownAssociatedObjects MuonCollectionSettingsButton::shownAssociatedObjects() const
312{
313 if (!m_d->editwindow)
314 m_d->initEditWindow();
315 ShownAssociatedObjects parts = ShownAssociatedObject::Nothing;
316 // if (!m_d->ui_col.checkBox_hideactualpaths->isChecked()) parts |= TrackCommonFlags::ActualPath;
317 if (m_d->editwindow_ui.checkBox_showTrackParticles->isChecked()) {
318 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==0) parts |= ShownAssociatedObject::TrackParticlesPrimary;
319 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==1) parts |= ShownAssociatedObject::TrackParticlesCB;
320 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==2) parts |= ShownAssociatedObject::TrackParticlesID;
321 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==3) parts |= ShownAssociatedObject::TrackParticlesMS;
322 if (m_d->editwindow_ui.comboBox_shownTrackParticles->currentIndex()==4) parts |= ShownAssociatedObject::TrackParticlesME;
323 }
324 if (m_d->editwindow_ui.checkBox_showCaloClusters->isChecked()) parts |= ShownAssociatedObject::CaloClusters;
325 if (m_d->editwindow_ui.checkBox_showSegments->isChecked()) parts |= ShownAssociatedObject::Segments;
326 return parts;
327}
328
330{
331 if (!m_d->editwindow)
332 m_d->initEditWindow();
333 return m_d->editwindow_ui.checkBox_hideactualpaths->isChecked();
334}
335
336//____________________________________________________________________
338{
339 if (event->button() == Qt::LeftButton)
340 m_d->dragStartPosition = event->pos();
341 QPushButton::mousePressEvent(event);
342}
343
344//____________________________________________________________________
346{
347 if (event->source()!=this && event->mimeData()->hasFormat("vp1/material"))
348 event->acceptProposedAction();
349}
350
351//____________________________________________________________________
353{
354 if (!(event->buttons() & Qt::LeftButton))
355 return;
356 if ((event->pos() - m_d->dragStartPosition).manhattanLength()
357 < QApplication::startDragDistance())
358 return;
359
360 QDrag *drag = new QDrag(this);
361 QMimeData *mimeData = new QMimeData;
362
364 // For dragging state onto other material buttons: //
366
367 QByteArray byteArray = saveState();
368
369 // buffer.close();
370 mimeData->setData("vp1/material", byteArray);
371
372 // ////////////////////////////////////////////////////////
373 // // For dragging c++ code for defining this material //
374 // // into e.g. an editor: //
375 // ////////////////////////////////////////////////////////
376 //
377 // QString s = "SoMaterial * mat = new SoMaterial;\n";
378 // QString str_ambient = m_d->toSbColTxt(m_d->lastapplied_ambient);
379 // if (str_ambient!="SbColor(0.2,0.2,0.2)")
380 // s += "mat->ambientColor.setValue("+str_ambient+");\n";
381 // QString str_diffuse = m_d->toSbColTxt(m_d->lastapplied_diffuse);
382 // if (str_diffuse!="SbColor(0.8,0.8,0.8)")
383 // s += "mat->diffuseColor.setValue("+str_diffuse+");\n";
384 // QString str_specular = m_d->toSbColTxt(m_d->lastapplied_specular);
385 // if (str_specular!="SbColor(0,0,0)")
386 // s += "mat->specularColor.setValue("+str_specular+");\n";
387 // QString str_emissive = m_d->toSbColTxt(m_d->lastapplied_emissive);
388 // if (str_emissive!="SbColor(0,0,0)")
389 // s += "mat->emissiveColor.setValue("+str_emissive+");\n";
390 // QString str_shininess = m_d->printFloat(m_d->lastapplied_shininess/100.0);
391 // if (str_shininess!="0.2")
392 // s += "mat->shininess.setValue("+str_shininess+");\n";
393 // QString str_transparency = m_d->printFloat(m_d->lastapplied_transparency/100.0);
394 // if (str_transparency!="0")
395 // s += "mat->transparency.setValue("+str_transparency+");\n";
396 // mimeData->setText(s);
397
398 //Execute drag:
399 drag->setMimeData(mimeData);//drag assumes ownership of mimeData
400 drag->exec(Qt::CopyAction | Qt::MoveAction);
401}
402
403//____________________________________________________________________
405{
406 QByteArray data = event->mimeData()->data("vp1/material");
407 event->acceptProposedAction();
409}
410
411
413 // messageVerbose("getState");
414 // if (m_d->editwindow_ui.checkBox_tracksUseBaseLightModel->isChecked()) messageVerbose("checked!");
415 VP1Serialise serialise(1/*version*/);
416
417 serialise.save(m_d->matButton);
418 // serialise.disableUnsavedChecks();
419 serialise.save(m_d->editwindow_ui.horizontalSlider_trackWidth);
420 serialise.save(m_d->editwindow_ui.checkBox_trackTubes);
421 serialise.save(m_d->editwindow_ui.doubleSpinBox_trackTubesRadiusMM);
422 serialise.save(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel);
423 serialise.save(m_d->editwindow_ui.checkBox_hideactualpaths);
424
425 serialise.widgetHandled(this);
426 serialise.warnUnsaved(this);
427 return serialise.result();
428}
429
431
432 VP1Deserialise state(ba,systemBase());
433 if (state.version()<0||state.version()>1)
434 return;//Ignore silently
435 state.restore(m_d->matButton);
436 state.restore(m_d->editwindow_ui.horizontalSlider_trackWidth);
437 state.restore(m_d->editwindow_ui.checkBox_trackTubes);
438 state.restore(m_d->editwindow_ui.doubleSpinBox_trackTubesRadiusMM);
439 state.restore(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel);
440 state.restore(m_d->editwindow_ui.checkBox_hideactualpaths);
441
442 state.widgetHandled(this);
443 state.warnUnrestored(this);
444
446 updateTrackLightModel(m_d->editwindow_ui.checkBox_tracksUseBaseLightModel);
447 updateButton();
448 //FIXME - anything else need updating?
449}
450
451//____________________________________________________________________
453{
454 if (!m_d->editwindow)
455 m_d->initEditWindow();
456 if (!m_d->editwindow_ui.checkBox_cut_minpt)
457 return VP1Interval();
458
459 // will set range to negative if we have momcut=P
460 // if minCut unset then min=-inf
461 // if minCut set, and Pt selected, then min=-minCut
462 // if minCut set, and P selected, then min=-maxCut
463 // etc
464 bool isPCut = m_d->editwindow_ui.comboBox_momtype->currentText()=="P";
465
466 const double minFromInterface=m_d->editwindow_ui.doubleSpinBox_cut_minpt_gev->value()*1000;
467 const double maxFromInterface=m_d->editwindow_ui.doubleSpinBox_cut_maxpt_gev->value()*1000;
468
469 double min=0.0,max=0.0;
470 if (!isPCut) {
471 //Pt cut
472 min = (m_d->editwindow_ui.checkBox_cut_minpt->isChecked() ? minFromInterface : -std::numeric_limits<double>::infinity());
473 max = (m_d->editwindow_ui.checkBox_cut_maxpt->isChecked() ? maxFromInterface : std::numeric_limits<double>::infinity());
474 } else {
475 min = (m_d->editwindow_ui.checkBox_cut_maxpt->isChecked() ? -maxFromInterface : -std::numeric_limits<double>::infinity());
476 max = (m_d->editwindow_ui.checkBox_cut_minpt->isChecked() ? -minFromInterface : std::numeric_limits<double>::infinity());
477 }
478
479 //message("cutAllowedPt: min,max="+QString::number(min)+","+QString::number(max));
480
481 if (max<min)
482 return VP1Interval();
483
484 return VP1Interval( min, max );//fixme: closed interval??
485}
486
487//____________________________________________________________________
489{
490 if (!m_d->editwindow)
491 m_d->initEditWindow();
492 return m_d->editwindow_ui.etaPhiCutWidget->allowedEta();
493}
494
495//____________________________________________________________________
497{
498 if (!m_d->editwindow)
499 m_d->initEditWindow();
500 return m_d->editwindow_ui.etaPhiCutWidget->allowedPhi();
501}
502
504{
505 messageVerbose("possibleChange_cutAllowedPt() ");
506
507 if (m_d->last_cutAllowedPt==cutAllowedPt()) return;
508 messageVerbose("cutAllowedPt() changed");
509 m_d->last_cutAllowedPt= cutAllowedPt();
510 emit cutAllowedPtChanged(m_d->last_cutAllowedPt);
511}
512
514{
515 if (m_d->last_cutAllowedEta==cutAllowedEta()) return;
516 messageVerbose("cutAllowedEta() changed");
517 m_d->last_cutAllowedEta=cutAllowedEta();
518 emit cutAllowedEtaChanged(m_d->last_cutAllowedEta);
519}
520
522{
523 if (m_d->last_cutAllowedPhi==cutAllowedPhi()) return;
524 messageVerbose("cutAllowedPhi() changed");
525 m_d->last_cutAllowedPhi=cutAllowedPhi();
526 emit cutAllowedPhiChanged(m_d->last_cutAllowedPhi);
527}
528
530{
531 messageVerbose("possibleChange_minimumQuality()");
532
533 if (m_d->last_minimumQuality==minimumQuality()) return;
534 messageVerbose("minimumQuality() changed");
535 m_d->last_minimumQuality=minimumQuality();
536 emit minimumQualityChanged(m_d->last_minimumQuality);
537}
538
539// #define VP1CONTROLLERCLASSNAME MuonCollectionSettingsButton
540// #include "VP1Base/VP1ControllerMacros.h"
541// POSSIBLECHANGE_IMP(shownAssociatedObjects)
542
544{
545 messageVerbose("possibleChange_shownAssociatedObjects()");
546
547 if (m_d->last_shownAssociatedObjects==shownAssociatedObjects()) return;
548 messageVerbose("shownAssociatedObjects() changed");
549 m_d->last_shownAssociatedObjects=shownAssociatedObjects();
550 emit shownAssociatedObjectsChanged(m_d->last_shownAssociatedObjects);
551}
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:83
ParameterPosition
Enum allowing us to know where in ATLAS the parameters are defined.