示例#1
0
 def mol2drs(self):
     for raw_name, fname, input_fpath, drs_input_fpath, output_fpath in self.iter_files():
         XMLWriter(input_fpath, drs_input_fpath, output_fpath)
         # dragon6shell -s *.drs to get the result
         cmd = "%s '%s'" % (CALCULATE_CMD_TYPE.DRAGON, drs_input_fpath)
         chemistry_logger.info('mol2drs cmd %s' % cmd)
         CalcoreCmd(cmd, output=output_fpath).run()
    def logPL(self):
        from .matrix.pl import plX
        #PL 模型,有温度参数
        #CAS-Number 1/T nHDon X1sol GATS1v μ nROH
        abstract_value = self.dragon_model.extractparameter(
            ["nHDon", "X1sol", "GATS1v", "μ", "nROH"])
        for smilenum in abstract_value.keys():
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)
            value = 13.33 - \
                2571.0 * (1 / self.T) - \
                0.5061 * abstract_value[smilenum]['nHDon'] - \
                0.6896 * abstract_value[smilenum]['X1sol'] + \
                0.8014 * abstract_value[smilenum]['GATS1v'] - \
                0.1363 * abstract_value[smilenum]['μ'] - \
                0.6094 * abstract_value[smilenum]['nROH']

            self.predict_result[smilenum]['logPL']['value'] = self.round(value)
            chemistry_logger.info('pl(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[(1 / self.T), abstract_value[smilenum]['nHDon'],
                         abstract_value[smilenum]['X1sol'],
                         abstract_value[smilenum]['GATS1v'],
                         abstract_value[smilenum]['μ'],
                         abstract_value[smilenum]['nROH']]])
            williams = self.get_williams(plX, x)
            self.predict_result[smilenum]['logPL'].update(williams)
    def logPL(self):
        from .matrix.pl import plX
        #PL 模型,有温度参数
        #CAS-Number 1/T nHDon X1sol GATS1v μ nROH
        abstract_value = self.dragon_model.extractparameter([
            "nHDon", "X1sol", "GATS1v", "μ", "nROH"])
        for smilenum in abstract_value.keys():
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)
            value = 13.33 - \
                2571.0 * (1 / self.T) - \
                0.5061 * abstract_value[smilenum]['nHDon'] - \
                0.6896 * abstract_value[smilenum]['X1sol'] + \
                0.8014 * abstract_value[smilenum]['GATS1v'] - \
                0.1363 * abstract_value[smilenum]['μ'] - \
                0.6094 * abstract_value[smilenum]['nROH']

            self.predict_result[smilenum]['logPL']['value'] = self.round(value)
            chemistry_logger.info('pl(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[(1 / self.T),
                         abstract_value[smilenum]['nHDon'],
                         abstract_value[smilenum]['X1sol'],
                         abstract_value[smilenum]['GATS1v'],
                         abstract_value[smilenum]['μ'],
                         abstract_value[smilenum]['nROH']]])
            williams = self.get_williams(plX, x)
            self.predict_result[smilenum]['logPL'].update(williams)
 def run(self):
     #FIXME: 运行时候加锁
     if not self.check_output_exists():
         chemistry_logger.info('[CalcoreCmd]%s(%s->%s)', self.cmd,
                               self.input, self.output)
         s = check_call(self.cmd, shell=True)
         chemistry_logger.info(s)
 def mol2drs(self):
     for raw_name, fname, input_fpath, drs_input_fpath, output_fpath in self.iter_files(
     ):
         XMLWriter(input_fpath, drs_input_fpath, output_fpath)
         # dragon6shell -s *.drs to get the result
         cmd = "%s '%s'" % (CALCULATE_CMD_TYPE.DRAGON, drs_input_fpath)
         chemistry_logger.info('mol2drs cmd %s' % cmd)
         CalcoreCmd(cmd, output=output_fpath).run()
    def logKOH_T(self):
        from .matrix.koh import kohX
        # KOH 温度依附性模型, 有温度参数
        #CAS-Number X% EHOMO Mor29u NdsCH GATS1e X3A 1/T SdsCH nR=Cp F02[F-Br] RDF015m BIC1 SpMin8_Bh(p) NssssC
        abstract_value = self.dragon_model.extractparameter([
            "X%", "EHOMO", "Mor29u", "NdsCH", "GATS1e", "X3A", "SdsCH",
            "nR=Cp", "F02[F-Br]", "RDF015m", "BIC1", "SpMin8_Bh(p)", "NssssC"
        ])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['EHOMO'] = fetch_ehomo(
                smilenum, 'logKOH_T')

            value = -8.613 - \
                0.02100 * abstract_value[smilenum]['X%'] + \
                14.38 * abstract_value[smilenum]['EHOMO'] - \
                0.6430 * abstract_value[smilenum]['Mor29u'] + \
                0.5870 * abstract_value[smilenum]['NdsCH'] + \
                0.5870 * abstract_value[smilenum]['GATS1e'] + \
                0.5770 * abstract_value[smilenum]['X3A'] - \
                0.2450 * abstract_value[smilenum]['SdsCH'] - \
                167.0 * (1 / self.T) + \
                1.103 * abstract_value[smilenum]['BIC1'] + \
                0.1170 * abstract_value[smilenum]['RDF015m'] - \
                1.044 * abstract_value[smilenum]['SpMin8_Bh(p)'] + \
                0.2390 * abstract_value[smilenum]['nR=Cp'] - \
                0.1980 * abstract_value[smilenum]['NssssC'] - \
                0.5080 * abstract_value[smilenum]['F02[F-Br]']

            self.predict_result[smilenum]['logKOH_T']['value'] = self.round(
                value)

            chemistry_logger.info('koh_t(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                abstract_value[smilenum]['X%'],
                abstract_value[smilenum]['EHOMO'],
                abstract_value[smilenum]['Mor29u'],
                abstract_value[smilenum]['NdsCH'],
                abstract_value[smilenum]['GATS1e'],
                abstract_value[smilenum]['X3A'], 1.0 / self.T,
                abstract_value[smilenum]['SdsCH'],
                abstract_value[smilenum]['nR=Cp'],
                abstract_value[smilenum]['F02[F-Br]'],
                abstract_value[smilenum]['RDF015m'],
                abstract_value[smilenum]['BIC1'],
                abstract_value[smilenum]['SpMin8_Bh(p)'],
                abstract_value[smilenum]['NssssC']
            ]])
            williams = self.get_williams(kohX, x)
            self.predict_result[smilenum]['logKOH_T'].update(williams)
    def logBDG(self):
        from .matrix.bdg import bdgX
        # BDG 无温度参数
        #CAS nN nHM O% MATS1e GATS1p GATS7p GGI1 GGI2 nCq nCrt C-040 H-048 H-051 O-059
        abstract_value = self.dragon_model.extractparameter([
            "nN", "nHM", "O%", "MATS1e", "GATS1p", "GATS7p", "GGI1", "GGI2",
            "nCq", "nCrt", "C-040", "H-048", "H-051", "O-059"
        ])

        for smilenum in abstract_value.keys():
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            x = 1.9025 + \
                1.0457 * abstract_value[smilenum]['nN'] + \
                0.6662 * abstract_value[smilenum]['nHM'] - \
                0.1078 * abstract_value[smilenum]['O%'] + \
                2.8362 * abstract_value[smilenum]['MATS1e'] - \
                2.0019 * abstract_value[smilenum]['GATS1p'] - \
                0.7015 * abstract_value[smilenum]['GATS7p'] + \
                0.1131 * abstract_value[smilenum]['GGI1'] + \
                0.7023 * abstract_value[smilenum]['GGI2'] + \
                2.7793 * abstract_value[smilenum]['nCq'] + \
                1.035 * abstract_value[smilenum]['nCrt'] - \
                0.777 * abstract_value[smilenum]['C-040'] - \
                0.7091 * abstract_value[smilenum]['H-048'] - \
                0.1553 * abstract_value[smilenum]['H-051'] + \
                0.955 * abstract_value[smilenum]['O-059']

            self.predict_result[smilenum]['logBDG']['value'] = self.round(x)
            self.predict_result[smilenum]['logBDG']['degrade'] = self.round(
                1 / (1 + math.exp(-x)))
            chemistry_logger.info('bdg(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                abstract_value[smilenum]['nN'],
                abstract_value[smilenum]['nHM'],
                abstract_value[smilenum]['O%'],
                abstract_value[smilenum]['MATS1e'],
                abstract_value[smilenum]['GATS1p'],
                abstract_value[smilenum]['GATS7p'],
                abstract_value[smilenum]['GGI1'],
                abstract_value[smilenum]['GGI2'],
                abstract_value[smilenum]['nCq'],
                abstract_value[smilenum]['nCrt'],
                abstract_value[smilenum]['C-040'],
                abstract_value[smilenum]['H-048'],
                abstract_value[smilenum]['H-051'],
                abstract_value[smilenum]['O-059']
            ]])

            williams = self.get_williams(bdgX, x)
            self.predict_result[smilenum]['logBDG'].update(williams)
    def logKOH(self):
        from .matrix.koh_298k import koh_298kX
        # KOH 298K预测模型, 无温度参数
        #CAS-Number EHOMO AMW NdsCH Mor14i nP nR=Cp X% nRCHO C-020 SpMaxA_AEA(dm) nCbH CATS2D_03_DL
        abstract_value = self.dragon_model.extractparameter([
            "EHOMO", "AMW", "NdsCH", "Mor14i", "nP", "nR=Cp", "X%", "nRCHO",
            "C-020", "SpMaxA_AEA(dm)", "nCbH", "CATS2D_03_DL"
        ])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['EHOMO'] = fetch_ehomo(smilenum, 'logKOH')

            value = -6.511 + \
                15.85 * abstract_value[smilenum]['EHOMO'] - \
                0.03800 * abstract_value[smilenum]['AMW'] + \
                0.1300 * abstract_value[smilenum]['NdsCH'] + \
                0.1630 * abstract_value[smilenum]['Mor14i'] + \
                0.7790 * abstract_value[smilenum]['nP'] + \
                0.3170 * abstract_value[smilenum]['nR=Cp'] - \
                0.01900 * abstract_value[smilenum]['X%'] + \
                0.3930 * abstract_value[smilenum]['nRCHO'] + \
                0.5890 * abstract_value[smilenum]['C-020'] - \
                0.4550 * abstract_value[smilenum]['SpMaxA_AEA(dm)'] - \
                0.05600 * abstract_value[smilenum]['nCbH'] + \
                0.1410 * abstract_value[smilenum]['CATS2D_03_DL']

            self.predict_result[smilenum]['logKOH']['value'] = self.round(
                value)

            chemistry_logger.info('koh(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                abstract_value[smilenum]['EHOMO'],
                abstract_value[smilenum]['AMW'],
                abstract_value[smilenum]['NdsCH'],
                abstract_value[smilenum]['Mor14i'],
                abstract_value[smilenum]['nP'],
                abstract_value[smilenum]['nR=Cp'],
                abstract_value[smilenum]['X%'],
                abstract_value[smilenum]['nRCHO'],
                abstract_value[smilenum]['C-020'],
                abstract_value[smilenum]['SpMaxA_AEA(dm)'],
                abstract_value[smilenum]['nCbH'],
                abstract_value[smilenum]['CATS2D_03_DL']
            ]])
            williams = self.get_williams(koh_298kX, x)
            self.predict_result[smilenum]['logKOH'].update(williams)
    def logKOH_T(self):
        from .matrix.koh import kohX
        # KOH 温度依附性模型, 有温度参数
        #CAS-Number X% EHOMO Mor29u NdsCH GATS1e X3A 1/T SdsCH nR=Cp F02[F-Br] RDF015m BIC1 SpMin8_Bh(p) NssssC
        abstract_value = self.dragon_model.extractparameter([
            "X%", "EHOMO", "Mor29u", "NdsCH", "GATS1e", "X3A", "SdsCH",
            "nR=Cp", "F02[F-Br]", "RDF015m", "BIC1", "SpMin8_Bh(p)", "NssssC"])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['EHOMO'] = fetch_ehomo(smilenum, 'logKOH_T')

            value = -8.613 - \
                0.02100 * abstract_value[smilenum]['X%'] + \
                14.38 * abstract_value[smilenum]['EHOMO'] - \
                0.6430 * abstract_value[smilenum]['Mor29u'] + \
                0.5870 * abstract_value[smilenum]['NdsCH'] + \
                0.5870 * abstract_value[smilenum]['GATS1e'] + \
                0.5770 * abstract_value[smilenum]['X3A'] - \
                0.2450 * abstract_value[smilenum]['SdsCH'] - \
                167.0 * (1 / self.T) + \
                1.103 * abstract_value[smilenum]['BIC1'] + \
                0.1170 * abstract_value[smilenum]['RDF015m'] - \
                1.044 * abstract_value[smilenum]['SpMin8_Bh(p)'] + \
                0.2390 * abstract_value[smilenum]['nR=Cp'] - \
                0.1980 * abstract_value[smilenum]['NssssC'] - \
                0.5080 * abstract_value[smilenum]['F02[F-Br]']
            
            self.predict_result[smilenum]['logKOH_T']['value'] = self.round(value)

            chemistry_logger.info('koh_t(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[abstract_value[smilenum]['X%'],
                         abstract_value[smilenum]['EHOMO'],
                         abstract_value[smilenum]['Mor29u'],
                         abstract_value[smilenum]['NdsCH'],
                         abstract_value[smilenum]['GATS1e'],
                         abstract_value[smilenum]['X3A'],
                         1.0 / self.T,
                         abstract_value[smilenum]['SdsCH'],
                         abstract_value[smilenum]['nR=Cp'],
                         abstract_value[smilenum]['F02[F-Br]'],
                         abstract_value[smilenum]['RDF015m'],
                         abstract_value[smilenum]['BIC1'],
                         abstract_value[smilenum]['SpMin8_Bh(p)'],
                         abstract_value[smilenum]['NssssC']
                         ]])
            williams = self.get_williams(kohX, x)
            self.predict_result[smilenum]['logKOH_T'].update(williams)
