    // @(#)root/geom:$Name:  $:$Id: TGeoElement.cxx,v 1.4 2004/07/05 08:52:35 brun Exp $
    // 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.             *
     *************************************************************************/

    ////////////////////////////////////////////////////////////////////////////////
    // Full description with examples and pictures
    //
    //
    //
    //
    #include"TObjArray.h"
    #include"TGeoElement.h"

    // statics and globals

    ClassImp(TGeoElement)

    //______________________________________________________________________________
     TGeoElement::TGeoElement()
    {
    // Default constructor
       SetDefined(kFALSE);
       SetUsed(kFALSE);
       fZ = 0;
       fA = 0.0;
    }

    //______________________________________________________________________________
     TGeoElement::TGeoElement(const char *name, const char *title, Int_t z, Double_t a)
                :TNamed(name, title)
    {
    // Constructor
       SetDefined(kFALSE);
       SetUsed(kFALSE);
       fZ = z;
       fA = a;
    }

    ClassImp(TGeoElementTable)

    //______________________________________________________________________________
     TGeoElementTable *TGeoElement::GetElementTable() const
    {
       return TGeoElementTable::Instance();
    }

    TGeoElementTable *TGeoElementTable::fgInstance = 0;

    //______________________________________________________________________________
    TGeoElementTable::TGeoElementTable()
    {
    // default constructor
       fNelements = 0;
       fList      = 0;
       if (fgInstance) Error("ctor", "Element table already instantiated");
       else fgInstance = this;
    }

    //______________________________________________________________________________
    TGeoElementTable::TGeoElementTable(Int_t /*nelements*/)
    {
    // constructor
       fNelements = 0;
       fList = new TObjArray(128);
       if (fgInstance) {
          Error("ctor", "Element table already instantiated");
       } else {
          fgInstance = this;
          BuildDefaultElements();
       }
    }

    //______________________________________________________________________________
    TGeoElementTable::~TGeoElementTable()
    {
    // destructor
       if (fList) {
          fList->Delete();
          delete fList;
       }
       fgInstance = 0;
    }

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

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

    //______________________________________________________________________________
    TGeoElement *TGeoElementTable::FindElement(const char *name)
    {
    // Search an element by symbol or full name
       TString s(name);
       s.ToUpper();
       TGeoElement *elem;
       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;
    }