ROOT logo
// @(#)root/hist:$Id$
// Author: Christian Holm Christensen    1/8/2000

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//____________________________________________________________________
//Begin_Html <!--
/* -->
   </pre>
<H1><A NAME="SECTION00010000000000000000"></A>
<A NAME="sec:lintra"></A>
<BR>
Principal Components Analysis (PCA)
</H1>

<P>
The current implementation is based on the LINTRA package from CERNLIB
by R. Brun, H. Hansroul, and J. Kubler.
The class has been implemented by Christian Holm Christensen in August 2000.

<P>

<H2><A NAME="SECTION00011000000000000000"></A>
<A NAME="sec:intro1"></A>
<BR>
Introduction
</H2>

<P>
In many applications of various fields of research, the treatment of
large amounts of data requires powerful techniques capable of rapid
data reduction and analysis. Usually, the quantities most
conveniently measured by the experimentalist, are not necessarily the
most significant for classification and analysis of the data. It is
then useful to have a way of selecting an optimal set of variables
necessary for the recognition process and reducing the dimensionality
of the problem, resulting in an easier classification procedure.

<P>
This paper describes the implementation of one such method of
feature selection, namely the principal components analysis. This
multidimensional technique is well known in the field of pattern
recognition and and its use in Particle Physics has been documented
elsewhere (cf. H. Wind, <I>Function Parameterization</I>, CERN
72-21).

<P>

<H2><A NAME="SECTION00012000000000000000"></A>
<A NAME="sec:overview"></A>
<BR>
Overview
</H2>

<P>
Suppose we have prototypes which are trajectories of particles,
passing through a spectrometer. If one measures the passage of the
particle at say 8 fixed planes, the trajectory is described by an
8-component vector:
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
\mathbf{x} = \left(x_0, x_1, \ldots, x_7\right)
\end{displaymath}
 -->


<IMG
 WIDTH="145" HEIGHT="31" BORDER="0"
 SRC="gif/principal_img1.gif"
 ALT="\begin{displaymath}
\mathbf{x} = \left(x_0, x_1, \ldots, x_7\right)
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>
in 8-dimensional pattern space.

<P>
One proceeds by generating a a representative tracks sample and
building up the covariance matrix <IMG
 WIDTH="16" HEIGHT="16" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img2.gif"
 ALT="$\mathsf{C}$">. Its eigenvectors and
eigenvalues are computed by standard methods, and thus a new basis is
obtained for the original 8-dimensional space the expansion of the
prototypes,
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
\mathbf{x}_m = \sum^7_{i=0} a_{m_i} \mathbf{e}_i
\quad
\mbox{where}
\quad
a_{m_i} = \mathbf{x}^T\bullet\mathbf{e}_i
\end{displaymath}
 -->


<IMG
 WIDTH="295" HEIGHT="58" BORDER="0"
 SRC="gif/principal_img3.gif"
 ALT="\begin{displaymath}
\mathbf{x}_m = \sum^7_{i=0} a_{m_i} \mathbf{e}_i
\quad
\mbox{where}
\quad
a_{m_i} = \mathbf{x}^T\bullet\mathbf{e}_i
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>

<P>
allows the study of the behavior of the coefficients <IMG
 WIDTH="31" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img4.gif"
 ALT="$a_{m_i}$"> for all
the tracks of the sample. The eigenvectors which are insignificant for
the trajectory description in the expansion will have their
corresponding coefficients <IMG
 WIDTH="31" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img4.gif"
 ALT="$a_{m_i}$"> close to zero for all the
prototypes.

<P>
On one hand, a reduction of the dimensionality is then obtained by
omitting these least significant vectors in the subsequent analysis.

<P>
On the other hand, in the analysis of real data, these least
significant variables(?) can be used for the pattern
recognition problem of extracting the valid combinations of
coordinates describing a true trajectory from the set of all possible
wrong combinations.

<P>
The program described here performs this principal components analysis
on a sample of data provided by the user. It computes the covariance
matrix, its eigenvalues ands corresponding eigenvectors and exhibits
the behavior of the principal components (<IMG
 WIDTH="31" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img4.gif"
 ALT="$a_{m_i}$">), thus providing
to the user all the means of understanding his data.

<P>

<H2><A NAME="SECTION00013000000000000000"></A>
<A NAME="sec:method"></A>
<BR>
Principal Components Method
</H2>

<P>
Let's consider a sample of <IMG
 WIDTH="23" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img5.gif"
 ALT="$M$"> prototypes each being characterized by
<IMG
 WIDTH="18" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img6.gif"
 ALT="$P$"> variables
<!-- MATH
 $x_0, x_1, \ldots, x_{P-1}$
 -->
<IMG
 WIDTH="107" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img7.gif"
 ALT="$x_0, x_1, \ldots, x_{P-1}$">. Each prototype is a point, or a
column vector, in a <IMG
 WIDTH="18" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img6.gif"
 ALT="$P$">-dimensional <I>pattern space</I>.
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\mathbf{x} = \left[\begin{array}{c}
    x_0\\x_1\\\vdots\\x_{P-1}\end{array}\right]\,,
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><IMG
 WIDTH="102" HEIGHT="102" BORDER="0"
 SRC="gif/principal_img8.gif"
 ALT="\begin{displaymath}
\mathbf{x} = \left[\begin{array}{c}
x_0\\ x_1\\ \vdots\\ x_{P-1}\end{array}\right]\,,
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(1)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
where each <IMG
 WIDTH="23" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img9.gif"
 ALT="$x_n$"> represents the particular value associated with the
<IMG
 WIDTH="15" HEIGHT="16" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img10.gif"
 ALT="$n$">-dimension.

<P>
Those <IMG
 WIDTH="18" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img6.gif"
 ALT="$P$"> variables are the quantities accessible to the
experimentalist, but are not necessarily the most significant for the
classification purpose.

<P>
The <I>Principal Components Method</I> consists of applying a
<I>linear</I> transformation to the original variables. This
transformation is described by an orthogonal matrix and is equivalent
to a rotation of the original pattern space into a new set of
coordinate vectors, which hopefully provide easier feature
identification and dimensionality reduction.

<P>
Let's define the covariance matrix:
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\mathsf{C} = \left\langle\mathbf{y}\mathbf{y}^T\right\rangle
  \quad\mbox{where}\quad
  \mathbf{y} = \mathbf{x} - \left\langle\mathbf{x}\right\rangle\,,
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:C"></A><IMG
 WIDTH="267" HEIGHT="37" BORDER="0"
 SRC="gif/principal_img11.gif"
 ALT="\begin{displaymath}
\mathsf{C} = \left\langle\mathbf{y}\mathbf{y}^T\right\rangl...
...athbf{y} = \mathbf{x} - \left\langle\mathbf{x}\right\rangle\,,
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(2)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
and the brackets indicate mean value over the sample of <IMG
 WIDTH="23" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img5.gif"
 ALT="$M$">
prototypes.

<P>
This matrix <IMG
 WIDTH="16" HEIGHT="16" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img2.gif"
 ALT="$\mathsf{C}$"> is real, positive definite, symmetric, and will
have all its eigenvalues greater then zero. It will now be show that
among the family of all the complete orthonormal bases of the pattern
space, the base formed by the eigenvectors of the covariance matrix
and belonging to the largest eigenvalues, corresponds to the most
significant features of the description of the original prototypes.

<P>
let the prototypes be expanded on into a set of <IMG
 WIDTH="20" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img12.gif"
 ALT="$N$"> basis vectors

<!-- MATH
 $\mathbf{e}_n, n=0,\ldots,N,N+1, \ldots, P-1$
 -->
<IMG
 WIDTH="233" HEIGHT="32" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img13.gif"
 ALT="$\mathbf{e}_n, n=0,\ldots,N,N+1, \ldots, P-1$">,
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\mathbf{y}_i = \sum^N_{i=0} a_{i_n} \mathbf{e}_n,
  \quad
  i = 1, \ldots, M,
  \quad
  N < P-1
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:yi"></A><IMG
 WIDTH="303" HEIGHT="58" BORDER="0"
 SRC="gif/principal_img14.gif"
 ALT="\begin{displaymath}
\mathbf{y}_i = \sum^N_{i=0} a_{i_n} \mathbf{e}_n,
\quad
i = 0, \ldots, M,
\quad
N &lt; P-1
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(3)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>

<P>
The `best' feature coordinates <IMG
 WIDTH="23" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img15.gif"
 ALT="$\mathbf{e}_n$">, spanning a <I>feature
  space</I>,  will be obtained by minimizing the error due to this
truncated expansion, i.e.,
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\min\left(E_N\right) =
  \min\left[\left\langle\left(\mathbf{y}_i - \sum^N_{i=0} a_{i_n} \mathbf{e}_n\right)^2\right\rangle\right]
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:mini"></A><IMG
 WIDTH="306" HEIGHT="65" BORDER="0"
 SRC="gif/principal_img16.gif"
 ALT="\begin{displaymath}
\min\left(E_N\right) =
\min\left[\left\langle\left(\mathb...
...\sum^N_{i=0} a_{i_n} \mathbf{e}_n\right)^2\right\rangle\right]
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(4)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
with the conditions:
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\mathbf{e}_k\bullet\mathbf{e}_j = \delta_{jk} =
  \left\{\begin{array}{rcl}
    1 & \mbox{for} & k = j\\
    0 & \mbox{for} & k \neq j
  \end{array}\right.
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:ortocond"></A><IMG
 WIDTH="240" HEIGHT="54" BORDER="0"
 SRC="gif/principal_img17.gif"
 ALT="\begin{displaymath}
\mathbf{e}_k\bullet\mathbf{e}_j = \delta_{jk} =
\left\{\b...
...for} &amp; k = j\\
0 &amp; \mbox{for} &amp; k \neq j
\end{array}\right.
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(5)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>

<P>
Multiplying (<A HREF="prin_node1.html#eq:yi">3</A>) by
<!-- MATH
 $\mathbf{e}^T_n$
 -->
<IMG
 WIDTH="24" HEIGHT="38" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img18.gif"
 ALT="$\mathbf{e}^T_n$"> using (<A HREF="prin_node1.html#eq:ortocond">5</A>),
we get
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
a_{i_n} = \mathbf{y}_i^T\bullet\mathbf{e}_n\,,
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:ai"></A><IMG
 WIDTH="108" HEIGHT="31" BORDER="0"
 SRC="gif/principal_img19.gif"
 ALT="\begin{displaymath}
a_{i_n} = \mathbf{y}_i^T\bullet\mathbf{e}_n\,,
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(6)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
so the error becomes
<BR>
<DIV ALIGN="CENTER"><A NAME="eq:error"></A>

<!-- MATH
 \begin{eqnarray}
E_N &=&
  \left\langle\left[\sum_{n=N+1}^{P-1}  a_{i_n}\mathbf{e}_n\right]^2\right\rangle\nonumber\\
  &=&
  \left\langle\left[\sum_{n=N+1}^{P-1}  \mathbf{y}_i^T\bullet\mathbf{e}_n\mathbf{e}_n\right]^2\right\rangle\nonumber\\
  &=&
  \left\langle\sum_{n=N+1}^{P-1}  \mathbf{e}_n^T\mathbf{y}_i\mathbf{y}_i^T\mathbf{e}_n\right\rangle\nonumber\\
  &=&
  \sum_{n=N+1}^{P-1}  \mathbf{e}_n^T\mathsf{C}\mathbf{e}_n
\end{eqnarray}
 -->

<TABLE ALIGN="CENTER" CELLPADDING="0" WIDTH="100%">
<TR VALIGN="MIDDLE"><TD NOWRAP ALIGN="RIGHT"><IMG
 WIDTH="30" HEIGHT="32" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img20.gif"
 ALT="$\displaystyle E_N$"></TD>
<TD ALIGN="CENTER" NOWRAP><IMG
 WIDTH="18" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img21.gif"
 ALT="$\textstyle =$"></TD>
<TD ALIGN="LEFT" NOWRAP><IMG
 WIDTH="151" HEIGHT="80" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img22.gif"
 ALT="$\displaystyle \left\langle\left[\sum_{n=N+1}^{P-1} a_{i_n}\mathbf{e}_n\right]^2\right\rangle$"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
&nbsp;</TD></TR>
<TR VALIGN="MIDDLE"><TD NOWRAP ALIGN="RIGHT">&nbsp;</TD>
<TD ALIGN="CENTER" NOWRAP><IMG
 WIDTH="18" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img21.gif"
 ALT="$\textstyle =$"></TD>
<TD ALIGN="LEFT" NOWRAP><IMG
 WIDTH="184" HEIGHT="80" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img23.gif"
 ALT="$\displaystyle \left\langle\left[\sum_{n=N+1}^{P-1} \mathbf{y}_i^T\bullet\mathbf{e}_n\mathbf{e}_n\right]^2\right\rangle$"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
&nbsp;</TD></TR>
<TR VALIGN="MIDDLE"><TD NOWRAP ALIGN="RIGHT">&nbsp;</TD>
<TD ALIGN="CENTER" NOWRAP><IMG
 WIDTH="18" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img21.gif"
 ALT="$\textstyle =$"></TD>
<TD ALIGN="LEFT" NOWRAP><IMG
 WIDTH="156" HEIGHT="69" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img24.gif"
 ALT="$\displaystyle \left\langle\sum_{n=N+1}^{P-1} \mathbf{e}_n^T\mathbf{y}_i\mathbf{y}_i^T\mathbf{e}_n\right\rangle$"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
&nbsp;</TD></TR>
<TR VALIGN="MIDDLE"><TD NOWRAP ALIGN="RIGHT">&nbsp;</TD>
<TD ALIGN="CENTER" NOWRAP><IMG
 WIDTH="18" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img21.gif"
 ALT="$\textstyle =$"></TD>
<TD ALIGN="LEFT" NOWRAP><IMG
 WIDTH="104" HEIGHT="69" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img25.gif"
 ALT="$\displaystyle \sum_{n=N+1}^{P-1} \mathbf{e}_n^T\mathsf{C}\mathbf{e}_n$"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(7)</TD></TR>
</TABLE></DIV>
<BR CLEAR="ALL"><P></P>

<P>
The minimization of the sum in (<A HREF="prin_node1.html#eq:error">7</A>) is obtained when each
term
<!-- MATH
 $\mathbf{e}_n^\mathsf{C}\mathbf{e}_n$
 -->
<IMG
 WIDTH="41" HEIGHT="38" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img26.gif"
 ALT="$\mathbf{e}_n^\mathsf{C}\mathbf{e}_n$"> is minimum, since <IMG
 WIDTH="16" HEIGHT="16" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img2.gif"
 ALT="$\mathsf{C}$"> is
positive definite. By the method of Lagrange multipliers, and the
condition&nbsp;(<A HREF="prin_node1.html#eq:ortocond">5</A>), we get

<P>

<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
E_N = \sum^{P-1}_{n=N+1} \left(\mathbf{e}_n^T\mathsf{C}\mathbf{e}_n -
    l_n\mathbf{e}_n^T\bullet\mathbf{e}_n + l_n\right)
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:minerror"></A><IMG
 WIDTH="291" HEIGHT="60" BORDER="0"
 SRC="gif/principal_img27.gif"
 ALT="\begin{displaymath}
E_N = \sum^{P-1}_{n=N+1} \left(\mathbf{e}_n^T\mathsf{C}\mathbf{e}_n -
l_n\mathbf{e}_n^T\bullet\mathbf{e}_n + l_n\right)
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(8)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
The minimum condition
<!-- MATH
 $\frac{dE_N}{d\mathbf{e}^T_n} = 0$
 -->
<IMG
 WIDTH="68" HEIGHT="40" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img28.gif"
 ALT="$\frac{dE_N}{d\mathbf{e}^T_n} = 0$"> leads to the
equation
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\mathsf{C}\mathbf{e}_n = l_n\mathbf{e}_n\,,
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:Ce"></A><IMG
 WIDTH="91" HEIGHT="30" BORDER="0"
 SRC="gif/principal_img29.gif"
 ALT="\begin{displaymath}
\mathsf{C}\mathbf{e}_n = l_n\mathbf{e}_n\,,
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(9)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
which shows that <IMG
 WIDTH="23" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img15.gif"
 ALT="$\mathbf{e}_n$"> is an eigenvector of the covariance
matrix <IMG
 WIDTH="16" HEIGHT="16" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img2.gif"
 ALT="$\mathsf{C}$"> with eigenvalue <IMG
 WIDTH="19" HEIGHT="32" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img30.gif"
 ALT="$l_n$">. The estimated minimum error is
then given by
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
E_N \sim \sum^{P-1}_{n=N+1} \mathbf{e}_n^T\bullet l_n\mathbf{e}_n
      = \sum^{P-1}_{n=N+1}  l_n\,,
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:esterror"></A><IMG
 WIDTH="264" HEIGHT="60" BORDER="0"
 SRC="gif/principal_img31.gif"
 ALT="\begin{displaymath}
E_N \sim \sum^{P-1}_{n=N+1} \mathbf{e}_n^T\bullet l_n\mathbf{e}_n
= \sum^{P-1}_{n=N+1} l_n\,,
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(10)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
where
<!-- MATH
 $l_n,\,n=N+1,\ldots,P$
 -->
<IMG
 WIDTH="161" HEIGHT="32" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img32.gif"
 ALT="$l_n,\,n=N+1,\ldots,P-1$"> are the eigenvalues associated with the
omitted eigenvectors in the expansion&nbsp;(<A HREF="prin_node1.html#eq:yi">3</A>). Thus, by choosing
the <IMG
 WIDTH="20" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img12.gif"
 ALT="$N$"> largest eigenvalues, and their associated eigenvectors, the
error <IMG
 WIDTH="30" HEIGHT="32" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img33.gif"
 ALT="$E_N$"> is minimized.

<P>
The transformation matrix to go from the pattern space to the feature
space consists of the ordered eigenvectors

<!-- MATH
 $\mathbf{e}_1,\ldots,\mathbf{e}_P$
 -->
<IMG
 WIDTH="80" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
 SRC="gif/principal_img34.gif"
 ALT="$\mathbf{e}_0,\ldots,\mathbf{e}_{P-1}$"> for its columns
<BR>
<DIV ALIGN="RIGHT">


<!-- MATH
 \begin{equation}
\mathsf{T} = \left[
    \begin{array}{cccc}
      \mathbf{e}_0 &
      \mathbf{e}_1 &
      \vdots &
      \mathbf{e}_{P-1}
    \end{array}\right]
  = \left[
    \begin{array}{cccc}
      \mathbf{e}_{0_0} &  \mathbf{e}_{1_0} & \cdots &  \mathbf{e}_{{P-1}_0}\\
      \mathbf{e}_{0_1} &  \mathbf{e}_{1_1} & \cdots &  \mathbf{e}_{{P-1}_1}\\
      \vdots        &  \vdots        & \ddots &  \vdots \\
      \mathbf{e}_{0_{P-1}} &  \mathbf{e}_{1_{P-1}} & \cdots &  \mathbf{e}_{{P-1}_{P-1}}\\
    \end{array}\right]
\end{equation}
 -->

<TABLE WIDTH="100%" ALIGN="CENTER">
<TR VALIGN="MIDDLE"><TD ALIGN="CENTER" NOWRAP><A NAME="eq:trans"></A><IMG
 WIDTH="378" HEIGHT="102" BORDER="0"
 SRC="gif/principal_img35.gif"
 ALT="\begin{displaymath}
\mathsf{T} = \left[
\begin{array}{cccc}
\mathbf{e}_0 &amp;
\...
...bf{e}_{1_{P-1}} &amp; \cdots &amp; \mathbf{e}_{{P-1}_{P-1}}\\
\end{array}\right]
\end{displaymath}"></TD>
<TD WIDTH=10 ALIGN="RIGHT">
(11)</TD></TR>
</TABLE>
<BR CLEAR="ALL"></DIV><P></P>
This is an orthogonal transformation, or rotation, of the pattern
space and feature selection results in ignoring certain coordinates
in the transformed space.
   <p>
   <DIV ALIGN="RIGHT">
   Christian Holm<br>
   August 2000, CERN
   </DIV>
<!--*/
// -->End_Html

