Beispiel #1
0
def GenerateMACCS166KeysFingerprints(Mols):
    """Generate MACCS166Keys fingerprints."""

    MiscUtil.PrintInfo("\nGenerating MACCS166Keys fingerprints...")

    # Generate ExplicitBitVect fingerprints...
    MolsFingerprints = [
        rdMolDescriptors.GetMACCSKeysFingerprint(Mol) for Mol in Mols
    ]

    return MolsFingerprints
def SetupContoursInfo():
    """Setup contour info for generating contour plots."""

    MiscUtil.PrintInfo(
        "\nProcessing phi and psi densities for contour plots...")

    OptionsInfo["PlotTypesInfo"]["PhiPsiContourInfo"] = {}
    for PlotType in OptionsInfo["PlotTypesInfo"]["Types"]:
        PhiPsiContourInfo = SetupPhiAndPsiContourInfo(PlotType)
        OptionsInfo["PlotTypesInfo"]["PhiPsiContourInfo"][
            PlotType] = PhiPsiContourInfo
def ProcessMoleculesUsingSingleProcess(Mols, GroupsPatternMols, Writer,
                                       GroupOutfilesWriters):
    """Process and search molecules using a single process."""

    MiscUtil.PrintInfo("\nSearching functional groups...")

    Compute2DCoords = OptionsInfo["OutfileParams"]["Compute2DCoords"]
    CombineMatchResults = OptionsInfo["CombineMatchResults"]
    SetSMILESMolProps = OptionsInfo["OutfileParams"]["SetSMILESMolProps"]

    GroupsPatternsMatchCountList = [0] * len(
        OptionsInfo["SpecifiedFunctionalGroups"])
    (MolCount, ValidMolCount, RemainingMolCount) = [0] * 3

    FirstMol = True
    for Mol in Mols:
        MolCount += 1

        if Mol is None:
            continue

        if RDKitUtil.IsMolEmpty(Mol):
            MolName = RDKitUtil.GetMolName(Mol, MolCount)
            MiscUtil.PrintWarning("Ignoring empty molecule: %s" % MolName)
            continue

        ValidMolCount += 1
        if FirstMol:
            FirstMol = False
            if SetSMILESMolProps:
                if Writer is not None:
                    RDKitUtil.SetWriterMolProps(Writer, Mol)
                for GroupOutfileWriter in GroupOutfilesWriters:
                    if GroupOutfileWriter is not None:
                        RDKitUtil.SetWriterMolProps(GroupOutfileWriter, Mol)

        # Match molecule against functional group patterns...
        MolMatched, GroupsPatternMatchStatusList = MatchMolecule(
            Mol, GroupsPatternMols)

        # Update functional group match count...
        for GroupIndex, MatchStatus in enumerate(GroupsPatternMatchStatusList):
            if MatchStatus:
                GroupsPatternsMatchCountList[GroupIndex] += 1

        if not MolMatched:
            continue

        RemainingMolCount += 1
        WriteMolecule(Writer, GroupOutfilesWriters, Mol, Compute2DCoords,
                      CombineMatchResults, GroupsPatternMatchStatusList)

    return (MolCount, ValidMolCount, RemainingMolCount,
            GroupsPatternsMatchCountList)
Beispiel #4
0
def RemoveSalts():
    """Identify and remove salts from molecules"""
    
    # Setup a molecule reader...
    MiscUtil.PrintInfo("\nProcessing file %s..." % OptionsInfo["Infile"])
    Mols  = RDKitUtil.ReadMolecules(OptionsInfo["Infile"], **OptionsInfo["InfileParams"])
    
    # Set up a molecule writer...
    Writer = SetupMoleculeWriter()

    MolCount, ValidMolCount, SaltsMolCount = ProcessMolecules(Mols, Writer)

    if Writer is not None:
        Writer.close()
    
    MiscUtil.PrintInfo("\nTotal number of molecules: %d" % MolCount)
    MiscUtil.PrintInfo("Number of valid molecules: %d" % ValidMolCount)
    MiscUtil.PrintInfo("Number of ignored molecules: %d" % (MolCount - ValidMolCount))
    
    MiscUtil.PrintInfo("\nNumber of molecules coontaining salts: %d" % (SaltsMolCount))
