// @(#)root/geom:$Id$
// Author: Andrei Gheata   17/06/04

/*************************************************************************
 * 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.             *
 *************************************************************************/

////////////////////////////////////////////////////////////////////////////////
//
// TGeoElement      - base class for chemical elements
// TGeoElementRN    - class representing a radionuclide
// TGeoElemIter     - iterator for decay branches
// TGeoDecayChannel - a decay channel for a radionuclide
// TGeoElementTable - table of elements
//
////////////////////////////////////////////////////////////////////////////////

#include "RConfigure.h"

#include "Riostream.h"

#include "TSystem.h"
#include "TObjArray.h"
#include "TVirtualGeoPainter.h"
#include "TGeoManager.h"
#include "TGeoElement.h"
#include "TMath.h"

// statics and globals
static const Int_t gMaxElem  = 110;
static const Int_t gMaxLevel = 8;
static const Int_t gMaxDecay = 15;

static const char gElName[gMaxElem][3] = {
          "H ","He","Li","Be","B ","C ","N ","O ","F ","Ne","Na","Mg",
          "Al","Si","P ","S ","Cl","Ar","K ","Ca","Sc","Ti","V ","Cr",
          "Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr",
          "Rb","Sr","Y ","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd",
          "In","Sn","Sb","Te","I ","Xe","Cs","Ba","La","Ce","Pr","Nd",
          "Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf",
          "Ta","W ","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po",
          "At","Rn","Fr","Ra","Ac","Th","Pa","U ","Np","Pu","Am","Cm",
          "Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg","Bh","Hs",
          "Mt","Ds" };

static const char *gDecayName[gMaxDecay+1] = {
   "2BetaMinus", "BetaMinus", "NeutronEm", "ProtonEm", "Alpha", "ECF",
   "ElecCapt", "IsoTrans", "I", "SpontFiss", "2ProtonEm", "2NeutronEm",
   "2Alpha", "Carbon12", "Carbon14", "Stable" };

static const Int_t gDecayDeltaA[gMaxDecay] = {
              0,           0,          -1,         -1,       -4,
            -99,           0,           0,        -99,      -99,
             -2,          -2,          -8,        -12,      -14 };

static const Int_t gDecayDeltaZ[gMaxDecay] = {
              2,           1,           0,         -1,       -2,
            -99,          -1,           0,        -99,      -99,
             -2,           0,          -4,         -6,       -6 };
static const char gLevName[gMaxLevel]=" mnpqrs";

ClassImp(TGeoElement)

//______________________________________________________________________________
TGeoElement::TGeoElement()
{
// Default constructor
   SetDefined(kFALSE);
   SetUsed(kFALSE);
   fZ = 0;
   fN = 0;
   fNisotopes = 0;
   fA = 0.0;
   fIsotopes = NULL;
   fAbundances = NULL;
}

//______________________________________________________________________________
TGeoElement::TGeoElement(const char *name, const char *title, Int_t z, Double_t a)
            :TNamed(name, title)
{
// Obsolete constructor
   SetDefined(kFALSE);
   SetUsed(kFALSE);
   fZ = z;
   fN = Int_t(a);
   fNisotopes = 0;
   fA = a;
   fIsotopes = NULL;
   fAbundances = NULL;
}

//______________________________________________________________________________
TGeoElement::TGeoElement(const char *name, const char *title, Int_t nisotopes)
            :TNamed(name, title)
{
// Element having isotopes.
   SetDefined(kFALSE);
   SetUsed(kFALSE);
   fZ = 0;
   fN = 0;
   fNisotopes = nisotopes;
   fA = 0.0;
   fIsotopes = new TObjArray(nisotopes);
   fAbundances = new Double_t[nisotopes];
}

//______________________________________________________________________________
TGeoElement::TGeoElement(const char *name, const char *title, Int_t z, Int_t n, Double_t a)
            :TNamed(name, title)
{
// Constructor
   SetDefined(kFALSE);
   SetUsed(kFALSE);
   fZ = z;
   fN = n;
   fNisotopes = 0;
   fA = a;
   fIsotopes = NULL;
   fAbundances = NULL;
}

//______________________________________________________________________________
void TGeoElement::Print(Option_t *option) const
{
// Print this isotope
   printf("Element: %s      Z=%d   N=%f   A=%f [g/mole]\n", GetName(), fZ,Neff(),fA);
   if (HasIsotopes()) {
      for (Int_t i=0; i<fNisotopes; i++) {
         TGeoIsotope *iso = GetIsotope(i);
         printf("=>Isotope %s, abundance=%f :\n", iso->GetName(), fAbundances[i]);
         iso->Print(option);
      }
   }
}

//______________________________________________________________________________
TGeoElementTable *TGeoElement::GetElementTable()
{
// Returns pointer to the table.
   if (!gGeoManager) {
      ::Error("TGeoElementTable::GetElementTable", "Create a geometry manager first");
      return NULL;
   }
   return gGeoManager->GetElementTable();
}

//______________________________________________________________________________
void TGeoElement::AddIsotope(TGeoIsotope *isotope, Double_t relativeAbundance)
{
// Add an isotope for this element. All isotopes have to be isotopes of the same element.
   if (!fIsotopes) {
      Fatal("AddIsotope", "Cannot add isotopes to normal elements. Use constructor with number of isotopes.");
      return;
   }
   Int_t ncurrent = 0;
   TGeoIsotope *isocrt;
   for (ncurrent=0; ncurrent<fNisotopes; ncurrent++)
      if (!fIsotopes->At(ncurrent)) break;
   if (ncurrent==fNisotopes) {
      Error("AddIsotope", "All %d isotopes of element %s already defined", fNisotopes, GetName());
      return;
   }
   // Check Z of the new isotope
   if ((fZ!=0) && (isotope->GetZ()!=fZ)) {
      Fatal("AddIsotope", "Trying to add isotope %s with different Z to the same element %s",
            isotope->GetName(), GetName());
      return;
   } else {
      fZ = isotope->GetZ();
   }
   fIsotopes->Add(isotope);
   fAbundances[ncurrent] = relativeAbundance;
   if (ncurrent==fNisotopes-1) {
      Double_t weight = 0.0;
      Double_t aeff = 0.0;
      Double_t neff = 0.0;
      for (Int_t i=0; i<fNisotopes; i++) {
         isocrt = (TGeoIsotope*)fIsotopes->At(i);
         aeff += fAbundances[i]*isocrt->GetA();
         neff += fAbundances[i]*isocrt->GetN();
         weight += fAbundances[i];
      }
      aeff /= weight;
      neff /= weight;
      fN = (Int_t)neff;
      fA = aeff;
   }
}

//______________________________________________________________________________
Double_t TGeoElement::Neff() const
{
// Returns effective number of nucleons.
   if (!fNisotopes) return fN;
   TGeoIsotope *isocrt;
   Double_t weight = 0.0;
   Double_t neff = 0.0;
   for (Int_t i=0; i<fNisotopes; i++) {
      isocrt = (TGeoIsotope*)fIsotopes->At(i);
      neff += fAbundances[i]*isocrt->GetN();
      weight += fAbundances[i];
   }
   neff /= weight;
   return neff;
}

