diff --git a/Dockerfile-dmpk b/Dockerfile-dmpk index c7b8135..0cab9b1 100644 --- a/Dockerfile-dmpk +++ b/Dockerfile-dmpk @@ -18,7 +18,6 @@ WORKDIR ${HOME} # numpy is pinned below 2 because this matplotlib release predates # NumPy 2.0 and its compiled extensions are not ABI-compatible with it -RUN pip install "numpy<2" matplotlib==3.7.1 im-data-manager-job-utilities==1.0.1 +RUN pip install "numpy<2" matplotlib==3.7.1 sigfig "im-data-manager-job-utilities>=1.4.0" -COPY utils.py ./ COPY dmpk/*.py ./dmpk/ \ No newline at end of file diff --git a/Dockerfile-fns b/Dockerfile-fns index 71a5f9c..610b6c2 100644 --- a/Dockerfile-fns +++ b/Dockerfile-fns @@ -14,7 +14,7 @@ WORKDIR ${HOME} RUN pip install \ neo4j-driver==4.4.11 \ im-standardize-molecule==0.1.0 \ - im-data-manager-job-utilities==1.1.1 + "im-data-manager-job-utilities>=1.4.0" -COPY fn_*.py utils.py ./ +COPY fn_*.py ./ diff --git a/Dockerfile-jaqpot b/Dockerfile-jaqpot index 44d5010..b8382ea 100644 --- a/Dockerfile-jaqpot +++ b/Dockerfile-jaqpot @@ -4,9 +4,9 @@ RUN apt-get -y update &&\ apt-get -y install procps &&\ apt-get clean -RUN pip install im-data-manager-job-utilities==1.3.0 im-rdkit-utilities==1.0.0 +RUN pip install "im-data-manager-job-utilities>=1.4.0" "im-rdkit-utilities>=1.1.2" ENV HOME=/code WORKDIR ${HOME} -COPY utils.py jaqpot*.py ./ \ No newline at end of file +COPY jaqpot*.py ./ \ No newline at end of file diff --git a/Dockerfile-moldb b/Dockerfile-moldb index 74ef9ed..215594b 100644 --- a/Dockerfile-moldb +++ b/Dockerfile-moldb @@ -17,8 +17,8 @@ RUN apt-get update && apt-get install -y gcc libpq-dev &&\ RUN pip install sqlalchemy==1.4.49\ psycopg2-binary==2.9.6\ im-standardize-molecule==0.1.0\ - im-data-manager-job-utilities==1.3.0\ - im-rdkit-utilities==1.0.0 + "im-data-manager-job-utilities>=1.4.0"\ + "im-rdkit-utilities>=1.1.2" COPY *.py site_substructures.smarts ./ COPY moldb/* ./moldb/ diff --git a/Dockerfile-mordred b/Dockerfile-mordred index 5cb4b55..9680e48 100644 --- a/Dockerfile-mordred +++ b/Dockerfile-mordred @@ -13,8 +13,7 @@ WORKDIR ${HOME} # install our requirements. RDKit is present in base container RUN pip install mordredcommunity==2.0.4 \ im-standardize-molecule==0.1.0 \ - im-data-manager-job-utilities>=1.4.0 \ - im-rdkit-utilities>=1.1.2 + "im-data-manager-job-utilities>=1.4.0" \ + "im-rdkit-utilities>=1.1.2" COPY im_mordred/descriptor_generator.py ./im_mordred/ -COPY utils.py ./ diff --git a/Dockerfile-oddt b/Dockerfile-oddt index 75aa54a..4b0ae2b 100644 --- a/Dockerfile-oddt +++ b/Dockerfile-oddt @@ -15,8 +15,8 @@ ENV HOME=/code WORKDIR ${HOME} RUN pip install wheel six &&\ - pip install im-data-manager-job-utilities==1.3.0\ - im-rdkit-utilities==1.0.0\ + pip install "im-data-manager-job-utilities>=1.4.0"\ + "im-rdkit-utilities>=1.1.2"\ git+https://github.com/oddt/oddt.git@master COPY *.py ./ \ No newline at end of file diff --git a/Dockerfile-plants b/Dockerfile-plants index c6f0ca4..2b1fc3d 100644 --- a/Dockerfile-plants +++ b/Dockerfile-plants @@ -13,7 +13,7 @@ RUN apt-get update &&\ python3-openbabel &&\ apt-get clean -COPY pharmacophore.py utils.py /code/ +COPY pharmacophore.py /code/ RUN chmod a+x /code/*.py &&\ - pip install im-data-manager-job-utilities==1.1.1 + pip install "im-data-manager-job-utilities>=1.4.0" diff --git a/Dockerfile-prep b/Dockerfile-prep index 9578773..9c62e14 100644 --- a/Dockerfile-prep +++ b/Dockerfile-prep @@ -23,8 +23,8 @@ WORKDIR ${HOME} RUN pip install scikit-learn==1.2.2\ pdb2pqr==3.6.1\ im-standardize-molecule==0.1.0\ - im-data-manager-job-utilities>=1.4.0\ - im-rdkit-utilities>=1.1.2\ + "im-data-manager-job-utilities>=1.4.0"\ + "im-rdkit-utilities>=1.1.2"\ sigfig==1.3.19 COPY *.py fpscores.pkl.gz site_substructures.smarts ./ diff --git a/align_mol.py b/align_mol.py index ffba10a..066577a 100755 --- a/align_mol.py +++ b/align_mol.py @@ -21,7 +21,7 @@ from rdkit.Chem import rdMolAlign from rdkit.Chem import rdFMCS -import utils +from dm_job_utilities import utils def align(query_mol, inputs_sdf, outputs_sdf, query_atoms=None, keep_all=False, mcs_params={}, interval=None): diff --git a/assemble_conformers.py b/assemble_conformers.py index cef7e0a..62b4127 100755 --- a/assemble_conformers.py +++ b/assemble_conformers.py @@ -24,7 +24,9 @@ """ import argparse, os, time, gzip -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils +from digest_utils import get_path_from_digest from dm_job_utilities.dm_log import DmLog from rdkit import Chem @@ -66,7 +68,7 @@ def execute(input, output, data_dir, mode, uid = tokens[1] digest = tokens[2] parts = [data_dir] - parts.extend(utils.get_path_from_digest(digest)) + parts.extend(get_path_from_digest(digest)) path = os.path.join(*parts) if not os.path.isdir(path): utils.log('WARNING, path', path, 'not found') diff --git a/cluster_butina.py b/cluster_butina.py index 8e18fb2..da33371 100755 --- a/cluster_butina.py +++ b/cluster_butina.py @@ -20,7 +20,7 @@ from rdkit.Chem import AllChem, MACCSkeys from rdkit.ML.Cluster import Butina -import utils +from dm_job_utilities import utils import rdkit_utils from dm_job_utilities.dm_log import DmLog diff --git a/digest_utils.py b/digest_utils.py new file mode 100644 index 0000000..da49235 --- /dev/null +++ b/digest_utils.py @@ -0,0 +1,40 @@ +# Copyright 2025 Informatics Matters Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Mapping a molecule digest onto the sharded directory layout used by the +enumeration/conformer pipeline. + +This lives here rather than in dm_job_utilities: the shared package +deliberately dropped get_path_from_digest as obsolete, but the layout it +describes is still what prepare_enum_conf_lists.py writes and +assemble_conformers.py reads back. +""" + +default_num_chars = 2 +default_num_levels = 2 + + +def get_path_from_digest( + digest, num_chars=default_num_chars, num_levels=default_num_levels +): + """Split a digest into the directory components that locate its files, + e.g. 'abcdef...' -> ['ab', 'cd'] for the default 2 chars over 2 levels. + """ + parts = [] + start = 0 + for _ in range(0, num_levels): + end = start + num_chars + parts.append(digest[start:end]) + start = start + num_chars + return parts diff --git a/dmpk/pk_tmax_cmax_sim.py b/dmpk/pk_tmax_cmax_sim.py index fba99c4..9ce9ff0 100644 --- a/dmpk/pk_tmax_cmax_sim.py +++ b/dmpk/pk_tmax_cmax_sim.py @@ -23,7 +23,15 @@ matplotlib.use('Agg') import matplotlib.pyplot as plt -import utils +from dm_job_utilities import utils +from sigfig import round as _sigfig_round + + +def sigfig_round(value, sigfigs): + """Round to N significant figures. warn=False keeps sigfig quiet when a + value carries fewer significant figures than requested, which is common + here and was silent under the previous implementation.""" + return _sigfig_round(value, sigfigs=sigfigs, warn=False) def generatePlot(t_hf, t_hf_a, D, AUC, tn, quiet=False, plot_height=4, plot_width=10, font_size=12, basename='output'): @@ -37,11 +45,11 @@ def generatePlot(t_hf, t_hf_a, D, AUC, tn, quiet=False, plot_height=4, plot_widt V_F = D/kel/AUC outputs = collections.OrderedDict() - outputs['Tmax(hr)'] = utils.round_to_significant_number(Tmax, 3) - outputs['Cmax(mg/L)'] = utils.round_to_significant_number(Cmax, 3) - outputs['Kel(hr-1)'] = utils.round_to_significant_number(kel, 3) - outputs['Ka(hr-1)'] = utils.round_to_significant_number(ka, 3) - outputs['V/F(L)'] = utils.round_to_significant_number(V_F, 3) + outputs['Tmax(hr)'] = sigfig_round(Tmax, 3) + outputs['Cmax(mg/L)'] = sigfig_round(Cmax, 3) + outputs['Kel(hr-1)'] = sigfig_round(kel, 3) + outputs['Ka(hr-1)'] = sigfig_round(ka, 3) + outputs['V/F(L)'] = sigfig_round(V_F, 3) if not quiet: utils.log('------------------------------------------------------------------------------------------') diff --git a/enumerate.py b/enumerate.py index e9b9e9a..c4ab0f3 100755 --- a/enumerate.py +++ b/enumerate.py @@ -26,7 +26,8 @@ """ import os, sys, argparse, traceback, uuid, gzip -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import ProgressReporter, add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/fn_expand.py b/fn_expand.py index c92fa31..cf4847c 100755 --- a/fn_expand.py +++ b/fn_expand.py @@ -25,7 +25,7 @@ import os, argparse, time -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from standardize_molecule import standardize_to_noniso_smiles diff --git a/fn_find_synthons.py b/fn_find_synthons.py index 34723ec..796b163 100755 --- a/fn_find_synthons.py +++ b/fn_find_synthons.py @@ -25,7 +25,7 @@ import os, argparse, time -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from standardize_molecule import standardize_to_noniso_smiles diff --git a/fn_synthon_expansion.py b/fn_synthon_expansion.py index 49297f2..1652eb3 100755 --- a/fn_synthon_expansion.py +++ b/fn_synthon_expansion.py @@ -55,7 +55,7 @@ import os, argparse, time -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from standardize_molecule import standardize_to_noniso_smiles diff --git a/im_mordred/descriptor_generator.py b/im_mordred/descriptor_generator.py index 3035df3..a0187fb 100644 --- a/im_mordred/descriptor_generator.py +++ b/im_mordred/descriptor_generator.py @@ -20,7 +20,8 @@ from rdkit import Chem -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import ProgressReporter, add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/le_conformers.py b/le_conformers.py index a7213ff..e9306d1 100755 --- a/le_conformers.py +++ b/le_conformers.py @@ -23,7 +23,8 @@ """ import os, sys, argparse, traceback, time, gzip -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import ProgressReporter, add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/le_conformers_for_mol.py b/le_conformers_for_mol.py index da7c337..2d2d1fc 100755 --- a/le_conformers_for_mol.py +++ b/le_conformers_for_mol.py @@ -16,7 +16,8 @@ import time, argparse -import utils, le_conformers +import le_conformers +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem diff --git a/max_min_picker.py b/max_min_picker.py index cd01900..3c00da9 100755 --- a/max_min_picker.py +++ b/max_min_picker.py @@ -16,7 +16,7 @@ import argparse, time -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem, SimDivFilters diff --git a/minimize.py b/minimize.py index 566f220..35de5af 100755 --- a/minimize.py +++ b/minimize.py @@ -16,7 +16,7 @@ import sys, argparse, time -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem diff --git a/moldb/analyse.py b/moldb/analyse.py index 33f00d2..590bd6d 100644 --- a/moldb/analyse.py +++ b/moldb/analyse.py @@ -16,7 +16,7 @@ import argparse, datetime, time -import utils +from dm_job_utilities import utils from . import models, filter, moldb_utils from dm_job_utilities.dm_log import DmLog diff --git a/moldb/conformers.py b/moldb/conformers.py index 0bbaa55..f3e8616 100755 --- a/moldb/conformers.py +++ b/moldb/conformers.py @@ -20,7 +20,7 @@ same methodology that this module uses. """ import os, argparse, traceback, time, gzip -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem diff --git a/moldb/enumerate.py b/moldb/enumerate.py index c31bc0a..0dde371 100755 --- a/moldb/enumerate.py +++ b/moldb/enumerate.py @@ -26,7 +26,8 @@ """ import os, sys, argparse, traceback, logging -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem diff --git a/moldb/extract_need_molprops.py b/moldb/extract_need_molprops.py index 085e594..22b9d88 100755 --- a/moldb/extract_need_molprops.py +++ b/moldb/extract_need_molprops.py @@ -14,7 +14,7 @@ import argparse, time, os, random, string, traceback -import utils +from dm_job_utilities import utils from . import models from sqlalchemy import text diff --git a/moldb/filter.py b/moldb/filter.py index cacea84..c458926 100755 --- a/moldb/filter.py +++ b/moldb/filter.py @@ -14,7 +14,7 @@ import os, glob, argparse, time -import utils +from dm_job_utilities import utils from sqlalchemy import text from sqlalchemy.orm import Session diff --git a/moldb/models.py b/moldb/models.py index 5ae854d..d720583 100644 --- a/moldb/models.py +++ b/moldb/models.py @@ -21,7 +21,7 @@ import sqlalchemy -import utils +from dm_job_utilities import utils utils.log('sqlalchemy version:', sqlalchemy.__version__) diff --git a/moldb/moldb_utils.py b/moldb/moldb_utils.py index 3e89fc3..0effdb2 100644 --- a/moldb/moldb_utils.py +++ b/moldb/moldb_utils.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import utils +from dm_job_utilities import utils def add_filter_args(parser): parser.add_argument('--min-hac', type=int, help="Min value for heavy atom count") diff --git a/moldb/standardize.py b/moldb/standardize.py index 5d9b83d..49dfbfe 100755 --- a/moldb/standardize.py +++ b/moldb/standardize.py @@ -16,7 +16,7 @@ import argparse, os, json, gzip, time, logging -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem, RDLogger diff --git a/oddt_ifp.py b/oddt_ifp.py index 30804ee..c298716 100755 --- a/oddt_ifp.py +++ b/oddt_ifp.py @@ -16,7 +16,7 @@ import sys, argparse -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from oddt import toolkit, fingerprints diff --git a/oddt_interactions.py b/oddt_interactions.py index 1f6be21..8b3e525 100755 --- a/oddt_interactions.py +++ b/oddt_interactions.py @@ -81,7 +81,8 @@ import argparse, traceback import json, sys -import utils, interact +import interact +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog import oddt diff --git a/open3dalign.py b/open3dalign.py index 8e4352c..b015c5d 100755 --- a/open3dalign.py +++ b/open3dalign.py @@ -19,7 +19,7 @@ """ import argparse, sys -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from rdkit import Chem diff --git a/pharmacophore.py b/pharmacophore.py index 15942e8..b041671 100755 --- a/pharmacophore.py +++ b/pharmacophore.py @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from openbabel import pybel, openbabel from jinja2 import Template diff --git a/prepare_enum_conf_lists.py b/prepare_enum_conf_lists.py index 6f983a9..b591a46 100755 --- a/prepare_enum_conf_lists.py +++ b/prepare_enum_conf_lists.py @@ -16,8 +16,8 @@ import argparse, os -import utils -from utils import get_path_from_digest +from dm_job_utilities import utils +from digest_utils import get_path_from_digest from dm_job_utilities.dm_log import DmLog diff --git a/ranker.py b/ranker.py index 48a5ab1..f596ea6 100755 --- a/ranker.py +++ b/ranker.py @@ -19,7 +19,7 @@ from rdkit import Chem -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog diff --git a/rdkit_dedup.py b/rdkit_dedup.py index 7be79ef..a788691 100755 --- a/rdkit_dedup.py +++ b/rdkit_dedup.py @@ -18,7 +18,8 @@ import argparse, os, gzip, time import traceback -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import ProgressReporter, add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/rdkit_props.py b/rdkit_props.py index c96db65..e3ed806 100755 --- a/rdkit_props.py +++ b/rdkit_props.py @@ -17,7 +17,8 @@ import argparse, os, gzip, time -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import ProgressReporter, add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/reactor.py b/reactor.py index 9e01d8a..565e1ba 100755 --- a/reactor.py +++ b/reactor.py @@ -37,7 +37,7 @@ from rdkit import Chem from rdkit.Chem import AllChem, TemplateAlign -import utils +from dm_job_utilities import utils import rdkit_utils from dm_job_utilities.dm_log import DmLog diff --git a/sa_score.py b/sa_score.py index 417b81a..f7c6fab 100755 --- a/sa_score.py +++ b/sa_score.py @@ -28,7 +28,8 @@ import argparse, time, os, pickle, traceback, math from sigfig import round -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import ProgressReporter, add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/screen.py b/screen.py index d0e650f..122b096 100755 --- a/screen.py +++ b/screen.py @@ -17,7 +17,8 @@ import argparse, time import traceback -import utils, rdkit_utils +import rdkit_utils +from dm_job_utilities import utils from dm_job_utilities.cli import add_reporting_args from dm_job_utilities.dm_log import DmLog diff --git a/sdf_manip.py b/sdf_manip.py index e6a6b0e..ae1312a 100644 --- a/sdf_manip.py +++ b/sdf_manip.py @@ -101,7 +101,7 @@ from rdkit import Chem -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog diff --git a/sucos.py b/sucos.py index 950accb..a33bcdb 100755 --- a/sucos.py +++ b/sucos.py @@ -29,7 +29,7 @@ from rdkit import rdBase, RDConfig from rdkit.Chem import AllChem, rdShapeHelpers from rdkit.Chem.FeatMaps import FeatMaps -import utils +from dm_job_utilities import utils import rdkit_utils from dm_job_utilities.dm_log import DmLog diff --git a/usr.py b/usr.py index 155db4d..0191deb 100755 --- a/usr.py +++ b/usr.py @@ -32,7 +32,7 @@ """ import argparse, time -import utils +from dm_job_utilities import utils from dm_job_utilities.dm_log import DmLog from oddt import toolkit diff --git a/utils.py b/utils.py deleted file mode 100755 index 0cbf2e9..0000000 --- a/utils.py +++ /dev/null @@ -1,157 +0,0 @@ -from __future__ import print_function - -import os, sys -from math import log10, floor - -default_num_chars = 2 -default_num_levels = 2 - - -def log(*args, **kwargs): - """Log output to STDERR - """ - print(*args, file=sys.stderr, **kwargs) - - -def get_path_from_digest(digest, num_chars=default_num_chars, num_levels=default_num_levels): - parts = [] - start = 0 - for l in range(0, num_levels): - end = start + num_chars - p = digest[start:end] - parts.append(p) - start = start + num_chars - return parts - - -def expand_path(path): - """ - Create any necessary directories to ensure that the file path is valid - - :param path: a filename or directory that might or not exist - """ - head_tail = os.path.split(path) - if head_tail[0]: - if not os.path.isdir(head_tail[0]): - log('Creating directories for', head_tail[0]) - os.makedirs(head_tail[0], exist_ok=True) - - -def UpdateChargeFlagInAtomBlock(mb): - """ - See https://sourceforge.net/p/rdkit/mailman/message/36425493/ - """ - f="{:>10s}"*3+"{:>2}{:>4s}"+"{:>3s}"*11 - chgs = [] # list of charges - lines = mb.split("\n") - if mb[0] == '' or mb[0] == "\n": - del lines[0] - CTAB = lines[2] - atomCount = int(CTAB.split()[0]) - # parse mb line per line - for l in lines: - # look for M CHG property - if l[0:6] == "M CHG": - records = l.split()[3:] # M CHG X is not needed for parsing, the info we want comes afterwards - # record each charge into a list - for i in range(0,len(records),2): - idx = records[i] - chg = records[i+1] - chgs.append((int(idx), int(chg))) # sort tuples by first element? - break # stop iterating - - # sort by idx in order to parse the molblock only once more - chgs = sorted(chgs, key=lambda x: x[0]) - - # that we have a list for the current molblock, attribute each charges - for chg in chgs: - i=3 - while i < 3+atomCount: # do not read from beginning each time, rather continue parsing mb! - # when finding the idx of the atom we want to update, extract all fields and rewrite whole sequence - if i-2 == chg[0]: # -4 to take into account the CTAB headers, +1 because idx begin at 1 and not 0 - fields = lines[i].split() - x=fields[0] - y=fields[1] - z=fields[2] - symb=fields[3] - massDiff=fields[4] - charge=fields[5] - sp=fields[6] - hc=fields[7] - scb=fields[8] - v=fields[9] - hd=fields[10] - nu1=fields[11] - nu2=fields[12] - aamn=fields[13] - irf=fields[14] - ecf=fields[15] - # update charge flag - if chg[1] == -1: - charge = '5' - elif chg[1] == -2: - charge = '6' - elif chg[1] == -3: - charge = '7' - elif chg[1] == 1: - charge = '3' - elif chg[1] == 2: - charge = '2' - elif chg[1] == 3: - charge = '1' - else: - print("ERROR! " + str(lines[0]) + "unknown charge flag: " + str(chg[1])) # print name then go to next chg - break - # update modatom block line - lines[i] = f.format(x,y,z,symb,massDiff,charge,sp,hc,scb,v,hd,nu1,nu2,aamn,irf,ecf) - i+=1 - #print("\n".join(lines)) - del lines[-1] # remove empty element left because last character before $$$$ is \n - upmb = "\n" + "\n".join(lines) - return(upmb) - - -def read_delimiter(input): - if input: - if 'tab' == input: - delimiter = '\t' - elif 'space' == input: - delimiter = None - elif 'comma' == input: - delimiter = ',' - elif 'pipe' == input: - delimiter = '|' - else: - delimiter = input - else: - delimiter = None - return delimiter - - -def calc_geometric_mean(scores): - total = 1.0 - for score in scores: - total = total * score - result = total ** (1.0/len(scores)) - return result - - -def round_to_significant_number(val, sig): - """ - Round the value to the specified number of significant numbers - :param val: The number to round - :param sig: Number of significant numbers - :return: - """ - return round(val, sig - int(floor(log10(abs(val))))-1) - - -def is_type(value, typ): - if value is not None: - try: - i = typ(value) - return 1, i - except: - return -1, value - else: - return 0, value \ No newline at end of file