diff options
author | tlatorre <tlatorre@uchicago.edu> | 2020-11-16 09:02:20 -0600 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2020-11-16 09:02:20 -0600 |
commit | 5d98fdc1bd1b0516e49a05dd8f55febec587b931 (patch) | |
tree | f54fc4da90a06f8432116ecee7ad9a72faad9b2a /utils | |
parent | 9e07d3109081d4edd3210a45d991b2ad1e11ddfd (diff) | |
download | sddm-5d98fdc1bd1b0516e49a05dd8f55febec587b931.tar.gz sddm-5d98fdc1bd1b0516e49a05dd8f55febec587b931.tar.bz2 sddm-5d98fdc1bd1b0516e49a05dd8f55febec587b931.zip |
calculate livetime based on pulse gt and 10 MHz clock
This commit updates get_events() to calculate the livetime based on both
the number of pulse gt events and the 10 MHz clock and to return it in a
dictionary stored with the dataframe.
I also update dm-search so that the results are now reported as a
function of events/cm^3/s.
Also updated radius cut to be the AV radius.
Diffstat (limited to 'utils')
-rwxr-xr-x | utils/chi2 | 8 | ||||
-rwxr-xr-x | utils/dm-search | 28 | ||||
-rw-r--r-- | utils/sddm/plot_energy.py | 22 |
3 files changed, 47 insertions, 11 deletions
@@ -480,10 +480,10 @@ if __name__ == '__main__': ev_mc = ev_mc[~np.isnan(ev_mc.fmin)] muon_mc = muon_mc[~np.isnan(muon_mc.fmin)] - # require (r/r_psup)^3 < 0.9 - ev = ev[ev.r_psup < 0.9] - ev_mc = ev_mc[ev_mc.r_psup < 0.9] - muon_mc = muon_mc[muon_mc.r_psup < 0.9] + # require (r < av radius) + ev = ev[ev.r < AV_RADIUS] + ev_mc = ev_mc[ev_mc.r < AV_RADIUS] + muon_mc = muon_mc[muon_mc.r < AV_RADIUS] # require psi < 6 ev = ev[ev.psi < 6] diff --git a/utils/dm-search b/utils/dm-search index a486593..25fa185 100755 --- a/utils/dm-search +++ b/utils/dm-search @@ -35,7 +35,7 @@ from sddm import printoptions from sddm.utils import fast_cdf, correct_energy_bias from scipy.integrate import quad from sddm.dm import * -from sddm import SNOMAN_MASS +from sddm import SNOMAN_MASS, AV_RADIUS import nlopt # Likelihood Fit Parameters @@ -494,6 +494,18 @@ if __name__ == '__main__': evs.append(get_events(df.filename.values, merge_fits=True, nhit_thresh=args.nhit_thresh)) ev = pd.concat(evs) + livetime = 0.0 + livetime_pulse_gt = 0.0 + for ev in evs: + if not np.isnan(ev.attrs['time_10_mhz']): + livetime += ev.attrs['time_10_mhz'] + else: + livetime += ev.attrs['time_pulse_gt'] + livetime_pulse_gt += ev.attrs['time_pulse_gt'] + + print("livetime = %.2f" % livetime) + print("livetime (pulse gt) = %.2f" % livetime_pulse_gt) + ev = correct_energy_bias(ev) # Note: We loop over the MC filenames here instead of just passing the @@ -530,10 +542,12 @@ if __name__ == '__main__': ev_mc = ev_mc[~np.isnan(ev_mc.fmin)] muon_mc = muon_mc[~np.isnan(muon_mc.fmin)] - # require (r/r_psup)^3 < 0.9 - ev = ev[ev.r_psup < 0.9] - ev_mc = ev_mc[ev_mc.r_psup < 0.9] - muon_mc = muon_mc[muon_mc.r_psup < 0.9] + # require (r < av radius) + ev = ev[ev.r < AV_RADIUS] + ev_mc = ev_mc[ev_mc.r < AV_RADIUS] + muon_mc = muon_mc[muon_mc.r < AV_RADIUS] + + fiducial_volume = (4/3)*np.pi*(AV_RADIUS)**3 # require psi < 6 ev = ev[ev.psi < 6] @@ -702,11 +716,11 @@ if __name__ == '__main__': fig = plt.figure() for color, dm_particle_id in zip(('C0','C1'),(2020,2222)): - plt.plot(DM_MASSES[dm_particle_id],limits[dm_particle_id],color=color,label='$' + ''.join([particle_id[int(''.join(x))] for x in grouper(str(dm_particle_id),2)]) + '$') + plt.plot(DM_MASSES[dm_particle_id],limits[dm_particle_id]/fiducial_volume/livetime,color=color,label='$' + ''.join([particle_id[int(''.join(x))] for x in grouper(str(dm_particle_id),2)]) + '$') plt.gca().set_xscale("log") despine(fig,trim=True) plt.xlabel("Energy (MeV)") - plt.ylabel("Event Rate Limit (events)") + plt.ylabel("Event Rate Limit (events/cm^3/s)") plt.legend() plt.tight_layout() diff --git a/utils/sddm/plot_energy.py b/utils/sddm/plot_energy.py index be13d78..b16e2cd 100644 --- a/utils/sddm/plot_energy.py +++ b/utils/sddm/plot_energy.py @@ -42,6 +42,7 @@ TRIG_NHIT_100_MED = 0x00000002 TRIG_NHIT_100_HI = 0x00000004 TRIG_NHIT_20 = 0x00000008 TRIG_NHIT_20_LB = 0x00000010 +TRIG_PULSE_GT = 0x00000400 def unwrap(p, delta, axis=-1): """ @@ -591,6 +592,19 @@ def get_events(filenames, merge_fits=False, nhit_thresh=None, mc=False): ev['signal'] = ~(ev.noise | ev.neck | ev.flasher | ev.breakdown | ev.muon) ev['instrumental'] = ~ev.signal + n_pulse_gt = np.count_nonzero((ev.trg_type & TRIG_PULSE_GT) != 0) + # Pulse GT went at approximately 5 Hz for the duration of SNO + time_pulse_gt = n_pulse_gt/5.0 + + if 'jdy' in ev.columns: + # Calculate total time based on 10 MHz clock + t10 = ev['jdy']*24*3600 + ev['ut1'] + ev['ut2']/1e9 + # Note: We don't take the max and min here because there might be bit flips + # in the 10 MHz clock + time_10_mhz = np.percentile(t10,99.9) - np.percentile(t10,0.1) + else: + time_10_mhz = np.nan + # Try to identify Michel electrons. Currently, the event selection is based # on Richie's thesis. Here, we do the following: # @@ -634,6 +648,14 @@ def get_events(filenames, merge_fits=False, nhit_thresh=None, mc=False): np.cos(ev_single_particle.theta1)*ev_single_particle.z ev['udotr'] /= ev_single_particle.r + # Yes, this is super hacky, but I don't want to change what's returned from + # this function. + ev.attrs = {'time_pulse_gt': time_pulse_gt, 'time_10_mhz': time_10_mhz} + return ev + # Yes, this is super hacky, but I don't want to change what's returned from + # this function. + ev.attrs = {'time_pulse_gt': time_pulse_gt, 'time_10_mhz': time_10_mhz} + return ev, fits |