diff --git a/scripts/checkPulseData.py b/scripts/checkPulseData.py new file mode 100644 index 0000000..c8281a3 --- /dev/null +++ b/scripts/checkPulseData.py @@ -0,0 +1,164 @@ +from __future__ import division, print_function +import sys +import os +import string +import numpy as np +import ROOT as r + +location = os.path.expandvars('$DISK/data/ST/Aging/') +macros = os.path.expandvars('$CCEHOME/macros/CCEScan/') +VERBOSE = False + +# Voltage steps +voltMapTT = [None] * 11 +voltMapTT[0] = 400 +voltMapTT[1] = 350 +voltMapTT[2] = 300 +voltMapTT[3] = 250 +voltMapTT[4] = 225 +voltMapTT[5] = 200 +voltMapTT[6] = 175 +voltMapTT[7] = 150 +voltMapTT[8] = 125 +voltMapTT[9] = 100 +voltMapTT[10] = 60 +voltMapIT = [None] * 11 +voltMapIT[0] = 300 +voltMapIT[1] = 200 +voltMapIT[2] = 170 +voltMapIT[3] = 140 +voltMapIT[4] = 120 +voltMapIT[5] = 105 +voltMapIT[6] = 90 +voltMapIT[7] = 75 +voltMapIT[8] = 60 +voltMapIT[9] = 40 +voltMapIT[10] = 20 + +# Time steps +def get_tmap(): + timeMap = [None] * 6 + timeMap[0] = 0.0 + timeMap[1] = -60.0 + timeMap[2] = -30.0 + timeMap[3] = 30.0 + timeMap[4] = 60.0 + timeMap[5] = 90.0 + return timeMap + + +def build_pulse(vals): + times = get_tmap() + pulse = list(zip(*sorted(zip(vals, times), key=lambda x: x[1]))[0]) + return np.array(prune(pulse)) + + +def monotonic(x): + if not len(x): + return False + dx = np.diff(x) + return (np.all(dx <= 0) or np.all(dx >= 0)) + + +def prune(x): + #for element in x: + # if element is None: + # x.remove(element) + return [element for element in x if element is not None] + + +def get_vmap(d): + if 'IT' in d: + return voltMapIT + if 'TT' in d: + return voltMapTT + + +# Helpers for string formatting +# based on http://stackoverflow.com/a/23305496/3324012 +class StringTemplate(object): + class FormatDict(dict): + def __missing__(self, key): + return "{" + key + "}" + + def __init__(self, template): + self.substituted_str = template + self.formatter = string.Formatter() + + def __repr__(self): + return self.substituted_str + + def format(self, *args, **kwargs): + mapping = StringTemplate.FormatDict(*args, **kwargs) + self.substituted_str = self.formatter.vformat(self.substituted_str, (), mapping) + return self.substituted_str + + + +if __name__ == '__main__': + + if 'VERB' in sys.argv: + VERBOSE = True + + datafile = r.TFile(location + 'CCEScan.root', 'read') + + # Select detector + detector = 'TT' + nstrips = [3, 5, 7] + layer = 'TTaU' + if 'IT' in sys.argv: + detector = 'IT' + nstrips = [7] + layer = 'T3X2' + + + # Load fill numbers + with open(macros + 'Fills.dat', 'rb') as f: + fills = f.read().splitlines() + fills.remove('2797') + fills.remove('3108') + # Load sectors + with open(macros + '{DET}sectors.dat'.format(DET=detector), 'rb') as f: + sectors = f.read().splitlines() + # Load voltage map + vmap = get_vmap(detector) + + # String templates + access = StringTemplate('{DET}/{LAY}/{SEC}/{FILL}/v_{CS}_val{NS}') + access = access.format(DET=detector, LAY=layer) + warning = StringTemplate('{LAY}/{SEC} on fill {FILL}: pulse is monotonic for ns={NS}, Vbias={V}: \t {PULSE}') + warning = warning.format(LAY=layer) + not_found = StringTemplate('{LAY}/{SEC} on fill {FILL}: calibration step {CS} not found for ns={NS}') + not_found = not_found.format(LAY=layer) + + # Loop on data + for ns in nstrips: + for fill in fills: + for sector in sectors: + # Loop on voltages + for vstep in range(11): + pulse = [] + for cstep in range(6*vstep, 6*vstep + 6): + try: + data = datafile.Get(access.format(NS=ns, + FILL=fill, + SEC=sector, + CS=cstep)) + pulse.append(list(data)[0]) + except: + if VERBOSE: + print(not_found.format(NS=ns, + FILL=fill, + SEC=sector, + CS=cstep)) + pulse.append(None) + pulse = build_pulse(pulse) + if monotonic(pulse): + pulse = [round(v,2) for v in pulse] + print(warning.format(NS=ns, + FILL=fill, + SEC=sector, + V=vmap[vstep], + PULSE=pulse)) + + # datafile.Close() \ No newline at end of file