Skip to content

Commit

Permalink
Merge pull request #5 from VirtualPlanetaryLaboratory/dev
Browse files Browse the repository at this point in the history
windows issue
  • Loading branch information
caitlyn-wilhelm authored Sep 14, 2021
2 parents 14bc8a0 + 434d23b commit 100bf5c
Show file tree
Hide file tree
Showing 9 changed files with 237 additions and 30 deletions.
2 changes: 2 additions & 0 deletions multiplanet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@
__copyright__ = "Copyright 2020 Caitlyn Wilhelm"

from .multiplanet import *

from .multiplanet_module import *
180 changes: 180 additions & 0 deletions multiplanet/bp_get.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
#!/usr/bin/env python

import os
import subprocess as sub
import sys


def ReadFile(bplSplitFile,verbose = False):

includelist = []
excludelist = []
bodylist = []
bpl_file = None

with open(bplSplitFile, 'r') as input:
#first thing we check is if both include and exclude are in the file bc that is bad
if 'saKeyInclude' and 'saKeyExclude' in input.read():
print("ERROR: saKeyInclude and saKeyExclude are mutually exclusive")
exit()

with open(bplSplitFile, 'r') as input:
#now we loop over the file and get the various inputs
content = [line.strip().split() for line in input.readlines()]
for line in content:
if line:
#we get the folder where the raw data is stored and have the default output file name set
if line[0] == 'sDestFolder':
folder_name = line[1]
outputFile = folder_name.split('/')[-1] + "_filtered.bpl"
if line[0] == 'sBigplanetFile':
bpl_file = line[1]
if line[0] == 'sOutputName':
outputFile = line[1]
if line[0] == 'sPrimaryFile':
primaryFile = line[1]
if line[0] == 'bUlysses':
thing = line[1]
if line[0] == "saBodyFiles":
bodylist = line[1:]
for i, value in enumerate(bodylist):
bodylist[i] = value.strip("[]")
if line[0] == 'saKeyInclude':
includelist = line[1:]
for i, value in enumerate(includelist):
includelist[i] = value.strip("[]")
if line[0] == 'saKeyExclude':
excludelist = line[1:]
for i, value in enumerate(excludelist):
excludelist[i] = value.strip("[]")

if bpl_file == None and includelist == [] and excludelist == []:
print("No BPL Archive file or Include/Exclude List detected. This will create the BPL Archive File.")
print("WARNING: This may take some time...")


if verbose:
print("Folder Name:",folder_name)
if bpl_file != None and includelist != [] and excludelist != []:
print("BPL Archive File:",bpl_file)
print("Include List:",includelist)
print("Exclude List:",excludelist)
print("Output File:",outputFile)
print("Body Files:",bodylist)
print("Primary File:",primaryFile)


return folder_name,bpl_file,outputFile,bodylist,primaryFile,includelist,excludelist


def GetDir(vspace_file):
""" Give it input file and returns name of folder where simulations are located. """

infiles = []
# gets the folder name with all the sims
with open(vspace_file, 'r') as vpl:
content = [line.strip().split() for line in vpl.readlines()]
for line in content:
if line:
if line[0] == 'destfolder':
folder_name = line[1]

if line[0] == 'bodyfile' or line[0] == 'primaryfile':
infiles.append(line[1])
if folder_name is None:
raise IOError("Name of destination folder not provided in file '%s'."
"Use syntax 'destfolder <foldername>'"% vspace_file)


if os.path.isdir(folder_name) == False:
print("ERROR: Folder", folder_name, "does not exist in the current directory.")
exit()

return folder_name, infiles

def GetSims(folder_name):
""" Pass it folder name where simulations are and returns list of simulation folders. """
#gets the list of sims
sims = sorted([f.path for f in os.scandir(os.path.abspath(folder_name)) if f.is_dir()])
return sims

def GetSNames(in_files,sims):
#get system and the body names
body_names = []