示例#10
0
    def mol2dragon_folder(self):
        mop_fname_set = set()

        # STEP: 将smile码经过obabel转化,生成mop文件,并放在指定目录中
        for element in self.iter_smiles_files(self.__smilenum_list, 'smile'):
            smile, name, dragon_dpath, mopac_dpath, mop_fpath = element
            # '-:smi' 可以直接对smile进行转化
            cmd = 'obabel -:"%s" -o mop -O "%s" --gen3D' % (smile, mop_fpath)

            chemistry_logger.info('mop2mopac, smi->mop: %s' % cmd)
            CalcoreCmd(cmd, output=mop_fpath).run()

            # 修改smi->mop文件的头部
            lines = []
            with open(mop_fpath, 'rb') as f:
                lines = f.readlines()
                if self.model_name in ('logKOA', ):
                    lines[0] = 'EF GNORM=0.0001 MMOK GEO-OK PM3\n'
                elif self.model_name in ('logRP', ):
                    lines[
                        0] = 'eps=78.6 EF GNORM =0.0100 MMOK GEO-OK PM6 MULLIK GRAPH ESR HYPERFINE POLAR PRECISE BOND PI ENPART DEBUG\n'
                elif self.model_name in ('logPL', ):
                    lines[0] = 'EF GNORM=0.01 MMOK GEO-OK PM6 MULLIK POLAR\n'
                elif self.model_name in ('logO3', ):
                    lines[
                        0] = 'EF GNORM=0.001 PM6 MULLIK GRAPH ESR HYPERFINE POLAR\n'
                elif self.model_name in ('logBDG', ):
                    lines[0] = 'EF GNORM=0.1 MMOK GEO-OK PM5\n'
                else:
                    lines[0] = 'no keywords'
                lines[1] = mopac_dpath + "\n"

            with open(mop_fpath, 'wb') as f:
                f.writelines(lines)
            mop_fname_set.add('%s.mop' % name)

        for element in self.iter_smiles_files(self.__molfile, 'file'):
            mol_fpath, name, dragon_dpath, mopac_dpath, _ = element
            mop_fpath = mol2mop(mol_fpath)

            if not os.path.exists(mopac_dpath):
                os.makedirs(mopac_dpath)

            shutil.copy(mop_fpath, mopac_dpath)

            mop_fname_set.add('%s.mop' % name)

        # 使用mopac对dragon结果进行优化(输入转化生成的mop文件)
        mop = MopacModel(mop_fname_set)
        mop.opt4dragon(self.model_name)
    def logO3(self):
        from .matrix.o3 import o3X

        #O3 有温度参数
        #EHOMO, SaasC, SpPosA­_B(m), nR=Cs, B01[C-C],
        #X2Av, nCconj, nDB, N-076
        abstract_value = self.dragon_model.extractparameter([
            "EHOMO", "SaasC", "SpPosA_B(m)", "nR=Cs", "B01[C-C]", "X2Av",
            "nCconj", "nDB", "N-076"
        ])

        chemistry_logger.info(abstract_value)

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['EHOMO'] = fetch_ehomo_by_mopac(
                smilenum, 'logO3')

            value = 2.549 + \
                1.534 * abstract_value[smilenum]['EHOMO'] - \
                1.284 * abstract_value[smilenum]['SaasC'] - \
                2.092 * abstract_value[smilenum]['SpPosA_B(m)'] + \
                0.3060 * abstract_value[smilenum]['nR=Cs'] + \
                1.113 * abstract_value[smilenum]['B01[C-C]'] - \
                2.289 * abstract_value[smilenum]['X2Av'] - \
                0.3470 * abstract_value[smilenum]['nCconj'] + \
                0.5960 * abstract_value[smilenum]['nDB'] - \
                1.301 * abstract_value[smilenum]['N-076'] - \
                878.7 / self.T

            self.predict_result[smilenum]['logO3']['value'] = self.round(value)
            chemistry_logger.info('O3(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                1.0 / self.T,
                abstract_value[smilenum]['EHOMO'],
                abstract_value[smilenum]['nDB'],
                abstract_value[smilenum]['SaasC'],
                abstract_value[smilenum]['SpPosA_B(m)'],
                abstract_value[smilenum]['nCconj'],
                abstract_value[smilenum]['nR=Cs'],
                abstract_value[smilenum]['B01[C-C]'],
                abstract_value[smilenum]['X2Av'],
                abstract_value[smilenum]['N-076'],
            ]])
            williams = self.get_williams(o3X, x)
            self.predict_result[smilenum]['logO3'].update(williams)
    def logKOA(self):
        from .matrix.koa import koaX

        #KOA 有温度参数
        #X1sol Mor13v H050 R5v TO..Cl HATS5v RDF035m RCl nRCOOR Mor15u RDF90m 1/T
        abstract_value = self.dragon_model.extractparameter([
            "X1sol", "Mor13v", "H-050", "R5v", "T(O..Cl)", "HATS5v", "RDF035m",
            "RCI", "nRCOOR", "Mor15u", "RDF090m"
        ])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            value = -3.03 + \
                313.0 * abstract_value[smilenum]['X1sol'] / self.T - \
                85.7 * abstract_value[smilenum]['Mor13v'] / self.T + \
                432.0 * abstract_value[smilenum]['H-050'] / self.T - \
                1270.0 * abstract_value[smilenum]['R5v'] / self.T - \
                5.54 * abstract_value[smilenum]['T(O..Cl)'] / self.T + \
                125.0 * abstract_value[smilenum]['HATS5v'] / self.T - \
                13.3 * abstract_value[smilenum]['RDF035m'] / self.T - \
                61.1 * abstract_value[smilenum]['RCI'] / self.T - \
                37.6 * abstract_value[smilenum]['nRCOOR'] / self.T + \
                156.0 * abstract_value[smilenum]['Mor15u'] / self.T -\
                5.49 * abstract_value[smilenum]['RDF090m'] / self.T + \
                1040.0 / self.T

            self.predict_result[smilenum]['logKOA']['value'] = self.round(
                value)
            chemistry_logger.info('koa(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                abstract_value[smilenum]['X1sol'] / self.T,
                abstract_value[smilenum]['Mor13v'] / self.T,
                abstract_value[smilenum]['H-050'] / self.T,
                abstract_value[smilenum]['R5v'] / self.T,
                abstract_value[smilenum]['T(O..Cl)'] / self.T,
                abstract_value[smilenum]['HATS5v'] / self.T,
                abstract_value[smilenum]['RDF035m'] / self.T,
                abstract_value[smilenum]['RCI'] / self.T,
                abstract_value[smilenum]['nRCOOR'] / self.T,
                abstract_value[smilenum]['Mor15u'] / self.T,
                abstract_value[smilenum]['RDF090m'] / self.T,
                1.0 / self.T,
            ]])
            williams = self.get_williams(koaX, x)
            self.predict_result[smilenum]['logKOA'].update(williams)
    def mol2dragon_folder(self):
        mop_fname_set = set()

        # STEP: 将smile码经过obabel转化,生成mop文件,并放在指定目录中
        for element in self.iter_smiles_files(self.__smilenum_list, 'smile'):
            smile, name, dragon_dpath, mopac_dpath, mop_fpath = element
            # '-:smi' 可以直接对smile进行转化
            cmd = 'obabel -:"%s" -o mop -O "%s" --gen3D' % (smile,
                                                            mop_fpath)

            chemistry_logger.info('mop2mopac, smi->mop: %s' % cmd)
            CalcoreCmd(cmd, output=mop_fpath).run()

            # 修改smi->mop文件的头部
            lines = []
            with open(mop_fpath, 'rb') as f:
                lines = f.readlines()
                if self.model_name in ('logKOA',):
                    lines[0] = 'EF GNORM=0.0001 MMOK GEO-OK PM3\n'
                elif self.model_name in ('logRP',):
                    lines[0] = 'eps=78.6 EF GNORM =0.0100 MMOK GEO-OK PM6 MULLIK GRAPH ESR HYPERFINE POLAR PRECISE BOND PI ENPART DEBUG\n'
                elif self.model_name in ('logPL',):
                    lines[0] = 'EF GNORM=0.01 MMOK GEO-OK PM6 MULLIK POLAR\n'
                elif self.model_name in ('logO3', ):
                    lines[0] = 'EF GNORM=0.001 PM6 MULLIK GRAPH ESR HYPERFINE POLAR\n'
                elif self.model_name in ('logBDG',):
                    lines[0] = 'EF GNORM=0.1 MMOK GEO-OK PM5\n'
                else:
                    lines[0] = 'no keywords'
                lines[1] = mopac_dpath + "\n"

            with open(mop_fpath, 'wb') as f:
                f.writelines(lines)
            mop_fname_set.add('%s.mop' % name)

        for element in self.iter_smiles_files(self.__molfile, 'file'):
            mol_fpath, name, dragon_dpath, mopac_dpath, _ = element
            mop_fpath = mol2mop(mol_fpath)

            if not os.path.exists(mopac_dpath):
                os.makedirs(mopac_dpath)

            shutil.copy(mop_fpath, mopac_dpath)

            mop_fname_set.add('%s.mop' % name)

        # 使用mopac对dragon结果进行优化(输入转化生成的mop文件)
        mop = MopacModel(mop_fname_set)
        mop.opt4dragon(self.model_name)
    def logBDG(self):
        from .matrix.bdg import bdgX
        # BDG 无温度参数
        #CAS nN nHM O% MATS1e GATS1p GATS7p GGI1 GGI2 nCq nCrt C-040 H-048 H-051 O-059
        abstract_value = self.dragon_model.extractparameter([
            "nN", "nHM", "O%", "MATS1e", "GATS1p", "GATS7p", "GGI1", "GGI2",
            "nCq", "nCrt", "C-040", "H-048", "H-051", "O-059"])

        for smilenum in abstract_value.keys():
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            x = 1.9025 + \
                1.0457 * abstract_value[smilenum]['nN'] + \
                0.6662 * abstract_value[smilenum]['nHM'] - \
                0.1078 * abstract_value[smilenum]['O%'] + \
                2.8362 * abstract_value[smilenum]['MATS1e'] - \
                2.0019 * abstract_value[smilenum]['GATS1p'] - \
                0.7015 * abstract_value[smilenum]['GATS7p'] + \
                0.1131 * abstract_value[smilenum]['GGI1'] + \
                0.7023 * abstract_value[smilenum]['GGI2'] + \
                2.7793 * abstract_value[smilenum]['nCq'] + \
                1.035 * abstract_value[smilenum]['nCrt'] - \
                0.777 * abstract_value[smilenum]['C-040'] - \
                0.7091 * abstract_value[smilenum]['H-048'] - \
                0.1553 * abstract_value[smilenum]['H-051'] + \
                0.955 * abstract_value[smilenum]['O-059']

            self.predict_result[smilenum]['logBDG']['value'] = self.round(x)
            self.predict_result[smilenum]['logBDG']['degrade'] = self.round(1 / (1 + math.exp(-x)))
            chemistry_logger.info('bdg(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[abstract_value[smilenum]['nN'],
                         abstract_value[smilenum]['nHM'],
                         abstract_value[smilenum]['O%'],
                         abstract_value[smilenum]['MATS1e'],
                         abstract_value[smilenum]['GATS1p'],
                         abstract_value[smilenum]['GATS7p'],
                         abstract_value[smilenum]['GGI1'],
                         abstract_value[smilenum]['GGI2'],
                         abstract_value[smilenum]['nCq'],
                         abstract_value[smilenum]['nCrt'],
                         abstract_value[smilenum]['C-040'],
                         abstract_value[smilenum]['H-048'],
                         abstract_value[smilenum]['H-051'],
                         abstract_value[smilenum]['O-059']]])

            williams = self.get_williams(bdgX, x)
            self.predict_result[smilenum]['logBDG'].update(williams)
    def logBCF(self):
        from .matrix.bcf import bcfX
        #BCF 无温度参数
        #CAS NO. MLOGP2 F02[C-Cl] nROH P-117 Mor25m N% X4v O-058 LLS_01 H4v SM12_AEA(dm) O-057
        abstract_value = self.dragon_model.extractparameter([
            "MLOGP2", "F02[C-Cl]", "nROH", "P-117", "Mor25m", "N%", "X4v",
            "O-058", "LLS_01", "H4v", "SM12_AEA(dm)", "O-057"
        ])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)
            value = 2.137 + \
                0.061 * abstract_value[smilenum]['MLOGP2'] + \
                0.034 * abstract_value[smilenum]['F02[C-Cl]'] - \
                0.312 * abstract_value[smilenum]['nROH'] - \
                1.282 * abstract_value[smilenum]['P-117'] + \
                0.323 * abstract_value[smilenum]['Mor25m'] - \
                0.052 * abstract_value[smilenum]['N%'] + \
                0.080 * abstract_value[smilenum]['X4v'] - \
                0.289 * abstract_value[smilenum]['O-058'] - \
                1.137 * abstract_value[smilenum]['LLS_01'] - \
                1.387 * abstract_value[smilenum]['H4v'] + \
                0.071 * abstract_value[smilenum]['SM12_AEA(dm)'] - \
                0.269 * abstract_value[smilenum]['O-057']

            self.predict_result[smilenum]['logBCF']['value'] = self.round(
                value)

            chemistry_logger.info('bcf(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                abstract_value[smilenum]['MLOGP2'],
                abstract_value[smilenum]['F02[C-Cl]'],
                abstract_value[smilenum]['nROH'],
                abstract_value[smilenum]['P-117'],
                abstract_value[smilenum]['Mor25m'],
                abstract_value[smilenum]['N%'],
                abstract_value[smilenum]['X4v'],
                abstract_value[smilenum]['O-058'],
                abstract_value[smilenum]['LLS_01'],
                abstract_value[smilenum]['H4v'],
                abstract_value[smilenum]['SM12_AEA(dm)'],
                abstract_value[smilenum]['O-057']
            ]])
            williams = self.get_williams(bcfX, x)
            self.predict_result[smilenum]['logBCF'].update(williams)
