Ignore:
Timestamp:
10/15/02 17:02:46 (22 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mgui/MCamDisplay.cc

    r1426 r1540  
    2828// MCamDisplay
    2929//
    30 // Camera Display
     30// Camera Display. The Pixels are displayed in
     31// contents/area [somthing/mm^2]
    3132//
    3233////////////////////////////////////////////////////////////////////////////
     
    3839#include <TBox.h>
    3940#include <TText.h>
     41#include <TArrow.h>
    4042#include <TStyle.h>
    4143#include <TCanvas.h>
     
    4547#include "MHexagon.h"
    4648
    47 #include "MGeomPix.h"
    4849#include "MGeomCam.h"
    4950
     
    5152#include "MCerPhotEvt.h"
    5253
     54#include "MPedestalPix.h"
     55#include "MPedestalCam.h"
     56
     57#include "MImgCleanStd.h"
     58
    5359#define kItemsLegend 50 // see SetPalette(1,0)
    5460
     
    6066//
    6167MCamDisplay::MCamDisplay(MGeomCam *geom)
    62     : fAutoScale(kTRUE), fMinPhe(-2), fMaxPhe(50), fW(0), fH(0), fDrawingPad(NULL), fIsAllocated(kFALSE)
     68    : fAutoScale(kTRUE), fW(0), fH(0), fDrawingPad(NULL), fIsAllocated(kFALSE)
    6369{
    6470    fGeomCam = (MGeomCam*)geom; // FIXME: Clone doesn't work! (MGeomCam*)geom->Clone();
     
    108114        newtxt->SetTextAlign(12);
    109115    }
     116
     117    fArrowX = new TArrow(-fRange*.9, -fRange*.9, -fRange*.6, -fRange*.9, 0.025);
     118    fArrowY = new TArrow(-fRange*.9, -fRange*.9, -fRange*.9, -fRange*.6, 0.025);
     119
     120    TString text;
     121    text += (int)(fRange*.3);
     122    text += "mm";
     123
     124    fLegRadius = new TText(-fRange*.85, -fRange*.85, text);
     125    text = "";
     126    text += (float)((int)(fRange*.3*geom->GetConvMm2Deg()*10))/10;
     127    text += "°";
     128    text = text.Strip(TString::kLeading);
     129    fLegDegree = new TText(-fRange*.85, -fRange*.75, text);
     130    fLegRadius->SetTextSize(0.04);
     131    fLegDegree->SetTextSize(0.04);
    110132}
    111133
     
    124146    delete fLegText;
    125147
     148    delete fArrowX;
     149    delete fArrowY;
     150
     151    delete fLegRadius;
     152    delete fLegDegree;
     153
    126154    // delete fGeomCam;
    127155
    128     if (fDrawingPad->GetListOfPrimitives()->FindObject(this)==this &&
    129         fIsAllocated)
     156    // Maybe harmfull! Don't exchange the order!
     157    if (fIsAllocated && fDrawingPad->GetListOfPrimitives()->FindObject(this)==this)
    130158    {
    131159        fDrawingPad->RecursiveRemove(this);
     
    134162}
    135163
    136 inline void MCamDisplay::SetPixColor(const MCerPhotPix &pix, const Int_t i)
    137 {
    138     //
    139     // Fixme: Divide pnum by the (real) area of the pixel
    140     //
    141     const Float_t ratio = (*fGeomCam)[0].GetA()/(*fGeomCam)[i].GetA();
     164inline void MCamDisplay::SetPixColor(const MCerPhotPix &pix, const Int_t i, Float_t min, Float_t max)
     165{
     166    //
     167    // Fixme: Use absolute value per mm^2. Needs another scaling algorithm.
     168    //
     169    const Float_t ratio = fGeomCam->GetPixRatio(i);
    142170    const Float_t pnum  = ratio*pix.GetNumPhotons();
    143171
    144     (*this)[pix.GetPixId()].SetFillColor(GetColor(pnum));
     172    (*this)[pix.GetPixId()].SetFillColor(GetColor(pnum, min, max));
     173}
     174
     175inline void MCamDisplay::SetPixColorPedestal(const MPedestalPix &pix, const Int_t i, Float_t min, Float_t max)
     176{
     177    //
     178    // Fixme: Use absolute value per mm^2. Needs another scaling algorithm.
     179    //
     180    const Float_t ratio = fGeomCam->GetPixRatio(i);
     181    const Float_t pnum  = ratio*pix.GetMean();
     182
     183    (*this)[i].SetFillColor(GetColor(pnum, min, max));
     184}
     185
     186inline void MCamDisplay::SetPixColorError(const MCerPhotPix &pix, const Int_t i, Float_t min, Float_t max)
     187{
     188    //
     189    // Fixme: Use absolute value per mm^2. Needs another scaling algorithm.
     190    //
     191    const Float_t ratio = fGeomCam->GetPixRatio(i);
     192    const Float_t pnum  = ratio*pix.GetErrorPhot();
     193
     194    (*this)[pix.GetPixId()].SetFillColor(GetColor(pnum, min, max));
     195}
     196
     197inline void MCamDisplay::SetPixColorRatio(const MCerPhotPix &pix, Float_t min, Float_t max)
     198{
     199    //
     200    // Fixme: Use absolute value per mm^2. Needs another scaling algorithm.
     201    //
     202    const Float_t pnum  = pix.GetNumPhotons()/pix.GetErrorPhot();
     203    (*this)[pix.GetPixId()].SetFillColor(GetColor(pnum, min, max));
     204}
     205
     206inline void MCamDisplay::SetPixColorLevel(const MCerPhotPix &pix, Float_t lvl1, Float_t lvl2)
     207{
     208    const Int_t maxcolidx = kItemsLegend-1;
     209
     210    MHexagon &hex = (*this)[pix.GetPixId()];
     211
     212    const Float_t r = pix.GetNumPhotons()/pix.GetErrorPhot();
     213
     214    if (r>lvl1)
     215        hex.SetFillColor(fColors[4*maxcolidx/5]);
     216    else
     217        if (r>lvl2)
     218            hex.SetFillColor(fColors[maxcolidx/2]);
     219        else
     220            hex.SetFillColor(fColors[maxcolidx/5]);
    145221}
    146222
     
    189265    //
    190266    gPad->Range(-fRange, -y, x, y);
     267
     268    //
     269    // Make sure, that the correct aspect is always displayed also
     270    // if - by chance - there is not update for the pad after the
     271    // Paint function was called.
     272    //
     273    gPad->Update();
    191274}
    192275
     
    359442    }
    360443
     444    fArrowX->Draw();
     445    fArrowY->Draw();
     446
     447    fLegRadius->Draw();
     448    fLegDegree->Draw();
     449
    361450    //
    362451    // initialize and draw legend
     
    433522        return;
    434523
     524    Draw();
     525
     526    fDrawingPad->cd();
     527
     528    for (int i=0; i<kItemsLegend; i++)
     529        GetBox(i)->SetFillColor(fColors[i]);
     530
     531    //
     532    // Reset pixel colors to default value
     533    //
     534    Reset();
     535
     536    //
     537    //  if the autoscale is true, set the values for the range for
     538    //  each event
     539    //
     540    Float_t min = 0;
     541    Float_t max = 50;
     542    if (fAutoScale)
     543    {
     544        min = event->GetNumPhotonsMin(fGeomCam);
     545        max = event->GetNumPhotonsMax(fGeomCam);
     546
     547        if (max < 20.)
     548            max = 20.;
     549
     550        UpdateLegend(min, max);
     551    }
     552
     553    //
     554    //   update the colors in the picture
     555    //
     556    const Int_t entries = event->GetNumPixels();
     557
     558    for (Int_t i=0; i<entries; i++)
     559    {
     560        const MCerPhotPix &pix = (*event)[i];
     561
     562        if (!pix.IsPixelUsed())
     563            continue;
     564
     565        SetPixColor(pix, i, min, max);
     566    }
     567
     568    //
     569    // Update display physically
     570    //
     571    fDrawingPad->Modified();
     572    fDrawingPad->Update();
     573}
     574
     575// ------------------------------------------------------------------------
     576//
     577// Call this function to draw the number of photo electron into the
     578// camera.
     579//
     580void MCamDisplay::DrawPedestals(const MPedestalCam *event)
     581{
     582    if (!event)
     583        return;
     584
     585    Draw();
     586
     587    fDrawingPad->cd();
     588
     589    for (int i=0; i<kItemsLegend; i++)
     590        GetBox(i)->SetFillColor(fColors[i]);
     591
     592    //
     593    // Reset pixel colors to default value
     594    //
     595    Reset();
     596
     597    //
     598    //  if the autoscale is true, set the values for the range for
     599    //  each event
     600    //
     601    Float_t min = 0;
     602    Float_t max = 50;
     603    if (fAutoScale)
     604    {
     605        min = event->GetMeanMin(fGeomCam);
     606        max = event->GetMeanMax(fGeomCam);
     607
     608        if (max < 20.)
     609            max = 20.;
     610
     611        UpdateLegend(min, max);
     612    }
     613
     614    //
     615    //   update the colors in the picture
     616    //
     617    const Int_t entries = event->GetSize();
     618
     619    for (Int_t i=0; i<entries; i++)
     620        SetPixColorPedestal((*event)[i], i, min, max);
     621
     622    //
     623    // Update display physically
     624    //
     625    fDrawingPad->Modified();
     626    fDrawingPad->Update();
     627}
     628
     629// ------------------------------------------------------------------------
     630//
     631// Call this function to draw the error of number of photo electron
     632// into the camera.
     633//
     634void MCamDisplay::DrawErrorPhot(const MCerPhotEvt *event)
     635{
     636    if (!event)
     637        return;
     638
    435639    if (!fDrawingPad)
    436640        Draw();
     
    450654    //  each event
    451655    //
     656    Float_t min = 0;
     657    Float_t max = 50;
    452658    if (fAutoScale)
    453659    {
    454         fMinPhe = event->GetNumPhotonsMin(fGeomCam);
    455         fMaxPhe = event->GetNumPhotonsMax(fGeomCam);
    456 
    457         if (fMaxPhe < 20.)
    458             fMaxPhe = 20.;
    459 
    460         UpdateLegend();
     660        min = event->GetErrorPhotMin(fGeomCam);
     661        max = event->GetErrorPhotMax(fGeomCam);
     662
     663        if (max < 20.)
     664            max = 20.;
     665
     666        UpdateLegend(min, max);
    461667    }
    462668
     
    473679            continue;
    474680
    475         SetPixColor(pix, i);
     681        SetPixColorError(pix, i, min, max);
    476682    }
    477683
     
    481687    fDrawingPad->Modified();
    482688    fDrawingPad->Update();
     689}
     690
     691// ------------------------------------------------------------------------
     692//
     693// Call this function to draw the ratio of the number of photons
     694// divided by its error
     695//
     696void MCamDisplay::DrawRatio(const MCerPhotEvt *event)
     697{
     698    if (!event)
     699        return;
     700
     701    if (!fDrawingPad)
     702        Draw();
     703
     704    fDrawingPad->cd();
     705
     706    for (int i=0; i<kItemsLegend; i++)
     707        GetBox(i)->SetFillColor(fColors[i]);
     708
     709    //
     710    // Reset pixel colors to default value
     711    //
     712    Reset();
     713
     714    //
     715    //  if the autoscale is true, set the values for the range for
     716    //  each event
     717    //
     718    Float_t min = 0;
     719    Float_t max = 20;
     720    if (fAutoScale)
     721    {
     722        min = event->GetRatioMin();
     723        max = event->GetRatioMax();
     724
     725        UpdateLegend(min, max);
     726    }
     727
     728    //
     729    //   update the colors in the picture
     730    //
     731    const Int_t entries = event->GetNumPixels();
     732
     733    for (Int_t i=0; i<entries; i++)
     734    {
     735        const MCerPhotPix &pix = (*event)[i];
     736
     737        if (!pix.IsPixelUsed())
     738            continue;
     739
     740        SetPixColorRatio(pix, min, max);
     741    }
     742
     743    //
     744    // Update display physically
     745    //
     746    fDrawingPad->Modified();
     747    fDrawingPad->Update();
     748}
     749
     750// ------------------------------------------------------------------------
     751//
     752// Draw the colors in respect to the cleaning levels
     753//
     754void MCamDisplay::DrawLevels(const MCerPhotEvt *event, Float_t lvl1, Float_t lvl2)
     755{
     756    if (!event)
     757        return;
     758
     759    if (!fDrawingPad)
     760        Draw();
     761
     762    fDrawingPad->cd();
     763
     764    for (int i=0; i<kItemsLegend; i++)
     765        GetBox(i)->SetFillColor(fColors[i]);
     766
     767    //
     768    // Reset pixel colors to default value
     769    //
     770    Reset();
     771
     772    //
     773    //   update the colors in the picture
     774    //
     775    const Int_t entries = event->GetNumPixels();
     776
     777    for (Int_t i=0; i<entries; i++)
     778    {
     779        const MCerPhotPix &pix = (*event)[i];
     780
     781        if (!pix.IsPixelUsed())
     782            continue;
     783
     784        SetPixColorLevel(pix, lvl1, lvl2);
     785    }
     786
     787    //
     788    // Update display physically
     789    //
     790    fDrawingPad->Modified();
     791    fDrawingPad->Update();
     792}
     793
     794// ------------------------------------------------------------------------
     795//
     796// Draw the colors in respect to the cleaning levels
     797//
     798void MCamDisplay::DrawLevels(const MCerPhotEvt *event, const MImgCleanStd &clean)
     799{
     800    DrawLevels(event, clean.GetCleanLvl1(), clean.GetCleanLvl2());
    483801}
    484802
     
    504822//   with 0 up to 49.
    505823//
    506 Int_t MCamDisplay::GetColor(Float_t val)
     824Int_t MCamDisplay::GetColor(Float_t val, Float_t min, Float_t max)
    507825{
    508826    //
     
    511829    const Int_t maxcolidx = kItemsLegend-1;
    512830
    513     if (val >= fMaxPhe)
     831    if (val >= max)
    514832        return fColors[maxcolidx];
    515833
    516     if (val <= fMinPhe)
     834    if (val <= min)
    517835        return fColors[0];
    518836
     
    520838    // calculate the color index
    521839    //
    522     const Float_t ratio  = (val-fMinPhe) / (fMaxPhe-fMinPhe);
     840    const Float_t ratio  = (val-min) / (max-min);
    523841    const Int_t   colidx = (Int_t)(ratio*maxcolidx + .5);
    524842
     
    531849//    Display
    532850//
    533 void MCamDisplay::UpdateLegend()
     851void MCamDisplay::UpdateLegend(Float_t minphe, Float_t maxphe)
    534852{
    535853    char text[10];
     
    537855    for (Int_t i=0; i<kItemsLegend; i+=3)
    538856    {
    539         const Float_t val = fMinPhe + (Float_t)i/kItemsLegend * (fMaxPhe-fMinPhe) ;
     857        const Float_t val = minphe + (Float_t)i/kItemsLegend * (maxphe-minphe) ;
    540858
    541859        sprintf(text, "%5.1f", val);
Note: See TracChangeset for help on using the changeset viewer.