//______________________________________________________________________________
TGeoIsotope *TGeoElement::GetIsotope(Int_t i) const
{
// Return i-th isotope in the element.
   if (i>=0 && i<fNisotopes) {
      return (TGeoIsotope*)fIsotopes->At(i);
   }
   return NULL;
}

//______________________________________________________________________________
Double_t TGeoElement::GetRelativeAbundance(Int_t i) const
{
// Return relative abundance of i-th isotope in this element.
   if (i>=0 && i<fNisotopes) return fAbundances[i];
   return 0.0;
}

ClassImp(TGeoIsotope)

//______________________________________________________________________________
TGeoIsotope::TGeoIsotope()
            :TNamed(),
             fZ(0),
             fN(0),
             fA(0)
{
// Dummy I/O constructor
}

//______________________________________________________________________________
TGeoIsotope::TGeoIsotope(const char *name, Int_t z, Int_t n, Double_t a)
            :TNamed(name,""),
             fZ(z),
             fN(n),
             fA(a)
{
// Constructor
   if (z<1) Fatal("ctor", "Not allowed Z=%d (<1) for isotope: %s", z,name);
   if (n<z) Fatal("ctor", "Not allowed Z=%d < N=%d for isotope: %s", z,n,name);
   TGeoElement::GetElementTable()->AddIsotope(this);
}

//______________________________________________________________________________
TGeoIsotope *TGeoIsotope::FindIsotope(const char *name)
{
// Find existing isotope by name.
   TGeoElementTable *elTable = TGeoElement::GetElementTable();
   if (!elTable) return 0;
   return elTable->FindIsotope(name);
}

//______________________________________________________________________________
void TGeoIsotope::Print(Option_t *) const
{
// Print this isotope
   printf("Isotope: %s     Z=%d   N=%d   A=%f [g/mole]\n", GetName(), fZ,fN,fA);
}

ClassImp(TGeoElementRN)

//______________________________________________________________________________
TGeoElementRN::TGeoElementRN()
{
// Default constructor
   TObject::SetBit(kElementChecked,kFALSE);
   fENDFcode = 0;
   fIso      = 0;
   fLevel    = 0;
   fDeltaM   = 0;
   fHalfLife = 0;
   fNatAbun  = 0;
   fTH_F     = 0;
   fTG_F     = 0;
   fTH_S     = 0;
   fTG_S     = 0;
   fStatus   = 0;
   fRatio    = 0;
   fDecays   = 0;
}

//______________________________________________________________________________
TGeoElementRN::TGeoElementRN(Int_t aa, Int_t zz, Int_t iso, Double_t level,
               Double_t deltaM, Double_t halfLife, const char* JP,
               Double_t natAbun, Double_t th_f, Double_t tg_f, Double_t th_s,
               Double_t tg_s, Int_t status)
              :TGeoElement("", JP, zz, aa)
{
// Constructor.
   TObject::SetBit(kElementChecked,kFALSE);
   fENDFcode = ENDF(aa,zz,iso);
   fIso      = iso;
   fLevel    = level;
   fDeltaM   = deltaM;
   fHalfLife = halfLife;
   fTitle    = JP;
   if (!fTitle.Length()) fTitle = "?";
   fNatAbun  = natAbun;
   fTH_F     = th_f;
   fTG_F     = tg_f;
   fTH_S     = th_s;
   fTG_S     = tg_s;
   fStatus   = status;
   fDecays   = 0;
   fRatio    = 0;
   MakeName(aa,zz,iso);
   if ((TMath::Abs(fHalfLife)<1.e-30) || fHalfLife<-1) Warning("ctor","Element %s has T1/2=%g [s]", fName.Data(), fHalfLife);
}

//______________________________________________________________________________
TGeoElementRN::~TGeoElementRN()
{
// Destructor.
   if (fDecays) {
      fDecays->Delete();
      delete fDecays;
   }
   if (fRatio) delete fRatio;
}

//______________________________________________________________________________
void TGeoElementRN::AddDecay(Int_t decay, Int_t diso, Double_t branchingRatio, Double_t qValue)
{
// Adds a decay mode for this element.
   if (branchingRatio<1E-20) {
      TString decayName;
      TGeoDecayChannel::DecayName(decay, decayName);
      Warning("AddDecay", "Decay %s of %s has BR=0. Not added.", decayName.Data(),fName.Data());
      return;
   }
   TGeoDecayChannel *dc = new TGeoDecayChannel(decay,diso,branchingRatio, qValue);
   dc->SetParent(this);
   if (!fDecays) fDecays = new TObjArray(5);
   fDecays->Add(dc);
}

//______________________________________________________________________________
void TGeoElementRN::AddDecay(TGeoDecayChannel *dc)
{
// Adds a decay channel to the list of decays.
   dc->SetParent(this);
   if (!fDecays) fDecays = new TObjArray(5);
   fDecays->Add(dc);
}

//______________________________________________________________________________
Int_t TGeoElementRN::GetNdecays() const
{
// Get number of decay chanels of this element.
   if (!fDecays) return 0;
   return fDecays->GetEntriesFast();
}

//______________________________________________________________________________
Double_t TGeoElementRN::GetSpecificActivity() const
{
// Get the activity in Bq of a gram of material made from this element.
   static const Double_t ln2 = TMath::Log(2.);
   Double_t sa = (fHalfLife>0 && fA>0)?(ln2*TMath::Na()/fHalfLife/fA):0.;
   return sa;
}

//______________________________________________________________________________
Bool_t TGeoElementRN::CheckDecays() const
{
// Check if all decay chain of the element is OK.
   if (TObject::TestBit(kElementChecked)) return kTRUE;
   TObject *oelem = (TObject*)this;
   TGeoDecayChannel *dc;
   TGeoElementRN *elem;
   TGeoElementTable *table = GetElementTable();
   TString decayName;
   if (!table) {
      Error("CheckDecays", "Element table not present");
      return kFALSE;
   }
   Bool_t resultOK = kTRUE;
   if (!fDecays) {
      oelem->SetBit(kElementChecked,kTRUE);
      return resultOK;
   }
   Double_t br = 0.;
   Int_t decayResult = 0;
   TIter next(fDecays);
   while ((dc=(TGeoDecayChannel*)next())) {
      br += dc->BranchingRatio();
      decayResult = DecayResult(dc);
      if (decayResult) {
         elem = table->GetElementRN(decayResult);
         if (!elem) {
            TGeoDecayChannel::DecayName(dc->Decay(),decayName);
            Error("CheckDecays", "Element after decay %s of %s not found in DB", decayName.Data(),fName.Data());
            return kFALSE;
         }
         dc->SetDaughter(elem);
         resultOK = elem->CheckDecays();
      }
   }
   if (TMath::Abs(br-100) > 1.E-3) {
      Warning("CheckDecays", "BR for decays of element %s sum-up = %f", fName.Data(), br);
      resultOK = kFALSE;
   }
   oelem->SetBit(kElementChecked,kTRUE);
   return resultOK;
}

