calorimeters.C

Go to the documentation of this file.
00001 // @(#)root/eve:$Id: calorimeters.C 26568 2008-12-01 20:55:50Z matevz $
00002 // Author: Alja Mrak-Tadel
00003 
00004 // Demonstrates usage of EVE calorimetry classes.
00005 
00006 #include "TEveProjections.h"
00007 
00008 const char* histFile =
00009    "http://amraktad.web.cern.ch/amraktad/cms_calo_hist.root";
00010 
00011 void add_jet(TEveElement*, const char*, Float_t, Float_t, Float_t, Float_t);
00012 
00013 void calorimeters()
00014 {
00015    gSystem->IgnoreSignal(kSigSegmentationViolation, true);
00016    TEveManager::Create();
00017 
00018    // event data
00019    TFile::SetCacheFileDir(".");
00020    TFile* hf = TFile::Open(histFile, "CACHEREAD");
00021    TH2F* ecalHist = (TH2F*)hf->Get("ecalLego");
00022    TH2F* hcalHist = (TH2F*)hf->Get("hcalLego");
00023    TEveCaloDataHist* data = new TEveCaloDataHist();
00024    data->AddHistogram(ecalHist);
00025    data->RefSliceInfo(0).Setup("ECAL", 0.3, kBlue);
00026    data->AddHistogram(hcalHist);
00027    data->RefSliceInfo(1).Setup("HCAL", 0.1, kRed);
00028    data->GetEtaBins()->SetTitleFont(120);
00029    data->GetEtaBins()->SetTitle("h");
00030    data->GetPhiBins()->SetTitleFont(120);
00031    data->GetPhiBins()->SetTitle("f");
00032    data->IncDenyDestroy();
00033    gEve->AddToListTree(data, kFALSE);
00034 
00035 
00036    // first tab
00037    TEveCaloLego* lego = MakeCaloLego(data, 0);
00038 
00039    //
00040    // second tab
00041    //
00042 
00043    // frames
00044    TEveWindowSlot* slot =
00045       TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
00046    TEveWindowPack* packH = slot->MakePack();
00047    packH->SetElementName("Projections");
00048    packH->SetHorizontal();
00049    packH->SetShowTitleBar(kFALSE);
00050 
00051    slot = packH->NewSlot();
00052    TEveWindowPack* pack0 = slot->MakePack();
00053    pack0->SetShowTitleBar(kFALSE);
00054    TEveWindowSlot*  slotLeftTop   = pack0->NewSlot();
00055    TEveWindowSlot* slotLeftBottom = pack0->NewSlot();
00056 
00057    slot = packH->NewSlot();
00058    TEveWindowPack* pack1 = slot->MakePack();
00059    pack1->SetShowTitleBar(kFALSE);
00060    TEveWindowSlot* slotRightTop    = pack1->NewSlot();
00061    TEveWindowSlot* slotRightBottom = pack1->NewSlot();
00062 
00063    // viewers ans scenes in second tab
00064    TEveCalo3D* calo3d = MakeCalo3D(data, slotRightTop);
00065    MakeCalo2D(calo3d, slotLeftTop, TEveProjection::kPT_RPhi);
00066    MakeCalo2D(calo3d, slotLeftBottom, TEveProjection::kPT_RhoZ);
00067    TEveCaloLego* lego = MakeCaloLego(data, slotRightBottom);
00068 
00069 
00070    gEve->GetBrowser()->GetTabRight()->SetTab(1);
00071    gEve->Redraw3D(kTRUE);
00072 }
00073 
00074 //______________________________________________________________________________
00075 TEveCaloLego* MakeCaloLego(TEveCaloData* data, TEveWindowSlot* slot)
00076 {
00077    // Eta-phi lego view.
00078 
00079    TEveViewer* v;
00080    TEveScene* s;
00081    if (slot)
00082    {
00083       TEveViewer* v; TEveScene* s;
00084       MakeViewerScene(slot, v, s);
00085    } else {
00086       v = gEve->GetDefaultViewer();
00087       s = gEve->GetEventScene();
00088    }
00089    v->SetElementName("Viewer - Lego");
00090    s->SetElementName("Scene - Lego");
00091 
00092    gStyle->SetPalette(1, 0);
00093    TEveCaloLego* lego = new TEveCaloLego(data);
00094    s->AddElement(lego);
00095 
00096    // By the default lego extends is (1x1x1). Resize it to put in 'natural' 
00097    // coordinates, so that y extend in 2*Pi and set height of lego two times
00098    //  smaller than y extend to have better view in 3D perspective.
00099    lego->InitMainTrans();
00100    lego->RefMainTrans().SetScale(TMath::TwoPi(), TMath::TwoPi(), TMath::Pi());
00101 
00102    // draws scales and axis on borders of window
00103    TGLViewer* glv = v->GetGLViewer();
00104    TEveCaloLegoOverlay* overlay = new TEveCaloLegoOverlay();
00105    glv->AddOverlayElement(overlay);
00106    overlay->SetCaloLego(lego);
00107 
00108    // set event handler to move from perspective to orthographic view.
00109    glv->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
00110    glv->SetEventHandler
00111       (new TEveLegoEventHandler(glv->GetGLWidget(), glv, lego));
00112    gEve->AddToListTree(lego, kTRUE);
00113 
00114    return lego;
00115 }
00116 
00117 //______________________________________________________________________________
00118 TEveCalo3D* MakeCalo3D(TEveCaloData* data, TEveWindowSlot* slot)
00119 {
00120    // 3D catersian view.
00121 
00122    TEveViewer* v; TEveScene* s;
00123    MakeViewerScene(slot, v, s);
00124    v->SetElementName("Viewer - 3D");
00125    s->SetElementName("Scene - 3D");
00126 
00127    TEveCalo3D* calo3d = new TEveCalo3D(data);
00128    calo3d->SetBarrelRadius(129.00);
00129    calo3d->SetEndCapPos(268.36);
00130    s->AddElement(calo3d);
00131 
00132    add_jet(calo3d, "JetCone Lojz",  1.4,  1.0, 0.4, 0.2);
00133    add_jet(calo3d, "JetCone Mici", -2.0, -2.1, 0.2, 0.4);
00134 
00135    return calo3d;
00136 }
00137 
00138 //______________________________________________________________________________
00139 TEveCalo2D* MakeCalo2D(TEveCalo3D* calo3d, TEveWindowSlot* slot,
00140                        TEveProjection::EPType_e t)
00141 {
00142    // Projected calorimeter.
00143 
00144    TEveViewer* v; TEveScene* s;
00145    MakeViewerScene(slot, v, s);
00146    v->SetElementName("Viewer - 2D");
00147    s->SetElementName("Scene - 2D");
00148 
00149    TEveProjectionManager* mng = new TEveProjectionManager();
00150    mng->SetProjection(t);
00151 
00152    TEveProjectionAxes* axes = new TEveProjectionAxes(mng);
00153    s->AddElement(axes);
00154    TEveCalo2D* calo2d = (TEveCalo2D*) mng->ImportElements(calo3d);
00155    s->AddElement(calo2d);
00156 
00157    v->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
00158 
00159    gEve->AddToListTree(mng, kTRUE);
00160    gEve->AddToListTree(calo2d, kTRUE);
00161 
00162    return calo2d;
00163 }
00164 
00165 //______________________________________________________________________________
00166 void MakeViewerScene(TEveWindowSlot* slot, TEveViewer*& v, TEveScene*& s)
00167 {
00168    // Create a scene and a viewer in the given slot.
00169 
00170    v = new TEveViewer("Viewer");
00171    v->SpawnGLViewer(gEve->GetEditor());
00172    slot->ReplaceWindow(v);
00173    gEve->GetViewers()->AddElement(v);
00174    s = gEve->SpawnNewScene("Scene");
00175    v->AddScene(s);
00176 }
00177 
00178 //______________________________________________________________________________
00179 void add_jet(TEveElement* parent, const char* name,
00180              Float_t eta, Float_t phi,
00181              Float_t deta, Float_t dphi)
00182 {
00183    TEveJetCone* jet = new TEveJetCone(name, name);
00184    jet->SetMainTransparency(60);
00185    jet->SetLineColor(kRed);
00186    jet->SetCylinder(129 - 10, 268.36 - 10);
00187    jet->AddEllipticCone(eta, phi, deta, dphi);
00188    jet->SetPickable(kTRUE);
00189    parent->AddElement(jet);
00190 }

Generated on Tue Jul 5 15:43:50 2011 for ROOT_528-00b_version by  doxygen 1.5.1