示例#16
0
def hide(request, id):
    category = request.GET.get('category')
    if category == 'suite':
        rs = SuiteTask.objects.filter(sid=id)
    elif category == 'single':
        rs = SingleTask.objects.filter(pid=id)
    else:
        return HttpResponseRedirect('/history')

    chemistry_logger.info('hide %s %s' % (category, id))

    for r in rs:
        r.is_hide = True
        r.save()

    return HttpResponseRedirect('/history')
示例#17
0
def hide(request, id):
    category = request.GET.get("category")
    if category == "suite":
        rs = SuiteTask.objects.filter(sid=id)
    elif category == "single":
        rs = SingleTask.objects.filter(pid=id)
    else:
        return HttpResponseRedirect("/history")

    chemistry_logger.info("hide %s %s" % (category, id))

    for r in rs:
        r.is_hide = True
        r.save()

    return HttpResponseRedirect("/history")
    def logO3(self):
        from .matrix.o3 import o3X

        #O3 有温度参数
        #EHOMO, SaasC, SpPosA­_B(m), nR=Cs, B01[C-C],
        #X2Av, nCconj, nDB, N-076
        abstract_value = self.dragon_model.extractparameter([
            "EHOMO", "SaasC", "SpPosA_B(m)", "nR=Cs",
            "B01[C-C]", "X2Av", "nCconj", "nDB", "N-076"
        ])

        chemistry_logger.info(abstract_value)

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['EHOMO'] = fetch_ehomo_by_mopac(smilenum, 'logO3')

            value = 2.549 + \
                1.534 * abstract_value[smilenum]['EHOMO'] - \
                1.284 * abstract_value[smilenum]['SaasC'] - \
                2.092 * abstract_value[smilenum]['SpPosA_B(m)'] + \
                0.3060 * abstract_value[smilenum]['nR=Cs'] + \
                1.113 * abstract_value[smilenum]['B01[C-C]'] - \
                2.289 * abstract_value[smilenum]['X2Av'] - \
                0.3470 * abstract_value[smilenum]['nCconj'] + \
                0.5960 * abstract_value[smilenum]['nDB'] - \
                1.301 * abstract_value[smilenum]['N-076'] - \
                878.7 / self.T

            self.predict_result[smilenum]['logO3']['value'] = self.round(value)
            chemistry_logger.info('O3(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[1.0 / self.T,
                         abstract_value[smilenum]['EHOMO'],
                         abstract_value[smilenum]['nDB'],
                         abstract_value[smilenum]['SaasC'],
                         abstract_value[smilenum]['SpPosA_B(m)'],
                         abstract_value[smilenum]['nCconj'],
                         abstract_value[smilenum]['nR=Cs'],
                         abstract_value[smilenum]['B01[C-C]'],
                         abstract_value[smilenum]['X2Av'],
                         abstract_value[smilenum]['N-076'],
                         ]])
            williams = self.get_williams(o3X, x)
            self.predict_result[smilenum]['logO3'].update(williams)
    def logKOA(self):
        from .matrix.koa import koaX

        #KOA 有温度参数
        #X1sol Mor13v H050 R5v TO..Cl HATS5v RDF035m RCl nRCOOR Mor15u RDF90m 1/T
        abstract_value = self.dragon_model.extractparameter([
            "X1sol", "Mor13v", "H-050", "R5v",
            "T(O..Cl)", "HATS5v", "RDF035m",
            "RCI", "nRCOOR", "Mor15u",
            "RDF090m"])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            value = -3.03 + \
                313.0 * abstract_value[smilenum]['X1sol'] / self.T - \
                85.7 * abstract_value[smilenum]['Mor13v'] / self.T + \
                432.0 * abstract_value[smilenum]['H-050'] / self.T - \
                1270.0 * abstract_value[smilenum]['R5v'] / self.T - \
                5.54 * abstract_value[smilenum]['T(O..Cl)'] / self.T + \
                125.0 * abstract_value[smilenum]['HATS5v'] / self.T - \
                13.3 * abstract_value[smilenum]['RDF035m'] / self.T - \
                61.1 * abstract_value[smilenum]['RCI'] / self.T - \
                37.6 * abstract_value[smilenum]['nRCOOR'] / self.T + \
                156.0 * abstract_value[smilenum]['Mor15u'] / self.T -\
                5.49 * abstract_value[smilenum]['RDF090m'] / self.T + \
                1040.0 / self.T

            self.predict_result[smilenum]['logKOA']['value'] = self.round(value)
            chemistry_logger.info('koa(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[abstract_value[smilenum]['X1sol'] / self.T,
                         abstract_value[smilenum]['Mor13v'] / self.T,
                         abstract_value[smilenum]['H-050'] / self.T,
                         abstract_value[smilenum]['R5v'] / self.T,
                         abstract_value[smilenum]['T(O..Cl)'] / self.T,
                         abstract_value[smilenum]['HATS5v'] / self.T,
                         abstract_value[smilenum]['RDF035m'] / self.T,
                         abstract_value[smilenum]['RCI'] / self.T,
                         abstract_value[smilenum]['nRCOOR'] / self.T,
                         abstract_value[smilenum]['Mor15u'] / self.T,
                         abstract_value[smilenum]['RDF090m'] / self.T,
                         1.0 / self.T,
                         ]])
            williams = self.get_williams(koaX, x)
            self.predict_result[smilenum]['logKOA'].update(williams)