// $Id$
// $Date: 2006/05/24 14:55:26 $
// $Author: brun $

#include "TPrincipal.h"

#include "TVectorD.h"
#include "TMatrixD.h"
#include "TMatrixDSymEigen.h"
#include "TMath.h"
#include "TList.h"
#include "TH2.h"
#include "TDatime.h"
#include "TBrowser.h"
#include "TROOT.h"
#include "Riostream.h"


ClassImp(TPrincipal);

//____________________________________________________________________
TPrincipal::TPrincipal()
  : fMeanValues(0),
    fSigmas(0),
    fCovarianceMatrix(1,1),
    fEigenVectors(1,1),
    fEigenValues(0),
    fOffDiagonal(0),
    fStoreData(kFALSE)
{
  // Empty CTOR, Do not use.

   fTrace              = 0;
   fHistograms         = 0;
   fIsNormalised       = kFALSE;
   fNumberOfDataPoints = 0;
   fNumberOfVariables  = 0;
}

//____________________________________________________________________
TPrincipal::TPrincipal(Int_t nVariables, Option_t *opt)
  : fMeanValues(nVariables),
    fSigmas(nVariables),
    fCovarianceMatrix(nVariables,nVariables),
    fEigenVectors(nVariables,nVariables),
    fEigenValues(nVariables),
    fOffDiagonal(nVariables),
    fStoreData(kFALSE)
{
   // Ctor. Argument is number of variables in the sample of data
   // Options are:
   //   N       Normalize the covariance matrix (default)
   //   D       Store input data (default)
   //
   // The created object is  named "principal" by default.
   if (nVariables <= 1) {
      Error("TPrincipal", "You can't be serious - nVariables == 1!!!");
      return;
   }

   SetName("principal");

   fTrace              = 0;
   fHistograms         = 0;
   fIsNormalised       = kFALSE;
   fNumberOfDataPoints = 0;
   fNumberOfVariables  = nVariables;
   while (strlen(opt) > 0) {
      switch(*opt++) {
         case 'N':
         case 'n':
            fIsNormalised = kTRUE;
            break;
         case 'D':
         case 'd':
            fStoreData    = kTRUE;
            break;
         default:
            break;
      }
   }

   if (!fMeanValues.IsValid())
      Error("TPrincipal","Couldn't create vector mean values");
   if (!fSigmas.IsValid())
      Error("TPrincipal","Couldn't create vector sigmas");
   if (!fCovarianceMatrix.IsValid())
      Error("TPrincipal","Couldn't create covariance matrix");
   if (!fEigenVectors.IsValid())
      Error("TPrincipal","Couldn't create eigenvector matrix");
   if (!fEigenValues.IsValid())
      Error("TPrincipal","Couldn't create eigenvalue vector");
   if (!fOffDiagonal.IsValid())
      Error("TPrincipal","Couldn't create offdiagonal vector");
   if (fStoreData) {
      fUserData.ResizeTo(nVariables*1000);
      fUserData.Zero();
      if (!fUserData.IsValid())
         Error("TPrincipal","Couldn't create user data vector");
   }
}

//____________________________________________________________________
TPrincipal::TPrincipal(const TPrincipal& pr) : 
  TNamed(pr),
  fNumberOfDataPoints(pr.fNumberOfDataPoints),
  fNumberOfVariables(pr.fNumberOfVariables),
  fMeanValues(pr.fMeanValues),
  fSigmas(pr.fSigmas),
  fCovarianceMatrix(pr.fCovarianceMatrix),
  fEigenVectors(pr.fEigenVectors),
  fEigenValues(pr.fEigenValues),
  fOffDiagonal(pr.fOffDiagonal),
  fUserData(pr.fUserData),
  fTrace(pr.fTrace),
  fHistograms(pr.fHistograms),
  fIsNormalised(pr.fIsNormalised),
  fStoreData(pr.fStoreData)
{ 
   //copy constructor
}

//____________________________________________________________________
TPrincipal& TPrincipal::operator=(const TPrincipal& pr)
{
   //assignement operator
   if(this!=&pr) {
      TNamed::operator=(pr);
      fNumberOfDataPoints=pr.fNumberOfDataPoints;
      fNumberOfVariables=pr.fNumberOfVariables;
      fMeanValues=pr.fMeanValues;
      fSigmas=pr.fSigmas;
      fCovarianceMatrix=pr.fCovarianceMatrix;
      fEigenVectors=pr.fEigenVectors;
      fEigenValues=pr.fEigenValues;
      fOffDiagonal=pr.fOffDiagonal;
      fUserData=pr.fUserData;
      fTrace=pr.fTrace;
      fHistograms=pr.fHistograms;
      fIsNormalised=pr.fIsNormalised;
      fStoreData=pr.fStoreData;
   } 
   return *this;
}

//____________________________________________________________________
TPrincipal::~TPrincipal()
{
   // destructor

   if (fHistograms) {
      fHistograms->Delete();
      delete fHistograms;
   }
}

//____________________________________________________________________
void TPrincipal::AddRow(const Double_t *p)
{
  // Begin_Html
  /*
     </PRE>
Add a data point and update the covariance matrix. The input
array must be <TT>fNumberOfVariables</TT> long.

<P>
The Covariance matrix and mean values of the input data is caculated
on the fly by the following equations:
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
\left<x_i\right>^{(0)}  = x_{i0}
\end{displaymath}
 -->


<IMG
 WIDTH="90" HEIGHT="31" BORDER="0"
 SRC="gif/principal_img36.gif"
 ALT="\begin{displaymath}
\left&lt;x_i\right&gt;^{(0)} = x_{i0}
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
\left<x_i\right>^{(n)} = \left<x_i\right>^{(n-1)}
+ \frac1n \left(x_{in} - \left<x_i\right>^{(n-1)}\right)
\end{displaymath}
 -->


<IMG
 WIDTH="302" HEIGHT="42" BORDER="0"
 SRC="gif/principal_img37.gif"
 ALT="\begin{displaymath}
\left&lt;x_i\right&gt;^{(n)} = \left&lt;x_i\right&gt;^{(n-1)}
+ \frac1n \left(x_{in} - \left&lt;x_i\right&gt;^{(n-1)}\right)
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
C_{ij}^{(0)} = 0
\end{displaymath}
 -->


<IMG
 WIDTH="62" HEIGHT="34" BORDER="0"
 SRC="gif/principal_img38.gif"
 ALT="\begin{displaymath}
C_{ij}^{(0)} = 0
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
C_{ij}^{(n)} = C_{ij}^{(n-1)}
+ \frac1{n-1}\left[\left(x_{in} - \left<x_i\right>^{(n)}\right)
  \left(x_{jn} - \left<x_j\right>^{(n)}\right)\right]
- \frac1n C_{ij}^{(n-1)}
\end{displaymath}
 -->


<IMG
 WIDTH="504" HEIGHT="43" BORDER="0"
 SRC="gif/principal_img39.gif"
 ALT="\begin{displaymath}
C_{ij}^{(n)} = C_{ij}^{(n-1)}
+ \frac1{n-1}\left[\left(x_{i...
...\left&lt;x_j\right&gt;^{(n)}\right)\right]
- \frac1n C_{ij}^{(n-1)}
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>
since this is a really fast method, with no rounding errors (please
refer to CERN 72-21 pp. 54-106).

<P>
The data is stored internally in a <TT>TVectorD</TT>, in the following
way:
<BR><P></P>
<DIV ALIGN="CENTER">

<!-- MATH
 \begin{displaymath}
\mathbf{x} = \left[\left(x_{0_0},\ldots,x_{{P-1}_0}\right),\ldots,
    \left(x_{0_i},\ldots,x_{{P-1}_i}\right), \ldots\right]
\end{displaymath}
 -->


<IMG
 WIDTH="319" HEIGHT="31" BORDER="0"
 SRC="gif/principal_img40.gif"
 ALT="\begin{displaymath}
\mathbf{x} = \left[\left(x_{0_0},\ldots,x_{{P-1}_0}\right),\ldots,
\left(x_{0_i},\ldots,x_{{P-1}_i}\right), \ldots\right]
\end{displaymath}">
</DIV>
<BR CLEAR="ALL">
<P></P>
With <IMG
 WIDTH="18" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
 SRC="gif/principal_img6.gif"
 ALT="$P$"> as defined in the class description.
     <PRE>
  */
  // End_Html
   if (!p)
      return;

   // Increment the data point counter
   Int_t i,j;
   if (++fNumberOfDataPoints == 1) {
      for (i = 0; i < fNumberOfVariables; i++)
         fMeanValues(i) = p[i];
   }
   else {

      Double_t cor = 1 - 1./Double_t(fNumberOfDataPoints);
      for (i = 0; i < fNumberOfVariables; i++) {

         fMeanValues(i) *= cor;
         fMeanValues(i) += p[i] / Double_t(fNumberOfDataPoints);
         Double_t t1 = (p[i] - fMeanValues(i)) / (fNumberOfDataPoints - 1);

         // Setting Matrix (lower triangle) elements
         for (j = 0; j < i + 1; j++) {
            fCovarianceMatrix(i,j) *= cor;
            fCovarianceMatrix(i,j) += t1 * (p[j] - fMeanValues(j));
         }
      }
   }

   // Store data point in internal vector
   // If the vector isn't big enough to hold the new data, then
   // expand the vector by half it's size.
   if (!fStoreData)
      return;
   Int_t size = fUserData.GetNrows();
   if (fNumberOfDataPoints * fNumberOfVariables > size)
      fUserData.ResizeTo(size + size/2);

   for (i = 0; i < fNumberOfVariables; i++) {
      j = (fNumberOfDataPoints-1) * fNumberOfVariables + i;
      fUserData(j) = p[i];
   }

}

