def stimcount(band,t0,t1,margin=[90.01,90.01],aspum=68.754932/1000., eclipse=None): """Return stim counts.""" if not eclipse: eclipse = 55000 if isPostCSP(t0) else 30000 if isPostCSP(t0): margin[1]=180.02 avgstim = CalUtils.avg_stimpos(band,eclipse) return ('{baseURL}select count(*) from {baseDB}.{band}PhotonsNULLV '+ 'where time >= {t0} and time < {t1} and ('+ '((x >= {x10} and x < {x11}) and (y >= {y10} and y < {y11})) or '+ '((x >= {x20} and x < {x21}) and (y >= {y20} and y < {y21})) or '+ '((x >= {x30} and x < {x31}) and (y >= {y30} and y < {y31})) or '+ '((x >= {x40} and x < {x41}) and (y >= {y40} and y < {y41}))'+ '){formatURL}').format(baseURL=baseURL, baseDB=baseDB, band=band, t0=str(long(t0*tscale)), t1=str(long(t1*tscale)), x10=(avgstim['x1']-margin[0])/aspum, x11=(avgstim['x1']+margin[0])/aspum, y10=(avgstim['y1']-margin[1])/aspum, y11=(avgstim['y1']+margin[1])/aspum, x20=(avgstim['x2']-margin[0])/aspum, x21=(avgstim['x2']+margin[0])/aspum, y20=(avgstim['y2']-margin[1])/aspum, y21=(avgstim['y2']+margin[1])/aspum, x30=(avgstim['x3']-margin[0])/aspum, x31=(avgstim['x3']+margin[0])/aspum, y30=(avgstim['y3']-margin[1])/aspum, y31=(avgstim['y3']+margin[1])/aspum, x40=(avgstim['x4']-margin[0])/aspum, x41=(avgstim['x4']+margin[0])/aspum, y40=(avgstim['y4']-margin[1])/aspum, y41=(avgstim['y4']+margin[1])/aspum,formatURL=formatURL)
def stimcount(data,band,t0,t1,margin=90.001): """Given a dict() that contains a list of 'x' and 'y' detector positions as well as 't' event times, returns the total number of stim events. """ pltscl = 68.754932 # arcsec/mm aspum = pltscl/1000.0 # arcsec/um eclipse = 100. if isPostCSP(t0) else 40000. # HACK: for backwards comp. avgstim = avg_stimpos(band,eclipse) time = ((np.array(data['t'])>=t0) & (np.array(data['t'])<=t1)) stim1 = ((np.array(data['x'])>(avgstim['x1']-margin)) & (np.array(data['x'])<(avgstim['x1']+margin)) & (np.array(data['y'])>(avgstim['y1']-margin)) & (np.array(data['y'])<(avgstim['y1']+margin))) stim2 = ((np.array(data['x'])>(avgstim['x2']-margin)) & (np.array(data['x'])<(avgstim['x2']+margin)) & (np.array(data['y'])>(avgstim['y2']-margin)) & (np.array(data['y'])<(avgstim['y2']+margin))) stim3 = ((np.array(data['x'])>(avgstim['x3']-margin)) & (np.array(data['x'])<(avgstim['x3']+margin)) & (np.array(data['y'])>(avgstim['y3']-margin)) & (np.array(data['y'])<(avgstim['y3']+margin))) stim4 = ((np.array(data['x'])>(avgstim['x4']-margin)) & (np.array(data['x'])<(avgstim['x4']+margin)) & (np.array(data['y'])>(avgstim['y4']-margin)) & (np.array(data['y'])<(avgstim['y4']+margin))) ix = np.where(time & (stim1 | stim2 | stim3 | stim4)) return len(ix[0])
def deadtime_method2(data,t0,t1,band,refrate=79.,tstep=1., feeclkratio=0.966,refrange=[.4,2.]): """Given a list of global event times, computes the deadtime through direct comparison of the stim rate to the reference rate in bins of depth `tstep` seconds, and trimmed of outliers. This is close to the deadtime method used by the mission pipeline. """ eclipse = 100. if isPostCSP(t0) else 40000. # HACK: for backwards comp. exptime = t1-t0 bins = np.linspace(0.,exptime-exptime%tstep,exptime//tstep+1)+t0 h = np.zeros(len(bins)) for i,t in enumerate(bins): h[i] = stimcount(data,band,t,t+tstep-0.0001,eclipse)/exptime (minrate, maxrate) = (refrate*refrange[0],refrate+refrange[1]) ix = ((h<=maxrate) & (h>=minrate)).nonzero()[0] return (1.-((h[ix]/tstep)/feeclkratio)/refrate).mean()