ATLAS Offline Software
Loading...
Searching...
No Matches
CaloClusterSysController.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5
7// //
8// Implementation of class CaloClusterSysController //
9// //
10// Author: Thomas H. Kittelmann (Thomas.Kittelmann@cern.ch) //
11// Initial version: July 2008 //
12// //
14
15#define VP1IMPVARNAME m_d
16
19#include "ui_vp1caloclustercontrollerform.h"
20#include "ui_calocluster_settings_display_form.h"
21#include "ui_calocluster_settings_interactions_form.h"
22#include "ui_calocluster_settings_cuts_form.h"
26#include <cmath>
27#include "CLHEP/Units/SystemOfUnits.h"
28
29//____________________________________________________________________
31public:
32 Ui::VP1CaloClusterControllerForm ui{};
33 Ui::CaloClusterSysSettingsCutsForm ui_cuts{};
34 Ui::CaloClusterSysSettingsInteractionsForm ui_int{};
35 Ui::CaloClusterSysSettingsDisplayForm ui_display{};
37
38 double gui_mostEnergetic = 0.0;
39
40 QPair<bool,double> last_scale;
43 QList<VP1Interval> last_cutAllowedPhi;//All off: empty list. All on: list with one entry: ]-inf,inf[
46};
47
48//____________________________________________________________________
49QString CaloClusterSysController::toString( const QPair<bool,double>& par )
50{
51 return "<"+QString(par.first?"log":"linear")+", "+QString::number(par.second/(CLHEP::cm/CLHEP::GeV))+" cm/GeV>";
52}
53
54//____________________________________________________________________
56 : VP1Controller(sys,"CaloClusterSysController"), m_d(new Imp)
57{
58 m_d->ui.setupUi(this);
59 m_d->gui_mostEnergetic = 0;
60
61 m_d->collWidget = new VP1CollectionWidget;
62 setupCollWidgetInScrollArea(m_d->ui.collWidgetScrollArea,m_d->collWidget);
63
64 initDialog(m_d->ui_display, m_d->ui.pushButton_settings_display);
65 initDialog(m_d->ui_int, m_d->ui.pushButton_settings_interactions);
66 initDialog(m_d->ui_cuts, m_d->ui.pushButton_settings_cuts);
67
68 m_d->ui_display.widget_drawOptions->setLineWidths(2.0);
69 m_d->ui_display.widget_drawOptions->setPointSizesDisabled();
70 m_d->ui_display.widget_drawOptions->setBaseLightingDisabled();
71 m_d->ui_display.widget_drawOptions->setComplexityDisabled();
72
73 m_d->ui_cuts.etaPhiCutWidget->setEtaCutEnabled(false);
74
76 // Setup connections which monitor changes in the controller so that we may emit signals as appropriate: //
78
79 // -> Eta cut presets:
80 connect(m_d->ui_cuts.toolButton_quicketa_barrel,SIGNAL(clicked()),this,SLOT(etaCutPresetButtonTriggered()));
81 connect(m_d->ui_cuts.toolButton_quicketa_endcapA,SIGNAL(clicked()),this,SLOT(etaCutPresetButtonTriggered()));
82 connect(m_d->ui_cuts.toolButton_quicketa_endcapC,SIGNAL(clicked()),this,SLOT(etaCutPresetButtonTriggered()));
83
84 // -> scale:
86 connectToLastUpdateSlot(m_d->ui_display.checkBox_logscale);
87 connectToLastUpdateSlot(m_d->ui_display.radioButton_relativeScale);
88 connectToLastUpdateSlot(m_d->ui_display.doubleSpinBox_lengthOfMostEnergetic);
89 connectToLastUpdateSlot(m_d->ui_display.doubleSpinBox_lengthOf10GeV);
90
91 // -> cutAllowedEnergies:
93 connectToLastUpdateSlot(m_d->ui_cuts.checkBox_Emin);
94 connectToLastUpdateSlot(m_d->ui_cuts.checkBox_Emax);
95 connectToLastUpdateSlot(m_d->ui_cuts.doubleSpinBox_Emin);
96 connectToLastUpdateSlot(m_d->ui_cuts.doubleSpinBox_Emax);
97
98 // -> cutAllowedEta:
100 connectToLastUpdateSlot(m_d->ui_cuts.etaPhiCutWidget,SIGNAL(allowedEtaChanged(const VP1Interval&)));
101
102 // -> cutAllowedPhi:
104 connectToLastUpdateSlot(m_d->ui_cuts.etaPhiCutWidget,SIGNAL(allowedPhiChanged(const QList<VP1Interval>&)));
105
106 // -> showVolumeOutLines
108 connectToLastUpdateSlot(m_d->ui_display.checkBox_showVolumeOutLines);
109
110 // -> useTransverseEnergies
112 connectToLastUpdateSlot(m_d->ui.radioButton_energyMode_Et);
113 connectToLastUpdateSlot(m_d->ui.radioButton_energyMode_E);
114
115 initLastVars();
116}
117
118//____________________________________________________________________
123
124
125//____________________________________________________________________
127{
128 return 3;
129}
130
131//____________________________________________________________________
133{
134 //version 0 had an integer here
135 s.save(m_d->ui_display.checkBox_logscale);
136 s.save(m_d->ui_display.radioButton_relativeScale,m_d->ui_display.radioButton_absoluteScale);
137 s.save(m_d->ui_display.doubleSpinBox_lengthOfMostEnergetic);
138 s.save(m_d->ui_display.doubleSpinBox_lengthOf10GeV);
139 s.save(m_d->ui_cuts.checkBox_Emin);
140 s.save(m_d->ui_cuts.doubleSpinBox_Emin);
141 s.save(m_d->ui_cuts.checkBox_Emax);
142 s.save(m_d->ui_cuts.doubleSpinBox_Emax);
143 s.save(m_d->ui_cuts.etaPhiCutWidget);
144 s.save(m_d->ui_int.checkBox_printinfo);//Version 1+
145 s.save(m_d->ui_int.checkBox_printinfo_verbose);//Version 1+
146 s.save(m_d->ui_int.checkBox_zoom);//Version 1+
147 s.save(m_d->ui_display.checkBox_showVolumeOutLines);//Version 2+
148 s.save(m_d->ui_display.widget_drawOptions);//Version 2+
149 s.save(m_d->ui.radioButton_energyMode_Et,m_d->ui.radioButton_energyMode_E);//Version 3+
150}
151
152//____________________________________________________________________
154{
155 if (s.version()<0||s.version()>3) {
156 message("Warning: State data in .vp1 file has unsupported version ("+str(s.version())+")");
157 return;
158 }
159 if (s.version()==0)
160 s.ignoreInt();
161 s.restore(m_d->ui_display.checkBox_logscale);
162 s.restore(m_d->ui_display.radioButton_relativeScale,m_d->ui_display.radioButton_absoluteScale);
163 s.restore(m_d->ui_display.doubleSpinBox_lengthOfMostEnergetic);
164 s.restore(m_d->ui_display.doubleSpinBox_lengthOf10GeV);
165 s.restore(m_d->ui_cuts.checkBox_Emin);
166 s.restore(m_d->ui_cuts.doubleSpinBox_Emin);
167 s.restore(m_d->ui_cuts.checkBox_Emax);
168 s.restore(m_d->ui_cuts.doubleSpinBox_Emax);
169 s.restore(m_d->ui_cuts.etaPhiCutWidget);
170 if (s.version()>=1) {
171 s.restore(m_d->ui_int.checkBox_printinfo);
172 s.restore(m_d->ui_int.checkBox_printinfo_verbose);
173 s.restore(m_d->ui_int.checkBox_zoom);
174 }
175 if (s.version()>=2) {
176 s.restore(m_d->ui_display.checkBox_showVolumeOutLines);
177 s.restore(m_d->ui_display.widget_drawOptions);
178 }
179 if (s.version()>=3)
180 s.restore(m_d->ui.radioButton_energyMode_Et,m_d->ui.radioButton_energyMode_E);
181}
182
183//____________________________________________________________________
185{
186 return m_d->collWidget;
187}
188
189
190//____________________________________________________________________
192{
193 const double cracketa = VP1CaloClusterCollection::crackEta();
194 bool save = m_d->ui_cuts.etaPhiCutWidget->blockSignals(true);
195
196 if (sender()==m_d->ui_cuts.toolButton_quicketa_barrel)
197 m_d->ui_cuts.etaPhiCutWidget->setEtaCut(cracketa);
198 else if (sender()==m_d->ui_cuts.toolButton_quicketa_endcapA)
199 m_d->ui_cuts.etaPhiCutWidget->setEtaCut(cracketa,9.0);
200 else if (sender()==m_d->ui_cuts.toolButton_quicketa_endcapC)
201 m_d->ui_cuts.etaPhiCutWidget->setEtaCut(-9.0,-cracketa);
202 else
203 message("ERROR: Unknown sender() in etaCutPresetButtonTriggered() slot.");
204
205 m_d->ui_cuts.etaPhiCutWidget->blockSignals(save);
207}
208
209//____________________________________________________________________
211{
212 return m_d->ui_display.widget_drawOptions->drawOptionsGroup();
213}
214
215//____________________________________________________________________
216bool CaloClusterSysController::printInfoOnClick() const { return m_d->ui_int.checkBox_printinfo->isChecked(); }
217bool CaloClusterSysController::printVerboseInfoOnClick() const { return m_d->ui_int.checkBox_printinfo_verbose->isChecked(); }
218bool CaloClusterSysController::zoomOnClick() const { return m_d->ui_int.checkBox_zoom->isChecked(); }
219
220//____________________________________________________________________
221QPair<bool,double> CaloClusterSysController::scale() const
222{
223 const bool relative = m_d->ui_display.radioButton_relativeScale->isChecked();
224 const bool logscale = m_d->ui_display.checkBox_logscale->isChecked();
225
226 double highestvisibleenergy=0*CLHEP::eV;
227 for(VP1StdCollection* stdcol : m_d->collWidget->visibleStdCollections()) {
228 VP1CaloClusterCollection* col = dynamic_cast<VP1CaloClusterCollection*>(stdcol);
229 if ( col && highestvisibleenergy < col->highestVisibleClusterEnergy() )
230 highestvisibleenergy = col->highestVisibleClusterEnergy();
231 }
232 if (m_d->gui_mostEnergetic!=highestvisibleenergy) {
233 m_d->gui_mostEnergetic=highestvisibleenergy;
234 m_d->ui_display.label_current_most_energetic->setText("Current value: "+QString::number(m_d->gui_mostEnergetic/CLHEP::GeV,'f',2)+" GeV");
235 }
236
237 const double length = (relative ? m_d->ui_display.doubleSpinBox_lengthOfMostEnergetic->value()*CLHEP::m
238 : m_d->ui_display.doubleSpinBox_lengthOf10GeV->value()*CLHEP::m );
239 const double energy = relative ? highestvisibleenergy : 10*CLHEP::GeV;
240 const double minscale = 1*CLHEP::mm/(1*CLHEP::GeV);
241 const double maxscale = 1*CLHEP::m/(1*CLHEP::MeV);
242 double scl;
243 if (energy<=0)
244 scl = maxscale;
245 else
246 scl = logscale ? length/log(1+fabs(energy)) :length/energy;
247 if (scl!=scl||scl>maxscale)
248 scl = maxscale;
249 if (scl<minscale)
250 scl = minscale;
251 return QPair<bool,double>(logscale,scl);
252}
253
254//____________________________________________________________________
256{
257 const double min = (m_d->ui_cuts.checkBox_Emin->isChecked() ? m_d->ui_cuts.doubleSpinBox_Emin->value()*CLHEP::GeV : -std::numeric_limits<double>::infinity());
258 const double max = (m_d->ui_cuts.checkBox_Emax->isChecked() ? m_d->ui_cuts.doubleSpinBox_Emax->value()*CLHEP::GeV : std::numeric_limits<double>::infinity());
259 if (max<min)
260 return VP1Interval();
261 return VP1Interval( min, max );
262}
263
264//____________________________________________________________________
266{
267 return m_d->ui_cuts.etaPhiCutWidget->allowedEta();
268}
269
270//____________________________________________________________________
272{
273 return m_d->ui_cuts.etaPhiCutWidget->allowedPhi();
274}
275
276//____________________________________________________________________
278{
279 return m_d->ui_display.checkBox_showVolumeOutLines->isChecked();
280}
281
283{
284 return m_d->ui.radioButton_energyMode_Et->isChecked();
285}
286
288// Test for possible changes in values and emit signals as appropriate:
289// (possibleChange_XXX() slots code provided by macros)
290#define VP1CONTROLLERCLASSNAME CaloClusterSysController
292POSSIBLECHANGE_IMP(cutAllowedEnergies)
293POSSIBLECHANGE_IMP(cutAllowedEta)
294POSSIBLECHANGE_IMP(cutAllowedPhi)
296POSSIBLECHANGE_IMP(showVolumeOutLines)
297POSSIBLECHANGE_IMP(useTransverseEnergies)
double length(const pvec &v)
#define POSSIBLECHANGE_IMP(x)
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
Ui::VP1CaloClusterControllerForm ui
Ui::CaloClusterSysSettingsCutsForm ui_cuts
Ui::CaloClusterSysSettingsDisplayForm ui_display
Ui::CaloClusterSysSettingsInteractionsForm ui_int
VP1CollectionWidget * collWidget() const
void possibleChange_showVolumeOutLines()
void possibleChange_useTransverseEnergies()
QList< VP1Interval > cutAllowedPhi() const
static QString toString(const T &t)
void possibleChange_cutAllowedEnergies()
void actualSaveSettings(VP1Serialise &) const
QPair< bool, double > scale() const
void actualRestoreSettings(VP1Deserialise &)
void initDialog(T &theUI, QPushButton *launchbutton, QAbstractButton *enabledButton=0)
void connectToLastUpdateSlot(QObject *sender, const char *signal)
void setupCollWidgetInScrollArea(QScrollArea *scrollarea, VP1CollectionWidget *collWidget)
const char * addUpdateSlot(const char *slot)
VP1Controller(IVP1System *sys, const QString &classname)
void message(const QString &) const