Source code for alphatwirl.loop.splitfuncs

# Tai Sakuma <tai.sakuma@gmail.com>

##__________________________________________________________________||
[docs]def create_file_start_length_list(file_nevents_list, max_events_per_run = -1, max_events_total = -1, max_files_per_run = 1): file_nevents_list = _apply_max_events_total(file_nevents_list, max_events_total) return _file_start_length_list(file_nevents_list, max_events_per_run, max_files_per_run)
##__________________________________________________________________|| def _apply_max_events_total(file_nevents_list, max_events_total = -1): if max_events_total < 0: return file_nevents_list ret = [ ] for file, nevents in file_nevents_list: if max_events_total == 0: break nevents = min(max_events_total, nevents) ret.append((file, nevents)) max_events_total -= nevents return ret ##__________________________________________________________________|| def _file_start_length_list(file_nevents_list, max_events_per_run, max_files_per_run): if not file_nevents_list: return [ ] total_nevents = sum([n for f, n, in file_nevents_list]) if total_nevents == 0: return [ ] if max_files_per_run == 0: return [ ] if max_events_per_run == 0: return [ ] if max_events_per_run < 0: max_events_per_run = total_nevents total_nfiles = len(set([f for f, n, in file_nevents_list])) if max_files_per_run < 0: max_files_per_run = total_nfiles files = [ ] nevents = [ ] start = [ ] length = [ ] i = 0 for file_, nev in file_nevents_list: if nev == 0: continue if i == len(files): # create a new run files.append([ ]) nevents.append(0) start.append(0) length.append(0) files[i].append(file_) nevents[i] += nev if max_events_per_run >= nevents[i]: length[i] = nevents[i] else: dlength = max_events_per_run - length[i] length[i] = max_events_per_run i += 1 files.append([file_]) nevents.append(nevents[i-1] - length[i-1]) start.append(dlength) while max_events_per_run < nevents[i]: length.append(max_events_per_run) i += 1 files.append([file_]) nevents.append(nevents[i-1] - length[i-1]) start.append(start[i-1] + length[i-1]) length.append(nevents[i]) if max_events_per_run == nevents[i]: i += 1 # to next run continue if max_files_per_run == len(files[i]): i += 1 # to next run # print files, nevents, start, length ret = list(zip(files, start, length)) return ret ##__________________________________________________________________|| def _start_length_pairs_for_split_lists(ntotal, max_per_list): # e.g., ntotal = 35, max_per_list = 10 if max_per_list < 0: return [(0, ntotal)] nlists = ntotal//max_per_list # https://stackoverflow.com/questions/1282945/python-integer-division-yields-float # nlists = 3 ret = [(i*max_per_list, max_per_list) for i in range(nlists)] # e.g., [(0, 10), (10, 10), (20, 10)] remainder = ntotal % max_per_list # e.g., 5 if remainder > 0: last = (nlists*max_per_list, remainder) # e.g, (30, 5) ret.append(last) # e.g., [(0, 10), (10, 10), (20, 10), (30, 5)] return ret ##__________________________________________________________________|| def _minimum_positive_value(vals): # returns -1 if all negative or empty vals = [v for v in vals if v >= 0] if not vals: return -1 return min(vals) ##__________________________________________________________________||