//______________________________________________________________________________
Int_t TGeoElementRN::DecayResult(TGeoDecayChannel *dc) const
{
// Returns ENDF code of decay result.
   Int_t da, dz, diso;
   dc->DecayShift(da, dz, diso);
   if (da == -99 || dz == -99) return 0;
   return ENDF(Int_t(fA)+da,fZ+dz,fIso+diso);
}

//______________________________________________________________________________
void TGeoElementRN::FillPopulation(TObjArray *population, Double_t precision, Double_t factor)
{
// Fills the input array with the set of RN elements resulting from the decay of
// this one. All element in the list will contain the time evolution of their
// proportion by number with respect to this element. The proportion can be
// retrieved via the method TGeoElementRN::Ratio().
// The precision represent the minimum cumulative branching ratio for
// which decay products are still taken into account.
   TGeoElementRN *elem;
   TGeoElemIter next(this, precision);
   TGeoBatemanSol s(this);
   s.Normalize(factor);
   AddRatio(s);
   if (!population->FindObject(this)) population->Add(this);
   while ((elem=next())) {
      TGeoBatemanSol ratio(next.GetBranch());
      ratio.Normalize(factor);
      elem->AddRatio(ratio);
      if (!population->FindObject(elem)) population->Add(elem);
   }
}

//______________________________________________________________________________
void TGeoElementRN::MakeName(Int_t a, Int_t z, Int_t iso)
{
// Generate a default name for the element.
   fName = "";
   if (z==0 && a==1) {
      fName = "neutron";
      return;
   }
   if (z>=1 && z<= gMaxElem) fName += TString::Format("%3d-%s-",z,gElName[z-1]);
   else fName = "?? -?? -";
   if (a>=1 && a<=999) fName += TString::Format("%3.3d",a);
   else fName += "??";
   if (iso>0 && iso<gMaxLevel) fName += TString::Format("%c", gLevName[iso]);
   fName.ReplaceAll(" ","");
}

//______________________________________________________________________________
void TGeoElementRN::Print(Option_t *option) const
{
// Print info about the element;
   printf("\n%-12s ",fName.Data());
   printf("ENDF=%d; ",fENDFcode);
   printf("A=%d; ",(Int_t)fA);
   printf("Z=%d; ",fZ);
   printf("Iso=%d; ",fIso);
   printf("Level=%g[MeV]; ",fLevel);
   printf("Dmass=%g[MeV]; ",fDeltaM);
   if (fHalfLife>0) printf("Hlife=%g[s]\n",fHalfLife);
   else printf("Hlife=INF\n");
   printf("%13s"," ");
   printf("J/P=%s; ",fTitle.Data());
   printf("Abund=%g; ",fNatAbun);
   printf("Htox=%g; ",fTH_F);
   printf("Itox=%g; ",fTG_F);
   printf("Stat=%d\n",fStatus);
   if(!fDecays) return;
   printf("Decay modes:\n");
   TIter next(fDecays);
   TGeoDecayChannel *dc;
   while ((dc=(TGeoDecayChannel*)next())) dc->Print(option);
}

//______________________________________________________________________________
TGeoElementRN *TGeoElementRN::ReadElementRN(const char *line, Int_t &ndecays)
{
// Create element from line record.
   Int_t a,z,iso,status;
   Double_t level, deltaM, halfLife, natAbun, th_f, tg_f, th_s, tg_s;
   char name[20],jp[20];
   sscanf(&line[0], "%s%d%d%d%lg%lg%lg%s%lg%lg%lg%lg%lg%d%d", name,&a,&z,&iso,&level,&deltaM,
          &halfLife,jp,&natAbun,&th_f,&tg_f,&th_s,&tg_s,&status,&ndecays);
   TGeoElementRN *elem = new TGeoElementRN(a,z,iso,level,deltaM,halfLife,
                                           jp,natAbun,th_f,tg_f,th_s,tg_s,status);
   return elem;
}

//______________________________________________________________________________
void TGeoElementRN::SavePrimitive(std::ostream &out, Option_t *option)
{
// Save primitive for RN elements.
   if (!strcmp(option,"h")) {
      // print a header if requested
      out << "#====================================================================================================================================" << std::endl;
      out << "#   Name      A    Z   ISO    LEV[MeV]  DM[MeV]   T1/2[s]        J/P     ABUND[%]    HTOX      ITOX      HTOX      ITOX    STAT NDCY" << std::endl;
      out << "#====================================================================================================================================" << std::endl;
   }
   out << std::setw(11) << fName.Data();
   out << std::setw(5) << (Int_t)fA;
   out << std::setw(5) << fZ;
   out << std::setw(5) << fIso;
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fLevel;
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fDeltaM;
   out << std::setw(10) << std::setiosflags(std::ios::scientific) << std::setprecision(3) << fHalfLife;
   out << std::setw(13) << fTitle.Data();
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fNatAbun;
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fTH_F;
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fTG_F;
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fTH_S;
   out << std::setw(10) << std::setiosflags(std::ios::fixed) << std::setprecision(5) << fTG_S;
   out << std::setw(5) << fStatus;
   Int_t ndecays = 0;
   if (fDecays) ndecays = fDecays->GetEntries();
   out << std::setw(5) << ndecays;
   out << std::endl;
   if (fDecays) {
      TIter next(fDecays);
      TGeoDecayChannel *dc;
      while ((dc=(TGeoDecayChannel*)next())) dc->SavePrimitive(out);
   }
}

//______________________________________________________________________________
void TGeoElementRN::AddRatio(TGeoBatemanSol &ratio)
{
// Adds a proportion ratio to the existing one.
   if (!fRatio) fRatio = new TGeoBatemanSol(ratio);
   else         *fRatio += ratio;
}

//______________________________________________________________________________
void TGeoElementRN::ResetRatio()
{
// Clears the existing ratio.
   if (fRatio) {
      delete fRatio;
      fRatio = 0;
   }
}

ClassImp(TGeoDecayChannel)

//______________________________________________________________________________
TGeoDecayChannel& TGeoDecayChannel::operator=(const TGeoDecayChannel& dc)
{
// Assignment.
   //assignment operator
   if(this!=&dc) {
      TObject::operator=(dc);
      fDecay          = dc.fDecay;
      fDiso           = dc.fDiso;
      fBranchingRatio = dc.fBranchingRatio;
      fQvalue         = dc.fQvalue;
      fParent         = dc.fParent;
      fDaughter       = dc.fDaughter;
   }
   return *this;
}

//______________________________________________________________________________
const char *TGeoDecayChannel::GetName() const
{
// Returns name of decay.
   static TString name = "";
   name = "";
   if (!fDecay) return gDecayName[gMaxDecay];
   for (Int_t i=0; i<gMaxDecay; i++) {
      if (1<<i & fDecay) {
         if (name.Length()) name += "+";
         name += gDecayName[i];
      }
   }
   return name.Data();
}

//______________________________________________________________________________
void TGeoDecayChannel::DecayName(UInt_t decay, TString &name)
{
// Returns decay name.
   if (!decay) {
      name = gDecayName[gMaxDecay];
      return;
   }
   name = "";
   for (Int_t i=0; i<gMaxDecay; i++) {
      if (1<<i & decay) {
         if (name.Length()) name += "+";
         name += gDecayName[i];
      }
   }
}

