Skip to content

Commit 54446d2

Browse files
authored
Merge pull request #84 from CCPBioSim/81-verbose-YAML-bug
Ensure verbose flag in YAML sets logging to DEBUG mode correctly
2 parents 6cf11e5 + cfaec9c commit 54446d2

File tree

7 files changed

+69
-59
lines changed

7 files changed

+69
-59
lines changed

CodeEntropy/config/arg_config_manager.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,17 @@
4848
"help": "Enable verbose output",
4949
},
5050
"thread": {"type": int, "help": "How many multiprocess to use", "default": 1},
51-
"outfile": {
51+
"output_file": {
5252
"type": str,
5353
"help": "Name of the file where the output will be written",
54-
"default": "outfile.json",
55-
},
56-
"mout": {
57-
"type": str,
58-
"help": "Name of the file where certain matrices will be written",
59-
"default": None,
54+
"default": "output_file.json",
6055
},
6156
"force_partitioning": {"type": float, "help": "Force partitioning", "default": 0.5},
62-
"waterEntropy": {"type": bool, "help": "Calculate water entropy", "default": False},
57+
"water_entropy": {
58+
"type": bool,
59+
"help": "Calculate water entropy",
60+
"default": False,
61+
},
6362
}
6463

6564

CodeEntropy/config/data_logger.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ def __init__(self):
1212
self.molecule_data = []
1313
self.residue_data = []
1414

15-
def save_dataframes_as_json(self, molecule_df, residue_df, outfile):
15+
def save_dataframes_as_json(self, molecule_df, residue_df, output_file):
1616
"""Save multiple DataFrames into a single JSON file with separate keys"""
1717
data = {
1818
"molecule_data": molecule_df.to_dict(orient="records"),
1919
"residue_data": residue_df.to_dict(orient="records"),
2020
}
2121

2222
# Write JSON data to file
23-
with open(outfile, "w") as out:
23+
with open(output_file, "w") as out:
2424
json.dump(data, out, indent=4)
2525

2626
def add_results_data(self, molecule, level, type, S_molecule):

CodeEntropy/config/logging_config.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
class LoggingConfig:
7-
def __init__(self, folder, default_level=logging.INFO):
7+
def __init__(self, folder, log_level=logging.INFO):
88
log_directory = os.path.join(folder, "logs")
99
os.makedirs(log_directory, exist_ok=True)
1010

@@ -26,52 +26,52 @@ def __init__(self, folder, default_level=logging.INFO):
2626
"console": {
2727
"class": "logging.StreamHandler",
2828
"formatter": "simple",
29-
"level": "INFO",
29+
"level": logging.INFO,
3030
},
3131
"stdout": {
3232
"class": "logging.FileHandler",
3333
"filename": os.path.join(log_directory, "program.out"),
3434
"formatter": "simple",
35-
"level": "INFO",
35+
"level": logging.INFO,
3636
},
3737
"logfile": {
3838
"class": "logging.FileHandler",
3939
"filename": os.path.join(log_directory, "program.log"),
4040
"formatter": "detailed",
41-
"level": "DEBUG",
41+
"level": logging.DEBUG,
4242
},
4343
"errorfile": {
4444
"class": "logging.FileHandler",
4545
"filename": os.path.join(log_directory, "program.err"),
4646
"formatter": "detailed",
47-
"level": "ERROR",
47+
"level": logging.ERROR,
4848
},
4949
"commandfile": {
5050
"class": "logging.FileHandler",
5151
"filename": os.path.join(log_directory, "program.com"),
5252
"formatter": "simple",
53-
"level": "INFO",
53+
"level": logging.INFO,
5454
},
5555
"mdanalysis_log": {
5656
"class": "logging.FileHandler",
5757
"filename": os.path.join(log_directory, "mdanalysis.log"),
5858
"formatter": "detailed",
59-
"level": "DEBUG",
59+
"level": logging.DEBUG,
6060
},
6161
},
6262
"loggers": {
6363
"": {
6464
"handlers": ["console", "stdout", "logfile", "errorfile"],
65-
"level": default_level,
65+
"level": log_level,
6666
},
6767
"MDAnalysis": {
6868
"handlers": ["mdanalysis_log"],
69-
"level": "DEBUG",
69+
"level": logging.DEBUG,
7070
"propagate": False,
7171
},
7272
"commands": {
7373
"handlers": ["commandfile"],
74-
"level": "INFO",
74+
"level": logging.INFO,
7575
"propagate": False,
7676
},
7777
},
@@ -82,3 +82,23 @@ def setup_logging(self):
8282
logging.getLogger("MDAnalysis")
8383
logging.getLogger("commands")
8484
return logging.getLogger(__name__)
85+
86+
def update_logging_level(self, log_level):
87+
# Update the root logger level
88+
root_logger = logging.getLogger()
89+
root_logger.setLevel(log_level)
90+
for handler in root_logger.handlers:
91+
if isinstance(handler, logging.FileHandler):
92+
handler.setLevel(logging.DEBUG)
93+
else:
94+
handler.setLevel(logging.INFO)
95+
96+
# Update all other loggers and their handlers
97+
for logger_name in self.LOGGING["loggers"]:
98+
logger = logging.getLogger(logger_name)
99+
logger.setLevel(log_level)
100+
for handler in logger.handlers:
101+
if isinstance(handler, logging.FileHandler):
102+
handler.setLevel(logging.DEBUG)
103+
else:
104+
handler.setLevel(logging.INFO)

