Source code for analysis.run

import yaml
import argparse
import os, sys
import numpy as np
import copy

# Setup OpT0Finder for flash matching as needed
if os.getenv('FMATCH_BASEDIR') is not None:
    print('Setting up OpT0Finder...')
    sys.path.append(os.path.join(os.getenv('FMATCH_BASEDIR'), 'python'))
    import flashmatch
    from flashmatch import flashmatch, geoalgo
    print('... done.')

current_directory = os.path.dirname(os.path.abspath(__file__))
current_directory = os.path.dirname(current_directory)
sys.path.insert(0, current_directory)

from mlreco.main_funcs import process_config
from analysis.decorator import evaluate
# Folder `selections` contains several scripts
from analysis.algorithms.selections import *


[docs]def main(analysis_cfg_path, model_cfg_path): analysis_config = yaml.load(open(analysis_cfg_path, 'r'), Loader=yaml.Loader) config = yaml.load(open(model_cfg_path, 'r'), Loader=yaml.Loader) process_config(config, verbose=False) print(analysis_config) if 'analysis' not in analysis_config: raise Exception('Analysis configuration needs to live under `analysis` section.') if 'name' in analysis_config['analysis']: process_func = eval(analysis_config['analysis']['name']) elif 'scripts' in analysis_config['analysis']: assert isinstance(analysis_config['analysis']['scripts'], dict) filenames = [] modes = [] for name in analysis_config['analysis']['scripts']: files = eval(name)._filenames mode = eval(name)._mode filenames.extend(files) modes.append(mode) unique_modes, counts = np.unique(modes, return_counts=True) mode = unique_modes[np.argmax(counts)] # most frequent mode wins @evaluate(filenames, mode=mode) def process_func(data_blob, res, data_idx, analysis, model_cfg): outs = [] for name in analysis_config['analysis']['scripts']: cfg = analysis.copy() cfg['analysis']['name'] = name cfg['analysis']['processor_cfg'] = analysis_config['analysis']['scripts'][name] func = eval(name).__wrapped__ out = func(copy.deepcopy(data_blob), copy.deepcopy(res), data_idx, cfg, model_cfg) outs.extend(out) return outs else: raise Exception('You need to specify either `name` or `scripts` under `analysis` section.') # Run Algorithm process_func(config, analysis_config)
if __name__=="__main__": parser = argparse.ArgumentParser() parser.add_argument('config') parser.add_argument('analysis_config') args = parser.parse_args() main(args.analysis_config, args.config)