File indexing completed on 2024-07-18 23:17:43
0001
0002
0003
0004
0005
0006
0007
0008 #include <fstream>
0009 #include <cassert>
0010
0011 #include <functional>
0012
0013 #include "TEveWindow.h"
0014 #include "TGComboBox.h"
0015 #include "TGLabel.h"
0016 #include "TGTextEntry.h"
0017 #include "TVirtualX.h"
0018
0019
0020
0021 #include "Fireworks/Core/interface/FWColorManager.h"
0022 #include "Fireworks/Core/interface/FWConfiguration.h"
0023 #include "Fireworks/Core/interface/FWTriggerTableView.h"
0024 #include "Fireworks/Core/interface/FWTriggerTableViewManager.h"
0025 #include "Fireworks/Core/interface/FWEventItem.h"
0026 #include "Fireworks/Core/interface/FWTriggerTableViewTableManager.h"
0027 #include "Fireworks/Core/interface/FWJobMetadataManager.h"
0028 #include "Fireworks/Core/interface/CmsShowViewPopup.h"
0029 #include "Fireworks/Core/interface/FWGUIManager.h"
0030 #include "Fireworks/Core/interface/fwLog.h"
0031 #include "Fireworks/TableWidget/interface/FWTableWidget.h"
0032
0033 #include "DataFormats/FWLite/interface/Event.h"
0034
0035
0036
0037 static const std::string kSortColumn = "sortColumn";
0038 static const std::string kDescendingSort = "descendingSort";
0039
0040
0041
0042
0043
0044 FWTriggerTableView::FWTriggerTableView(TEveWindowSlot* iParent, FWViewType::EType id)
0045 : FWViewBase(id, 2),
0046 m_regex(this, "Filter", std::string()),
0047 m_process(this, "Process", std::string((id == FWViewType::FWViewType::kTableHLT) ? "HLT" : "")),
0048 m_tableManager(new FWTriggerTableViewTableManager(this)),
0049 m_combo(nullptr),
0050 m_eveWindow(nullptr),
0051 m_vert(nullptr),
0052 m_tableWidget(nullptr),
0053 m_processList(nullptr) {
0054 m_regex.changed_.connect(std::bind(&FWTriggerTableView::dataChanged, this));
0055
0056 m_eveWindow = iParent->MakeFrame(nullptr);
0057 TGCompositeFrame* frame = m_eveWindow->GetGUICompositeFrame();
0058
0059 m_vert = new TGVerticalFrame(frame);
0060 frame->AddFrame(m_vert, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
0061
0062
0063 m_columns.push_back(Column("Name"));
0064
0065 m_tableWidget = new FWTableWidget(m_tableManager, frame);
0066 m_tableWidget->SetHeaderBackgroundColor(gVirtualX->GetPixel(kWhite));
0067
0068 m_tableWidget->Connect(
0069 "columnClicked(Int_t,Int_t,Int_t)", "FWTriggerTableView", this, "columnSelected(Int_t,Int_t,Int_t)");
0070 m_vert->AddFrame(m_tableWidget, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
0071
0072 frame->MapSubwindows();
0073 frame->Layout();
0074 frame->MapWindow();
0075 }
0076
0077 FWTriggerTableView::~FWTriggerTableView() {
0078
0079 TGCompositeFrame* frame = m_eveWindow->GetGUICompositeFrame();
0080 frame->RemoveFrame(m_vert);
0081 delete m_vert;
0082
0083 m_eveWindow->DestroyWindowAndSlot();
0084 delete m_tableManager;
0085 }
0086
0087 void FWTriggerTableView::setBackgroundColor(Color_t iColor) {
0088 m_backgroundColor = iColor;
0089 m_tableWidget->SetBackgroundColor(gVirtualX->GetPixel(iColor));
0090 m_tableWidget->SetLineSeparatorColor(gVirtualX->GetPixel(iColor == kWhite ? kBlack : kWhite));
0091 }
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111 void FWTriggerTableView::dataChanged() {
0112 for (std::vector<Column>::iterator i = m_columns.begin(); i != m_columns.end(); ++i)
0113 (*i).values.clear();
0114
0115 edm::EventBase* base = const_cast<edm::EventBase*>(FWGUIManager::getGUIManager()->getCurrentEvent());
0116 if (fwlite::Event* event = dynamic_cast<fwlite::Event*>(base))
0117 fillTable(event);
0118
0119 m_tableManager->dataChanged();
0120 }
0121
0122 void FWTriggerTableView::columnSelected(Int_t iCol, Int_t iButton, Int_t iKeyMod) {}
0123
0124
0125
0126 void FWTriggerTableView::addTo(FWConfiguration& iTo) const {
0127 FWConfigurableParameterizable::addTo(iTo);
0128 FWConfiguration sortColumn(m_tableWidget->sortedColumn());
0129 iTo.addKeyValue(kSortColumn, sortColumn);
0130 FWConfiguration descendingSort(m_tableWidget->descendingSort());
0131 iTo.addKeyValue(kDescendingSort, descendingSort);
0132 }
0133
0134 void FWTriggerTableView::setFrom(const FWConfiguration& iFrom) {
0135 const FWConfiguration* main = &iFrom;
0136
0137
0138 if (version() < 2) {
0139 if (typeId() == FWViewType::kTableHLT)
0140 main = iFrom.valueForKey("HLTTriggerTableView");
0141 else
0142 main = iFrom.valueForKey("L1TriggerTableView");
0143 }
0144
0145 const FWConfiguration* sortColumn = main->valueForKey(kSortColumn);
0146 const FWConfiguration* descendingSort = main->valueForKey(kDescendingSort);
0147 if (sortColumn != nullptr && descendingSort != nullptr) {
0148 unsigned int sort = sortColumn->version();
0149 bool descending = descendingSort->version();
0150 if (sort < ((unsigned int)m_tableManager->numberOfColumns()))
0151 m_tableWidget->sort(sort, descending);
0152 }
0153
0154 if (typeId() == FWViewType::kTableHLT) {
0155 const FWConfiguration* vp = iFrom.valueForKey("Process");
0156 if (vp && (vp->value() != m_process.value()))
0157 m_process.setFrom(iFrom);
0158 }
0159
0160 {
0161 const FWConfiguration* vp = iFrom.valueForKey("Filter");
0162 if (vp && (vp->value() != m_regex.value()))
0163 m_regex.setFrom(iFrom);
0164 }
0165 }
0166
0167
0168
0169 void FWTriggerTableView::resetCombo() const {
0170 if (m_combo && m_processList) {
0171 m_combo->RemoveAll();
0172 int cnt = 0;
0173 int id = -1;
0174 for (std::vector<std::string>::iterator i = m_processList->begin(); i != m_processList->end(); ++i) {
0175 if (m_process.value() == *i)
0176 id = cnt;
0177
0178 m_combo->AddEntry((*i).c_str(), cnt);
0179 cnt++;
0180 }
0181
0182 if (id < 0) {
0183
0184 m_combo->AddEntry(m_process.value().c_str(), cnt);
0185 id = cnt;
0186 }
0187
0188 m_combo->SortByName();
0189 m_combo->Select(id, false);
0190 }
0191 }
0192
0193 void FWTriggerTableView::processChanged(const char* x) {
0194 m_process.set(x);
0195 dataChanged();
0196 }
0197
0198 bool FWTriggerTableView::isProcessValid() const {
0199 for (std::vector<std::string>::iterator i = m_processList->begin(); i != m_processList->end(); ++i) {
0200 if (*i == m_process.value())
0201 return true;
0202 }
0203 return false;
0204 }
0205
0206 void FWTriggerTableView::populateController(ViewerParameterGUI& gui) const {
0207 gui.requestTab("Style").addParam(&m_regex);
0208
0209
0210 TGCompositeFrame* parent = gui.getTabContainer();
0211 TGFrameElement* el = (TGFrameElement*)parent->GetList()->Last();
0212 el->fLayout->SetLayoutHints(kLHintsNormal);
0213 el->fFrame->Resize(180);
0214
0215
0216 if (typeId() == FWViewType::kTableHLT) {
0217 TGHorizontalFrame* f = new TGHorizontalFrame(gui.getTabContainer());
0218 gui.getTabContainer()->AddFrame(f, new TGLayoutHints(kLHintsNormal, 2, 2, 2, 2));
0219
0220 m_combo = new TGComboBox(f);
0221 f->AddFrame(m_combo);
0222 m_combo->Resize(140, 20);
0223 f->AddFrame(new TGLabel(f, "Process"), new TGLayoutHints(kLHintsLeft, 8, 2, 2, 2));
0224
0225 resetCombo();
0226 FWTriggerTableView* tt = (FWTriggerTableView*)this;
0227 m_combo->Connect("Selected(const char*)", "FWTriggerTableView", tt, "processChanged(const char*)");
0228 }
0229 }
0230
0231 void FWTriggerTableView::saveImageTo(const std::string& ) const {
0232 TString format;
0233 TString data;
0234 FWTextTableCellRenderer* textRenderer;
0235
0236
0237 std::vector<size_t> widths(m_tableManager->numberOfColumns());
0238
0239 for (int c = 0; c < m_tableManager->numberOfColumns(); ++c)
0240 widths[c] = m_columns[c].title.size();
0241
0242 for (int c = 0; c < m_tableManager->numberOfColumns(); ++c) {
0243 for (int r = 0; r < m_tableManager->numberOfRows(); r++) {
0244 textRenderer = (FWTextTableCellRenderer*)m_tableManager->cellRenderer(r, c);
0245 size_t ss = textRenderer->data().size();
0246 if (widths[c] < ss)
0247 widths[c] = ss;
0248 }
0249 }
0250
0251 int rlen = 0;
0252 for (size_t c = 0; c < (size_t)m_tableManager->numberOfColumns(); ++c)
0253 rlen += widths[c];
0254 rlen += (m_tableManager->numberOfColumns() - 1) * 3;
0255 rlen++;
0256
0257 printf("\n");
0258 int lastCol = m_tableManager->numberOfColumns() - 1;
0259
0260 for (int c = 0; c < m_tableManager->numberOfColumns(); ++c) {
0261 format.Form("%%%ds", (int)widths[c]);
0262 data.Form(format, m_columns[c].title.c_str());
0263 if (c == lastCol)
0264 printf("%s", data.Data());
0265 else
0266 printf("%s | ", data.Data());
0267 }
0268 printf("\n");
0269
0270 std::string splitter(rlen, '-');
0271 std::cout << splitter << std::endl;
0272
0273 for (int r = 0; r < m_tableManager->numberOfRows(); r++) {
0274 for (int c = 0; c < m_tableManager->numberOfColumns(); ++c) {
0275 format.Form("%%%ds", (int)widths[c]);
0276 textRenderer = (FWTextTableCellRenderer*)m_tableManager->cellRenderer(r, c);
0277 data.Form(format, textRenderer->data().c_str());
0278 if (c == lastCol)
0279 printf("%s", data.Data());
0280 else
0281 printf("%s | ", data.Data());
0282 }
0283 printf("\n");
0284 }
0285 }