PageRenderTime 25ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/data_analysis/batch_processing/1d_profile_quantization.py

https://gitlab.com/IPMsim/DataAnalysis
Python | 79 lines | 57 code | 17 blank | 5 comment | 5 complexity | 2946f82f8471d8b07a60faceb0b13d51 MD5 | raw file
  1. from file_reader import XMLReader
  2. import glob
  3. import matplotlib.pyplot as plt
  4. import my_ROOT
  5. import numpy as np
  6. import os
  7. import sys
  8. TH1D = my_ROOT.TH1D
  9. batch_directory = sys.argv[1]
  10. xml_reader = XMLReader(';')
  11. def exhaust_directory(directory, histogram, validity_condition, boundary_condition, quantization):
  12. number_of_profiles = 0
  13. for filepath in glob.glob(os.path.join(directory, xml_reader.pattern)):
  14. profiles = xml_reader.extract_profiles_from_file(filepath)
  15. profiles = filter(validity_condition, profiles) # filter to obtain good quality profiles
  16. for profile in profiles:
  17. profile.bring_to_zero()
  18. # select region of interest
  19. profiles = [profile.create_copy_between_boundaries(*boundary_condition(profile)) for profile in profiles]
  20. for profile in profiles:
  21. histogram.Fill(quantization(profile))
  22. number_of_profiles += len(profiles)
  23. return number_of_profiles
  24. def plot_quantization_for_all(particle_type, validity_condition, boundary_condition, quantization, histogram_parameters,
  25. normalize_to=1):
  26. histogram = TH1D('histogram_%s' % particle_type, particle_type, *histogram_parameters)
  27. print '%s: processed %d profiles' % (particle_type,
  28. exhaust_directory(os.path.join(batch_directory, particle_type), histogram,
  29. validity_condition, boundary_condition, quantization))
  30. xs, ys = histogram.get_bin_centers_x(), histogram.get_bin_contents()
  31. ys = ys / np.sum(ys) * normalize_to
  32. plt.plot(xs, ys, label=particle_type)
  33. underflow, overflow = histogram.get_underflow_and_overflow_bin_contents()
  34. print 'underflow: %f, overflow: %f' % (underflow, overflow)
  35. def plot_quantization_different_extraction_voltages(directory, validity_condition, boundary_condition, quantization,
  36. histogram_parameters, normalize_to=1):
  37. histogram = TH1D(directory, os.path.split(directory)[1], *histogram_parameters)
  38. print '%s: processed %d profiles' % (os.path.split(directory)[1], exhaust_directory(directory, histogram,
  39. validity_condition,
  40. boundary_condition,
  41. quantization))
  42. xs, ys = histogram.get_bin_centers_x(), histogram.get_bin_contents()
  43. ys = ys / np.sum(ys) * normalize_to
  44. plt.plot(xs, ys, label=os.path.split(directory)[1])
  45. underflow, overflow = histogram.get_underflow_and_overflow_bin_contents()
  46. print 'underflow: %f, overflow: %f' % (underflow, overflow)
  47. validity_condition = lambda profile: profile.has_sufficient_height(absolute_difference=2.5)
  48. boundary_condition = lambda profile: profile.boundaries_for_height(0.25)
  49. quantization = lambda profile: profile.excess_kurtosis
  50. histogram_parameters = (100, -2.0, 0.0)
  51. # plot_quantization_for_all('electrons', validity_condition=validity_condition, boundary_condition=boundary_condition,
  52. # quantization=quantization, histogram_parameters=histogram_parameters)
  53. # plot_quantization_for_all('ions', validity_condition=validity_condition, boundary_condition=boundary_condition,
  54. # quantization=quantization, histogram_parameters=histogram_parameters)
  55. for EV in sys.argv[2:]:
  56. plot_quantization_different_extraction_voltages(os.path.join(sys.argv[1], EV),
  57. validity_condition=validity_condition,
  58. boundary_condition=boundary_condition,
  59. quantization=quantization,
  60. histogram_parameters=histogram_parameters)
  61. plt.legend()
  62. plt.show()