示例#20
0
def submit_calculate_task(user, smile=None, draw_mol_data=None,
                          task_notes=None, task_name=None,
                          files_id_list=None, models=None,
                          local_search_id=None):

    chemistry_logger.info("smile: %s" % smile)
    chemistry_logger.info("draw_mol_data: %s" % draw_mol_data)
    chemistry_logger.info("files_id_list: %s" % files_id_list)
    chemistry_logger.info("models: %s" % models)

    tasks_num = calculate_tasks(files_id_list, smile, draw_mol_data, models)

    if tasks_num == 0:
        status = False
        info = "请至少选择一种输入方式和计算模型!"
        id = None
        return (status, info, id)

    try:
        s = SuiteTask()
        s.sid = id = str(uuid.uuid4())
        s.user = UserProfile.objects.get(user=user)
        s.total_tasks = tasks_num
        s.has_finished_tasks = 0
        s.start_time = utils.get_real_now()
        s.name = task_name
        s.notes = task_notes
        s.models_str, s.models_category_str = parse_models(models)
        s.status = StatusCategory.objects.get(category=STATUS_WORKING)
        s.email = user.email
        s.save()
        
        chemistry_logger.info('~~~~~~~~ s:%s' % s.start_time)

        generate_calculate_task.delay(models, smile, draw_mol_data,
                                      files_id_list, id, local_search_id)
    except:
        chemistry_logger.exception('failed to generate suite_task')
        s.delete()
        status = False
        info = "计算任务添加不成功,将重试或联系网站管理员!"
        id = None
    else:
        status = True
        info = "恭喜,计算任务已经提交!"

    return (status, info, id)
    def logKOH(self):
        from .matrix.koh_298k import koh_298kX
        # KOH 298K预测模型, 无温度参数
        #CAS-Number EHOMO AMW NdsCH Mor14i nP nR=Cp X% nRCHO C-020 SpMaxA_AEA(dm) nCbH CATS2D_03_DL
        abstract_value = self.dragon_model.extractparameter([
            "EHOMO", "AMW", "NdsCH", "Mor14i", "nP", "nR=Cp",
            "X%", "nRCHO", "C-020", "SpMaxA_AEA(dm)",
            "nCbH", "CATS2D_03_DL"])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['EHOMO'] = fetch_ehomo(smilenum, 'logKOH')

            value = -6.511 + \
                15.85 * abstract_value[smilenum]['EHOMO'] - \
                0.03800 * abstract_value[smilenum]['AMW'] + \
                0.1300 * abstract_value[smilenum]['NdsCH'] + \
                0.1630 * abstract_value[smilenum]['Mor14i'] + \
                0.7790 * abstract_value[smilenum]['nP'] + \
                0.3170 * abstract_value[smilenum]['nR=Cp'] - \
                0.01900 * abstract_value[smilenum]['X%'] + \
                0.3930 * abstract_value[smilenum]['nRCHO'] + \
                0.5890 * abstract_value[smilenum]['C-020'] - \
                0.4550 * abstract_value[smilenum]['SpMaxA_AEA(dm)'] - \
                0.05600 * abstract_value[smilenum]['nCbH'] + \
                0.1410 * abstract_value[smilenum]['CATS2D_03_DL']
            
            self.predict_result[smilenum]['logKOH']['value'] = self.round(value)

            chemistry_logger.info('koh(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[abstract_value[smilenum]['EHOMO'],
                         abstract_value[smilenum]['AMW'],
                         abstract_value[smilenum]['NdsCH'],
                         abstract_value[smilenum]['Mor14i'],
                         abstract_value[smilenum]['nP'],
                         abstract_value[smilenum]['nR=Cp'],
                         abstract_value[smilenum]['X%'],
                         abstract_value[smilenum]['nRCHO'],
                         abstract_value[smilenum]['C-020'],
                         abstract_value[smilenum]['SpMaxA_AEA(dm)'],
                         abstract_value[smilenum]['nCbH'],
                         abstract_value[smilenum]['CATS2D_03_DL']]])
            williams = self.get_williams(koh_298kX, x)
            self.predict_result[smilenum]['logKOH'].update(williams)
