Skip to content
Snippets Groups Projects
main.py 6.64 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    import sys
    import os
    import re
    
    from util import IOOperations, SCurves, ChannelCounts, ReferenceValues, ExtremeValues, DetectDefects, Calculus
    
    class Main:
    
        def __init__(self, pathToFolder:str, doExport:bool, specialCalculations = [])-> None:
            """Function to find all input files and calls the needed functions for the analysis
    
            Parameters
            ------
            pathToFolder : str
            Path to the folder with the txt files
            """
    
            self.io = IOOperations()
            self.scurve = SCurves()
            self.counts = ChannelCounts()
            self.reference = ReferenceValues()
            self.deviation = ExtremeValues()
            self.defects = DetectDefects()
            self.calc = Calculus()
    
            _files = [f for f in os.listdir(pathToFolder) if os.path.isfile(os.path.join(pathToFolder, f))]
    
            print("\nDetected defect channels\n")
    
            defective_channels_dict = dict()
    
            for f in _files:
                if re.search(r".txt$",f) is None:
                    continue
                else:
                    raw_data = self.io.readConnResults(os.path.join(pathToFolder, f))
                    self.scurve.performAllAnalysis(raw_data)
                    if "scurve" in specialCalculations:
                        if (doExport == "True") or (doExport == "1"):
                            self.io.exportSCurves(self.scurve.sCurve, raw_data.get("asic_nr"), pathToFolder)
                    self.counts.performAllAnalysis(self.scurve.channel_array)
                    if "avg_multi" in specialCalculations:
                        avg_multi_even = self.reference.calculateReferenceAverages(self.counts.counts[1])
                        avg_multi_odd = self.reference.calculateReferenceAverages(self.counts.counts[2])
                        if (doExport == "True") or (doExport == "1"):
                            self.io.exportCountComparison(avg_multi_even, True, raw_data.get("asic_nr"), pathToFolder, "AvgMulti_even_")
                            self.io.exportCountComparison(avg_multi_odd, False, raw_data.get("asic_nr"), pathToFolder, "AvgMulti_odd_")
                    if "avg_dist" in specialCalculations:
                        self.avg_even = self.calc.calculateNAverageOnList(self.counts.counts[1], 9)
                        self.avg_odd = self.calc.calculateNAverageOnList(self.counts.counts[2], 9)
                        if (doExport == "True") or (doExport == "1"):
                            self.io.exportCountComparison([self.counts.counts[1], self.avg_even], True, raw_data.get("asic_nr"), pathToFolder, "Avg_even_")
                            self.io.exportCountComparison([self.counts.counts[2], self.avg_odd], False, raw_data.get("asic_nr"), pathToFolder, "Avg_odd_")
                    if "dev" in specialCalculations:
                        self.dev_even = self.calc.calculateDeviationBetweenLists(self.counts.counts[1], self.avg_even)
                        self.dev_odd = self.calc.calculateDeviationBetweenLists(self.counts.counts[2], self.avg_odd)
                        if (doExport == "True") or (doExport == "1"):
                            self.io.exportCountComparison([self.counts.counts[1], self.avg_even, self.dev_eben], True, raw_data.get("asic_nr"), pathToFolder, "Avg_Dev_even_")
                            self.io.exportCountComparison([self.counts.counts[2], self.avg_odd, self.dev_odd], False, raw_data.get("asic_nr"), pathToFolder, "Avg_Dev_odd_")
                    print("\nASIC %d\n"%(raw_data.get("asic_nr")))
                    filtered_even = self.deviation.filterExtremeValues(self.counts.counts[1], 0.25)
                    filtered_odd = self.deviation.filterExtremeValues(self.counts.counts[2], 0.25)
                    if "filter_multi" in specialCalculations:
                        list_filtered_even = []
                        list_filtered_odd = []
                        for i in range(100):
                            filtered_even = self.deviation.filterExtremeValues(self.counts.counts[1], i*0.01)
                            list_filtered_even.append(self.deviation.calculateNumberOfFilteredValues(self.counts.counts[1], filtered_even))
                            filtered_odd = self.deviation.filterExtremeValues(self.counts.counts[2], i*0.01)
                            list_filtered_odd.append(self.deviation.calculateNumberOfFilteredValues(self.counts.counts[1], filtered_odd))
                        if (doExport == "True") or (doExport == "1"):
                            self.io.exportFilterThresholds(list_filtered_even, 0, 0.01, pathToFolder, raw_data.get("asic_nr"), "filterNumEven_")
                            self.io.exportFilterThresholds(list_filtered_odd, 0, 0.01, pathToFolder, raw_data.get("asic_nr"), "filterNumOdd_")
    
                    if "avg_multi_filter" in specialCalculations:
                        avg_filter_multi_even = self.reference.calculateReferenceAverages(filtered_even)
                        avg_filter_multi_odd = self.reference.calculateReferenceAverages(filtered_odd)
                        if (doExport == "True") or (doExport == "1"):
                            self.io.exportCountComparison(avg_filter_multi_even, True, raw_data.get("asic_nr"), pathToFolder, "AvgFilterMulti_even_")
                            self.io.exportCountComparison(avg_filter_multi_odd, False, raw_data.get("asic_nr"), pathToFolder, "AvgFilterMulti_odd_")
                    avg_filter_even = self.calc.calculateNAverageOnList(filtered_even, 9)
                    avg_filter_odd = self.calc.calculateNAverageOnList(filtered_odd, 9)
                    dev_filter_even = self.calc.calculateDeviationBetweenLists(self.counts.counts[1], avg_filter_even)
                    dev_filter_odd = self.calc.calculateDeviationBetweenLists(self.counts.counts[2], avg_filter_odd)
                    if (doExport == "True") or (doExport == "1"):
                        self.io.exportCountComparison([self.counts.counts[1], filtered_even, avg_filter_even, dev_filter_even], True, raw_data.get("asic_nr"), pathToFolder, "overall_even")
                        self.io.exportCountComparison([self.counts.counts[2], filtered_odd, avg_filter_odd, dev_filter_odd], False, raw_data.get("asic_nr"), pathToFolder, "overall_odd")
    
    
                    defects_even = self.defects.findDefectiveChannels(dev_filter_even, raw_data.get("asic_nr"), True)
                    defects_odd = self.defects.findDefectiveChannels(dev_filter_odd, raw_data.get("asic_nr"), False)
                    defective_channels_dict[raw_data.get("asic_nr")] = {"even" : defects_even, "odd" : defects_odd}
                    print("")
                    if (doExport == "True") or (doExport == "1"):
                        pass
     
            self.io.exportDetectedDefects(defective_channels_dict, pathToFolder)
    if __name__ == "__main__":
        if len(sys.argv) >= 3:
            main = Main(sys.argv[1], sys.argv[2], sys.argv[3])
        else:
            print("Please specify path to folder and if data should be exported!")