for file in in_files:
#gets path to infile
full_path = os.path.join(sims[0],file)
#if the infile is the vpl.in, then get the system name
if "vpl.in" in file:
with open(full_path, 'r') as vpl:
content = [line.strip().split() for line in vpl.readlines()]
for line in content:
if line:
if line[0] == 'sSystemName':
system_name = line[1]
else:
with open(full_path, 'r') as infile:
content = [line.strip().split() for line in infile.readlines()]
for line in content:
if line:
if line[0] == 'sName':
body_names.append(line[1])

return system_name,body_names

def GetVplanetHelp():
command = "vplanet -H | egrep -v '^$|^\+' | cut -f 2,4 -d '|' | egrep '^ \*\*|^ Cust|^ Type|^ Dim|^ Defa|^Output Parameters'"
py_ver = sys.version.split()[0]
if '3.6' in py_ver:
proc = sub.run(command, shell = True, universal_newlines = True, stdout=sub.PIPE,stderr=sub.PIPE)
else:
proc = sub.run(command, shell = True, text = True, stdout=sub.PIPE,stderr=sub.PIPE)
output = proc.stdout.splitlines()

vplanet_dict = {}

for count, line in enumerate(output):
if ((line.startswith(' **b') or line.startswith(' **d') or line.startswith(' **i') or line.startswith(' **s')) or line.startswith(' **sa') and len(line.split()) == 1):

option = line.strip("** ")
#print("Option:",option)
vplanet_dict[option] = {}
num = count + 1
while num != count:
if "Type" in output[num]:
tp = output[num].rpartition('|')[-1].strip()
vplanet_dict[option]['Type'] = tp
#print("Type:",tp)
num += 1

elif "Custom unit" in output[num]:
custom_unit = output[num].rpartition('|')[-1].strip()
vplanet_dict[option]['Custom Unit'] = custom_unit
#print("Custom Unit:",custom_unit)
num += 1

elif "Dimension(s)" in output[num]:
dim = output[num].rpartition('|')[-1].strip()
vplanet_dict[option]['Dimension'] = dim
#print("Dimension:",dim)
num += 1

elif "Default value" in output[num]:
default = output[num].rpartition('|')[-1].strip()
vplanet_dict[option]['Default Value'] = default
#print("Default Value",default)
#print()

num += 1

elif "**" in output[num]:
num = count

else:
num += 1

if "Output Parameters" in line:
break

return vplanet_dict
56 changes: 31 additions & 25 deletions multiplanet/multiplanet.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import argparse
import h5py
import numpy as np
from bigplanet import CreateHDF5Group, GetSNames, GetSims
from .bp_get import *

# --------------------------------------------------------------------

Expand Down Expand Up @@ -62,7 +62,8 @@ def parallel_run_planet(input_file, cores, quiet, bigplanet, email):
w.join()

if bigplanet == False:
sub.run(["rm", master_hdf5_file])
if os.path.isfile(master_hdf5_file) == True:
sub.run(["rm", master_hdf5_file])
if email is not None:
SendMail(email, folder_name)

Expand Down Expand Up @@ -117,20 +118,25 @@ def CreateCP(checkpoint_file, input_file, quiet, sims):
def ReCreateCP(checkpoint_file, input_file, quiet, sims):
if quiet == False:
print("WARNING: multi-planet checkpoint file already exists!")
print("Checking if checkpoint file is corrupt...")

datalist = []

with open(checkpoint_file, "r") as f:
for newline in f:
with open(checkpoint_file, "r") as re:
for newline in re:
datalist.append(newline.strip().split())
for l in datalist:
if l[1] == "0":
l[1] = "-1"

with open(checkpoint_file, "w") as f:
for l in datalist:
if l[1] == "0":
l[1] = "-1"
if datalist[-1] != ["THE","END"]:
lest = datalist[-2][0]
idx = sims.index(lest)
for f in range(idx+2,len(sims)):
datalist.append([sims[f],'-1'])
datalist.append(["THE","END"])