//____________________________________________________________________
void TPrincipal::Browse(TBrowser *b)
{
   // Browse the TPrincipal object in the TBrowser.
   if (fHistograms) {
      TIter next(fHistograms);
      TH1* h = 0;
      while ((h = (TH1*)next()))
         b->Add(h,h->GetName());
   }

   if (fStoreData)
      b->Add(&fUserData,"User Data");
   b->Add(&fCovarianceMatrix,"Covariance Matrix");
   b->Add(&fMeanValues,"Mean value vector");
   b->Add(&fSigmas,"Sigma value vector");
   b->Add(&fEigenValues,"Eigenvalue vector");
   b->Add(&fEigenVectors,"Eigenvector Matrix");

}

//____________________________________________________________________
void TPrincipal::Clear(Option_t *opt)
{
   // Clear the data in Object. Notice, that's not possible to change
   // the dimension of the original data.
   if (fHistograms) {
      fHistograms->Delete(opt);
   }

   fNumberOfDataPoints = 0;
   fTrace              = 0;
   fCovarianceMatrix.Zero();
   fEigenVectors.Zero();
   fEigenValues.Zero();
   fMeanValues.Zero();
   fSigmas.Zero();
   fOffDiagonal.Zero();

   if (fStoreData) {
      fUserData.ResizeTo(fNumberOfVariables * 1000);
      fUserData.Zero();
   }
}

//____________________________________________________________________
const Double_t *TPrincipal::GetRow(Int_t row)
{
   // Return a row of the user supplied data.
   // If row is out of bounds, 0 is returned.
   // It's up to the user to delete the returned array.
   // Row 0 is the first row;
   if (row >= fNumberOfDataPoints)
      return 0;

   if (!fStoreData)
      return 0;

   Int_t index   = row  * fNumberOfVariables;
   return &fUserData(index);
}


//____________________________________________________________________
void TPrincipal::MakeCode(const char *filename, Option_t *opt)
{
   // Generates the file <filename>, with .C appended if it does
   // argument doesn't end in .cxx or .C.
   //
   // The file contains the implementation of two functions
   //
   //    void X2P(Double_t *x, Double *p)
   //    void P2X(Double_t *p, Double *x, Int_t nTest)
   //
   // which does the same as  TPrincipal::X2P and TPrincipal::P2X
   // respectively. Please refer to these methods.
   //
   // Further, the static variables:
   //
   //    Int_t    gNVariables
   //    Double_t gEigenValues[]
   //    Double_t gEigenVectors[]
   //    Double_t gMeanValues[]
   //    Double_t gSigmaValues[]
   //
   // are initialized. The only ROOT header file needed is Rtypes.h
   //
   // See TPrincipal::MakeRealCode for a list of options

   TString outName(filename);
   if (!outName.EndsWith(".C") && !outName.EndsWith(".cxx"))
      outName += ".C";

   MakeRealCode(outName.Data(),"",opt);
}

//____________________________________________________________________
void TPrincipal::MakeHistograms(const char *name, Option_t *opt)
{
   // Make histograms of the result of the analysis.
   // The option string say which histograms to create
   //      X         Histogram original data
   //      P         Histogram principal components corresponding to
   //                original data
   //      D         Histogram the difference between the original data
   //                and the projection of principal unto a lower
   //                dimensional subspace (2D histograms)
   //      E         Histogram the eigenvalues
   //      S         Histogram the square of the residues
   //                (see TPrincipal::SumOfSquareResidues)
   // The histograms will be named <name>_<type><number>, where <name>
   // is the first argument, <type> is one of X,P,D,E,S, and <number>
   // is the variable.
   Bool_t makeX  = kFALSE;
   Bool_t makeD  = kFALSE;
   Bool_t makeP  = kFALSE;
   Bool_t makeE  = kFALSE;
   Bool_t makeS  = kFALSE;

   Int_t len     = strlen(opt);
   Int_t i,j,k;
   for (i = 0; i < len; i++) {
      switch (opt[i]) {
         case 'X':
         case 'x':
            if (fStoreData)
               makeX = kTRUE;
            break;
         case 'd':
         case 'D':
            if (fStoreData)
               makeD = kTRUE;
            break;
         case 'P':
         case 'p':
            if (fStoreData)
               makeP = kTRUE;
            break;
         case 'E':
         case 'e':
            makeE = kTRUE;
            break;
         case 's':
         case 'S':
            if (fStoreData)
               makeS = kTRUE;
            break;
         default:
            Warning("MakeHistograms","Unknown option: %c",opt[i]);
      }
   }

   // If no option was given, then exit gracefully
   if (!makeX && !makeD && !makeP && !makeE && !makeS)
      return;

   // If the list of histograms doesn't exist, create it.
   if (!fHistograms)
      fHistograms = new TList;

   // Don't create the histograms if they are already in the TList.
   if (makeX && fHistograms->FindObject(Form("%s_x000",name)))
      makeX = kFALSE;
   if (makeD && fHistograms->FindObject(Form("%s_d000",name)))
      makeD = kFALSE;
   if (makeP && fHistograms->FindObject(Form("%s_p000",name)))
      makeP = kFALSE;
   if (makeE && fHistograms->FindObject(Form("%s_e",name)))
      makeE = kFALSE;
   if (makeS && fHistograms->FindObject(Form("%s_s",name)))
      makeS = kFALSE;

   TH1F **hX  = 0;
   TH2F **hD  = 0;
   TH1F **hP  = 0;
   TH1F *hE   = 0;
   TH1F *hS   = 0;

   // Initialize the arrays of histograms needed
   if (makeX)
      hX = new TH1F * [fNumberOfVariables];

   if (makeD)
      hD = new TH2F * [fNumberOfVariables];

   if (makeP)
      hP = new TH1F * [fNumberOfVariables];

   if (makeE){
      hE = new TH1F(Form("%s_e",name), "Eigenvalues of Covariance matrix",
         fNumberOfVariables,0,fNumberOfVariables);
      hE->SetXTitle("Eigenvalue");
      fHistograms->Add(hE);
   }

   if (makeS) {
      hS = new TH1F(Form("%s_s",name),"E_{N}",
         fNumberOfVariables-1,1,fNumberOfVariables);
      hS->SetXTitle("N");
      hS->SetYTitle("#sum_{i=1}^{M} (x_{i} - x'_{N,i})^{2}");
      fHistograms->Add(hS);
   }

   // Initialize sub elements of the histogram arrays
   for (i = 0; i < fNumberOfVariables; i++) {
      if (makeX) {
         // We allow 4 sigma spread in the original data in our
         // histogram.
         Double_t xlowb  = fMeanValues(i) - 4 * fSigmas(i);
         Double_t xhighb = fMeanValues(i) + 4 * fSigmas(i);
         Int_t    xbins  = fNumberOfDataPoints/100;
         hX[i]           = new TH1F(Form("%s_x%03d", name, i),
            Form("Pattern space, variable %d", i),
            xbins,xlowb,xhighb);
         hX[i]->SetXTitle(Form("x_{%d}",i));
         fHistograms->Add(hX[i]);
      }

      if(makeD) {
         // The upper limit below is arbitrary!!!
         Double_t dlowb  = 0;
         Double_t dhighb = 20;
         Int_t    dbins  = fNumberOfDataPoints/100;
         hD[i]           = new TH2F(Form("%s_d%03d", name, i),
            Form("Distance from pattern to "
            "feature space, variable %d", i),
            dbins,dlowb,dhighb,
            fNumberOfVariables-1,
            1,
            fNumberOfVariables);
         hD[i]->SetXTitle(Form("|x_{%d} - x'_{%d,N}|/#sigma_{%d}",i,i,i));
         hD[i]->SetYTitle("N");
         fHistograms->Add(hD[i]);
      }

      if(makeP) {
         // For some reason, the trace of the none-scaled matrix
         // (see TPrincipal::MakeNormalised) should enter here. Taken
         // from LINTRA code.
         Double_t et = TMath::Abs(fEigenValues(i) * fTrace);
         Double_t plowb   = -10 * TMath::Sqrt(et);
         Double_t phighb  = -plowb;
         Int_t    pbins   = 100;
         hP[i]            = new TH1F(Form("%s_p%03d", name, i),
            Form("Feature space, variable %d", i),
            pbins,plowb,phighb);
         hP[i]->SetXTitle(Form("p_{%d}",i));
         fHistograms->Add(hP[i]);
      }

      if (makeE)
         // The Eigenvector histogram is easy
         hE->Fill(i,fEigenValues(i));

   }
   if (!makeX && !makeP && !makeD && !makeS)
      return;

   Double_t *x = 0;
   Double_t *p = new Double_t[fNumberOfVariables];
   Double_t *d = new Double_t[fNumberOfVariables];
   for (i = 0; i < fNumberOfDataPoints; i++) {

      // Zero arrays
      for (j = 0; j < fNumberOfVariables; j++)
         p[j] = d[j] = 0;

      // update the original data histogram
      x  = (Double_t*)(GetRow(i));
      R__ASSERT(x);

      if (makeP||makeD||makeS)
         // calculate the corresponding principal component
         X2P(x,p);

      if (makeD || makeS) {
         // Calculate the difference between the original data, and the
         // same project onto principal components, and then to a lower
         // dimensional sub-space
         for (j = fNumberOfVariables; j > 0; j--) {
            P2X(p,d,j);

            for (k = 0; k < fNumberOfVariables; k++) {
               // We use the absolute value of the difference!
               d[k] = x[k] - d[k];

               if (makeS)
                  hS->Fill(j,d[k]*d[k]);

               if (makeD) {
                  d[k] = TMath::Abs(d[k]) / (fIsNormalised ? fSigmas(k) : 1);
                  (hD[k])->Fill(d[k],j);
               }
            }
         }
      }

      if (makeX||makeP) {
         // If we are asked to make any of these histograms, we have to
         // go here
         for (j = 0; j < fNumberOfVariables; j++) {
            if (makeX)
               (hX[j])->Fill(x[j]);

            if (makeP)
               (hP[j])->Fill(p[j]);
         }
      }
   }
   // Clean up
   if (hX)
      delete [] hX;
   if (hD)
      delete [] hD;
   if (hP)
      delete [] hP;
   if (d)
      delete [] d;
   if (p)
      delete [] p;

   // Normalize the residues
   if (makeS)
      hS->Scale(Double_t(1.)/fNumberOfDataPoints);
}

//____________________________________________________________________
void TPrincipal::MakeNormalised()
{
   // PRIVATE METHOD: Normalize the covariance matrix

   Int_t i,j;
   for (i = 0; i < fNumberOfVariables; i++) {
      fSigmas(i) = TMath::Sqrt(fCovarianceMatrix(i,i));
      if (fIsNormalised)
         for (j = 0; j <= i; j++)
            fCovarianceMatrix(i,j) /= (fSigmas(i) * fSigmas(j));

      fTrace += fCovarianceMatrix(i,i);
   }

   // Fill remaining parts of matrix, and scale.
   for (i = 0; i < fNumberOfVariables; i++)
      for (j = 0; j <= i; j++) {
         fCovarianceMatrix(i,j) /= fTrace;
         fCovarianceMatrix(j,i) = fCovarianceMatrix(i,j);
      }

}

//____________________________________________________________________
void TPrincipal::MakeMethods(const char *classname, Option_t *opt)
{
   // Generate the file <classname>PCA.cxx which contains the
   // implementation of two methods:
   //
   //    void <classname>::X2P(Double_t *x, Double *p)
   //    void <classname>::P2X(Double_t *p, Double *x, Int_t nTest)
   //
   // which does the same as  TPrincipal::X2P and TPrincipal::P2X
   // respectivly. Please refer to these methods.
   //
   // Further, the public static members:
   //
   //    Int_t    <classname>::fgNVariables
   //    Double_t <classname>::fgEigenValues[]
   //    Double_t <classname>::fgEigenVectors[]
   //    Double_t <classname>::fgMeanValues[]
   //    Double_t <classname>::fgSigmaValues[]
   //
   // are initialized, and assumed to exist. The class declaration is
   // assumed to be in <classname>.h and assumed to be provided by the
   // user.
   //
   // See TPrincipal::MakeRealCode for a list of options
   //
   // The minimal class definition is:
   //
   //   class <classname> {
   //   public:
   //     static Int_t    fgNVariables;
   //     static Double_t fgEigenVectors[];
   //     static Double_t fgEigenValues[];
   //     static Double_t fgMeanValues[];
   //     static Double_t fgSigmaValues[];
   //
   //     void X2P(Double_t *x, Double_t *p);
   //     void P2X(Double_t *p, Double_t *x, Int_t nTest);
   //   };
   //
   // Whether the methods <classname>::X2P and <classname>::P2X should
   // be static or not, is up to the user.


   MakeRealCode(Form("%sPCA.cxx", classname), classname, opt);
}


//____________________________________________________________________
void TPrincipal::MakePrincipals()
{
   // Perform the principal components analysis.
   // This is done in several stages in the TMatrix::EigenVectors method:
   // * Transform the covariance matrix into a tridiagonal matrix.
   // * Find the eigenvalues and vectors of the tridiagonal matrix.

   // Normalize covariance matrix
   MakeNormalised();

   TMatrixDSym sym; sym.Use(fCovarianceMatrix.GetNrows(),fCovarianceMatrix.GetMatrixArray());
   TMatrixDSymEigen eigen(sym);
   fEigenVectors = eigen.GetEigenVectors();
   fEigenValues  = eigen.GetEigenValues();
   //make sure that eigenvalues are positive
   for (Int_t i = 0; i < fNumberOfVariables; i++) {
      if (fEigenValues[i] < 0) fEigenValues[i] = -fEigenValues[i];
   }
}