示例#22
0
    def gjf4dragon(self, model_name):
        for name in self.gjf_fname_list_no_ext:
            mol_path = join(CALCULATE_DATA_PATH.DRAGON, model_name, name,
                            '%s.mol' % name)
            gjf_path = join(CALCULATE_DATA_PATH.GAUSSIAN, model_name, name,
                            '%s.gjf' % name)
            log_path = join(CALCULATE_DATA_PATH.GAUSSIAN, model_name, name,
                            '%s.log' % name)

            cmd = '%s "%s"' % (CALCULATE_CMD_TYPE.GAUSSIAN, gjf_path)
            chemistry_logger.info('gif4dragon part1 cmd: %s' % cmd)
            # 此处需要注意g09输出是.log文件
            CalcoreCmd(cmd, output=log_path).run()

            cmd = 'obabel -ig09 "%s" -omol -O "%s"' % (log_path, mol_path)
            chemistry_logger.info('gif4dragon part2 cmd: %s' % cmd)
            CalcoreCmd(cmd, output=mol_path).run()
    def logKOC(self):
        from .matrix.koc import kocX
        # KOC 使用g09,无温度参数
        #CAS No. nN ATSC8v SpMaxA_G/D Mor16u nROH O-058 P-117 MLOGP2 Molecular Polarizability
        abstract_value = self.dragon_model.extractparameter([
            "nN", "ATSC8v", "SpMaxA_G/D", "Mor16u", "nROH", "O-058", "P-117",
            "MLOGP2", "α"
        ])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['α'] = fetch_polarizability(
                smilenum, 'logKOC')
            value = -1.612 + \
                0.039 * abstract_value[smilenum]['MLOGP2'] +\
                0.010 * abstract_value[smilenum]["α"] -\
                0.342 * abstract_value[smilenum]['O-058'] -\
                0.069 * abstract_value[smilenum]['ATSC8v'] -\
                0.123 * abstract_value[smilenum]['nN'] -\
                0.368 * abstract_value[smilenum]['nROH'] -\
                0.473 * abstract_value[smilenum]['P-117'] +\
                2.335 * abstract_value[smilenum]['SpMaxA_G/D'] +\
                0.302 * abstract_value[smilenum]['Mor16u']

            self.predict_result[smilenum]['logKOC']['value'] = self.round(
                value)
            chemistry_logger.info('koc(%s) dragon: %s' %
                                  (smilenum, abstract_value[smilenum]))

            x = matrix([[
                abstract_value[smilenum]['nN'],
                abstract_value[smilenum]['ATSC8v'],
                abstract_value[smilenum]['SpMaxA_G/D'],
                abstract_value[smilenum]['Mor16u'],
                abstract_value[smilenum]['nROH'],
                abstract_value[smilenum]['O-058'],
                abstract_value[smilenum]['P-117'],
                abstract_value[smilenum]['MLOGP2'],
                abstract_value[smilenum]["α"]
            ]])

            williams = self.get_williams(kocX, x)
            self.predict_result[smilenum]['logKOC'].update(williams)
示例#24
0
    def opt4dragon(self, model_name):
        for name in self.mop_fname_list_no_ext:
            mol_path = join(CALCULATE_DATA_PATH.DRAGON, model_name, name,
                            '%s.mol' % name)
            mop_path = join(CALCULATE_DATA_PATH.MOPAC, model_name, name,
                            '%s.mop' % name)
            out_path = join(CALCULATE_DATA_PATH.MOPAC, model_name, name,
                            '%s.out' % name)

            cmd = '%s "%s"' % (CALCULATE_CMD_TYPE.MOPAC, mop_path)
            chemistry_logger.info('opt4dragon part1 cmd: %s' % cmd)
            # 此处输出是.out文件
            CalcoreCmd(cmd, output=out_path).run()

            cmd = 'obabel -imoo "%s" -omol -O "%s" --gen3D' % (out_path,
                                                               mol_path)
            chemistry_logger.info('opt4dragon part2 cmd: %s' % cmd)
            CalcoreCmd(cmd, output=mol_path).run()
    def logBCF(self):
        from .matrix.bcf import bcfX
        #BCF 无温度参数
        #CAS NO. MLOGP2 F02[C-Cl] nROH P-117 Mor25m N% X4v O-058 LLS_01 H4v SM12_AEA(dm) O-057
        abstract_value = self.dragon_model.extractparameter([
            "MLOGP2", "F02[C-Cl]", "nROH",
            "P-117", "Mor25m", "N%", "X4v",
            "O-058", "LLS_01", "H4v", "SM12_AEA(dm)", "O-057"])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)
            value = 2.137 + \
                0.061 * abstract_value[smilenum]['MLOGP2'] + \
                0.034 * abstract_value[smilenum]['F02[C-Cl]'] - \
                0.312 * abstract_value[smilenum]['nROH'] - \
                1.282 * abstract_value[smilenum]['P-117'] + \
                0.323 * abstract_value[smilenum]['Mor25m'] - \
                0.052 * abstract_value[smilenum]['N%'] + \
                0.080 * abstract_value[smilenum]['X4v'] - \
                0.289 * abstract_value[smilenum]['O-058'] - \
                1.137 * abstract_value[smilenum]['LLS_01'] - \
                1.387 * abstract_value[smilenum]['H4v'] + \
                0.071 * abstract_value[smilenum]['SM12_AEA(dm)'] - \
                0.269 * abstract_value[smilenum]['O-057']
            
            self.predict_result[smilenum]['logBCF']['value'] = self.round(value)

            chemistry_logger.info('bcf(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[abstract_value[smilenum]['MLOGP2'],
                         abstract_value[smilenum]['F02[C-Cl]'],
                         abstract_value[smilenum]['nROH'],
                         abstract_value[smilenum]['P-117'],
                         abstract_value[smilenum]['Mor25m'],
                         abstract_value[smilenum]['N%'],
                         abstract_value[smilenum]['X4v'],
                         abstract_value[smilenum]['O-058'],
                         abstract_value[smilenum]['LLS_01'],
                         abstract_value[smilenum]['H4v'],
                         abstract_value[smilenum]['SM12_AEA(dm)'],
                         abstract_value[smilenum]['O-057']]])
            williams = self.get_williams(bcfX, x)
            self.predict_result[smilenum]['logBCF'].update(williams)