Beispiel #5
0
def SetupMoleculeWriter():
    """Setup a molecule writer."""

    Writer = RDKitUtil.MoleculesWriter(OptionsInfo["Outfile"],
                                       **OptionsInfo["OutfileParams"])
    if Writer is None:
        MiscUtil.PrintError("Failed to setup a writer for output fie %s " %
                            OptionsInfo["Outfile"])
    MiscUtil.PrintInfo("Generating file %s..." % OptionsInfo["Outfile"])

    return Writer
Beispiel #6
0
def PerformMutagenesis():
    """Mutate specified residues across chains and generate an output file."""

    MiscUtil.PrintInfo("\nApplying mutations...")

    # Load macromolecule from input file...
    MolName = OptionsInfo["InfileRoot"]
    LoadMolecule(OptionsInfo["Infile"], MolName)

    # Apply mutations...
    for Mutation, ChainID, ResNum, NewBaseName in OptionsInfo["SpecifiedMutationsInfo"] :
        ApplyMutation(Mutation, MolName, ChainID, ResNum, NewBaseName)

    #  Generate output file...
    Outfile = OptionsInfo["Outfile"]
    MiscUtil.PrintInfo("\nGenerating output file %s..." % Outfile)
    pymol.cmd.save(Outfile, MolName)
    
    # Delete macromolecule...
    DeleteMolecule(MolName)
def SetupPAINSPatternMols(PAINSPatterns):
    """Set up PAINS pattern mols for substructure search"""

    MiscUtil.PrintInfo(
        "\nSetting up PAINS pattern molecules for performins substructure search..."
    )
    PatternMols = []
    for Pattern in PAINSPatterns:
        PatternMol = Chem.MolFromSmarts(Pattern)
        PatternMols.append(PatternMol)

    return PatternMols
Beispiel #8
0
def main():
    """Start execution of the script"""

    MiscUtil.PrintInfo("\n%s (RDK v%s; %s): Starting...\n" %
                       (ScriptName, rdBase.rdkitVersion, time.asctime()))

    (WallClockTime, ProcessorTime) = MiscUtil.GetWallClockAndProcessorTime()

    # Retrieve command line arguments and options...
    RetrieveOptions()

    # Process and validate command line arguments and options...
    ProcessOptions()

    # Perform actions required by the script...
    PerformFunctionalGroupsSearch()

    MiscUtil.PrintInfo("\n%s: Done...\n" % ScriptName)
    MiscUtil.PrintInfo(
        "Total time: %s" %
        MiscUtil.GetFormattedElapsedTime(WallClockTime, ProcessorTime))