with open(checkpoint_file, "w") as wr:
for newline in datalist:
f.writelines(" ".join(newline) + "\n")
wr.writelines(" ".join(newline) + "\n")


## parallel worker to run vplanet ##
Expand Down Expand Up @@ -207,19 +213,19 @@ def par_worker(
break
if quiet == False:
print(folder, "completed")
if bigplanet == True:
with h5py.File(h5_file, "w") as Master:
group_name = folder.split("/")[-1]
if group_name not in Master:
CreateHDF5Group(
data,
system_name,
body_list,
log_file,
group_name,
in_files,
h5_file,
)
# if bigplanet == True:
# with h5py.File(h5_file, "w") as Master:
# group_name = folder.split("/")[-1]
# if group_name not in Master:
# CreateHDF5Group(
# data,
# system_name,
# body_list,
# log_file,
# group_name,
# in_files,
# h5_file,
# )
else:
for l in datalist:
if l[0] == folder:
Expand Down Expand Up @@ -259,7 +265,7 @@ def Arguments():
"-bp",
"--bigplanet",
action="store_true",
help="Runs bigplanet and creates the HDF5 files alongside running mutlt-planet",
help="Runs bigplanet and creates the Bigplanet Archive file alongside running multiplanet",
)
parser.add_argument(
"-m",
Expand Down
19 changes: 19 additions & 0 deletions multiplanet/multiplanet_module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env python

import os
import multiprocessing as mp
import sys
import subprocess as sub
import h5py
import numpy as np
import csv
from scipy import stats
from multiplanet import parallel_run_planet

"""
Code for Multi-planet Module
"""


def RunMultiplanet(InputFile,cores, quiet=False, bigplanet=False,email=None):
parallel_run_planet(InputFile,cores,bigplanet,email)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
],
entry_points={
"console_scripts": [
"multi-planet = multiplanet.multiplanet:Arguments",
"multiplanet = multiplanet.multiplanet:Arguments",
"mpstatus = multiplanet.mpstatus:Arguments",
],
},
Expand Down
2 changes: 1 addition & 1 deletion tests/Checkpoint/test_multi-planet_checkpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def test_mp_checkpoint():

# Run multi-planet
if not (path / ".MP_Checkpoint").exists():
subprocess.check_output(["multi-planet", "vspace.in"], cwd=path)
subprocess.check_output(["multiplanet", "vspace.in"], cwd=path)
#gets list of folders
folders = sorted([f.path for f in os.scandir(path / "MP_Checkpoint") if f.is_dir()])

Expand Down
2 changes: 1 addition & 1 deletion tests/MpStatus/test_mpstatus.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_mpstatus():

# Run multi-planet
if not (path / ".MP_Status").exists():
subprocess.check_output(["multi-planet", "vspace.in"], cwd=path)
subprocess.check_output(["multiplanet", "vspace.in"], cwd=path)
subprocess.check_output(["mpstatus", "vspace.in"], cwd=path)

#gets list of folders
Expand Down
2 changes: 1 addition & 1 deletion tests/Parallel/test_multi-planet_parallel.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def test_mp_parallel():

# Run multi-planet
if not (path / ".MP_Parallel").exists():
subprocess.check_output(["multi-planet", "vspace.in"], cwd=path)
subprocess.check_output(["multiplanet", "vspace.in"], cwd=path)

folders = sorted([f.path for f in os.scandir(path / "MP_Parallel") if f.is_dir()])

Expand Down
2 changes: 1 addition & 1 deletion tests/Serial/test_multi-planet_serial.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def test_mp_serial():

# Run multi-planet
if not (path / ".MP_Serial").exists():
subprocess.check_output(["multi-planet", "vspace.in", "-c", "1"], cwd=path)
subprocess.check_output(["multiplanet", "vspace.in", "-c", "1"], cwd=path)

folders = sorted([f.path for f in os.scandir(path / "MP_Serial") if f.is_dir()])

Expand Down

0 comments on commit 100bf5c

Please sign in to comment.