//______________________________________________________________________________
Int_t TGeoDecayChannel::GetIndex() const
{
// Get index of this channel in the list of decays of the parent nuclide.
   return fParent->Decays()->IndexOf(this);
}

//______________________________________________________________________________
void TGeoDecayChannel::Print(Option_t *) const
{
// Prints decay info.
   TString name;
   DecayName(fDecay, name);
   printf("%-20s Diso: %3d BR: %9.3f%% Qval: %g\n", name.Data(),fDiso,fBranchingRatio,fQvalue);
}

//______________________________________________________________________________
TGeoDecayChannel *TGeoDecayChannel::ReadDecay(const char *line)
{
// Create element from line record.
   char name[80];
   Int_t decay,diso;
   Double_t branchingRatio, qValue;
   sscanf(&line[0], "%s%d%d%lg%lg", name,&decay,&diso,&branchingRatio,&qValue);
   TGeoDecayChannel *dc = new TGeoDecayChannel(decay,diso,branchingRatio,qValue);
   return dc;
}

//______________________________________________________________________________
void TGeoDecayChannel::SavePrimitive(std::ostream &out, Option_t *)
{
// Save primitive for decays.
   TString decayName;
   DecayName(fDecay, decayName);
   out << std::setw(50) << decayName.Data();
   out << std::setw(10) << fDecay;
   out << std::setw(10) << fDiso;
   out << std::setw(12) << std::setiosflags(std::ios::fixed) << std::setprecision(6) << fBranchingRatio;
   out << std::setw(12) << std::setiosflags(std::ios::fixed) << std::setprecision(6) << fQvalue;
   out << std::endl;
}

//______________________________________________________________________________
void TGeoDecayChannel::DecayShift(Int_t &dA, Int_t &dZ, Int_t &dI) const
{
// Returns variation in A, Z and Iso after decay.
   dA=dZ=0;
   dI=fDiso;
   for(Int_t i=0; i<gMaxDecay; ++i) {
      if(1<<i & fDecay) {
         if(gDecayDeltaA[i] == -99 || gDecayDeltaZ[i] == -99 ) {
            dA=dZ=-99;
            return;
         }
         dA += gDecayDeltaA[i];
         dZ += gDecayDeltaZ[i];
      }
   }
}

ClassImp(TGeoElemIter)

//______________________________________________________________________________
TGeoElemIter::TGeoElemIter(TGeoElementRN *top, Double_t limit)
          : fTop(top), fElem(top), fBranch(0), fLevel(0), fLimitRatio(limit), fRatio(1.)
{
// Default constructor.
   fBranch = new TObjArray(10);
}

//______________________________________________________________________________
TGeoElemIter::TGeoElemIter(const TGeoElemIter &iter)
             :fTop(iter.fTop),
              fElem(iter.fElem),
              fBranch(0),
              fLevel(iter.fLevel),
              fLimitRatio(iter.fLimitRatio),
              fRatio(iter.fRatio)
{
// Copy ctor.
   if (iter.fBranch) {
      fBranch = new TObjArray(10);
      for (Int_t i=0; i<fLevel; i++) fBranch->Add(iter.fBranch->At(i));
   }
}

//______________________________________________________________________________
TGeoElemIter::~TGeoElemIter()
{
// Destructor.
   if (fBranch) delete fBranch;
}

//______________________________________________________________________________
TGeoElemIter &TGeoElemIter::operator=(const TGeoElemIter &iter)
{
// Assignment.
   if (&iter == this) return *this;
   fTop   = iter.fTop;
   fElem  = iter.fElem;
   fLevel = iter.fLevel;
   if (iter.fBranch) {
      fBranch = new TObjArray(10);
      for (Int_t i=0; i<fLevel; i++) fBranch->Add(iter.fBranch->At(i));
   }
   fLimitRatio = iter.fLimitRatio;
   fRatio = iter.fRatio;
   return *this;
}

//______________________________________________________________________________
TGeoElementRN *TGeoElemIter::operator()()
{
// () operator.
   return Next();
}

//______________________________________________________________________________
TGeoElementRN *TGeoElemIter::Up()
{
// Go upwards from the current location until the next branching, then down.
   TGeoDecayChannel *dc;
   Int_t ind, nd;
   while (fLevel) {
      // Current decay channel
      dc = (TGeoDecayChannel*)fBranch->At(fLevel-1);
      ind = dc->GetIndex();
      nd = dc->Parent()->GetNdecays();
      fRatio /= 0.01*dc->BranchingRatio();
      fElem = dc->Parent();
      fBranch->RemoveAt(--fLevel);
      ind++;
      while (ind<nd) {
         if (Down(ind++)) return (TGeoElementRN*)fElem;
      }
   }
   fElem = NULL;
   return NULL;
}

//______________________________________________________________________________
TGeoElementRN *TGeoElemIter::Down(Int_t ibranch)
{
// Go downwards from current level via ibranch as low in the tree as possible.
// Return value flags if the operation was successful.
   TGeoDecayChannel *dc = (TGeoDecayChannel*)fElem->Decays()->At(ibranch);
   if (!dc->Daughter()) return NULL;
   Double_t br = 0.01*fRatio*dc->BranchingRatio();
   if (br < fLimitRatio) return NULL;
   fLevel++;
   fRatio = br;
   fBranch->Add(dc);
   fElem = dc->Daughter();
   return (TGeoElementRN*)fElem;
}

//______________________________________________________________________________
TGeoElementRN *TGeoElemIter::Next()
{
// Return next element.
   if (!fElem) return NULL;
   // Check if this is the first iteration.
   Int_t nd = fElem->GetNdecays();
   for (Int_t i=0; i<nd; i++) if (Down(i)) return (TGeoElementRN*)fElem;
   return Up();
}

//______________________________________________________________________________
void TGeoElemIter::Print(Option_t * /*option*/) const
{
// Print info about the current decay branch.
   TGeoElementRN *elem;
   TGeoDecayChannel *dc;
   TString indent = "";
   printf("=== Chain with %g %%\n", 100*fRatio);
   for (Int_t i=0; i<fLevel; i++) {
      dc = (TGeoDecayChannel*)fBranch->At(i);
      elem = dc->Parent();
      printf("%s%s (%g%% %s) T1/2=%g\n", indent.Data(), elem->GetName(),dc->BranchingRatio(),dc->GetName(),elem->HalfLife());
      indent += " ";
      if (i==fLevel-1) {
         elem = dc->Daughter();
         printf("%s%s\n", indent.Data(), elem->GetName());
      }
   }
}

ClassImp(TGeoElementTable)

//______________________________________________________________________________
TGeoElementTable::TGeoElementTable()
{
// default constructor
   fNelements = 0;
   fNelementsRN = 0;
   fNisotopes = 0;
   fList      = 0;
   fListRN    = 0;
   fIsotopes = 0;
}

//______________________________________________________________________________
TGeoElementTable::TGeoElementTable(Int_t /*nelements*/)
{
// constructor
   fNelements = 0;
   fNelementsRN = 0;
   fNisotopes = 0;
   fList = new TObjArray(128);
   fListRN    = 0;
   fIsotopes = 0;
   BuildDefaultElements();
//   BuildElementsRN();
}