Beispiel #9
0
def ProcessOptions():
    """Process and validate command line arguments and options"""

    MiscUtil.PrintInfo("Processing options...")

    # Validate options...
    ValidateOptions()

    OptionsInfo["CombineMatches"] = Options["--combineMatches"]

    OptionsInfo["CombineMatchResults"] = True
    if re.match("^No$", Options["--combineMatches"], re.I):
        OptionsInfo["CombineMatchResults"] = False
        if Options["--outfile"]:
            FileDir, FileName, FileExt = MiscUtil.ParseFileName(
                Options["--outfile"])
            OptionsInfo["OutfileBasename"] = FileName
            OptionsInfo["OutfileExt"] = FileExt

    OptionsInfo["CombineOperator"] = Options["--combineOperator"]
    OptionsInfo["AndCombineOperatorMode"] = True
    if re.match("^or$", Options["--combineOperator"], re.I):
        OptionsInfo["AndCombineOperatorMode"] = False

    OptionsInfo["GroupNamesFile"] = None
    if not re.match("^auto$", Options["--groupNamesFile"], re.I):
        OptionsInfo["GroupNamesFile"] = Options["--groupNamesFile"]

    OptionsInfo["FunctionalGroups"] = Options["--functionalGroups"]

    OptionsInfo["Infile"] = Options["--infile"]
    OptionsInfo["InfileParams"] = MiscUtil.ProcessOptionInfileParameters(
        "--infileParams", Options["--infileParams"], Options["--infile"])

    OptionsInfo["Outfile"] = Options["--outfile"]
    OptionsInfo["OutfileParams"] = MiscUtil.ProcessOptionOutfileParameters(
        "--outfileParams", Options["--outfileParams"], Options["--infile"],
        Options["--outfile"])

    OptionsInfo["Overwrite"] = Options["--overwrite"]

    OptionsInfo["CountMode"] = False
    if re.match("^count$", Options["--mode"], re.I):
        OptionsInfo["CountMode"] = True

    OptionsInfo["MPMode"] = True if re.match("^yes$", Options["--mp"],
                                             re.I) else False
    OptionsInfo["MPParams"] = MiscUtil.ProcessOptionMultiprocessingParameters(
        "--mpParams", Options["--mpParams"])

    OptionsInfo["UseChirality"] = False
    if re.match("^yes$", Options["--useChirality"], re.I):
        OptionsInfo["UseChirality"] = True
Beispiel #10
0
def SetupMoleculeWriters():
    """Setup molecule writers."""
    
    Writer = None
    WriterFiltered = None

    if OptionsInfo["CountMode"]:
        return (Writer, WriterFiltered)

    Writer = RDKitUtil.MoleculesWriter(OptionsInfo["Outfile"], **OptionsInfo["OutfileParams"])
    if Writer is None:
        MiscUtil.PrintError("Failed to setup a writer for output fie %s " % OptionsInfo["Outfile"])
    MiscUtil.PrintInfo("Generating file %s..." % OptionsInfo["Outfile"])
    
    if OptionsInfo["OutfileFilteredMode"]:
        WriterFiltered = RDKitUtil.MoleculesWriter(OptionsInfo["OutfileFiltered"], **OptionsInfo["OutfileParams"])
        if WriterFiltered is None:
            MiscUtil.PrintError("Failed to setup a writer for output fie %s " % OptionsInfo["OutfileFiltered"])
        MiscUtil.PrintInfo("Generating file %s..." % OptionsInfo["OutfileFiltered"])
    
    return (Writer, WriterFiltered)
def PerformCalculations():
    """Calculate descriptors for a specified list of descriptors."""

    # Setup a molecule reader...
    MiscUtil.PrintInfo("\nProcessing file %s..." % OptionsInfo["Infile"])
    Mols = RDKitUtil.ReadMolecules(OptionsInfo["Infile"],
                                   **OptionsInfo["InfileParams"])

    # Setup a writer...
    Writer = SetupMoleculeWriter()

    # Process molecules...
    MolCount, ValidMolCount = ProcessMolecules(Mols, Writer)

    if Writer is not None:
        Writer.close()

    MiscUtil.PrintInfo("\nTotal number of molecules: %d" % MolCount)
    MiscUtil.PrintInfo("Number of valid molecules: %d" % ValidMolCount)
    MiscUtil.PrintInfo("Number of ignored molecules: %d" %
                       (MolCount - ValidMolCount))
def InitializeWorkerProcess(*EncodedArgs):
    """Initialize data for a worker process."""

    global Options, OptionsInfo

    MiscUtil.PrintInfo("Starting process (PID: %s)..." % os.getpid())

    # Decode Options and OptionInfo...
    Options = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[0])
    OptionsInfo = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[1])

    RetrieveMolecularDescriptorsInfo(PrintInfo=False)