示例#26
0
def generate_mol_image(singletask):
    """generate smile and image for task"""
    chemistry_logger.info('generate smile image %s' % singletask.pid)
    fpath = settings.SETTINGS_ROOT + singletask.file_obj.file_obj.url
    mol = pybel.readfile("mol", fpath).next()
    singletask.file_obj.smiles = ("%s" % mol).split("\t")[0]

    pname = str(uuid.uuid4()) + ".png"
    if not os.path.exists(settings.SEARCH_IMAGE_PATH):
        os.makedirs(settings.SEARCH_IMAGE_PATH)

    ppath = os.path.join(settings.SEARCH_IMAGE_PATH, pname)
    mol.draw(show=False, filename=ppath)

    f = File(open(ppath, "r"))
    singletask.file_obj.image = f
    singletask.file_obj.save()
    singletask.save()
    f.close()
示例#27
0
def save_record(f, model, sid, source_type, smile=None, local_search_id=None):
    from chemistry.tasks import calculateTask, DEFAULT_TEMPERATURE_ARGS
    task = SingleTask()
    task.start_time = utils.get_real_now() 
    task.sid = SuiteTask.objects.get(sid=sid)
    task.pid = str(uuid.uuid4())
    task.model = ModelCategory.objects.get(category=model['model'])

    temperature = model.get('temperature')
    task.temperature = float(temperature) if temperature else DEFAULT_TEMPERATURE_ARGS

    if source_type == ORIGIN_UPLOAD:
        # here, f is ProcessedFile record instance
        f.file_source = FileSourceCategory.objects.get(category=source_type)
        f.file_type = "mol"
        task.file_obj = f
        f.save()
    elif source_type in (ORIGIN_SMILE, ORIGIN_DRAW):
        # here, f is a file path
        processed_f = ProcessedFile()
        obj = File(open(f, "r"))
        processed_f.title = os.path.basename(obj.name)
        processed_f.file_type = source_type
        processed_f.file_source = FileSourceCategory.objects.get(category=source_type)
        processed_f.file_obj = obj
        if smile:
            processed_f.smiles = smile

        if source_type == ORIGIN_SMILE and local_search_id is not None:
            processed_f.local_search_id = int(local_search_id)

        processed_f.save()
        task.file_obj = processed_f
        obj.close()
    else:
        raise ErrorCalculateType('Cannot recongize this source type')

    task.status = StatusCategory.objects.get(category=STATUS_WORKING)
    task.save()

    chemistry_logger.info('~~~~~~~~ t:%s' % task.start_time)

    calculateTask.delay(task, sid, model)
示例#28
0
def fetch_ehomo(name, model):
    path = os.path.join(config.GAUSSIAN_PATH, model, name, '%s.log' % name)

    if not os.path.exists(path):
        chemistry_logger.error('Cannot fetch H**O %s' % path)
        return 0.0

    ret = []

    with open(path, 'r') as f:
        for line in f.readlines():
            if EHOMO_RE.search(line):
                chemistry_logger.info(line)
                ret.append(line)
    try:
        v = float(ret[-1].split()[-1])
    except Exception as e:
        chemistry_logger.exception('Cannot get EHOMO value %s ' % line)
        v = 0

    return v
示例#29
0
def fetch_ehomo(name, model):
    path = os.path.join(config.GAUSSIAN_PATH, model, name, '%s.log' % name)

    if not os.path.exists(path):
        chemistry_logger.error('Cannot fetch H**O %s' % path)
        return 0.0

    ret = []

    with open(path, 'r') as f:
        for line in f.readlines():
            if EHOMO_RE.search(line):
                chemistry_logger.info(line)
                ret.append(line)
    try:
        v = float(ret[-1].split()[-1])
    except Exception as e:
        chemistry_logger.exception('Cannot get EHOMO value %s ' % line)
        v = 0

    return v
示例#30
0
def add_counter(suite_id):
    """
    use filter to get task numbers
    """
    finished_count = SingleTask.objects.filter(sid=suite_id)\
                                       .exclude(status=StatusCategory.objects.get(category=STATUS_WORKING))\
                                       .count()
    suite = SuiteTask.objects.get(sid=suite_id)

    if finished_count == suite.total_tasks:
        suite.has_finished_tasks = suite.total_tasks
        suite.status_id = StatusCategory.objects.get(category=STATUS_SUCCESS)
        suite.end_time = utils.get_real_now()
        suite.save()

        send_email_task(suite.email, suite.sid)
    else:
        suite.has_finished_tasks = finished_count
        suite.save()

    chemistry_logger.info('~~~~~~~~ s-e:%s' % suite.end_time)
示例#31
0
def add_counter(suite_id):
    """
    use filter to get task numbers
    """
    finished_count = SingleTask.objects.filter(sid=suite_id)\
                                       .exclude(status=StatusCategory.objects.get(category=STATUS_WORKING))\
                                       .count()
    suite = SuiteTask.objects.get(sid=suite_id)

    if finished_count == suite.total_tasks:
        suite.has_finished_tasks = suite.total_tasks
        suite.status_id = StatusCategory.objects.get(category=STATUS_SUCCESS)
        suite.end_time = utils.get_real_now()
        suite.save()

        send_email_task(suite.email, suite.sid)
    else:
        suite.has_finished_tasks = finished_count
        suite.save()

    chemistry_logger.info('~~~~~~~~ s-e:%s' % suite.end_time)
示例#32
0
def calculateTask(task, sid, model):
    try:
        generate_mol_image(task)
        suite = SuiteTask.objects.get(sid=sid)
        map_model_name = get_model_name(model['model'])
        smile = task.file_obj.smiles.encode(
            'utf-8') if task.file_obj.file_type != 'mol' else ''

        # smile, mol_fpath 输入只选择一种方式(优先smile)
        mol_fpath = os.path.join(
            settings.SETTINGS_ROOT,
            task.file_obj.file_obj.path) if not smile else None

        try:
            temperature = float(model.get('temperature'))
        except:
            temperature = DEFAULT_TEMPERATURE_ARGS

        chemistry_logger.info(
            'PredictionModel calculating: model name(%s),'
            'smile(%s) mol path(%s) temperature(%s)', map_model_name, smile,
            mol_fpath, temperature)
        # 后台模型计算入口
        predict_results = prediction_model_calculate(map_model_name, smile,
                                                     mol_fpath, temperature)

        if task.file_obj.file_type == 'mol':
            name = os.path.basename(mol_fpath).split('.')[0]
        else:
            name = smile
        result = predict_results[name][map_model_name]
        chemistry_logger.info('[task]result %s' % result)
    except KeyError:
        chemistry_logger.exception('still cannot support this model')
        result = None
        task.result_state = "We don't support this model now"
        task.status = StatusCategory.objects.get(category=STATUS_FAILED)
        suite.status_id = StatusCategory.objects.get(category=STATUS_FAILED)
    except Exception as e:
        chemistry_logger.exception('failed to submit task to prediction model')
        result = None
        task.result_state = str(e)
        task.status = StatusCategory.objects.get(category=STATUS_FAILED)
        suite.status_id = StatusCategory.objects.get(category=STATUS_FAILED)
    else:
        chemistry_logger.info("calculate Successfully in celery queue!")
        task.result_state = "Calculate Successfully!"
        task.status = StatusCategory.objects.get(category=STATUS_SUCCESS)
        suite.status_id = StatusCategory.objects.get(category=STATUS_WORKING)

    task.end_time = utils.get_real_now()
    task.results = json.dumps(result)

    suite.save()
    task.save()

    add_counter(suite.sid)

    return result
    def logKOC(self):
        from .matrix.koc import kocX
        # KOC 使用g09,无温度参数
        #CAS No. nN ATSC8v SpMaxA_G/D Mor16u nROH O-058 P-117 MLOGP2 Molecular Polarizability
        abstract_value = self.dragon_model.extractparameter([
            "nN", "ATSC8v", "SpMaxA_G/D", "Mor16u", "nROH",
            "O-058", "P-117", "MLOGP2", "α"])

        for smilenum in abstract_value:
            if smilenum not in self.predict_result:
                self.predict_result[smilenum] = defaultdict(dict)

            abstract_value[smilenum]['α'] = fetch_polarizability(smilenum, 'logKOC')
            value = -1.612 + \
                0.039 * abstract_value[smilenum]['MLOGP2'] +\
                0.010 * abstract_value[smilenum]["α"] -\
                0.342 * abstract_value[smilenum]['O-058'] -\
                0.069 * abstract_value[smilenum]['ATSC8v'] -\
                0.123 * abstract_value[smilenum]['nN'] -\
                0.368 * abstract_value[smilenum]['nROH'] -\
                0.473 * abstract_value[smilenum]['P-117'] +\
                2.335 * abstract_value[smilenum]['SpMaxA_G/D'] +\
                0.302 * abstract_value[smilenum]['Mor16u']

            self.predict_result[smilenum]['logKOC']['value'] = self.round(value)
            chemistry_logger.info('koc(%s) dragon: %s' % (smilenum, abstract_value[smilenum]))

            x = matrix([[abstract_value[smilenum]['nN'],
                         abstract_value[smilenum]['ATSC8v'],
                         abstract_value[smilenum]['SpMaxA_G/D'],
                         abstract_value[smilenum]['Mor16u'],
                         abstract_value[smilenum]['nROH'],
                         abstract_value[smilenum]['O-058'],
                         abstract_value[smilenum]['P-117'],
                         abstract_value[smilenum]['MLOGP2'],
                         abstract_value[smilenum]["α"]]])

            williams = self.get_williams(kocX, x)
            self.predict_result[smilenum]['logKOC'].update(williams)
