def testSimple(self): mu = 100 sig = 10 s = np.random.normal(mu, sig, 1000) s[400] = mu+13*sig s[500] = mu+15*sig s[654] = mu-15*sig mean,sigma,nSurvived = meanclip.meanclip(s, clipsig=9.0) self.assertEqual(nSurvived, 997, \ "three should get cut nSurived=%d" % nSurvived) self.assertAlmostEqual(mu, mean, delta=0.7, \ msg="mu=%f mean=%f" % (mu,mean)) self.assertAlmostEqual(sig, sigma, delta=0.6, \ msg="sig=%f sigma=%f" % (sig,sigma))
def findFlashes(self, clipsig=3.0, maxiter=5,\ converge_num=0.05, verbose=0, flashsig=6): """ find flashes by looking at the time histograms. Calculate the mean,sigma using meanclip and the parameters clipsig, maxiter, converge_num A time bin has a flash if the normalized signal (measured-mean)/sigma is larger than flashsig. """ # make the blank data structures if self.timeHgs == "none": self.makeTimeHgs() self.flashInterval["all"] = [] # find the flashes in each roach for roach in self.roachList: self.rMean[roach],self.rSigma[roach],self.rNSurvived[roach] = \ meanclip.meanclip(\ np.array(self.timeHgs[roach]), clipsig, maxiter, converge_num,\ verbose) self.rNormed[roach] = \ (self.timeHgs[roach]-self.rMean[roach])/self.rSigma[roach] self.flashInterval[roach] = interval() prev = 0 a = self.rNormed[roach] for i in range(len(a)): this = a[i] > flashsig if (this != prev): if (this): iBegin = i else: self.flashInterval[roach] = \ self.flashInterval[roach] | interval[iBegin,i] prev = this if (prev): self.flashInterval[roach] = \ self.flashInterval[roach] | interval[iBegin,i] # union of all flashes self.flashInterval["all"] = interval() for roach in self.roachList: self.flashInterval["all"] = \ self.flashInterval["all"] | self.flashInterval[roach] # look for gaps smaller than self.flashMergeTime and plug them dMax = self.nBinsPerSec*self.flashMergeTime extrema = self.flashInterval["all"].extrema for i in range(len(extrema)/2-1): i0 = extrema[2*i+1][0] i1 = extrema[2*(i+1)][0] if (i1-i0) <= dMax: t0 = self.beginTime + float(i0)/self.nBinsPerSec t1 = self.beginTime + float(i1)/self.nBinsPerSec self.flashInterval["all"] = \ self.flashInterval["all"] | interval[i0,i1] # convert to ticks since the beginning of the data file rlAll = list(self.roachList) rlAll.append("all") ticksPerSecond = int(1.0/self.file.tickDuration) offset = self.beginTime*ticksPerSecond scale = 1.0/(self.file.tickDuration*self.nBinsPerSec) for roach in rlAll: self.flashInterval[roach] = offset+scale*self.flashInterval[roach]