def PerformSearch():
    """Perform search using specified SMARTS pattern."""

    # Set up a pattern molecule...
    PatternMol = Chem.MolFromSmarts(OptionsInfo["Pattern"])

    # Setup a molecule reader...
    MiscUtil.PrintInfo("\nProcessing file %s..." % OptionsInfo["Infile"])
    Mols = RDKitUtil.ReadMolecules(OptionsInfo["Infile"],
                                   **OptionsInfo["InfileParams"])

    # Set up molecule writers...
    Writer, WriterFiltered = SetupMoleculeWriters()

    MolCount, ValidMolCount, RemainingMolCount = ProcessMolecules(
        Mols, PatternMol, Writer, WriterFiltered)

    if Writer is not None:
        Writer.close()
    if WriterFiltered is not None:
        WriterFiltered.close()

    MiscUtil.PrintInfo("\nTotal number of molecules: %d" % MolCount)
    MiscUtil.PrintInfo("Number of valid molecules: %d" % ValidMolCount)
    MiscUtil.PrintInfo("Number of ignored molecules: %d" %
                       (MolCount - ValidMolCount))

    MiscUtil.PrintInfo("\nNumber of remaining molecules: %d" %
                       RemainingMolCount)
    MiscUtil.PrintInfo("Number of filtered molecules: %d" %
                       (ValidMolCount - RemainingMolCount))
def ListSelectionResiduesInfo(MolName, ChainIDs, SelectionType):
    """List residues information for a specified selection type. """

    Lines = []
    TotalResCount = 0
    SelectionLabel = None

    if not len(ChainIDs):
        SelectionInfo, SelectionLabel = GetSelectionResiduesInfo(
            MolName, None, SelectionType)
        MiscUtil.PrintInfo("\nNumber of %s residues: %s" %
                           (SelectionLabel, TotalResCount))
        return

    for ChainID in ChainIDs:
        SelectionInfo, SelectionLabel = GetSelectionResiduesInfo(
            MolName, ChainID, SelectionType)

        ChainResCount = 0
        LineWords = []

        SortedResNames = sorted(
            SelectionInfo["ResNames"],
            key=lambda ResName: SelectionInfo["ResCount"][ResName],
            reverse=True)
        for ResName in SortedResNames:
            ResCount = SelectionInfo["ResCount"][ResName]
            LineWords.append("%s - %s" % (ResName, ResCount))

            ChainResCount += ResCount
            TotalResCount += ResCount

        Line = "; ".join(LineWords) if len(LineWords) else None
        Lines.append("Chain ID: %s; Count: %s; Names:  %s" %
                     (ChainID, ChainResCount, Line))

    MiscUtil.PrintInfo("\nNumber of %s residues: %s" %
                       (SelectionLabel, TotalResCount))
    for Line in Lines:
        MiscUtil.PrintInfo("%s" % Line)
Beispiel #15
0
def GenerateConformers():
    """Generate conformers."""

    # Setup a molecule reader...
    MiscUtil.PrintInfo("\nProcessing file %s..." % OptionsInfo["Infile"])
    Mols = RDKitUtil.ReadMolecules(OptionsInfo["Infile"],
                                   **OptionsInfo["InfileParams"])

    # Set up a molecule writer...
    Writer = RDKitUtil.MoleculesWriter(OptionsInfo["Outfile"],
                                       **OptionsInfo["OutfileParams"])
    if Writer is None:
        MiscUtil.PrintError("Failed to setup a writer for output fie %s " %
                            OptionsInfo["Outfile"])
    MiscUtil.PrintInfo("Generating file %s..." % OptionsInfo["Outfile"])

    MolCount, ValidMolCount, ConfGenFailedCount = ProcessMolecules(
        Mols, Writer)

    if Writer is not None:
        Writer.close()

    MiscUtil.PrintInfo("\nTotal number of molecules: %d" % MolCount)
    MiscUtil.PrintInfo("Number of valid molecules: %d" % ValidMolCount)
    MiscUtil.PrintInfo(
        "Number of molecules failed during conformation generation or minimization: %d"
        % ConfGenFailedCount)
    MiscUtil.PrintInfo("Number of ignored molecules: %d" %
                       (MolCount - ValidMolCount + ConfGenFailedCount))