示例#34
0
    def mol2gjf2dragon_folder(self):
        gaussian_files_set = set()

        for element in self.iter_smiles_files(self.__smilenum_list, 'smile'):
            smile, name, dragon_dpath, mopac_dpath, mop_fpath = element
            gaussian_dpath = join(CALCULATE_DATA_PATH.GAUSSIAN,
                                  self.model_name, name)

            # smile-> mol
            mol_fpath = self.smile2_3d(smile)

            # mol -> gjf file
            gjf_fpath = mol2gjf(mol_fpath, self.model_name)

            if not os.path.exists(dragon_dpath):
                os.makedirs(dragon_dpath)

            if not os.path.exists(gaussian_dpath):
                os.makedirs(gaussian_dpath)

            shutil.copy(mol_fpath, dragon_dpath)
            shutil.copy(gjf_fpath, gaussian_dpath)
            gaussian_files_set.add('%s.gjf' % name)

        for element in self.iter_smiles_files(self.__molfile, 'file'):
            mol_fpath, name, dragon_dpath, mopac_dpath, mop_fpath = element

            if not os.path.exists(dragon_dpath):
                os.makedirs(dragon_dpath)

            shutil.copy(mol_fpath, dragon_dpath)
            gaussian_files_set.add('%s.gjf' % name)

        #FIXME: gaussian 计算很慢吗?
        chemistry_logger.info('GaussianOptimizeModel gjf4dragon')
        gjf = GaussianOptimizeModel(gaussian_files_set)
        gjf.gjf4dragon(self.model_name)
    def mol2gjf2dragon_folder(self):
        gaussian_files_set = set()

        for element in self.iter_smiles_files(self.__smilenum_list, 'smile'):
            smile, name, dragon_dpath, mopac_dpath, mop_fpath = element
            gaussian_dpath = join(CALCULATE_DATA_PATH.GAUSSIAN, self.model_name, name)

            # smile-> mol
            mol_fpath = self.smile2_3d(smile)

            # mol -> gjf file
            gjf_fpath = mol2gjf(mol_fpath, self.model_name)

            if not os.path.exists(dragon_dpath):
                os.makedirs(dragon_dpath)

            if not os.path.exists(gaussian_dpath):
                os.makedirs(gaussian_dpath)

            shutil.copy(mol_fpath, dragon_dpath)
            shutil.copy(gjf_fpath, gaussian_dpath)
            gaussian_files_set.add('%s.gjf' % name)

        for element in self.iter_smiles_files(self.__molfile, 'file'):
            mol_fpath, name, dragon_dpath, mopac_dpath, mop_fpath = element

            if not os.path.exists(dragon_dpath):
                os.makedirs(dragon_dpath)

            shutil.copy(mol_fpath, dragon_dpath)
            gaussian_files_set.add('%s.gjf' % name)

        #FIXME: gaussian 计算很慢吗?
        chemistry_logger.info('GaussianOptimizeModel gjf4dragon')
        gjf = GaussianOptimizeModel(gaussian_files_set)
        gjf.gjf4dragon(self.model_name)
示例#36
0
def calculateTask(task, sid, model):
    try:
        generate_mol_image(task)
        suite = SuiteTask.objects.get(sid=sid)
        map_model_name = get_model_name(model['model'])
        smile = task.file_obj.smiles.encode('utf-8') if task.file_obj.file_type != 'mol' else ''

        # smile, mol_fpath 输入只选择一种方式(优先smile)
        mol_fpath = os.path.join(settings.SETTINGS_ROOT, task.file_obj.file_obj.path) if not smile else None

        try:
            temperature = float(model.get('temperature'))
        except:
            temperature = DEFAULT_TEMPERATURE_ARGS

        chemistry_logger.info('PredictionModel calculating: model name(%s),'
                              'smile(%s) mol path(%s) temperature(%s)',
                              map_model_name, smile, mol_fpath, temperature)
        # 后台模型计算入口
        predict_results = prediction_model_calculate(map_model_name, smile,
                                                     mol_fpath, temperature)

        if task.file_obj.file_type == 'mol':
            name = os.path.basename(mol_fpath).split('.')[0]
        else:
            name = smile
        result = predict_results[name][map_model_name]
        chemistry_logger.info('[task]result %s' % result)
    except KeyError:
        chemistry_logger.exception('still cannot support this model')
        result = None
        task.result_state = "We don't support this model now"
        task.status = StatusCategory.objects.get(category=STATUS_FAILED)
        suite.status_id = StatusCategory.objects.get(category=STATUS_FAILED)
    except Exception as e:
        chemistry_logger.exception('failed to submit task to prediction model')
        result = None
        task.result_state = str(e)
        task.status = StatusCategory.objects.get(category=STATUS_FAILED)
        suite.status_id = StatusCategory.objects.get(category=STATUS_FAILED)
    else:
        chemistry_logger.info("calculate Successfully in celery queue!")
        task.result_state = "Calculate Successfully!"
        task.status = StatusCategory.objects.get(category=STATUS_SUCCESS)
        suite.status_id = StatusCategory.objects.get(category=STATUS_WORKING)

    task.end_time = utils.get_real_now()
    task.results = json.dumps(result)

    suite.save()
    task.save()

    add_counter(suite.sid)

    return result
示例#37
0
 def run(self):
     #FIXME: 运行时候加锁
     if not self.check_output_exists():
         chemistry_logger.info('[CalcoreCmd]%s(%s->%s)', self.cmd, self.input, self.output)
         s= check_call(self.cmd, shell=True)
         chemistry_logger.info(s)
示例#38
0
def mol2gjf(fpath, model_name):
    if model_name in ('logKOH', 'logKOH_T'):
        element = dict.fromkeys([
            'H', 'C', 'N', 'O', 'F', 'P', 'S', 'Cl', 'Se', 'Br', 'I', 'Si',
            'Hg', 'Pb'
        ], 0)

    fname = os.path.basename(fpath)
    fname_no_ext = fname.split('.')[0]

    content = []

    with open(fpath, 'r') as f:
        for line in f.readlines():
            try:
                values = line.split()
                if 'A' < values[3] < 'Z':
                    content.append(
                        ' %s %s %s %s\n' %
                        (values[3], values[0], values[1], values[2]))
                    if model_name in ('logKOH', 'logKOH_T'):
                        element[values[3]] = 1

            except Exception:
                pass

    gjf_list = []
    gjf_list.append('%%chk=%s.chk\n' % fname_no_ext)
    gjf_list.append('%nproc=2\n')
    gjf_list.append('%mem=2GB\n')

    if model_name in ('logKOH', 'logKOH_T'):
        element_op = (element['I'] | element['Si'] | element['Hg']
                      | element['Pb']) == 1
        if element_op:
            gjf_list.append(
                '#p opt freq b3lyp/genecp scf=tight int=ultrafine\n')
        else:
            gjf_list.append(
                '#p opt freq b3lyp/6-311+G(d,p) scf=tight int=ultrafine\n')
    elif model_name in ("logKOC", "logBCF"):
        gjf_list.append(
            '#p opt freq b3lyp/6-31+g(d,p) SCRF=(IEFPCM,SOLVENT=WATER)\n')

    gjf_list.append('\n')
    gjf_list.append('Title Card Required\n')
    gjf_list.append('\n')
    gjf_list.append('0 1\n')
    gjf_list.extend(content)
    gjf_list.append('\n')

    if model_name in ('logKOH', 'logKOH_T') and element_op:
        tempC = ""
        tempHg = ""
        for t in ('I', 'Si', 'Hg', 'Pb'):
            if element[t] == 1:
                element[t] = 0
                tempHg += "%s " % t

        for key in element:
            if element[key] == 1:
                tempC += "%s " % key

        gjf_list.append('%s 0\n' % tempC)
        gjf_list.append('6-31+g(d,p)\n')
        gjf_list.append('****\n')
        gjf_list.append('%s 0\n' % tempHg)
        gjf_list.append('LANL2DZ\n')
        gjf_list.append('****\n\n')
        gjf_list.append('%s 0\n' % tempHg)
        gjf_list.append('LANL2DZ\n\n')

    gjf_fpath = join(settings.MOL_ABSTRACT_FILE_PATH, '%s.gjf' % fname_no_ext)
    chemistry_logger.info('mol->gjf gjf path: %s' % gjf_fpath)
    chemistry_logger.info('mol->gjf, content: %s' % gjf_list)
    with open(gjf_fpath, 'w') as f:
        f.writelines(tuple(gjf_list))

    return gjf_fpath