//____________________________________________________________________
void TPrincipal::MakeRealCode(const char *filename, const char *classname,
                              Option_t *)
{
   // PRIVATE METHOD:
   // This is the method that actually generates the code for the
   // transformations to and from feature space and pattern space
   // It's called by TPrincipal::MakeCode and TPrincipal::MakeMethods.
   //
   // The options are: NONE so far

   Bool_t  isMethod = (classname[0] == '\0' ? kFALSE : kTRUE);
   const char *prefix   = (isMethod ? Form("%s::", classname) : "");
   const char *cv_qual  = (isMethod ? "" : "static ");

   ofstream outFile(filename,ios::out|ios::trunc);
   if (!outFile) {
      Error("MakeRealCode","couldn't open output file '%s'",filename);
      return;
   }

   cout << "Writing on file \"" << filename << "\" ... " << flush;
   //
   // Write header of file
   //
   // Emacs mode line ;-)
   outFile << "// -*- mode: c++ -*-" << endl;
   // Info about creator
   outFile << "// " << endl
      << "// File " << filename
      << " generated by TPrincipal::MakeCode" << endl;
   // Time stamp
   TDatime date;
   outFile << "// on " << date.AsString() << endl;
   // ROOT version info
   outFile << "// ROOT version " << gROOT->GetVersion()
      << endl << "//" << endl;
   // General information on the code
   outFile << "// This file contains the functions " << endl
      << "//" << endl
      << "//    void  " << prefix
      << "X2P(Double_t *x, Double_t *p); " << endl
      << "//    void  " << prefix
      << "P2X(Double_t *p, Double_t *x, Int_t nTest);"
      << endl << "//" << endl
      << "// The first for transforming original data x in " << endl
      << "// pattern space, to principal components p in " << endl
      << "// feature space. The second function is for the" << endl
      << "// inverse transformation, but using only nTest" << endl
      << "// of the principal components in the expansion" << endl
      << "// " << endl
      << "// See TPrincipal class documentation for more "
      << "information " << endl << "// " << endl;
   // Header files
   outFile << "#ifndef __CINT__" << endl;
   if (isMethod)
      // If these are methods, we need the class header
      outFile << "#include \"" << classname << ".h\"" << endl;
   else
      // otherwise, we need the typedefs of Int_t and Double_t
      outFile << "#include <Rtypes.h> // needed for Double_t etc" << endl;
   // Finish the preprocessor block
   outFile << "#endif" << endl << endl;

   //
   // Now for the data
   //
   // We make the Eigenvector matrix, Eigenvalue vector, Sigma vector,
   // and Mean value vector static, since all are needed in both
   // functions. Also ,the number of variables are stored in a static
   // variable.
   outFile << "//" << endl
      << "// Static data variables"  << endl
      << "//" << endl;
   outFile << cv_qual << "Int_t    " << prefix << "gNVariables = "
      << fNumberOfVariables << ";" << endl;

   // Assign the values to the Eigenvector matrix. The elements are
   // stored row-wise, that is element
   //    M[i][j] = e[i * nVariables + j]
   // where i and j are zero-based.
   outFile << endl << "// Assignment of eigenvector matrix." << endl
      << "// Elements are stored row-wise, that is" << endl
      << "//    M[i][j] = e[i * nVariables + j] " << endl
      << "// where i and j are zero-based" << endl;
   outFile << cv_qual << "Double_t " << prefix
      << "gEigenVectors[] = {" << flush;
   Int_t i,j;
   for (i = 0; i < fNumberOfVariables; i++) {
      for (j = 0; j < fNumberOfVariables; j++) {
         Int_t index = i * fNumberOfVariables + j;
         outFile << (index != 0 ? "," : "" ) << endl
            << "  "  << fEigenVectors(i,j) << flush;
      }
   }
   outFile << "};" << endl << endl;

   // Assignment to eigenvalue vector. Zero-based.
   outFile << "// Assignment to eigen value vector. Zero-based." << endl;
   outFile << cv_qual << "Double_t " << prefix
      << "gEigenValues[] = {" << flush;
   for (i = 0; i < fNumberOfVariables; i++)
      outFile << (i != 0 ? "," : "") << endl
      << "  " << fEigenValues(i) << flush;
   outFile << endl << "};" << endl << endl;

   // Assignment to mean Values vector. Zero-based.
   outFile << "// Assignment to mean value vector. Zero-based." << endl;
   outFile << cv_qual << "Double_t " << prefix
      << "gMeanValues[] = {" << flush;
   for (i = 0; i < fNumberOfVariables; i++)
      outFile << (i != 0 ? "," : "") << endl
      << "  " << fMeanValues(i) << flush;
   outFile << endl << "};" << endl << endl;

   // Assignment to mean Values vector. Zero-based.
   outFile << "// Assignment to sigma value vector. Zero-based." << endl;
   outFile << cv_qual << "Double_t " << prefix
      << "gSigmaValues[] = {" << flush;
   for (i = 0; i < fNumberOfVariables; i++)
      outFile << (i != 0 ? "," : "") << endl
      << "  " << (fIsNormalised ? fSigmas(i) : 1) << flush;
   //    << "  " << fSigmas(i) << flush;
   outFile << endl << "};" << endl << endl;

   //
   // Finally we reach the functions themselves
   //
   // First: void x2p(Double_t *x, Double_t *p);
   //
   outFile << "// " << endl
      << "// The "
      << (isMethod ? "method " : "function ")
      << "  void " << prefix
      << "X2P(Double_t *x, Double_t *p)"
      << endl << "// " << endl;
   outFile << "void " << prefix
      << "X2P(Double_t *x, Double_t *p) {" << endl
      << "  for (Int_t i = 0; i < gNVariables; i++) {" << endl
      << "    p[i] = 0;" << endl
      << "    for (Int_t j = 0; j < gNVariables; j++)" << endl
      << "      p[i] += (x[j] - gMeanValues[j]) " << endl
      << "        * gEigenVectors[j *  gNVariables + i] "
      << "/ gSigmaValues[j];" << endl << endl << "  }"
      << endl << "}" << endl << endl;
   //
   // Now: void p2x(Double_t *p, Double_t *x, Int_t nTest);
   //
   outFile << "// " << endl << "// The "
      << (isMethod ? "method " : "function ")
      << "  void " << prefix
      << "P2X(Double_t *p, Double_t *x, Int_t nTest)"
      << endl << "// " << endl;
   outFile << "void " << prefix
      << "P2X(Double_t *p, Double_t *x, Int_t nTest) {" << endl
      << "  for (Int_t i = 0; i < gNVariables; i++) {" << endl
      << "    x[i] = gMeanValues[i];" << endl
      << "    for (Int_t j = 0; j < nTest; j++)" << endl
      << "      x[i] += p[j] * gSigmaValues[i] " << endl
      << "        * gEigenVectors[i *  gNVariables + j];" << endl
      << "  }" << endl << "}" << endl << endl;

   // EOF
   outFile << "// EOF for " << filename << endl;

   // Close the file
   outFile.close();

   cout << "done" << endl;
}

//____________________________________________________________________
void TPrincipal::P2X(const Double_t *p, Double_t *x, Int_t nTest)
{
   // Calculate x as a function of nTest of the most significant
   // principal components p, and return it in x.
   // It's the users responsibility to make sure that both x and p are
   // of the right size (i.e., memory must be allocated for x).

   for (Int_t i = 0; i < fNumberOfVariables; i++){
      x[i] = fMeanValues(i);
      for (Int_t j = 0; j < nTest; j++)
         x[i] += p[j] * (fIsNormalised ? fSigmas(i) : 1)
         * fEigenVectors(i,j);
   }

}

//____________________________________________________________________
void TPrincipal::Print(Option_t *opt) const
{
   // Print the statistics
   // Options are
   //      M            Print mean values of original data
   //      S            Print sigma values of original data
   //      E            Print eigenvalues of covariance matrix
   //      V            Print eigenvectors of covariance matrix
   // Default is MSE

   Bool_t printV = kFALSE;
   Bool_t printM = kFALSE;
   Bool_t printS = kFALSE;
   Bool_t printE = kFALSE;

   Int_t len     = strlen(opt);
   for (Int_t i = 0; i < len; i++) {
      switch (opt[i]) {
         case 'V':
         case 'v':
            printV = kTRUE;
            break;
         case 'M':
         case 'm':
            printM = kTRUE;
            break;
         case 'S':
         case 's':
            printS = kTRUE;
            break;
         case 'E':
         case 'e':
            printE = kTRUE;
            break;
         default:
            Warning("Print", "Unknown option '%c'",opt[i]);
            break;
      }
   }

   if (printM||printS||printE) {
      cout << " Variable #  " << flush;
      if (printM)
         cout << "| Mean Value " << flush;
      if (printS)
         cout << "|   Sigma    " << flush;
      if (printE)
         cout << "| Eigenvalue" << flush;
      cout << endl;

      cout << "-------------" << flush;
      if (printM)
         cout << "+------------" << flush;
      if (printS)
         cout << "+------------" << flush;
      if (printE)
         cout << "+------------" << flush;
      cout << endl;

      for (Int_t i = 0; i < fNumberOfVariables; i++) {
         cout << setw(12) << i << " " << flush;
         if (printM)
            cout << "| " << setw(10) << setprecision(4)
            << fMeanValues(i) << " " << flush;
         if (printS)
            cout << "| " << setw(10) << setprecision(4)
            << fSigmas(i) << " " << flush;
         if (printE)
            cout << "| " << setw(10) << setprecision(4)
            << fEigenValues(i) << " " << flush;
         cout << endl;
      }
      cout << endl;
   }

   if(printV) {
      for (Int_t i = 0; i < fNumberOfVariables; i++) {
         cout << "Eigenvector # " << i << flush;
         TVectorD v(fNumberOfVariables);
         v = TMatrixDColumn_const(fEigenVectors,i);
         v.Print();
      }
   }
}

//____________________________________________________________________
void TPrincipal::SumOfSquareResiduals(const Double_t *x, Double_t *s)
{
   // PRIVATE METHOD:
   // Begin_html
   /*
    </PRE>
    Calculates the sum of the square residuals, that is
    <BR><P></P>
    <DIV ALIGN="CENTER">

    <!-- MATH
    \begin{displaymath}
    E_N = \sum_{i=0}^{P-1} \left(x_i - x^\prime_i\right)^2
    \end{displaymath}
    -->


    <IMG
    WIDTH="147" HEIGHT="58" BORDER="0"
    SRC="gif/principal_img52.gif"
    ALT="\begin{displaymath}
    E_N = \sum_{i=0}^{P-1} \left(x_i - x^\prime_i\right)^2
    \end{displaymath}">
    </DIV>
    <BR CLEAR="ALL">
    <P></P>
    where
    <!-- MATH
    $x^\prime_i = \sum_{j=i}^N p_i e_{n_j}$
    -->
    <IMG
    WIDTH="122" HEIGHT="40" ALIGN="MIDDLE" BORDER="0"
    SRC="gif/principal_img53.gif"
    ALT="$x^\prime_i = \sum_{j=i}^N p_i e_{n_j}$">, <IMG
    WIDTH="19" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
    SRC="gif/principal_img54.gif"
    ALT="$p_i$"> is the
    <IMG
    WIDTH="28" HEIGHT="23" ALIGN="BOTTOM" BORDER="0"
    SRC="gif/principal_img55.gif"
    ALT="$i^{\mbox{th}}$"> component of the principal vector, corresponding to
    <IMG
    WIDTH="20" HEIGHT="30" ALIGN="MIDDLE" BORDER="0"
    SRC="gif/principal_img56.gif"
    ALT="$x_i$">, the original data; I.e., the square distance to the space
    spanned by <IMG
    WIDTH="20" HEIGHT="15" ALIGN="BOTTOM" BORDER="0"
    SRC="gif/principal_img12.gif"
    ALT="$N$"> eigenvectors.
    <BR>
    <PRE>
   */
   // End_Html
   if (!x)
      return;

   Double_t p[100];
   Double_t xp[100];

   X2P(x,p);
   for (Int_t i = fNumberOfVariables-1; i >= 0; i--) {
      P2X(p,xp,i);
      for (Int_t j = 0; j < fNumberOfVariables; j++) {
         s[i] += (x[j] - xp[j])*(x[j] - xp[j]);
      }
   }
}

//____________________________________________________________________
void TPrincipal::Test(Option_t *)
{
   // Test the PCA, bye calculating the sum square of residuals
   // (see method SumOfSquareResiduals), and display the histogram
   MakeHistograms("pca","S");

   if (!fStoreData)
      return;

   TH1 *pca_s = 0;
   if (fHistograms) pca_s = (TH1*)fHistograms->FindObject("pca_s");
   if (!pca_s) {
      Warning("Test", "Couldn't get histogram of square residuals");
      return;
   }

   pca_s->Draw();
}

