def fluct_match(host, type_na, time_label, start, end, cutoff, icfluct_0, icavg_0, scratchfolder, charmm, rootfolder): # Backup Folder backupfolder = path.join(scratchfolder, 'backup') check_dir_exist_and_make(backupfolder) # Set initial variables avg_file = path.join(scratchfolder, 'average_{0:.2f}.ic'.format(cutoff)) fluct_file = path.join(scratchfolder, 'fluct_{0:.2f}.ic'.format(cutoff)) prmfile = path.join(scratchfolder, 'na_enm_{0:.2f}.prm'.format(cutoff)) prm_backup = path.join(backupfolder, 'na_enm_{0:.2f}.backup.prm'.format(cutoff)) prm_backup_0 = path.join(backupfolder, 'na_enm_{0:.2f}.backup.0.prm'.format(cutoff)) err_file = path.join(scratchfolder, 'error_{0:.2f}.txt'.format(cutoff)) copyfile(prmfile, prm_backup_0) # Read icavg, icfluct, set k and target icavg = ic_table.ICTable(avg_file) icfluct = ic_table.ICTable(fluct_file) kbpair = ic_table.KBPair(read_from_prm=False, icavg=icavg, icfluct=icfluct, rt=RT) k = kbpair.d['k'] target = np.reciprocal(np.square(icfluct_0.values)) # Write Error f = open(err_file, 'w') f.write('Created at {0}\n'.format(datetime.datetime.now())) f.write('{0:<5} {1:8}\n'.format('n_iter', 'error')) f.close() # Iteration and Do NMA for i in range(start, end): print("IterNum: {0}".format(i)) nma_inp = path.join(scratchfolder, 'nma.inp') nma_dat = path.join(scratchfolder, 'nma.dat') if i == 0: write_nmainit_inp(nma_inp, host, type_na, time_label, cutoff, rootfolder, scratchfolder) exec_charmm(charmm, nma_inp, nma_dat) time.sleep(2) # Read icavg, icfluct new_icavg = ic_table.ICTable(avg_file) new_icfluct = ic_table.ICTable(fluct_file) optimized = np.reciprocal(np.square(new_icfluct.values)) # Be Careful, b0 is from icavg_0, which is the average structure of MD, it should be kept fix new_kbpair = ic_table.KBPair(read_from_prm=False, icavg=icavg_0, icfluct=new_icfluct, rt=RT) # Update k k -= alpha * (optimized - target) k[np.where(k < 0.)] = 0. # Make all negative values zero new_kbpair.d['k'] = k # Calculate RMSD error and Write error = icfluct_0.values - new_icfluct.values error = np.square(error).mean() error = np.sqrt(error) f = open(err_file, 'a') f.write('{0:<5} {1:8.4f}\n'.format(i + 1, error)) f.close() # Backup PRM copyfile(prmfile, prm_backup) # Update PRM prm_agent = prm.PRM(host, type_na, new_kbpair, iternum=i) prm_agent.write_prm(prmfile)
def main_split_window(rootfolder, host, type_na, time_label, cutoff, start, end, charmm): # Initialize agent = SmallTrajAgent(rootfolder, host, type_na, time_label) nadir = agent.time_folder charmminpfolder = path.join(nadir, 'charmm_inp') charmmdatfolder = path.join(nadir, 'charmm_dat') icfolder = path.join(nadir, 'ic') datafolder = path.join(nadir, 'data') agent.initialize_scratch_folders() scratchfolder = agent.scratchfolder # IC fluct icfluct_inp = path.join(charmminpfolder, 'ic_fluct_{0:.2f}.inp'.format(cutoff)) icfluct_dat = path.join(charmmdatfolder, 'ic_fluct_{0:.2f}.dat'.format(cutoff)) write_ic_fluct_inp(icfluct_inp, host, type_na, time_label, cutoff, rootfolder) exec_charmm(charmm, icfluct_inp, icfluct_dat) mode0ic = path.join(icfolder, 'mode.0.{0:.2f}.ic'.format(cutoff)) nafluctic = path.join(datafolder, 'na.fluct.{0:.2f}.ic'.format(cutoff)) with open(mode0ic, 'r') as f: context = f.read() context = re.sub(r'-99 ', ' -99 ', context) with open(nafluctic, 'w') as f: f.write(context) icfluct_0 = ic_table.ICTable(nafluctic, initial=True) # IC Avg icavg_inp = path.join(charmminpfolder, 'ic_avg_{0:.2f}.inp'.format(cutoff)) icavg_dat = path.join(charmmdatfolder, 'ic_avg_{0:.2f}.dat'.format(cutoff)) write_ic_avg_inp(icavg_inp, host, type_na, time_label, cutoff, rootfolder, distance_average=True) # Important! Check Fix b0 exec_charmm(charmm, icavg_inp, icavg_dat) mode0avgic = path.join(icfolder, 'mode.0.avg.{0:.2f}.ic'.format(cutoff)) naavgic = path.join(datafolder, 'na.avg.{0:.2f}.ic'.format(cutoff)) with open(mode0avgic, 'r') as f: context = f.read() context = re.sub(r'-99 ', ' -99 ', context) with open(naavgic, 'w') as f: f.write(context) icavg_0 = ic_table.ICTable(naavgic, initial=True) # Get the initial equilibrium distance and force constant and write PRM kbpair_0 = ic_table.KBPair(read_from_prm=False, icavg=icavg_0, icfluct=icfluct_0, rt=RT) scratch_prm = path.join( scratchfolder, 'na_enm_{0:.2f}.prm'.format(cutoff)) #!!! Important File prm_agent = prm.PRM(host, type_na, kbpair_0, iternum=0) prm_agent.write_prm(scratch_prm) # NMA Initialize nma_init_inp = path.join(scratchfolder, 'nmainit.inp') nma_init_dat = path.join(scratchfolder, 'nmainit.dat') write_nmainit_inp(nma_init_inp, host, type_na, time_label, cutoff, rootfolder, scratchfolder) exec_charmm(charmm, nma_init_inp, nma_init_dat) # Fluctuation-Matching fluct_match(host, type_na, time_label, start, end, cutoff, icfluct_0, icavg_0, scratchfolder, charmm, rootfolder) # Copy Back to the folder cutoffdatafolder = path.join(nadir, 'cutoffdata') check_dir_exist_and_make(cutoffdatafolder) lastprmfile = path.join(cutoffdatafolder, 'na_enm_{0:.2f}.prm'.format(cutoff)) copyfile(scratch_prm, lastprmfile) print('cp {0} {1}'.format(scratch_prm, lastprmfile)) err_file = path.join(scratchfolder, 'error_{0:.2f}.txt'.format(cutoff)) lasterrfile = path.join(cutoffdatafolder, 'error_{0:.2f}.txt'.format(cutoff)) copyfile(err_file, lasterrfile) print('cp {0} {1}'.format(err_file, lasterrfile)) nma_inp = path.join(scratchfolder, 'nma.inp') nma_inp_back = path.join(nadir, 'charmm_inp', f'nma_{cutoff:.2f}.inp') copyfile(nma_inp, nma_inp_back) nma_dat = path.join(scratchfolder, 'nma.dat') nma_dat_back = path.join(nadir, 'charmm_dat', f'nma_{cutoff:.2f}.dat') copyfile(nma_dat, nma_dat_back)