def cmd_disableRegulation(self,the_command): '''disables temperature regulation, important to run before quitting''' b = sb.SetTemperatureRegulationParams() b.regulation = 0 b.ccdSetpoint = 1000 sb.SBIGUnivDrvCommand(sb.CC_SET_TEMPERATURE_REGULATION, b, None) a = sb.QueryTemperatureStatusResults() sb.SBIGUnivDrvCommand(sb.CC_QUERY_TEMPERATURE_STATUS,None,a) #A-D unit conversion v1 = 4096.0/b.ccdSetpoint v2 = 10.0/(v1-1.0) setPointC = int(25.0 - 25.0 *((np.log(v2/3.0))/0.943906)) v3 = 4096.0/a.ccdThermistor v4 = 10.0/(v3-1.0) TempC = 25.0 - 25.0 *((np.log(v4/3.0))/0.943906) TempC_round = round(TempC, 2) #associates the binary output of the refulation variable with on or off for the purposes of printing if b.regulation == 1 : reg = 'on' elif b.regulation == 0 : reg = 'off' return 'regulation = ' +str(reg) +'\n power = '+str(a.power) + '\n CCD set point (A/D) = '\ + str(a.ccdSetpoint) + ', CCD set point (C) = ' + str(setPointC)+'\n current CCD temp (A/D) = '\ + str(a.ccdThermistor) + ', current CCD temp (C)' + str(TempC_round)+ '\n'
def cmd_setTemperature(self,the_command): '''this command sets the temperature of the imaging CCD, input is in degrees C.''' commands = str.split(the_command) if len(commands) < 2 : return 'error: no input value' b = sb.SetTemperatureRegulationParams() b.regulation = 1 #tests input validity, if not an integer value then input is rejected try: tempC = int(commands[1]) except Exception: return 'invalid input (Please input an integer value in degrees C)' #Converts the degrees C input into A-D units, A-D units are interpretted and used by the driver v1 = (3.0 * np.exp((0.943906 * (25.0 -tempC))/25.0)) temp = int(4096.0/((10.0/v1) + 1.0)) b.ccdSetpoint = temp sb.SBIGUnivDrvCommand(sb.CC_SET_TEMPERATURE_REGULATION, b, None) #calls the querey temperature command to check current CCD status time.sleep(0.1) a = sb.QueryTemperatureStatusResults() sb.SBIGUnivDrvCommand(sb.CC_QUERY_TEMPERATURE_STATUS,None,a) #converts thermistor value and setpoint to degrees C SPa = a.ccdThermistor v2 = 4096.0/SPa v3 = 10.0/(v2-1.0) ccdThermistorC = 25.0 - 25.0 *((np.log(v3/3.0))/0.943906) ccdThermistorC_rounded = round(ccdThermistorC, 2) #associates the binary output of the refulation variable with on or off for the purposes of printing if b.regulation == 1 : reg = 'on' elif b.regulation == 0 : reg = 'off' #prints useful values to screen return ' regulation = ' +str(reg) +'\n power = '+str(a.power) + '\n CCD set point (A/D) = '\ + str(a.ccdSetpoint) + ', CCD set point (C) = ' + str(tempC)+'\n current CCD temp (A/D) = '\ + str(a.ccdThermistor) + ', current CCD temp (C) = ' + str(ccdThermistorC_rounded) +'\n'
def getTemperature(self, ccd=True): """ @returns: a tuple with (is cooling enabled, current cooling power (0-100), setpoint temperature, current ccd temperature) """ # USB based cameras have only one thermistor on the top of the CCD # Ambient thermistor value will be always 25.0 oC # ccdSetPoint value will be always equal to ambient thermistor # when regulation not enabled (not documented) qtsr = udrv.QueryTemperatureStatusResults() self._cmd(udrv.CC_QUERY_TEMPERATURE_STATUS, None, qtsr) return (qtsr.enabled, (qtsr.power / 255.0) * 100.0, TemperatureSetPoint.toDegrees(qtsr.ccdSetpoint, "ccd"), TemperatureSetPoint.toDegrees(qtsr.ccdThermistor, "ccd"))
def cmd_checkTemperature(self,the_command): '''This command checks the temperature at the time it is run''' a = sb.QueryTemperatureStatusResults() sb.SBIGUnivDrvCommand(sb.CC_QUERY_TEMPERATURE_STATUS,None,a) #A-D unit conversion SP = a.ccdSetpoint v1 = 4096.0/SP v2 = 10.0/(v1-1.0) setPointC = int(25.0 - 25.0 *((np.log(v2/3.0))/0.943906)) v3 = 4096.0/a.ccdThermistor v4 = 10.0/(v3-1.0) TempC = 25.0 - 25.0 *((np.log(v4/3.0))/0.943906) TempC_rounded = round(TempC, 2) #associates the binary output of the refulation variable with on or off for the purposes of printing if a.enabled == 1 : reg = 'on' elif a.enabled == 0 : reg = 'off' #prints useful values return 'regulation = ' +str(reg) +'\n power = '+str(a.power) + '\n CCD set point (A/D) = ' \ + str(a.ccdSetpoint) + ', CCD set point (C) = ' + str(setPointC)+'\n current CCD temp (A/D) = ' \ + str(a.ccdThermistor) + ', current CCD temp (C)' + str(TempC_rounded) + '\n'
def capture(self,exposureTime,shutter,fileInput,imtype='Light'): self.imtype=imtype #This command checks the temperature at the time it is run a = sb.QueryTemperatureStatusResults() sb.SBIGUnivDrvCommand(sb.CC_QUERY_TEMPERATURE_STATUS,None,a) #A-D unit conversion SP = a.ccdSetpoint v1 = 4096.0/SP v2 = 10.0/(v1-1.0) setPointC = int(25.0 - 25.0 *((np.log(v2/3.0))/0.943906)) v3 = 4096.0/a.ccdThermistor v4 = 10.0/(v3-1.0) TempC = 25.0 - 25.0 *((np.log(v4/3.0))/0.943906) TempC_rounded = round(TempC, 2) #associates the binary output of the refulation variable with on or off for the purposes of printing if a.enabled == 1 : reg = 'on' elif a.enabled == 0 : reg = 'off' self.camtemp=TempC_rounded self.ccdSetpoint=setPointC self.cooling=reg #Get CCD Parameters, this is required for later during readout p = sb.GetCCDInfoParams() p.request = 0 r = sb.GetCCDInfoResults0() sb.SBIGUnivDrvCommand(sb.CC_GET_CCD_INFO,p,r) self.width = r.readoutInfo[0].width self.height = r.readoutInfo[0].height #This is because the spectrograph camera does not return the correct width and height from GetCCDInfoParams, but returns 1000x1000 #This is probably ok since it is unlikely we will ever have a camera with 1000x1000 pixels exactly. if self.height==1000 and self.width==1000: self.width = 3352 self.height = 2532 self.gain = hex(r.readoutInfo[0].gain) self.gain=float(self.gain[2:])*0.01 #Start the Exposure self.startTime = time.time() p = sb.StartExposureParams() p.ccd = 0 p.exposureTime = int(exposureTime * 100) self.exposureTime=exposureTime # anti blooming gate, currently untouched (ABG shut off) p.abgState = 0 #sets up file name filename= fileInput.partition('.fits')[0] #calls checking functions self.checkDir(filename) self.checkFile(self.fullpath) #sets the shutter to open or closed. print ' shutter: ' + str(shutter) + '\n file: ' + str(self.fullpath) + '\n exposure: ' + str(exposureTime) + ' seconds' if shutter == 'open': shutter_status = 1 elif shutter == 'closed':shutter_status = 2 p.openShutter = shutter_status sb.SBIGUnivDrvCommand(sb.CC_START_EXPOSURE,p,None) p = sb.QueryCommandStatusParams() p.command = sb.CC_START_EXPOSURE r = sb.QueryCommandStatusResults() r.status = 0 self.exposure_active=True