def findv1(self): populationMax=2000 ySum = np.zeros(populationMax) frameSum = 'none' seq5 = self.s['seq5'].split() for seq in seq5: print "seq=",seq outfileName = "cosmicTimeList-"+seq+".pkl" if not os.path.exists(outfileName): fn = FileName(self.s['run'], self.s['sundownDate'], self.s['obsDate']+"-"+str(seq)) cosmic = Cosmic(fn, beginTime=self.s['beginTime'], endTime=self.s['endTime'], loggingLevel = logging.INFO) fc = cosmic.findCosmics(stride=int(self.s['stride']), threshold=int(self.s['threshold']), populationMax=populationMax, nSigma=float(self.s['nSigma'])) outfile = open(outfileName, "wb") pickle.dump(fc['cosmicTimeList'],outfile) pickle.dump(fc['binContents'],outfile) outfile.close() cfn = "cosmicMask-%s.h5"%seq ObsFile.writeCosmicIntervalToFile(fc['interval'],1.0e6, cfn, self.s['beginTime'], self.s['endTime'], int(self.s['stride']), int(self.s['threshold']), float(self.s['nSigma']), populationMax) del cosmic
#cosmic = Cosmic(fn, endTime='exptime') cosmic = Cosmic(fn, beginTime=0) fc = cosmic.findCosmics(stride=stride, threshold=threshold, populationMax=populationMax, nSigma=nSigma) if frameSum == 'none': frameSum = fc['frameSum'] else: frameSum += fc['frameSum'] outfile = open("cosmicTimeList-"+seq+".pkl", "wb") pickle.dump(fc['cosmicTimeList'],outfile) pickle.dump(fc['binContents'],outfile) outfile.close() cfn = "cosmicMax-%s.h5"%seq ObsFile.writeCosmicIntervalToFile(fc['interval'],1.0e6, cfn) populationHg = fc['populationHg'] yPlot = populationHg[0].astype(np.float) ySum += yPlot norm = yPlot.sum() yPlot /= norm yPlot[yPlot==0] = 1e-3/norm xPlot = 0.5*(populationHg[1][1:]+populationHg[1][:-1]) plt.clf() plt.plot(xPlot,yPlot,'-') plt.yscale('log') plt.ylim(ymin=0.5/norm) plt.xlim(1,populationMax) plt.xscale('log') #poisson = [] #xValues = populationHg[1][1:]-0.5
def findCosmics(self, stride=10, threshold=100, populationMax=2000, nSigma=5, writeCosmicMask=False, ppsStride=10000): """ Find cosmics ray suspects. Histogram the number of photons recorded at each timeStamp. When the number of photons in a group of stride timeStamps is greater than threshold in second iSec, add (iSec,timeStamp) to cosmicTimeLists. Also keep track of the histogram of the number of photons per stride timeStamps. return a dictionary of 'populationHg', 'cosmicTimeLists', 'binContents', 'timeHgValues', 'interval', 'frameSum', and 'pps' populationHg is a histogram of the number of photons in each time bin. This is a poisson distribution with a long tail due to cosmic events cosmicTimeLists is a numpy array of all the sequences that are suspects for cosmic rays binContents corresponds to cosmicTimeLists. For each time in cosmicTimeLists, binContents is the number of photons detected at that time. timeHgValues is a histogram of the number of photons in each time interval frameSum is a two dimensional numpy array of the number of photons detected by each pixel interval is the interval of data to be masked out pps is photons per second, calculated every ppsStride bins. """ self.logger.info("findCosmics: begin stride=%d threshold=%d populationMax=%d nSigma=%d writeCosmicMask=%s"%(stride,threshold,populationMax,nSigma,writeCosmicMask)) exptime = self.endTime-self.beginTime nBins = int(np.round(self.file.ticksPerSec*exptime+1)) bins = np.arange(0, nBins, 1) timeHgValues,frameSum = self.getTimeHgAndFrameSum(self.beginTime,self.endTime) remainder = len(timeHgValues)%ppsStride if remainder > 0: temp = timeHgValues[:-remainder] else: temp = timeHgValues ppsTime = (ppsStride*self.file.tickDuration) pps = np.sum(temp.reshape(-1, ppsStride), axis=1)/ppsTime self.logger.info("findCosmics: call populationFromTimeHgValues") pfthgv = Cosmic.populationFromTimeHgValues\ (timeHgValues,populationMax,stride,threshold) #now build up all of the intervals in seconds self.logger.info("findCosmics: build up intervals: nCosmicTime=%d"%len(pfthgv['cosmicTimeList'])) i = interval() iCount = 0 secondsPerTick = self.file.tickDuration for cosmicTime in pfthgv['cosmicTimeList']: #t0 = max(0,self.beginTime+(cosmicTime-50)/1.e6) #t1 = min(self.endTime,self.beginTime+(cosmicTime+50)/1.e6) #intTime = t1-t0 t0 = self.beginTime+cosmicTime*secondsPerTick dt = stride*secondsPerTick t1 = t0+dt left = max(self.beginTime, t0-nSigma*dt) right = min(self.endTime, t1+2*nSigma*dt) i = i | interval[left,right] self.logger.debug("findCosmics: iCount=%d t0=%f t1=%f left=%f right=%f"%(iCount,t0,t1,left,right)) iCount+=1 tMasked = Cosmic.countMaskedBins(i) ppmMasked = 1000000*tMasked/(self.endTime-self.beginTime) retval = {} retval['timeHgValues'] = timeHgValues retval['populationHg'] = pfthgv['populationHg'] retval['cosmicTimeList'] = pfthgv['cosmicTimeList'] retval['binContents'] = pfthgv['binContents'] retval['frameSum'] = frameSum retval['interval'] = i retval['ppmMasked'] = ppmMasked retval['pps'] = pps retval['ppsTime'] = ppsTime if writeCosmicMask: cfn = self.fn.cosmicMask() self.logger.info("findCosmics: write masks to =%s"%cfn) ObsFile.writeCosmicIntervalToFile(i, self.file.ticksPerSec, cfn,self.beginTime, self.endTime, stride, threshold, nSigma, populationMax) self.logger.info("findCosmics: end with ppm masked=%d"%ppmMasked) return retval