def CalculateEnergy():
    """Calculate single point energy calculation."""

    # Setup a molecule reader...
    MiscUtil.PrintInfo("\nProcessing file %s..." % OptionsInfo["Infile"])
    Mols = RDKitUtil.ReadMolecules(OptionsInfo["Infile"],
                                   **OptionsInfo["InfileParams"])

    # Set up a molecule writer...
    Writer = RDKitUtil.MoleculesWriter(OptionsInfo["Outfile"],
                                       **OptionsInfo["OutfileParams"])
    if Writer is None:
        MiscUtil.PrintError("Failed to setup a writer for output fie %s " %
                            OptionsInfo["Outfile"])
    MiscUtil.PrintInfo("Generating file %s..." % OptionsInfo["Outfile"])

    MolCount, ValidMolCount, EnergyFailedCount = ProcessMolecules(Mols, Writer)

    if Writer is not None:
        Writer.close()

    MiscUtil.PrintInfo("\nTotal number of molecules: %d" % MolCount)
    MiscUtil.PrintInfo("Number of valid molecules: %d" % ValidMolCount)
    MiscUtil.PrintInfo(
        "Number of molecules failed during energy calculation: %d" %
        EnergyFailedCount)
    MiscUtil.PrintInfo("Number of ignored molecules: %d" %
                       (MolCount - ValidMolCount + EnergyFailedCount))
def WriteAlignedInputObject(FileIndex):
    """Write out aligned input object"""

    Outfile = OptionsInfo["InfilesInfo"]["OutfilesNames"][FileIndex]
    InputName = OptionsInfo["InfilesInfo"]["PyMOLObjectNames"][FileIndex]

    MiscUtil.PrintInfo("Generating aligned output file %s..." % Outfile)

    pymol.cmd.save(Outfile, InputName)

    if not os.path.exists(Outfile):
        MiscUtil.PrintWarning("Failed to generate aligned output file, %s..." %
                              (Outfile))
def ListBoundingBoxInfo(MolName):
    """List bounding box information. """

    if not (OptionsInfo["All"] or OptionsInfo["BoundingBox"]):
        return

    MolSelection = "(%s)" % MolName
    MolExtents = pymol.cmd.get_extent(MolSelection)

    XMin, YMin, ZMin = MolExtents[0]
    XMax, YMax, ZMax = MolExtents[1]

    XSize = abs(XMax - XMin)
    YSize = abs(YMax - YMin)
    ZSize = abs(ZMax - ZMin)

    MiscUtil.PrintInfo(
        "\nBounding box coordinates: <XMin, XMax> - <%.3f, %.3f>; <YMin, YMax> - <%.3f, %.3f>; <ZMin, ZMax> - <%.3f, %.3f>"
        % (XMin, XMax, YMin, YMax, ZMin, ZMax))
    MiscUtil.PrintInfo(
        "Bounding box size in Angstroms: XSize - %.3f; YSize - %.3f; ZSize - %.3f"
        % (XSize, YSize, ZSize))
def ListHeaderInfo(Infile):
    """List header information."""

    if not (OptionsInfo["All"] or OptionsInfo["Header"]):
        return

    FileDir, FileName, FileExt = MiscUtil.ParseFileName(Infile)

    Classification, DepositionDate, IDCode, ExperimentalTechnique, Resolution = [
        "Not Available"
    ] * 5
    if re.match("^pdb$", FileExt, re.I):
        Classification, DepositionDate, IDCode, ExperimentalTechnique, Resolution = RetriveHeadAndExperimentalInfoFromPDBFile(
            Infile)
    elif re.match("^cif$", FileExt, re.I):
        Classification, DepositionDate, IDCode, ExperimentalTechnique, Resolution = RetriveHeadAndExperimentalInfoFromCIFFile(
            Infile)

    MiscUtil.PrintInfo("\nID: %s\nClassification: %s\nDeposition date: %s" %
                       (IDCode, Classification, DepositionDate))
    MiscUtil.PrintInfo("\nExperimental technique: %s\nResolution: %s" %
                       (ExperimentalTechnique, Resolution))