//____________________________________________________________________
void TPrincipal::X2P(const Double_t *x, Double_t *p)
{
   // Calculate the principal components from the original data vector
   // x, and return it in p.
   // It's the users responsibility to make sure that both x and p are
   // of the right size (i.e., memory must be allocated for p).
   for (Int_t i = 0; i < fNumberOfVariables; i++){
      p[i] = 0;
      for (Int_t j = 0; j < fNumberOfVariables; j++)
         p[i] += (x[j] - fMeanValues(j)) * fEigenVectors(j,i) /
         (fIsNormalised ? fSigmas(j) : 1);
   }

}
 TPrincipal.cxx:1
 TPrincipal.cxx:2
 TPrincipal.cxx:3
 TPrincipal.cxx:4
 TPrincipal.cxx:5
 TPrincipal.cxx:6
 TPrincipal.cxx:7
 TPrincipal.cxx:8
 TPrincipal.cxx:9
 TPrincipal.cxx:10
 TPrincipal.cxx:11
 TPrincipal.cxx:12
 TPrincipal.cxx:13
 TPrincipal.cxx:14
 TPrincipal.cxx:15
 TPrincipal.cxx:16
 TPrincipal.cxx:17
 TPrincipal.cxx:18
 TPrincipal.cxx:19
 TPrincipal.cxx:20
 TPrincipal.cxx:21
 TPrincipal.cxx:22
 TPrincipal.cxx:23
 TPrincipal.cxx:24
 TPrincipal.cxx:25
 TPrincipal.cxx:26
 TPrincipal.cxx:27
 TPrincipal.cxx:28
 TPrincipal.cxx:29
 TPrincipal.cxx:30
 TPrincipal.cxx:31
 TPrincipal.cxx:32
 TPrincipal.cxx:33
 TPrincipal.cxx:34
 TPrincipal.cxx:35
 TPrincipal.cxx:36
 TPrincipal.cxx:37
 TPrincipal.cxx:38
 TPrincipal.cxx:39
 TPrincipal.cxx:40
 TPrincipal.cxx:41
 TPrincipal.cxx:42
 TPrincipal.cxx:43
 TPrincipal.cxx:44
 TPrincipal.cxx:45
 TPrincipal.cxx:46
 TPrincipal.cxx:47
 TPrincipal.cxx:48
 TPrincipal.cxx:49
 TPrincipal.cxx:50
 TPrincipal.cxx:51
 TPrincipal.cxx:52
 TPrincipal.cxx:53
 TPrincipal.cxx:54
 TPrincipal.cxx:55
 TPrincipal.cxx:56
 TPrincipal.cxx:57
 TPrincipal.cxx:58
 TPrincipal.cxx:59
 TPrincipal.cxx:60
 TPrincipal.cxx:61
 TPrincipal.cxx:62
 TPrincipal.cxx:63
 TPrincipal.cxx:64
 TPrincipal.cxx:65
 TPrincipal.cxx:66
 TPrincipal.cxx:67
 TPrincipal.cxx:68
 TPrincipal.cxx:69
 TPrincipal.cxx:70
 TPrincipal.cxx:71
 TPrincipal.cxx:72
 TPrincipal.cxx:73
 TPrincipal.cxx:74
 TPrincipal.cxx:75
 TPrincipal.cxx:76
 TPrincipal.cxx:77
 TPrincipal.cxx:78
 TPrincipal.cxx:79
 TPrincipal.cxx:80
 TPrincipal.cxx:81
 TPrincipal.cxx:82
 TPrincipal.cxx:83
 TPrincipal.cxx:84
 TPrincipal.cxx:85
 TPrincipal.cxx:86
 TPrincipal.cxx:87
 TPrincipal.cxx:88
 TPrincipal.cxx:89
 TPrincipal.cxx:90
 TPrincipal.cxx:91
 TPrincipal.cxx:92
 TPrincipal.cxx:93
 TPrincipal.cxx:94
 TPrincipal.cxx:95
 TPrincipal.cxx:96
 TPrincipal.cxx:97
 TPrincipal.cxx:98
 TPrincipal.cxx:99
 TPrincipal.cxx:100
 TPrincipal.cxx:101
 TPrincipal.cxx:102
 TPrincipal.cxx:103
 TPrincipal.cxx:104
 TPrincipal.cxx:105
 TPrincipal.cxx:106
 TPrincipal.cxx:107
 TPrincipal.cxx:108
 TPrincipal.cxx:109
 TPrincipal.cxx:110
 TPrincipal.cxx:111
 TPrincipal.cxx:112
 TPrincipal.cxx:113
 TPrincipal.cxx:114
 TPrincipal.cxx:115
 TPrincipal.cxx:116
 TPrincipal.cxx:117
 TPrincipal.cxx:118
 TPrincipal.cxx:119
 TPrincipal.cxx:120
 TPrincipal.cxx:121
 TPrincipal.cxx:122
 TPrincipal.cxx:123
 TPrincipal.cxx:124
 TPrincipal.cxx:125
 TPrincipal.cxx:126
 TPrincipal.cxx:127
 TPrincipal.cxx:128
 TPrincipal.cxx:129
 TPrincipal.cxx:130
 TPrincipal.cxx:131
 TPrincipal.cxx:132
 TPrincipal.cxx:133
 TPrincipal.cxx:134
 TPrincipal.cxx:135
 TPrincipal.cxx:136
 TPrincipal.cxx:137
 TPrincipal.cxx:138
 TPrincipal.cxx:139
 TPrincipal.cxx:140
 TPrincipal.cxx:141
 TPrincipal.cxx:142
 TPrincipal.cxx:143
 TPrincipal.cxx:144
 TPrincipal.cxx:145
 TPrincipal.cxx:146
 TPrincipal.cxx:147
 TPrincipal.cxx:148
 TPrincipal.cxx:149
 TPrincipal.cxx:150
 TPrincipal.cxx:151
 TPrincipal.cxx:152
 TPrincipal.cxx:153
 TPrincipal.cxx:154
 TPrincipal.cxx:155
 TPrincipal.cxx:156
 TPrincipal.cxx:157
 TPrincipal.cxx:158
 TPrincipal.cxx:159
 TPrincipal.cxx:160
 TPrincipal.cxx:161
 TPrincipal.cxx:162
 TPrincipal.cxx:163
 TPrincipal.cxx:164
 TPrincipal.cxx:165
 TPrincipal.cxx:166
 TPrincipal.cxx:167
 TPrincipal.cxx:168
 TPrincipal.cxx:169
 TPrincipal.cxx:170
 TPrincipal.cxx:171
 TPrincipal.cxx:172
 TPrincipal.cxx:173
 TPrincipal.cxx:174
 TPrincipal.cxx:175
 TPrincipal.cxx:176
 TPrincipal.cxx:177
 TPrincipal.cxx:178
 TPrincipal.cxx:179
 TPrincipal.cxx:180
 TPrincipal.cxx:181
 TPrincipal.cxx:182
 TPrincipal.cxx:183
 TPrincipal.cxx:184
 TPrincipal.cxx:185
 TPrincipal.cxx:186
 TPrincipal.cxx:187
 TPrincipal.cxx:188
 TPrincipal.cxx:189
 TPrincipal.cxx:190
 TPrincipal.cxx:191
 TPrincipal.cxx:192
 TPrincipal.cxx:193
 TPrincipal.cxx:194
 TPrincipal.cxx:195
 TPrincipal.cxx:196
 TPrincipal.cxx:197
 TPrincipal.cxx:198
 TPrincipal.cxx:199
 TPrincipal.cxx:200
 TPrincipal.cxx:201
 TPrincipal.cxx:202
 TPrincipal.cxx:203
 TPrincipal.cxx:204
 TPrincipal.cxx:205
 TPrincipal.cxx:206
 TPrincipal.cxx:207
 TPrincipal.cxx:208
 TPrincipal.cxx:209
 TPrincipal.cxx:210
 TPrincipal.cxx:211
 TPrincipal.cxx:212
 TPrincipal.cxx:213
 TPrincipal.cxx:214
 TPrincipal.cxx:215
 TPrincipal.cxx:216
 TPrincipal.cxx:217
 TPrincipal.cxx:218
 TPrincipal.cxx:219
 TPrincipal.cxx:220
 TPrincipal.cxx:221
 TPrincipal.cxx:222
 TPrincipal.cxx:223
 TPrincipal.cxx:224
 TPrincipal.cxx:225
 TPrincipal.cxx:226
 TPrincipal.cxx:227
 TPrincipal.cxx:228
 TPrincipal.cxx:229
 TPrincipal.cxx:230
 TPrincipal.cxx:231
 TPrincipal.cxx:232
 TPrincipal.cxx:233
 TPrincipal.cxx:234
 TPrincipal.cxx:235
 TPrincipal.cxx:236
 TPrincipal.cxx:237
 TPrincipal.cxx:238
 TPrincipal.cxx:239
 TPrincipal.cxx:240
 TPrincipal.cxx:241
 TPrincipal.cxx:242
 TPrincipal.cxx:243
 TPrincipal.cxx:244
 TPrincipal.cxx:245
 TPrincipal.cxx:246
 TPrincipal.cxx:247
 TPrincipal.cxx:248
 TPrincipal.cxx:249
 TPrincipal.cxx:250
 TPrincipal.cxx:251
 TPrincipal.cxx:252
 TPrincipal.cxx:253
 TPrincipal.cxx:254
 TPrincipal.cxx:255
 TPrincipal.cxx:256
 TPrincipal.cxx:257
 TPrincipal.cxx:258
 TPrincipal.cxx:259
 TPrincipal.cxx:260
 TPrincipal.cxx:261
 TPrincipal.cxx:262
 TPrincipal.cxx:263
 TPrincipal.cxx:264
 TPrincipal.cxx:265
 TPrincipal.cxx:266
 TPrincipal.cxx:267
 TPrincipal.cxx:268
 TPrincipal.cxx:269
 TPrincipal.cxx:270
 TPrincipal.cxx:271
 TPrincipal.cxx:272
 TPrincipal.cxx:273
 TPrincipal.cxx:274
 TPrincipal.cxx:275
 TPrincipal.cxx:276
 TPrincipal.cxx:277
 TPrincipal.cxx:278
 TPrincipal.cxx:279
 TPrincipal.cxx:280
 TPrincipal.cxx:281
 TPrincipal.cxx:282
 TPrincipal.cxx:283
 TPrincipal.cxx:284
 TPrincipal.cxx:285
 TPrincipal.cxx:286
 TPrincipal.cxx:287
 TPrincipal.cxx:288
 TPrincipal.cxx:289
 TPrincipal.cxx:290
 TPrincipal.cxx:291
 TPrincipal.cxx:292
 TPrincipal.cxx:293
 TPrincipal.cxx:294
 TPrincipal.cxx:295
 TPrincipal.cxx:296
 TPrincipal.cxx:297
 TPrincipal.cxx:298
 TPrincipal.cxx:299
 TPrincipal.cxx:300
 TPrincipal.cxx:301
 TPrincipal.cxx:302
 TPrincipal.cxx:303
 TPrincipal.cxx:304
 TPrincipal.cxx:305
 TPrincipal.cxx:306
 TPrincipal.cxx:307
 TPrincipal.cxx:308
 TPrincipal.cxx:309
 TPrincipal.cxx:310
 TPrincipal.cxx:311
 TPrincipal.cxx:312
 TPrincipal.cxx:313
 TPrincipal.cxx:314
 TPrincipal.cxx:315
 TPrincipal.cxx:316
 TPrincipal.cxx:317
 TPrincipal.cxx:318
 TPrincipal.cxx:319
 TPrincipal.cxx:320
 TPrincipal.cxx:321
 TPrincipal.cxx:322
 TPrincipal.cxx:323
 TPrincipal.cxx:324
 TPrincipal.cxx:325
 TPrincipal.cxx:326
 TPrincipal.cxx:327
 TPrincipal.cxx:328
 TPrincipal.cxx:329
 TPrincipal.cxx:330
 TPrincipal.cxx:331
 TPrincipal.cxx:332
 TPrincipal.cxx:333
 TPrincipal.cxx:334
 TPrincipal.cxx:335
 TPrincipal.cxx:336
 TPrincipal.cxx:337
 TPrincipal.cxx:338
 TPrincipal.cxx:339
 TPrincipal.cxx:340
 TPrincipal.cxx:341
 TPrincipal.cxx:342
 TPrincipal.cxx:343
 TPrincipal.cxx:344
 TPrincipal.cxx:345
 TPrincipal.cxx:346
 TPrincipal.cxx:347
 TPrincipal.cxx:348
 TPrincipal.cxx:349
 TPrincipal.cxx:350
 TPrincipal.cxx:351
 TPrincipal.cxx:352
 TPrincipal.cxx:353
 TPrincipal.cxx:354
 TPrincipal.cxx:355
 TPrincipal.cxx:356
 TPrincipal.cxx:357
 TPrincipal.cxx:358
 TPrincipal.cxx:359
 TPrincipal.cxx:360
 TPrincipal.cxx:361
 TPrincipal.cxx:362
 TPrincipal.cxx:363
 TPrincipal.cxx:364
 TPrincipal.cxx:365
 TPrincipal.cxx:366
 TPrincipal.cxx:367
 TPrincipal.cxx:368
 TPrincipal.cxx:369
 TPrincipal.cxx:370
 TPrincipal.cxx:371
 TPrincipal.cxx:372
 TPrincipal.cxx:373
 TPrincipal.cxx:374
 TPrincipal.cxx:375
 TPrincipal.cxx:376
 TPrincipal.cxx:377
 TPrincipal.cxx:378
 TPrincipal.cxx:379
 TPrincipal.cxx:380
 TPrincipal.cxx:381
 TPrincipal.cxx:382
 TPrincipal.cxx:383
 TPrincipal.cxx:384
 TPrincipal.cxx:385
 TPrincipal.cxx:386
 TPrincipal.cxx:387
 TPrincipal.cxx:388
 TPrincipal.cxx:389
 TPrincipal.cxx:390
 TPrincipal.cxx:391
 TPrincipal.cxx:392
 TPrincipal.cxx:393
 TPrincipal.cxx:394
 TPrincipal.cxx:395
 TPrincipal.cxx:396
 TPrincipal.cxx:397
 TPrincipal.cxx:398
 TPrincipal.cxx:399
 TPrincipal.cxx:400
 TPrincipal.cxx:401
 TPrincipal.cxx:402
 TPrincipal.cxx:403
 TPrincipal.cxx:404
 TPrincipal.cxx:405
 TPrincipal.cxx:406
 TPrincipal.cxx:407
 TPrincipal.cxx:408
 TPrincipal.cxx:409
 TPrincipal.cxx:410
 TPrincipal.cxx:411
 TPrincipal.cxx:412
 TPrincipal.cxx:413
 TPrincipal.cxx:414
 TPrincipal.cxx:415
 TPrincipal.cxx:416
 TPrincipal.cxx:417
 TPrincipal.cxx:418
 TPrincipal.cxx:419
 TPrincipal.cxx:420
 TPrincipal.cxx:421
 TPrincipal.cxx:422
 TPrincipal.cxx:423
 TPrincipal.cxx:424
 TPrincipal.cxx:425
 TPrincipal.cxx:426
 TPrincipal.cxx:427
 TPrincipal.cxx:428
 TPrincipal.cxx:429
 TPrincipal.cxx:430
 TPrincipal.cxx:431
 TPrincipal.cxx:432
 TPrincipal.cxx:433
 TPrincipal.cxx:434
 TPrincipal.cxx:435
 TPrincipal.cxx:436
 TPrincipal.cxx:437
 TPrincipal.cxx:438
 TPrincipal.cxx:439
 TPrincipal.cxx:440
 TPrincipal.cxx:441
 TPrincipal.cxx:442
 TPrincipal.cxx:443
 TPrincipal.cxx:444
 TPrincipal.cxx:445
 TPrincipal.cxx:446
 TPrincipal.cxx:447
 TPrincipal.cxx:448
 TPrincipal.cxx:449
 TPrincipal.cxx:450
 TPrincipal.cxx:451
 TPrincipal.cxx:452
 TPrincipal.cxx:453
 TPrincipal.cxx:454
 TPrincipal.cxx:455
 TPrincipal.cxx:456
 TPrincipal.cxx:457
 TPrincipal.cxx:458
 TPrincipal.cxx:459
 TPrincipal.cxx:460
 TPrincipal.cxx:461
 TPrincipal.cxx:462
 TPrincipal.cxx:463
 TPrincipal.cxx:464
 TPrincipal.cxx:465
 TPrincipal.cxx:466
 TPrincipal.cxx:467
 TPrincipal.cxx:468
 TPrincipal.cxx:469
 TPrincipal.cxx:470
 TPrincipal.cxx:471
 TPrincipal.cxx:472
 TPrincipal.cxx:473
 TPrincipal.cxx:474
 TPrincipal.cxx:475
 TPrincipal.cxx:476
 TPrincipal.cxx:477
 TPrincipal.cxx:478
 TPrincipal.cxx:479
 TPrincipal.cxx:480
 TPrincipal.cxx:481
 TPrincipal.cxx:482
 TPrincipal.cxx:483
 TPrincipal.cxx:484
 TPrincipal.cxx:485
 TPrincipal.cxx:486
 TPrincipal.cxx:487
 TPrincipal.cxx:488
 TPrincipal.cxx:489
 TPrincipal.cxx:490
 TPrincipal.cxx:491
 TPrincipal.cxx:492
 TPrincipal.cxx:493
 TPrincipal.cxx:494
 TPrincipal.cxx:495
 TPrincipal.cxx:496
 TPrincipal.cxx:497
 TPrincipal.cxx:498
 TPrincipal.cxx:499
 TPrincipal.cxx:500
 TPrincipal.cxx:501
 TPrincipal.cxx:502
 TPrincipal.cxx:503
 TPrincipal.cxx:504
 TPrincipal.cxx:505
 TPrincipal.cxx:506
 TPrincipal.cxx:507
 TPrincipal.cxx:508
 TPrincipal.cxx:509
 TPrincipal.cxx:510
 TPrincipal.cxx:511
 TPrincipal.cxx:512
 TPrincipal.cxx:513
 TPrincipal.cxx:514
 TPrincipal.cxx:515
 TPrincipal.cxx:516
 TPrincipal.cxx:517
 TPrincipal.cxx:518
 TPrincipal.cxx:519
 TPrincipal.cxx:520
 TPrincipal.cxx:521
 TPrincipal.cxx:522
 TPrincipal.cxx:523
 TPrincipal.cxx:524
 TPrincipal.cxx:525
 TPrincipal.cxx:526
 TPrincipal.cxx:527
 TPrincipal.cxx:528
 TPrincipal.cxx:529
 TPrincipal.cxx:530
 TPrincipal.cxx:531
 TPrincipal.cxx:532
 TPrincipal.cxx:533
 TPrincipal.cxx:534
 TPrincipal.cxx:535
 TPrincipal.cxx:536
 TPrincipal.cxx:537
 TPrincipal.cxx:538
 TPrincipal.cxx:539
 TPrincipal.cxx:540
 TPrincipal.cxx:541
 TPrincipal.cxx:542
 TPrincipal.cxx:543
 TPrincipal.cxx:544
 TPrincipal.cxx:545
 TPrincipal.cxx:546
 TPrincipal.cxx:547
 TPrincipal.cxx:548
 TPrincipal.cxx:549
 TPrincipal.cxx:550
 TPrincipal.cxx:551
 TPrincipal.cxx:552
 TPrincipal.cxx:553
 TPrincipal.cxx:554
 TPrincipal.cxx:555
 TPrincipal.cxx:556
 TPrincipal.cxx:557
 TPrincipal.cxx:558
 TPrincipal.cxx:559
 TPrincipal.cxx:560
 TPrincipal.cxx:561
 TPrincipal.cxx:562
 TPrincipal.cxx:563
 TPrincipal.cxx:564
 TPrincipal.cxx:565
 TPrincipal.cxx:566
 TPrincipal.cxx:567
 TPrincipal.cxx:568
 TPrincipal.cxx:569
 TPrincipal.cxx:570
 TPrincipal.cxx:571
 TPrincipal.cxx:572
 TPrincipal.cxx:573
 TPrincipal.cxx:574
 TPrincipal.cxx:575
 TPrincipal.cxx:576
 TPrincipal.cxx:577
 TPrincipal.cxx:578
 TPrincipal.cxx:579
 TPrincipal.cxx:580
 TPrincipal.cxx:581
 TPrincipal.cxx:582
 TPrincipal.cxx:583
 TPrincipal.cxx:584
 TPrincipal.cxx:585
 TPrincipal.cxx:586
 TPrincipal.cxx:587
 TPrincipal.cxx:588
 TPrincipal.cxx:589
 TPrincipal.cxx:590
 TPrincipal.cxx:591
 TPrincipal.cxx:592
 TPrincipal.cxx:593
 TPrincipal.cxx:594
 TPrincipal.cxx:595
 TPrincipal.cxx:596
 TPrincipal.cxx:597
 TPrincipal.cxx:598
 TPrincipal.cxx:599
 TPrincipal.cxx:600
 TPrincipal.cxx:601
 TPrincipal.cxx:602
 TPrincipal.cxx:603
 TPrincipal.cxx:604
 TPrincipal.cxx:605
 TPrincipal.cxx:606
 TPrincipal.cxx:607
 TPrincipal.cxx:608
 TPrincipal.cxx:609
 TPrincipal.cxx:610
 TPrincipal.cxx:611
 TPrincipal.cxx:612
 TPrincipal.cxx:613
 TPrincipal.cxx:614
 TPrincipal.cxx:615
 TPrincipal.cxx:616
 TPrincipal.cxx:617
 TPrincipal.cxx:618
 TPrincipal.cxx:619
 TPrincipal.cxx:620
 TPrincipal.cxx:621
 TPrincipal.cxx:622
 TPrincipal.cxx:623
 TPrincipal.cxx:624
 TPrincipal.cxx:625
 TPrincipal.cxx:626
 TPrincipal.cxx:627
 TPrincipal.cxx:628
 TPrincipal.cxx:629
 TPrincipal.cxx:630
 TPrincipal.cxx:631
 TPrincipal.cxx:632
 TPrincipal.cxx:633
 TPrincipal.cxx:634
 TPrincipal.cxx:635
 TPrincipal.cxx:636
 TPrincipal.cxx:637
 TPrincipal.cxx:638
 TPrincipal.cxx:639
 TPrincipal.cxx:640
 TPrincipal.cxx:641
 TPrincipal.cxx:642
 TPrincipal.cxx:643
 TPrincipal.cxx:644
 TPrincipal.cxx:645
 TPrincipal.cxx:646
 TPrincipal.cxx:647
 TPrincipal.cxx:648
 TPrincipal.cxx:649
 TPrincipal.cxx:650
 TPrincipal.cxx:651
 TPrincipal.cxx:652
 TPrincipal.cxx:653
 TPrincipal.cxx:654
 TPrincipal.cxx:655
 TPrincipal.cxx:656
 TPrincipal.cxx:657
 TPrincipal.cxx:658
 TPrincipal.cxx:659
 TPrincipal.cxx:660
 TPrincipal.cxx:661
 TPrincipal.cxx:662
 TPrincipal.cxx:663
 TPrincipal.cxx:664
 TPrincipal.cxx:665
 TPrincipal.cxx:666
 TPrincipal.cxx:667
 TPrincipal.cxx:668
 TPrincipal.cxx:669
 TPrincipal.cxx:670
 TPrincipal.cxx:671
 TPrincipal.cxx:672
 TPrincipal.cxx:673
 TPrincipal.cxx:674
 TPrincipal.cxx:675
 TPrincipal.cxx:676
 TPrincipal.cxx:677
 TPrincipal.cxx:678
 TPrincipal.cxx:679
 TPrincipal.cxx:680
 TPrincipal.cxx:681
 TPrincipal.cxx:682
 TPrincipal.cxx:683
 TPrincipal.cxx:684
 TPrincipal.cxx:685
 TPrincipal.cxx:686
 TPrincipal.cxx:687
 TPrincipal.cxx:688
 TPrincipal.cxx:689
 TPrincipal.cxx:690
 TPrincipal.cxx:691
 TPrincipal.cxx:692
 TPrincipal.cxx:693
 TPrincipal.cxx:694
 TPrincipal.cxx:695
 TPrincipal.cxx:696
 TPrincipal.cxx:697
 TPrincipal.cxx:698
 TPrincipal.cxx:699
 TPrincipal.cxx:700
 TPrincipal.cxx:701
 TPrincipal.cxx:702
 TPrincipal.cxx:703
 TPrincipal.cxx:704
 TPrincipal.cxx:705
 TPrincipal.cxx:706
 TPrincipal.cxx:707
 TPrincipal.cxx:708
 TPrincipal.cxx:709
 TPrincipal.cxx:710
 TPrincipal.cxx:711
 TPrincipal.cxx:712
 TPrincipal.cxx:713
 TPrincipal.cxx:714
 TPrincipal.cxx:715
 TPrincipal.cxx:716
 TPrincipal.cxx:717
 TPrincipal.cxx:718
 TPrincipal.cxx:719
 TPrincipal.cxx:720
 TPrincipal.cxx:721
 TPrincipal.cxx:722
 TPrincipal.cxx:723
 TPrincipal.cxx:724
 TPrincipal.cxx:725
 TPrincipal.cxx:726
 TPrincipal.cxx:727
 TPrincipal.cxx:728
 TPrincipal.cxx:729
 TPrincipal.cxx:730
 TPrincipal.cxx:731
 TPrincipal.cxx:732
 TPrincipal.cxx:733
 TPrincipal.cxx:734
 TPrincipal.cxx:735
 TPrincipal.cxx:736
 TPrincipal.cxx:737
 TPrincipal.cxx:738
 TPrincipal.cxx:739
 TPrincipal.cxx:740
 TPrincipal.cxx:741
 TPrincipal.cxx:742
 TPrincipal.cxx:743
 TPrincipal.cxx:744
 TPrincipal.cxx:745
 TPrincipal.cxx:746
 TPrincipal.cxx:747
 TPrincipal.cxx:748
 TPrincipal.cxx:749
 TPrincipal.cxx:750
 TPrincipal.cxx:751
 TPrincipal.cxx:752
 TPrincipal.cxx:753
 TPrincipal.cxx:754
 TPrincipal.cxx:755
 TPrincipal.cxx:756
 TPrincipal.cxx:757
 TPrincipal.cxx:758
 TPrincipal.cxx:759
 TPrincipal.cxx:760
 TPrincipal.cxx:761
 TPrincipal.cxx:762
 TPrincipal.cxx:763
 TPrincipal.cxx:764
 TPrincipal.cxx:765
 TPrincipal.cxx:766
 TPrincipal.cxx:767
 TPrincipal.cxx:768
 TPrincipal.cxx:769
 TPrincipal.cxx:770
 TPrincipal.cxx:771
 TPrincipal.cxx:772
 TPrincipal.cxx:773
 TPrincipal.cxx:774
 TPrincipal.cxx:775
 TPrincipal.cxx:776
 TPrincipal.cxx:777
 TPrincipal.cxx:778
 TPrincipal.cxx:779
 TPrincipal.cxx:780
 TPrincipal.cxx:781
 TPrincipal.cxx:782
 TPrincipal.cxx:783
 TPrincipal.cxx:784
 TPrincipal.cxx:785
 TPrincipal.cxx:786
 TPrincipal.cxx:787
 TPrincipal.cxx:788
 TPrincipal.cxx:789
 TPrincipal.cxx:790
 TPrincipal.cxx:791
 TPrincipal.cxx:792
 TPrincipal.cxx:793
 TPrincipal.cxx:794
 TPrincipal.cxx:795
 TPrincipal.cxx:796
 TPrincipal.cxx:797
 TPrincipal.cxx:798
 TPrincipal.cxx:799
 TPrincipal.cxx:800
 TPrincipal.cxx:801
 TPrincipal.cxx:802
 TPrincipal.cxx:803
 TPrincipal.cxx:804
 TPrincipal.cxx:805
 TPrincipal.cxx:806
 TPrincipal.cxx:807
 TPrincipal.cxx:808
 TPrincipal.cxx:809
 TPrincipal.cxx:810
 TPrincipal.cxx:811
 TPrincipal.cxx:812
 TPrincipal.cxx:813
 TPrincipal.cxx:814
 TPrincipal.cxx:815
 TPrincipal.cxx:816
 TPrincipal.cxx:817
 TPrincipal.cxx:818
 TPrincipal.cxx:819
 TPrincipal.cxx:820
 TPrincipal.cxx:821
 TPrincipal.cxx:822
 TPrincipal.cxx:823
 TPrincipal.cxx:824
 TPrincipal.cxx:825
 TPrincipal.cxx:826
 TPrincipal.cxx:827
 TPrincipal.cxx:828
 TPrincipal.cxx:829
 TPrincipal.cxx:830
 TPrincipal.cxx:831
 TPrincipal.cxx:832
 TPrincipal.cxx:833
 TPrincipal.cxx:834
 TPrincipal.cxx:835
 TPrincipal.cxx:836
 TPrincipal.cxx:837
 TPrincipal.cxx:838
 TPrincipal.cxx:839
 TPrincipal.cxx:840
 TPrincipal.cxx:841
 TPrincipal.cxx:842
 TPrincipal.cxx:843
 TPrincipal.cxx:844
 TPrincipal.cxx:845
 TPrincipal.cxx:846
 TPrincipal.cxx:847
 TPrincipal.cxx:848
 TPrincipal.cxx:849
 TPrincipal.cxx:850
 TPrincipal.cxx:851
 TPrincipal.cxx:852
 TPrincipal.cxx:853
 TPrincipal.cxx:854
 TPrincipal.cxx:855
 TPrincipal.cxx:856
 TPrincipal.cxx:857
 TPrincipal.cxx:858
 TPrincipal.cxx:859
 TPrincipal.cxx:860
 TPrincipal.cxx:861
 TPrincipal.cxx:862
 TPrincipal.cxx:863
 TPrincipal.cxx:864
 TPrincipal.cxx:865
 TPrincipal.cxx:866
 TPrincipal.cxx:867
 TPrincipal.cxx:868
 TPrincipal.cxx:869
 TPrincipal.cxx:870
 TPrincipal.cxx:871
 TPrincipal.cxx:872
 TPrincipal.cxx:873
 TPrincipal.cxx:874
 TPrincipal.cxx:875
 TPrincipal.cxx:876
 TPrincipal.cxx:877
 TPrincipal.cxx:878
 TPrincipal.cxx:879
 TPrincipal.cxx:880
 TPrincipal.cxx:881
 TPrincipal.cxx:882
 TPrincipal.cxx:883
 TPrincipal.cxx:884
 TPrincipal.cxx:885
 TPrincipal.cxx:886
 TPrincipal.cxx:887
 TPrincipal.cxx:888
 TPrincipal.cxx:889
 TPrincipal.cxx:890
 TPrincipal.cxx:891
 TPrincipal.cxx:892
 TPrincipal.cxx:893
 TPrincipal.cxx:894
 TPrincipal.cxx:895
 TPrincipal.cxx:896
 TPrincipal.cxx:897
 TPrincipal.cxx:898
 TPrincipal.cxx:899
 TPrincipal.cxx:900
 TPrincipal.cxx:901
 TPrincipal.cxx:902
 TPrincipal.cxx:903
 TPrincipal.cxx:904
 TPrincipal.cxx:905
 TPrincipal.cxx:906
 TPrincipal.cxx:907
 TPrincipal.cxx:908
 TPrincipal.cxx:909
 TPrincipal.cxx:910
 TPrincipal.cxx:911
 TPrincipal.cxx:912
 TPrincipal.cxx:913
 TPrincipal.cxx:914
 TPrincipal.cxx:915
 TPrincipal.cxx:916
 TPrincipal.cxx:917
 TPrincipal.cxx:918
 TPrincipal.cxx:919
 TPrincipal.cxx:920
 TPrincipal.cxx:921
 TPrincipal.cxx:922
 TPrincipal.cxx:923
 TPrincipal.cxx:924
 TPrincipal.cxx:925
 TPrincipal.cxx:926
 TPrincipal.cxx:927
 TPrincipal.cxx:928
 TPrincipal.cxx:929
 TPrincipal.cxx:930
 TPrincipal.cxx:931
 TPrincipal.cxx:932
 TPrincipal.cxx:933
 TPrincipal.cxx:934
 TPrincipal.cxx:935
 TPrincipal.cxx:936
 TPrincipal.cxx:937
 TPrincipal.cxx:938
 TPrincipal.cxx:939
 TPrincipal.cxx:940
 TPrincipal.cxx:941
 TPrincipal.cxx:942
 TPrincipal.cxx:943
 TPrincipal.cxx:944
 TPrincipal.cxx:945
 TPrincipal.cxx:946
 TPrincipal.cxx:947
 TPrincipal.cxx:948
 TPrincipal.cxx:949
 TPrincipal.cxx:950
 TPrincipal.cxx:951
 TPrincipal.cxx:952
 TPrincipal.cxx:953
 TPrincipal.cxx:954
 TPrincipal.cxx:955
 TPrincipal.cxx:956
 TPrincipal.cxx:957
 TPrincipal.cxx:958
 TPrincipal.cxx:959
 TPrincipal.cxx:960
 TPrincipal.cxx:961
 TPrincipal.cxx:962
 TPrincipal.cxx:963
 TPrincipal.cxx:964
 TPrincipal.cxx:965
 TPrincipal.cxx:966
 TPrincipal.cxx:967
 TPrincipal.cxx:968
 TPrincipal.cxx:969
 TPrincipal.cxx:970
 TPrincipal.cxx:971
 TPrincipal.cxx:972
 TPrincipal.cxx:973
 TPrincipal.cxx:974
 TPrincipal.cxx:975
 TPrincipal.cxx:976
 TPrincipal.cxx:977
 TPrincipal.cxx:978
 TPrincipal.cxx:979
 TPrincipal.cxx:980
 TPrincipal.cxx:981
 TPrincipal.cxx:982
 TPrincipal.cxx:983
 TPrincipal.cxx:984
 TPrincipal.cxx:985
 TPrincipal.cxx:986
 TPrincipal.cxx:987
 TPrincipal.cxx:988
 TPrincipal.cxx:989
 TPrincipal.cxx:990
 TPrincipal.cxx:991
 TPrincipal.cxx:992
 TPrincipal.cxx:993
 TPrincipal.cxx:994
 TPrincipal.cxx:995
 TPrincipal.cxx:996
 TPrincipal.cxx:997
 TPrincipal.cxx:998
 TPrincipal.cxx:999
 TPrincipal.cxx:1000
 TPrincipal.cxx:1001
 TPrincipal.cxx:1002
 TPrincipal.cxx:1003
 TPrincipal.cxx:1004
 TPrincipal.cxx:1005
 TPrincipal.cxx:1006
 TPrincipal.cxx:1007
 TPrincipal.cxx:1008
 TPrincipal.cxx:1009
 TPrincipal.cxx:1010
 TPrincipal.cxx:1011
 TPrincipal.cxx:1012
 TPrincipal.cxx:1013
 TPrincipal.cxx:1014
 TPrincipal.cxx:1015
 TPrincipal.cxx:1016
 TPrincipal.cxx:1017
 TPrincipal.cxx:1018
 TPrincipal.cxx:1019
 TPrincipal.cxx:1020
 TPrincipal.cxx:1021
 TPrincipal.cxx:1022
 TPrincipal.cxx:1023
 TPrincipal.cxx:1024
 TPrincipal.cxx:1025
 TPrincipal.cxx:1026
 TPrincipal.cxx:1027
 TPrincipal.cxx:1028
 TPrincipal.cxx:1029
 TPrincipal.cxx:1030
 TPrincipal.cxx:1031
 TPrincipal.cxx:1032
 TPrincipal.cxx:1033
 TPrincipal.cxx:1034
 TPrincipal.cxx:1035
 TPrincipal.cxx:1036
 TPrincipal.cxx:1037
 TPrincipal.cxx:1038
 TPrincipal.cxx:1039
 TPrincipal.cxx:1040
 TPrincipal.cxx:1041
 TPrincipal.cxx:1042
 TPrincipal.cxx:1043
 TPrincipal.cxx:1044
 TPrincipal.cxx:1045
 TPrincipal.cxx:1046
 TPrincipal.cxx:1047
 TPrincipal.cxx:1048
 TPrincipal.cxx:1049
 TPrincipal.cxx:1050
 TPrincipal.cxx:1051
 TPrincipal.cxx:1052
 TPrincipal.cxx:1053
 TPrincipal.cxx:1054
 TPrincipal.cxx:1055
 TPrincipal.cxx:1056
 TPrincipal.cxx:1057
 TPrincipal.cxx:1058
 TPrincipal.cxx:1059
 TPrincipal.cxx:1060
 TPrincipal.cxx:1061
 TPrincipal.cxx:1062
 TPrincipal.cxx:1063
 TPrincipal.cxx:1064
 TPrincipal.cxx:1065
 TPrincipal.cxx:1066
 TPrincipal.cxx:1067
 TPrincipal.cxx:1068
 TPrincipal.cxx:1069
 TPrincipal.cxx:1070
 TPrincipal.cxx:1071
 TPrincipal.cxx:1072
 TPrincipal.cxx:1073
 TPrincipal.cxx:1074
 TPrincipal.cxx:1075
 TPrincipal.cxx:1076
 TPrincipal.cxx:1077
 TPrincipal.cxx:1078
 TPrincipal.cxx:1079
 TPrincipal.cxx:1080
 TPrincipal.cxx:1081
 TPrincipal.cxx:1082
 TPrincipal.cxx:1083
 TPrincipal.cxx:1084
 TPrincipal.cxx:1085
 TPrincipal.cxx:1086
 TPrincipal.cxx:1087
 TPrincipal.cxx:1088
 TPrincipal.cxx:1089
 TPrincipal.cxx:1090
 TPrincipal.cxx:1091
 TPrincipal.cxx:1092
 TPrincipal.cxx:1093
 TPrincipal.cxx:1094
 TPrincipal.cxx:1095
 TPrincipal.cxx:1096
 TPrincipal.cxx:1097
 TPrincipal.cxx:1098
 TPrincipal.cxx:1099
 TPrincipal.cxx:1100
 TPrincipal.cxx:1101
 TPrincipal.cxx:1102
 TPrincipal.cxx:1103
 TPrincipal.cxx:1104
 TPrincipal.cxx:1105
 TPrincipal.cxx:1106
 TPrincipal.cxx:1107
 TPrincipal.cxx:1108
 TPrincipal.cxx:1109
 TPrincipal.cxx:1110
 TPrincipal.cxx:1111
 TPrincipal.cxx:1112
 TPrincipal.cxx:1113
 TPrincipal.cxx:1114
 TPrincipal.cxx:1115
 TPrincipal.cxx:1116
 TPrincipal.cxx:1117
 TPrincipal.cxx:1118
 TPrincipal.cxx:1119
 TPrincipal.cxx:1120
 TPrincipal.cxx:1121
 TPrincipal.cxx:1122
 TPrincipal.cxx:1123
 TPrincipal.cxx:1124
 TPrincipal.cxx:1125
 TPrincipal.cxx:1126
 TPrincipal.cxx:1127
 TPrincipal.cxx:1128
 TPrincipal.cxx:1129
 TPrincipal.cxx:1130
 TPrincipal.cxx:1131
 TPrincipal.cxx:1132
 TPrincipal.cxx:1133
 TPrincipal.cxx:1134
 TPrincipal.cxx:1135
 TPrincipal.cxx:1136
 TPrincipal.cxx:1137
 TPrincipal.cxx:1138
 TPrincipal.cxx:1139
 TPrincipal.cxx:1140
 TPrincipal.cxx:1141
 TPrincipal.cxx:1142
 TPrincipal.cxx:1143
 TPrincipal.cxx:1144
 TPrincipal.cxx:1145
 TPrincipal.cxx:1146
 TPrincipal.cxx:1147
 TPrincipal.cxx:1148
 TPrincipal.cxx:1149
 TPrincipal.cxx:1150
 TPrincipal.cxx:1151
 TPrincipal.cxx:1152
 TPrincipal.cxx:1153
 TPrincipal.cxx:1154
 TPrincipal.cxx:1155
 TPrincipal.cxx:1156
 TPrincipal.cxx:1157
 TPrincipal.cxx:1158
 TPrincipal.cxx:1159
 TPrincipal.cxx:1160
 TPrincipal.cxx:1161
 TPrincipal.cxx:1162
 TPrincipal.cxx:1163
 TPrincipal.cxx:1164
 TPrincipal.cxx:1165
 TPrincipal.cxx:1166
 TPrincipal.cxx:1167
 TPrincipal.cxx:1168
 TPrincipal.cxx:1169
 TPrincipal.cxx:1170
 TPrincipal.cxx:1171
 TPrincipal.cxx:1172
 TPrincipal.cxx:1173
 TPrincipal.cxx:1174
 TPrincipal.cxx:1175
 TPrincipal.cxx:1176
 TPrincipal.cxx:1177
 TPrincipal.cxx:1178
 TPrincipal.cxx:1179
 TPrincipal.cxx:1180
 TPrincipal.cxx:1181
 TPrincipal.cxx:1182
 TPrincipal.cxx:1183
 TPrincipal.cxx:1184
 TPrincipal.cxx:1185
 TPrincipal.cxx:1186
 TPrincipal.cxx:1187
 TPrincipal.cxx:1188
 TPrincipal.cxx:1189
 TPrincipal.cxx:1190
 TPrincipal.cxx:1191
 TPrincipal.cxx:1192
 TPrincipal.cxx:1193
 TPrincipal.cxx:1194
 TPrincipal.cxx:1195
 TPrincipal.cxx:1196
 TPrincipal.cxx:1197
 TPrincipal.cxx:1198
 TPrincipal.cxx:1199
 TPrincipal.cxx:1200
 TPrincipal.cxx:1201
 TPrincipal.cxx:1202
 TPrincipal.cxx:1203
 TPrincipal.cxx:1204
 TPrincipal.cxx:1205
 TPrincipal.cxx:1206
 TPrincipal.cxx:1207
 TPrincipal.cxx:1208
 TPrincipal.cxx:1209
 TPrincipal.cxx:1210
 TPrincipal.cxx:1211
 TPrincipal.cxx:1212
 TPrincipal.cxx:1213
 TPrincipal.cxx:1214
 TPrincipal.cxx:1215
 TPrincipal.cxx:1216
 TPrincipal.cxx:1217
 TPrincipal.cxx:1218
 TPrincipal.cxx:1219
 TPrincipal.cxx:1220
 TPrincipal.cxx:1221
 TPrincipal.cxx:1222
 TPrincipal.cxx:1223
 TPrincipal.cxx:1224
 TPrincipal.cxx:1225
 TPrincipal.cxx:1226
 TPrincipal.cxx:1227
 TPrincipal.cxx:1228
 TPrincipal.cxx:1229
 TPrincipal.cxx:1230
 TPrincipal.cxx:1231
 TPrincipal.cxx:1232
 TPrincipal.cxx:1233
 TPrincipal.cxx:1234
 TPrincipal.cxx:1235
 TPrincipal.cxx:1236
 TPrincipal.cxx:1237
 TPrincipal.cxx:1238
 TPrincipal.cxx:1239
 TPrincipal.cxx:1240
 TPrincipal.cxx:1241
 TPrincipal.cxx:1242
 TPrincipal.cxx:1243
 TPrincipal.cxx:1244
 TPrincipal.cxx:1245
 TPrincipal.cxx:1246
 TPrincipal.cxx:1247
 TPrincipal.cxx:1248
 TPrincipal.cxx:1249
 TPrincipal.cxx:1250
 TPrincipal.cxx:1251
 TPrincipal.cxx:1252
 TPrincipal.cxx:1253
 TPrincipal.cxx:1254
 TPrincipal.cxx:1255
 TPrincipal.cxx:1256
 TPrincipal.cxx:1257
 TPrincipal.cxx:1258
 TPrincipal.cxx:1259
 TPrincipal.cxx:1260
 TPrincipal.cxx:1261
 TPrincipal.cxx:1262
 TPrincipal.cxx:1263
 TPrincipal.cxx:1264
 TPrincipal.cxx:1265
 TPrincipal.cxx:1266
 TPrincipal.cxx:1267
 TPrincipal.cxx:1268
 TPrincipal.cxx:1269
 TPrincipal.cxx:1270
 TPrincipal.cxx:1271
 TPrincipal.cxx:1272
 TPrincipal.cxx:1273
 TPrincipal.cxx:1274
 TPrincipal.cxx:1275
 TPrincipal.cxx:1276
 TPrincipal.cxx:1277
 TPrincipal.cxx:1278
 TPrincipal.cxx:1279
 TPrincipal.cxx:1280
 TPrincipal.cxx:1281
 TPrincipal.cxx:1282
 TPrincipal.cxx:1283
 TPrincipal.cxx:1284
 TPrincipal.cxx:1285
 TPrincipal.cxx:1286
 TPrincipal.cxx:1287
 TPrincipal.cxx:1288
 TPrincipal.cxx:1289
 TPrincipal.cxx:1290
 TPrincipal.cxx:1291
 TPrincipal.cxx:1292
 TPrincipal.cxx:1293
 TPrincipal.cxx:1294
 TPrincipal.cxx:1295
 TPrincipal.cxx:1296
 TPrincipal.cxx:1297
 TPrincipal.cxx:1298
 TPrincipal.cxx:1299
 TPrincipal.cxx:1300
 TPrincipal.cxx:1301
 TPrincipal.cxx:1302
 TPrincipal.cxx:1303
 TPrincipal.cxx:1304
 TPrincipal.cxx:1305
 TPrincipal.cxx:1306
 TPrincipal.cxx:1307
 TPrincipal.cxx:1308
 TPrincipal.cxx:1309
 TPrincipal.cxx:1310
 TPrincipal.cxx:1311
 TPrincipal.cxx:1312
 TPrincipal.cxx:1313
 TPrincipal.cxx:1314
 TPrincipal.cxx:1315
 TPrincipal.cxx:1316
 TPrincipal.cxx:1317
 TPrincipal.cxx:1318
 TPrincipal.cxx:1319
 TPrincipal.cxx:1320
 TPrincipal.cxx:1321
 TPrincipal.cxx:1322
 TPrincipal.cxx:1323
 TPrincipal.cxx:1324
 TPrincipal.cxx:1325
 TPrincipal.cxx:1326
 TPrincipal.cxx:1327
 TPrincipal.cxx:1328
 TPrincipal.cxx:1329
 TPrincipal.cxx:1330
 TPrincipal.cxx:1331
 TPrincipal.cxx:1332
 TPrincipal.cxx:1333
 TPrincipal.cxx:1334
 TPrincipal.cxx:1335
 TPrincipal.cxx:1336
 TPrincipal.cxx:1337
 TPrincipal.cxx:1338
 TPrincipal.cxx:1339
 TPrincipal.cxx:1340
 TPrincipal.cxx:1341
 TPrincipal.cxx:1342
 TPrincipal.cxx:1343
 TPrincipal.cxx:1344
 TPrincipal.cxx:1345
 TPrincipal.cxx:1346
 TPrincipal.cxx:1347
 TPrincipal.cxx:1348
 TPrincipal.cxx:1349
 TPrincipal.cxx:1350
 TPrincipal.cxx:1351
 TPrincipal.cxx:1352
 TPrincipal.cxx:1353
 TPrincipal.cxx:1354
 TPrincipal.cxx:1355
 TPrincipal.cxx:1356
 TPrincipal.cxx:1357
 TPrincipal.cxx:1358
 TPrincipal.cxx:1359
 TPrincipal.cxx:1360
 TPrincipal.cxx:1361
 TPrincipal.cxx:1362
 TPrincipal.cxx:1363
 TPrincipal.cxx:1364
 TPrincipal.cxx:1365
 TPrincipal.cxx:1366
 TPrincipal.cxx:1367
 TPrincipal.cxx:1368
 TPrincipal.cxx:1369
 TPrincipal.cxx:1370
 TPrincipal.cxx:1371
 TPrincipal.cxx:1372
 TPrincipal.cxx:1373
 TPrincipal.cxx:1374
 TPrincipal.cxx:1375
 TPrincipal.cxx:1376
 TPrincipal.cxx:1377
 TPrincipal.cxx:1378
 TPrincipal.cxx:1379
 TPrincipal.cxx:1380
 TPrincipal.cxx:1381
 TPrincipal.cxx:1382
 TPrincipal.cxx:1383
 TPrincipal.cxx:1384
 TPrincipal.cxx:1385
 TPrincipal.cxx:1386
 TPrincipal.cxx:1387
 TPrincipal.cxx:1388
 TPrincipal.cxx:1389
 TPrincipal.cxx:1390
 TPrincipal.cxx:1391
 TPrincipal.cxx:1392
 TPrincipal.cxx:1393
 TPrincipal.cxx:1394
 TPrincipal.cxx:1395
 TPrincipal.cxx:1396
 TPrincipal.cxx:1397
 TPrincipal.cxx:1398
 TPrincipal.cxx:1399
 TPrincipal.cxx:1400
 TPrincipal.cxx:1401
 TPrincipal.cxx:1402
 TPrincipal.cxx:1403
 TPrincipal.cxx:1404
 TPrincipal.cxx:1405
 TPrincipal.cxx:1406
 TPrincipal.cxx:1407
 TPrincipal.cxx:1408
 TPrincipal.cxx:1409
 TPrincipal.cxx:1410
 TPrincipal.cxx:1411
 TPrincipal.cxx:1412
 TPrincipal.cxx:1413
 TPrincipal.cxx:1414
 TPrincipal.cxx:1415
 TPrincipal.cxx:1416
 TPrincipal.cxx:1417
 TPrincipal.cxx:1418
 TPrincipal.cxx:1419
 TPrincipal.cxx:1420
 TPrincipal.cxx:1421
 TPrincipal.cxx:1422
 TPrincipal.cxx:1423
 TPrincipal.cxx:1424
 TPrincipal.cxx:1425
 TPrincipal.cxx:1426
 TPrincipal.cxx:1427
 TPrincipal.cxx:1428
 TPrincipal.cxx:1429
 TPrincipal.cxx:1430
 TPrincipal.cxx:1431
 TPrincipal.cxx:1432
 TPrincipal.cxx:1433
 TPrincipal.cxx:1434
 TPrincipal.cxx:1435
 TPrincipal.cxx:1436
 TPrincipal.cxx:1437
 TPrincipal.cxx:1438
 TPrincipal.cxx:1439
 TPrincipal.cxx:1440
 TPrincipal.cxx:1441
 TPrincipal.cxx:1442
 TPrincipal.cxx:1443
 TPrincipal.cxx:1444
 TPrincipal.cxx:1445
 TPrincipal.cxx:1446
 TPrincipal.cxx:1447
 TPrincipal.cxx:1448
 TPrincipal.cxx:1449
 TPrincipal.cxx:1450
 TPrincipal.cxx:1451
 TPrincipal.cxx:1452
 TPrincipal.cxx:1453
 TPrincipal.cxx:1454
 TPrincipal.cxx:1455
 TPrincipal.cxx:1456
 TPrincipal.cxx:1457
 TPrincipal.cxx:1458
 TPrincipal.cxx:1459
 TPrincipal.cxx:1460
 TPrincipal.cxx:1461
 TPrincipal.cxx:1462
 TPrincipal.cxx:1463
 TPrincipal.cxx:1464
 TPrincipal.cxx:1465
 TPrincipal.cxx:1466
 TPrincipal.cxx:1467
 TPrincipal.cxx:1468
 TPrincipal.cxx:1469
 TPrincipal.cxx:1470
 TPrincipal.cxx:1471
 TPrincipal.cxx:1472
 TPrincipal.cxx:1473
 TPrincipal.cxx:1474
 TPrincipal.cxx:1475
 TPrincipal.cxx:1476
 TPrincipal.cxx:1477
 TPrincipal.cxx:1478
 TPrincipal.cxx:1479
 TPrincipal.cxx:1480
 TPrincipal.cxx:1481
 TPrincipal.cxx:1482
 TPrincipal.cxx:1483
 TPrincipal.cxx:1484
 TPrincipal.cxx:1485
 TPrincipal.cxx:1486
 TPrincipal.cxx:1487
 TPrincipal.cxx:1488
 TPrincipal.cxx:1489
 TPrincipal.cxx:1490
 TPrincipal.cxx:1491
 TPrincipal.cxx:1492
 TPrincipal.cxx:1493
 TPrincipal.cxx:1494
 TPrincipal.cxx:1495
 TPrincipal.cxx:1496
 TPrincipal.cxx:1497
 TPrincipal.cxx:1498
 TPrincipal.cxx:1499
 TPrincipal.cxx:1500
 TPrincipal.cxx:1501
 TPrincipal.cxx:1502
 TPrincipal.cxx:1503
 TPrincipal.cxx:1504
 TPrincipal.cxx:1505
 TPrincipal.cxx:1506
 TPrincipal.cxx:1507
 TPrincipal.cxx:1508
 TPrincipal.cxx:1509
 TPrincipal.cxx:1510
 TPrincipal.cxx:1511
 TPrincipal.cxx:1512
 TPrincipal.cxx:1513
 TPrincipal.cxx:1514
 TPrincipal.cxx:1515
 TPrincipal.cxx:1516
 TPrincipal.cxx:1517
 TPrincipal.cxx:1518
 TPrincipal.cxx:1519
 TPrincipal.cxx:1520
 TPrincipal.cxx:1521
 TPrincipal.cxx:1522
 TPrincipal.cxx:1523
 TPrincipal.cxx:1524
 TPrincipal.cxx:1525
 TPrincipal.cxx:1526
 TPrincipal.cxx:1527
 TPrincipal.cxx:1528
 TPrincipal.cxx:1529
 TPrincipal.cxx:1530
 TPrincipal.cxx:1531
 TPrincipal.cxx:1532
 TPrincipal.cxx:1533
 TPrincipal.cxx:1534
 TPrincipal.cxx:1535
 TPrincipal.cxx:1536
 TPrincipal.cxx:1537
 TPrincipal.cxx:1538
 TPrincipal.cxx:1539
 TPrincipal.cxx:1540
 TPrincipal.cxx:1541
 TPrincipal.cxx:1542
 TPrincipal.cxx:1543
 TPrincipal.cxx:1544
 TPrincipal.cxx:1545
 TPrincipal.cxx:1546
 TPrincipal.cxx:1547
 TPrincipal.cxx:1548
 TPrincipal.cxx:1549
 TPrincipal.cxx:1550
 TPrincipal.cxx:1551
 TPrincipal.cxx:1552
 TPrincipal.cxx:1553
 TPrincipal.cxx:1554
 TPrincipal.cxx:1555
 TPrincipal.cxx:1556
 TPrincipal.cxx:1557
 TPrincipal.cxx:1558
 TPrincipal.cxx:1559
 TPrincipal.cxx:1560
 TPrincipal.cxx:1561
 TPrincipal.cxx:1562
 TPrincipal.cxx:1563
 TPrincipal.cxx:1564
 TPrincipal.cxx:1565
 TPrincipal.cxx:1566
 TPrincipal.cxx:1567
 TPrincipal.cxx:1568
 TPrincipal.cxx:1569
 TPrincipal.cxx:1570
 TPrincipal.cxx:1571
 TPrincipal.cxx:1572
 TPrincipal.cxx:1573
 TPrincipal.cxx:1574
 TPrincipal.cxx:1575
 TPrincipal.cxx:1576
 TPrincipal.cxx:1577
 TPrincipal.cxx:1578
 TPrincipal.cxx:1579
 TPrincipal.cxx:1580
 TPrincipal.cxx:1581
 TPrincipal.cxx:1582
 TPrincipal.cxx:1583
 TPrincipal.cxx:1584
 TPrincipal.cxx:1585
 TPrincipal.cxx:1586
 TPrincipal.cxx:1587
 TPrincipal.cxx:1588
 TPrincipal.cxx:1589
 TPrincipal.cxx:1590
 TPrincipal.cxx:1591
 TPrincipal.cxx:1592
 TPrincipal.cxx:1593
 TPrincipal.cxx:1594
 TPrincipal.cxx:1595
 TPrincipal.cxx:1596
 TPrincipal.cxx:1597
 TPrincipal.cxx:1598
 TPrincipal.cxx:1599
 TPrincipal.cxx:1600
 TPrincipal.cxx:1601
 TPrincipal.cxx:1602
 TPrincipal.cxx:1603
 TPrincipal.cxx:1604
 TPrincipal.cxx:1605
 TPrincipal.cxx:1606
 TPrincipal.cxx:1607
 TPrincipal.cxx:1608
 TPrincipal.cxx:1609
 TPrincipal.cxx:1610
 TPrincipal.cxx:1611
 TPrincipal.cxx:1612
 TPrincipal.cxx:1613
 TPrincipal.cxx:1614
 TPrincipal.cxx:1615
 TPrincipal.cxx:1616
 TPrincipal.cxx:1617
 TPrincipal.cxx:1618
 TPrincipal.cxx:1619
 TPrincipal.cxx:1620
 TPrincipal.cxx:1621
 TPrincipal.cxx:1622
 TPrincipal.cxx:1623
 TPrincipal.cxx:1624
 TPrincipal.cxx:1625
 TPrincipal.cxx:1626
 TPrincipal.cxx:1627
 TPrincipal.cxx:1628
 TPrincipal.cxx:1629
 TPrincipal.cxx:1630
 TPrincipal.cxx:1631
 TPrincipal.cxx:1632
 TPrincipal.cxx:1633
 TPrincipal.cxx:1634
 TPrincipal.cxx:1635
 TPrincipal.cxx:1636
 TPrincipal.cxx:1637
 TPrincipal.cxx:1638
 TPrincipal.cxx:1639
 TPrincipal.cxx:1640
 TPrincipal.cxx:1641
 TPrincipal.cxx:1642
 TPrincipal.cxx:1643
 TPrincipal.cxx:1644
 TPrincipal.cxx:1645
 TPrincipal.cxx:1646
 TPrincipal.cxx:1647
 TPrincipal.cxx:1648
 TPrincipal.cxx:1649
 TPrincipal.cxx:1650
 TPrincipal.cxx:1651
 TPrincipal.cxx:1652
 TPrincipal.cxx:1653
 TPrincipal.cxx:1654
 TPrincipal.cxx:1655
 TPrincipal.cxx:1656
 TPrincipal.cxx:1657
 TPrincipal.cxx:1658
 TPrincipal.cxx:1659
 TPrincipal.cxx:1660
 TPrincipal.cxx:1661
 TPrincipal.cxx:1662
 TPrincipal.cxx:1663
 TPrincipal.cxx:1664
 TPrincipal.cxx:1665
 TPrincipal.cxx:1666
 TPrincipal.cxx:1667
 TPrincipal.cxx:1668
 TPrincipal.cxx:1669
 TPrincipal.cxx:1670
 TPrincipal.cxx:1671
 TPrincipal.cxx:1672
 TPrincipal.cxx:1673
 TPrincipal.cxx:1674
 TPrincipal.cxx:1675
 TPrincipal.cxx:1676
 TPrincipal.cxx:1677
 TPrincipal.cxx:1678
 TPrincipal.cxx:1679
 TPrincipal.cxx:1680
 TPrincipal.cxx:1681
 TPrincipal.cxx:1682
 TPrincipal.cxx:1683
 TPrincipal.cxx:1684
 TPrincipal.cxx:1685
 TPrincipal.cxx:1686
 TPrincipal.cxx:1687
 TPrincipal.cxx:1688
 TPrincipal.cxx:1689
 TPrincipal.cxx:1690
 TPrincipal.cxx:1691
 TPrincipal.cxx:1692
 TPrincipal.cxx:1693
 TPrincipal.cxx:1694
 TPrincipal.cxx:1695
 TPrincipal.cxx:1696
 TPrincipal.cxx:1697
 TPrincipal.cxx:1698
 TPrincipal.cxx:1699
 TPrincipal.cxx:1700
 TPrincipal.cxx:1701
 TPrincipal.cxx:1702
 TPrincipal.cxx:1703
 TPrincipal.cxx:1704
 TPrincipal.cxx:1705
 TPrincipal.cxx:1706
 TPrincipal.cxx:1707
 TPrincipal.cxx:1708
 TPrincipal.cxx:1709
 TPrincipal.cxx:1710
 TPrincipal.cxx:1711
 TPrincipal.cxx:1712
 TPrincipal.cxx:1713
 TPrincipal.cxx:1714
 TPrincipal.cxx:1715
 TPrincipal.cxx:1716
 TPrincipal.cxx:1717
 TPrincipal.cxx:1718
 TPrincipal.cxx:1719
 TPrincipal.cxx:1720
 TPrincipal.cxx:1721
 TPrincipal.cxx:1722
 TPrincipal.cxx:1723
 TPrincipal.cxx:1724
 TPrincipal.cxx:1725
 TPrincipal.cxx:1726
 TPrincipal.cxx:1727
 TPrincipal.cxx:1728
 TPrincipal.cxx:1729
 TPrincipal.cxx:1730
 TPrincipal.cxx:1731
 TPrincipal.cxx:1732
 TPrincipal.cxx:1733
 TPrincipal.cxx:1734
 TPrincipal.cxx:1735
 TPrincipal.cxx:1736
 TPrincipal.cxx:1737
 TPrincipal.cxx:1738
 TPrincipal.cxx:1739
 TPrincipal.cxx:1740
 TPrincipal.cxx:1741
 TPrincipal.cxx:1742
 TPrincipal.cxx:1743
 TPrincipal.cxx:1744
 TPrincipal.cxx:1745
 TPrincipal.cxx:1746
 TPrincipal.cxx:1747
 TPrincipal.cxx:1748
 TPrincipal.cxx:1749
 TPrincipal.cxx:1750
 TPrincipal.cxx:1751
 TPrincipal.cxx:1752
 TPrincipal.cxx:1753
 TPrincipal.cxx:1754
 TPrincipal.cxx:1755
 TPrincipal.cxx:1756
 TPrincipal.cxx:1757
 TPrincipal.cxx:1758
 TPrincipal.cxx:1759
 TPrincipal.cxx:1760
 TPrincipal.cxx:1761
 TPrincipal.cxx:1762
 TPrincipal.cxx:1763
 TPrincipal.cxx:1764
 TPrincipal.cxx:1765
 TPrincipal.cxx:1766
 TPrincipal.cxx:1767
 TPrincipal.cxx:1768
 TPrincipal.cxx:1769
 TPrincipal.cxx:1770
 TPrincipal.cxx:1771
 TPrincipal.cxx:1772
 TPrincipal.cxx:1773
 TPrincipal.cxx:1774
 TPrincipal.cxx:1775
 TPrincipal.cxx:1776
 TPrincipal.cxx:1777
 TPrincipal.cxx:1778
 TPrincipal.cxx:1779
 TPrincipal.cxx:1780
 TPrincipal.cxx:1781
 TPrincipal.cxx:1782
 TPrincipal.cxx:1783
 TPrincipal.cxx:1784
 TPrincipal.cxx:1785
 TPrincipal.cxx:1786
 TPrincipal.cxx:1787
 TPrincipal.cxx:1788
 TPrincipal.cxx:1789
 TPrincipal.cxx:1790