NAME
    Molecule - Molecule class

SYNOPSIS
    use Molecule;

    use Molecule qw(:all);

DESCRIPTION
    Molecule class provides the following methods:

    new, AddAtom, AddAtoms, AddBond, AddBonds, AddHydrogens,
    AddPolarHydrogens, ClearRings, Copy, DeleteAromaticity, DeleteAtom,
    DeleteAtoms, DeleteBond, DeleteBonds, DeleteHydrogens,
    DeletePolarHydrogens, DetectAromaticity, DetectRings,
    FormatElementalCompositionInformation, GetAllAtomPaths,
    GetAllAtomPathsStartingAt, GetAllAtomPathsStartingAtWithLength,
    GetAllAtomPathsStartingAtWithLengthUpto, GetAllAtomPathsWithLength,
    GetAllAtomPathsWithLengthUpto, GetAromaticRings, GetAromaticityModel,
    GetAtomNeighborhoods, GetAtomNeighborhoodsWithRadiusUpto,
    GetAtomNeighborhoodsWithSuccessorAtoms,
    GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto, GetAtomPathBonds,
    GetAtomPaths, GetAtomPathsBetween, GetAtomPathsStartingAt,
    GetAtomPathsStartingAtWithLength, GetAtomPathsStartingAtWithLengthUpto,
    GetAtomPathsWithLength, GetAtomPathsWithLengthUpto, GetAtoms, GetBonds,
    GetCharge, GetConnectedComponents, GetConnectedComponentsAtoms,
    GetDimensionality, GetElementalComposition, GetElementsAndNonElements,
    GetExactMass, GetFormalCharge, GetFreeRadicalElectrons,
    GetFusedAndNonFusedRings, GetLargestConnectedComponent,
    GetLargestConnectedComponentAtoms, GetLargestRing, GetMolecularFormula,
    GetMolecularWeight, GetNumOfAromaticRings, GetNumOfAtoms, GetNumOfBonds,
    GetNumOfConnectedComponents, GetNumOfElementsAndNonElements,
    GetNumOfHeavyAtoms, GetNumOfHydrogenAtoms, GetNumOfMissingHydrogenAtoms,
    GetNumOfNonHydrogenAtoms, GetNumOfRings, GetNumOfRingsWithEvenSize,
    GetNumOfRingsWithOddSize, GetNumOfRingsWithSize,
    GetNumOfRingsWithSizeGreaterThan, GetNumOfRingsWithSizeLessThan,
    GetRingBonds, GetRingBondsFromRings, GetRings, GetRingsWithEvenSize,
    GetRingsWithOddSize, GetRingsWithSize, GetRingsWithSizeGreaterThan,
    GetRingsWithSizeLessThan, GetSizeOfLargestRing, GetSizeOfSmallestRing,
    GetSmallestRing, GetSpinMultiplicity, GetSupportedAromaticityModels,
    GetTopologicallySortedAtoms, GetValenceModel, HasAromaticAtomsInRings,
    HasAromaticAtomsNotInRings, HasAromaticRings, HasAtom, HasBond,
    HasFusedRings, HasNoRings, HasOnlyOneRing, HasRings, IsAromatic,
    IsMolecule, IsRingAromatic, IsSupportedAromaticityModel,
    IsThreeDimensional, IsTwoDimensional, KeepLargestComponent,
    KekulizeAromaticAtoms, NewAtom, NewBond, SetActiveRings,
    SetAromaticityModel, SetID, SetValenceModel, StringifyMolecule

    The following methods can also be used as functions:

    FormatElementalCompositionInformation, IsMolecule

    Molecule class is derived from ObjectProperty base class which provides
    methods not explicitly defined in Molecule or ObjectProperty class using
    Perl's AUTOLOAD functionality. These methods are generated on-the-fly
    for a specified object property:

        Set<PropertyName>(<PropertyValue>);
        $PropertyValue = Get<PropertyName>();
        Delete<PropertyName>();

  METHODS
    new
            $NewMolecule = new Molecule([%PropertyNameAndValues]);

        Using specified *Atom* property names and values hash, new method
        creates a new object and returns a reference to newly created Atom
        object. By default, the following properties are initialized:

            ID = SequentialObjectID
            Name = "Molecule <SequentialObjectID>"

        Examples:

            $Molecule = new Molecule();

            $WaterMolecule = new Molecule('Name' => 'Water');

            $Oxygen = new Atom('AtomSymbol' => 'O', 'XYZ' => [0, 0, 0]);
            $Hydrogen1 = new Atom('AtomSymbol' => 'H',
                                  'XYZ' => [0.7144, 0.4125, 0]);
            $Hydrogen2 = new Atom('AtomSymbol' => 'H',
                                  'XYZ' => [1.1208, -0.2959, 0]);
            $WaterMolecule->AddAtoms($Oxygen, $Hydrogen1, $Hydrogen2);

            $Bond1 = new Bond('Atoms' => [$Oxygen, $Hydrogen1],
                              'BondOrder' => 1);
            $Bond2 = new Bond('Atoms' => [$Oxygen, $Hydrogen2],
                              'BondOrder' => 1);
            $WaterMolecule->AddBonds($Bond1, $Bond2);

    AddAtom
            $Molecule->AddAtom($Atom);

        Adds an *Atom* to a *Molecule* and returns *Molecule*.

    AddAtoms
            $Molecule->AddAtoms(@Atoms);

        Adds *Atoms* to a *Molecule* and returns *Molecule*.

    AddBond
            $Molecule->AddBond($Bond);

        Adds a *Bond* to a *Molecule* and returns *Molecule*.

    AddBonds
            $Molecule->AddBonds(@Bonds);

        Adds *Bonds* to a *Molecule* and returns *Molecule*.

    AddHydrogens
            $NumOfHydrogensAdded = $Molecule->AddHydrogens();

        Adds hydrogens to each atom in a *Molecule* and returns total number
        of hydrogens added. The current release of MayaChemTools doesn't
        assign hydrogen positions.

    AddPolarHydrogens
            $NumOfHydrogensAdded = $Molecule->AddPolarHydrogens();

        Adds hydrogens to each polar atom - N, O, P or S - in a *Molecule*
        and returns total number of polar hydrogens added. The current
        release of MayaChemTools doesn't assign hydrogen positions.

    ClearRings
            $Molecule->ClearRings();

        Deletes all rings associated with *Molecule* and returns *Molecule*.

    Copy
            $MoleculeCopy = $Molecule->Copy();

        Copies *Molecule* and its associated data using Storable::dclone and
        returns a new Molecule object.

    DeleteAromaticity
            $Molecule->DeleteAromaticity();

        Deletes aromatic property associated with all atoms and bonds in a
        *Molecule* and returns *Molecule*.

    DeleteAtom
            $Molecule->DeleteAtom($Atom);

        Deletes *Atom* from a *Molecule* and returns *Molecule*.

    DeleteAtoms
            $Molecule->DeleteAtoms(@Atoms);

        Deletes *Atoms* from a *Molecule* and returns *Molecule*.

    DeleteBond
            $Molecule->DeleteBond($Bond);

        Deletes *Bond* from a *Molecule* and returns *Molecule*.

    DeleteBonds
            $Molecule->DeleteBonds(@Bonds);

        Deletes *Bonds* from a *Molecule* and returns *Molecule*.

    DeleteHydrogens
            $NumOfHydrogensDeleted = $Molecule->DeleteHydrogens();

        Removes hydrogens from each atom in a *Molecule* and returns total
        number of hydrogens deleted.

    DeletePolarHydrogens
            $NumOfHydrogensDeleted = $Molecule->DeletePolarHydrogens();

        Removes hydrogens to each polar atom - N, O, P or S - in a
        *Molecule* and returns total number of polar hydrogens deleted.

    DetectAromaticity
            $Molecule->DetectAromaticity();

        Associates *Aromatic* property to atoms and bonds involved in
        aromatic rings or ring systems in a *Molecule* and returns
        *Molecule*.

        This method assumes the ring detection has already been perfomed
        using DetectRings. And any existing *Aromatic* property associated
        with atoms and bonds is deleted before performing aromaticity
        detection.

        What is aromaticity? [ Ref 124 ] It's in the code of the
        implementer, did you say? Agree. The implementation of aromaticity
        varies widely across different packages [ Ref 125 ]; additionally,
        the implementation details are not always completely available, and
        it's not possible to figure out the exact implementation of
        aromaticity across various packages. Using the publicly available
        information, however, one can try to reproduce the available results
        to the extent possible, along with parameterizing all the control
        parameters used to implement different aromaticity models, and
        that's exactly what the current release of MayaChemTools does.

        The implementation of aromaticity corresponding to various
        aromaticity models in MayaChemTools package is driven by an external
        CSV file AromaticityModelsData.csv, which is distributed with the
        package and is available in lib/data directory. The CSV files
        contains names of supported aromaticity models, along with various
        control parameters and their values. This file is loaded and
        processed during instantiation of Molecule class and data
        corresponding to specific aromaticity model are used to detect
        aromaticity for that model. Any new aromaticity model added to the
        aromaticity data file, using different combinations of values for
        existing control parameters, would work without any changes to the
        code; the addition of any new control parameters, however, requires
        its implementation in the code used to calculate number of pi
        electrons available towards delocalization in a ring or ring
        systems.

        The current release of MayaChemTools package supports these
        aromaticity models: MDLAromaticityModel, TriposAromaticityModel,
        MMFFAromaticityModel, ChemAxonBasicAromaticityModel,
        ChemAxonGeneralAromaticityModel, DaylightAromaticityModel,
        MayaChemToolsAromaticityModel.

        The current list of control parameters available to detect
        aromaticity corresponding to different aromaticity models are:
        AllowHeteroRingAtoms, HeteroRingAtomsList,
        AllowExocyclicDoubleBonds, AllowHomoNuclearExocyclicDoubleBonds,
        AllowElectronegativeRingAtomExocyclicDoubleBonds,
        AllowRingAtomFormalCharge, AllowHeteroRingAtomFormalCharge,
        MinimumRingSize. The values for these control parameters are
        specified in AromaticityModelsData.csv file.

        Although definition of aromaticity differs across various
        aromaticity models, a ring or a ring system containing 4n + 2 pi
        electrons (Huckel's rule) corresponding to alternate single and
        double bonds, in general, is considered aromatic.

        The available valence free electrons on heterocyclic ring atoms,
        involved in two single ring bonds, are also allowed to participate
        in pi electron delocalizaiton for most of the supported aromaticity
        models.

        The presence of exocyclic terminal double bond on ring atoms
        involved in pi electron delocalization is only allowed for some of
        the aromaticity models. Additionally, the type atoms involved in
        exocyclic terminal double bonds may result in making a ring or ring
        system non-aromatic.

        For molecules containing fused rings, each fused ring set is
        considered as one aromatic system for counting pi electrons to
        satisfy Huckel's rule; In case of a failure, rings in fused set are
        treated individually for aromaticity detection. Additionally,
        non-fused rings are handled on their own during aromaticity
        detection.

    DetectRings
            $Molecule->DetectRings();

        Detects rings in a *Molecule* and returns *Molecule*. Ring detection
        is performed using DetectCycles method avaible in Graph class which
        in turn uses methods available Graph::CyclesDetection class.
        Graph::CyclesDetection class implements collapsing path graph [Ref
        31] methodology to detect all cycles in a graph.

    FormatElementalCompositionInformation
            $FormattedInfo = $Molecule->FormatElementalCompositionInformation(
                             $ElementsRef, $ElementCompositionRef,
                             [$Precision]);
            $FormattedInfo = Molecule::FormatElementalCompositionInformation(
                             $ElementsRef, $ElementCompositionRef,
                             [$Precision]);

        Using *ElementsRef* and *ElementCompositionRef* arrays referneces
        containg informatio about elements and their composition, formats
        elemental composition information and returns a *FormattedInfo*
        string. Defaule *Precision* value: *2*.

    GetAromaticityModel
            $AromaticityModel = $Molecule->GetAromaticityModel();

        Returns name of AromaticityModel set for *Molecule* corresponding to
        AromaticityModel property or default model name of
        MayaChemToolsAromaticityModel.

    GetAllAtomPaths
            $AtomPathsRef = $Molecule->GetAllAtomPaths([$AllowCycles]);

        Returns all paths as a reference to an array containing reference to
        arrays with path Atom objects.

        Path atoms correspond to to all possible paths for each atom in
        molecule with all possible lengths and sharing of bonds in paths
        traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

        For molecule without any rings, this method returns the same set of
        atom paths as GetAtomPaths method.

    GetAllAtomPathsStartingAt
            $AtomPathsRef = $Molecule->GetAllAtomPathsStartingAt($StartAtom,
                            [$AllowCycles]);

        Returns all atom paths starting from *StartAtom* as a reference to
        an array containing reference to arrays with path Atom objects.

        Path atoms atoms correspond to to all possible paths for specified
        atom in molecule with all possible lengths and sharing of bonds in
        paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

        For molecule without any rings, this method returns the same set of
        atom paths as GetAtomPathsStartingAt method.

    GetAllAtomPathsStartingAtWithLength
            $AtomPathsRef = $Molecule->GetAllAtomPathsStartingAtWithLength(
                            $StartAtom, $Length, [$AllowCycles]);

        Returns all atom paths starting from *StartAtom* with specified
        *Length*as a reference to an array containing reference to arrays
        with path Atom objects.

        Path atoms atoms correspond to to all possible paths for specified
        atom in molecule with all possible lengths and sharing of bonds in
        paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

        For molecule without any rings, this method returns the same set of
        atom paths as GetAtomPathsStartingAtWithLength method.

    GetAllAtomPathsStartingAtWithLengthUpto
            $AtomPathsRef = $Molecule->GetAllAtomPathsStartingAtWithLengthUpto(
                            $StartAtom, $Length, [$AllowCycles]);

        Returns atom paths starting from *StartAtom* with length up to
        *Length* as a reference to an array containing reference to arrays
        with path Atom objects.

        Path atoms atoms correspond to all possible paths for specified atom
        in molecule with length up to a specified length and sharing of
        bonds in paths traversed. By default, rings are included in paths. A
        path containing a ring is terminated at an atom completing the ring.

        For molecule without any rings, this method returns the same set of
        atom paths as *GetAtomPathsStartingAtWithLengthUpto* method.

    GetAllAtomPathsWithLength
            $AtomPathsRef = $Molecule->GetAllAtomPathsWithLength($Length,
                            [$AllowCycles]);

        Returns all atom paths with specified *Length* as a reference to an
        array containing reference to arrays with path Atom objects.

        Path atoms correspond to to all possible paths for each atom in
        molecule with length up to a specified length and sharing of bonds
        in paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

        For molecule without any rings, this method returns the same set of
        atom paths as as *GetAtomPathsWithLength* method.

    GetAllAtomPathsWithLengthUpto
            $AtomPathsRef = $Molecule->GetAllAtomPathsWithLengthUpto($Length,
                            [$AllowCycles]);

        Returns all atom paths with length up to *Length* as a reference to
        an array containing reference to arrays with path Atom objects.

        Path atoms correspond to to all possible paths for each atom in
        molecule with length up to a specified length and sharing of bonds
        in paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

        For molecule without any rings, this method returns the same set of
        atom paths as as *GetAtomPathsWithLengthUpto* method.

    GetAromaticRings
            @AtomaticRings = $Molecule->GetAromaticRings();

        Returns aromatic rings as an array containing references to arrays
        of ring *Atom* objects in a *Molecule*.

    GetAtomNeighborhoods
            @Neighborhoods = $Molecule->GetAtomNeighborhoods($StartAtom);

        Returns atom neighborhoods around a *StartAtom* as an array
        containing references to arrays with neighborhood *Atom* objects at
        possible radii.

    GetAtomNeighborhoodsWithRadiusUpto
            @Neighborhoods = $Molecule->GetAtomNeighborhoodsWithRadiusUpto($StartAtom,
                             $Radius);

        Returns atom neighborhoods around a *StartAtom* as an array
        containing references to arrays with neighborhood *Atom* objects up
        to *Radius*.

    GetAtomNeighborhoodsWithSuccessorAtoms
            @Neighborhoods = $Molecule->GetAtomNeighborhoodsWithSuccessorAtoms(
                             $StartAtom);

        Returns atom neighborhood around a specified *StartAtom*, along with
        their successor connected atoms, collected at all radii as an array
        containing references to arrays with first value corresponding to
        neighborhood atom at a specific radius and second value as reference
        to an array containing its successor connected atoms.

        For a neighborhood atom at each radius level, the successor
        connected atoms correspond to the neighborhood atoms at the next
        radius level. Consequently, the neighborhood atoms at the last
        radius level don't contain any successor atoms which fall outside
        the range of specified radius.

    GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto
            @Neighborhoods = $Molecule->GetAtomNeighborhoodsWithSuccessorAtomsAndRadiusUpto(
                             $StartAtom, $Radius);

        Returns atom neighborhood around a specified *StartAtom*, along with
        their successor connected atoms, collected upto specified *Radiud*
        as an array containing references to arrays with first value
        corresponding to neighborhood atom at a specific radius and second
        value as reference to an array containing its successor connected
        atoms.

        For a neighborhood atom at each radius level, the successor
        connected atoms correspond to the neighborhood atoms at the next
        radius level. Consequently, the neighborhood atoms at the last
        radius level don't contain any successor atoms which fall outside
        the range of specified radius.

    GetAtomPathBonds
            $Return = $Molecule->GetAtomPathBonds(@PathAtoms);

        Returns an array containing Bond objects corresponding to successive
        pair of atoms in *PathAtoms*

    GetAtomPaths
            $AtomPathsRef = $Molecule->GetAtomPaths([$AllowCycles]);

        Returns all paths as a reference to an array containing reference to
        arrays with path Atom objects.

        Path atoms correspond to to all possible paths for each atom in
        molecule with all possible lengths and no sharing of bonds in paths
        traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

    GetAtomPathsBetween
            $AtomPathsRef = $Molecule->GetAtomPathsBetween($StartAtom, $EndAtom);

        Returns all paths as between *StartAtom* and *EndAtom* as a
        reference to an array containing reference to arrays with path Atom
        objects.

        For molecules with rings, atom paths array contains may contain two
        paths.

    GetAtomPathsStartingAt
            $AtomPathsRef = $Molecule->GetAtomPathsStartingAt($StartAtom, [$AllowCycles]);

        Returns paths starting at *StartAtom* as a reference to an array
        containing reference to arrays with path Atom objects.

        Path atoms correspond to all possible paths for specified atom in
        molecule with all possible lengths and no sharing of bonds in paths
        traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

    GetAtomPathsStartingAtWithLength
            $AtomPathsRef = $Molecule->GetAtomPathsStartingAtWithLength($StartAtom,
                            $Length, [$AllowCycles]);

        Returns paths starting at *StartAtom* with length *Length* as a
        reference to an array containing reference to arrays with path Atom
        objects.

        Path atoms correspond to all possible paths for specified atom in
        molecule with length upto a specified length and no sharing of bonds
        in paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

    GetAtomPathsStartingAtWithLengthUpto
            $AtomPathsRef = $Molecule->GetAtomPathsStartingAtWithLengthUpto($StartAtom,
                            $Length, [$AllowCycles]);

        Returns paths starting at *StartAtom* with length up to *Length* as
        a reference to an array containing reference to arrays with path
        Atom objects.

        Path atoms correspond to all possible paths for specified atom in
        molecule with length upto a specified length and no sharing of bonds
        in paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

    GetAtomPathsWithLength
            $AtomPathsRef = $Molecule->GetAtomPathsWithLength($Length, [$AllowCycles]);

        Returns all paths with specified *Length* as a reference to an array
        containing reference to arrays with path Atom objects.

        Path atoms correspond to all possible paths for each atom in
        molecule with length upto a specified length and no sharing of bonds
        in paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

    GetAtomPathsWithLengthUpto
            $AtomPathsRef = $Molecule->GetAtomPathsWithLengthUpto($Length, [$AllowCycles]);

        Returns all paths with length up to *Length* as a reference to an
        array containing reference to arrays with path Atom objects.

        Path atoms correspond to all possible paths for each atom in
        molecule with length upto a specified length and no sharing of bonds
        in paths traversed. By default, rings are included in paths. A path
        containing a ring is terminated at an atom completing the ring.

    GetAtoms
            @AllAtoms = $Molecule->GetAtoms();
            @PolarAtoms = $Molecule->GetAtoms('IsPolarAtom');

            $NegateMethodResult = 1;
            @NonHydrogenAtoms = $Molecule->GetAtoms('IsHydrogenAtom',
                                $NegateMethodResult);

            $AtomsCount = $Molecule->GetAtoms();

        Returns an array of *Atoms* in a *Molecule*. In scalar context, it
        returns number of atoms. Additionally, Atoms array can be filtered
        by any user specifiable valid Atom class method and the result of
        the Atom class method used to filter the atoms can also be negated
        by an optional negate results flag as third parameter.

    GetBonds
            @Bonds = $Molecule->GetBonds();
            $BondsCount = $Molecule->GetBonds();

        Returns an array of *Bonds* in a *Molecule*. In scalar context, it
        returns number of bonds.

    GetCharge
            $Charge = $Molecule->GetCharge();

        Returns net charge on a *Molecule* using one of the following two
        methods: explicitly set Charge property or sum of partial atomic
        charges on each atom.

    GetConnectedComponents
            @ConnectedComponents = $Molecule->GetConnectedComponents();

        Returns a reference to an array containing *Molecule* objects
        corresponding to connected components sorted in decreasing order of
        component size in a *Molecule*.

    GetConnectedComponentsAtoms
            @ConnectedComponentsAtoms =
              $Molecule->GetConnectedComponentsAtoms();

        Returns an array containing references to arrays with *Atom* objects
        corresponding to atoms of connected components sorted in order of
        component decreasing size in a *Molecule*.

    GetDimensionality
            $Dimensionality = $Molecule->GetDimensionality();

        Returns *Dimensionality* of a *Molecule* corresponding to explicitly
        set *Dimensionality* property value or by processing atomic.

        The *Dimensionality* value from atomic coordinates is calculated as
        follows:

            3D - Three dimensional: One of X, Y or Z coordinate is non-zero
            2D - Two dimensional: One of X or Y coordinate is non-zero; All Z
                 coordinates are zero
            0D - Zero dimensional: All atomic coordinates are zero

    GetElementalComposition
            ($ElementsRef, $CompositionRef) =
              $Molecule->GetElementalComposition([$IncludeMissingHydrogens]);

        Calculates elemental composition and returns references to arrays
        containing elements and their percent composition in a *Molecule*.
        By default, missing hydrogens are included during the calculation.

    GetElementsAndNonElements
            ($ElementsRef, $NonElementsRef) =
             $Molecule->GetElementsAndNonElements([$IncludeMissingHydrogens]);

        Counts elements and non-elements in a *Molecule* and returns
        references to hashes containing element and non-element as hash keys
        with values corresponding to their count. By default, missing
        hydrogens are not added to the element hash.

    GetExactMass
            $ExactMass = $Molecule->GetExactMass();

        Returns exact mass of a *Molecule* corresponding to sum of exact
        masses of all the atoms.

    GetFormalCharge
            $FormalCharge = $Molecule->GetFormalCharge();

        Returns net formal charge on a *Molecule* using one of the following
        two methods: explicitly set FormalCharge property or sum of formal
        charges on each atom.

        FormalCharge is different from Charge property of the molecule which
        corresponds to sum of partial atomic charges explicitly set for each
        atom using a specific methodology.

    GetFreeRadicalElectrons
            $FreeRadicalElectrons = $Molecule->GetFreeRadicalElectrons();

        Returns total number of free radical electrons available in a
        *Molecule* using one of the following two methods: explicitly set
        FreeRadicalElectrons property or sum of available free radical
        electrons on each atom.

    GetFusedAndNonFusedRings
            ($FusedRingSetRef, $NonFusedRingsRef) =
               $Molecule->GetFusedAndNonFusedRings();

        Returns references to array of fused ring sets and non-fused rings
        in a *Molecule*. Fused ring sets array reference contains refernces
        to arrays of rings corresponding to ring *Atom* objects; Non-fused
        rings array reference contains references to arrays of ring *Atom*
        objects.

    GetLargestConnectedComponent
            $ComponentMolecule = $Molecule->GetLargestConnectedComponent();

        Returns a reference to Molecule object corresponding to a largest
        connected component in a *Molecule*.

    GetLargestConnectedComponentAtoms
            @ComponentAtoms = $Molecule->GetLargestConnectedComponentAtoms();

        Returns a reference to an array of Atom objects corresponding to a
        largest connected component in a *Molecule*.

    GetLargestRing
            @RingAtoms = $Molecule->GetLargestRing();

        Returns an array of *Atoms* objects corresponding to a largest ring
        in a *Molecule*.

    GetMolecularFormula
            $FormulaString = $Molecule->GetMolecularFormula(
                             [$IncludeMissingHydrogens,
                             $IncludeNonElements]);

        Returns molecular formula of a *Molecule* by collecting information
        about all atoms in the molecule and composing the formula using
        Hills ordering system:

            o C shows up first and H follows assuming C is present.
            o All other standard elements are sorted alphanumerically.
            o All other non-stanard atom symbols are also sorted
              alphanumerically and follow standard elements.

        Notes:

            o By default, missing hydrogens and nonelements are also included.
            o Elements for disconnected fragments are combined into the same
              formula.
            o Formal charge is also used during compoisiton of molecular formula.

    GetMolecularWeight
            $MolWeight = $Molecule->GetMolecularWeight();

        Returns molecular weight of a *Molecule* corresponding to sum of
        atomic weights of all the atoms.

    GetNumOfAromaticRings
            $NumOfAromaticRings = $Molecule->GetNumOfAromaticRings();

        Returns number of aromatic rings in a *Molecule*.

    GetNumOfAtoms
            $NumOfAtoms = $Molecule->GetNumOfAtoms();

        Returns number of atoms in a *Molecule*.

    GetNumOfBonds
            $NumOfBonds = $Molecule->GetNumOfBonds();

        Returns number of bonds in a *Molecule*.

    GetNumOfConnectedComponents
            $NumOfComponents = $Molecule->GetNumOfConnectedComponents();

        Returns number of connected components in a *Molecule*.

    GetNumOfElementsAndNonElements
            ($NumOfElements, $NumOfNonElements) = $Molecule->
                                      GetNumOfElementsAndNonElements();
            ($NumOfElements, $NumOfNonElements) = $Molecule->
                           GetNumOfElementsAndNonElements($IncludeMissingHydrogens);

        Returns number of elements and non-elements in a *Molecule*. By
        default, missing hydrogens are not added to element count.

    GetNumOfHeavyAtoms
            $NumOfHeavyAtoms = $Molecule->GetNumOfHeavyAtoms();

        Returns number of heavy atoms, non-hydrogen atoms, in a *Molecule*.

    GetNumOfHydrogenAtoms
            $NumOfHydrogenAtoms = $Molecule->GetNumOfHydrogenAtoms();

        Returns number of hydrogen atoms in a *Molecule*.

    GetNumOfMissingHydrogenAtoms
            $NumOfMissingHydrogenAtoms = $Molecule->GetNumOfMissingHydrogenAtoms();

        Returns number of hydrogen atoms in a *Molecule*.

    GetNumOfNonHydrogenAtoms
            $NumOfNonHydrogenAtoms = $Molecule->GetNumOfNonHydrogenAtoms();

        Returns number of non-hydrogen atoms in a *Molecule*.

    GetNumOfRings
            $RingCount = $Molecule->GetNumOfRings();

        Returns number of rings in a *Molecule*.

    GetNumOfRingsWithEvenSize
            $RingCount = $Molecule->GetNumOfRingsWithEvenSize();

        Returns number of rings with even size in a *Molecule*.

    GetNumOfRingsWithOddSize
            $RingCount = $Molecule->GetNumOfRingsWithOddSize();

        Returns number of rings with odd size in a *Molecule*.

    GetNumOfRingsWithSize
            $RingCount = $Molecule->GetNumOfRingsWithSize($Size);

        Returns number of rings with *Size* in a *Molecule*.

    GetNumOfRingsWithSizeGreaterThan
            $RingCount = $Molecule->GetNumOfRingsWithSizeGreaterThan($Size);

        Returns number of rings with size greater than *Size* in a
        *Molecule*.

    GetNumOfRingsWithSizeLessThan
            $RingCount = $Molecule->GetNumOfRingsWithSizeLessThan($Size);

        Returns number of rings with size less than *Size* in a *Molecule*.

    GetRingBonds
            @RingBonds = $Molecule->GetRingBonds(@RingAtoms);

        Returns an array of ring Bond objects correponding to an array of
        ring *Atoms* in a *Molecule*.

    GetRingBondsFromRings
            @RingBondsSets = $Molecule->GetRingBondsFromRings(@RingAtomsSets);

        Returns an array containing references to arrays of ring Bond
        objects for rings specified in an array of references to ring *Atom*
        objects.

    GetRings
            @Rings = $Molecule->GetRings();

        Returns rings as an array containing references to arrays of ring
        *Atom* objects in a *Molecule*.

    GetRingsWithEvenSize
            @Rings = $Molecule->GetRingsWithEvenSize();

        Returns even size rings as an array containing references to arrays
        of ring *Atom* objects in a *Molecule*.

    GetRingsWithOddSize
            @Rings = $Molecule->GetRingsWithOddSize();

        Returns odd size rings as an array containing references to arrays
        of ring *Atom* objects in a *Molecule*.

    GetRingsWithSize
            @Rings = $Molecule->GetRingsWithSize($Size);

        Returns rings with *Size* as an array containing references to
        arrays of ring *Atom* objects in a *Molecule*.

    GetRingsWithSizeGreaterThan
            @Rings = $Molecule->GetRingsWithSizeGreaterThan($Size);

        Returns rings with size greater than *Size* as an array containing
        references to arrays of ring *Atom* objects in a *Molecule*.

    GetRingsWithSizeLessThan
            @Rings = $Molecule->GetRingsWithSizeLessThan($Size);

        Returns rings with size less than *Size* as an array containing
        references to arrays of ring *Atom* objects in a *Molecule*.

    GetSizeOfLargestRing
            $Size = $Molecule->GetSizeOfLargestRing();

        Returns size of the largest ring in a *Molecule*.

    GetSizeOfSmallestRing
            $Size = $Molecule->GetSizeOfSmallestRing();

        Returns size of the smalles ring in a *Molecule*.

    GetSmallestRing
            @RingAtoms = $Molecule->GetSmallestRing();

        Returns an array containing *Atom* objects corresponding to the
        smallest ring in a *Molecule*.

    GetSpinMultiplicity
            $SpinMultiplicity = $Molecule->GetSpinMultiplicity();

        Returns net spin multiplicity of a *Molecule* using one of the
        following two methods: explicitly set SpinMultiplicity property or
        sum of spin multiplicity on each atom.

    GetSupportedAromaticityModels
            @SupportedModels = $Molecule->GetSupportedAromaticityModels();

        Returns an array containing a list of supported aromaticity models.

    GetValenceModel
            $ValenceModel = $Molecule->GetValenceModel();

        Returns valence model for *Molecule* using one of the following two
        methods: explicitly set ValenceModel property or defaul value of
        *InternalValenceModel*.

    GetTopologicallySortedAtoms
            @SortedAtoms = $Molecule->GetTopologicallySortedAtoms([$StartAtom]);

        Returns an array of topologically sorted *Atom* objects starting
        from *StartAtom* or an arbitrary atom in a *Molecule*.

    HasAromaticRings
            $Status = $Molecule->HasAromaticRings();

        Returns 1 or 0 based on whether any aromatic ring is present in a
        *Molecule*.

    HasAromaticAtomsInRings
            $Status = $Molecule->HasAromaticAtomsInRings();

        Returns 1 or 0 based on whether any aromatic ring atom is present in
        a *Molecule*.

    HasAromaticAtomsNotInRings
            $Status = $Molecule->HasAromaticAtomsNotInRings();

        Returns 1 or 0 based on whether any non-ring atom is marked aromatic
        in a *Molecule*.

    HasAtom
            $Status = $Molecule->HasAtom($Atom);

        Returns 1 or 0 based on whether *Atom* is present in a *Molecule*.

    HasBond
            $Status = $Molecule->HasBond($Bond);

        Returns 1 or 0 based on whether *Bond* is present in a *Molecule*.

    HasFusedRings
            $Status = $Molecule->HasFusedRings();

        Returns 1 or 0 based on whether any fused rings set is present in a
        *Molecule*.

    HasNoRings
            $Status = $Molecule->HasNoRings();

        Returns 0 or 1 based on whether any ring is present in a *Molecule*.

    HasOnlyOneRing
            $Status = $Molecule->HasOnlyOneRing();

        Returns 1 or 0 based on whether only one ring is present in a
        *Molecule*.

    HasRings
            $Status = $Molecule->HasRings();

        Returns 1 or 0 based on whether rings are present in a *Molecule*.

    IsAromatic
            $Status = $Molecule->IsAromatic();

        Returns 1 or 0 based on whether *Molecule* is aromatic.

    IsMolecule
            $Status = Molecule::IsMolecule();

        Returns 1 or 0 based on whether *Object* is a Molecule object.

    IsRingAromatic
            $Status = $Molecule->IsRingAromatic(@RingAtoms);

        Returns 1 or 0 based on whether all *RingAtoms* are aromatic.

    IsSupportedAromaticityModel
            $Status = $Molecule->IsSupportedAromaticityModel($AromaticityModel);
            $Status = Molecule::IsSupportedAromaticityModel($AromaticityModel);

        Returns 1 or 0 based on whether specified *AromaticityModel* is
        supported.

    IsTwoDimensional
            $Status = $Molecule->IsTwoDimensional();

        Returns 1 or 0 based on whether any atom in *Molecule* has a
        non-zero value for X or Y coordinate and all atoms have zero value
        for Z coordinates.

    IsThreeDimensional
            $Status = $Molecule->IsThreeDimensional();

        Returns 1 or 0 based on whether any atom in *Molecule* has a
        non-zero value for Z coordinate.

    KeepLargestComponent
            $Molecule->KeepLargestComponent();

        Deletes atoms corresponding to all other connected components Except
        for the largest connected component in a *Molecule* and returns
        *Molecule*.

    KekulizeAromaticAtoms
            $Status = $Molecule->KekulizeAromaticAtoms();

        Kekulize marked ring and non-ring aromatic atoms in a molecule and
        return 1 or 1 based on whether the kekulization succeeded.

    NewAtom
            $NewAtom = $Molecule->NewAtom(%AtomPropertyNamesAndValues);

        Creates a new atom using *AtomPropertyNamesAndValues*, add its to
        *Molecule*, and returns new Atom object.

    NewBond
            $NewBond = $Molecule->NewBond(%BondPropertyNamesAndValues);

        Creates a new bond using *AtomPropertyNamesAndValues*, add its to
        *Molecule*, and returns new Bond object.

    SetActiveRings
            $Molecule->SetActiveRings($RingsType);

        Sets up type of detected ring sets to use during all ring related
        methods and returns *Molecule*. Possible *RingType* values:
        *Independent or All*. By default, *Independent* ring set is used
        during all ring methods.

    SetAromaticityModel
            $Molecule = $Molecule->SetAromaticityModel($AromaticityModel);

        Sets up *AromaticityModel* property value for *Molecule* and
        retrurns *Molecule*.

    SetValenceModel
            $Molecule = $Molecule->SetValenceModel(ValenceModel);

        Sets up *ValenceModel* property value for *Molecule* and retrurns
        *Molecule*.

    StringifyMolecule
            $MoleculeString = $Molecule->StringifyMolecule();

        Returns a string containing information about *Molecule* object

AUTHOR
    Manish Sud <msud@san.rr.com>

SEE ALSO
    Atom.pm, Bond.pm, MoleculeFileIO.pm, MolecularFormula.pm

COPYRIGHT
    Copyright (C) 2018 Manish Sud. All rights reserved.

    This file is part of MayaChemTools.

    MayaChemTools is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 3 of the License, or (at
    your option) any later version.