//______________________________________________________________________________
TGeoElementTable::TGeoElementTable(const TGeoElementTable& get) :
  TObject(get),
  fNelements(get.fNelements),
  fNelementsRN(get.fNelementsRN),
  fNisotopes(get.fNisotopes),
  fList(get.fList),
  fListRN(get.fListRN),
  fIsotopes(0)
{
   //copy constructor
}

//______________________________________________________________________________
TGeoElementTable& TGeoElementTable::operator=(const TGeoElementTable& get)
{
   //assignment operator
   if(this!=&get) {
      TObject::operator=(get);
      fNelements=get.fNelements;
      fNelementsRN=get.fNelementsRN;
      fNisotopes=get.fNisotopes;
      fList=get.fList;
      fListRN=get.fListRN;
      fIsotopes = 0;
   }
   return *this;
}

//______________________________________________________________________________
TGeoElementTable::~TGeoElementTable()
{
// destructor
   if (fList) {
      fList->Delete();
      delete fList;
   }
   if (fListRN) {
      fListRN->Delete();
      delete fListRN;
   }
   if (fIsotopes) {
      fIsotopes->Delete();
      delete fIsotopes;
   }
}

//______________________________________________________________________________
void TGeoElementTable::AddElement(const char *name, const char *title, Int_t z, Double_t a)
{
// Add an element to the table. Obsolete.
   if (!fList) fList = new TObjArray(128);
   fList->AddAtAndExpand(new TGeoElement(name,title,z,a), fNelements++);
}

//______________________________________________________________________________
void TGeoElementTable::AddElement(const char *name, const char *title, Int_t z, Int_t n, Double_t a)
{
// Add an element to the table.
   if (!fList) fList = new TObjArray(128);
   fList->AddAtAndExpand(new TGeoElement(name,title,z,n,a), fNelements++);
}

//______________________________________________________________________________
void TGeoElementTable::AddElement(TGeoElement *elem)
{
// Add a custom element to the table.
   if (!fList) fList = new TObjArray(128);
   TGeoElement *orig = FindElement(elem->GetName());
   if (orig) {
      Error("AddElement", "Found element with same name: %s (%s). Cannot add to table.",
             orig->GetName(), orig->GetTitle());
      return;
   }          
   fList->AddAtAndExpand(elem, fNelements++);
}   

//______________________________________________________________________________
void TGeoElementTable::AddElementRN(TGeoElementRN *elem)
{
// Add a radionuclide to the table and map it.
   if (!fListRN) fListRN = new TObjArray(3600);
   if (HasRNElements() && GetElementRN(elem->ENDFCode())) return;
//   elem->Print();
   fListRN->Add(elem);
   fNelementsRN++;
   fElementsRN.insert(ElementRNMap_t::value_type(elem->ENDFCode(), elem));
}

//______________________________________________________________________________
void TGeoElementTable::AddIsotope(TGeoIsotope *isotope)
{
// Add isotope to the table.
   if (FindIsotope(isotope->GetName())) {
      Error("AddIsotope", "Isotope with the same name: %s already in table. Not adding.",isotope->GetName());
      return;
   }
   if (!fIsotopes) fIsotopes = new TObjArray();
   fIsotopes->Add(isotope);
}