def InitializeWorkerProcess(*EncodedArgs):
    """Initialize data for a worker process."""

    global Options, OptionsInfo

    MiscUtil.PrintInfo("Starting process (PID: %s)..." % os.getpid())

    # Decode Options and OptionInfo...
    Options = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[0])
    OptionsInfo = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[1])

    # Set up salt remover...
    OptionsInfo["SaltRemover"] = SetupSaltRemover()
Beispiel #21
0
def ProcessOptions():
    """Process and validate command line arguments and options"""

    MiscUtil.PrintInfo("Processing options...")

    # Validate options...
    ValidateOptions()

    OptionsInfo["Feedback"] = True if re.match("^Yes$", Options["--feedback"],
                                               re.I) else False

    OptionsInfo["Infile"] = Options["--infile"]
    OptionsInfo["Outfile"] = Options["--outfile"]
Beispiel #22
0
def InitializeWorkerProcess(*EncodedArgs):
    """Initialize data for a worker process."""
    
    global Options, OptionsInfo

    MiscUtil.PrintInfo("Starting process (PID: %s)..." % os.getpid())
    
    # Decode Options and OptionInfo...
    Options = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[0])
    OptionsInfo = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[1])

    # Decode ChEMBLPatternMols...
    OptionsInfo["ChEMBLPatternMols"] = [RDKitUtil.MolFromBase64EncodedMolString(EncodedMol) for EncodedMol in OptionsInfo["EncodedChEMBLPatternMols"]]
def ListInterfaceChainsAndResiduesInfo(InterfaceID, InterfaceChainIDs,
                                       ChainNames, ResiduesInfo):
    """List interface chains and residues. """

    for ChainID in InterfaceChainIDs:
        if not ChainID in ChainNames:
            MiscUtil.PrintInfo(
                "\nInterface chain IDs: %s; ChainID: %s; Number of interface residues: 0"
                % (InterfaceID, ChainID))
            continue

        for Index in range(0, len(ChainNames)):
            ChainName = ChainNames[Index]
            ChainResiduesInfo = ResiduesInfo[Index]
            if re.match(ChainID, ChainName, re.I):
                MiscUtil.PrintInfo(
                    "\nInterface chain IDs: %s; ChainID: %s; Number of interface residues: %d"
                    % (InterfaceID, ChainName, ChainResiduesInfo[0]))
                MiscUtil.PrintInfo(
                    "Residue distribution: %s\nResidue IDs: %s" %
                    (ChainResiduesInfo[1], ChainResiduesInfo[2]))
                continue
Beispiel #24
0
def RetrieveChainsIDs():
    """Retrieve chain IDs. """

    MolName = OptionsInfo["InfileRoot"]
    Infile = OptionsInfo["Infile"]
    
    MiscUtil.PrintInfo("\nRetrieving chains information for input file %s..." % Infile)

    LoadMolecule(Infile, MolName)

    ChainIDs = PyMOLUtil.GetChains(MolName)
    
    DeleteMolecule(MolName)

    if ChainIDs is None:
        ChainIDs = []

    # Print out chain and ligand IDs...
    ChainInfo = ", ".join(ChainIDs) if len(ChainIDs) else "None"
    MiscUtil.PrintInfo("Chain IDs: %s" % ChainInfo)
                         
    OptionsInfo["ChainIDs"] = ChainIDs
def ConvertLigandFileFormat():
    """Comvert ligand file format."""

    Infile = OptionsInfo["Infile"]
    Outfile = OptionsInfo["Outfile"]

    MiscUtil.PrintInfo("\nGenerating file %s..." % Outfile)

    PyMOLUtil.ConvertFileFormat(Infile, Outfile)

    if not os.path.exists(Outfile):
        MiscUtil.PrintWarning("Failed to generate Outfile file, %s..." %
                              (Outfile))