def prediction_model_calculate(model_name, smile, mol_fpath, temperature):
    pm = PredictionModel(model_name, smile, mol_fpath, T=temperature)
    pm.calculate(model_name)
    chemistry_logger.info("pm result:%s", pm.predict_result)
    return pm.predict_result
    def extractparameter(self, parameters=None):
        '''从drs文件中将对应参数名列表中对应的描述符名称的值提取出来,返回的是一个字典'''
        firsttraverse = True
        para_dic = {}
        # record para position in drs file
        temp_dic = {}

        for raw_name, fname, input_fpath, drs_input_fpath, output_fpath in self.iter_files(
        ):
            para_dic[raw_name] = {p: 0 for p in parameters}
            with open(output_fpath, 'r') as fp:
                lines = fp.readlines()
                paraline = lines[0].split()
                valueline = lines[1].split()

            if firsttraverse:
                firsttraverse = False
                for i in range(len(paraline)):
                    if paraline[i] in para_dic[raw_name]:
                        temp_dic[paraline[i]] = i
                        para_dic[raw_name][paraline[i]] = float(valueline[i])
            else:
                for key in temp_dic.keys():
                    try:
                        para_dic[raw_name][key] = float(
                            valueline[temp_dic[key]])
                    except:
                        print key, temp_dic[i], valueline[temp_dic[key]]

            if self.model_name in ('logKOH', 'logKOH_T'):
                f_log = join(CALCULATE_DATA_PATH.GAUSSIAN, self.model_name,
                             raw_name, '%s.log' % raw_name)
                f = open(f_log, 'r')
                lines = f.readlines()
                f.close()

                regex = '.*Alpha  occ. eigenvalues.*'

                for lineNum in range(len(lines)):
                    if re.match(regex, lines[lineNum]):
                        while (re.match(regex, lines[lineNum])):
                            lineNum = lineNum + 1
                        List = list(lines[lineNum].split(' '))
                        while (1):
                            try:
                                List.remove('')
                            except:
                                break
                        EHOMO = lines[lineNum - 1].split(' ')[-1]
                        para_dic[raw_name]["EHOMO"] = float(EHOMO)
                        break
            elif self.model_name in ('logPL', ):
                f_out = join(CALCULATE_DATA_PATH.MOPAC, self.model_name,
                             raw_name, '%s.out' % raw_name)
                f = open(f_out, 'r')
                lines = f.readlines()
                f.close()

                regex = '.*ATOM NO\..*TYPE.*CHARGE.*No\.'
                j = 0
                for lineNum in range(len(lines)):
                    if re.match(regex, lines[lineNum]):
                        chemistry_logger.info('PL out %s' % lines[lineNum])
                        while (not re.match('.*DIPOLE.*', lines[lineNum + j])):
                            j = j + 1
                        chemistry_logger.info('PL out2 %s' %
                                              lines[lineNum + j + 3])
                        para_dic[raw_name]["u"] = float(lines[lineNum + j +
                                                              3].split()[-1])
                        break

        return para_dic
示例#41
0
    def extractparameter(self, parameters=None):
        '''从drs文件中将对应参数名列表中对应的描述符名称的值提取出来,返回的是一个字典'''
        firsttraverse = True
        para_dic = {}
        # record para position in drs file
        temp_dic = {}

        for raw_name, fname, input_fpath, drs_input_fpath, output_fpath in self.iter_files():
            para_dic[raw_name] = {p: 0 for p in parameters}
            with open(output_fpath, 'r') as fp:
                lines = fp.readlines()
                paraline = lines[0].split()
                valueline = lines[1].split()

            if firsttraverse:
                firsttraverse = False
                for i in range(len(paraline)):
                    if paraline[i] in para_dic[raw_name]:
                        temp_dic[paraline[i]] = i
                        para_dic[raw_name][paraline[i]] = float(valueline[i])
            else:
                for key in temp_dic.keys():
                    try:
                        para_dic[raw_name][key] = float(valueline[temp_dic[key]])
                    except:
                        print key, temp_dic[i], valueline[temp_dic[key]]

            if self.model_name in ('logKOH', 'logKOH_T'):
                f_log = join(CALCULATE_DATA_PATH.GAUSSIAN, self.model_name, raw_name,
                             '%s.log' % raw_name)
                f = open(f_log, 'r')
                lines = f.readlines()
                f.close()

                regex = '.*Alpha  occ. eigenvalues.*'

                for lineNum in range(len(lines)):
                    if re.match(regex, lines[lineNum]):
                        while(re.match(regex, lines[lineNum])):
                            lineNum = lineNum + 1
                        List = list(lines[lineNum].split(' '))
                        while(1):
                            try:
                                List.remove('')
                            except:
                                break
                        EHOMO = lines[lineNum - 1].split(' ')[-1]
                        para_dic[raw_name]["EHOMO"] = float(EHOMO)
                        break
            elif self.model_name in ('logPL',):
                f_out = join(CALCULATE_DATA_PATH.MOPAC, self.model_name, raw_name,
                             '%s.out' % raw_name)
                f = open(f_out, 'r')
                lines = f.readlines()
                f.close()

                regex = '.*ATOM NO\..*TYPE.*CHARGE.*No\.'
                j = 0
                for lineNum in range(len(lines)):
                    if re.match(regex, lines[lineNum]):
                        chemistry_logger.info('PL out %s' % lines[lineNum])
                        while(not re.match('.*DIPOLE.*', lines[lineNum + j])):
                            j = j + 1
                        chemistry_logger.info('PL out2 %s' % lines[lineNum + j + 3])
                        para_dic[raw_name]["u"] = float(lines[lineNum + j + 3].split()[-1])
                        break

        return para_dic
def prediction_model_calculate(model_name, smile, mol_fpath, temperature):
    pm = PredictionModel(model_name, smile, mol_fpath, T=temperature)
    pm.calculate(model_name)
    chemistry_logger.info("pm result:%s", pm.predict_result)
    return pm.predict_result
def mol2gjf(fpath, model_name):
    if model_name in ('logKOH', 'logKOH_T'):
        element = dict.fromkeys([
            'H', 'C', 'N', 'O', 'F', 'P', 'S', 'Cl',
            'Se', 'Br', 'I', 'Si', 'Hg', 'Pb'], 0)

    fname = os.path.basename(fpath)
    fname_no_ext = fname.split('.')[0]

    content = []

    with open(fpath, 'r') as f:
        for line in f.readlines():
            try:
                values = line.split()
                if 'A' < values[3] < 'Z':
                    content.append(' %s %s %s %s\n' % (values[3], values[0],
                                                       values[1], values[2]))
                    if model_name in ('logKOH', 'logKOH_T'):
                        element[values[3]] = 1

            except Exception:
                pass

    gjf_list = []
    gjf_list.append('%%chk=%s.chk\n' % fname_no_ext)
    gjf_list.append('%nproc=2\n')
    gjf_list.append('%mem=2GB\n')

    if model_name in ('logKOH', 'logKOH_T'):
        element_op = (element['I'] | element['Si'] | element['Hg'] |
                      element['Pb']) == 1
        if element_op:
            gjf_list.append('#p opt freq b3lyp/genecp scf=tight int=ultrafine\n')
        else:
            gjf_list.append('#p opt freq b3lyp/6-311+G(d,p) scf=tight int=ultrafine\n')
    elif model_name in ("logKOC", "logBCF"):
        gjf_list.append('#p opt freq b3lyp/6-31+g(d,p) SCRF=(IEFPCM,SOLVENT=WATER)\n')

    gjf_list.append('\n')
    gjf_list.append('Title Card Required\n')
    gjf_list.append('\n')
    gjf_list.append('0 1\n')
    gjf_list.extend(content)
    gjf_list.append('\n')

    if model_name in ('logKOH', 'logKOH_T') and element_op:
        tempC = ""
        tempHg = ""
        for t in ('I', 'Si', 'Hg', 'Pb'):
            if element[t] == 1:
                element[t] = 0
                tempHg += "%s " % t

        for key in element:
            if element[key] == 1:
                tempC += "%s " % key

        gjf_list.append('%s 0\n' % tempC)
        gjf_list.append('6-31+g(d,p)\n')
        gjf_list.append('****\n')
        gjf_list.append('%s 0\n' % tempHg)
        gjf_list.append('LANL2DZ\n')
        gjf_list.append('****\n\n')
        gjf_list.append('%s 0\n' % tempHg)
        gjf_list.append('LANL2DZ\n\n')

    gjf_fpath = join(settings.MOL_ABSTRACT_FILE_PATH, '%s.gjf' % fname_no_ext)
    chemistry_logger.info('mol->gjf gjf path: %s' % gjf_fpath)
    chemistry_logger.info('mol->gjf, content: %s' % gjf_list)
    with open(gjf_fpath, 'w') as f:
        f.writelines(tuple(gjf_list))

    return gjf_fpath