TMatrixTCramerInv.cxx

Go to the documentation of this file.
00001 // @(#)root/base:$Id: TMatrixTCramerInv.cxx 20882 2007-11-19 11:31:26Z rdm $
00002 // Authors: Fons Rademakers, Eddy Offermann  Jan 2004
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // TMatrixTCramerInv                                                    //
00015 //                                                                      //
00016 // Encapsulate templates of Cramer Inversion routines.                  //
00017 //                                                                      //
00018 // The 4x4, 5x5 and 6x6 are adapted from routines written by            //
00019 // Mark Fischler and Steven Haywood as part of the CLHEP package        //
00020 //                                                                      //
00021 // Although for sizes <= 6x6 the Cramer Inversion has a gain in speed   //
00022 // compared to factorization schemes (like LU) , one pays a price in    //
00023 // accuracy  .                                                          //
00024 //                                                                      //
00025 // For Example:                                                         //
00026 //  H * H^-1 = U, where H is a 5x5 Hilbert matrix                       //
00027 //                      U is a 5x5 Unity matrix                         //
00028 //                                                                      //
00029 // LU    : |U_jk| < 10e-13 for  j!=k                                    //
00030 // Cramer: |U_jk| < 10e-7  for  j!=k                                    //
00031 //                                                                      //
00032 //  however Cramer algorithm is about 10 (!) times faster               //
00033 //////////////////////////////////////////////////////////////////////////
00034 
00035 #include "TMatrixTCramerInv.h"
00036 
00037 #if !defined(R__ALPHA) && !defined(R__SOLARIS) && !defined(R__ACC) && !defined(R__FBSD)
00038 NamespaceImp(TMatrixTCramerInv);
00039 #endif
00040 
00041 //______________________________________________________________________________
00042 template<class Element> 
00043 Bool_t TMatrixTCramerInv::Inv2x2(TMatrixT<Element> &m,Double_t *determ)
00044 {
00045    if (m.GetNrows() != 2 || m.GetNcols() != 2 || m.GetRowLwb() != m.GetColLwb()) {
00046       Error("Inv2x2","matrix should be square 2x2");
00047       return kFALSE;
00048    }
00049 
00050    Element *pM = m.GetMatrixArray();
00051 
00052    const Double_t det = pM[0] * pM[3] - pM[2] * pM[1];
00053 
00054    if (determ)
00055       *determ = det;
00056 
00057    const Double_t s = 1./det;
00058    if ( det == 0 ) {
00059       Error("Inv2x2","matrix is singular");
00060       return kFALSE;
00061    }
00062 
00063    const Double_t tmp = s*pM[3];
00064    pM[1] *= -s;
00065    pM[2] *= -s;
00066    pM[3] = s*pM[0];
00067    pM[0] = tmp;
00068 
00069    return kTRUE;
00070 }
00071 
00072 //______________________________________________________________________________
00073 template<class Element> 
00074 Bool_t TMatrixTCramerInv::Inv3x3(TMatrixT<Element> &m,Double_t *determ)
00075 {
00076    if (m.GetNrows() != 3 || m.GetNcols() != 3 || m.GetRowLwb() != m.GetColLwb()) {
00077       Error("Inv3x3","matrix should be square 3x3");
00078       return kFALSE;
00079    }
00080 
00081    Element *pM = m.GetMatrixArray();
00082 
00083    const Double_t c00 = pM[4] * pM[8] - pM[5] * pM[7];
00084    const Double_t c01 = pM[5] * pM[6] - pM[3] * pM[8];
00085    const Double_t c02 = pM[3] * pM[7] - pM[4] * pM[6];
00086    const Double_t c10 = pM[7] * pM[2] - pM[8] * pM[1];
00087    const Double_t c11 = pM[8] * pM[0] - pM[6] * pM[2];
00088    const Double_t c12 = pM[6] * pM[1] - pM[7] * pM[0];
00089    const Double_t c20 = pM[1] * pM[5] - pM[2] * pM[4];
00090    const Double_t c21 = pM[2] * pM[3] - pM[0] * pM[5];
00091    const Double_t c22 = pM[0] * pM[4] - pM[1] * pM[3];
00092 
00093    const Double_t t0 = TMath::Abs(pM[0]);
00094    const Double_t t1 = TMath::Abs(pM[3]);
00095    const Double_t t2 = TMath::Abs(pM[6]);
00096    Double_t det;
00097    Double_t tmp;
00098    if (t0 >= t1) {
00099       if (t2 >= t0) {
00100       tmp = pM[6];
00101       det = c12*c01-c11*c02;
00102       } else {
00103          tmp = pM[0];
00104          det = c11*c22-c12*c21;
00105       }
00106    } else if (t2 >= t1) {
00107       tmp = pM[6];
00108       det = c12*c01-c11*c02;
00109    } else {
00110       tmp = pM[3];
00111       det = c02*c21-c01*c22;
00112    }
00113 
00114    if ( det == 0 || tmp == 0) {
00115       Error("Inv3x3","matrix is singular");
00116       return kFALSE;
00117    }
00118 
00119    const Double_t s = tmp/det;
00120    if (determ)
00121       *determ = 1./s;
00122 
00123    pM[0] = s*c00;
00124    pM[1] = s*c10;
00125    pM[2] = s*c20;
00126    pM[3] = s*c01;
00127    pM[4] = s*c11;
00128    pM[5] = s*c21;
00129    pM[6] = s*c02;
00130    pM[7] = s*c12;
00131    pM[8] = s*c22;
00132   
00133    return kTRUE;
00134 }
00135 
00136 // GFij are indices for a 4x4 matrix.
00137 
00138 #define GF00 0
00139 #define GF01 1
00140 #define GF02 2
00141 #define GF03 3
00142 
00143 #define GF10 4
00144 #define GF11 5
00145 #define GF12 6
00146 #define GF13 7
00147 
00148 #define GF20 8
00149 #define GF21 9
00150 #define GF22 10
00151 #define GF23 11
00152 
00153 #define GF30 12
00154 #define GF31 13
00155 #define GF32 14
00156 #define GF33 15
00157 
00158 //______________________________________________________________________________
00159 template<class Element> 
00160 Bool_t TMatrixTCramerInv::Inv4x4(TMatrixT<Element> &m,Double_t *determ)
00161 {
00162    if (m.GetNrows() != 4 || m.GetNcols() != 4 || m.GetRowLwb() != m.GetColLwb()) {
00163       Error("Inv4x4","matrix should be square 4x4");
00164       return kFALSE;
00165    }
00166 
00167    Element *pM = m.GetMatrixArray();
00168 
00169   // Find all NECESSARY 2x2 dets:  (18 of them)
00170 
00171    const Double_t det2_12_01 = pM[GF10]*pM[GF21] - pM[GF11]*pM[GF20];
00172    const Double_t det2_12_02 = pM[GF10]*pM[GF22] - pM[GF12]*pM[GF20];
00173    const Double_t det2_12_03 = pM[GF10]*pM[GF23] - pM[GF13]*pM[GF20];
00174    const Double_t det2_12_13 = pM[GF11]*pM[GF23] - pM[GF13]*pM[GF21];
00175    const Double_t det2_12_23 = pM[GF12]*pM[GF23] - pM[GF13]*pM[GF22];
00176    const Double_t det2_12_12 = pM[GF11]*pM[GF22] - pM[GF12]*pM[GF21];
00177    const Double_t det2_13_01 = pM[GF10]*pM[GF31] - pM[GF11]*pM[GF30];
00178    const Double_t det2_13_02 = pM[GF10]*pM[GF32] - pM[GF12]*pM[GF30];
00179    const Double_t det2_13_03 = pM[GF10]*pM[GF33] - pM[GF13]*pM[GF30];
00180    const Double_t det2_13_12 = pM[GF11]*pM[GF32] - pM[GF12]*pM[GF31];
00181    const Double_t det2_13_13 = pM[GF11]*pM[GF33] - pM[GF13]*pM[GF31];
00182    const Double_t det2_13_23 = pM[GF12]*pM[GF33] - pM[GF13]*pM[GF32];
00183    const Double_t det2_23_01 = pM[GF20]*pM[GF31] - pM[GF21]*pM[GF30];
00184    const Double_t det2_23_02 = pM[GF20]*pM[GF32] - pM[GF22]*pM[GF30];
00185    const Double_t det2_23_03 = pM[GF20]*pM[GF33] - pM[GF23]*pM[GF30];
00186    const Double_t det2_23_12 = pM[GF21]*pM[GF32] - pM[GF22]*pM[GF31];
00187    const Double_t det2_23_13 = pM[GF21]*pM[GF33] - pM[GF23]*pM[GF31];
00188    const Double_t det2_23_23 = pM[GF22]*pM[GF33] - pM[GF23]*pM[GF32];
00189 
00190   // Find all NECESSARY 3x3 dets:   (16 of them)
00191 
00192    const Double_t det3_012_012 = pM[GF00]*det2_12_12 - pM[GF01]*det2_12_02 
00193                                  + pM[GF02]*det2_12_01;
00194    const Double_t det3_012_013 = pM[GF00]*det2_12_13 - pM[GF01]*det2_12_03 
00195                                  + pM[GF03]*det2_12_01;
00196    const Double_t det3_012_023 = pM[GF00]*det2_12_23 - pM[GF02]*det2_12_03 
00197                                  + pM[GF03]*det2_12_02;
00198    const Double_t det3_012_123 = pM[GF01]*det2_12_23 - pM[GF02]*det2_12_13 
00199                                  + pM[GF03]*det2_12_12;
00200    const Double_t det3_013_012 = pM[GF00]*det2_13_12 - pM[GF01]*det2_13_02 
00201                                  + pM[GF02]*det2_13_01;
00202    const Double_t det3_013_013 = pM[GF00]*det2_13_13 - pM[GF01]*det2_13_03
00203                                  + pM[GF03]*det2_13_01;
00204    const Double_t det3_013_023 = pM[GF00]*det2_13_23 - pM[GF02]*det2_13_03
00205                                  + pM[GF03]*det2_13_02;
00206    const Double_t det3_013_123 = pM[GF01]*det2_13_23 - pM[GF02]*det2_13_13
00207                                  + pM[GF03]*det2_13_12;
00208    const Double_t det3_023_012 = pM[GF00]*det2_23_12 - pM[GF01]*det2_23_02 
00209                                  + pM[GF02]*det2_23_01;
00210    const Double_t det3_023_013 = pM[GF00]*det2_23_13 - pM[GF01]*det2_23_03
00211                                  + pM[GF03]*det2_23_01;
00212    const Double_t det3_023_023 = pM[GF00]*det2_23_23 - pM[GF02]*det2_23_03
00213                                  + pM[GF03]*det2_23_02;
00214    const Double_t det3_023_123 = pM[GF01]*det2_23_23 - pM[GF02]*det2_23_13
00215                                  + pM[GF03]*det2_23_12;
00216    const Double_t det3_123_012 = pM[GF10]*det2_23_12 - pM[GF11]*det2_23_02 
00217                                  + pM[GF12]*det2_23_01;
00218    const Double_t det3_123_013 = pM[GF10]*det2_23_13 - pM[GF11]*det2_23_03 
00219                                   + pM[GF13]*det2_23_01;
00220    const Double_t det3_123_023 = pM[GF10]*det2_23_23 - pM[GF12]*det2_23_03 
00221                                  + pM[GF13]*det2_23_02;
00222    const Double_t det3_123_123 = pM[GF11]*det2_23_23 - pM[GF12]*det2_23_13 
00223                                  + pM[GF13]*det2_23_12;
00224 
00225   // Find the 4x4 det:
00226 
00227    const Double_t det = pM[GF00]*det3_123_123 - pM[GF01]*det3_123_023 
00228                         + pM[GF02]*det3_123_013 - pM[GF03]*det3_123_012;
00229    if (determ)
00230       *determ = det;
00231 
00232    if ( det == 0 ) {
00233       Error("Inv4x4","matrix is singular");
00234       return kFALSE;
00235    }
00236 
00237    const Double_t oneOverDet = 1.0/det;
00238    const Double_t mn1OverDet = - oneOverDet;
00239 
00240    pM[GF00] =  det3_123_123 * oneOverDet;
00241    pM[GF01] =  det3_023_123 * mn1OverDet;
00242    pM[GF02] =  det3_013_123 * oneOverDet;
00243    pM[GF03] =  det3_012_123 * mn1OverDet;
00244 
00245    pM[GF10] =  det3_123_023 * mn1OverDet;
00246    pM[GF11] =  det3_023_023 * oneOverDet;
00247    pM[GF12] =  det3_013_023 * mn1OverDet;
00248    pM[GF13] =  det3_012_023 * oneOverDet;
00249 
00250    pM[GF20] =  det3_123_013 * oneOverDet;
00251    pM[GF21] =  det3_023_013 * mn1OverDet;
00252    pM[GF22] =  det3_013_013 * oneOverDet;
00253    pM[GF23] =  det3_012_013 * mn1OverDet;
00254 
00255    pM[GF30] =  det3_123_012 * mn1OverDet;
00256    pM[GF31] =  det3_023_012 * oneOverDet;
00257    pM[GF32] =  det3_013_012 * mn1OverDet;
00258    pM[GF33] =  det3_012_012 * oneOverDet;
00259 
00260    return kTRUE;
00261 }
00262 
00263 // GMij are indices for a 5x5 matrix.
00264 
00265 #define GM00 0
00266 #define GM01 1
00267 #define GM02 2
00268 #define GM03 3
00269 #define GM04 4
00270 
00271 #define GM10 5
00272 #define GM11 6
00273 #define GM12 7
00274 #define GM13 8
00275 #define GM14 9
00276 
00277 #define GM20 10
00278 #define GM21 11
00279 #define GM22 12
00280 #define GM23 13
00281 #define GM24 14
00282 
00283 #define GM30 15
00284 #define GM31 16
00285 #define GM32 17
00286 #define GM33 18
00287 #define GM34 19
00288 
00289 #define GM40 20
00290 #define GM41 21
00291 #define GM42 22
00292 #define GM43 23
00293 #define GM44 24
00294 
00295 //______________________________________________________________________________
00296 template<class Element> 
00297 Bool_t TMatrixTCramerInv::Inv5x5(TMatrixT<Element> &m,Double_t *determ)
00298 {
00299    if (m.GetNrows() != 5 || m.GetNcols() != 5 || m.GetRowLwb() != m.GetColLwb()) {
00300       Error("Inv5x5","matrix should be square 5x5");
00301       return kFALSE;
00302    }
00303 
00304    Element *pM = m.GetMatrixArray();
00305 
00306   // Find all NECESSARY 2x2 dets:  (30 of them)
00307 
00308    const Double_t det2_23_01 = pM[GM20]*pM[GM31] - pM[GM21]*pM[GM30];
00309    const Double_t det2_23_02 = pM[GM20]*pM[GM32] - pM[GM22]*pM[GM30];
00310    const Double_t det2_23_03 = pM[GM20]*pM[GM33] - pM[GM23]*pM[GM30];
00311    const Double_t det2_23_04 = pM[GM20]*pM[GM34] - pM[GM24]*pM[GM30];
00312    const Double_t det2_23_12 = pM[GM21]*pM[GM32] - pM[GM22]*pM[GM31];
00313    const Double_t det2_23_13 = pM[GM21]*pM[GM33] - pM[GM23]*pM[GM31];
00314    const Double_t det2_23_14 = pM[GM21]*pM[GM34] - pM[GM24]*pM[GM31];
00315    const Double_t det2_23_23 = pM[GM22]*pM[GM33] - pM[GM23]*pM[GM32];
00316    const Double_t det2_23_24 = pM[GM22]*pM[GM34] - pM[GM24]*pM[GM32];
00317    const Double_t det2_23_34 = pM[GM23]*pM[GM34] - pM[GM24]*pM[GM33];
00318    const Double_t det2_24_01 = pM[GM20]*pM[GM41] - pM[GM21]*pM[GM40];
00319    const Double_t det2_24_02 = pM[GM20]*pM[GM42] - pM[GM22]*pM[GM40];
00320    const Double_t det2_24_03 = pM[GM20]*pM[GM43] - pM[GM23]*pM[GM40];
00321    const Double_t det2_24_04 = pM[GM20]*pM[GM44] - pM[GM24]*pM[GM40];
00322    const Double_t det2_24_12 = pM[GM21]*pM[GM42] - pM[GM22]*pM[GM41];
00323    const Double_t det2_24_13 = pM[GM21]*pM[GM43] - pM[GM23]*pM[GM41];
00324    const Double_t det2_24_14 = pM[GM21]*pM[GM44] - pM[GM24]*pM[GM41];
00325    const Double_t det2_24_23 = pM[GM22]*pM[GM43] - pM[GM23]*pM[GM42];
00326    const Double_t det2_24_24 = pM[GM22]*pM[GM44] - pM[GM24]*pM[GM42];
00327    const Double_t det2_24_34 = pM[GM23]*pM[GM44] - pM[GM24]*pM[GM43];
00328    const Double_t det2_34_01 = pM[GM30]*pM[GM41] - pM[GM31]*pM[GM40];
00329    const Double_t det2_34_02 = pM[GM30]*pM[GM42] - pM[GM32]*pM[GM40];
00330    const Double_t det2_34_03 = pM[GM30]*pM[GM43] - pM[GM33]*pM[GM40];
00331    const Double_t det2_34_04 = pM[GM30]*pM[GM44] - pM[GM34]*pM[GM40];
00332    const Double_t det2_34_12 = pM[GM31]*pM[GM42] - pM[GM32]*pM[GM41];
00333    const Double_t det2_34_13 = pM[GM31]*pM[GM43] - pM[GM33]*pM[GM41];
00334    const Double_t det2_34_14 = pM[GM31]*pM[GM44] - pM[GM34]*pM[GM41];
00335    const Double_t det2_34_23 = pM[GM32]*pM[GM43] - pM[GM33]*pM[GM42];
00336    const Double_t det2_34_24 = pM[GM32]*pM[GM44] - pM[GM34]*pM[GM42];
00337    const Double_t det2_34_34 = pM[GM33]*pM[GM44] - pM[GM34]*pM[GM43];
00338 
00339   // Find all NECESSARY 3x3 dets:   (40 of them)
00340 
00341    const Double_t det3_123_012 = pM[GM10]*det2_23_12 - pM[GM11]*det2_23_02 + pM[GM12]*det2_23_01;
00342    const Double_t det3_123_013 = pM[GM10]*det2_23_13 - pM[GM11]*det2_23_03 + pM[GM13]*det2_23_01;
00343    const Double_t det3_123_014 = pM[GM10]*det2_23_14 - pM[GM11]*det2_23_04 + pM[GM14]*det2_23_01;
00344    const Double_t det3_123_023 = pM[GM10]*det2_23_23 - pM[GM12]*det2_23_03 + pM[GM13]*det2_23_02;
00345    const Double_t det3_123_024 = pM[GM10]*det2_23_24 - pM[GM12]*det2_23_04 + pM[GM14]*det2_23_02;
00346    const Double_t det3_123_034 = pM[GM10]*det2_23_34 - pM[GM13]*det2_23_04 + pM[GM14]*det2_23_03;
00347    const Double_t det3_123_123 = pM[GM11]*det2_23_23 - pM[GM12]*det2_23_13 + pM[GM13]*det2_23_12;
00348    const Double_t det3_123_124 = pM[GM11]*det2_23_24 - pM[GM12]*det2_23_14 + pM[GM14]*det2_23_12;
00349    const Double_t det3_123_134 = pM[GM11]*det2_23_34 - pM[GM13]*det2_23_14 + pM[GM14]*det2_23_13;
00350    const Double_t det3_123_234 = pM[GM12]*det2_23_34 - pM[GM13]*det2_23_24 + pM[GM14]*det2_23_23;
00351    const Double_t det3_124_012 = pM[GM10]*det2_24_12 - pM[GM11]*det2_24_02 + pM[GM12]*det2_24_01;
00352    const Double_t det3_124_013 = pM[GM10]*det2_24_13 - pM[GM11]*det2_24_03 + pM[GM13]*det2_24_01;
00353    const Double_t det3_124_014 = pM[GM10]*det2_24_14 - pM[GM11]*det2_24_04 + pM[GM14]*det2_24_01;
00354    const Double_t det3_124_023 = pM[GM10]*det2_24_23 - pM[GM12]*det2_24_03 + pM[GM13]*det2_24_02;
00355    const Double_t det3_124_024 = pM[GM10]*det2_24_24 - pM[GM12]*det2_24_04 + pM[GM14]*det2_24_02;
00356    const Double_t det3_124_034 = pM[GM10]*det2_24_34 - pM[GM13]*det2_24_04 + pM[GM14]*det2_24_03;
00357    const Double_t det3_124_123 = pM[GM11]*det2_24_23 - pM[GM12]*det2_24_13 + pM[GM13]*det2_24_12;
00358    const Double_t det3_124_124 = pM[GM11]*det2_24_24 - pM[GM12]*det2_24_14 + pM[GM14]*det2_24_12;
00359    const Double_t det3_124_134 = pM[GM11]*det2_24_34 - pM[GM13]*det2_24_14 + pM[GM14]*det2_24_13;
00360    const Double_t det3_124_234 = pM[GM12]*det2_24_34 - pM[GM13]*det2_24_24 + pM[GM14]*det2_24_23;
00361    const Double_t det3_134_012 = pM[GM10]*det2_34_12 - pM[GM11]*det2_34_02 + pM[GM12]*det2_34_01;
00362    const Double_t det3_134_013 = pM[GM10]*det2_34_13 - pM[GM11]*det2_34_03 + pM[GM13]*det2_34_01;
00363    const Double_t det3_134_014 = pM[GM10]*det2_34_14 - pM[GM11]*det2_34_04 + pM[GM14]*det2_34_01;
00364    const Double_t det3_134_023 = pM[GM10]*det2_34_23 - pM[GM12]*det2_34_03 + pM[GM13]*det2_34_02;
00365    const Double_t det3_134_024 = pM[GM10]*det2_34_24 - pM[GM12]*det2_34_04 + pM[GM14]*det2_34_02;
00366    const Double_t det3_134_034 = pM[GM10]*det2_34_34 - pM[GM13]*det2_34_04 + pM[GM14]*det2_34_03;
00367    const Double_t det3_134_123 = pM[GM11]*det2_34_23 - pM[GM12]*det2_34_13 + pM[GM13]*det2_34_12;
00368    const Double_t det3_134_124 = pM[GM11]*det2_34_24 - pM[GM12]*det2_34_14 + pM[GM14]*det2_34_12;
00369    const Double_t det3_134_134 = pM[GM11]*det2_34_34 - pM[GM13]*det2_34_14 + pM[GM14]*det2_34_13;
00370    const Double_t det3_134_234 = pM[GM12]*det2_34_34 - pM[GM13]*det2_34_24 + pM[GM14]*det2_34_23;
00371    const Double_t det3_234_012 = pM[GM20]*det2_34_12 - pM[GM21]*det2_34_02 + pM[GM22]*det2_34_01;
00372    const Double_t det3_234_013 = pM[GM20]*det2_34_13 - pM[GM21]*det2_34_03 + pM[GM23]*det2_34_01;
00373    const Double_t det3_234_014 = pM[GM20]*det2_34_14 - pM[GM21]*det2_34_04 + pM[GM24]*det2_34_01;
00374    const Double_t det3_234_023 = pM[GM20]*det2_34_23 - pM[GM22]*det2_34_03 + pM[GM23]*det2_34_02;
00375    const Double_t det3_234_024 = pM[GM20]*det2_34_24 - pM[GM22]*det2_34_04 + pM[GM24]*det2_34_02;
00376    const Double_t det3_234_034 = pM[GM20]*det2_34_34 - pM[GM23]*det2_34_04 + pM[GM24]*det2_34_03;
00377    const Double_t det3_234_123 = pM[GM21]*det2_34_23 - pM[GM22]*det2_34_13 + pM[GM23]*det2_34_12;
00378    const Double_t det3_234_124 = pM[GM21]*det2_34_24 - pM[GM22]*det2_34_14 + pM[GM24]*det2_34_12;
00379    const Double_t det3_234_134 = pM[GM21]*det2_34_34 - pM[GM23]*det2_34_14 + pM[GM24]*det2_34_13;
00380    const Double_t det3_234_234 = pM[GM22]*det2_34_34 - pM[GM23]*det2_34_24 + pM[GM24]*det2_34_23;
00381 
00382   // Find all NECESSARY 4x4 dets:   (25 of them)
00383 
00384    const Double_t det4_0123_0123 = pM[GM00]*det3_123_123 - pM[GM01]*det3_123_023 
00385                                    + pM[GM02]*det3_123_013 - pM[GM03]*det3_123_012;
00386    const Double_t det4_0123_0124 = pM[GM00]*det3_123_124 - pM[GM01]*det3_123_024 
00387                                    + pM[GM02]*det3_123_014 - pM[GM04]*det3_123_012;
00388    const Double_t det4_0123_0134 = pM[GM00]*det3_123_134 - pM[GM01]*det3_123_034 
00389                                    + pM[GM03]*det3_123_014 - pM[GM04]*det3_123_013;
00390    const Double_t det4_0123_0234 = pM[GM00]*det3_123_234 - pM[GM02]*det3_123_034 
00391                                    + pM[GM03]*det3_123_024 - pM[GM04]*det3_123_023;
00392    const Double_t det4_0123_1234 = pM[GM01]*det3_123_234 - pM[GM02]*det3_123_134 
00393                                    + pM[GM03]*det3_123_124 - pM[GM04]*det3_123_123;
00394    const Double_t det4_0124_0123 = pM[GM00]*det3_124_123 - pM[GM01]*det3_124_023 
00395                                    + pM[GM02]*det3_124_013 - pM[GM03]*det3_124_012;
00396    const Double_t det4_0124_0124 = pM[GM00]*det3_124_124 - pM[GM01]*det3_124_024 
00397                                    + pM[GM02]*det3_124_014 - pM[GM04]*det3_124_012;
00398    const Double_t det4_0124_0134 = pM[GM00]*det3_124_134 - pM[GM01]*det3_124_034 
00399                                    + pM[GM03]*det3_124_014 - pM[GM04]*det3_124_013;
00400    const Double_t det4_0124_0234 = pM[GM00]*det3_124_234 - pM[GM02]*det3_124_034 
00401                                    + pM[GM03]*det3_124_024 - pM[GM04]*det3_124_023;
00402    const Double_t det4_0124_1234 = pM[GM01]*det3_124_234 - pM[GM02]*det3_124_134 
00403                                    + pM[GM03]*det3_124_124 - pM[GM04]*det3_124_123;
00404    const Double_t det4_0134_0123 = pM[GM00]*det3_134_123 - pM[GM01]*det3_134_023 
00405                                    + pM[GM02]*det3_134_013 - pM[GM03]*det3_134_012;
00406    const Double_t det4_0134_0124 = pM[GM00]*det3_134_124 - pM[GM01]*det3_134_024 
00407                                    + pM[GM02]*det3_134_014 - pM[GM04]*det3_134_012;
00408    const Double_t det4_0134_0134 = pM[GM00]*det3_134_134 - pM[GM01]*det3_134_034 
00409                                    + pM[GM03]*det3_134_014 - pM[GM04]*det3_134_013;
00410    const Double_t det4_0134_0234 = pM[GM00]*det3_134_234 - pM[GM02]*det3_134_034 
00411                                    + pM[GM03]*det3_134_024 - pM[GM04]*det3_134_023;
00412    const Double_t det4_0134_1234 = pM[GM01]*det3_134_234 - pM[GM02]*det3_134_134 
00413                                    + pM[GM03]*det3_134_124 - pM[GM04]*det3_134_123;
00414    const Double_t det4_0234_0123 = pM[GM00]*det3_234_123 - pM[GM01]*det3_234_023 
00415                                    + pM[GM02]*det3_234_013 - pM[GM03]*det3_234_012;
00416    const Double_t det4_0234_0124 = pM[GM00]*det3_234_124 - pM[GM01]*det3_234_024 
00417                                    + pM[GM02]*det3_234_014 - pM[GM04]*det3_234_012;
00418    const Double_t det4_0234_0134 = pM[GM00]*det3_234_134 - pM[GM01]*det3_234_034 
00419                                    + pM[GM03]*det3_234_014 - pM[GM04]*det3_234_013;
00420    const Double_t det4_0234_0234 = pM[GM00]*det3_234_234 - pM[GM02]*det3_234_034 
00421                                    + pM[GM03]*det3_234_024 - pM[GM04]*det3_234_023;
00422    const Double_t det4_0234_1234 = pM[GM01]*det3_234_234 - pM[GM02]*det3_234_134 
00423                                    + pM[GM03]*det3_234_124 - pM[GM04]*det3_234_123;
00424    const Double_t det4_1234_0123 = pM[GM10]*det3_234_123 - pM[GM11]*det3_234_023 
00425                                    + pM[GM12]*det3_234_013 - pM[GM13]*det3_234_012;
00426    const Double_t det4_1234_0124 = pM[GM10]*det3_234_124 - pM[GM11]*det3_234_024 
00427                                     + pM[GM12]*det3_234_014 - pM[GM14]*det3_234_012;
00428    const Double_t det4_1234_0134 = pM[GM10]*det3_234_134 - pM[GM11]*det3_234_034 
00429                                    + pM[GM13]*det3_234_014 - pM[GM14]*det3_234_013;
00430    const Double_t det4_1234_0234 = pM[GM10]*det3_234_234 - pM[GM12]*det3_234_034 
00431                                    + pM[GM13]*det3_234_024 - pM[GM14]*det3_234_023;
00432    const Double_t det4_1234_1234 = pM[GM11]*det3_234_234 - pM[GM12]*det3_234_134 
00433                                    + pM[GM13]*det3_234_124 - pM[GM14]*det3_234_123;
00434 
00435   // Find the 5x5 det:
00436 
00437    const Double_t det = pM[GM00]*det4_1234_1234 - pM[GM01]*det4_1234_0234 + pM[GM02]*det4_1234_0134 
00438                         - pM[GM03]*det4_1234_0124 + pM[GM04]*det4_1234_0123;
00439    if (determ)
00440       *determ = det;
00441 
00442    if ( det == 0 ) {
00443       Error("Inv5x5","matrix is singular");
00444       return kFALSE;
00445    }
00446 
00447    const Double_t oneOverDet = 1.0/det;
00448    const Double_t mn1OverDet = - oneOverDet;
00449 
00450    pM[GM00] =  det4_1234_1234 * oneOverDet;
00451    pM[GM01] =  det4_0234_1234 * mn1OverDet;
00452    pM[GM02] =  det4_0134_1234 * oneOverDet;
00453    pM[GM03] =  det4_0124_1234 * mn1OverDet;
00454    pM[GM04] =  det4_0123_1234 * oneOverDet;
00455 
00456    pM[GM10] =  det4_1234_0234 * mn1OverDet;
00457    pM[GM11] =  det4_0234_0234 * oneOverDet;
00458    pM[GM12] =  det4_0134_0234 * mn1OverDet;
00459    pM[GM13] =  det4_0124_0234 * oneOverDet;
00460    pM[GM14] =  det4_0123_0234 * mn1OverDet;
00461 
00462    pM[GM20] =  det4_1234_0134 * oneOverDet;
00463    pM[GM21] =  det4_0234_0134 * mn1OverDet;
00464    pM[GM22] =  det4_0134_0134 * oneOverDet;
00465    pM[GM23] =  det4_0124_0134 * mn1OverDet;
00466    pM[GM24] =  det4_0123_0134 * oneOverDet;
00467 
00468    pM[GM30] =  det4_1234_0124 * mn1OverDet;
00469    pM[GM31] =  det4_0234_0124 * oneOverDet;
00470    pM[GM32] =  det4_0134_0124 * mn1OverDet;
00471    pM[GM33] =  det4_0124_0124 * oneOverDet;
00472    pM[GM34] =  det4_0123_0124 * mn1OverDet;
00473 
00474    pM[GM40] =  det4_1234_0123 * oneOverDet;
00475    pM[GM41] =  det4_0234_0123 * mn1OverDet;
00476    pM[GM42] =  det4_0134_0123 * oneOverDet;
00477    pM[GM43] =  det4_0124_0123 * mn1OverDet;
00478    pM[GM44] =  det4_0123_0123 * oneOverDet;
00479 
00480    return kTRUE;
00481 }
00482 
00483 // Aij are indices for a 6x6 matrix.
00484 
00485 #define GA00 0
00486 #define GA01 1
00487 #define GA02 2
00488 #define GA03 3
00489 #define GA04 4
00490 #define GA05 5
00491 
00492 #define GA10 6
00493 #define GA11 7
00494 #define GA12 8
00495 #define GA13 9
00496 #define GA14 10
00497 #define GA15 11
00498 
00499 #define GA20 12
00500 #define GA21 13
00501 #define GA22 14
00502 #define GA23 15
00503 #define GA24 16
00504 #define GA25 17
00505 
00506 #define GA30 18
00507 #define GA31 19
00508 #define GA32 20
00509 #define GA33 21
00510 #define GA34 22
00511 #define GA35 23
00512 
00513 #define GA40 24
00514 #define GA41 25
00515 #define GA42 26
00516 #define GA43 27
00517 #define GA44 28
00518 #define GA45 29
00519 
00520 #define GA50 30
00521 #define GA51 31
00522 #define GA52 32
00523 #define GA53 33
00524 #define GA54 34
00525 #define GA55 35
00526 
00527 //______________________________________________________________________________
00528 template<class Element> 
00529 Bool_t TMatrixTCramerInv::Inv6x6(TMatrixT<Element> &m,Double_t *determ)
00530 {
00531    if (m.GetNrows() != 6 || m.GetNcols() != 6 || m.GetRowLwb() != m.GetColLwb()) {
00532       Error("Inv6x6","matrix should be square 6x6");
00533       return kFALSE;
00534    }
00535 
00536    Element *pM = m.GetMatrixArray();
00537 
00538    // Find all NECESSGARY 2x2 dets:  (45 of them)
00539 
00540    const Double_t det2_34_01 = pM[GA30]*pM[GA41] - pM[GA31]*pM[GA40];
00541    const Double_t det2_34_02 = pM[GA30]*pM[GA42] - pM[GA32]*pM[GA40];
00542    const Double_t det2_34_03 = pM[GA30]*pM[GA43] - pM[GA33]*pM[GA40];
00543    const Double_t det2_34_04 = pM[GA30]*pM[GA44] - pM[GA34]*pM[GA40];
00544    const Double_t det2_34_05 = pM[GA30]*pM[GA45] - pM[GA35]*pM[GA40];
00545    const Double_t det2_34_12 = pM[GA31]*pM[GA42] - pM[GA32]*pM[GA41];
00546    const Double_t det2_34_13 = pM[GA31]*pM[GA43] - pM[GA33]*pM[GA41];
00547    const Double_t det2_34_14 = pM[GA31]*pM[GA44] - pM[GA34]*pM[GA41];
00548    const Double_t det2_34_15 = pM[GA31]*pM[GA45] - pM[GA35]*pM[GA41];
00549    const Double_t det2_34_23 = pM[GA32]*pM[GA43] - pM[GA33]*pM[GA42];
00550    const Double_t det2_34_24 = pM[GA32]*pM[GA44] - pM[GA34]*pM[GA42];
00551    const Double_t det2_34_25 = pM[GA32]*pM[GA45] - pM[GA35]*pM[GA42];
00552    const Double_t det2_34_34 = pM[GA33]*pM[GA44] - pM[GA34]*pM[GA43];
00553    const Double_t det2_34_35 = pM[GA33]*pM[GA45] - pM[GA35]*pM[GA43];
00554    const Double_t det2_34_45 = pM[GA34]*pM[GA45] - pM[GA35]*pM[GA44];
00555    const Double_t det2_35_01 = pM[GA30]*pM[GA51] - pM[GA31]*pM[GA50];
00556    const Double_t det2_35_02 = pM[GA30]*pM[GA52] - pM[GA32]*pM[GA50];
00557    const Double_t det2_35_03 = pM[GA30]*pM[GA53] - pM[GA33]*pM[GA50];
00558    const Double_t det2_35_04 = pM[GA30]*pM[GA54] - pM[GA34]*pM[GA50];
00559    const Double_t det2_35_05 = pM[GA30]*pM[GA55] - pM[GA35]*pM[GA50];
00560    const Double_t det2_35_12 = pM[GA31]*pM[GA52] - pM[GA32]*pM[GA51];
00561    const Double_t det2_35_13 = pM[GA31]*pM[GA53] - pM[GA33]*pM[GA51];
00562    const Double_t det2_35_14 = pM[GA31]*pM[GA54] - pM[GA34]*pM[GA51];
00563    const Double_t det2_35_15 = pM[GA31]*pM[GA55] - pM[GA35]*pM[GA51];
00564    const Double_t det2_35_23 = pM[GA32]*pM[GA53] - pM[GA33]*pM[GA52];
00565    const Double_t det2_35_24 = pM[GA32]*pM[GA54] - pM[GA34]*pM[GA52];
00566    const Double_t det2_35_25 = pM[GA32]*pM[GA55] - pM[GA35]*pM[GA52];
00567    const Double_t det2_35_34 = pM[GA33]*pM[GA54] - pM[GA34]*pM[GA53];
00568    const Double_t det2_35_35 = pM[GA33]*pM[GA55] - pM[GA35]*pM[GA53];
00569    const Double_t det2_35_45 = pM[GA34]*pM[GA55] - pM[GA35]*pM[GA54];
00570    const Double_t det2_45_01 = pM[GA40]*pM[GA51] - pM[GA41]*pM[GA50];
00571    const Double_t det2_45_02 = pM[GA40]*pM[GA52] - pM[GA42]*pM[GA50];
00572    const Double_t det2_45_03 = pM[GA40]*pM[GA53] - pM[GA43]*pM[GA50];
00573    const Double_t det2_45_04 = pM[GA40]*pM[GA54] - pM[GA44]*pM[GA50];
00574    const Double_t det2_45_05 = pM[GA40]*pM[GA55] - pM[GA45]*pM[GA50];
00575    const Double_t det2_45_12 = pM[GA41]*pM[GA52] - pM[GA42]*pM[GA51];
00576    const Double_t det2_45_13 = pM[GA41]*pM[GA53] - pM[GA43]*pM[GA51];
00577    const Double_t det2_45_14 = pM[GA41]*pM[GA54] - pM[GA44]*pM[GA51];
00578    const Double_t det2_45_15 = pM[GA41]*pM[GA55] - pM[GA45]*pM[GA51];
00579    const Double_t det2_45_23 = pM[GA42]*pM[GA53] - pM[GA43]*pM[GA52];
00580    const Double_t det2_45_24 = pM[GA42]*pM[GA54] - pM[GA44]*pM[GA52];
00581    const Double_t det2_45_25 = pM[GA42]*pM[GA55] - pM[GA45]*pM[GA52];
00582    const Double_t det2_45_34 = pM[GA43]*pM[GA54] - pM[GA44]*pM[GA53];
00583    const Double_t det2_45_35 = pM[GA43]*pM[GA55] - pM[GA45]*pM[GA53];
00584    const Double_t det2_45_45 = pM[GA44]*pM[GA55] - pM[GA45]*pM[GA54];
00585 
00586   // Find all NECESSGARY 3x3 dets:  (80 of them)
00587 
00588    const Double_t det3_234_012 = pM[GA20]*det2_34_12 - pM[GA21]*det2_34_02 + pM[GA22]*det2_34_01;
00589    const Double_t det3_234_013 = pM[GA20]*det2_34_13 - pM[GA21]*det2_34_03 + pM[GA23]*det2_34_01;
00590    const Double_t det3_234_014 = pM[GA20]*det2_34_14 - pM[GA21]*det2_34_04 + pM[GA24]*det2_34_01;
00591    const Double_t det3_234_015 = pM[GA20]*det2_34_15 - pM[GA21]*det2_34_05 + pM[GA25]*det2_34_01;
00592    const Double_t det3_234_023 = pM[GA20]*det2_34_23 - pM[GA22]*det2_34_03 + pM[GA23]*det2_34_02;
00593    const Double_t det3_234_024 = pM[GA20]*det2_34_24 - pM[GA22]*det2_34_04 + pM[GA24]*det2_34_02;
00594    const Double_t det3_234_025 = pM[GA20]*det2_34_25 - pM[GA22]*det2_34_05 + pM[GA25]*det2_34_02;
00595    const Double_t det3_234_034 = pM[GA20]*det2_34_34 - pM[GA23]*det2_34_04 + pM[GA24]*det2_34_03;
00596    const Double_t det3_234_035 = pM[GA20]*det2_34_35 - pM[GA23]*det2_34_05 + pM[GA25]*det2_34_03;
00597    const Double_t det3_234_045 = pM[GA20]*det2_34_45 - pM[GA24]*det2_34_05 + pM[GA25]*det2_34_04;
00598    const Double_t det3_234_123 = pM[GA21]*det2_34_23 - pM[GA22]*det2_34_13 + pM[GA23]*det2_34_12;
00599    const Double_t det3_234_124 = pM[GA21]*det2_34_24 - pM[GA22]*det2_34_14 + pM[GA24]*det2_34_12;
00600    const Double_t det3_234_125 = pM[GA21]*det2_34_25 - pM[GA22]*det2_34_15 + pM[GA25]*det2_34_12;
00601    const Double_t det3_234_134 = pM[GA21]*det2_34_34 - pM[GA23]*det2_34_14 + pM[GA24]*det2_34_13;
00602    const Double_t det3_234_135 = pM[GA21]*det2_34_35 - pM[GA23]*det2_34_15 + pM[GA25]*det2_34_13;
00603    const Double_t det3_234_145 = pM[GA21]*det2_34_45 - pM[GA24]*det2_34_15 + pM[GA25]*det2_34_14;
00604    const Double_t det3_234_234 = pM[GA22]*det2_34_34 - pM[GA23]*det2_34_24 + pM[GA24]*det2_34_23;
00605    const Double_t det3_234_235 = pM[GA22]*det2_34_35 - pM[GA23]*det2_34_25 + pM[GA25]*det2_34_23;
00606    const Double_t det3_234_245 = pM[GA22]*det2_34_45 - pM[GA24]*det2_34_25 + pM[GA25]*det2_34_24;
00607    const Double_t det3_234_345 = pM[GA23]*det2_34_45 - pM[GA24]*det2_34_35 + pM[GA25]*det2_34_34;
00608    const Double_t det3_235_012 = pM[GA20]*det2_35_12 - pM[GA21]*det2_35_02 + pM[GA22]*det2_35_01;
00609    const Double_t det3_235_013 = pM[GA20]*det2_35_13 - pM[GA21]*det2_35_03 + pM[GA23]*det2_35_01;
00610    const Double_t det3_235_014 = pM[GA20]*det2_35_14 - pM[GA21]*det2_35_04 + pM[GA24]*det2_35_01;
00611    const Double_t det3_235_015 = pM[GA20]*det2_35_15 - pM[GA21]*det2_35_05 + pM[GA25]*det2_35_01;
00612    const Double_t det3_235_023 = pM[GA20]*det2_35_23 - pM[GA22]*det2_35_03 + pM[GA23]*det2_35_02;
00613    const Double_t det3_235_024 = pM[GA20]*det2_35_24 - pM[GA22]*det2_35_04 + pM[GA24]*det2_35_02;
00614    const Double_t det3_235_025 = pM[GA20]*det2_35_25 - pM[GA22]*det2_35_05 + pM[GA25]*det2_35_02;
00615    const Double_t det3_235_034 = pM[GA20]*det2_35_34 - pM[GA23]*det2_35_04 + pM[GA24]*det2_35_03;
00616    const Double_t det3_235_035 = pM[GA20]*det2_35_35 - pM[GA23]*det2_35_05 + pM[GA25]*det2_35_03;
00617    const Double_t det3_235_045 = pM[GA20]*det2_35_45 - pM[GA24]*det2_35_05 + pM[GA25]*det2_35_04;
00618    const Double_t det3_235_123 = pM[GA21]*det2_35_23 - pM[GA22]*det2_35_13 + pM[GA23]*det2_35_12;
00619    const Double_t det3_235_124 = pM[GA21]*det2_35_24 - pM[GA22]*det2_35_14 + pM[GA24]*det2_35_12;
00620    const Double_t det3_235_125 = pM[GA21]*det2_35_25 - pM[GA22]*det2_35_15 + pM[GA25]*det2_35_12;
00621    const Double_t det3_235_134 = pM[GA21]*det2_35_34 - pM[GA23]*det2_35_14 + pM[GA24]*det2_35_13;
00622    const Double_t det3_235_135 = pM[GA21]*det2_35_35 - pM[GA23]*det2_35_15 + pM[GA25]*det2_35_13;
00623    const Double_t det3_235_145 = pM[GA21]*det2_35_45 - pM[GA24]*det2_35_15 + pM[GA25]*det2_35_14;
00624    const Double_t det3_235_234 = pM[GA22]*det2_35_34 - pM[GA23]*det2_35_24 + pM[GA24]*det2_35_23;
00625    const Double_t det3_235_235 = pM[GA22]*det2_35_35 - pM[GA23]*det2_35_25 + pM[GA25]*det2_35_23;
00626    const Double_t det3_235_245 = pM[GA22]*det2_35_45 - pM[GA24]*det2_35_25 + pM[GA25]*det2_35_24;
00627    const Double_t det3_235_345 = pM[GA23]*det2_35_45 - pM[GA24]*det2_35_35 + pM[GA25]*det2_35_34;
00628    const Double_t det3_245_012 = pM[GA20]*det2_45_12 - pM[GA21]*det2_45_02 + pM[GA22]*det2_45_01;
00629    const Double_t det3_245_013 = pM[GA20]*det2_45_13 - pM[GA21]*det2_45_03 + pM[GA23]*det2_45_01;
00630    const Double_t det3_245_014 = pM[GA20]*det2_45_14 - pM[GA21]*det2_45_04 + pM[GA24]*det2_45_01;
00631    const Double_t det3_245_015 = pM[GA20]*det2_45_15 - pM[GA21]*det2_45_05 + pM[GA25]*det2_45_01;
00632    const Double_t det3_245_023 = pM[GA20]*det2_45_23 - pM[GA22]*det2_45_03 + pM[GA23]*det2_45_02;
00633    const Double_t det3_245_024 = pM[GA20]*det2_45_24 - pM[GA22]*det2_45_04 + pM[GA24]*det2_45_02;
00634    const Double_t det3_245_025 = pM[GA20]*det2_45_25 - pM[GA22]*det2_45_05 + pM[GA25]*det2_45_02;
00635    const Double_t det3_245_034 = pM[GA20]*det2_45_34 - pM[GA23]*det2_45_04 + pM[GA24]*det2_45_03;
00636    const Double_t det3_245_035 = pM[GA20]*det2_45_35 - pM[GA23]*det2_45_05 + pM[GA25]*det2_45_03;
00637    const Double_t det3_245_045 = pM[GA20]*det2_45_45 - pM[GA24]*det2_45_05 + pM[GA25]*det2_45_04;
00638    const Double_t det3_245_123 = pM[GA21]*det2_45_23 - pM[GA22]*det2_45_13 + pM[GA23]*det2_45_12;
00639    const Double_t det3_245_124 = pM[GA21]*det2_45_24 - pM[GA22]*det2_45_14 + pM[GA24]*det2_45_12;
00640    const Double_t det3_245_125 = pM[GA21]*det2_45_25 - pM[GA22]*det2_45_15 + pM[GA25]*det2_45_12;
00641    const Double_t det3_245_134 = pM[GA21]*det2_45_34 - pM[GA23]*det2_45_14 + pM[GA24]*det2_45_13;
00642    const Double_t det3_245_135 = pM[GA21]*det2_45_35 - pM[GA23]*det2_45_15 + pM[GA25]*det2_45_13;
00643    const Double_t det3_245_145 = pM[GA21]*det2_45_45 - pM[GA24]*det2_45_15 + pM[GA25]*det2_45_14;
00644    const Double_t det3_245_234 = pM[GA22]*det2_45_34 - pM[GA23]*det2_45_24 + pM[GA24]*det2_45_23;
00645    const Double_t det3_245_235 = pM[GA22]*det2_45_35 - pM[GA23]*det2_45_25 + pM[GA25]*det2_45_23;
00646    const Double_t det3_245_245 = pM[GA22]*det2_45_45 - pM[GA24]*det2_45_25 + pM[GA25]*det2_45_24;
00647    const Double_t det3_245_345 = pM[GA23]*det2_45_45 - pM[GA24]*det2_45_35 + pM[GA25]*det2_45_34;
00648    const Double_t det3_345_012 = pM[GA30]*det2_45_12 - pM[GA31]*det2_45_02 + pM[GA32]*det2_45_01;
00649    const Double_t det3_345_013 = pM[GA30]*det2_45_13 - pM[GA31]*det2_45_03 + pM[GA33]*det2_45_01;
00650    const Double_t det3_345_014 = pM[GA30]*det2_45_14 - pM[GA31]*det2_45_04 + pM[GA34]*det2_45_01;
00651    const Double_t det3_345_015 = pM[GA30]*det2_45_15 - pM[GA31]*det2_45_05 + pM[GA35]*det2_45_01;
00652    const Double_t det3_345_023 = pM[GA30]*det2_45_23 - pM[GA32]*det2_45_03 + pM[GA33]*det2_45_02;
00653    const Double_t det3_345_024 = pM[GA30]*det2_45_24 - pM[GA32]*det2_45_04 + pM[GA34]*det2_45_02;
00654    const Double_t det3_345_025 = pM[GA30]*det2_45_25 - pM[GA32]*det2_45_05 + pM[GA35]*det2_45_02;
00655    const Double_t det3_345_034 = pM[GA30]*det2_45_34 - pM[GA33]*det2_45_04 + pM[GA34]*det2_45_03;
00656    const Double_t det3_345_035 = pM[GA30]*det2_45_35 - pM[GA33]*det2_45_05 + pM[GA35]*det2_45_03;
00657    const Double_t det3_345_045 = pM[GA30]*det2_45_45 - pM[GA34]*det2_45_05 + pM[GA35]*det2_45_04;
00658    const Double_t det3_345_123 = pM[GA31]*det2_45_23 - pM[GA32]*det2_45_13 + pM[GA33]*det2_45_12;
00659    const Double_t det3_345_124 = pM[GA31]*det2_45_24 - pM[GA32]*det2_45_14 + pM[GA34]*det2_45_12;
00660    const Double_t det3_345_125 = pM[GA31]*det2_45_25 - pM[GA32]*det2_45_15 + pM[GA35]*det2_45_12;
00661    const Double_t det3_345_134 = pM[GA31]*det2_45_34 - pM[GA33]*det2_45_14 + pM[GA34]*det2_45_13;
00662    const Double_t det3_345_135 = pM[GA31]*det2_45_35 - pM[GA33]*det2_45_15 + pM[GA35]*det2_45_13;
00663    const Double_t det3_345_145 = pM[GA31]*det2_45_45 - pM[GA34]*det2_45_15 + pM[GA35]*det2_45_14;
00664    const Double_t det3_345_234 = pM[GA32]*det2_45_34 - pM[GA33]*det2_45_24 + pM[GA34]*det2_45_23;
00665    const Double_t det3_345_235 = pM[GA32]*det2_45_35 - pM[GA33]*det2_45_25 + pM[GA35]*det2_45_23;
00666    const Double_t det3_345_245 = pM[GA32]*det2_45_45 - pM[GA34]*det2_45_25 + pM[GA35]*det2_45_24;
00667    const Double_t det3_345_345 = pM[GA33]*det2_45_45 - pM[GA34]*det2_45_35 + pM[GA35]*det2_45_34;
00668  
00669   // Find all NECESSGARY 4x4 dets:  (75 of them)
00670 
00671    const Double_t det4_1234_0123 = pM[GA10]*det3_234_123 - pM[GA11]*det3_234_023 
00672                                    + pM[GA12]*det3_234_013 - pM[GA13]*det3_234_012;
00673    const Double_t det4_1234_0124 = pM[GA10]*det3_234_124 - pM[GA11]*det3_234_024 
00674                                    + pM[GA12]*det3_234_014 - pM[GA14]*det3_234_012;
00675    const Double_t det4_1234_0125 = pM[GA10]*det3_234_125 - pM[GA11]*det3_234_025 
00676                                    + pM[GA12]*det3_234_015 - pM[GA15]*det3_234_012;
00677    const Double_t det4_1234_0134 = pM[GA10]*det3_234_134 - pM[GA11]*det3_234_034 
00678                                    + pM[GA13]*det3_234_014 - pM[GA14]*det3_234_013;
00679    const Double_t det4_1234_0135 = pM[GA10]*det3_234_135 - pM[GA11]*det3_234_035
00680                                    + pM[GA13]*det3_234_015 - pM[GA15]*det3_234_013;
00681    const Double_t det4_1234_0145 = pM[GA10]*det3_234_145 - pM[GA11]*det3_234_045
00682                                    + pM[GA14]*det3_234_015 - pM[GA15]*det3_234_014;
00683    const Double_t det4_1234_0234 = pM[GA10]*det3_234_234 - pM[GA12]*det3_234_034 
00684                                    + pM[GA13]*det3_234_024 - pM[GA14]*det3_234_023;
00685    const Double_t det4_1234_0235 = pM[GA10]*det3_234_235 - pM[GA12]*det3_234_035 
00686                                    + pM[GA13]*det3_234_025 - pM[GA15]*det3_234_023;
00687    const Double_t det4_1234_0245 = pM[GA10]*det3_234_245 - pM[GA12]*det3_234_045 
00688                                    + pM[GA14]*det3_234_025 - pM[GA15]*det3_234_024;
00689    const Double_t det4_1234_0345 = pM[GA10]*det3_234_345 - pM[GA13]*det3_234_045 
00690                                    + pM[GA14]*det3_234_035 - pM[GA15]*det3_234_034;
00691    const Double_t det4_1234_1234 = pM[GA11]*det3_234_234 - pM[GA12]*det3_234_134 
00692                                    + pM[GA13]*det3_234_124 - pM[GA14]*det3_234_123;
00693    const Double_t det4_1234_1235 = pM[GA11]*det3_234_235 - pM[GA12]*det3_234_135 
00694                                    + pM[GA13]*det3_234_125 - pM[GA15]*det3_234_123;
00695    const Double_t det4_1234_1245 = pM[GA11]*det3_234_245 - pM[GA12]*det3_234_145 
00696                                    + pM[GA14]*det3_234_125 - pM[GA15]*det3_234_124;
00697    const Double_t det4_1234_1345 = pM[GA11]*det3_234_345 - pM[GA13]*det3_234_145 
00698                                    + pM[GA14]*det3_234_135 - pM[GA15]*det3_234_134;
00699    const Double_t det4_1234_2345 = pM[GA12]*det3_234_345 - pM[GA13]*det3_234_245 
00700                                    + pM[GA14]*det3_234_235 - pM[GA15]*det3_234_234;
00701    const Double_t det4_1235_0123 = pM[GA10]*det3_235_123 - pM[GA11]*det3_235_023 
00702                                    + pM[GA12]*det3_235_013 - pM[GA13]*det3_235_012;
00703    const Double_t det4_1235_0124 = pM[GA10]*det3_235_124 - pM[GA11]*det3_235_024 
00704                                    + pM[GA12]*det3_235_014 - pM[GA14]*det3_235_012;
00705    const Double_t det4_1235_0125 = pM[GA10]*det3_235_125 - pM[GA11]*det3_235_025 
00706                                    + pM[GA12]*det3_235_015 - pM[GA15]*det3_235_012;
00707    const Double_t det4_1235_0134 = pM[GA10]*det3_235_134 - pM[GA11]*det3_235_034 
00708                                    + pM[GA13]*det3_235_014 - pM[GA14]*det3_235_013;
00709    const Double_t det4_1235_0135 = pM[GA10]*det3_235_135 - pM[GA11]*det3_235_035 
00710                                    + pM[GA13]*det3_235_015 - pM[GA15]*det3_235_013;
00711    const Double_t det4_1235_0145 = pM[GA10]*det3_235_145 - pM[GA11]*det3_235_045 
00712                                    + pM[GA14]*det3_235_015 - pM[GA15]*det3_235_014;
00713    const Double_t det4_1235_0234 = pM[GA10]*det3_235_234 - pM[GA12]*det3_235_034 
00714                                    + pM[GA13]*det3_235_024 - pM[GA14]*det3_235_023;
00715    const Double_t det4_1235_0235 = pM[GA10]*det3_235_235 - pM[GA12]*det3_235_035 
00716                                    + pM[GA13]*det3_235_025 - pM[GA15]*det3_235_023;
00717    const Double_t det4_1235_0245 = pM[GA10]*det3_235_245 - pM[GA12]*det3_235_045 
00718                                    + pM[GA14]*det3_235_025 - pM[GA15]*det3_235_024;
00719    const Double_t det4_1235_0345 = pM[GA10]*det3_235_345 - pM[GA13]*det3_235_045 
00720                                    + pM[GA14]*det3_235_035 - pM[GA15]*det3_235_034;
00721    const Double_t det4_1235_1234 = pM[GA11]*det3_235_234 - pM[GA12]*det3_235_134 
00722                                    + pM[GA13]*det3_235_124 - pM[GA14]*det3_235_123;
00723    const Double_t det4_1235_1235 = pM[GA11]*det3_235_235 - pM[GA12]*det3_235_135 
00724                                    + pM[GA13]*det3_235_125 - pM[GA15]*det3_235_123;
00725    const Double_t det4_1235_1245 = pM[GA11]*det3_235_245 - pM[GA12]*det3_235_145 
00726                                    + pM[GA14]*det3_235_125 - pM[GA15]*det3_235_124;
00727    const Double_t det4_1235_1345 = pM[GA11]*det3_235_345 - pM[GA13]*det3_235_145 
00728                                    + pM[GA14]*det3_235_135 - pM[GA15]*det3_235_134;
00729    const Double_t det4_1235_2345 = pM[GA12]*det3_235_345 - pM[GA13]*det3_235_245 
00730                                    + pM[GA14]*det3_235_235 - pM[GA15]*det3_235_234;
00731    const Double_t det4_1245_0123 = pM[GA10]*det3_245_123 - pM[GA11]*det3_245_023 
00732                                    + pM[GA12]*det3_245_013 - pM[GA13]*det3_245_012;
00733    const Double_t det4_1245_0124 = pM[GA10]*det3_245_124 - pM[GA11]*det3_245_024 
00734                                    + pM[GA12]*det3_245_014 - pM[GA14]*det3_245_012;
00735    const Double_t det4_1245_0125 = pM[GA10]*det3_245_125 - pM[GA11]*det3_245_025 
00736                                    + pM[GA12]*det3_245_015 - pM[GA15]*det3_245_012;
00737    const Double_t det4_1245_0134 = pM[GA10]*det3_245_134 - pM[GA11]*det3_245_034 
00738                                    + pM[GA13]*det3_245_014 - pM[GA14]*det3_245_013;
00739    const Double_t det4_1245_0135 = pM[GA10]*det3_245_135 - pM[GA11]*det3_245_035 
00740                                    + pM[GA13]*det3_245_015 - pM[GA15]*det3_245_013;
00741    const Double_t det4_1245_0145 = pM[GA10]*det3_245_145 - pM[GA11]*det3_245_045 
00742                                    + pM[GA14]*det3_245_015 - pM[GA15]*det3_245_014;
00743    const Double_t det4_1245_0234 = pM[GA10]*det3_245_234 - pM[GA12]*det3_245_034 
00744                                    + pM[GA13]*det3_245_024 - pM[GA14]*det3_245_023;
00745    const Double_t det4_1245_0235 = pM[GA10]*det3_245_235 - pM[GA12]*det3_245_035 
00746                                    + pM[GA13]*det3_245_025 - pM[GA15]*det3_245_023;
00747    const Double_t det4_1245_0245 = pM[GA10]*det3_245_245 - pM[GA12]*det3_245_045 
00748                                    + pM[GA14]*det3_245_025 - pM[GA15]*det3_245_024;
00749    const Double_t det4_1245_0345 = pM[GA10]*det3_245_345 - pM[GA13]*det3_245_045 
00750                                    + pM[GA14]*det3_245_035 - pM[GA15]*det3_245_034;
00751    const Double_t det4_1245_1234 = pM[GA11]*det3_245_234 - pM[GA12]*det3_245_134 
00752                                    + pM[GA13]*det3_245_124 - pM[GA14]*det3_245_123;
00753    const Double_t det4_1245_1235 = pM[GA11]*det3_245_235 - pM[GA12]*det3_245_135 
00754                                    + pM[GA13]*det3_245_125 - pM[GA15]*det3_245_123;
00755    const Double_t det4_1245_1245 = pM[GA11]*det3_245_245 - pM[GA12]*det3_245_145 
00756                                    + pM[GA14]*det3_245_125 - pM[GA15]*det3_245_124;
00757    const Double_t det4_1245_1345 = pM[GA11]*det3_245_345 - pM[GA13]*det3_245_145 
00758                                    + pM[GA14]*det3_245_135 - pM[GA15]*det3_245_134;
00759    const Double_t det4_1245_2345 = pM[GA12]*det3_245_345 - pM[GA13]*det3_245_245 
00760                                    + pM[GA14]*det3_245_235 - pM[GA15]*det3_245_234;
00761    const Double_t det4_1345_0123 = pM[GA10]*det3_345_123 - pM[GA11]*det3_345_023 
00762                                    + pM[GA12]*det3_345_013 - pM[GA13]*det3_345_012;
00763    const Double_t det4_1345_0124 = pM[GA10]*det3_345_124 - pM[GA11]*det3_345_024 
00764                                    + pM[GA12]*det3_345_014 - pM[GA14]*det3_345_012;
00765    const Double_t det4_1345_0125 = pM[GA10]*det3_345_125 - pM[GA11]*det3_345_025 
00766                                    + pM[GA12]*det3_345_015 - pM[GA15]*det3_345_012;
00767    const Double_t det4_1345_0134 = pM[GA10]*det3_345_134 - pM[GA11]*det3_345_034 
00768                                    + pM[GA13]*det3_345_014 - pM[GA14]*det3_345_013;
00769    const Double_t det4_1345_0135 = pM[GA10]*det3_345_135 - pM[GA11]*det3_345_035 
00770                                    + pM[GA13]*det3_345_015 - pM[GA15]*det3_345_013;
00771    const Double_t det4_1345_0145 = pM[GA10]*det3_345_145 - pM[GA11]*det3_345_045 
00772                                    + pM[GA14]*det3_345_015 - pM[GA15]*det3_345_014;
00773    const Double_t det4_1345_0234 = pM[GA10]*det3_345_234 - pM[GA12]*det3_345_034 
00774                                    + pM[GA13]*det3_345_024 - pM[GA14]*det3_345_023;
00775    const Double_t det4_1345_0235 = pM[GA10]*det3_345_235 - pM[GA12]*det3_345_035 
00776                                    + pM[GA13]*det3_345_025 - pM[GA15]*det3_345_023;
00777    const Double_t det4_1345_0245 = pM[GA10]*det3_345_245 - pM[GA12]*det3_345_045 
00778                                    + pM[GA14]*det3_345_025 - pM[GA15]*det3_345_024;
00779    const Double_t det4_1345_0345 = pM[GA10]*det3_345_345 - pM[GA13]*det3_345_045 
00780                                    + pM[GA14]*det3_345_035 - pM[GA15]*det3_345_034;
00781    const Double_t det4_1345_1234 = pM[GA11]*det3_345_234 - pM[GA12]*det3_345_134 
00782                                    + pM[GA13]*det3_345_124 - pM[GA14]*det3_345_123;
00783    const Double_t det4_1345_1235 = pM[GA11]*det3_345_235 - pM[GA12]*det3_345_135 
00784                                    + pM[GA13]*det3_345_125 - pM[GA15]*det3_345_123;
00785    const Double_t det4_1345_1245 = pM[GA11]*det3_345_245 - pM[GA12]*det3_345_145 
00786                                    + pM[GA14]*det3_345_125 - pM[GA15]*det3_345_124;
00787    const Double_t det4_1345_1345 = pM[GA11]*det3_345_345 - pM[GA13]*det3_345_145 
00788                                    + pM[GA14]*det3_345_135 - pM[GA15]*det3_345_134;
00789    const Double_t det4_1345_2345 = pM[GA12]*det3_345_345 - pM[GA13]*det3_345_245 
00790                                    + pM[GA14]*det3_345_235 - pM[GA15]*det3_345_234;
00791    const Double_t det4_2345_0123 = pM[GA20]*det3_345_123 - pM[GA21]*det3_345_023 
00792                                    + pM[GA22]*det3_345_013 - pM[GA23]*det3_345_012;
00793    const Double_t det4_2345_0124 = pM[GA20]*det3_345_124 - pM[GA21]*det3_345_024 
00794                                    + pM[GA22]*det3_345_014 - pM[GA24]*det3_345_012;
00795    const Double_t det4_2345_0125 = pM[GA20]*det3_345_125 - pM[GA21]*det3_345_025 
00796                                    + pM[GA22]*det3_345_015 - pM[GA25]*det3_345_012;
00797    const Double_t det4_2345_0134 = pM[GA20]*det3_345_134 - pM[GA21]*det3_345_034 
00798                                    + pM[GA23]*det3_345_014 - pM[GA24]*det3_345_013;
00799    const Double_t det4_2345_0135 = pM[GA20]*det3_345_135 - pM[GA21]*det3_345_035 
00800                                    + pM[GA23]*det3_345_015 - pM[GA25]*det3_345_013;
00801    const Double_t det4_2345_0145 = pM[GA20]*det3_345_145 - pM[GA21]*det3_345_045 
00802                                    + pM[GA24]*det3_345_015 - pM[GA25]*det3_345_014;
00803    const Double_t det4_2345_0234 = pM[GA20]*det3_345_234 - pM[GA22]*det3_345_034 
00804                                    + pM[GA23]*det3_345_024 - pM[GA24]*det3_345_023;
00805    const Double_t det4_2345_0235 = pM[GA20]*det3_345_235 - pM[GA22]*det3_345_035 
00806                                    + pM[GA23]*det3_345_025 - pM[GA25]*det3_345_023;
00807    const Double_t det4_2345_0245 = pM[GA20]*det3_345_245 - pM[GA22]*det3_345_045 
00808                                    + pM[GA24]*det3_345_025 - pM[GA25]*det3_345_024;
00809    const Double_t det4_2345_0345 = pM[GA20]*det3_345_345 - pM[GA23]*det3_345_045 
00810                                    + pM[GA24]*det3_345_035 - pM[GA25]*det3_345_034;
00811    const Double_t det4_2345_1234 = pM[GA21]*det3_345_234 - pM[GA22]*det3_345_134 
00812                                    + pM[GA23]*det3_345_124 - pM[GA24]*det3_345_123;
00813    const Double_t det4_2345_1235 = pM[GA21]*det3_345_235 - pM[GA22]*det3_345_135 
00814                                    + pM[GA23]*det3_345_125 - pM[GA25]*det3_345_123;
00815    const Double_t det4_2345_1245 = pM[GA21]*det3_345_245 - pM[GA22]*det3_345_145 
00816                                    + pM[GA24]*det3_345_125 - pM[GA25]*det3_345_124;
00817    const Double_t det4_2345_1345 = pM[GA21]*det3_345_345 - pM[GA23]*det3_345_145 
00818                                    + pM[GA24]*det3_345_135 - pM[GA25]*det3_345_134;
00819    const Double_t det4_2345_2345 = pM[GA22]*det3_345_345 - pM[GA23]*det3_345_245 
00820                                    + pM[GA24]*det3_345_235 - pM[GA25]*det3_345_234;
00821 
00822   // Find all NECESSGARY 5x5 dets:  (36 of them)
00823 
00824    const Double_t det5_01234_01234 = pM[GA00]*det4_1234_1234 - pM[GA01]*det4_1234_0234 
00825                                      + pM[GA02]*det4_1234_0134 - pM[GA03]*det4_1234_0124 + pM[GA04]*det4_1234_0123;
00826    const Double_t det5_01234_01235 = pM[GA00]*det4_1234_1235 - pM[GA01]*det4_1234_0235
00827                                      + pM[GA02]*det4_1234_0135 - pM[GA03]*det4_1234_0125 + pM[GA05]*det4_1234_0123;
00828    const Double_t det5_01234_01245 = pM[GA00]*det4_1234_1245 - pM[GA01]*det4_1234_0245
00829                                      + pM[GA02]*det4_1234_0145 - pM[GA04]*det4_1234_0125 + pM[GA05]*det4_1234_0124;
00830    const Double_t det5_01234_01345 = pM[GA00]*det4_1234_1345 - pM[GA01]*det4_1234_0345
00831                                      + pM[GA03]*det4_1234_0145 - pM[GA04]*det4_1234_0135 + pM[GA05]*det4_1234_0134;
00832    const Double_t det5_01234_02345 = pM[GA00]*det4_1234_2345 - pM[GA02]*det4_1234_0345
00833                                      + pM[GA03]*det4_1234_0245 - pM[GA04]*det4_1234_0235 + pM[GA05]*det4_1234_0234;
00834    const Double_t det5_01234_12345 = pM[GA01]*det4_1234_2345 - pM[GA02]*det4_1234_1345
00835                                      + pM[GA03]*det4_1234_1245 - pM[GA04]*det4_1234_1235 + pM[GA05]*det4_1234_1234;
00836    const Double_t det5_01235_01234 = pM[GA00]*det4_1235_1234 - pM[GA01]*det4_1235_0234 
00837                                      + pM[GA02]*det4_1235_0134 - pM[GA03]*det4_1235_0124 + pM[GA04]*det4_1235_0123;
00838    const Double_t det5_01235_01235 = pM[GA00]*det4_1235_1235 - pM[GA01]*det4_1235_0235 
00839                                      + pM[GA02]*det4_1235_0135 - pM[GA03]*det4_1235_0125 + pM[GA05]*det4_1235_0123;
00840    const Double_t det5_01235_01245 = pM[GA00]*det4_1235_1245 - pM[GA01]*det4_1235_0245 
00841                                      + pM[GA02]*det4_1235_0145 - pM[GA04]*det4_1235_0125 + pM[GA05]*det4_1235_0124;
00842    const Double_t det5_01235_01345 = pM[GA00]*det4_1235_1345 - pM[GA01]*det4_1235_0345 
00843                                      + pM[GA03]*det4_1235_0145 - pM[GA04]*det4_1235_0135 + pM[GA05]*det4_1235_0134;
00844    const Double_t det5_01235_02345 = pM[GA00]*det4_1235_2345 - pM[GA02]*det4_1235_0345 
00845                                      + pM[GA03]*det4_1235_0245 - pM[GA04]*det4_1235_0235 + pM[GA05]*det4_1235_0234;
00846    const Double_t det5_01235_12345 = pM[GA01]*det4_1235_2345 - pM[GA02]*det4_1235_1345 
00847                                      + pM[GA03]*det4_1235_1245 - pM[GA04]*det4_1235_1235 + pM[GA05]*det4_1235_1234;
00848    const Double_t det5_01245_01234 = pM[GA00]*det4_1245_1234 - pM[GA01]*det4_1245_0234 
00849                                      + pM[GA02]*det4_1245_0134 - pM[GA03]*det4_1245_0124 + pM[GA04]*det4_1245_0123;
00850    const Double_t det5_01245_01235 = pM[GA00]*det4_1245_1235 - pM[GA01]*det4_1245_0235 
00851                                      + pM[GA02]*det4_1245_0135 - pM[GA03]*det4_1245_0125 + pM[GA05]*det4_1245_0123;
00852    const Double_t det5_01245_01245 = pM[GA00]*det4_1245_1245 - pM[GA01]*det4_1245_0245 
00853                                      + pM[GA02]*det4_1245_0145 - pM[GA04]*det4_1245_0125 + pM[GA05]*det4_1245_0124;
00854    const Double_t det5_01245_01345 = pM[GA00]*det4_1245_1345 - pM[GA01]*det4_1245_0345 
00855                                      + pM[GA03]*det4_1245_0145 - pM[GA04]*det4_1245_0135 + pM[GA05]*det4_1245_0134;
00856    const Double_t det5_01245_02345 = pM[GA00]*det4_1245_2345 - pM[GA02]*det4_1245_0345 
00857                                      + pM[GA03]*det4_1245_0245 - pM[GA04]*det4_1245_0235 + pM[GA05]*det4_1245_0234;
00858    const Double_t det5_01245_12345 = pM[GA01]*det4_1245_2345 - pM[GA02]*det4_1245_1345 
00859                                      + pM[GA03]*det4_1245_1245 - pM[GA04]*det4_1245_1235 + pM[GA05]*det4_1245_1234;
00860    const Double_t det5_01345_01234 = pM[GA00]*det4_1345_1234 - pM[GA01]*det4_1345_0234 
00861                                      + pM[GA02]*det4_1345_0134 - pM[GA03]*det4_1345_0124 + pM[GA04]*det4_1345_0123;
00862    const Double_t det5_01345_01235 = pM[GA00]*det4_1345_1235 - pM[GA01]*det4_1345_0235 
00863                                      + pM[GA02]*det4_1345_0135 - pM[GA03]*det4_1345_0125 + pM[GA05]*det4_1345_0123;
00864    const Double_t det5_01345_01245 = pM[GA00]*det4_1345_1245 - pM[GA01]*det4_1345_0245 
00865                                      + pM[GA02]*det4_1345_0145 - pM[GA04]*det4_1345_0125 + pM[GA05]*det4_1345_0124;
00866    const Double_t det5_01345_01345 = pM[GA00]*det4_1345_1345 - pM[GA01]*det4_1345_0345 
00867                                      + pM[GA03]*det4_1345_0145 - pM[GA04]*det4_1345_0135 + pM[GA05]*det4_1345_0134;
00868    const Double_t det5_01345_02345 = pM[GA00]*det4_1345_2345 - pM[GA02]*det4_1345_0345 
00869                                      + pM[GA03]*det4_1345_0245 - pM[GA04]*det4_1345_0235 + pM[GA05]*det4_1345_0234;
00870    const Double_t det5_01345_12345 = pM[GA01]*det4_1345_2345 - pM[GA02]*det4_1345_1345 
00871                                      + pM[GA03]*det4_1345_1245 - pM[GA04]*det4_1345_1235 + pM[GA05]*det4_1345_1234;
00872    const Double_t det5_02345_01234 = pM[GA00]*det4_2345_1234 - pM[GA01]*det4_2345_0234 
00873                                      + pM[GA02]*det4_2345_0134 - pM[GA03]*det4_2345_0124 + pM[GA04]*det4_2345_0123;
00874    const Double_t det5_02345_01235 = pM[GA00]*det4_2345_1235 - pM[GA01]*det4_2345_0235 
00875                                      + pM[GA02]*det4_2345_0135 - pM[GA03]*det4_2345_0125 + pM[GA05]*det4_2345_0123;
00876    const Double_t det5_02345_01245 = pM[GA00]*det4_2345_1245 - pM[GA01]*det4_2345_0245 
00877                                      + pM[GA02]*det4_2345_0145 - pM[GA04]*det4_2345_0125 + pM[GA05]*det4_2345_0124;
00878    const Double_t det5_02345_01345 = pM[GA00]*det4_2345_1345 - pM[GA01]*det4_2345_0345 
00879                                      + pM[GA03]*det4_2345_0145 - pM[GA04]*det4_2345_0135 + pM[GA05]*det4_2345_0134;
00880    const Double_t det5_02345_02345 = pM[GA00]*det4_2345_2345 - pM[GA02]*det4_2345_0345 
00881                                      + pM[GA03]*det4_2345_0245 - pM[GA04]*det4_2345_0235 + pM[GA05]*det4_2345_0234;
00882    const Double_t det5_02345_12345 = pM[GA01]*det4_2345_2345 - pM[GA02]*det4_2345_1345 
00883                                      + pM[GA03]*det4_2345_1245 - pM[GA04]*det4_2345_1235 + pM[GA05]*det4_2345_1234;
00884    const Double_t det5_12345_01234 = pM[GA10]*det4_2345_1234 - pM[GA11]*det4_2345_0234 
00885                                      + pM[GA12]*det4_2345_0134 - pM[GA13]*det4_2345_0124 + pM[GA14]*det4_2345_0123;
00886    const Double_t det5_12345_01235 = pM[GA10]*det4_2345_1235 - pM[GA11]*det4_2345_0235 
00887                                      + pM[GA12]*det4_2345_0135 - pM[GA13]*det4_2345_0125 + pM[GA15]*det4_2345_0123;
00888    const Double_t det5_12345_01245 = pM[GA10]*det4_2345_1245 - pM[GA11]*det4_2345_0245 
00889                                      + pM[GA12]*det4_2345_0145 - pM[GA14]*det4_2345_0125 + pM[GA15]*det4_2345_0124;
00890    const Double_t det5_12345_01345 = pM[GA10]*det4_2345_1345 - pM[GA11]*det4_2345_0345 
00891                                      + pM[GA13]*det4_2345_0145 - pM[GA14]*det4_2345_0135 + pM[GA15]*det4_2345_0134;
00892    const Double_t det5_12345_02345 = pM[GA10]*det4_2345_2345 - pM[GA12]*det4_2345_0345 
00893                                      + pM[GA13]*det4_2345_0245 - pM[GA14]*det4_2345_0235 + pM[GA15]*det4_2345_0234;
00894    const Double_t det5_12345_12345 = pM[GA11]*det4_2345_2345 - pM[GA12]*det4_2345_1345 
00895                                      + pM[GA13]*det4_2345_1245 - pM[GA14]*det4_2345_1235 + pM[GA15]*det4_2345_1234;
00896 
00897   // Find the determinant 
00898 
00899    const Double_t det = pM[GA00]*det5_12345_12345 - pM[GA01]*det5_12345_02345 + pM[GA02]*det5_12345_01345 
00900                         - pM[GA03]*det5_12345_01245 + pM[GA04]*det5_12345_01235 - pM[GA05]*det5_12345_01234;
00901    if (determ)
00902       *determ = det;
00903 
00904    if ( det == 0 ) {
00905       Error("Inv6x6","matrix is singular");
00906       return kFALSE;
00907    }
00908 
00909    const Double_t oneOverDet = 1.0/det;
00910    const Double_t mn1OverDet = - oneOverDet;
00911 
00912    pM[GA00] =  det5_12345_12345*oneOverDet;
00913    pM[GA01] =  det5_02345_12345*mn1OverDet;
00914    pM[GA02] =  det5_01345_12345*oneOverDet;
00915    pM[GA03] =  det5_01245_12345*mn1OverDet;
00916    pM[GA04] =  det5_01235_12345*oneOverDet;
00917    pM[GA05] =  det5_01234_12345*mn1OverDet;
00918 
00919    pM[GA10] =  det5_12345_02345*mn1OverDet;
00920    pM[GA11] =  det5_02345_02345*oneOverDet;
00921    pM[GA12] =  det5_01345_02345*mn1OverDet;
00922    pM[GA13] =  det5_01245_02345*oneOverDet;
00923    pM[GA14] =  det5_01235_02345*mn1OverDet;
00924    pM[GA15] =  det5_01234_02345*oneOverDet;
00925 
00926    pM[GA20] =  det5_12345_01345*oneOverDet;
00927    pM[GA21] =  det5_02345_01345*mn1OverDet;
00928    pM[GA22] =  det5_01345_01345*oneOverDet;
00929    pM[GA23] =  det5_01245_01345*mn1OverDet;
00930    pM[GA24] =  det5_01235_01345*oneOverDet;
00931    pM[GA25] =  det5_01234_01345*mn1OverDet;
00932 
00933    pM[GA30] =  det5_12345_01245*mn1OverDet;
00934    pM[GA31] =  det5_02345_01245*oneOverDet;
00935    pM[GA32] =  det5_01345_01245*mn1OverDet;
00936    pM[GA33] =  det5_01245_01245*oneOverDet;
00937    pM[GA34] =  det5_01235_01245*mn1OverDet;
00938    pM[GA35] =  det5_01234_01245*oneOverDet;
00939 
00940    pM[GA40] =  det5_12345_01235*oneOverDet;
00941    pM[GA41] =  det5_02345_01235*mn1OverDet;
00942    pM[GA42] =  det5_01345_01235*oneOverDet;
00943    pM[GA43] =  det5_01245_01235*mn1OverDet;
00944    pM[GA44] =  det5_01235_01235*oneOverDet;
00945    pM[GA45] =  det5_01234_01235*mn1OverDet;
00946 
00947    pM[GA50] =  det5_12345_01234*mn1OverDet;
00948    pM[GA51] =  det5_02345_01234*oneOverDet;
00949    pM[GA52] =  det5_01345_01234*mn1OverDet;
00950    pM[GA53] =  det5_01245_01234*oneOverDet;
00951    pM[GA54] =  det5_01235_01234*mn1OverDet;
00952    pM[GA55] =  det5_01234_01234*oneOverDet;
00953 
00954    return kTRUE;
00955 }
00956 
00957 #ifndef ROOT_TMatrixFfwd
00958 #include "TMatrixFfwd.h"
00959 #endif
00960 
00961 template Bool_t TMatrixTCramerInv::Inv2x2<Float_t>(TMatrixF&,Double_t*);
00962 template Bool_t TMatrixTCramerInv::Inv3x3<Float_t>(TMatrixF&,Double_t*);
00963 template Bool_t TMatrixTCramerInv::Inv4x4<Float_t>(TMatrixF&,Double_t*);
00964 template Bool_t TMatrixTCramerInv::Inv5x5<Float_t>(TMatrixF&,Double_t*);
00965 template Bool_t TMatrixTCramerInv::Inv6x6<Float_t>(TMatrixF&,Double_t*);
00966 
00967 #ifndef ROOT_TMatrixDfwd
00968 #include "TMatrixDfwd.h"
00969 #endif
00970 
00971 template Bool_t TMatrixTCramerInv::Inv2x2<Double_t>(TMatrixD&,Double_t*);
00972 template Bool_t TMatrixTCramerInv::Inv3x3<Double_t>(TMatrixD&,Double_t*);
00973 template Bool_t TMatrixTCramerInv::Inv4x4<Double_t>(TMatrixD&,Double_t*);
00974 template Bool_t TMatrixTCramerInv::Inv5x5<Double_t>(TMatrixD&,Double_t*);
00975 template Bool_t TMatrixTCramerInv::Inv6x6<Double_t>(TMatrixD&,Double_t*);

Generated on Tue Jul 5 14:36:34 2011 for ROOT_528-00b_version by  doxygen 1.5.1