ROOT logo
// @(#)root/gl:$Id: TKDEFGT.cxx 28589 2009-05-13 06:48:00Z brun $
// Author: Timur Pocheptsov  2009
/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
#include <climits>

#include "TError.h"
#include "TMath.h"

#include "TKDEFGT.h"

//   Kernel density estimator based on Fast Gauss Transform.
//   
//   Nice implementation of FGT by Sebastien Paris
//   can be found here:
//      http://www.mathworks.com/matlabcentral/fileexchange/17438
//      
//   This version is based on his work.

ClassImp(TKDEFGT)

//______________________________________________________________________________
TKDEFGT::TKDEFGT()
         : fDim(0),
           fP(0),
           fK(0),
           fSigma(1.),
           fPD(0),
           fModelValid(kFALSE),
           fVerbose(kTRUE)
{
   //Constructor.
}

namespace {
Int_t NChooseK(Int_t n, Int_t k);
}

//______________________________________________________________________________
TKDEFGT::~TKDEFGT()
{
   //Destructor.
}

//______________________________________________________________________________
void TKDEFGT::BuildModel(const std::vector<Double_t> &sources, Double_t sigma, Int_t dim, Int_t p, Int_t k)
{
   //Calculate coefficients for FGT.
   if (!sources.size()) {
      Warning("TKDEFGT::BuildModel", "Bad input - zero size vector");
      return;
   }

   if (dim <= 0) {
      Warning("TKDEFGT::BuildModel", "Bad number of dimensions: %d", dim);
      return;
   }

   if (p <= 0) {
      Warning("TKDEFGT::BuildModel", "Bad order of truncation: %d, 8 will be used", p);
      p = 8;
   }
   
   fDim = dim;
   fP = p;
   const Int_t nP = sources.size() / fDim;
   fK = k <= 0 ? Int_t(TMath::Sqrt(Double_t(nP))) : k;
   fSigma = sigma;
   fPD = NChooseK(fP + fDim - 1, fDim);
         
   fWeights.assign(nP, 1.);
   fXC.assign(fDim * fK, 0.);
   fA_K.assign(fPD * fK, 0.);
   fIndxc.assign(fK, 0);
   fIndx.assign(nP, 0);
   fXhead.assign(fK, 0);
   fXboxsz.assign(fK, 0);
   fDistC.assign(nP, 0.);
   fC_K.assign(fPD, 0.);
   fHeads.assign(fDim + 1, 0);
   fCinds.assign(fPD, 0);
   fDx.assign(fDim, 0.);
   fProds.assign(fPD, 0.);

   if (fVerbose)
      Info("TKDEFGT::BuildModel", "Initializing ...");

   Kcenter(sources);
   Compute_C_k();
   Compute_A_k(sources);

   if (fVerbose)
      Info("TKDEFGT::BuildModel", "Done.");

   fModelValid = kTRUE;
}

namespace {
Double_t DDist(const Double_t *x , const Double_t *y , Int_t d);
Int_t Idmax(const std::vector<Double_t> &x , Int_t n);
}

//______________________________________________________________________________
void TKDEFGT::Kcenter(const std::vector<double> &x)
{
   //Solve kcenter task.
   
   //Randomly pick one node as the first center.
   const Int_t nP = Int_t(x.size() / fDim);
   
   Int_t *indxc = &fIndxc[0];
   Int_t ind = 1;
   *indxc++ = ind;
   
   const Double_t *x_j   = &x[0];
   const Double_t *x_ind = &x[0] + ind * fDim;
   
   for (Int_t j = 0; j < nP; x_j += fDim, ++j) {
      fDistC[j] = (j == ind) ? 0. : DDist(x_j , x_ind , fDim);
      fIndx[j] = 0;
   }

   for (Int_t i = 1 ; i < fK; ++i) {
      ind = Idmax(fDistC, nP);
      *indxc++ = ind;
      x_j      = &x[0];
      x_ind    = &x[0] + ind * fDim;
      for (Int_t j = 0; j < nP; x_j += fDim, ++j) {
         const Double_t temp = (j==ind) ? 0.0 : DDist(x_j, x_ind, fDim);
         if (temp < fDistC[j]) {
            fDistC[j] = temp;
            fIndx[j]   = i;
         }
      }
   }
   
   for (Int_t i = 0, nd = 0 ; i < nP; i++, nd += fDim) {
      fXboxsz[fIndx[i]]++;
      Int_t ibase = fIndx[i] * fDim;
      for (Int_t j = 0 ; j < fDim; ++j)
         fXC[j + ibase] += x[j + nd];
   }
   
   for (Int_t i = 0, ibase = 0; i < fK ; ++i, ibase += fDim) {
      const Double_t temp = 1.0/fXboxsz[i];
      for (Int_t j = 0; j < fDim; j++)
         fXC[j + ibase] *= temp;
   }
}

