Ignore:
Timestamp:
08/08/02 11:58:59 (22 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mhist/MHMatrix.cc

    r1355 r1489  
    4545#include "MHMatrix.h"
    4646
     47#include <fstream.h>
     48
    4749#include <TList.h>
    4850#include <TArrayD.h>
     
    5456#include "MParList.h"
    5557
    56 #include "MDataChain.h"
     58#include "MData.h"
     59#include "MDataArray.h"
    5760
    5861ClassImp(MHMatrix);
    5962
    60 // --------------------------------------------------------------------------
    61 //
    62 // Default Constructor
     63static const TString gsDefName  = "MHMatrix";
     64static const TString gsDefTitle = "Multidimensional Matrix";
     65
     66// --------------------------------------------------------------------------
     67//
     68//  Default Constructor
    6369//
    6470MHMatrix::MHMatrix(const char *name, const char *title)
    65     : fNumRow(0)
    66 {
    67     fName  = name  ? name  : "MHMatrix";
    68     fTitle = title ? title : "Multidimensional Matrix";
    69 
    70     fData = new TList;
    71     fData->SetOwner();
    72 
    73     fRules = new TList;
    74     fRules->SetOwner();
    75 }
    76 
    77 // --------------------------------------------------------------------------
    78 //
    79 // Destructor
     71    : fNumRow(0), fData(NULL)
     72{
     73    fName  = name  ? name  : gsDefName.Data();
     74    fTitle = title ? title : gsDefTitle.Data();
     75}
     76
     77// --------------------------------------------------------------------------
     78//
     79//  Constructor. Initializes the columns of the matrix with the entries
     80//  from a MDataArray
     81//
     82MHMatrix::MHMatrix(MDataArray *mat, const char *name, const char *title)
     83    : fNumRow(0), fData(mat)
     84{
     85    fName  = name  ? name  : gsDefName.Data();
     86    fTitle = title ? title : gsDefTitle.Data();
     87}
     88
     89// --------------------------------------------------------------------------
     90//
     91//  Destructor. Does not deleted a user given MDataArray, except IsOwner
     92//  was called.
    8093//
    8194MHMatrix::~MHMatrix()
    8295{
    83     delete fData;
    84     delete fRules;
     96    if (TestBit(kIsOwner) && fData)
     97        delete fData;
    8598}
    8699
     
    99112    }
    100113
    101     MDataChain &chain = *new MDataChain(rule);
    102     if (!chain.IsValid())
    103     {
    104         *fLog << err << "Error - Rule cannot be translated... ignored." << endl;
    105         delete &chain;
     114    if (!fData)
     115    {
     116        fData = new MDataArray;
     117        SetBit(kIsOwner);
     118    }
     119
     120    fData->AddEntry(rule);
     121}
     122
     123void MHMatrix::AddColumns(MDataArray *matrix)
     124{
     125    if (fM.IsValid())
     126    {
     127        *fLog << warn << "Warning - matrix is already in use. Can't add new columns... skipped." << endl;
    106128        return;
    107129    }
    108     fData->Add(&chain);
    109 
    110     TNamed *name = new TNamed(rule, rule); // Fimxe, in 3.02/07 the title can't be "", why?
    111     fRules->Add(name);
    112 }
    113 
    114 void MHMatrix::AddColumns(const MHMatrix *matrix)
    115 {
    116     TIter Next(matrix->fRules);
    117     TObject *rule=NULL;
    118     while ((rule=Next()))
    119         AddColumn(rule->GetName());
     130
     131    if (fData)
     132        *fLog << warn << "Warning - columns already added... replacing." << endl;
     133
     134    if (fData && TestBit(kIsOwner))
     135    {
     136        delete fData;
     137        ResetBit(kIsOwner);
     138    }
     139
     140    fData = matrix;
    120141}
    121142
     
    127148Bool_t MHMatrix::SetupFill(const MParList *plist)
    128149{
    129     if (fData->GetSize()==0)
    130     {
    131         *fLog << err << "Error - No Column specified... aborting." << endl;
     150    if (!fData)
     151    {
     152        *fLog << err << "Error - No Columns initialized... aborting." << endl;
    132153        return kFALSE;
    133154    }
    134155
    135     TIter Next(fData);
    136     MData *data = NULL;
    137     while ((data=(MData*)Next()))
    138         if (!data->PreProcess(plist))
    139             return kFALSE;
    140 
    141     return kTRUE;
     156    return fData->PreProcess(plist);
    142157}
    143158
     
    155170    if (!fM.IsValid())
    156171    {
    157         fM.ResizeTo(1, fData->GetSize());
     172        fM.ResizeTo(1, fData->GetNumEntries());
    158173        return;
    159174    }
     
    161176    TMatrix m(fM);
    162177
    163     fM.ResizeTo(fM.GetNrows()*2, fData->GetSize());
     178    fM.ResizeTo(fM.GetNrows()*2, fData->GetNumEntries());
    164179
    165180    for (int x=0; x<m.GetNcols(); x++)
     
    176191    AddRow();
    177192
    178     int col=0;
    179     TIter Next(fData);
    180     MData *data = NULL;
    181     while ((data=(MData*)Next()))
    182         fM(fNumRow-1, col++) = data->GetValue();
     193    for (int col=0; col<fData->GetNumEntries(); col++)
     194        fM(fNumRow-1, col) = (*fData)(col);
    183195
    184196    return kTRUE;
     
    195207    // It's not a fatal error so we don't need to stop PostProcessing...
    196208    //
    197     if (fData->GetSize()<1 || fNumRow<1)
     209    if (fData->GetNumEntries()==0 || fNumRow<1)
    198210        return kTRUE;
    199211
    200212    TMatrix m(fM);
    201213
    202     fM.ResizeTo(fNumRow, fData->GetSize());
     214    fM.ResizeTo(fNumRow, fData->GetNumEntries());
    203215
    204216    for (int x=0; x<fM.GetNcols(); x++)
     
    287299void MHMatrix::Print(Option_t *) const
    288300{
    289     int n=0;
    290 
    291     TIter Next(fData->GetSize() ? fData : fRules);
    292     MData *data = NULL;
    293     while ((data=(MData*)Next()))
    294     {
    295         *fLog << all << " Column " << setw(3) << n++ << ": " << flush;
    296         data->Print();
    297         *fLog << endl;
    298     }
     301    if (fData)
     302        fData->Print();
     303    else
     304        *fLog << all << "Sorry, no column information available." << endl;
    299305
    300306    fM.Print();
     
    336342}
    337343
     344// --------------------------------------------------------------------------
     345//
     346// Calculated the distance of vector evt from the reference sample
     347// represented by the covariance metrix m.
     348//  - If n<0 the kernel method is applied and
     349//    sum(epx(-d)/n is returned.
     350//  - For n>=0 the n nearest neighbors are summed and
     351//    sqrt(sum(d))/n is returned.
     352//  - if n==0 all distances are summed
     353//
    338354Double_t MHMatrix::CalcDist(const TMatrix &m, const TVector &evt, Int_t num) const
    339355{
     356    if (num==0) // may later be used for another method
     357    {
     358        TVector d = evt;
     359        d *= m;
     360        return sqrt(d*evt);
     361    }
     362
    340363    const Int_t rows = fM.GetNrows();
    341364    const Int_t cols = fM.GetNcols();
     
    358381
    359382        dists[i] = d2*d; // square of distance
     383
     384        //
     385        // This corrects for numerical uncertanties in cases of very
     386        // small distances...
     387        //
     388        if (dists[i]<0)
     389            dists[i]=0;
    360390    }
    361391
     
    363393    TMath::Sort(dists.GetSize(), dists.GetArray(), idx.GetArray(), kFALSE);
    364394
    365     const Int_t n = num<rows ? num : rows;
    366 
    367     Double_t res = 0;
    368     for (int i=0; i<n; i++)
    369         res += dists[idx[i]];
    370 
    371     return sqrt(res)/n;
    372 }
    373 
     395    const Int_t n = abs(num)<rows ? abs(num) : rows;
     396
     397    if (num<0)
     398    {
     399        //
     400        // Kernel function sum
     401        //
     402        const Double_t h = 1;
     403
     404        Double_t res = 0;
     405        for (int i=0; i<n; i++)
     406            res += exp(-dists[idx[i]]/h);
     407
     408        return log(res/n);
     409    }
     410    else
     411    {
     412        //
     413        // Nearest Neighbor sum
     414        //
     415        Double_t res = 0;
     416        for (int i=0; i<n; i++)
     417            res += dists[idx[i]];
     418
     419        return sqrt(res/n);
     420    }
     421}
     422
     423// --------------------------------------------------------------------------
     424//
     425// Calls calc dist. In the case of the first call the covariance matrix
     426// fM2 is calculated.
     427//  - If n<0 it is divided by (nrows-1)/h while h is the kernel factor.
     428//
    374429Double_t MHMatrix::CalcDist(const TVector &evt, Int_t num)
    375430{
     
    379434        fM2.ResizeTo(m);
    380435        fM2 = m;
     436        fM2 *= fM.GetNrows()-1;
    381437        delete &m;
    382438    }
     
    391447    fM.ResizeTo(m);
    392448    fM = m;
    393 
    394     TIter Next(fRules);
    395     TObject *obj = NULL;
    396     while ((obj=Next()))
    397         fData->Add(new MDataChain(obj->GetName()));
    398 }
     449}
     450
     451void MHMatrix::StreamPrimitive(ofstream &out) const
     452{
     453    Bool_t data = fData && !TestBit(kIsOwner);
     454
     455    if (data)
     456    {
     457        fData->SavePrimitive(out);
     458        out << endl;
     459    }
     460
     461    out << "   MHMatrix " << GetUniqueName();
     462
     463    if (data || fName!=gsDefName || fTitle!=gsDefTitle)
     464    {
     465        out << "(";
     466        if (data)
     467            out << "&" << fData->GetUniqueName();
     468        if (fName!=gsDefName || fTitle!=gsDefTitle)
     469        {
     470            if (data)
     471                out << ", ";
     472            out << "\"" << fName << "\"";
     473            if (fTitle!=gsDefTitle)
     474                out << ", \"" << fTitle << "\"";
     475        }
     476    }
     477    out << ");" << endl;
     478
     479    if (fData && TestBit(kIsOwner))
     480        for (int i=0; i<fData->GetNumEntries(); i++)
     481            out << "   " << GetUniqueName() << ".AddColumn(\"" << (*fData)[i].GetRule() << "\");" << endl;
     482}
Note: See TracChangeset for help on using the changeset viewer.