Ejemplo n.º 1
0
def test_time_limit(janitor):
    molecule = ACTopol("KKK.pdb", chargeType="bcc", debug=True, timeTol=2)
    with pytest.raises(Exception) as e_info:
        molecule.createACTopol()
    assert e_info.value.args[
        0] == "Semi-QM taking too long to finish... aborting!"
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 2
0
def test_smiles(janitor, base, msg):
    smiles = "c1ccc2c(c1)C(=O)N(C2=O)C3CCC(=NC3=O)O"
    molecule = ACTopol(smiles, basename=base, chargeType="gas", debug=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    assert molecule
    assert molecule.inputFile == msg
    assert len(molecule.molTopol.atoms) == 29
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
    os.remove(molecule.absInputFile)
Ejemplo n.º 3
0
def test_charge_user(janitor):
    molecule = ACTopol("ADPMg.mol2", chargeType="user", debug=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    assert molecule
    assert len(molecule.molTopol.atoms) == 39
    assert len(molecule.molTopol.properDihedrals) == 128
    assert len(molecule.molTopol.improperDihedrals) == 7
    assert molecule.molTopol.atoms[0].charge == 0.1667
    assert molecule.molTopol.atoms[15].charge == -0.517
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 4
0
def test_ekFlag(janitor):
    molecule = ACTopol(
        "benzene.pdb",
        ekFlag=
        '''"qm_theory='AM1', grms_tol=0.0005, scfconv=1.d-10, ndiis_attempts=700, qmcharge=0"''',
        gmx4=True,
    )
    molecule.createACTopol()
    molecule.createMolTopol()
    assert molecule
    assert len(molecule.molTopol.atoms) == 12
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 5
0
def test_charges_chiral(janitor):
    molecule = ACTopol("KKK.mol2", chargeType="gas", debug=True, chiral=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    assert molecule
    assert len(molecule.molTopol.atoms) == 69
    assert len(molecule.molTopol.properDihedrals) == 218
    assert len(molecule.molTopol.improperDihedrals) == 5
    assert len(molecule.molTopol.chiralGroups) == 3
    assert molecule.chargeVal == "3"
    assert molecule.molTopol.totalCharge == 3
    assert molecule.molTopol.chiralGroups[-1][-1] == approx(66.713290)
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 6
0
def test_amber(janitor, force, at, ndih):
    molecule = ACTopol("FFF.mol2",
                       chargeType="gas",
                       debug=True,
                       atomType=at,
                       force=force)
    molecule.createACTopol()
    molecule.createMolTopol()
    assert molecule
    assert len(molecule.molTopol.atoms) == 63
    assert len(molecule.molTopol.properDihedrals) == ndih
    assert len(molecule.molTopol.improperDihedrals) == 23
    assert molecule.molTopol.atoms[0].__repr__(
    ) == "<Atom id=1, name=N, <AtomType=N3>>"
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 7
0
def test_sqm_tleap(janitor, capsys, ct, ft, msg):
    # check chargeType user with PDB -> use bcc
    # .mol and .mdl are the same file type
    molecule = ACTopol(f"benzene.{ft}", chargeType=ct, debug=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    captured = capsys.readouterr()
    assert molecule
    assert len(molecule.molTopol.atoms) == 12
    assert len(molecule.molTopol.properDihedrals) == 24
    assert len(molecule.molTopol.improperDihedrals) == 6
    assert molecule.molTopol.atoms[0].charge == approx(-0.13)
    assert molecule.molTopol.atoms[-1].charge == approx(0.13)
    assert msg in captured.out
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 8
0
def test_mol2_sorted(janitor, issorted, charge, msg):
    molecule = ACTopol("AAA.mol2",
                       chargeType="gas",
                       debug=True,
                       is_sorted=issorted)
    molecule.createACTopol()
    molecule.createMolTopol()
    assert molecule
    assert molecule.molTopol.atomTypes[0].__repr__() == "<AtomType=nz>"
    assert len(molecule.molTopol.atoms) == 33
    assert len(molecule.molTopol.properDihedrals) == 98
    assert len(molecule.molTopol.improperDihedrals) == 5
    assert molecule.molTopol.totalCharge == 0
    assert molecule.molTopol.atoms[0].charge == approx(charge)
    assert molecule.molTopol.atoms[-1].__repr__() == msg
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 9
0
def init_main(binaries: Dict[str, str] = binaries,
              argv: Optional[List[str]] = None):
    """
    Orchestrate the command line usage for ACPYPE with its all input arguments.

    Args:
        binaries (Dict[str, str], optional): Mostly used for debug and testing. Defaults to ``acpype.params.binaries``.
        argv (Optional[List[str]], optional): Mostly used for debug and testing. Defaults to None.

    Returns:
        SystemExit(status): 0 or 19 (failed)
    """
    _chk_py_ver()
    if argv is None:
        argv = sys.argv[1:]

    parser = get_option_parser()
    args = parser.parse_args(argv)

    at0 = time.time()

    amb2gmxF = False

    if args.version:
        print(header)
        sys.exit(0)

    level = 20
    if not args.verboseless:
        level = 100
    if args.debug:
        level = 10

    logger(level).info(header)

    if not args.input:
        amb2gmxF = True
        if not args.inpcrd or not args.prmtop:
            parser.error("missing input files")
    elif args.inpcrd or args.prmtop:
        parser.error("either '-i' or ('-p', '-x'), but not both")

    logger(level).debug(f"CLI: {' '.join(argv)}")
    texta = f"Python Version {sys.version}"
    logger(level).debug(while_replace(texta))

    if args.direct and not amb2gmxF:
        parser.error(
            "option -u is only meaningful in 'amb2gmx' mode (args '-p' and '-x')"
        )

    acpypeFailed = False
    if amb2gmxF:
        logger(level).info("Converting Amber input files to Gromacs ...")
        try:
            molecule: AbstractTopol = MolTopol(
                acFileXyz=args.inpcrd,
                acFileTop=args.prmtop,
                amb2gmx=True,
                debug=args.debug,
                basename=args.basename,
                verbose=args.verboseless,
                gmx4=args.gmx4,
                merge=args.merge,
                direct=args.direct,
                is_sorted=args.sorted,
                chiral=args.chiral,
            )
        except Exception:
            acpypeFailed = _handle_exception(level)
        if not acpypeFailed:
            try:
                molecule.writeGromacsTopolFiles()
                molecule.printDebug("prmtop and inpcrd files parsed")
            except Exception:
                acpypeFailed = _handle_exception(level)

    else:
        try:
            molecule = ACTopol(
                args.input,
                binaries=binaries,
                chargeType=args.charge_method,
                chargeVal=args.net_charge,
                debug=args.debug,
                multiplicity=args.multiplicity,
                atomType=args.atom_type,
                force=args.force,
                outTopol=args.outtop,
                allhdg=args.cnstop,
                basename=args.basename,
                timeTol=args.max_time,
                qprog=args.qprog,
                ekFlag=f'''"{args.keyword}"''',
                verbose=args.verboseless,
                gmx4=args.gmx4,
                merge=args.merge,
                direct=args.direct,
                is_sorted=args.sorted,
                chiral=args.chiral,
                amb2gmx=False,
            )
        except Exception:
            acpypeFailed = _handle_exception(level)
        if not acpypeFailed:
            try:
                molecule.createACTopol()
            except Exception:
                acpypeFailed = _handle_exception(level)
        if not acpypeFailed:
            try:
                molecule.createMolTopol()
            except Exception:
                acpypeFailed = _handle_exception(level)

    execTime = int(round(time.time() - at0))
    if execTime == 0:
        amsg = "less than a second"
    else:
        amsg = elapsedTime(execTime)
    logger(level).info(f"Total time of execution: {amsg}")

    if args.ipython:
        try:
            import IPython

            IPython.embed(colors="neutral")
        except ModuleNotFoundError:
            logger(level).exception("No 'ipython' installed")

    if not args.debug:
        try:
            rmtree(molecule.tmpDir)
        except Exception:
            logger(level).debug("No tmp folder left to be removed")
    else:
        try:
            if molecule.tmpDir:
                logger(level).debug(
                    f"Keeping folder '{molecule.tmpDir}' for possible helping debugging"
                )
        except Exception:
            logger(level).debug("No tmp folder left to be removed")

    try:
        copy_log(molecule)
    except UnboundLocalError:
        print(f"Log tmp location: {tmpLogFile}")

    if acpypeFailed:
        sys.exit(19)

    os.chdir(molecule.rootDir)

    if not amb2gmxF and molecule.obabelExe:
        if molecule.checkSmiles():
            afile = "smiles_molecule.mol2"
            if os.path.exists(afile):
                os.remove(afile)
Ejemplo n.º 10
0
def test_pdb(janitor, capsys):
    molecule = ACTopol("FFF.pdb", chargeType="gas", debug=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    assert len(molecule.molTopol.atoms) == 63
    assert len(molecule.molTopol.properDihedrals) == 188
    assert len(molecule.molTopol.improperDihedrals) == 23
    assert molecule.molTopol.atoms[0].__repr__(
    ) == "<Atom id=1, name=N, <AtomType=nz>>"
    # check gaff2 and force
    molecule = ACTopol("FFF.pdb",
                       chargeType="gas",
                       debug=True,
                       atomType="gaff2",
                       force=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    captured = capsys.readouterr()
    assert len(molecule.molTopol.atoms) == 63
    assert len(molecule.molTopol.properDihedrals) == 188
    assert len(molecule.molTopol.improperDihedrals) == 23
    assert molecule.molTopol.atoms[0].__repr__(
    ) == "<Atom id=1, name=N, <AtomType=nz>>"
    assert "==> Overwriting pickle file FFF.pkl" in captured.out
    # check for already present
    molecule = ACTopol("FFF.mol2", chargeType="gas", debug=True)
    molecule.createACTopol()
    molecule.createMolTopol()
    captured = capsys.readouterr()
    assert molecule
    assert "==> Pickle file FFF.pkl already present... doing nothing" in captured.out
    janitor.append(molecule.absHomeDir)
    janitor.append(molecule.tmpDir)
Ejemplo n.º 11
0
def acpype_api(
    inputFile,
    chargeType="bcc",
    chargeVal=None,
    multiplicity="1",
    atomType="gaff2",
    force=False,
    basename=None,
    debug=False,
    outTopol="all",
    engine="tleap",
    allhdg=False,
    timeTol=MAXTIME,
    qprog="sqm",
    ekFlag=None,
    verbose=True,
    gmx4=False,
    merge=False,
    direct=False,
    is_sorted=False,
    chiral=False,
    is_smiles=False,
):

    at0 = time.time()
    print(header)

    if debug:
        texta = "Python Version %s" % sys.version
        print("DEBUG: %s" % while_replace(texta))
    try:
        molecule = ACTopol(
            inputFile=inputFile,
            chargeType=chargeType,
            chargeVal=chargeVal,
            debug=debug,
            multiplicity=multiplicity,
            atomType=atomType,
            force=force,
            outTopol=outTopol,
            allhdg=allhdg,
            basename=basename,
            timeTol=timeTol,
            qprog=qprog,
            ekFlag=ekFlag,
            verbose=verbose,
            gmx4=gmx4,
            merge=merge,
            direct=direct,
            is_sorted=is_sorted,
            chiral=chiral,
        )

        molecule.createACTopol()
        molecule.createMolTopol()

        "Output in JSON format"
        os.chdir(molecule.absHomeDir)
        readFiles(molecule.baseName, chargeType, atomType)
        output = {
            "file_name": molecule.baseName,
            "em_mdp": em_mdp.getvalue(),
            "AC_frcmod": AC_frcmod.getvalue(),
            "AC_inpcrd": AC_inpcrd.getvalue(),
            "AC_lib": AC_lib.getvalue(),
            "AC_prmtop": AC_prmtop.getvalue(),
            "mol2": mol2.getvalue(),
            "CHARMM_inp": CHARMM_inp.getvalue(),
            "CHARMM_prm": CHARMM_prm.getvalue(),
            "CHARMM_rtf": CHARMM_rtf.getvalue(),
            "CNS_inp": CNS_inp.getvalue(),
            "CNS_par": CNS_par.getvalue(),
            "CNS_top": CNS_top.getvalue(),
            "GMX_OPLS_itp": GMX_OPLS_itp.getvalue(),
            "GMX_OPLS_top": GMX_OPLS_top.getvalue(),
            "GMX_gro": GMX_gro.getvalue(),
            "GMX_itp": GMX_itp.getvalue(),
            "GMX_top": GMX_top.getvalue(),
            "NEW_pdb": NEW_pdb.getvalue(),
            "md_mdp": md_mdp.getvalue(),
        }

    except Exception:
        _exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
        print("ACPYPE FAILED: %s" % exceptionValue)
        if debug:
            traceback.print_tb(exceptionTraceback, file=sys.stdout)
            output = {"file_name": f"ERROR: {str(exceptionValue)}"}

    execTime = int(round(time.time() - at0))
    if execTime == 0:
        amsg = "less than a second"
    else:
        amsg = elapsedTime(execTime)
    print("Total time of execution: %s" % amsg)
    clearFileInMemory()
    try:
        shutil.rmtree(molecule.absHomeDir)
    except Exception:
        print("DEBUG: No folder left to be removed")
    return json.dumps(output)
Ejemplo n.º 12
0
cType = "gas"
debug = True

water = " -water none"

print(f"usePymol: {usePymol}, ffType: {ffType}, cType: {cType}")

tmpDir = "/tmp/testAcpype"

delList = ["topol.top", "posre.itp"]

# create Dummy PDB
tpdb = "/tmp/tmp.pdb"
dummyLine = "ATOM      1  N   ALA A   1      -1.188  -0.094   0.463  1.00  0.00           N\n"
open(tpdb, "w").writelines(dummyLine)
tempObj = ACTopol(tpdb, chargeVal=0, verbose=False)

# Binaries for ambertools
acExe = tempObj.acExe
tleapExe = tempObj.tleapExe
sanderExe = os.path.join(os.path.dirname(acExe), "sander")
ambpdbExe = os.path.join(os.path.dirname(acExe), "ambpdb")

exePymol = "/sw/bin/pymol"

# Binaries for gromacs
gpath = "/home/awilter/miniconda3/envs/acpype/"
gmxTopDir = gpath + "share"
pdb2gmx = gpath + "bin/gmx pdb2gmx"
grompp = gpath + "bin/gmx grompp"
mdrun = gpath + "bin/gmx mdrun"