def main():
    """Start execution of the script"""

    MiscUtil.PrintInfo(
        "\n%s (PyMOL v%s; %s) Starting...\n" %
        (ScriptName, pymol.cmd.get_version()[1], time.asctime()))

    (WallClockTime, ProcessorTime) = MiscUtil.GetWallClockAndProcessorTime()

    # Retrieve command line arguments and options...
    RetrieveOptions()

    # Process and validate command line arguments and options...
    ProcessOptions()

    # Perform actions required by the script...
    SplitChainsAndLigands()

    MiscUtil.PrintInfo("\n%s: Done...\n" % ScriptName)
    MiscUtil.PrintInfo(
        "Total time: %s" %
        MiscUtil.GetFormattedElapsedTime(WallClockTime, ProcessorTime))
def InitializeWorkerProcess(*EncodedArgs):
    """Initialize data for a worker process."""
    
    global Options, OptionsInfo

    MiscUtil.PrintInfo("Starting process (PID: %s)..." % os.getpid())

    # Decode Options and OptionInfo...
    Options = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[0])
    OptionsInfo = MiscUtil.ObjectFromBase64EncodedString(EncodedArgs[1])

    # Decode RefMol...
    OptionsInfo["RefMol"] = RDKitUtil.MolFromBase64EncodedMolString(OptionsInfo["EncodedRefMol"])
Beispiel #28
0
def RetrieveChEMBLFiltersInfo():
    """Retrieve information for ChEMBL filters."""
    
    MayaChemToolsDataDir = MiscUtil.GetMayaChemToolsLibDataPath()
    ChEMBLFiltersFilePath = os.path.join(MayaChemToolsDataDir, "ChEMBLFilters.csv")
    
    MiscUtil.PrintInfo("\nRetrieving ChEMBL alerts SMARTS patterns from file %s" % (ChEMBLFiltersFilePath))

    Delimiter = ','
    QuoteChar = '"'
    IgnoreHeaderLine = True
    FilterLinesWords = MiscUtil.GetTextLinesWords(ChEMBLFiltersFilePath, Delimiter, QuoteChar, IgnoreHeaderLine)

    ChEMBLFiltersMap = {}
    ChEMBLFiltersMap["FilterTypes"] = []
    ChEMBLFiltersMap["ID"] = {}
    ChEMBLFiltersMap["SMARTS"] = {}

    for LineWords in FilterLinesWords:
        FilterType = LineWords[0]
        ID = LineWords[1]
        SMARTS = LineWords[2]

        if not FilterType in ChEMBLFiltersMap["FilterTypes"]:
            ChEMBLFiltersMap["FilterTypes"].append(FilterType)
            ChEMBLFiltersMap["ID"][FilterType] = []
            ChEMBLFiltersMap["SMARTS"][FilterType] = []

        ChEMBLFiltersMap["ID"][FilterType].append(ID)
        ChEMBLFiltersMap["SMARTS"][FilterType].append(SMARTS)

    OptionsInfo["ChEMBLFiltersMap"] = ChEMBLFiltersMap
    
    MiscUtil.PrintInfo("\nTotal number alerts: %d" % len(FilterLinesWords))
    MiscUtil.PrintInfo("Number of filter family types: %d\nFilter familty types: %s\n" % (len(ChEMBLFiltersMap["FilterTypes"]), ", ".join(ChEMBLFiltersMap["FilterTypes"])))

    for FilterType in ChEMBLFiltersMap["FilterTypes"]:
        MiscUtil.PrintInfo("Filter family type: %s; Number of alerts: %d" % (FilterType, len(ChEMBLFiltersMap["ID"][FilterType])))
    MiscUtil.PrintInfo("")
