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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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"