def DoSignalHeightScan(self, heights=None, hits_per_height=300000): gc.disable() starttime = datetime.today() # ROOT Logfile: # path = "MC/Performance_Results/"+str(starttime) path = "MC/Performance_Results/_" + str( self.minimum_statistics) + "_" + str( self.binning) + "_" + str(hits_per_height) + "_" os.makedirs(path) rootfile = TFile(path + '/MCPerformanceLog.root', 'RECREATE') LogTree = TTree('LogTree', 'MC Log Tree') RealSignalAmplitude = array('f', [0]) Repetition = array('i', [0]) TrueNPeaks = array('i', [0]) Ninjas = array('i', [0]) Ghosts = array('i', [0]) Minimas = array('i', [0]) RecSA_Quantiles = array('f', [0]) RecSA_MinMax = array('f', [0]) LogTree.Branch('RealSignalAmplitude', RealSignalAmplitude, 'RealSignalAmplitude/F') LogTree.Branch('Repetition', Repetition, 'Repetition/I') LogTree.Branch('TrueNPeaks', TrueNPeaks, 'TrueNPeaks/I') LogTree.Branch('Ninjas', Ninjas, 'Ninjas/I') LogTree.Branch('Ghosts', Ghosts, 'Ghosts/I') LogTree.Branch('Minimas', Minimas, 'Minimas/I') LogTree.Branch('RecSA_Quantiles', RecSA_Quantiles, 'RecSA_Quantiles/F') LogTree.Branch('RecSA_MinMax', RecSA_MinMax, 'RecSA_MinMax/F') # copy Config files: shutil.copy("Configuration/MonteCarloConfig.cfg", path + "/MonteCarloConfig.cfg") shutil.copy("Configuration/AnalysisConfig.cfg", path + "/AnalysisConfig.cfg") if heights == None: heights = [ 0.0, 0.05, 0.08, 0.1, 0.125, 0.15, 0.175, 0.2, 0.3, 0.5, 0.8, 1.0 ] # infofile: infofile = open(path + "/info.txt", "w") infofile.write("DoSignalHeightScan\n\n") infofile.write("Timestamp: " + str(starttime) + "\n\n") infofile.write("Number of Repetitions for each Amplitude: " + str(self.tries) + "\n") infofile.write("Number of different Amplitudes: " + str(len(heights)) + "\n") infofile.write("Hits per Amplitude: " + str(hits_per_height) + "\n") infofile.write("Quantiles: " + str(self.min_percent) + "/" + str(self.max_percent) + "\n") infofile.write("Binning: " + str(self.binning) + "\n") infofile.write("Minimum Statistics: " + str(self.minimum_statistics) + "\n") infofile.write("Extrema Configuration: " + self.extremaconfiguration) success_prob = [] ghost_prob = [] cycle_nr = 0 cycles = self.tries * len(heights) for height in heights: # add more statistics for each height, not just one try.. fails = 0 tot_ghosts = 0 peaks_generated = 0 for repetition in range(self.tries): cycle_nr += 1 print("\n{0}th repetition with Signal height set to: {1}\n". format(repetition, height)) run_object = MCRun(validate=False, verbose=self.verbose, run_number=364) run_object.MCAttributes['PeakHeight'] = height run_object.SetNumberOfHits(hits_per_height) print("newAnalysis = Analysis(run_object)") newAnalysis = Analysis(run_object, verbose=self.verbose) print("newAnalysis.FindMaxima()") newAnalysis.FindMaxima( binning=self.binning, minimum_bincontent=self.minimum_statistics) print("newAnalysis.FindMinima()") newAnalysis.FindMinima( binning=self.binning, minimum_bincontent=self.minimum_statistics) npeaks = newAnalysis.ExtremeAnalysis.ExtremaResults[ 'TrueNPeaks'] ninjas = newAnalysis.ExtremeAnalysis.ExtremaResults['Ninjas'] ghosts = newAnalysis.ExtremeAnalysis.ExtremaResults['Ghosts'] maxima = newAnalysis.ExtremeAnalysis.ExtremaResults[ 'FoundMaxima'] minima = newAnalysis.ExtremeAnalysis.ExtremaResults[ 'FoundMinima'] # Reconstruct Signal Amplitude: if len(maxima) * len(minima) > 0: maxbin = newAnalysis.ExtremeAnalysis.Pad.GetBinByCoordinates( *(maxima[0])) maxbin.FitLandau() minbin = newAnalysis.ExtremeAnalysis.Pad.GetBinByCoordinates( *(minima[0])) minbin.FitLandau() rec_sa_minmax = maxbin.Fit['MPV'] / minbin.Fit['MPV'] - 1. else: rec_sa_minmax = -99 q = array('d', [ 1. * self.min_percent / 100., 1. * self.max_percent / 100. ]) y = array('d', [0, 0]) newAnalysis.ExtremeAnalysis.CreateMeanSignalHistogram() newAnalysis.ExtremeAnalysis.MeanSignalHisto.GetQuantiles( 2, y, q) rec_sa_quantiles = y[1] / y[0] - 1. # Fill ROOT file: RealSignalAmplitude[0] = height Repetition[0] = repetition TrueNPeaks[0] = npeaks Ninjas[0] = ninjas Ghosts[0] = ghosts Minimas[0] = len(minima) RecSA_Quantiles[0] = rec_sa_quantiles RecSA_MinMax[0] = rec_sa_minmax LogTree.Fill() assert (npeaks > 0), 'no peak in MC created' peaks_generated += npeaks fails += ninjas tot_ghosts += ghosts # self.AddAnalysis(newAnalysis) del newAnalysis del run_object elapsed_time = datetime.today() - starttime estimated_time = elapsed_time / cycle_nr * cycles remaining_time = estimated_time - elapsed_time print("\n\nAPPROXIMATED TIME LEFT: " + str(remaining_time) + "\n") success = 1. * (peaks_generated - fails) / peaks_generated ghost = 4. * ghosts / self.tries success_prob.append(success) ghost_prob.append(ghost) print("Write ROOT-file") rootfile.Write() rootfile.Close() print("ROOT File written. Write infofile") infofile.write("\nTotal Time elapsed: " + str(datetime.today() - starttime)) infofile.close() print("infofile written") # canvas = ROOT.TCanvas('canvas', 'canvas') # HERE IT CRASHES DUE TO MEMORY PROBLEMS # canvas.cd() # graph1 = ROOT.TGraph() # graph1.SetNameTitle('graph1', 'success') # graph1.SaveAs(path+"/SuccessGraph.root") # graph2 = ROOT.TGraph() # graph2.SetNameTitle('graph2', 'ghosts') # graph2.SaveAs(path+"/GhostsGraph.root") # for i in range(len(heights)): # graph1.SetPoint(i, heights[i], success_prob[i]) # graph2.SetPoint(i, heights[i], ghost_prob[i]) # graph1.Draw('ALP*') # graph2.Draw('SAME LP*') # self.SavePlots("PerformanceResult", "png", path+"/") answer = input('Wanna crash?') ROOT.gDirectory.GetList().ls() ROOT.gROOT.GetListOfFiles().ls() if answer == 'yes': gc.collect()