def ProcessOptions():
    """Process and validate command line arguments and options"""

    MiscUtil.PrintInfo("Processing options...")

    # Validate options...
    ValidateOptions()

    OptionsInfo["Infile"] = Options["--infile"]
    OptionsInfo["InfileParams"] = MiscUtil.ProcessOptionInfileParameters(
        "--infileParams", Options["--infileParams"], Options["--infile"])

    OptionsInfo["Outfile"] = Options["--outfile"]
    OptionsInfo["OutfileParams"] = MiscUtil.ProcessOptionOutfileParameters(
        "--outfileParams", Options["--outfileParams"])

    OptionsInfo["Overwrite"] = Options["--overwrite"]

    if re.match("^UFF$", Options["--forceField"], re.I):
        ForceField = "UFF"
        UseUFF = True
        UseMMFF = False
    elif re.match("^MMFF$", Options["--forceField"], re.I):
        ForceField = "MMFF"
        UseUFF = False
        UseMMFF = True
    else:
        MiscUtil.PrintError(
            "The value, %s, specified for \"--forceField\" is not supported." %
            (Options["--forceField"], ))

    MMFFVariant = "MMFF94" if re.match(
        "^MMFF94$", Options["--forceFieldMMFFVariant"], re.I) else "MMFF94s"

    OptionsInfo["ForceField"] = ForceField
    OptionsInfo["MMFFVariant"] = MMFFVariant
    OptionsInfo["UseMMFF"] = UseMMFF
    OptionsInfo["UseUFF"] = UseUFF

    if UseMMFF:
        OptionsInfo["EnergyLabel"] = "%s_Energy" % MMFFVariant
    else:
        OptionsInfo["EnergyLabel"] = "%s_Energy" % ForceField

    OptionsInfo["MPMode"] = True if re.match("^yes$", Options["--mp"],
                                             re.I) else False
    OptionsInfo["MPParams"] = MiscUtil.ProcessOptionMultiprocessingParameters(
        "--mpParams", Options["--mpParams"])

    OptionsInfo["QuietMode"] = True if re.match("^yes$", Options["--quiet"],
                                                re.I) else False
def ProcessOptions():
    """Process and validate command line arguments and options"""

    MiscUtil.PrintInfo("Processing options...")

    # Validate options...
    ValidateOptions()

    OptionsInfo["Autocorr2DExclude"] = True
    if not re.match("^Yes$", Options["--autocorr2DExclude"], re.I):
        OptionsInfo["Autocorr2DExclude"] = False

    OptionsInfo["FragmentCount"] = True
    if not re.match("^Yes$", Options["--fragmentCount"], re.I):
        OptionsInfo["FragmentCount"] = False

    OptionsInfo["DescriptorNames"] = Options["--descriptorNames"]
    OptionsInfo["Mode"] = Options["--mode"]

    OptionsInfo["Infile"] = Options["--infile"]
    OptionsInfo["InfileParams"] = MiscUtil.ProcessOptionInfileParameters(
        "--infileParams", Options["--infileParams"], Options["--infile"])

    OptionsInfo["Outfile"] = Options["--outfile"]
    OptionsInfo["OutfileParams"] = MiscUtil.ProcessOptionOutfileParameters(
        "--outfileParams", Options["--outfileParams"], Options["--infile"],
        Options["--outfile"])

    OptionsInfo["Overwrite"] = Options["--overwrite"]

    TextOutFileMode = False
    TextOutFileDelim = ""
    if MiscUtil.CheckFileExt(Options["--outfile"], "csv"):
        TextOutFileMode = True
        TextOutFileDelim = ","
    elif MiscUtil.CheckFileExt(Options["--outfile"], "tsv txt"):
        TextOutFileMode = True
        TextOutFileDelim = "\t"
    OptionsInfo["TextOutFileMode"] = TextOutFileMode
    OptionsInfo["TextOutFileDelim"] = TextOutFileDelim

    OptionsInfo["MPMode"] = True if re.match("^yes$", Options["--mp"],
                                             re.I) else False
    OptionsInfo["MPParams"] = MiscUtil.ProcessOptionMultiprocessingParameters(
        "--mpParams", Options["--mpParams"])

    OptionsInfo["Precision"] = int(Options["--precision"])

    OptionsInfo["SMILESOut"] = False
    if re.match("^Yes$", Options["--smilesOut"], re.I):
        OptionsInfo["SMILESOut"] = True