CodeEntropy/main_mcc.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,29 @@ def main():
6565

6666
parser = arg_config.setup_argparse()
6767
args, unknown = parser.parse_known_args()
68-
args.outfile = os.path.join(folder, args.outfile)
69-
70-
# Determine logging level
71-
log_level = logging.DEBUG if args.verbose else logging.INFO
72-
73-
# Initialize the logging system with the determined log level
74-
logging_config = LoggingConfig(folder, default_level=log_level)
75-
logger = logging_config.setup_logging()
76-
77-
# Capture and log the command-line invocation
78-
command = " ".join(sys.argv)
79-
logging.getLogger("commands").info(command)
68+
args.output_file = os.path.join(folder, args.output_file)
8069

8170
try:
71+
# Initialize the logging system once
72+
logging_config = LoggingConfig(folder)
73+
logger = logging_config.setup_logging()
74+
8275
# Process each run in the YAML configuration
8376
for run_name, run_config in config.items():
8477
if isinstance(run_config, dict):
8578
# Merging CLI arguments with YAML configuration
8679
args = arg_config.merge_configs(args, run_config)
8780

81+
# Determine logging level
82+
log_level = logging.DEBUG if args.verbose else logging.INFO
83+
84+
# Update the logging level
85+
logging_config.update_logging_level(log_level)
86+
87+
# Capture and log the command-line invocation
88+
command = " ".join(sys.argv)
89+
logging.getLogger("commands").info(command)
90+
8891
# Ensure necessary arguments are provided
8992
if not getattr(args, "top_traj_file"):
9093
raise ValueError(
@@ -429,7 +432,7 @@ def main():
429432
# 'Type':['Orientational (J/mol/K)'],
430433
# 'Result': [S_orient],})
431434
# results_df = pd.concat([results_df, new_row], ignore_index=True)
432-
# with open(args.outfile, "a") as out:
435+
# with open(args.output_file, "a") as out:
433436
# print(molecule,
434437
# "\t",
435438
# level,
@@ -454,7 +457,7 @@ def main():
454457
molecule, level, "Molecule Total Entropy", S_molecule
455458
)
456459
data_logger.save_dataframes_as_json(
457-
results_df, residue_results_df, args.outfile
460+
results_df, residue_results_df, args.output_file
458461
)
459462

460463
logger.info("Molecules:")

config.yaml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ run1:
77
end:
88
step:
99
bin_width:
10-
tempra:
10+
temperature:
1111
verbose:
1212
thread:
13-
outfile:
14-
resfile:
15-
mout:
13+
output_file:
1614
force_partitioning:
17-
waterEntropy:
15+
water_entropy:

tests/test_EntropyFunctions/test_arg_config_manager.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,9 @@ def setup_file(self, mock_file):
6262
"tempra: 298.0\n "
6363
"verbose: False\n "
6464
"thread: 1\n "
65-
"outfile: 'outfile.out'\n "
66-
"resfile: 'res_outfile.out'\n "
67-
"mout: null\n "
65+
"output_file: 'output_file.json'\n "
6866
"force_partitioning: 0.5\n "
69-
"waterEntropy: False"
67+
"water_entropy: False"
7068
).return_value
7169

7270
@patch("builtins.open", new_callable=mock_open)
@@ -126,11 +124,9 @@ def test_invalid_run_config_type(self):
126124
tempra=298.0,
127125
verbose=False,
128126
thread=1,
129-
outfile="outfile.out",
130-
resfile="res_outfile.out",
131-
mout=None,
127+
output_file="output_file.json",
132128
force_partitioning=0.5,
133-
waterEntropy=False,
129+
water_entropy=False,
134130
),
135131
)
136132
def test_setup_argparse(self, mock_args):
@@ -271,11 +267,9 @@ def test_merge_configs(self):
271267
tempra=None,
272268
verbose=None,
273269
thread=None,
274-
outfile=None,
275-
resfile=None,
276-
mout=None,
270+
output_file=None,
277271
force_partitioning=None,
278-
waterEntropy=None,
272+
water_entropy=None,
279273
)
280274
run_config = {
281275
"top_traj_file": ["/path/to/tpr", "/path/to/trr"],
@@ -287,11 +281,9 @@ def test_merge_configs(self):
287281
"tempra": 298.0,
288282
"verbose": False,
289283
"thread": 1,
290-
"outfile": "outfile.out",
291-
"resfile": "res_outfile.out",
292-
"mout": None,
284+
"output_file": "output_file.json",
293285
"force_partitioning": 0.5,
294-
"waterEntropy": False,
286+
"water_entropy": False,
295287
}
296288
merged_args = arg_config.merge_configs(args, run_config)
297289
self.assertEqual(merged_args.top_traj_file, ["/path/to/tpr", "/path/to/trr"])

tests/test_EntropyFunctions/test_main_mcc.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,9 @@ def setup_file(self, mock_file):
5454
"tempra: 298.0\n "
5555
"verbose: False\n "
5656
"thread: 1\n "
57-
"outfile: 'outfile.out'\n "
58-
"resfile: 'res_outfile.out'\n "
59-
"mout: null\n "
57+
"output_file: 'output_file.json'\n "
6058
"force_partitioning: 0.5\n "
61-
"waterEntropy: False"
59+
"water_entropy: False"
6260
).return_value
6361

6462
def test_CodeEntropy_imported(self):

0 commit comments

Comments
 (0)