00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <fstream>
00010
00011 #include "TEveWindow.h"
00012 #include "TGComboBox.h"
00013 #include "TGLabel.h"
00014 #include "TGTextEntry.h"
00015
00016
00017
00018 #include "Fireworks/Core/interface/FWColorManager.h"
00019 #include "Fireworks/Core/interface/FWConfiguration.h"
00020 #include "Fireworks/Core/interface/FWTriggerTableView.h"
00021 #include "Fireworks/Core/interface/FWTriggerTableViewManager.h"
00022 #include "Fireworks/Core/interface/FWEventItem.h"
00023 #include "Fireworks/Core/interface/FWTriggerTableViewTableManager.h"
00024 #include "Fireworks/Core/interface/FWJobMetadataManager.h"
00025 #include "Fireworks/Core/interface/CmsShowViewPopup.h"
00026 #include "Fireworks/Core/interface/FWGUIManager.h"
00027 #include "Fireworks/Core/interface/fwLog.h"
00028 #include "Fireworks/TableWidget/interface/FWTableWidget.h"
00029
00030
00031 #include "DataFormats/FWLite/interface/Event.h"
00032
00033
00034 static const std::string kColumns = "columns";
00035 static const std::string kSortColumn = "sortColumn";
00036 static const std::string kDescendingSort = "descendingSort";
00037
00038
00039
00040
00041
00042 FWTriggerTableView::FWTriggerTableView (TEveWindowSlot* iParent, FWViewType::EType id)
00043 : FWViewBase(id, 2),
00044 m_regex(this,"Filter",std::string()),
00045 m_process(this,"Process",std::string((id == FWViewType::FWViewType::kTableHLT) ? "HLT" : "")),
00046 m_tableManager(new FWTriggerTableViewTableManager(this)),
00047 m_combo(0),
00048 m_eveWindow(0),
00049 m_vert(0),
00050 m_tableWidget(0),
00051 m_processList(0)
00052 {
00053 m_regex.changed_.connect(boost::bind(&FWTriggerTableView::dataChanged,this));
00054
00055
00056 m_eveWindow = iParent->MakeFrame(0);
00057 TGCompositeFrame *frame = m_eveWindow->GetGUICompositeFrame();
00058
00059 m_vert = new TGVerticalFrame(frame);
00060 frame->AddFrame(m_vert, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
00061
00062
00063 m_columns.push_back( Column( "Name" ));
00064
00065 m_tableWidget = new FWTableWidget(m_tableManager, frame);
00066 m_tableWidget->SetHeaderBackgroundColor( gVirtualX->GetPixel( kWhite ));
00067
00068 m_tableWidget->Connect("columnClicked(Int_t,Int_t,Int_t)", "FWTriggerTableView",
00069 this, "columnSelected(Int_t,Int_t,Int_t)");
00070 m_vert->AddFrame(m_tableWidget, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
00071
00072 frame->MapSubwindows();
00073 frame->Layout();
00074 frame->MapWindow();
00075 }
00076
00077 FWTriggerTableView::~FWTriggerTableView()
00078 {
00079
00080 TGCompositeFrame *frame = m_eveWindow->GetGUICompositeFrame();
00081 frame->RemoveFrame( m_vert );
00082 delete m_vert;
00083
00084 m_eveWindow->DestroyWindowAndSlot();
00085 delete m_tableManager;
00086 }
00087
00088 void
00089 FWTriggerTableView::setBackgroundColor(Color_t iColor)
00090 {
00091 m_backgroundColor = iColor;
00092 m_tableWidget->SetBackgroundColor(gVirtualX->GetPixel(iColor));
00093 m_tableWidget->SetLineSeparatorColor( gVirtualX->GetPixel(iColor == kWhite ? kBlack : kWhite));
00094 }
00095
00096
00097
00098
00099
00100 void
00101 FWTriggerTableView::saveImageTo( const std::string& iName ) const
00102 {
00103 std::string fileName = iName + ".txt";
00104 std::ofstream triggers( fileName.c_str() );
00105
00106 triggers << m_columns[2].title << " " << m_columns[0].title << "\n";
00107 for( unsigned int i = 0, vend = m_columns[0].values.size(); i != vend; ++i )
00108 if( m_columns[1].values[i] == "1" )
00109 triggers << m_columns[2].values[i] << "\t" << m_columns[0].values[i] << "\n";
00110 triggers.close();
00111 }
00112
00113
00114 void FWTriggerTableView::dataChanged ()
00115 {
00116 for(std::vector<Column>::iterator i = m_columns.begin(); i!= m_columns.end(); ++i)
00117 (*i).values.clear();
00118
00119 edm::EventBase *base = const_cast<edm::EventBase*>(FWGUIManager::getGUIManager()->getCurrentEvent());
00120 if (fwlite::Event* event = dynamic_cast<fwlite::Event*>(base))
00121 fillTable(event);
00122
00123 m_tableManager->dataChanged();
00124 }
00125
00126 void
00127 FWTriggerTableView::columnSelected (Int_t iCol, Int_t iButton, Int_t iKeyMod)
00128 {
00129 }
00130
00131
00132
00133
00134 void
00135 FWTriggerTableView::addTo( FWConfiguration& iTo ) const
00136 {
00137 FWConfigurableParameterizable::addTo(iTo);
00138 FWConfiguration sortColumn( m_tableWidget->sortedColumn());
00139 iTo.addKeyValue( kSortColumn, sortColumn );
00140 FWConfiguration descendingSort( m_tableWidget->descendingSort());
00141 iTo.addKeyValue( kDescendingSort, descendingSort );
00142 }
00143
00144 void
00145 FWTriggerTableView::setFrom( const FWConfiguration& iFrom )
00146 {
00147 const FWConfiguration *main = &iFrom;
00148
00149
00150 if (version() < 2)
00151 {
00152 if (typeId() == FWViewType::kTableHLT)
00153 main = iFrom.valueForKey( "HLTTriggerTableView" );
00154 else
00155 main = iFrom.valueForKey( "L1TriggerTableView" );
00156 }
00157
00158 const FWConfiguration *sortColumn = main->valueForKey( kSortColumn );
00159 const FWConfiguration *descendingSort = main->valueForKey( kDescendingSort );
00160 if( sortColumn != 0 && descendingSort != 0 )
00161 {
00162 unsigned int sort = sortColumn->version();
00163 bool descending = descendingSort->version();
00164 if( sort < (( unsigned int ) m_tableManager->numberOfColumns()))
00165 m_tableWidget->sort( sort, descending );
00166 }
00167
00168 if ( typeId() == FWViewType::kTableHLT )
00169 {
00170 const FWConfiguration* vp = iFrom.valueForKey("Process" );
00171 if ( vp && (vp->value() != m_process.value()))
00172 m_process.setFrom(iFrom);
00173 }
00174
00175 {
00176 const FWConfiguration* vp = iFrom.valueForKey("Filter" );
00177 if (vp && (vp->value() != m_regex.value()))
00178 m_regex.setFrom(iFrom);
00179 }
00180 }
00181
00182
00183
00184 void
00185 FWTriggerTableView::resetCombo() const
00186 {
00187 if (m_combo && m_processList)
00188 {
00189 m_combo->RemoveAll();
00190 int cnt = 0;
00191 int id = -1;
00192 for (std::vector<std::string>::iterator i = m_processList->begin(); i != m_processList->end(); ++i)
00193 {
00194 if (m_process.value() == *i ) id = cnt;
00195
00196 m_combo->AddEntry((*i).c_str(), cnt);
00197 cnt++;
00198 }
00199
00200 if(id < 0)
00201 {
00202
00203 m_combo->AddEntry(m_process.value().c_str(), cnt);
00204 id = cnt;
00205 }
00206
00207 m_combo->SortByName();
00208 m_combo->Select(id, false);
00209 }
00210 }
00211
00212 void
00213 FWTriggerTableView::processChanged(const char* x)
00214 {
00215 m_process.set(x);
00216 dataChanged();
00217 }
00218
00219 bool
00220 FWTriggerTableView::isProcessValid() const
00221 {
00222 for (std::vector<std::string>::iterator i = m_processList->begin(); i!= m_processList->end(); ++i)
00223 {
00224 if (*i == m_process.value())
00225 return true;
00226 }
00227 return false;
00228 }
00229
00230 void
00231 FWTriggerTableView::populateController(ViewerParameterGUI& gui) const
00232 {
00233 gui.requestTab("Style").addParam(&m_regex);
00234
00235
00236 TGCompositeFrame* parent = gui.getTabContainer();
00237 TGFrameElement* el = (TGFrameElement*) parent->GetList()->Last();
00238 el->fLayout->SetLayoutHints(kLHintsNormal);
00239 el->fFrame->Resize(180);
00240
00241
00242 if (typeId() == FWViewType::kTableHLT)
00243 {
00244 TGHorizontalFrame* f = new TGHorizontalFrame(gui.getTabContainer());
00245 gui.getTabContainer()->AddFrame(f, new TGLayoutHints(kLHintsNormal, 2, 2,2,2 ));
00246
00247 m_combo = new TGComboBox(f);
00248 f->AddFrame(m_combo);
00249 m_combo->Resize(140, 20);
00250 f->AddFrame(new TGLabel(f, "Process"), new TGLayoutHints(kLHintsLeft, 8,2,2,2));
00251
00252 resetCombo();
00253 FWTriggerTableView* tt = (FWTriggerTableView*)this;
00254 m_combo->Connect("Selected(const char*)", "FWTriggerTableView", tt, "processChanged(const char*)");
00255 }
00256 }