//______________________________________________________________________________
void TGeoElementTable::BuildDefaultElements()
{
// Creates the default element table
   if (HasDefaultElements()) return;
   AddElement("VACUUM","VACUUM"   ,0,   0, 0.0);
   AddElement("H"   ,"HYDROGEN"   ,1,   1, 1.00794);
   AddElement("HE"  ,"HELIUM"     ,2,   4, 4.002602);
   AddElement("LI"  ,"LITHIUM"    ,3,   7, 6.941);
   AddElement("BE"  ,"BERYLLIUM"  ,4,   9, 9.01218);
   AddElement("B"   ,"BORON"      ,5,  11, 10.811);
   AddElement("C"   ,"CARBON"     ,6,  12, 12.0107);
   AddElement("N"   ,"NITROGEN"   ,7,  14, 14.00674);
   AddElement("O"   ,"OXYGEN"     ,8,  16, 15.9994);
   AddElement("F"   ,"FLUORINE"   ,9,  19, 18.9984032);
   AddElement("NE"  ,"NEON"       ,10, 20, 20.1797);
   AddElement("NA"  ,"SODIUM"     ,11, 23, 22.989770);
   AddElement("MG"  ,"MAGNESIUM"  ,12, 24, 24.3050);
   AddElement("AL"  ,"ALUMINIUM"  ,13, 27, 26.981538);
   AddElement("SI"  ,"SILICON"    ,14, 28, 28.0855);
   AddElement("P"   ,"PHOSPHORUS" ,15, 31, 30.973761);
   AddElement("S"   ,"SULFUR"     ,16, 32, 32.066);
   AddElement("CL"  ,"CHLORINE"   ,17, 35, 35.4527);
   AddElement("AR"  ,"ARGON"      ,18, 40, 39.948);
   AddElement("K"   ,"POTASSIUM"  ,19, 39, 39.0983);
   AddElement("CA"  ,"CALCIUM"    ,20, 40, 40.078);
   AddElement("SC"  ,"SCANDIUM"   ,21, 45, 44.955910);
   AddElement("TI"  ,"TITANIUM"   ,22, 48, 47.867);
   AddElement("V"   ,"VANADIUM"   ,23, 51, 50.9415);
   AddElement("CR"  ,"CHROMIUM"   ,24, 52, 51.9961);
   AddElement("MN"  ,"MANGANESE"  ,25, 55, 54.938049);
   AddElement("FE"  ,"IRON"       ,26, 56, 55.845);
   AddElement("CO"  ,"COBALT"     ,27, 59, 58.933200);
   AddElement("NI"  ,"NICKEL"     ,28, 59, 58.6934);
   AddElement("CU"  ,"COPPER"     ,29, 64, 63.546);
   AddElement("ZN"  ,"ZINC"       ,30, 65, 65.39);
   AddElement("GA"  ,"GALLIUM"    ,31, 70, 69.723);
   AddElement("GE"  ,"GERMANIUM"  ,32, 73, 72.61);
   AddElement("AS"  ,"ARSENIC"    ,33, 75, 74.92160);
   AddElement("SE"  ,"SELENIUM"   ,34, 79, 78.96);
   AddElement("BR"  ,"BROMINE"    ,35, 80, 79.904);
   AddElement("KR"  ,"KRYPTON"    ,36, 84, 83.80);
   AddElement("RB"  ,"RUBIDIUM"   ,37, 85, 85.4678);
   AddElement("SR"  ,"STRONTIUM"  ,38, 88, 87.62);
   AddElement("Y"   ,"YTTRIUM"    ,39, 89, 88.90585);
   AddElement("ZR"  ,"ZIRCONIUM"  ,40, 91, 91.224);
   AddElement("NB"  ,"NIOBIUM"    ,41, 93, 92.90638);
   AddElement("MO"  ,"MOLYBDENUM" ,42, 96, 95.94);
   AddElement("TC"  ,"TECHNETIUM" ,43, 98, 98.0);
   AddElement("RU"  ,"RUTHENIUM"  ,44, 101, 101.07);
   AddElement("RH"  ,"RHODIUM"    ,45, 103, 102.90550);
   AddElement("PD"  ,"PALLADIUM"  ,46, 106, 106.42);
   AddElement("AG"  ,"SILVER"     ,47, 108, 107.8682);
   AddElement("CD"  ,"CADMIUM"    ,48, 112, 112.411);
   AddElement("IN"  ,"INDIUM"     ,49, 115, 114.818);
   AddElement("SN"  ,"TIN"        ,50, 119, 118.710);
   AddElement("SB"  ,"ANTIMONY"   ,51, 122, 121.760);
   AddElement("TE"  ,"TELLURIUM"  ,52, 128, 127.60);
   AddElement("I"   ,"IODINE"     ,53, 127, 126.90447);
   AddElement("XE"  ,"XENON"      ,54, 131, 131.29);
   AddElement("CS"  ,"CESIUM"     ,55, 133, 132.90545);
   AddElement("BA"  ,"BARIUM"     ,56, 137, 137.327);
   AddElement("LA"  ,"LANTHANUM"  ,57, 139, 138.9055);
   AddElement("CE"  ,"CERIUM"     ,58, 140, 140.116);
   AddElement("PR"  ,"PRASEODYMIUM" ,59, 141, 140.90765);
   AddElement("ND"  ,"NEODYMIUM"  ,60, 144, 144.24);
   AddElement("PM"  ,"PROMETHIUM" ,61, 145, 145.0);
   AddElement("SM"  ,"SAMARIUM"   ,62, 150, 150.36);
   AddElement("EU"  ,"EUROPIUM"   ,63, 152, 151.964);
   AddElement("GD"  ,"GADOLINIUM" ,64, 157, 157.25);
   AddElement("TB"  ,"TERBIUM"    ,65, 159, 158.92534);
   AddElement("DY"  ,"DYSPROSIUM" ,66, 162, 162.50);
   AddElement("HO"  ,"HOLMIUM"    ,67, 165, 164.93032);
   AddElement("ER"  ,"ERBIUM"     ,68, 167, 167.26);
   AddElement("TM"  ,"THULIUM"    ,69, 169, 168.93421);
   AddElement("YB"  ,"YTTERBIUM"  ,70, 173, 173.04);
   AddElement("LU"  ,"LUTETIUM"   ,71, 175, 174.967);
   AddElement("HF"  ,"HAFNIUM"    ,72, 178, 178.49);
   AddElement("TA"  ,"TANTALUM"   ,73, 181, 180.9479);
   AddElement("W"   ,"TUNGSTEN"   ,74, 184, 183.84);
   AddElement("RE"  ,"RHENIUM"    ,75, 186, 186.207);
   AddElement("OS"  ,"OSMIUM"     ,76, 190, 190.23);
   AddElement("IR"  ,"IRIDIUM"    ,77, 192, 192.217);
   AddElement("PT"  ,"PLATINUM"   ,78, 195, 195.078);
   AddElement("AU"  ,"GOLD"       ,79, 197, 196.96655);
   AddElement("HG"  ,"MERCURY"    ,80, 200, 200.59);
   AddElement("TL"  ,"THALLIUM"   ,81, 204, 204.3833);
   AddElement("PB"  ,"LEAD"       ,82, 207, 207.2);
   AddElement("BI"  ,"BISMUTH"    ,83, 209, 208.98038);
   AddElement("PO"  ,"POLONIUM"   ,84, 209, 209.0);
   AddElement("AT"  ,"ASTATINE"   ,85, 210, 210.0);
   AddElement("RN"  ,"RADON"      ,86, 222, 222.0);
   AddElement("FR"  ,"FRANCIUM"   ,87, 223, 223.0);
   AddElement("RA"  ,"RADIUM"     ,88, 226, 226.0);
   AddElement("AC"  ,"ACTINIUM"   ,89, 227, 227.0);
   AddElement("TH"  ,"THORIUM"    ,90, 232, 232.0381);
   AddElement("PA"  ,"PROTACTINIUM" ,91, 231, 231.03588);
   AddElement("U"   ,"URANIUM"    ,92, 238, 238.0289);
   AddElement("NP"  ,"NEPTUNIUM"  ,93, 237, 237.0);
   AddElement("PU"  ,"PLUTONIUM"  ,94, 244, 244.0);
   AddElement("AM"  ,"AMERICIUM"  ,95, 243, 243.0);
   AddElement("CM"  ,"CURIUM"     ,96, 247, 247.0);
   AddElement("BK"  ,"BERKELIUM"  ,97, 247, 247.0);
   AddElement("CF"  ,"CALIFORNIUM",98, 251, 251.0);
   AddElement("ES"  ,"EINSTEINIUM",99, 252, 252.0);
   AddElement("FM"  ,"FERMIUM"    ,100, 257, 257.0);
   AddElement("MD"  ,"MENDELEVIUM",101, 258, 258.0);
   AddElement("NO"  ,"NOBELIUM"   ,102, 259, 259.0);
   AddElement("LR"  ,"LAWRENCIUM" ,103, 262, 262.0);
   AddElement("RF"  ,"RUTHERFORDIUM",104, 261, 261.0);
   AddElement("DB"  ,"DUBNIUM" ,105, 262, 262.0);
   AddElement("SG"  ,"SEABORGIUM" ,106, 263, 263.0);
   AddElement("BH"  ,"BOHRIUM"    ,107, 262, 262.0);
   AddElement("HS"  ,"HASSIUM"    ,108, 265, 265.0);
   AddElement("MT"  ,"MEITNERIUM" ,109, 266, 266.0);
   AddElement("UUN" ,"UNUNNILIUM" ,110, 269, 269.0);
   AddElement("UUU" ,"UNUNUNIUM"  ,111, 272, 272.0);
   AddElement("UUB" ,"UNUNBIUM"   ,112, 277, 277.0);

   TObject::SetBit(kETDefaultElements,kTRUE);
}

//______________________________________________________________________________
void TGeoElementTable::ImportElementsRN()
{
// Creates the list of radionuclides.
   if (HasRNElements()) return;
   TGeoElementRN *elem;
   TString rnf;
#ifdef ROOTETCDIR
   rnf.Form("%s/RadioNuclides.txt", ROOTETCDIR);
#else
   rnf.Form("%s/etc/RadioNuclides.txt", gSystem->Getenv("ROOTSYS"));
#endif
   FILE *fp = fopen(rnf, "r");
   if (!fp) {
      Error("ImportElementsRN","File RadioNuclides.txt not found");
      return;
   }
   char line[150];
   Int_t ndecays = 0;
   Int_t i;
   while (fgets(&line[0],140,fp)) {
      if (line[0]=='#') continue;
      elem = TGeoElementRN::ReadElementRN(line, ndecays);
      for (i=0; i<ndecays; i++) {
         if (!fgets(&line[0],140,fp)) {
            Error("ImportElementsRN", "Error parsing RadioNuclides.txt file");
            fclose(fp);
            return;
         }
         TGeoDecayChannel *dc = TGeoDecayChannel::ReadDecay(line);
         elem->AddDecay(dc);
      }
      AddElementRN(elem);
//      elem->Print();
   }
   TObject::SetBit(kETRNElements,kTRUE);
   CheckTable();
   fclose(fp);
}

