##^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Lance Simms, Stanford University 2009#HxRG_Class.py
#
#A class that contains variables contained in the keywords of the fits
#header, such as Naxis1, and ITime.
#
#The class HxRG requires the detector string as input in order to determine
#which members will be instantiated.
#
#INPUT KEYWORDS:
#       Either takes a FitsFitsFileName or a combination of DetStr and ElecStr
#
#	DetStr  - 
#	1) 'H1RG-022' 
#	2) 'H2RG-32-147'
#	3) 'H4RG-10-007' 
#
#	ElecStr - 
#	1) 'ASIC' 
#	2) 'LEACH'
#
#	OR
#	FitsFitsFileName - Must be full path to a Fits File in the Data Directory
#
#EXAMPLE:
#	
#      > from HxRG_Class import *
#      > HxRG_I = HxRG('H1RG-022', 'ASIC')
#
#To reload this module:
# import HxRG_Class; reload(HxRG_Class); from HxRG_Class import *
#
import re, os, glob, pyfits
import pdb

class HxRG_C:

    #INSTANTIATION######################
    def __init__(self, DetStr='', ElecStr='', FitsFileName='', ObjectName='',
		 Date='', ObjectText='', Filter='', WindowM = 0, UseRef=0,
		 NReads=0, DarkSub=0):
      self.DetStr      = DetStr
      self.ElecStr     = ElecStr
      self.ObjectName  = ObjectName
      self.WindowM     = WindowM
      self.ObjectText  = ObjectText
      self.Date        = Date
      self.Filter      = Filter
      self.DarkSub     = DarkSub
      self.UseRef      = UseRef
      self.NReads      = NReads
      self.UseRefStr   = ''      
      if self.UseRef: 
        self.UseRefStr='RPS'
      else: 
        self.UseRefStr = ''

      if self.WindowM: 
         self.WindowMStr = '_WM'
      else:
         self.WindowMStr = ''

      #The directory where all of the data is stored
      self.DataDir = '/nfs/slac/g/ki/ki04/lances/'
      #If HxRG_C is initialized with a filename, extract these things
      if FitsFileName != '':
         DirName      = os.path.dirname(FitsFileName)
         DirParts     = DirName.split('/')
	 NumDirs      = len(DirParts)
         self.DetStr  = DirParts[7]
         if self.DetStr != 'H4RG-10-007':
            self.ElecStr = DirParts[8]
            if FitsFileName.find('SIDECAR_Tests') != -1:
              self.Date          = DirParts[7]
              self.ObjectName    = 'SIDECAR_Tests'
              self.ReducedDir    = '/nfs/slac/g/ki/ki04/lances/SIDECAR_Plots/'
              self.RootDir       = '/nfs/slac/g/ki/ki04/lances/SIDECAR_Tests/'
            elif FitsFileName.find('Reduced') == -1:
              self.Date          = DirParts[9]
	      self.ObjectName    = DirParts[NumDirs-1]
	    else:
	      self.Date          = DirParts[10]
	      self.ObjectName    = DirParts[NumDirs-1]
	      self.RedObjectDir  = DirName+'/'
             
         else:
            self.ElecStr = 'ASIC'
            if FitsFileName.find('Reduced') == -1:
              self.Date          = DirParts[8]
              self.ObjectName    = DirParts[NumDirs-1]
            else: 
              self.Date          = DirParts[9]
	      self.RedObjectDir  = DirName+'/'
              self.ObjectName    = DirParts[NumDirs-1]

         self.RawObjectBase = os.path.basename(FitsFileName)
	 self.RawObjectKey  = (self.RawObjectBase.split('.'))[0]
      #The directory where the files belonging to the detector are stored
      if self.DetStr == 'H1RG-022' and self.ElecStr == 'ASIC':
         self.RootDir      = self.DataDir+'H1RG-022/ASIC/'
         self.ReducedDir   = self.RootDir+'Reduced/'
	 self.RawObjectDir = self.RootDir+'/'+Date+'/'
         self.CGain        = 5.43  #e-/ADU
         #Variables
         if self.Date == '08Jun27' or self.Date =='08Jun28' or self.Date == '08Jun29': 
           self.CFac = 1.00
         else:
           self.CFac = 0.27 
	 self.BadCols = 0
         self.FNAxis1 = 1024 ; self.FNAxis2 = 1024
         self.DetStrMySQL = 'H1RG_022'
         self.FrameTime = 0.71
         self.StdImage  = 'imt1024'
         self.VoltsPerADU = 70e-6

      elif self.DetStr == 'H1RG-022' and self.ElecStr == 'LEACH':
         self.RootDir      = self.DataDir+'H1RG-022/LEACH/'
         self.ReducedDir   = self.RootDir+'Reduced/'
	 self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables
         self.CFac = 0.00
	 self.BadCols = 1
         self.FNAxis1 = 1024 ; self.FNAxis2 = 1024
         self.DetStrMySQL = 'H1RG_022'
         self.StdImage  = 'imt1024'
         if self.Date == '05May08':
           #This gain was obtained through photon transfer at IDTL 6/14/2005
           self.CGain = 1.0

      elif self.DetStr == 'H1RG-018' and self.ElecStr == 'LEACH':
         self.RootDir      = self.DataDir+'H1RG-018/LEACH/'
         self.ReducedDir   = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables
         self.BadCols = 1
         self.FNAxis1 = 1024 ; self.FNAxis2 = 1024
         self.DetStrMySQL = 'H1RG_018'
         self.FrameTime   = 6.242
         self.StdImage  = 'imt1024'
         if self.Date == '04Jun06':
           #This gain was obtained through photon transfer at IDTL 6/14/2005
           self.CGain = 1.0
           self.CFac  = 10.0
      elif self.DetStr == 'H2RG-32-147' and self.ElecStr == 'ASIC':
         self.RootDir    = self.DataDir+'H2RG-32-147/ASIC/'
         self.ReducedDir = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables 
         self.CFac = 1.27
	 self.BadCols = 0 
         self.FNAxis1 = 2048 ; self.FNAxis2 = 2048
         self.DetStrMySQL = 'H2RG_32_147'
         self.FrameTime   = 1.4144
         self.FullWell    = 15000.
         self.StdImage    = 'imt1024'
         self.CGain       = 5.85
         self.VoltsPerADU = 70e-6 
      elif self.DetStr == 'H2RG-32-147' and self.ElecStr == 'LEACH':
         self.RootDir    = self.DataDir+'H2RG-32-147/LEACH/'
         self.ReducedDir = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables 
         self.CFac = 1.27
         self.BadCols = 0
         self.FNAxis1 = 2048 ; self.FNAxis2 = 2048
         self.DetStrMySQL = 'H2RG_32_147'
         self.FrameTime   = 0.71
         self.FullWell    = 15000.
         self.StdImage    = 'imt1024'
         self.CGain       = 5.85
         self.VoltsPerADU = 70e-6
      elif self.DetStr == 'H2RG-001' and self.ElecStr == 'ASIC':
         self.RootDir    = self.DataDir+'H2RG-001/ASIC/'
         self.ReducedDir = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables 
         self.CFac = 1.0
         self.BadCols = 1
         self.FNAxis1 = 2048 ; self.FNAxis2 = 2048
         self.DetStrMySQL = 'H2RG_001'
         self.FrameTime   = 1.4144
         self.FullWell    = 15000.
         self.StdImage    = 'imt1024'
         self.CGain       = 1.2
         self.VoltsPerADU = 70e-6
      elif self.DetStr == 'H2RG-148' and self.ElecStr == 'ASIC':
         self.RootDir    = self.DataDir+'H2RG-148/ASIC/'
         self.ReducedDir = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables 
         self.CFac = 1.0
         self.BadCols = 1
         self.FNAxis1 = 2048 ; self.FNAxis2 = 2048
         self.DetStrMySQL = 'H2RG_148'
         self.FrameTime   = 1.4144
         self.FullWell    = 15000.
         self.StdImage    = 'imt1024'
         self.CGain       = 1.2
         self.VoltsPerADU = 70e-6
      elif self.DetStr == 'H2RG-32-147' and self.ElecStr == 'LEACH':
         self.RootDir    = self.DataDir+'H2RG-32-147/LEACH/' 
         self.ReducedDir = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'+self.ObjectName+'/'
         #Variables
         self.CFac = 0.00
	 self.BadCols = 0
         self.FNAxis1 = 2048 ; self.FNAxis2 = 2048
         self.DetStrMySQL = 'H2RG_32_147'
         self.StdImage  = 'imt1024'
         self.CGain       = 4.38

      elif self.DetStr == 'H4RG-10-007' :
         self.RootDir    = self.DataDir+'H4RG-10-007/'
         self.ReducedDir = self.RootDir+'Reduced/'
         self.RawObjectDir = self.RootDir+'/'+Date+'/'
         #Variables
         self.CFac = 0.00
	 self.BadCols = 0
         self.FNAxis1 = 4096 ; self.FNAxis2 = 4096
         self.DetStrMySQL = 'H4RG_10_007'
         self.StdImage  = 'imt1024'

      #Declare a Detector Dir
      self.DetDir  = self.DataDir+self.DetStr+'/'
      self.ElecDir = self.DataDir+self.DetStr+'/'+self.ElecStr+'/'
      self.RedObjectDir = self.ReducedDir+self.Date+'/'+self.ObjectName+'/'
      self.PhotDir = self.RedObjectDir+'Photometry/'

      #Some other directories
      self.LeakyDir  = self.DetDir+'LeakyPix/'
      self.LeakyMask = self.LeakyDir+'LeakyMask.fits'

      self.HotDir  = self.DetDir+'HotPix/'
      self.HotMask = self.HotDir+'HotMask.fits'

      #If HxRG_C is initialized with a filename, extract these things
      if FitsFileName != '': 
         self.Get_Date(self.Date)

      #INITIALIZE SOME DEFAULTS
      if self.WindowM == 1:
	 self.WindowMStr = '_WM'
      else:
         self.WindowMStr = '' 

    #FILL DIRS WITH DATE#################
    def Get_Date(self,Date):
      self.Date = Date
      if self.DetStr == 'H1RG-022' and self.ElecStr == 'ASIC':
        self.DateDir = self.RootDir+Date+'/'
        self.DarkDir = self.ReducedDir+Date+'/'
        self.FlatDir = self.ReducedDir+Date+'/'
        self.Fe55Dir = self.RootDir+Date+'/'
	self.RawObjectDir = self.RootDir+Date+'/'
      elif self.DetStr == 'H4RG-10-007':
        self.DateDir = self.RootDir+Date+'/'
        self.DarkDir = self.ReducedDir+Date+'/Darks/'
        self.FlatDir = self.ReducedDir+Date+'/Flats/'
        self.RawObjectDir = self.RootDir+Date+'/'
      elif self.DetStr == 'H1RG-022' and self.ElecStr == 'LEACH':
        self.DateDir = self.RootDir+Date+'/'
        self.DarkDir = self.ReducedDir+Date+'/Dark/'
        self.FlatDir = self.ReducedDir+Date+'/Flat/'
        self.Fe55Dir = self.RootDir+Date+'/Fe-55/'
        self.RawObjectDir = self.RootDir+Date+'/'+self.ObjectName+'/'
      else:
        self.DateDir = self.RootDir+Date+'/'
        self.DarkDir = self.ReducedDir+Date+'/Dark/'
        self.FlatDir = self.ReducedDir+Date+'/Flat/'
        self.Fe55Dir = self.RootDir+Date+'/Fe55/'
        self.RawObjectDir = self.RootDir+Date+'/'+self.ObjectName+'/'

    #FILL DIRS WITH OBJECT##############
    def Specify_Object(self,ObjectName):
      self.ObjectName = ObjectName

      if ObjectName == 'Dark':
         self.RawObjectDir = self.DarkDir
      elif ObjectName =='Flat': 
         self.RawObjectDir = self.FlatDir  
      elif ObjectName =='Fe55' or ObjectName =='Fe-55':
         self.RawObjectDir = self.Fe55Dir
      else:
         self.RawObjectDir = ObjectName 

    #FILL MEMBERS WITH HEADER############
    def Get_Raw_Header(self,FitsFileName): 

      #Get Some Values from the filename before the header is examined
      DirName      = os.path.dirname(FitsFileName)
      DirParts     = DirName.split('/')
      NumDirs      = len(DirParts)
      self.DetStr  = DirParts[7]
      if self.DetStr != 'H4RG-10-007':
         self.ElecStr = DirParts[8]
         if FitsFileName.find('Reduced') == -1:
           self.Date          = DirParts[9]
           self.ObjectName    = DirParts[NumDirs-1]
         else:
           self.Date          = DirParts[10]
      else:
         self.ElecStr = 'ASIC'
         if FitsFileName.find('Reduced') == -1:
           self.Date          = DirParts[8]
         else:
           self.Date          = DirParts[9]

      #Get the raw directory and filename
      self.RawObjectBase = os.path.basename(FitsFileName)
      self.RawObjectKey  = (self.RawObjectBase.split('.'))[0]
      self.RawObjectDir  = os.path.dirname(FitsFileName)

      #Declare a Detector Dir
      self.DetDir  = self.DataDir+self.DetStr+'/'
      self.ElecDir = self.DataDir+self.DetStr+'/'+self.ElecStr+'/' 

      #Brandon messed up big time on the headers for files, explaining this kludge
      if not(self.DetStr=='H1RG-022' and self.ElecStr=='LEACH') or \
         FitsFileName.find('Slope') != -1:
        FitsHDU     = pyfits.open(FitsFileName)
        Header      = FitsHDU[0].header
        if Header.has_key('NAXIS')    : self.NAxis = int(Header['NAXIS'])
        if Header.has_key('NAXIS1')   : self.NAxis1     = int(Header['NAXIS1'])
        if Header.has_key('NAXIS2')   : self.NAxis2     = int(Header['NAXIS2'])
        if Header.has_key('NAXIS3')   :
          self.NAxis3     = int(Header['NAXIS3'])
        else:
          self.NAxis3     = 0
      elif (self.DetStr=='H1RG-022' and self.ElecStr=='LEACH' and \
            FitsFileName.find('Flat') != -1 and FitsFileName.find('Slope') == -1):
        FitsHDU     = pyfits.open(FitsFileName)
        Header      = FitsHDU[0].header 
        if Header.has_key('NAXIS')    : self.NAxis = int(Header['NAXIS'])
        if Header.has_key('NAXIS1')   : self.NAxis1     = int(Header['NAXIS1'])
        if Header.has_key('NAXIS2')   : self.NAxis2     = int(Header['NAXIS2'])
        if Header.has_key('NAXIS3')   :
          self.NAxis3     = int(Header['NAXIS3'])
        else:
          self.NAxis3     = 0
      else:
        FitsHDU     = pyfits.open(FitsFileName)
        Header      = FitsHDU[0].header
        if Header.has_key('NAXIS')    : self.NAxis = int(Header['NAXIS'])
        if Header.has_key('NAXIS1')   : self.NAxis1     = int(Header['NAXIS1'])
        if Header.has_key('NAXIS2')   : self.NAxis2     = int(Header['NAXIS2'])
        if Header.has_key('NAXIS3')   :
          self.NAxis3     = int(Header['NAXIS3'])
        else:
          self.NAxis3     = 0
        HeaderFileName = self.RawObjectDir+'/Header_'+self.RawObjectBase
        FitsHDU     = pyfits.open(HeaderFileName)
        Header      = FitsHDU[0].header
      if not(self.DetStr=='H1RG-022' and self.ElecStr=='LEACH' \
             and self.Date == '05May08'):
        if Header.has_key('BZERO') : 
           self.BZero = int(Header['BZERO'])
	else:
 	   self.BZero = int(0)
        if Header.has_key('ITIME')    : self.ITime = float(Header['ITIME'])
        if Header.has_key('FILTER')   : self.Filter     = Header['FILTER']
        if Header.has_key('MCD_FILE') : self.MCDFile    = Header['MCD_FILE']
        if Header.has_key('NREADS')   : self.NReads     = Header['NREADS']
        if Header.has_key('NGROUPS')  : self.NGroups    = Header['NGROUPS']
        if Header.has_key('NDROPS')   : self.NDrops     = Header['NDROPS']
        if Header.has_key('NRESETS')  : self.NResets    = Header['NRESETS']
        if Header.has_key('DETTEMP')  : self.DetTemp    = Header['DETTEMP']
        if Header.has_key('MOLYTEMP') : self.DetTemp    = Header['MOLYTEMP']
        if Header.has_key('1STTEMP')  : self.Temp1      = Header['1STTEMP']
        if Header.has_key('MOLYTABL') : self.MolyTable  = Header['MOLYTABL']
        if Header.has_key('PAMPGAIN') : self.PAmpGain   = int(Header['PAMPGAIN'])
        #Bias Voltages and Currents
        if Header.has_key('VSUB')     : self.VSUB       = float(Header['VSUB'])
        if Header.has_key('VRESET')   : self.VRESET     = float(Header['VRESET'])
        if Header.has_key('DSUB')     : self.DSUB       = float(Header['DSUB'])
        if Header.has_key('VBIASGAT') : self.VBIASGAT   = float(Header['VBIASGAT'])
        if Header.has_key('VBIASPWR') : self.VBIASPWR   = float(Header['VBIASPWR'])
        if Header.has_key('CELLDRAI') : self.CELLDRAI   = float(Header['CELLDRAI'])
        if Header.has_key('DRAIN')    : self.DRAIN      = float(Header['DRAIN'])
        if Header.has_key('VDDA')     : self.VDDA       = float(Header['VDDA'])
        if Header.has_key('VDD')      : self.VDD        = float(Header['VDD'])
        if Header.has_key('VPAMPRF1') : self.VPAMPRF1   = float(Header['VPAMPRF1'])
        if Header.has_key('VPAMPRF2') : self.VPAMPRF2   = float(Header['VPAMPRF2'])
        if Header.has_key('VREFMAIN') : self.VREFMAIN   = float(Header['VREFMAIN'])
        if Header.has_key('VPCFBIAS') : self.VPCFBIAS   = float(Header['VPCFBIAS'])
        if Header.has_key('VRN')      : self.VRN        = float(Header['VRN'])
        if Header.has_key('VPN')      : self.VPN        = float(Header['VPN'])
        if Header.has_key('VPREMDRF') : self.VPREMDRF   = float(Header['VPREMDRF'])
        if Header.has_key('VCM')      : self.VCM        = float(Header['VCM'])
        if Header.has_key('IPAMBIAS') : self.IPAMBIAS   = float(Header['IPAMBIAS'])
        if Header.has_key('IPAMCASC') : self.IPAMCASC   = float(Header['IPAMCASC'])
        if Header.has_key('IPAMPDAC') : self.IPAMDAC    = float(Header['IPAMPDAC'])
        if Header.has_key('IPULLUP')  : self.IPULLUP    = float(Header['IPULLUP'])
        if Header.has_key('I_NBIAS1') : self.I_NBIAS1   = float(Header['I_NBIAS1'])
        if Header.has_key('I_NBIAS2') : self.I_NBIAS2   = float(Header['I_NBIAS2'])
        if Header.has_key('I_NFB1')   : self.I_NFB1     = float(Header['I_NFB1'])
        if Header.has_key('I_NFB2')   : self.I_NFB2     = float(Header['I_NFB2'])


        if Header.has_key('FRMTIME')  : self.FrameTime  = float(Header['FRMTIME'])
	#Determine Full Frame or Window Mode
        if self.ElecStr == 'ASIC':
          if Header.has_key('WINDOWM'): 
            if self.DetStr != 'H2RG-148': self.WindowM  = Header['WINDOWM']
            if self.WindowM == 1 :
              #Up the Ramp Windows have proper ITime
              if self.MCDFile.find('UpTheRamp') != -1:
                self.FrameTime  = float(self.ITime)/float(self.NAxis3)
              #CDS Windows have ITime = FrameTime
              else:
                self.FrameTime  = self.ITime
                self.ITime      = 3*self.NAxis3*self.FrameTime
              #All Files on 08Jun29 had incorrect headers
              if self.Date == '08Jun29' or \
                 (self.Date == '07Dec19' and self.MCDFile.find('UpTheRamp') == -1):
                self.FrameTime  = (10e-6*self.NAxis1+18e-6)*self.NAxis2
                pdb.set_trace()
                self.ITime      = 3*self.FrameTime*(self.NAxis3/2)
              self.WindowMStr   = '_WM'
              self.WindowXStart = int(Header['WNDW0XMI']) 
              self.WindowXStop  = int(Header['WNDW0XMA'])
              self.WindowYStart = int(Header['WNDW0YMI'])
              self.WindowYStop  = int(Header['WNDW0YMA'])
	else:
	  self.WindowMStr = ''
	#Determine Times
        if (Header.has_key('TIME') and self.Date !='05May08' and self.Date !='04Jun06'): 
          self.DateTime = Header['TIME']
  	  self.Time     = self.DateTime[11:19]
          self.Hour     = self.Time[0:2]
          self.Minutes  = self.Time[3:5]
          self.Seconds  = self.Time[6:8]
          self.Year     = self.DateTime[20:24]
          self.Date     = self.DateTime[8:10]
          self.MonStr   = self.DateTime[4:7]
          if self.MonStr == 'Dec':
            self.Mon   = '12'
          elif self.MonStr == 'Nov':
            self.Mon   = '11'
          elif self.MonStr == 'May':
            self.Mon   = '05'
          elif self.MonStr == 'Apr':
            self.Mon   = '04'
          elif self.MonStr == 'Jun':
            self.Mon   = '06'
          else:
            self.Mon   = '' 
            self.Hour     = '20'
            self.Minutes  = '20'
            self.Seconds  = '20'
            self.ITime    = 0.34*self.NReads
	  self.DateTimeFor = self.Year+'-'+self.Mon+'-'+self.Date\
			   +' '+self.Time
        elif self.Date == '05May08':
          self.Year   = '05'
          self.Mon    = '05'
          self.MonStr = 'May'
          self.BZero  = int(32768)
        elif self.Date == '04Jun06':
          if self.RawObjectBase.find('Slope') != -1:
            self.DateTime = Header['TIME']
          else:
            self.DateTime = '00:00:00'
            self.ITime    = self.FrameTime*self.NAxis3
          self.Time   = self.DateTime
          self.Year   = '04' 
          self.Mon    = '06' 
          self.MonStr = 'Jun'
          print self.DateTime
          self.BZero  = int(32768)
          self.Hour     = self.DateTime[0:2]
          self.Minutes  = self.DateTime[3:5]
          self.Seconds  = self.DateTime[6:8]
        else:
          self.DateTime = ''
          self.Time     = ''
          self.Year     = ''
          self.Mon      = ''
          self.MonStr   = ''
          self.BZero    = 0
          self.Hour     = '20'
          self.Minutes  = '20'
          self.Seconds  = '20' 
          self.ITime    = 0.34*self.NAxis3 

        #Turn the strings into numbers
        self.BegSecondsNum = int(self.Seconds)
        self.BegMinutesNum = int(self.Minutes)
        self.BegHoursNum   = int(self.Hour)

        #Try to estimate the finish time 
        self.DurMinutesNum = int(self.ITime)/60
        self.DurSecondsNum = float(self.ITime)-(self.DurMinutesNum*60)
        self.FinMinutesNum = int(self.Minutes)+self.DurMinutesNum
        self.FinSecondsNum = float(self.Seconds)+self.DurSecondsNum
        if self.FinMinutesNum > 60:
          self.FinMinutesNum = self.FinMinutesNum-60
          self.FinHoursNum   = self.BegHoursNum+1
        else:
          self.FinHoursNum   = self.BegHoursNum

 #GET THE PROPER MEDIAN DARK FILE
    def Get_Median_Dark(self,NReads,ObjectText=''):
      if self.DetStr == 'H4RG-10-007':
         self.DarkName = (glob.glob(self.DarkDir+'MedianDark*'+str(NReads)+\
			           self.UseRefStr+'Reads.fits'))[0]
      else:
         self.DarkName = (glob.glob(self.DarkDir+'MedianDark*'+str(NReads)+\
                                   self.UseRefStr+'*.fits'))[0]

