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