//______________________________________________________________________________
Bool_t TGeoElementTable::CheckTable() const
{
// Checks status of element table.
   if (!HasRNElements()) return HasDefaultElements();
   TGeoElementRN *elem;
   Bool_t result = kTRUE;
   TIter next(fListRN);
   while ((elem=(TGeoElementRN*)next())) {
      if (!elem->CheckDecays()) result = kFALSE;
   }
   return result;
}

//______________________________________________________________________________
void TGeoElementTable::ExportElementsRN(const char *filename)
{
// Export radionuclides in a file.
   if (!HasRNElements()) return;
   TString sname = filename;
   if (!sname.Length()) sname = "RadioNuclides.txt";
   std::ofstream out;
   out.open(sname.Data(), std::ios::out);
   if (!out.good()) {
      Error("ExportElementsRN", "Cannot open file %s", sname.Data());
      return;
   }

   TGeoElementRN *elem;
   TIter next(fListRN);
   Int_t i=0;
   while ((elem=(TGeoElementRN*)next())) {
      if ((i%48)==0) elem->SavePrimitive(out,"h");
      else elem->SavePrimitive(out);
      i++;
   }
   out.close();
}

//______________________________________________________________________________
TGeoElement *TGeoElementTable::FindElement(const char *name) const
{
// Search an element by symbol or full name
   // Exact matching
   TGeoElement *elem;
   elem = (TGeoElement*)fList->FindObject(name);
   if (elem) return elem;
   // Search case insensitive by element name
   TString s(name);
   s.ToUpper();
   elem = (TGeoElement*)fList->FindObject(s.Data());
   if (elem) return elem;
   // Search by full name
   TIter next(fList);
   while ((elem=(TGeoElement*)next())) {
      if (s == elem->GetTitle()) return elem;
   }
   return 0;
}

//______________________________________________________________________________
TGeoIsotope *TGeoElementTable::FindIsotope(const char *name) const
{
// Find existing isotope by name. Not optimized for a big number of isotopes.
   if (!fIsotopes) return NULL;
   return (TGeoIsotope*)fIsotopes->FindObject(name);
}

//______________________________________________________________________________
TGeoElementRN *TGeoElementTable::GetElementRN(Int_t ENDFcode) const
{
// Retreive a radionuclide by ENDF code.
   if (!HasRNElements()) {
      TGeoElementTable *table = (TGeoElementTable*)this;
      table->ImportElementsRN();
      if (!fListRN) return 0;
   }
   ElementRNMap_t::const_iterator it = fElementsRN.find(ENDFcode);
   if (it != fElementsRN.end()) return it->second;
   return 0;
}

//______________________________________________________________________________
TGeoElementRN *TGeoElementTable::GetElementRN(Int_t a, Int_t z, Int_t iso) const
{
// Retreive a radionuclide by a, z, and isomeric state.
   return GetElementRN(TGeoElementRN::ENDF(a,z,iso));
}

//______________________________________________________________________________
void TGeoElementTable::Print(Option_t *option) const
{
// Print table of elements. The accepted options are:
//  ""  - prints everything by default
//  "D" - prints default elements only
//  "I" - prints isotopes
//  "R" - prints radio-nuclides only if imported
//  "U" - prints user-defined elements only
   TString opt(option);
   opt.ToUpper();
   Int_t induser = HasDefaultElements() ? 113 : 0;
   // Default elements
   if (opt=="" || opt=="D") {
      if (induser) printf("================\nDefault elements\n================\n");
      for (Int_t iel=0; iel<induser; ++iel) fList->At(iel)->Print();
   }
   // Isotopes
   if (opt=="" || opt=="I") {
      if (fIsotopes) {
         printf("================\nIsotopes\n================\n");
         fIsotopes->Print();
      }
   }
   // Radio-nuclides
   if (opt=="" || opt=="R") {
      if (HasRNElements()) {
         printf("================\nRadio-nuclides\n================\n");
         fListRN->Print();
      }
   }
   // User-defined elements
   if (opt=="" || opt=="U") {
      if (fNelements>induser) printf("================\nUser elements\n================\n");
      for (Int_t iel=induser; iel<fNelements; ++iel) fList->At(iel)->Print();
   }      
}

ClassImp(TGeoBatemanSol)

//______________________________________________________________________________
TGeoBatemanSol::TGeoBatemanSol(TGeoElementRN *elem)
               :TObject(), TAttLine(), TAttFill(), TAttMarker(),
                fElem(elem),
                fElemTop(elem),
                fCsize(10),
                fNcoeff(0),
                fFactor(1.),
                fTmin(0.),
                fTmax(0.),
                fCoeff(NULL)
{
// Default ctor.
   fCoeff = new BtCoef_t[fCsize];
   fNcoeff = 1;
   fCoeff[0].cn = 1.;
   Double_t t12 = elem->HalfLife();
   if (t12 == 0.) t12 = 1.e-30;
   if (elem->Stable()) fCoeff[0].lambda = 0.;
   else                fCoeff[0].lambda = TMath::Log(2.)/t12;
}

//______________________________________________________________________________
TGeoBatemanSol::TGeoBatemanSol(const TObjArray *chain)
               :TObject(), TAttLine(), TAttFill(), TAttMarker(),
                fElem(NULL),
                fElemTop(NULL),
                fCsize(0),
                fNcoeff(0),
                fFactor(1.),
                fTmin(0.),
                fTmax(0.),
                fCoeff(NULL)
{
// Default ctor.
   TGeoDecayChannel *dc = (TGeoDecayChannel*)chain->At(0);
   if (dc) fElemTop = dc->Parent();
   dc = (TGeoDecayChannel*)chain->At(chain->GetEntriesFast()-1);
   if (dc) {
      fElem = dc->Daughter();
      fCsize = chain->GetEntriesFast()+1;
      fCoeff = new BtCoef_t[fCsize];
      FindSolution(chain);
   }
}

//______________________________________________________________________________
TGeoBatemanSol::TGeoBatemanSol(const TGeoBatemanSol& other)
               :TObject(other), TAttLine(other), TAttFill(other), TAttMarker(other),
                fElem(other.fElem),
                fElemTop(other.fElemTop),
                fCsize(other.fCsize),
                fNcoeff(other.fNcoeff),
                fFactor(other.fFactor),
                fTmin(other.fTmin),
                fTmax(other.fTmax),
                fCoeff(NULL)
{
// Copy constructor.
   if (fCsize) {
      fCoeff = new BtCoef_t[fCsize];
      for (Int_t i=0; i<fNcoeff; i++) {
         fCoeff[i].cn = other.fCoeff[i].cn;
         fCoeff[i].lambda = other.fCoeff[i].lambda;
      }
   }
}

//______________________________________________________________________________
TGeoBatemanSol::~TGeoBatemanSol()
{
// Destructor.
   if (fCoeff) delete [] fCoeff;
}