//______________________________________________________________________________
void TKDEFGT::Compute_C_k()
{
   //Coefficients C_K.
   fHeads[fDim] = INT_MAX;
   fCinds[0] = 0;
   fC_K[0] = 1.0;
   
   for (Int_t k = 1, t = 1, tail = 1; k < fP; ++k, tail = t) {
      for (Int_t i = 0; i < fDim; ++i) {
         const Int_t head = fHeads[i];
         fHeads[i] = t;
         for (Int_t j = head; j < tail; ++j, ++t) {
            fCinds[t] = (j < fHeads[i + 1]) ? fCinds[j] + 1 : 1;
            fC_K[t]   = 2.0 * fC_K[j];
            fC_K[t]  /= fCinds[t];
         }
      }
   }
}

//______________________________________________________________________________
void TKDEFGT::Compute_A_k(const std::vector<Double_t> &x)
{
   //Coefficients A_K.
   const Double_t ctesigma = 1. / fSigma;
   const Int_t nP = Int_t(x.size() / fDim);
   
   for (Int_t n = 0; n < nP; n++) {
      Int_t nbase    = n * fDim;
      Int_t ix2c     = fIndx[n];
      Int_t ix2cbase = ix2c * fDim;
      Int_t ind      = ix2c * fPD;
      Double_t temp  = fWeights[n];
      Double_t sum   = 0.0;
      
      for (Int_t i = 0; i < fDim; ++i) {
         fDx[i]    = (x[i + nbase] - fXC[i + ix2cbase]) * ctesigma;
         sum      += fDx[i] * fDx[i];
         fHeads[i] = 0;
      }

      fProds[0] = TMath::Exp(-sum);

      for (Int_t k = 1, t = 1, tail = 1; k < fP; ++k, tail = t) {
         for (Int_t i = 0; i < fDim; ++i) {
            const Int_t head = fHeads[i];
            fHeads[i] = t;
            const Double_t temp1 = fDx[i];
            for (Int_t j = head; j < tail; ++j, ++t)
               fProds[t] = temp1 * fProds[j];
         }
      }

      for (Int_t i = 0 ; i < fPD ; i++)
         fA_K[i + ind] += temp * fProds[i];
   }

   for (Int_t k = 0; k < fK; ++k) {
      const Int_t ind = k * fPD;
      for (Int_t i = 0; i < fPD; ++i)
         fA_K[i + ind] *= fC_K[i];
   }
}

namespace {
Int_t InvNChooseK(Int_t d, Int_t cnk);
}

