Changeset 1336


Ignore:
Timestamp:
06/03/02 09:57:00 (23 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars/mhist
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mhist/HistLinkDef.h

    r1334 r1336  
    4141#pragma link C++ class MHMcEnergyMigration+;
    4242
     43#pragma link C++ class MHCompProb+;
     44#pragma link C++ class MHHadroness+;
    4345
    4446#endif
  • trunk/MagicSoft/Mars/mhist/MFillH.cc

    r1334 r1336  
    243243
    244244        if (!obj)
     245        {
     246            if (cls==name)
     247                *fLog << inf << "Object '" << fHName << "' not found in parlist... trying to create one." << endl;
    245248            obj = pList->FindCreateObj(cls, name);
     249        }
    246250
    247251        if (!obj)
  • trunk/MagicSoft/Mars/mhist/MH3.cc

    r1334 r1336  
    319319        p->Draw("same");
    320320        p->SetBit(kCanDelete);
     321        p->SetDirectory(NULL);
    321322    }
    322323    if (str.Contains("PROFY", TString::kIgnoreCase) && fDimension==2)
     
    325326        p->Draw("same");
    326327        p->SetBit(kCanDelete);
     328        p->SetDirectory(NULL);
    327329    }
    328330
     
    352354        p->Draw("same");
    353355        p->SetBit(kCanDelete);
     356        p->SetDirectory(NULL);
    354357    }
    355358    if (str.Contains("PROFY", TString::kIgnoreCase) && fDimension==2)
     
    358361        p->Draw("same");
    359362        p->SetBit(kCanDelete);
     363        p->SetDirectory(NULL);
    360364    }
    361365
  • trunk/MagicSoft/Mars/mhist/MHMatrix.cc

    r1334 r1336  
    4343//
    4444/////////////////////////////////////////////////////////////////////////////
    45 
    4645#include "MHMatrix.h"
    4746
    4847#include <TList.h>
     48#include <TArrayD.h>
     49#include <TArrayI.h>
    4950
    5051#include "MLog.h"
     
    6162// Default Constructor
    6263//
    63 MHMatrix::MHMatrix()
     64MHMatrix::MHMatrix(const char *name, const char *title)
    6465    : fNumRow(0)
    6566{
     67    fName  = name  ? name  : "MHMatrix";
     68    fTitle = title ? title : "Multidimensional Matrix";
     69
    6670    fData = new TList;
    6771    fData->SetOwner();
     72
     73    fRules = new TList;
     74    fRules->SetOwner();
    6875}
    6976
     
    7582{
    7683    delete fData;
     84    delete fRules;
    7785}
    7886
     
    9199    }
    92100
    93     MDataChain &chain = *new MDataChain(name);
     101    MDataChain &chain = *new MDataChain(rule);
    94102    if (!chain.IsValid())
    95103    {
     
    100108
    101109    fData->Add(&chain);
     110
     111    TNamed *name = new TNamed(rule, "");
     112    fRules->Add(name);
     113}
     114
     115void MHMatrix::AddColumns(const MHMatrix *matrix)
     116{
     117    TIter Next(matrix->fRules);
     118    TObject *rule=NULL;
     119    while ((rule=Next()))
     120        AddColumn(rule->GetName());
    102121}
    103122
     
    264283{
    265284    int n=0;
    266     TIter Next(fData);
     285
     286    TIter Next(fData->GetSize() ? fData : fRules);
    267287    MData *data = NULL;
    268288    while ((data=(MData*)Next()))
    269289    {
    270         *fLog << all << " Column " << setw(3) << n++ << ": ";
     290        *fLog << all << " Column " << setw(3) << n++ << ": " << flush;
    271291        data->Print();
    272292        *fLog << endl;
     
    275295    fM.Print();
    276296}
     297
     298const TMatrix *MHMatrix::InvertPosDef()
     299{
     300    /*
     301     ----------------------------------
     302      Substract Mean of Rows from Rows
     303     ----------------------------------
     304
     305    const Int_t rows = fM.GetNrows();
     306    const Int_t cols = fM.GetNcols();
     307
     308    for (int i=0; i<rows; i++)
     309    {
     310        Double_t mean = 0;
     311        for (int j=0; j<cols; j++)
     312            mean += fM(i, j);
     313        mean /= cols;
     314
     315        for (int j=0; j<cols; j++)
     316            fM(i, j) -= mean;
     317    }
     318    */
     319    /*
     320     ----------------------------------
     321      Substract Mean of Cols from Cols
     322     ----------------------------------
     323
     324    const Int_t rows = fM.GetNrows();
     325    const Int_t cols = fM.GetNcols();
     326
     327    for (int i=0; i<cols; i++)
     328    {
     329        Double_t mean = 0;
     330        for (int j=0; j<rows; j++)
     331            mean += fM(j, i);
     332        mean /= rows;
     333
     334        for (int j=0; j<rows; j++)
     335            fM(j, i) -= mean;
     336    }
     337    */
     338
     339    TMatrix *m2 = new TMatrix(fM, TMatrix::kTransposeMult, fM);
     340
     341    Double_t det;
     342    m2->Invert(&det);
     343    if (det==0)
     344    {
     345        *fLog << err << "ERROR - MHMatrix::InvertPosDef failed (Matrix is sigular)." << endl;
     346        delete m2;
     347        return NULL;
     348    }
     349
     350    // m2->Print();
     351
     352    return m2;
     353}
     354
     355Double_t MHMatrix::CalcDist(const TMatrix &m, const TVector &evt, Int_t num) const
     356{
     357    const Int_t rows = fM.GetNrows();
     358    const Int_t cols = fM.GetNcols();
     359
     360    TArrayD dists(rows);
     361
     362    //
     363    // Calculate:  v^T * M * v
     364    //
     365    for (int i=0; i<rows; i++)
     366    {
     367        TVector col(cols);
     368        col = TMatrixRow(fM, i);
     369
     370        TVector d = evt;
     371        d -= col;
     372
     373        TVector d2 = d;
     374        d2 *= m;
     375
     376        dists[i] = fabs(d2*d);
     377    }
     378
     379    TArrayI idx(rows);
     380    TMath::Sort(dists.GetSize(), dists.GetArray(), idx.GetArray(), kFALSE);
     381
     382    const Int_t n = num<rows ? num : rows;
     383
     384    Double_t res = 0;
     385    for (int i=0; i<n; i++)
     386        res += dists[idx[i]];
     387
     388    return res/n;
     389}
     390
     391Double_t MHMatrix::CalcDist(const TVector &evt, Int_t num)
     392{
     393    if (!fM2.IsValid())
     394    {
     395        const TMatrix &m = *InvertPosDef();
     396        fM2.ResizeTo(m);
     397        fM2 = m;
     398        delete &m;
     399    }
     400
     401    return CalcDist(fM2, evt, num);
     402}
     403
     404void MHMatrix::Reassign()
     405{
     406    TMatrix m = fM;
     407    fM.ResizeTo(1,1);
     408    fM.ResizeTo(m);
     409    fM = m;
     410
     411    TIter Next(fRules);
     412    TObject *obj = NULL;
     413    while ((obj=Next()))
     414        fData->Add(new MDataChain(obj->GetName()));
     415}
  • trunk/MagicSoft/Mars/mhist/MHMatrix.h

    r1334 r1336  
    1414{
    1515protected:
    16     Int_t   fNumRow; // Number of dimensions of histogram
     16    Int_t   fNumRow; //! Number of dimensions of histogram
    1717    TMatrix fM;      // Matrix to be filled
    1818
    19     TList  *fData;   // List of data members (columns)
     19    TMatrix fM2;     //!
     20
     21    TList  *fData;   //! List of data members (columns)
     22    TList  *fRules;  // List of data members as text for storage
    2023
    2124    void AddRow();
     
    2629
    2730public:
    28     MHMatrix();
     31    MHMatrix(const char *name=NULL, const char *title=NULL);
    2932    ~MHMatrix();
    3033
    3134    void AddColumn(const char *name);
     35    void AddColumns(const MHMatrix *matrix);
    3236
    33     TMatrix &GetM() { return fM; }
     37    //    TMatrix &GetM() { return fM; }
    3438    const TMatrix &GetM() const { return fM; }
     39    const TList *GetRules() const { return fRules; }
    3540
    3641    //void Draw(Option_t *opt=NULL);
     
    3944    void Print(Option_t *) const;
    4045
     46    const TMatrix *InvertPosDef();
     47
     48    Double_t CalcDist(const TMatrix &m, const TVector &v, Int_t num = 25) const;
     49    Double_t CalcDist(const TVector &v, Int_t num = 25);
     50
     51    void Reassign();
     52
    4153    ClassDef(MHMatrix, 1) // Multidimensional Matrix to store events
    4254};
  • trunk/MagicSoft/Mars/mhist/Makefile

    r1334 r1336  
    4848           MHTimeDiffTime.cc \
    4949           MHTimeDiffTheta.cc \
     50           MHCompProb.cc \
     51           MHHadroness.cc \
    5052           MHMcEnergy.cc \
    5153           MHMcEfficiency.cc \
     
    5355           MHMcEfficiencyEnergy.cc \
    5456           MHMcEnergyImpact.cc \
     57           MHMcEnergyMigration.cc \
    5558           MHThetabarTime.cc \
    5659           MHMcRate.cc \
Note: See TracChangeset for help on using the changeset viewer.