//______________________________________________________________________________
TGeoBatemanSol& TGeoBatemanSol::operator=(const TGeoBatemanSol& other)
{
// Assignment.
   if (this == &other) return *this;
   TObject::operator=(other);
   TAttLine::operator=(other);
   TAttFill::operator=(other);
   TAttMarker::operator=(other);
   fElem = other.fElem;
   fElemTop = other.fElemTop;
   if (fCoeff) delete [] fCoeff;
   fCoeff = 0;
   fCsize = other.fCsize;
   fNcoeff = other.fNcoeff;
   fFactor = other.fFactor;
   fTmin = other.fTmin;
   fTmax = other.fTmax;
   if (fCsize) {
      fCoeff = new BtCoef_t[fCsize];
      for (Int_t i=0; i<fNcoeff; i++) {
         fCoeff[i].cn = other.fCoeff[i].cn;
         fCoeff[i].lambda = other.fCoeff[i].lambda;
      }
   }
   return *this;
}

//______________________________________________________________________________
TGeoBatemanSol& TGeoBatemanSol::operator+=(const TGeoBatemanSol& other)
{
// Addition of other solution.
   if (other.GetElement() != fElem) {
      Error("operator+=", "Cannot add 2 solutions for different elements");
      return *this;
   }
   Int_t i,j;
   BtCoef_t *coeff = fCoeff;
   Int_t ncoeff = fNcoeff + other.fNcoeff;
   if (ncoeff > fCsize) {
      fCsize = ncoeff;
      coeff = new BtCoef_t[ncoeff];
      for (i=0; i<fNcoeff; i++) {
         coeff[i].cn = fCoeff[i].cn;
         coeff[i].lambda = fCoeff[i].lambda;
      }
      delete [] fCoeff;
      fCoeff = coeff;
   }
   ncoeff = fNcoeff;
   for (j=0; j<other.fNcoeff; j++) {
      for (i=0; i<fNcoeff; i++) {
         if (coeff[i].lambda == other.fCoeff[j].lambda) {
            coeff[i].cn += fFactor * other.fCoeff[j].cn;
            break;
         }
      }
      if (i == fNcoeff) {
         coeff[ncoeff].cn = fFactor * other.fCoeff[j].cn;
         coeff[ncoeff].lambda = other.fCoeff[j].lambda;
         ncoeff++;
      }
   }
   fNcoeff = ncoeff;
   return *this;
}
//______________________________________________________________________________
Double_t TGeoBatemanSol::Concentration(Double_t time) const
{
// Find concentration of the element at a given time.
   Double_t conc = 0.;
   for (Int_t i=0; i<fNcoeff; i++)
      conc += fCoeff[i].cn * TMath::Exp(-fCoeff[i].lambda * time);
   return conc;
}

//______________________________________________________________________________
void TGeoBatemanSol::Draw(Option_t *option)
{
// Draw the solution of Bateman equation versus time.
   if (!gGeoManager) return;
   gGeoManager->GetGeomPainter()->DrawBatemanSol(this, option);
}

//______________________________________________________________________________
void TGeoBatemanSol::FindSolution(const TObjArray *array)
{
// Find the solution for the Bateman equations corresponding to the decay
// chain described by an array ending with element X.
// A->B->...->X
// Cn = SUM [Ain * exp(-LMBDi*t)];
//      Cn    - concentration Nx/Na
//      n     - order of X in chain (A->B->X => n=3)
//      LMBDi - decay constant for element of order i in the chain
//      Ain = LMBD1*...*LMBD(n-1) * br1*...*br(n-1)/(LMBD1-LMBDi)...(LMBDn-LMBDi)
//      bri   - branching ratio for decay Ei->Ei+1
   fNcoeff = 0;
   if (!array || !array->GetEntriesFast()) return;
   Int_t n = array->GetEntriesFast();
   TGeoDecayChannel *dc = (TGeoDecayChannel*)array->At(n-1);
   TGeoElementRN *elem = dc->Daughter();
   if (elem != fElem) {
      Error("FindSolution", "Last element in the list must be %s\n", fElem->GetName());
      return;
   }
   Int_t i,j;
   Int_t order = n+1;
   if (!fCoeff) {
      fCsize = order;
      fCoeff = new BtCoef_t[fCsize];
   }
   if (fCsize < order) {
      delete [] fCoeff;
      fCsize = order;
      fCoeff = new BtCoef_t[fCsize];
   }

   Double_t *lambda = new Double_t[order];
   Double_t *br     = new Double_t[n];
   Double_t halflife;
   for (i=0; i<n; i++) {
      dc = (TGeoDecayChannel*)array->At(i);
      elem = dc->Parent();
      br[i] = 0.01 * dc->BranchingRatio();
      halflife = elem->HalfLife();
      if (halflife==0.) halflife = 1.e-30;
      if (elem->Stable()) lambda[i] = 0.;
      else                lambda[i] = TMath::Log(2.)/halflife;
      if (i==n-1) {
         elem = dc->Daughter();
         halflife = elem->HalfLife();
         if (halflife==0.) halflife = 1.e-30;
         if (elem->Stable()) lambda[n] = 0.;
         else                lambda[n] = TMath::Log(2.)/halflife;
      }
   }
   // Check if we have equal lambdas
   for (i=0; i<order-1; i++) {
      for (j=i+1; j<order; j++) {
         if (lambda[j] == lambda[i]) lambda[j] += 0.001*lambda[j];
      }
   }
   Double_t ain;
   Double_t pdlambda, plambdabr=1.;
   for (j=0; j<n; j++) plambdabr *= lambda[j]*br[j];
   for (i=0; i<order; i++) {
      pdlambda = 1.;
      for (j=0; j<n+1; j++) {
         if (j == i) continue;
         pdlambda *= lambda[j] - lambda[i];
      }
      if (pdlambda == 0.) {
         Error("FindSolution", "pdlambda=0 !!!");
         delete [] lambda;
         delete [] br;
         return;
      }
      ain = plambdabr/pdlambda;
      fCoeff[i].cn = ain;
      fCoeff[i].lambda = lambda[i];
   }
   fNcoeff = order;
   Normalize(fFactor);
   delete [] lambda;
   delete [] br;
}

//______________________________________________________________________________
void TGeoBatemanSol::Normalize(Double_t factor)
{
// Normalize all coefficients with a given factor.
   for (Int_t i=0; i<fNcoeff; i++) fCoeff[i].cn *= factor;
}

//______________________________________________________________________________
void TGeoBatemanSol::Print(Option_t * /*option*/) const
{
// Print concentration evolution.
   TString formula;
   formula.Form("N[%s]/N[%s] = ", fElem->GetName(), fElemTop->GetName());
   for (Int_t i=0; i<fNcoeff; i++) {
      if (i == fNcoeff-1) formula += TString::Format("%g*exp(-%g*t)", fCoeff[i].cn, fCoeff[i].lambda);
      else                formula += TString::Format("%g*exp(-%g*t) + ", fCoeff[i].cn, fCoeff[i].lambda);
   }
   printf("%s\n", formula.Data());
}

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