//______________________________________________________________________________
void TKDEFGT::Predict(const std::vector<Double_t> &ts, std::vector<Double_t> &v, Double_t eval)const
{
   //Calculate densities.
   
   if (!fModelValid) {
      Error("TKDEFGT::Predict", "Call BuildModel first!");
      return;
   }
   
   if (!ts.size()) {
      Warning("TKDEFGT::Predict", "Empty targets vector.");
      return;
   }
 
   if (fVerbose)  
      Info("TKDEFGT::Predict", "Estimation started ...");
   
   v.assign(ts.size() / fDim, 0.);
   
   fHeads.assign(fDim + 1, 0);
   fDx.assign(fDim, 0.);
   fProds.assign(fPD, 0.);
   
   const Double_t ctesigma = 1. / fSigma;
   const Int_t p = InvNChooseK(fDim , fPD);
   const Int_t nP = Int_t(ts.size() / fDim);
   
   for (Int_t m = 0; m < nP; ++m) {
      Double_t temp = 0.;
      const Int_t mbase = m * fDim;
      
      for (Int_t kn = 0 ; kn < fK ; ++kn) {
         const Int_t xbase = kn * fDim;
         const Int_t ind = kn * fPD;
         Double_t sum2  = 0.0;
         for (Int_t i = 0; i < fDim ; ++i) {
            fDx[i] = (ts[i + mbase] - fXC[i + xbase]) * ctesigma;
            sum2 += fDx[i] * fDx[i];
            fHeads[i] = 0;
         }

         if (sum2 > eval) continue; //skip to next kn

         fProds[0] = TMath::Exp(-sum2);

         for (Int_t k = 1, t = 1, tail = 1; k < p; ++k, tail = t) {
            for (Int_t i = 0; i < fDim; ++i) {
               Int_t head = fHeads[i];
               fHeads[i] = t;
               const Double_t temp1 = fDx[i];
               for (Int_t j = head; j < tail; ++j, ++t)
                  fProds[t] = temp1 * fProds[j];
            }
         }

         for (Int_t i = 0 ; i < fPD ; ++i)
            temp += fA_K[i + ind] * fProds[i];
      }

      v[m] = temp;
   }
   
   Double_t dMin = v[0], dMax = dMin;
   for (Int_t i = 1, e = Int_t(v.size()); i < e; ++i) {
      dMin = TMath::Min(dMin, v[i]);
      dMax = TMath::Max(dMax, v[i]);
   }
   
   const Double_t dRange = dMax - dMin;
   for (Int_t i = 0, e = Int_t(v.size()); i < e; ++i)
      v[i] = (v[i] - dMin) / dRange;

   dMin = v[0], dMax = dMin;
   for (Int_t i = 1, e = Int_t(v.size()); i < e; ++i) {
      dMin = TMath::Min(dMin, v[i]);
      dMax = TMath::Max(dMax, v[i]);
   }
}

