ini file parsing error for multiple lined dictionary
One need to specify an ini file when he use bilby_pipe for analysis. The init file comments say the multiple line dictionary is supproted. However, it does not work properly if there is a multiple line dictionary as
# A dictionary of priors (alternative to prior-file). Multiline dictionaries are supported, but each line must contain a singleparameter specification and finish with a comma.
prior-dict={
chirp_mass = bilby.gw.prior.UniformInComponentsChirpMass(name='chirp_mass', minimum=35, maximum=85, unit='$M_{\odot}$'),
mass_ratio = bilby.gw.prior.UniformInComponentsMassRatio(name='mass_ratio', minimum=0.125, maximum=1),
mass_1 = Constraint(name='mass_1', minimum=1.001398, maximum=1000),
mass_2 = Constraint(name='mass_2', minimum=1.001398, maximum=1000),
luminosity_distance = bilby.gw.prior.UniformComovingVolume(name='luminosity_distance', minimum=1e2, maximum=8e3, unit='Mpc'),
dec = Cosine(name='dec'),
ra = Uniform(name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic'),
theta_jn = Sine(name='theta_jn'),
psi = Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic'),
phase = Uniform(name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic'),
eccentricity = DeltaFunction(name='eccentricity', peak=0.0),
geocent_time = Uniform(name='geocent_time', minimum = 1242442966.46, maximum = 1242442968.46, unit='s'),
}
One can see the whole ini file from https://ldas-jobs.ligo.caltech.edu/~hyungwon.lee/o4_tutorial/injection_F2_config.ini. It is decoded as follows
prior-dict = {chirp-mass: bilby.gw.prior.UniformInComponentsChirpMass(name='chirp_mass', minimum=35, maximum=85, unit='$M_{\odot}$'), mass_ratio = bilby.gw.prior.UniformInComponentsMassRatio(name='mass_ratio', minimum=0.125, maximum=1), mass_1 = Constraint(name='mass_1', minimum=1.001398, maximum=1000), mass_2 = Constraint(name='mass_2', minimum=1.001398, maximum=1000), luminosity_distance = bilby.gw.prior.UniformComovingVolume(name='luminosity_distance', minimum=1e2, maximum=8e3, unit='Mpc'), dec = Cosine(name='dec')
This is caused by a bug in BilbyConfigFileParser.parse() function in file bilbyargparser.py. The following code will fix this problem. The code will replace the current code lines between 221 and 244.
ii = 0
lines_repacked = []
while ii < len(lines):
if first_chars[ii] == "#":
lines_repacked.append(lines[ii])
ii += 1
else:
# Find the next comment
jj = ii + 1
while jj < len(first_chars) and first_chars[jj] != "#":
jj += 1
int_lines = "".join(lines[ii:jj]) # Form single string
int_lines = int_lines.replace(",\n#", ", \n#") #
int_lines = int_lines.replace(
",\n", ", "
) # Multiline args on single lines
int_lines = int_lines.replace(
"\n}\n", "}\n"
) # Trailing } on single lines
int_lines = int_lines.split("\n")
n_elements = len(int_lines)
idx = 0
while idx < n_elements:
if len(int_lines[idx]) > 0:
continue
else:
int_lines.pop(idx) # remove no data string from list
n_elements = n_elements - 1
idx = idx - 1
idx = idx + 1
contain_dict = False
close_dict = -1
count_open = 0
for idx in range(len(int_lines)):
if "={" in int_lines[idx] or "= {" in int_lines[idx]:
contain_dict = True
if "{" in int_lines[idx]:
count_open += 1
if "}" in int_lines[idx]:
count_open -= 1
if count_open == 0:
close_dict = idx + 1
break
if contain_dict: # if it is a dictionary, make to be a single line
int_lines2 = []
int_lines1 = "".join(int_lines[:close_dict])
if len(int_lines1) > 0:
int_lines2.append(int_lines1)
lines_repacked += int_lines2
if close_dict > 0 and close_dict < len(int_lines):
lines_repacked += int_lines[close_dict:]
else:
lines_repacked += int_lines
ii = jj
I may missed some points of original developer, hence please check the code when you want to apply this code.