00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <boost/bind.hpp>
00016
00017 #include "TAxis.h"
00018 #include "TH2.h"
00019
00020 #include "TGLViewer.h"
00021 #include "TGLLightSet.h"
00022 #include "TGLPerspectiveCamera.h"
00023 #include "TGLOrthoCamera.h"
00024 #include "TEveManager.h"
00025 #include "TEveElement.h"
00026 #include "TEveScene.h"
00027 #include "TEveCalo.h"
00028 #include "TEveTrans.h"
00029 #include "TEveScene.h"
00030 #include "TEveCaloLegoOverlay.h"
00031
00032
00033 #include "Fireworks/Core/interface/FWGLEventHandler.h"
00034 #include "Fireworks/Core/interface/FWConfiguration.h"
00035 #include "Fireworks/Core/interface/FWLegoViewBase.h"
00036 #include "Fireworks/Core/interface/FWViewEnergyScale.h"
00037 #include "Fireworks/Core/interface/FWViewContext.h"
00038 #include "Fireworks/Core/interface/CmsShowViewPopup.h"
00039 #include "Fireworks/Core/interface/fw3dlego_xbins.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 FWLegoViewBase::FWLegoViewBase(TEveWindowSlot* iParent, FWViewType::EType typeId) :
00054 FWEveView(iParent, typeId),
00055 m_lego(0),
00056 m_overlay(0),
00057 m_autoRebin(this,"Auto rebin on zoom-out",false),
00058 m_pixelsPerBin(this, "Pixels per bin", 10., 1., 20.),
00059 m_projectionMode(this, "Projection", 0l, 0l, 2l),
00060 m_cell2DMode(this, "Cell2DMode", 1l, 1l, 2l),
00061 m_drawValuesIn2D(this,"Draw Cell2D threshold (pixels)",40l,16l,200l),
00062 m_showOverlay(this,"Draw scales", true)
00063 {
00064 viewerGL()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
00065 viewerGL()->GetLightSet()->SetUseSpecular(false);
00066
00067 m_projectionMode.addEntry(0, "Auto");
00068 m_projectionMode.addEntry(1, "3D");
00069 m_projectionMode.addEntry(2, "2D");
00070
00071 m_cell2DMode.addEntry(1, "Plain");
00072 m_cell2DMode.addEntry(2, "Outline");
00073 if (typeId == FWViewType::kLegoHF) m_cell2DMode.set(2);
00074
00075 m_autoRebin.changed_.connect(boost::bind(&FWLegoViewBase::setAutoRebin,this));
00076 m_pixelsPerBin.changed_.connect(boost::bind(&FWLegoViewBase::setPixelsPerBin,this));
00077 m_drawValuesIn2D.changed_.connect(boost::bind(&FWLegoViewBase::setFontSizein2D,this));
00078 m_showOverlay.changed_.connect(boost::bind(&FWLegoViewBase::showOverlay,this));
00079 m_projectionMode.changed_.connect(boost::bind(&FWLegoViewBase::setProjectionMode, this));
00080 m_cell2DMode.changed_.connect(boost::bind(&FWLegoViewBase::setCell2DMode, this));
00081 }
00082
00083 FWLegoViewBase::~FWLegoViewBase()
00084 {
00085 viewerGL()->RemoveOverlayElement(m_overlay);
00086 m_lego->Destroy();
00087 }
00088
00089
00090 TEveCaloViz*
00091 FWLegoViewBase::getEveCalo() const
00092 {
00093 return static_cast<TEveCaloViz*>(m_lego);
00094 }
00095
00096 void
00097 FWLegoViewBase::setContext(const fireworks::Context& ctx)
00098 {
00099 FWEveView::setContext(ctx);
00100
00101 TEveCaloData* data;
00102 if (typeId() == FWViewType::kLego) {
00103 data = static_cast<TEveCaloData*>(ctx.getCaloData());
00104 }
00105 else if (typeId() == FWViewType::kLegoHF) {
00106 data = static_cast<TEveCaloData*>(ctx.getCaloDataHF());
00107 }
00108 else
00109 {
00110
00111 TEveCaloDataHist* hdata = new TEveCaloDataHist();
00112 hdata->IncDenyDestroy();
00113
00114 Bool_t status = TH1::AddDirectoryStatus();
00115 TH1::AddDirectory(kFALSE);
00116 TH2F* dummy = new TH2F("background",
00117 "background",
00118 fw3dlego::xbins_n - 1, fw3dlego::xbins,
00119 72, -1*TMath::Pi(), TMath::Pi());
00120
00121 TH1::AddDirectory(status);
00122 Int_t sliceIndex = hdata->AddHistogram(dummy);
00123 (hdata)->RefSliceInfo(sliceIndex).Setup("background", 0., 0);
00124 data = hdata;
00125 }
00126
00127 data->GetEtaBins()->SetNdivisions(710);
00128 data->GetPhiBins()->SetNdivisions(510);
00129 data->GetEtaBins()->SetTitleFont(120);
00130 data->GetEtaBins()->SetTitle("h");
00131 data->GetPhiBins()->SetTitleFont(120);
00132 data->GetPhiBins()->SetTitle("f");
00133 data->GetEtaBins()->SetLabelSize(0.02);
00134 data->GetEtaBins()->SetTitleSize(0.03);
00135
00136 m_lego = new TEveCaloLego(data);
00137 m_lego->Set2DMode((TEveCaloLego::E2DMode_e)m_cell2DMode.value());
00138 m_lego->SetDrawNumberCellPixels(m_drawValuesIn2D.value());
00139 m_lego->SetAutoRebin(m_autoRebin.value());
00140 m_lego->SetPixelsPerBin(m_pixelsPerBin.value());
00141
00142 m_lego->InitMainTrans();
00143 m_lego->RefMainTrans().SetScale(TMath::TwoPi(), TMath::TwoPi(), TMath::Pi());
00144 m_lego->SetScaleAbs(true);
00145
00146
00147 m_lego->SetHasFixedHeightIn2DMode(true);
00148 m_lego->SetFixedHeightValIn2DMode(0.001);
00149 eventScene()->AddElement(m_lego);
00150
00151 TEveLegoEventHandler* eh = dynamic_cast<TEveLegoEventHandler*>( viewerGL()->GetEventHandler());
00152 if (eh) eh->SetLego(m_lego);
00153
00154 m_overlay = new TEveCaloLegoOverlay();
00155 m_overlay->SetCaloLego(m_lego);
00156 m_overlay->SetShowPlane(kFALSE);
00157 m_overlay->SetScalePosition(0.8, 0.6);
00158 m_overlay->SetShowScales(1);
00159 viewerGL()->AddOverlayElement(m_overlay);
00160 }
00161
00162 void
00163 FWLegoViewBase::setAutoRebin()
00164 {
00165 m_lego->SetAutoRebin(m_autoRebin.value());
00166 m_lego->ElementChanged(kTRUE,kTRUE);
00167 }
00168
00169 void
00170 FWLegoViewBase::setPixelsPerBin()
00171 {
00172 m_lego->SetPixelsPerBin((Int_t) (m_pixelsPerBin.value()));
00173 m_lego->ElementChanged(kTRUE,kTRUE);
00174 }
00175
00176 void
00177 FWLegoViewBase::showOverlay()
00178 {
00179 if (m_overlay) m_overlay->SetShowScales(m_showOverlay.value());
00180 viewerGL()->Changed();
00181 gEve->Redraw3D();
00182 }
00183
00184
00185
00186 void
00187 FWLegoViewBase::setFrom(const FWConfiguration& iFrom)
00188 {
00189 FWEveView::setFrom(iFrom);
00190
00191
00192 if (iFrom.version() < 5)
00193 {
00194 const FWConfiguration* value = iFrom.valueForKey( "Cell2DMode" );
00195 if ( value != 0 )
00196 {
00197 int mode;
00198 std::istringstream s(value->value());
00199 s>> mode;
00200 m_cell2DMode.set(mode);
00201 }
00202
00203 }
00204
00205
00206 if (iFrom.version() < 4)
00207 {
00208 bool xb;
00209
00210
00211
00212
00213
00214
00215
00216
00217 {
00218 std::istringstream s(iFrom.valueForKey("Show scales")->value());
00219 s >> xb; m_showOverlay.set(xb);
00220 }
00221 {
00222 std::istringstream s(iFrom.valueForKey("Show scales")->value());
00223 s >> xb; m_showOverlay.set(xb);
00224 }
00225 {
00226 std::istringstream s(iFrom.valueForKey("Auto rebin on zoom")->value());
00227 s >> xb; m_autoRebin.set(xb);
00228 }
00229 }
00230
00231
00232
00233
00234 if (iFrom.version() > 1)
00235 {
00236 bool topView = true;
00237 std::string stateName("topView"); stateName += typeName();
00238 assert( 0 != iFrom.valueForKey(stateName));
00239 std::istringstream s(iFrom.valueForKey(stateName)->value());
00240 s >> topView;
00241
00242
00243 if (topView)
00244 {
00245 viewerGL()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
00246 TGLOrthoCamera* camera = dynamic_cast<TGLOrthoCamera*>( &(viewerGL()->RefCamera(TGLViewer::kCameraOrthoXOY)) );
00247 setFromOrthoCamera(camera, iFrom);
00248 }
00249 else
00250 {
00251 viewerGL()->SetCurrentCamera(TGLViewer::kCameraPerspXOY);
00252 TGLPerspectiveCamera* camera = dynamic_cast<TGLPerspectiveCamera*>(&(viewerGL()->RefCamera(TGLViewer::kCameraPerspXOY)));
00253 setFromPerspectiveCamera(camera, typeName(), iFrom);
00254 }
00255 }
00256 else
00257 {
00258
00259 viewerGL()->ResetCamerasAfterNextUpdate();
00260 }
00261
00262 }
00263
00264 void
00265 FWLegoViewBase::addTo(FWConfiguration& iTo) const
00266 {
00267 FWEveView::addTo(iTo);
00268
00269 bool topView = viewerGL()->CurrentCamera().IsOrthographic();
00270 std::ostringstream s;
00271 s << topView;
00272 std::string name = "topView";
00273 iTo.addKeyValue(name+typeName(),FWConfiguration(s.str()));
00274
00275 if (topView)
00276 {
00277 TGLOrthoCamera* camera = dynamic_cast<TGLOrthoCamera*>(&(viewerGL()->RefCamera(TGLViewer::kCameraOrthoXOY)));
00278 addToOrthoCamera(camera, iTo);
00279 }
00280 else
00281 {
00282 TGLPerspectiveCamera* camera = dynamic_cast<TGLPerspectiveCamera*>(&(viewerGL()->RefCamera(TGLViewer::kCameraPerspXOY)));
00283 addToPerspectiveCamera(camera, typeName(), iTo);
00284 }
00285 }
00286
00287 void
00288 FWLegoViewBase::setFontSizein2D()
00289 {
00290 m_lego->SetDrawNumberCellPixels( m_drawValuesIn2D.value());
00291 m_lego->ElementChanged(kTRUE,kTRUE);
00292 }
00293
00294 void
00295 FWLegoViewBase::setProjectionMode()
00296 {
00297 m_lego->SetProjection((TEveCaloLego::EProjection_e)m_projectionMode.value());
00298 m_lego->ElementChanged();
00299 viewerGL()->Changed();
00300 gEve->Redraw3D();
00301 }
00302
00303 void
00304 FWLegoViewBase::setCell2DMode()
00305 {
00306 m_lego->Set2DMode((TEveCaloLego::E2DMode_e)m_cell2DMode.value());
00307 m_lego->ElementChanged();
00308 viewerGL()->Changed();
00309 gEve->Redraw3D();
00310 }
00311
00312 void
00313 FWLegoViewBase::populateController(ViewerParameterGUI& gui) const
00314 {
00315 FWEveView::populateController(gui);
00316
00317 gui.requestTab("Style").
00318 separator().
00319 addParam(&m_projectionMode).
00320 addParam(&m_cell2DMode).
00321 addParam(&m_drawValuesIn2D);
00322
00323 gui.requestTab("Scales").
00324 separator().
00325 addParam(&m_showOverlay);
00326
00327 gui.requestTab("Rebin").
00328 addParam(&m_autoRebin).
00329 addParam(&m_pixelsPerBin);
00330 }