Changeset 8893 for trunk


Ignore:
Timestamp:
05/19/08 15:44:32 (17 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/Changelog

    r8892 r8893  
    2727     - added MObjLookup
    2828
    29    * mbase/MobjLookup.[h,cc]:
     29   * mbase/MObjLookup.[h,cc]:
    3030     - added
    3131
     
    4343     - improved SetBinning to correctly support axis with labels
    4444       (keeps the binning unchanged)
     45
     46   * mhbas/MH3.[h,cc], mhbase/MHn.[h,cc]:
     47     - support for axis labels was added.
     48     - a possibility to set an additional weight has been added
     49     - the version number has been increased accordingly
    4550
    4651   * mjobs/MJPedestal.cc:
  • trunk/MagicSoft/Mars/mhbase/MH3.cc

    r8888 r8893  
    1818!   Author(s): Thomas Bretz  2002 <mailto:tbretz@astro.uni-wuerzburg.de>
    1919!
    20 !   Copyright: MAGIC Software Development, 2000-2007
     20!   Copyright: MAGIC Software Development, 2000-2008
    2121!
    2222!
     
    4545//
    4646//
    47 // Binning name
    48 // ============
     47// Binning/Binning name
     48// =====================
    4949//
    5050// The axis binning is retrieved from the parameter list, too. Create a
     
    5757// Instead of BinningMyHistName[XYZ] the parameter list will be searched
    5858// for BinningMyXBinning, BinningMyYBins and BinningMyHistNameZ
     59//
     60// If you don't want to use a MBinning object from the parameter list
     61// you can also set one directly, for example
     62//    MBinning bins(10, 0, 1);
     63//    mh3.SetBinningX(&bins);
     64// You must not delete the MBinning object before the class has been
     65// PreProcessed.
    5966//
    6067//
     
    7178//
    7279//
    73 // For example:
    74 //   MH3 myhist("MHillas.fLength");
    75 //   myhist.SetName("MyHist");
    76 //   myhist.SetScaleX(geomcam.GetConvMm2Deg()); //convert length to degree
    77 //   MBinning bins("BinningMyHistX");
    78 //   bins.SetEdges(10, 0, 150);
    79 //   plist.AddToList(&myhist);
    80 //   plist.AddToList(&bins);
    81 //
     80// Labels
     81// ======
     82//
     83// To use labels at an axis you have to initialize this for the axis
     84// by either calling InitLabels(Labels_t) or setiting a DefaultLabel.
     85// For the axis for which the labels have been initialized the
     86// number returned by the given corresponding phrase is converted
     87// to int with TMath::Nint and used as a label. If you want to replace
     88// this id by a named label you can call DefineLabel to do that.
     89// Several ids can be replaced by the same label. If you define
     90// named labels for every label which was not defined the default
     91// is used, if any, otherwise an unnamed label is created.
     92//
     93// In the case of an axis with labels the axis-title cannot be
     94// set via a MBinning, because the MBinning is not evaluated.
     95//
     96// Please note that for some reason not all combinations of
     97// labels, dimensions and weights are available in the root-
     98// histogram classes. Please check the MH3::Fill function to see
     99// whether your combination is supported.
     100//
     101//
     102// Examples:
     103// =========
     104//
     105//   1) MH3 myhist("MHillas.fLength");
     106//      myhist.SetName("MyHist");
     107//      myhist.SetScaleX(geomcam.GetConvMm2Deg()); //convert length to degree
     108//      MBinning bins("BinningMyHistX", "Title for my x-axis [Hz]");
     109//      bins.SetEdges(10, 0, 150);
     110//      plist.AddToList(&bins);
     111//
     112//   2) MH3 myhist("MHillas.fLength");
     113//      myhist.SetName("MyHist;MyX");
     114//      myhist.SetTitle("Histogram Title;X-Title [mm];Counts");
     115//      MBinning bins("BinningMyX");
     116//      bins.SetEdges(10, 0, 150);
     117//      plist.AddToList(&bins);
     118//
     119//   3) MH3 myhist("MTriggerPatter.GetUnprescaled");
     120//      myhist.SetWeight("1./MRawRunHeader.GetRunLength");
     121//      myhist.SetTitle("Rate of the trigger pattern [Hz];Run Number;Trigger Pattern;Rate [Hz]");
     122//      myhist.InitLabels(MH3::kLabelsXY);
     123//      myhist.DefaultLabelY("UNKNOWN");     // Lvl1
     124//      myhist.DefineLabelY( 1, "Trig");     // Lvl1
     125//      myhist.DefineLabelY( 2, "Cal");      // Cal
     126//      myhist.DefineLabelY( 4, "Trig");     // Lvl2
     127//      myhist.DefineLabelY( 8, "Ped");      // Ped
     128//
     129//
     130// Class Version 3:
     131// ----------------
     132//   - MData      *fData[3];
     133//   + MData      *fData[4];
    82134//
    83135// Class Version 2:
     
    97149#include <fstream>
    98150
     151#include <TObjString.h>
     152
    99153//#include <TPad.h>
    100154#include <TStyle.h>
     
    122176// --------------------------------------------------------------------------
    123177//
     178// Set fStyleBits to 0, Reset fBins to NULL, fScale to 1, set name and title
     179// to gsDefName and gsDefTitle and if fHist!=NULL UseCurrentStyle and
     180// SetDirectory(0)
     181//
     182void MH3::Init()
     183{
     184    fStyleBits = 0;
     185
     186    fData[3] = NULL;
     187
     188    fBins[0] = NULL;
     189    fBins[1] = NULL;
     190    fBins[2] = NULL;
     191
     192    fScale[0] = 1;
     193    fScale[1] = 1;
     194    fScale[2] = 1;
     195
     196    fName  = gsDefName;
     197    fTitle = gsDefTitle;
     198
     199    if (!fHist)
     200        return;
     201
     202    fHist->UseCurrentStyle();
     203    fHist->SetDirectory(NULL);
     204}
     205
     206// --------------------------------------------------------------------------
     207//
    124208// Default constructor.
    125209//
    126 MH3::MH3(const Int_t dim, Type_t type)
    127     : fDimension(dim), fHist(NULL), fStyleBits(0)
    128 {
     210MH3::MH3(const Int_t dim, Type_t type) : fDimension(dim), fHist(NULL)
     211{
     212    // FIXME?
    129213    switch (type)
    130214    {
     
    167251    fData[2] = NULL;
    168252
    169     fBins[0] = NULL;
    170     fBins[1] = NULL;
    171     fBins[2] = NULL;
    172 
    173     fName  = gsDefName;
    174     fTitle = gsDefTitle;
    175 
    176     if (fHist)
    177     {
    178         fHist->SetDirectory(NULL);
    179         fHist->UseCurrentStyle();
    180     }
    181 
    182     fScale[0] = 1;
    183     fScale[1] = 1;
    184     fScale[2] = 1;
     253    Init();
    185254}
    186255
     
    190259// description see the class description above.
    191260//
    192 MH3::MH3(const char *memberx)
    193     : fDimension(1), fStyleBits(0)
     261MH3::MH3(const char *memberx, Type_t type) : fDimension(1)
    194262{
    195263    fHist = new TH1D;
     264    fHist->SetYTitle("Counts");
    196265
    197266    fData[0] = new MDataPhrase(memberx);
     
    199268    fData[2] = NULL;
    200269
    201     fBins[0] = NULL;
    202     fBins[1] = NULL;
    203     fBins[2] = NULL;
    204 
    205     fName  = gsDefName;
    206     fTitle = gsDefTitle;
    207 
    208     fHist->UseCurrentStyle();
    209     fHist->SetDirectory(NULL);
    210     fHist->SetYTitle("Counts");
    211 
    212     fScale[0] = 1;
    213     fScale[1] = 1;
    214     fScale[2] = 1;
     270    Init();
    215271}
    216272
     
    219275// Adapt a given histogram
    220276//
    221 MH3::MH3(const TH1 &h1)
    222     : fDimension(1), fStyleBits(0)
     277MH3::MH3(const TH1 &h1) : fDimension(1)
    223278{
    224279    if (h1.InheritsFrom(TH3::Class()))
     
    227282        fDimension = 2;
    228283
     284    if (h1.InheritsFrom(TProfile2D::Class()))
     285        fDimension = -2;
     286    if (h1.InheritsFrom(TProfile::Class()))
     287        fDimension = -1;
     288
     289    fHist = (TH1*)h1.Clone();
     290
    229291    fData[0] = NULL;
    230292    fData[1] = NULL;
    231293    fData[2] = NULL;
    232294
    233     fBins[0] = NULL;
    234     fBins[1] = NULL;
    235     fBins[2] = NULL;
    236 
    237295    switch (fDimension)
    238296    {
    239297    case 3:
     298    case -2:
    240299        fData[2] = new MDataPhrase(h1.GetZaxis()->GetTitle());
    241300    case 2:
     301    case -1:
    242302        fData[1] = new MDataPhrase(h1.GetYaxis()->GetTitle());
    243303    case 1:
     
    245305    }
    246306
    247     fName  = gsDefName;
    248     fTitle = gsDefTitle;
    249 
    250     fHist = (TH1*)h1.Clone();
    251     fHist->SetDirectory(NULL);
    252 
    253     fScale[0] = 1;
    254     fScale[1] = 1;
    255     fScale[2] = 1;
     307    Init(); // Before without SeUseCurrentStyle!
    256308}
    257309
     
    263315//
    264316MH3::MH3(const char *memberx, const char *membery, Type_t type)
    265     : fDimension(type==kHistogram?2:-1), fStyleBits(0)
    266 {
    267     fHist = type==kHistogram ? static_cast<TH1*>(new TH2D) : static_cast<TH1*>(new TProfile); //new TH2D;
     317    : fDimension(type&kProfile?-1:2)
     318{
     319
     320    switch (TMath::Abs(fDimension))
     321    {
     322    case 2:
     323        fHist = static_cast<TH1*>(new TH2D);
     324        break;
     325    case -1:
     326        fHist = static_cast<TH1*>(new TProfile);
     327        break;
     328    }
     329
     330    fHist->SetZTitle(fDimension>0?"Counts":"Average");
    268331
    269332    fData[0] = new MDataPhrase(memberx);
     
    271334    fData[2] = NULL;
    272335
    273     fBins[0] = NULL;
    274     fBins[1] = NULL;
    275     fBins[2] = NULL;
    276 
    277     fName  = gsDefName;
    278     fTitle = gsDefTitle;
    279 
    280     fHist->UseCurrentStyle();
    281     fHist->SetDirectory(NULL);
    282     fHist->SetZTitle(fDimension>0?"Counts":"Average");
    283 
    284     fScale[0] = 1;
    285     fScale[1] = 1;
    286     fScale[2] = 1;
     336    Init();
    287337}
    288338
     
    294344//
    295345MH3::MH3(const char *memberx, const char *membery, const char *memberz, Type_t type)
    296     : fDimension(type==kHistogram?3:-2), fStyleBits(0)
    297 {
    298     fHist = type==kHistogram ? static_cast<TH1*>(new TH3D) : static_cast<TH1*>(new TProfile2D); //new TH2D;
     346    : fDimension(type==kHistogram?3:-2)
     347{
     348    fHist = type&kProfile ? static_cast<TH1*>(new TProfile2D) : static_cast<TH1*>(new TH3D);
    299349
    300350    fData[0] = new MDataPhrase(memberx);
     
    302352    fData[2] = new MDataPhrase(memberz);
    303353
    304     fBins[0] = NULL;
    305     fBins[1] = NULL;
    306     fBins[2] = NULL;
    307 
    308     fName  = gsDefName;
    309     fTitle = gsDefTitle;
    310 
    311     fHist->UseCurrentStyle();
    312     fHist->SetDirectory(NULL);
    313 
    314     fScale[0] = 1;
    315     fScale[1] = 1;
    316     fScale[2] = 1;
     354    Init();
    317355}
    318356
     
    325363    delete fHist;
    326364
    327     for (int i=0; i<3; i++)
     365    for (int i=0; i<4; i++)
    328366        if (fData[i])
    329367            delete fData[i];
     368
     369    for (int i=0; i<3; i++)
     370        if (fLabels[i].GetDefault())
     371            delete fLabels[i].GetDefault();
     372}
     373
     374// --------------------------------------------------------------------------
     375//
     376// You can set a weight as a phrase additionally to the one given
     377// as an argument to Fill (most likely from MFillH). The two weights
     378// are multiplied together.
     379//
     380void MH3::SetWeight(const char *phrase)
     381{
     382    if (fData[3])
     383        delete fData[3];
     384    fData[3] = new MDataPhrase(phrase);
     385}
     386
     387// --------------------------------------------------------------------------
     388//
     389// The axis label is centered and the labeling of the axis is initialized.
     390//
     391// This function must not be called after any label has been created!
     392//
     393void MH3::InitLabels(TAxis &x) const
     394{
     395    x.CenterTitle();
     396    x.SetBinLabel(1, "");
     397    x.LabelsOption("h");  // FIXME: Is "a" thread safe? (Paint and Fill?)
     398    x.GetLabels()->Delete();
     399}
     400
     401// --------------------------------------------------------------------------
     402//
     403// Depending on the bits set the InitLabels(TAxis&) function for
     404// the corresponding axes are called. In any case the kCanRebin bit
     405// is set.
     406//
     407// This function must not be called after any label has been created!
     408//
     409void MH3::InitLabels(Labels_t type) const
     410{
     411    if (!fHist)
     412        return;
     413
     414    if (type&kLabelsX && fHist->GetXaxis())
     415        InitLabels(*fHist->GetXaxis());
     416
     417    if (type&kLabelsY && fHist->GetYaxis())
     418        InitLabels(*fHist->GetYaxis());
     419
     420    if (type&kLabelsZ && fHist->GetZaxis())
     421        InitLabels(*fHist->GetZaxis());
     422
     423    if (type&kLabelsXYZ)
     424        fHist->SetBit(TH1::kCanRebin);
     425}
     426
     427// --------------------------------------------------------------------------
     428//
     429// Return the corresponding Labels_t describing for which axis
     430// axis-labels are switched on.
     431//
     432MH3::Labels_t MH3::GetLabels() const
     433{
     434    UInt_t type = kNoLabels;
     435    if (fHist->GetXaxis() && fHist->GetXaxis()->GetLabels())
     436        type |= kLabelsX;
     437    if (fHist->GetYaxis() && fHist->GetYaxis()->GetLabels())
     438        type |= kLabelsY;
     439    if (fHist->GetZaxis() && fHist->GetZaxis()->GetLabels())
     440        type |= kLabelsZ;
     441    return (Labels_t)type;
     442}
     443
     444// --------------------------------------------------------------------------
     445//
     446// Calls the LabelsDeflate from the histogram for all axes.
     447// LabelsDeflate will just do nothing if the axis has no labels
     448// initialized.
     449//
     450void MH3::DeflateLabels() const
     451{
     452    fHist->LabelsDeflate("X");
     453    fHist->LabelsDeflate("Y");
     454    fHist->LabelsDeflate("Z");
     455}
     456
     457// --------------------------------------------------------------------------
     458//
     459// Returns the named label corresponding to the given value
     460// and the given axis. The names are defined with the
     461// DefineLabel-functions. if no name is defined the value
     462// is converted to a string with %d and TMath::Nint.
     463// If names are defined, but not for the given value, the default
     464// label is returned instead. If no default is defined the
     465// %d-converted string is returned.
     466//
     467const char *MH3::GetLabel(Int_t axe, Double_t val) const
     468{
     469    const Int_t v = TMath::Nint(val);
     470
     471    if (fLabels[axe].GetSize())
     472    {
     473        const char *l = fLabels[axe].GetObjName(v);
     474        if (l)
     475            return l;
     476    }
     477
     478    return Form("%d", v);
    330479}
    331480
     
    338487{
    339488    TString str=fData[0]->GetDataMember();
    340     if (fData[1])
    341     {
    342         str += ";";
    343         str += fData[1]->GetDataMember();
    344     }
    345     if (fData[2])
    346     {
    347         str += ";";
    348         str += fData[2]->GetDataMember();
    349     }
     489
     490    for (int i=1; i<4; i++)
     491        if (fData[i])
     492        {
     493            str += ";";
     494            str += fData[i]->GetDataMember();
     495        }
     496
    350497    return str;
    351498}
     
    377524    delete tok;
    378525
    379 
    380526    MBinning *binsx = NULL;
    381527    MBinning *binsy = NULL;
    382528    MBinning *binsz = NULL;
    383529
     530    const Labels_t labels = GetLabels();
     531
    384532    switch (TMath::Abs(fDimension))
    385533    {
    386534    case 3:
    387         binsz = fBins[2] ? fBins[2] : (MBinning*)plist->FindObject(bz, "MBinning");
    388         if (!binsz)
    389         {
    390             *fLog << err << dbginf << "MBinning '" << bz << "' not found... aborting." << endl;
    391             return kFALSE;
    392         }
    393535        if (fData[2])
    394536            fHist->SetZTitle(fData[2]->GetTitle());
    395         if (binsz->HasTitle())
    396             fHist->SetZTitle(binsz->GetTitle());
    397         if (binsz->IsLogarithmic())
    398             fHist->SetBit(kIsLogz);
     537        if (!labels&kLabelsZ)
     538        {
     539            binsz = fBins[2] ? fBins[2] : (MBinning*)plist->FindObject(bz, "MBinning");
     540            if (!binsz)
     541            {
     542                *fLog << err << dbginf << "MBinning '" << bz << "' not found... aborting." << endl;
     543                return kFALSE;
     544            }
     545            if (binsz->HasTitle())
     546                fHist->SetZTitle(binsz->GetTitle());
     547            if (binsz->IsLogarithmic())
     548                fHist->SetBit(kIsLogz);
     549        }
    399550    case 2:
    400         binsy = fBins[1] ? fBins[1] : (MBinning*)plist->FindObject(by, "MBinning");
    401         if (!binsy)
    402         {
    403             *fLog << err << dbginf << "MBinning '" << by << "' not found... aborting." << endl;
    404             return kFALSE;
    405         }
    406551        if (fData[1])
    407552            fHist->SetYTitle(fData[1]->GetTitle());
    408         if (binsy->HasTitle())
    409             fHist->SetYTitle(binsy->GetTitle());
    410         if (binsy->IsLogarithmic())
    411             fHist->SetBit(kIsLogy);
     553        if (!labels&kLabelsY)
     554        {
     555            binsy = fBins[1] ? fBins[1] : (MBinning*)plist->FindObject(by, "MBinning");
     556            if (!binsy)
     557            {
     558                *fLog << err << dbginf << "MBinning '" << by << "' not found... aborting." << endl;
     559                return kFALSE;
     560            }
     561            if (binsy->HasTitle())
     562                fHist->SetYTitle(binsy->GetTitle());
     563            if (binsy->IsLogarithmic())
     564                fHist->SetBit(kIsLogy);
     565        }
    412566    case 1:
    413         binsx = fBins[0] ? fBins[0] : (MBinning*)plist->FindObject(bx, "MBinning");
    414         if (!binsx)
     567        if (fData[0]!=NULL)
     568            fHist->SetXTitle(fData[0]->GetTitle());
     569        if (!labels&kLabelsX)
    415570        {
    416             if (fDimension==1)
    417                 binsx = (MBinning*)plist->FindObject("Binning"+fName, "MBinning");
    418 
     571            binsx = fBins[0] ? fBins[0] : (MBinning*)plist->FindObject(bx, "MBinning");
    419572            if (!binsx)
    420573            {
    421                 *fLog << err << dbginf << "Neither '" << bx << "' nor '" << binsx << fName << "' found... aborting." << endl;
    422                 return kFALSE;
     574                if (fDimension==1)
     575                    binsx = (MBinning*)plist->FindObject("Binning"+fName, "MBinning");
     576
     577                if (!binsx)
     578                {
     579                    *fLog << err << dbginf << "Neither '" << bx << "' nor '" << binsx << fName << "' found... aborting." << endl;
     580                    return kFALSE;
     581                }
    423582            }
     583            if (binsx->HasTitle())
     584                fHist->SetXTitle(binsx->GetTitle());
     585            if (binsx->IsLogarithmic())
     586                fHist->SetBit(kIsLogx);
    424587        }
    425         if (fData[0]!=NULL)
    426             fHist->SetXTitle(fData[0]->GetTitle());
    427         if (binsx->HasTitle())
    428             fHist->SetXTitle(binsx->GetTitle());
    429         if (binsx->IsLogarithmic())
    430             fHist->SetBit(kIsLogx);
    431588    }
    432589
    433590    // PreProcess existing fData members
    434     for (int i=0; i<3; i++)
     591    for (int i=0; i<4; i++)
    435592        if (fData[i] && !fData[i]->PreProcess(plist))
    436593            return kFALSE;
     
    445602    fHist->SetDirectory(0);
    446603
     604    // This is for the case we have set lables
     605    const MBinning def(1, 0, 1);
     606    if (!binsx)
     607        binsx = const_cast<MBinning*>(&def);
     608    if (!binsy)
     609        binsy = const_cast<MBinning*>(&def);
     610    if (!binsz)
     611        binsz = const_cast<MBinning*>(&def);
     612
     613    // set binning
    447614    switch (TMath::Abs(fDimension))
    448615    {
     
    451618        return kTRUE;
    452619    case 2:
    453         SetBinning((TH2*)fHist, binsx, binsy);
     620        SetBinning(static_cast<TH2*>(fHist), binsx, binsy);
    454621        return kTRUE;
    455622    case 3:
    456         SetBinning((TH3*)fHist, binsx, binsy, binsz);
     623        SetBinning(static_cast<TH3*>(fHist), binsx, binsy, binsz);
    457624        return kTRUE;
    458625    }
     
    504671// Fills the one, two or three data members into our histogram
    505672//
    506 Bool_t MH3::Fill(const MParContainer *par, const Stat_t w)
    507 {
     673Bool_t MH3::Fill(const MParContainer *par, const Stat_t ww)
     674{
     675    // Get Information about labels (UInt_t, to supress warning about
     676    // unhandeled cases in switch)
     677    const UInt_t type = GetLabels();
     678
     679    // Get values for axis
    508680    Double_t x=0;
    509681    Double_t y=0;
    510682    Double_t z=0;
     683    Double_t w=ww;
    511684
    512685    switch (fDimension)
     
    522695    }
    523696
     697    if (fData[3])
     698        w *= fData[3]->GetValue();
     699
     700    // If label option is set, convert value to label
     701    TString labelx, labely, labelz;
     702    if (type&kLabelsX)
     703        labelx = GetLabel(0, x);
     704    if (type&kLabelsY)
     705        labely = GetLabel(1, y);
     706    if (type&kLabelsZ)
     707        labelz = GetLabel(2, z);
     708
     709    // Fill histogram
    524710    switch (fDimension)
    525711    {
    526712    case  3:
    527         static_cast<TH3*>(fHist)->Fill(x, y, z, w);
    528         return kTRUE;
     713        switch (type)
     714        {
     715        case kNoLabels:
     716            static_cast<TH3*>(fHist)->Fill(x,      y,      z,      w);
     717            return kTRUE;
     718        case kLabelsX:
     719            static_cast<TH3*>(fHist)->Fill(labelx, y,      z);
     720            return kTRUE;
     721        case kLabelsY:
     722            static_cast<TH3*>(fHist)->Fill(x,      labely, z,      w);
     723            return kTRUE;
     724        case kLabelsZ:
     725            static_cast<TH3*>(fHist)->Fill(x,      y,      labelz, w);
     726            return kTRUE;
     727        case kLabelsXY:
     728            static_cast<TH3*>(fHist)->Fill(labelx, labely, z,      w);
     729            return kTRUE;
     730        case kLabelsXZ:
     731            static_cast<TH3*>(fHist)->Fill(labelx, y,      labelz, w);
     732            return kTRUE;
     733        case kLabelsYZ:
     734            static_cast<TH3*>(fHist)->Fill(x,      labely, labelz, w);
     735            return kTRUE;
     736        case kLabelsXYZ:
     737            static_cast<TH3*>(fHist)->Fill(labelx, labely, labelz, w);
     738            return kTRUE;
     739        }
     740        break;
    529741    case  2:
    530         static_cast<TH2*>(fHist)->Fill(x, y, w);
    531         return kTRUE;
     742        switch (type)
     743        {
     744        case kNoLabels:
     745            static_cast<TH2*>(fHist)->Fill(x,      y,      w);
     746            return kTRUE;
     747        case kLabelsX:
     748            static_cast<TH2*>(fHist)->Fill(x,      labely, w);
     749            return kTRUE;
     750        case kLabelsY:
     751            static_cast<TH2*>(fHist)->Fill(labelx, y,      w);
     752            return kTRUE;
     753        case kLabelsXY:
     754            static_cast<TH2*>(fHist)->Fill(labelx, labely, w);
     755            return kTRUE;
     756        }
     757        break;
    532758    case 1:
    533         fHist->Fill(x, w);
    534         return kTRUE;
     759        switch (type)
     760        {
     761        case kNoLabels:
     762            fHist->Fill(x,      w);
     763            return kTRUE;
     764        case kLabelsX:
     765            fHist->Fill(labelx, w);
     766            return kTRUE;
     767        }
     768        break;
    535769    case -1:
    536         static_cast<TProfile*>(fHist)->Fill(x, y, w);
    537         return kTRUE;
     770        switch (type)
     771        {
     772        case kNoLabels:
     773            static_cast<TProfile*>(fHist)->Fill(x,      y, w);
     774            return kTRUE;
     775        case kLabelsX:
     776            static_cast<TProfile*>(fHist)->Fill(labelx, y, w);
     777            return kTRUE;
     778        }
     779        break;
    538780    case -2:
    539         static_cast<TProfile2D*>(fHist)->Fill(x, y, z, w);
    540         return kTRUE;
    541     }
    542 
    543     return kFALSE;
     781        switch (type)
     782        {
     783        case kNoLabels:
     784            static_cast<TProfile2D*>(fHist)->Fill(x,      y,      z, w);
     785            return kTRUE;
     786        case kLabelsX:
     787            static_cast<TProfile2D*>(fHist)->Fill(labelx, y,      z);
     788            return kTRUE;
     789        case kLabelsY:
     790            static_cast<TProfile2D*>(fHist)->Fill(x,      labely, z);
     791            return kTRUE;
     792        case kLabelsXY:
     793            static_cast<TProfile2D*>(fHist)->Fill(labelx, labely, z);
     794            return kTRUE;
     795        }
     796        break;
     797    }
     798
     799    *fLog << err << "MH3::Fill: ERROR - A fatal error occured." << endl;
     800    return kERROR;
    544801}
    545802
     
    552809Bool_t MH3::Finalize()
    553810{
     811    DeflateLabels();
     812
    554813    Bool_t autorangex=TESTBIT(fStyleBits, 0);
    555814    Bool_t autorangey=TESTBIT(fStyleBits, 1);
     
    557816
    558817    Int_t lo, hi;
    559 
    560818    if (autorangex)
    561819    {
     
    578836}
    579837
     838// --------------------------------------------------------------------------
     839//
     840// FIXME
     841//
    580842void MH3::Paint(Option_t *o)
    581843{
     
    607869}
    608870
     871// --------------------------------------------------------------------------
     872//
     873// If Xmax is < 3000*Xmin SetMoreLogLabels is called. If Xmax<5000
     874// the exponent is switched off (SetNoExponent)
     875//
    609876void MH3::HandleLogAxis(TAxis &axe) const
    610877{
     
    661928    TString str(opt);
    662929    str.ToLower();
     930
     931    if (str.IsNull() && GetLabels() && fDimension==2)
     932        str = "colz";
    663933
    664934    const Bool_t only  = str.Contains("only")  && TMath::Abs(fDimension)==2;
     
    7471017    if (fTitle!=gsDefTitle)
    7481018        out << "   " << name << ".SetTitle(\"" << fTitle << "\");" << endl;
     1019
     1020    if (fData[3])
     1021        out << "   " << name << ".SetWeight(\"" << fData[3]->GetRule() << "\");" << endl;
    7491022
    7501023    switch (fDimension)
     
    7711044MParContainer *MH3::New() const
    7721045{
     1046    // FIXME: TREAT THE NEW OPTIONS CORRECTLY (PROFILE, LABELS)
     1047
    7731048    MH3 *h = NULL;
    7741049
     
    7941069            break;
    7951070        }
     1071
    7961072    switch (fDimension)
    7971073    {
     
    8051081        h->SetScaleX(fScale[0]);
    8061082    }
     1083
     1084    if (fData[3])
     1085        h->SetWeight(fData[3]->GetRule());
     1086
    8071087    return h;
    8081088}
    8091089
     1090// --------------------------------------------------------------------------
     1091//
     1092// FIXME
     1093//
    8101094TString MH3::GetRule(const Char_t axis) const
    8111095{
     
    8131097    {
    8141098    case 'x':
     1099    case 'X':
    8151100        return fData[0] ? fData[0]->GetRule() : TString("");
    8161101    case 'y':
     1102    case 'Y':
    8171103        return fData[1] ? fData[1]->GetRule() : TString("");
    8181104    case 'z':
     1105    case 'Z':
    8191106        return fData[2] ? fData[2]->GetRule() : TString("");
     1107    case 'w':
     1108    case 'W':
     1109        return fData[3] ? fData[3]->GetRule() : TString("");
    8201110    default:
    8211111        return "<n/a>";
     
    8831173    return binx + nx*(biny +ny*binz);
    8841174}
     1175
     1176// --------------------------------------------------------------------------
     1177//
     1178// Return the MObjLookup corresponding to the axis/character.
     1179// Note that only lower-case charecters (x, y, z) are supported.
     1180// If for the axis no labels were set, the corresponding
     1181// InitLabels is called.
     1182//
     1183MObjLookup *MH3::GetLabels(char axe)
     1184{
     1185    if (!fHist)
     1186        return 0;
     1187
     1188    TAxis *x = 0;
     1189
     1190    switch (axe)
     1191    {
     1192    case 'x':
     1193        x = fHist->GetXaxis();
     1194        break;
     1195    case 'y':
     1196        x = fHist->GetYaxis();
     1197        break;
     1198    case 'z':
     1199        x = fHist->GetZaxis();
     1200        break;
     1201    }
     1202
     1203    if (!x)
     1204        return 0;
     1205
     1206    const Int_t idx = axe-'x';
     1207
     1208    if (!x->GetLabels())
     1209        switch (idx)
     1210        {
     1211        case 0:
     1212            InitLabels(kLabelsX);
     1213            break;
     1214        case 1:
     1215            InitLabels(kLabelsY);
     1216            break;
     1217        case 2:
     1218            InitLabels(kLabelsZ);
     1219            break;
     1220        }
     1221
     1222    return &fLabels[idx];
     1223}
     1224
     1225// --------------------------------------------------------------------------
     1226//
     1227// Set a default label which is used if no other is found in the list
     1228// of labels. if a default was set already it is overwritten. If the
     1229// axis has not yet been initialized to use labels it it now.
     1230//
     1231void MH3::DefaultLabel(char axe, const char *name)
     1232{
     1233    MObjLookup *arr = GetLabels(axe);
     1234    if (!arr)
     1235        return;
     1236
     1237    if (arr->GetDefault())
     1238    {
     1239        delete arr->GetDefault();
     1240        arr->SetDefault(0);
     1241    }
     1242
     1243    if (name)
     1244        arr->SetDefault(new TObjString(name));
     1245}
     1246
     1247// --------------------------------------------------------------------------
     1248//
     1249// Define a name for a label. More than one label can have the same
     1250// name. If the axis has not yet been initialized to use labels
     1251// it it now.
     1252//
     1253void MH3::DefineLabel(char axe, Int_t label, const char *name)
     1254{
     1255    MObjLookup *arr = GetLabels(axe);
     1256
     1257    if (!arr || !name)
     1258        return;
     1259
     1260    if (arr->GetObj(label)!=arr->GetDefault())
     1261        return;
     1262
     1263    arr->Add(label, name);
     1264}
     1265
     1266// --------------------------------------------------------------------------
     1267//
     1268// Define names for labels, like
     1269//    1=Trig;2=Cal;4=Ped;8=Lvl2
     1270// More than one label can have the same name. If the axis has not
     1271// yet been initialized to use labels it it now.
     1272//
     1273// A default cannot be set here. Use DefaultLabel instead.
     1274//
     1275void MH3::DefineLabels(char axe, const TString &labels)
     1276{
     1277    TObjArray *arr = labels.Tokenize(';');
     1278
     1279    for (int i=0; i<arr->GetEntries(); i++)
     1280    {
     1281        const char *s = (*arr)[0]->GetName();
     1282        const char *v = strchr(s, '=');
     1283
     1284        if (v)
     1285            DefineLabel(axe, atoi(s), v+1);
     1286    }
     1287
     1288    delete arr;
     1289}
  • trunk/MagicSoft/Mars/mhbase/MH3.h

    r8888 r8893  
    88#include "MH.h"
    99#endif
     10#ifndef MARS_MObjLookup
     11#include "MObjLookup.h"
     12#endif
    1013
    1114class TH1;
     
    1518class MH3 : public MH
    1619{
     20public:
     21    enum Labels_t {
     22        kNoLabels  = 0,
     23        kLabelsX   = BIT(0),
     24        kLabelsY   = BIT(1),
     25        kLabelsZ   = BIT(2),
     26        kLabelsXY  = kLabelsX|kLabelsY,
     27        kLabelsXZ  = kLabelsX|kLabelsZ,
     28        kLabelsYZ  = kLabelsY|kLabelsZ,
     29        kLabelsXYZ = kLabelsX|kLabelsY|kLabelsZ,
     30    };
     31
    1732private:
    1833    static const TString gsDefName;
    1934    static const TString gsDefTitle;
     35
     36    // Helper for constructor
     37    void        Init();
     38
     39    // Helper for dealing with labeled histograms
     40    MObjLookup *GetLabels(char axe);
     41    void        InitLabels(TAxis &x) const;
     42    void        DeflateLabels() const;
     43    Labels_t    GetLabels() const;
     44    const char *GetLabel(Int_t axe, Double_t val) const;
     45
     46    MObjLookup fLabels[3];       //! Lookup table to conflate and name labels
    2047
    2148protected:
     
    2350    Int_t       fDimension;      // Number of dimensions of histogram
    2451    TH1        *fHist;           // Histogram to fill
    25     MData      *fData[3];        // Object from which the data is filled
     52    MData      *fData[4];        // Object from which the data is filled (+additional weight)
    2653    MBinning   *fBins[3];        // Binning set omitting the parlist access
    2754    Double_t    fScale[3];       // Scale for the three axis (eg unit)
     
    4370    enum Type_t {
    4471        kHistogram,
    45         kProfile
     72        kProfile,
    4673    };
    4774
    4875    MH3(const Int_t dim=0, Type_t type=MH3::kHistogram);
    4976    MH3(const TH1 &h1);
    50     MH3(const char *memberx);
     77    MH3(const char *memberx, Type_t type=MH3::kHistogram);
    5178    MH3(const char *memberx, const char *membery, Type_t type=MH3::kHistogram);
    5279    MH3(const char *memberx, const char *membery, const char *memberz, Type_t type=MH3::kHistogram);
     
    75102
    76103    void Sumw2() const { if (fHist) fHist->Sumw2(); }
     104
     105    void InitLabels(Labels_t labels) const;
     106
     107    void DefaultLabel(char axe, const char *name=0);
     108    void DefaultLabelX(const char *name=0) { DefaultLabel('x', name); }
     109    void DefaultLabelY(const char *name=0) { DefaultLabel('y', name); }
     110    void DefaultLabelZ(const char *name=0) { DefaultLabel('z', name); }
     111
     112    void DefineLabel(char axe, Int_t label=0, const char *name=0);
     113    void DefineLabelX(Int_t label, const char *name) { DefineLabel('x', label, name); }
     114    void DefineLabelY(Int_t label, const char *name) { DefineLabel('y', label, name); }
     115    void DefineLabelZ(Int_t label, const char *name) { DefineLabel('z', label, name); }
     116
     117    void DefineLabels(char axe, const TString &labels);
     118    void DefineLabelsX(const TString &labels) { DefineLabels('x', labels); }
     119    void DefineLabelsY(const TString &labels) { DefineLabels('y', labels); }
     120    void DefineLabelsZ(const TString &labels) { DefineLabels('z', labels); }
     121
     122    void SetWeight(const char *phrase);
    77123
    78124    // Getter
     
    109155    void Paint(Option_t *opt="");
    110156
    111     ClassDef(MH3, 3) // Generalized 1/2/3D-histogram for Mars variables
     157    ClassDef(MH3, 4) // Generalized 1/2/3D-histogram for Mars variables
    112158};
    113159
  • trunk/MagicSoft/Mars/mhbase/MHn.cc

    r8888 r8893  
    374374// --------------------------------------------------------------------------
    375375//
     376// call MH3::InitLabels for the current histogram
     377//
     378void MHn::InitLabels(MH3::Labels_t labels) const
     379{
     380    if (fHist[fNum-1])
     381        fHist[fNum-1]->InitLabels(labels);
     382}
     383
     384// --------------------------------------------------------------------------
     385//
     386// call MH3::DefaultLabelX for the current histogram
     387//
     388void MHn::DefaultLabelX(const char *name)
     389{
     390    if (fHist[fNum-1])
     391        fHist[fNum-1]->DefaultLabelX(name);
     392}
     393
     394// --------------------------------------------------------------------------
     395//
     396// call MH3::DefaultLabelY for the current histogram
     397//
     398void MHn::DefaultLabelY(const char *name)
     399{
     400    if (fHist[fNum-1])
     401        fHist[fNum-1]->DefaultLabelY(name);
     402}
     403
     404// --------------------------------------------------------------------------
     405//
     406// call MH3::DefaultLabelZ for the current histogram
     407//
     408void MHn::DefaultLabelZ(const char *name)
     409{
     410    if (fHist[fNum-1])
     411        fHist[fNum-1]->DefaultLabelZ(name);
     412}
     413
     414// --------------------------------------------------------------------------
     415//
     416// call MH3::DefineLabelX for the current histogram
     417//
     418void MHn::DefineLabelX(Int_t label, const char *name)
     419{
     420    if (fHist[fNum-1])
     421        fHist[fNum-1]->DefineLabelX(label, name);
     422}
     423
     424// --------------------------------------------------------------------------
     425//
     426// call MH3::DefineLabelY for the current histogram
     427//
     428void MHn::DefineLabelY(Int_t label, const char *name)
     429{
     430    if (fHist[fNum-1])
     431        fHist[fNum-1]->DefineLabelY(label, name);
     432}
     433
     434// --------------------------------------------------------------------------
     435//
     436// call MH3::DefineLabelZ for the current histogram
     437//
     438void MHn::DefineLabelZ(Int_t label, const char *name)
     439{
     440    if (fHist[fNum-1])
     441        fHist[fNum-1]->DefineLabelZ(label, name);
     442}
     443
     444// --------------------------------------------------------------------------
     445//
     446// call MH3::DefineLabelsX for the current histogram
     447//
     448void MHn::DefineLabelsX(const TString &labels)
     449{
     450    if (fHist[fNum-1])
     451        fHist[fNum-1]->DefineLabelsX(labels);
     452}
     453
     454// --------------------------------------------------------------------------
     455//
     456// call MH3::DefineLabelsY for the current histogram
     457//
     458void MHn::DefineLabelsY(const TString &labels)
     459{
     460    if (fHist[fNum-1])
     461        fHist[fNum-1]->DefineLabelsY(labels);
     462}
     463
     464// --------------------------------------------------------------------------
     465//
     466// call MH3::DefineLabelsZ for the current histogram
     467//
     468void MHn::DefineLabelsZ(const TString &labels)
     469{
     470    if (fHist[fNum-1])
     471        fHist[fNum-1]->DefineLabelsZ(labels);
     472}
     473
     474// --------------------------------------------------------------------------
     475//
     476// call MH3::SetWeight for the current histogram
     477//
     478void MHn::SetWeight(const char *phrase)
     479{
     480    if (fHist[fNum-1])
     481        fHist[fNum-1]->SetWeight(phrase);
     482}
     483
     484// --------------------------------------------------------------------------
     485//
    376486// Call SetupFill for all initialized histograms
    377487//
  • trunk/MagicSoft/Mars/mhbase/MHn.h

    r8888 r8893  
    3737    Bool_t AddHist(const char *memberx, const char *membery, const char *memberz, MH3::Type_t type=MH3::kHistogram);
    3838
    39     void InitName(const char *n)
    40     {
    41         InitName(fNum-1, n);
    42     }
     39    void InitName(const char *n)  { InitName(fNum-1, n); }
     40    void InitTitle(const char *t) { InitTitle(fNum-1, t); }
    4341
    44     void InitTitle(const char *t)
    45     {
    46         InitTitle(fNum-1, t);
    47     }
    48 
    49     // Interfact to MH3
     42    // General interfact to MH3
    5043    void SetScale(Double_t x, Double_t y=1, Double_t z=2) const;
    5144    void SetLog(Bool_t x=kTRUE, Bool_t y=kTRUE, Bool_t z=kTRUE) const;
     
    5346    void SetBinnings(MBinning *x=0, MBinning *y=0, MBinning *z=0) const;
    5447    void Sumw2() const;
     48
     49    // Interface to labels of MH3
     50    void InitLabels(MH3::Labels_t labels) const;
     51
     52    void DefaultLabelX(const char *name=0);
     53    void DefaultLabelY(const char *name=0);
     54    void DefaultLabelZ(const char *name=0);
     55
     56    void DefineLabelX(Int_t label, const char *name);
     57    void DefineLabelY(Int_t label, const char *name);
     58    void DefineLabelZ(Int_t label, const char *name);
     59
     60    void DefineLabelsX(const TString &labels);
     61    void DefineLabelsY(const TString &labels);
     62    void DefineLabelsZ(const TString &labels);
     63
     64    // Set additonal weights for MH3
     65    void SetWeight(const char *phrase);
    5566
    5667    // MH
Note: See TracChangeset for help on using the changeset viewer.