namespace {
//______________________________________________________________________________
Int_t NChooseK(Int_t n, Int_t k)
{
   Int_t n_k = n - k;
   if (k < n_k) {
      k = n_k;
      n_k = n - k;
   }
   Int_t nchsk = 1;
   for (Int_t i = 1; i <= n_k; ++i) {
      nchsk *= (++k);
      nchsk /= i;
   }
   return nchsk;
}

//______________________________________________________________________________
Double_t DDist(const Double_t *x , const Double_t *y , Int_t d)
{
   Double_t t = 0., s = 0.;

   for (Int_t i = 0 ; i < d ; i++) {
      t  = (x[i] - y[i]);
      s += (t * t);
   }

   return s;
}

//______________________________________________________________________________
Int_t Idmax(const std::vector<Double_t> &x , Int_t n)
{
   Int_t k = 0;
   Double_t t = -1.0;
   for (Int_t i = 0; i < n; ++i) {
      if (t < x[i]) {
         t = x[i];
         k = i;
      }
   }
   return k;
}

//______________________________________________________________________________
Int_t InvNChooseK(Int_t d, Int_t cnk)
{
   Int_t cted = 1;
   for (Int_t i = 2 ; i <= d ; ++i)
      cted *= i;

   const Int_t cte = cnk * cted;
   Int_t p = 2, ctep = 2;

   for (Int_t i = p + 1; i < p + d; ++i)
      ctep *= i;

   while (ctep != cte) {
      ctep = ((p + d) * ctep) / p;
      ++p;
   }

   return p;
}
}//anonymous namespace.
 TKDEFGT.cxx:1
 TKDEFGT.cxx:2
 TKDEFGT.cxx:3
 TKDEFGT.cxx:4
 TKDEFGT.cxx:5
 TKDEFGT.cxx:6
 TKDEFGT.cxx:7
 TKDEFGT.cxx:8
 TKDEFGT.cxx:9
 TKDEFGT.cxx:10
 TKDEFGT.cxx:11
 TKDEFGT.cxx:12
 TKDEFGT.cxx:13
 TKDEFGT.cxx:14
 TKDEFGT.cxx:15
 TKDEFGT.cxx:16
 TKDEFGT.cxx:17
 TKDEFGT.cxx:18
 TKDEFGT.cxx:19
 TKDEFGT.cxx:20
 TKDEFGT.cxx:21
 TKDEFGT.cxx:22
 TKDEFGT.cxx:23
 TKDEFGT.cxx:24
 TKDEFGT.cxx:25
 TKDEFGT.cxx:26
 TKDEFGT.cxx:27
 TKDEFGT.cxx:28
 TKDEFGT.cxx:29
 TKDEFGT.cxx:30
 TKDEFGT.cxx:31
 TKDEFGT.cxx:32
 TKDEFGT.cxx:33
 TKDEFGT.cxx:34
 TKDEFGT.cxx:35
 TKDEFGT.cxx:36
 TKDEFGT.cxx:37
 TKDEFGT.cxx:38
 TKDEFGT.cxx:39
 TKDEFGT.cxx:40
 TKDEFGT.cxx:41
 TKDEFGT.cxx:42
 TKDEFGT.cxx:43
 TKDEFGT.cxx:44
 TKDEFGT.cxx:45
 TKDEFGT.cxx:46
 TKDEFGT.cxx:47
 TKDEFGT.cxx:48
 TKDEFGT.cxx:49
 TKDEFGT.cxx:50
 TKDEFGT.cxx:51
 TKDEFGT.cxx:52
 TKDEFGT.cxx:53
 TKDEFGT.cxx:54
 TKDEFGT.cxx:55
 TKDEFGT.cxx:56
 TKDEFGT.cxx:57
 TKDEFGT.cxx:58
 TKDEFGT.cxx:59
 TKDEFGT.cxx:60
 TKDEFGT.cxx:61
 TKDEFGT.cxx:62
 TKDEFGT.cxx:63
 TKDEFGT.cxx:64
 TKDEFGT.cxx:65
 TKDEFGT.cxx:66
 TKDEFGT.cxx:67
 TKDEFGT.cxx:68
 TKDEFGT.cxx:69
 TKDEFGT.cxx:70
 TKDEFGT.cxx:71
 TKDEFGT.cxx:72
 TKDEFGT.cxx:73
 TKDEFGT.cxx:74
 TKDEFGT.cxx:75
 TKDEFGT.cxx:76
 TKDEFGT.cxx:77
 TKDEFGT.cxx:78
 TKDEFGT.cxx:79
 TKDEFGT.cxx:80
 TKDEFGT.cxx:81
 TKDEFGT.cxx:82
 TKDEFGT.cxx:83
 TKDEFGT.cxx:84
 TKDEFGT.cxx:85
 TKDEFGT.cxx:86
 TKDEFGT.cxx:87
 TKDEFGT.cxx:88
 TKDEFGT.cxx:89
 TKDEFGT.cxx:90
 TKDEFGT.cxx:91
 TKDEFGT.cxx:92
 TKDEFGT.cxx:93
 TKDEFGT.cxx:94
 TKDEFGT.cxx:95
 TKDEFGT.cxx:96
 TKDEFGT.cxx:97
 TKDEFGT.cxx:98
 TKDEFGT.cxx:99
 TKDEFGT.cxx:100
 TKDEFGT.cxx:101
 TKDEFGT.cxx:102
 TKDEFGT.cxx:103
 TKDEFGT.cxx:104
 TKDEFGT.cxx:105
 TKDEFGT.cxx:106
 TKDEFGT.cxx:107
 TKDEFGT.cxx:108
 TKDEFGT.cxx:109
 TKDEFGT.cxx:110
 TKDEFGT.cxx:111
 TKDEFGT.cxx:112
 TKDEFGT.cxx:113
 TKDEFGT.cxx:114
 TKDEFGT.cxx:115
 TKDEFGT.cxx:116
 TKDEFGT.cxx:117
 TKDEFGT.cxx:118
 TKDEFGT.cxx:119
 TKDEFGT.cxx:120
 TKDEFGT.cxx:121
 TKDEFGT.cxx:122
 TKDEFGT.cxx:123
 TKDEFGT.cxx:124
 TKDEFGT.cxx:125
 TKDEFGT.cxx:126
 TKDEFGT.cxx:127
 TKDEFGT.cxx:128
 TKDEFGT.cxx:129
 TKDEFGT.cxx:130
 TKDEFGT.cxx:131
 TKDEFGT.cxx:132
 TKDEFGT.cxx:133
 TKDEFGT.cxx:134
 TKDEFGT.cxx:135
 TKDEFGT.cxx:136
 TKDEFGT.cxx:137
 TKDEFGT.cxx:138
 TKDEFGT.cxx:139
 TKDEFGT.cxx:140
 TKDEFGT.cxx:141
 TKDEFGT.cxx:142
 TKDEFGT.cxx:143
 TKDEFGT.cxx:144
 TKDEFGT.cxx:145
 TKDEFGT.cxx:146
 TKDEFGT.cxx:147
 TKDEFGT.cxx:148
 TKDEFGT.cxx:149
 TKDEFGT.cxx:150
 TKDEFGT.cxx:151
 TKDEFGT.cxx:152
 TKDEFGT.cxx:153
 TKDEFGT.cxx:154
 TKDEFGT.cxx:155
 TKDEFGT.cxx:156
 TKDEFGT.cxx:157
 TKDEFGT.cxx:158
 TKDEFGT.cxx:159
 TKDEFGT.cxx:160
 TKDEFGT.cxx:161
 TKDEFGT.cxx:162
 TKDEFGT.cxx:163
 TKDEFGT.cxx:164
 TKDEFGT.cxx:165
 TKDEFGT.cxx:166
 TKDEFGT.cxx:167
 TKDEFGT.cxx:168
 TKDEFGT.cxx:169
 TKDEFGT.cxx:170
 TKDEFGT.cxx:171
 TKDEFGT.cxx:172
 TKDEFGT.cxx:173
 TKDEFGT.cxx:174
 TKDEFGT.cxx:175
 TKDEFGT.cxx:176
 TKDEFGT.cxx:177
 TKDEFGT.cxx:178
 TKDEFGT.cxx:179
 TKDEFGT.cxx:180
 TKDEFGT.cxx:181
 TKDEFGT.cxx:182
 TKDEFGT.cxx:183
 TKDEFGT.cxx:184
 TKDEFGT.cxx:185
 TKDEFGT.cxx:186
 TKDEFGT.cxx:187
 TKDEFGT.cxx:188
 TKDEFGT.cxx:189
 TKDEFGT.cxx:190
 TKDEFGT.cxx:191
 TKDEFGT.cxx:192
 TKDEFGT.cxx:193
 TKDEFGT.cxx:194
 TKDEFGT.cxx:195
 TKDEFGT.cxx:196
 TKDEFGT.cxx:197
 TKDEFGT.cxx:198
 TKDEFGT.cxx:199
 TKDEFGT.cxx:200
 TKDEFGT.cxx:201
 TKDEFGT.cxx:202
 TKDEFGT.cxx:203
 TKDEFGT.cxx:204
 TKDEFGT.cxx:205
 TKDEFGT.cxx:206
 TKDEFGT.cxx:207
 TKDEFGT.cxx:208
 TKDEFGT.cxx:209
 TKDEFGT.cxx:210
 TKDEFGT.cxx:211
 TKDEFGT.cxx:212
 TKDEFGT.cxx:213
 TKDEFGT.cxx:214
 TKDEFGT.cxx:215
 TKDEFGT.cxx:216
 TKDEFGT.cxx:217
 TKDEFGT.cxx:218
 TKDEFGT.cxx:219
 TKDEFGT.cxx:220
 TKDEFGT.cxx:221
 TKDEFGT.cxx:222
 TKDEFGT.cxx:223
 TKDEFGT.cxx:224
 TKDEFGT.cxx:225
 TKDEFGT.cxx:226
 TKDEFGT.cxx:227
 TKDEFGT.cxx:228
 TKDEFGT.cxx:229
 TKDEFGT.cxx:230
 TKDEFGT.cxx:231
 TKDEFGT.cxx:232
 TKDEFGT.cxx:233
 TKDEFGT.cxx:234
 TKDEFGT.cxx:235
 TKDEFGT.cxx:236
 TKDEFGT.cxx:237
 TKDEFGT.cxx:238
 TKDEFGT.cxx:239
 TKDEFGT.cxx:240
 TKDEFGT.cxx:241
 TKDEFGT.cxx:242
 TKDEFGT.cxx:243
 TKDEFGT.cxx:244
 TKDEFGT.cxx:245
 TKDEFGT.cxx:246
 TKDEFGT.cxx:247
 TKDEFGT.cxx:248
 TKDEFGT.cxx:249
 TKDEFGT.cxx:250
 TKDEFGT.cxx:251
 TKDEFGT.cxx:252
 TKDEFGT.cxx:253
 TKDEFGT.cxx:254
 TKDEFGT.cxx:255
 TKDEFGT.cxx:256
 TKDEFGT.cxx:257
 TKDEFGT.cxx:258
 TKDEFGT.cxx:259
 TKDEFGT.cxx:260
 TKDEFGT.cxx:261
 TKDEFGT.cxx:262
 TKDEFGT.cxx:263
 TKDEFGT.cxx:264
 TKDEFGT.cxx:265
 TKDEFGT.cxx:266
 TKDEFGT.cxx:267
 TKDEFGT.cxx:268
 TKDEFGT.cxx:269
 TKDEFGT.cxx:270
 TKDEFGT.cxx:271
 TKDEFGT.cxx:272
 TKDEFGT.cxx:273
 TKDEFGT.cxx:274
 TKDEFGT.cxx:275
 TKDEFGT.cxx:276
 TKDEFGT.cxx:277
 TKDEFGT.cxx:278
 TKDEFGT.cxx:279
 TKDEFGT.cxx:280
 TKDEFGT.cxx:281
 TKDEFGT.cxx:282
 TKDEFGT.cxx:283
 TKDEFGT.cxx:284
 TKDEFGT.cxx:285
 TKDEFGT.cxx:286
 TKDEFGT.cxx:287
 TKDEFGT.cxx:288
 TKDEFGT.cxx:289
 TKDEFGT.cxx:290
 TKDEFGT.cxx:291
 TKDEFGT.cxx:292
 TKDEFGT.cxx:293
 TKDEFGT.cxx:294
 TKDEFGT.cxx:295
 TKDEFGT.cxx:296
 TKDEFGT.cxx:297
 TKDEFGT.cxx:298
 TKDEFGT.cxx:299
 TKDEFGT.cxx:300
 TKDEFGT.cxx:301
 TKDEFGT.cxx:302
 TKDEFGT.cxx:303
 TKDEFGT.cxx:304
 TKDEFGT.cxx:305
 TKDEFGT.cxx:306
 TKDEFGT.cxx:307
 TKDEFGT.cxx:308
 TKDEFGT.cxx:309
 TKDEFGT.cxx:310
 TKDEFGT.cxx:311
 TKDEFGT.cxx:312
 TKDEFGT.cxx:313
 TKDEFGT.cxx:314
 TKDEFGT.cxx:315
 TKDEFGT.cxx:316
 TKDEFGT.cxx:317
 TKDEFGT.cxx:318
 TKDEFGT.cxx:319
 TKDEFGT.cxx:320
 TKDEFGT.cxx:321
 TKDEFGT.cxx:322
 TKDEFGT.cxx:323
 TKDEFGT.cxx:324
 TKDEFGT.cxx:325
 TKDEFGT.cxx:326
 TKDEFGT.cxx:327
 TKDEFGT.cxx:328
 TKDEFGT.cxx:329
 TKDEFGT.cxx:330
 TKDEFGT.cxx:331
 TKDEFGT.cxx:332
 TKDEFGT.cxx:333
 TKDEFGT.cxx:334
 TKDEFGT.cxx:335
 TKDEFGT.cxx:336
 TKDEFGT.cxx:337
 TKDEFGT.cxx:338
 TKDEFGT.cxx:339
 TKDEFGT.cxx:340
 TKDEFGT.cxx:341
 TKDEFGT.cxx:342
 TKDEFGT.cxx:343
 TKDEFGT.cxx:344
 TKDEFGT.cxx:345
 TKDEFGT.cxx:346
 TKDEFGT.cxx:347
 TKDEFGT.cxx:348
 TKDEFGT.cxx:349
 TKDEFGT.cxx:350
 TKDEFGT.cxx:351
 TKDEFGT.cxx:352
 TKDEFGT.cxx:353
 TKDEFGT.cxx:354
 TKDEFGT.cxx:355
 TKDEFGT.cxx:356
 TKDEFGT.cxx:357
 TKDEFGT.cxx:358
 TKDEFGT.cxx:359
 TKDEFGT.cxx:360
 TKDEFGT.cxx:361
 TKDEFGT.cxx:362
 TKDEFGT.cxx:363
 TKDEFGT.cxx:364
 TKDEFGT.cxx:365
 TKDEFGT.cxx:366
 TKDEFGT.cxx:367
 TKDEFGT.cxx:368
 TKDEFGT.cxx:369