| 1 | #ifndef MARS_MUnfold | 
|---|
| 2 | #define MARS_MUnfold | 
|---|
| 3 |  | 
|---|
| 4 | #ifndef ROOT_TH1 | 
|---|
| 5 | #include <TH1.h> | 
|---|
| 6 | #endif | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef ROOT_TMatrixD | 
|---|
| 9 | #include <TMatrixD.h> | 
|---|
| 10 | #endif | 
|---|
| 11 |  | 
|---|
| 12 | #ifndef MARS_MTask | 
|---|
| 13 | #include "MTask.h" | 
|---|
| 14 | #endif | 
|---|
| 15 |  | 
|---|
| 16 | class TH2; | 
|---|
| 17 | class TH3; | 
|---|
| 18 | class TString; | 
|---|
| 19 | class TVectorD; | 
|---|
| 20 | class TH2D; | 
|---|
| 21 | class TH3D; | 
|---|
| 22 |  | 
|---|
| 23 | class MUnfold : public MTask | 
|---|
| 24 | { | 
|---|
| 25 |  | 
|---|
| 26 | private: | 
|---|
| 27 |  | 
|---|
| 28 | TH1 *DrawMatrixClone(const TMatrixD &m, Option_t *opt); | 
|---|
| 29 | TH1 *DrawMatrixColClone(const TMatrixD &m, Option_t *opt, Int_t col); | 
|---|
| 30 | void PrintTH3Content(const TH3 &hist); | 
|---|
| 31 | void PrintTH3Error(const TH3 &hist); | 
|---|
| 32 | void PrintTH2Content(const TH2 &hist); | 
|---|
| 33 | void PrintTH2Error(const TH2 &hist); | 
|---|
| 34 | void PrintTH1Content(const TH1 &hist); | 
|---|
| 35 | void PrintTH1Error(const TH1 &hist); | 
|---|
| 36 | void CopyCol(TMatrixD &m, const TH1 &h, Int_t col); | 
|---|
| 37 | void CopyCol(TH1 &h, const TMatrixD &m, Int_t col); | 
|---|
| 38 | void CopyH2M(TMatrixD &m, const TH2 &h); | 
|---|
| 39 | void CopySqr(TMatrixD &m, const TH1 &h); | 
|---|
| 40 | Double_t GetMatrixSumRow(const TMatrixD &m, Int_t row); | 
|---|
| 41 | Double_t GetMatrixSumDiag(const TMatrixD &m); | 
|---|
| 42 | Double_t GetMatrixSumCol(const TMatrixD &m, Int_t col); | 
|---|
| 43 | Double_t GetMatrixSum(const TMatrixD &m); | 
|---|
| 44 |  | 
|---|
| 45 | public: | 
|---|
| 46 | TString   bintitle; | 
|---|
| 47 |  | 
|---|
| 48 | UInt_t    fNa;        // Number of bins in the distribution to be unfolded | 
|---|
| 49 | UInt_t    fNb;        // Number of bins in the unfolded distribution | 
|---|
| 50 |  | 
|---|
| 51 | TMatrixD  fMigrat;    // migration matrix                  (fNa, fNb) | 
|---|
| 52 | TMatrixD  fMigraterr2;// error**2 of migration matrix      (fNa, fNb) | 
|---|
| 53 |  | 
|---|
| 54 | TMatrixD  fMigOrig;    // original migration matrix         (fNa, fNb) | 
|---|
| 55 | TMatrixD  fMigOrigerr2;// error**2 oforiginal migr. matrix  (fNa, fNb) | 
|---|
| 56 |  | 
|---|
| 57 | TMatrixD  fMigSmoo;    // smoothed migration matrix M       (fNa, fNb) | 
|---|
| 58 | TMatrixD  fMigSmooerr2;// error**2 of smoothed migr. matrix (fNa, fNb) | 
|---|
| 59 | TMatrixD  fMigChi2;    // chi2 contributions for smoothing  (fNa, fNb) | 
|---|
| 60 |  | 
|---|
| 61 | TMatrixD  fVa;        // distribution to be unfolded       (fNa) | 
|---|
| 62 | TMatrixD  fVacov;     // error matrix of fVa               (fNa, fNa) | 
|---|
| 63 | TMatrixD  fVacovInv; // inverse of fVacov                 (fNa, fNa) | 
|---|
| 64 | Double_t  fSpurVacov; // Spur of fVacov | 
|---|
| 65 |  | 
|---|
| 66 | //    UInt_t    fVaevents;  // total number of events | 
|---|
| 67 | UInt_t    fVapoints;  // number of significant measurements | 
|---|
| 68 |  | 
|---|
| 69 | TMatrixD  fVb;        // unfolded distribution             (fNb) | 
|---|
| 70 | TMatrixD  fVbcov;     // error matrix of fVb               (fNb, fNb) | 
|---|
| 71 |  | 
|---|
| 72 | TMatrixD  fVEps;      // prior distribution                (fNb) | 
|---|
| 73 | TMatrixDColumn fVEps0; | 
|---|
| 74 |  | 
|---|
| 75 | Double_t  fW;         // weight | 
|---|
| 76 | Double_t  fWbest;     // best weight | 
|---|
| 77 | Int_t     ixbest; | 
|---|
| 78 |  | 
|---|
| 79 | TMatrixD  fResult;    // unfolded distribution and errors  (fNb, 5) | 
|---|
| 80 | TMatrixD  fChi2;      // chisquared contribution           (fNa, 1) | 
|---|
| 81 |  | 
|---|
| 82 | Double_t  fChisq;     // total chisquared | 
|---|
| 83 | Double_t  fNdf;       // number of degrees of freedom | 
|---|
| 84 | Double_t  fProb;      // chisquared probability | 
|---|
| 85 |  | 
|---|
| 86 | TMatrixD  G;          // G = M * M(transposed)             (fNa, fNa) | 
|---|
| 87 | TVectorD  EigenValue; // vector of eigenvalues lambda of G (fNa) | 
|---|
| 88 | TMatrixD  Eigen;      // matrix of eigen vectors of G      (fNa, fNa) | 
|---|
| 89 | Double_t  RankG;      // rank of G | 
|---|
| 90 | Double_t  tau;        // 1 / lambda_max | 
|---|
| 91 | Double_t  EpsLambda; | 
|---|
| 92 |  | 
|---|
| 93 | // quantities stored for each weight : | 
|---|
| 94 | TVectorD SpSig;       // Spur of covariance matrix of fVbcov | 
|---|
| 95 | TVectorD SpAR;        // effective rank of G^tilde | 
|---|
| 96 | TVectorD chisq;       // chi squared (measures agreement between | 
|---|
| 97 | // fVa and the folded fVb) | 
|---|
| 98 | TVectorD SecDer;      // regularization term = sum of (2nd der.)**2 | 
|---|
| 99 | TVectorD ZerDer;      // regularization term = sum of (fVb)**2 | 
|---|
| 100 | TVectorD Entrop;      // regularization term = reduced cross-entropy | 
|---|
| 101 | TVectorD DAR2;        // | 
|---|
| 102 | TVectorD Dsqbar;      // | 
|---|
| 103 |  | 
|---|
| 104 | Double_t SpurAR; | 
|---|
| 105 | Double_t SpurSigma; | 
|---|
| 106 | Double_t SecDeriv; | 
|---|
| 107 | Double_t ZerDeriv; | 
|---|
| 108 | Double_t Entropy; | 
|---|
| 109 | Double_t DiffAR2; | 
|---|
| 110 | Double_t Chisq; | 
|---|
| 111 | Double_t D2bar; | 
|---|
| 112 |  | 
|---|
| 113 | TMatrixD Chi2; | 
|---|
| 114 |  | 
|---|
| 115 | // | 
|---|
| 116 |  | 
|---|
| 117 | // plots versus weight | 
|---|
| 118 | Int_t    Nix; | 
|---|
| 119 | Double_t xmin; | 
|---|
| 120 | Double_t xmax; | 
|---|
| 121 | Double_t dlogx; | 
|---|
| 122 |  | 
|---|
| 123 | TH1D *hBchisq; | 
|---|
| 124 | TH1D *hBSpAR; | 
|---|
| 125 | TH1D *hBDSpAR; | 
|---|
| 126 | TH1D *hBSpSig; | 
|---|
| 127 | TH1D *hBDSpSig; | 
|---|
| 128 | TH1D *hBSecDeriv; | 
|---|
| 129 | TH1D *hBDSecDeriv; | 
|---|
| 130 | TH1D *hBZerDeriv; | 
|---|
| 131 | TH1D *hBDZerDeriv; | 
|---|
| 132 | TH1D *hBEntropy; | 
|---|
| 133 | TH1D *hBDEntropy; | 
|---|
| 134 | TH1D *hBDAR2; | 
|---|
| 135 | TH1D *hBD2bar; | 
|---|
| 136 |  | 
|---|
| 137 | // | 
|---|
| 138 | TH1D *hEigen; | 
|---|
| 139 |  | 
|---|
| 140 | // plots for the best solution | 
|---|
| 141 | TH2D *fhmig; | 
|---|
| 142 | TH2D *shmig; | 
|---|
| 143 | TH2D *shmigChi2; | 
|---|
| 144 |  | 
|---|
| 145 | TH1D *fhb0; | 
|---|
| 146 |  | 
|---|
| 147 | TH1D *fha; | 
|---|
| 148 |  | 
|---|
| 149 | TH1D *hprior; | 
|---|
| 150 |  | 
|---|
| 151 | TH1D *hb; | 
|---|
| 152 |  | 
|---|
| 153 | Double_t CalcSpurSigma(TMatrixD &T, Double_t norm=1); | 
|---|
| 154 |  | 
|---|
| 155 | // ----------------------------------------------------------------------- | 
|---|
| 156 | // | 
|---|
| 157 | // Constructor | 
|---|
| 158 | //              copy histograms into matrices | 
|---|
| 159 | // | 
|---|
| 160 | MUnfold(TH1D &ha, TH2D &hacov, TH2D &hmig); | 
|---|
| 161 | ~MUnfold(); | 
|---|
| 162 |  | 
|---|
| 163 | void SetPriorConstant(); | 
|---|
| 164 | Bool_t SetPriorRebin(TH1D &ha); | 
|---|
| 165 | Bool_t SetPriorInput(TH1D &hpr); | 
|---|
| 166 | Bool_t SetPriorPower(Double_t gamma); | 
|---|
| 167 | Bool_t SetInitialWeight(Double_t &weight); | 
|---|
| 168 | void PrintResults(); | 
|---|
| 169 | Bool_t Schmelling(TH1D &hb0); | 
|---|
| 170 | void SchmellCore(Int_t full, Double_t &xiter, TMatrixD &gamma, | 
|---|
| 171 | TMatrixD &dgamma, Double_t &dga2); | 
|---|
| 172 | Bool_t SmoothMigrationMatrix(TH2D &hmigorig); | 
|---|
| 173 | Bool_t Tikhonov2(TH1D &hb0); | 
|---|
| 174 | Bool_t Bertero(TH1D &hb0); | 
|---|
| 175 | Bool_t BertCore(Double_t &xiter); | 
|---|
| 176 | Bool_t CalculateG(); | 
|---|
| 177 | Bool_t SelectBestWeight(); | 
|---|
| 178 | Bool_t DrawPlots(); | 
|---|
| 179 | Bool_t CallMinuit( | 
|---|
| 180 | void (*fcnx)(Int_t &, Double_t *, Double_t &, Double_t *, Int_t), | 
|---|
| 181 | UInt_t npar, char name[20][100], | 
|---|
| 182 | Double_t vinit[20], Double_t step[20], | 
|---|
| 183 | Double_t limlo[20], Double_t limup[20], Int_t fix[20]); | 
|---|
| 184 | TMatrixD &GetVb() { return fVb; } | 
|---|
| 185 | TMatrixD &GetVbcov() { return fVbcov; } | 
|---|
| 186 | TMatrixD &GetResult() { return fResult; } | 
|---|
| 187 | TMatrixD &GetChi2() { return fChi2; } | 
|---|
| 188 | Double_t &GetChisq() { return fChisq; } | 
|---|
| 189 | Double_t &GetNdf() { return fNdf; } | 
|---|
| 190 | Double_t &GetProb() { return fProb; } | 
|---|
| 191 | TMatrixD &GetMigSmoo() { return fMigSmoo; } | 
|---|
| 192 | TMatrixD &GetMigSmooerr2() { return fMigSmooerr2; } | 
|---|
| 193 | TMatrixD &GetMigChi2() { return fMigChi2; } | 
|---|
| 194 |  | 
|---|
| 195 | ClassDef(MUnfold, 1) | 
|---|
| 196 |  | 
|---|
| 197 | }; | 
|---|
| 198 |  | 
|---|
| 199 | #endif | 
|---|