def run_calcqu(input_data,config,harmonic): # The following call to SMURF:CALCQU creates two HDS container files - # one holding a set of Q NDFs and the other holding a set of U NDFs. Create # these container files in the NDG temporary directory. qcont = NDG(1) qcont.comment = "qcont" ucont = NDG(1) ucont.comment = "ucont" msg_out( "Calculating Q and U values for each bolometer...") invoke("$SMURF_DIR/calcqu in={0} config=\"{1}\" lsqfit=no outq={2} outu={3} " "harmonic={4} fix".format(input_data,starutil.shell_quote(config), qcont,ucont,harmonic) ) return (qcont,ucont)
def run_calcqu(input_data, config, harmonic): # The following call to SMURF:CALCQU creates two HDS container files - # one holding a set of Q NDFs and the other holding a set of U NDFs. Create # these container files in the NDG temporary directory. qcont = NDG(1) qcont.comment = "qcont" ucont = NDG(1) ucont.comment = "ucont" msg_out("Calculating Q and U values for each bolometer...") invoke( "$SMURF_DIR/calcqu in={0} config=\"{1}\" lsqfit=no outq={2} outu={3} " "harmonic={4} fix".format(input_data, starutil.shell_quote(config), qcont, ucont, harmonic)) return (qcont, ucont)
def get_filtered_skydip_data(qarray,uarray,clip,a): """ This function takes q and u array data (output from calcqu), applies ffclean to remove spikes and puts in numpy array variable It borrows (copies) heavily from pol2cat.py (2015A) Invocation: ( qdata_total,qvar_total,udata_total,uvar_total,elevation,opacity_term,bad_pixel_ref ) = ... get_filtered_skydip_data(qarray,uarray,clip,a) Arguments: qarray = An NDF of Q array data (output from calcqu). uarray = An NDF of U array data (output form calcqu). clip = The sigma cut for ffclean. a = A string indicating the array (eg. 'S8A'). Returned Value: qdata_total = A numpy array with the cleaned qarray data. qvar_total = A numpy array with the qarray variance data. udata_total = A numpy array with the cleaned uarray data. uvar_total = A numpy array with the uarray variance data. elevation = A numpy array with the elevation data opacity_term = A numpy array with the opacity brightness term (1-exp(-tau*air_mass)) Here tau is calculated using the WVM data as input. """ # Remove spikes from the Q images for the current subarray. The cleaned NDFs # are written to temporary NDFs specified by the new NDG object "qff", which # inherit its size from the existing group "qarray"". msg_out( "Removing spikes from {0} bolometer Q values...".format(a)) qff = NDG(qarray) qff.comment = "qff" invoke( "$KAPPA_DIR/ffclean in={0} out={1} genvar=yes box=3 clip=\[{2}\]".format(qarray,qff,clip) ) # Remove spikes from the U images for the current subarray. The cleaned NDFs # are written to temporary NDFs specified by the new NDG object "uff", which # inherit its size from the existing group "uarray"". msg_out( "Removing spikes from {0} bolometer U values...".format(a)) uff = NDG(uarray) uff.comment = "uff" invoke( "$KAPPA_DIR/ffclean in={0} out={1} genvar=yes box=3 clip=\[{2}\]" .format(uarray,uff,clip) ) elevation = [] opacity_term = [] for stare in range(len(qff[:])): # Stack Q data in numpy array # Get elevation information elevation.append(numpy.array( float( invoke( "$KAPPA_DIR/fitsmod ndf={0} edit=print keyword=ELSTART".format( qff[ stare ] ) ) ) ) ) # Get Tau (Opacity) information tau_temp = numpy.array( float( invoke( "$KAPPA_DIR/fitsmod ndf={0} edit=print keyword=WVMTAUST".format( qff[ stare ] ) ) ) ) # Convert to obs band. if '4' in a: tau_temp = 19.04*(tau_temp-0.018) # Eq from Dempsey et al elif '8' in a: tau_temp = 5.36*(tau_temp-0.006) # Eq from Dempsey et al. opacity_term.append(1-numpy.exp(-1*tau_temp/numpy.sin(numpy.radians(elevation[-1])))) invoke( "$KAPPA_DIR/ndftrace {0} quiet".format(qff[ stare ])) nx = get_task_par( "dims(1)", "ndftrace" ) ny = get_task_par( "dims(2)", "ndftrace" ) qdata_temp = numpy.reshape( Ndf( qff[ stare ] ).data, (ny,nx)) qdata_temp[numpy.abs(qdata_temp)>1e300] = numpy.nan; if stare == 0: qdata_total = qdata_temp else: qdata_total = numpy.dstack((qdata_total,qdata_temp)) qvar_temp = numpy.reshape( Ndf( qff[ stare ] ).var, (ny,nx)) qdata_temp[numpy.abs(qvar_temp)>1e300] = numpy.nan; if stare == 0: qvar_total = qvar_temp else: qvar_total = numpy.dstack((qvar_total,qvar_temp)) # Stack U data in numpy array invoke( "$KAPPA_DIR/ndftrace {0} quiet".format(uff[ stare ])) nx = get_task_par( "dims(1)", "ndftrace" ) ny = get_task_par( "dims(2)", "ndftrace" ) udata_temp = numpy.reshape( Ndf( uff[ stare ] ).data, (ny,nx)) udata_temp[numpy.abs(udata_temp)>1e300] = numpy.nan; if stare == 0: udata_total = udata_temp else: udata_total = numpy.dstack((udata_total,udata_temp)) uvar_temp = numpy.reshape( Ndf( uff[ stare ] ).var, (ny,nx)) udata_temp[numpy.abs(uvar_temp)>1e300] = numpy.nan; if stare == 0: uvar_total = uvar_temp else: uvar_total = numpy.dstack((uvar_total,uvar_temp)) # Create bad pixel reference. bad_pixel_ref = NDG(1) invoke( "$KAPPA_DIR/copybad in={0} ref={1} out={2}".format(qff,uff,bad_pixel_ref)) return( qdata_total,qvar_total,udata_total,uvar_total,elevation,opacity_term,bad_pixel_ref )
plot = parsys["PLOT"].value # If any vectors are to be plotted, get the SNR limit for the plotted # vectors. if plot != None: snr = parsys["SNR"].value maxlen = parsys["MAXLEN"].value # See if temp files are to be retained. retain = parsys["RETAIN"].value # The following call to SMURF:CALCQU creates two HDS container files - # one holding a set of Q NDFs and the other holding a set of U NDFs. Create # these container files in the NDG temporary directory. qcont = NDG(1) qcont.comment = "qcont" ucont = NDG(1) ucont.comment = "ucont" # Create a set of Q images and a set of U images. These are put into the HDS # container files "q_TMP.sdf" and "u_TMP.sdf". Each image contains Q or U # values derived from a short section of raw data during which each bolometer # moves less than half a pixel. msg_out( "Calculating Q and U values for each bolometer...") invoke("$SMURF_DIR/calcqu in={0} config={1} outq={2} outu={3} fix". format(indata,config,qcont,ucont) ) # Remove spikes from the Q and U images. The cleaned NDFs are written to # temporary NDFs specified by two new NDG objects "qff" and "uff", which # inherit their size from the existing groups "qcont" and "ucont". msg_out( "Removing spikes from bolometer Q and U values...")
def get_filtered_skydip_data(qarray, uarray, clip, a): """ This function takes q and u array data (output from calcqu), applies ffclean to remove spikes and puts in numpy array variable It borrows (copies) heavily from pol2cat.py (2015A) Invocation: ( qdata_total,qvar_total,udata_total,uvar_total,elevation,opacity_term,bad_pixel_ref ) = ... get_filtered_skydip_data(qarray,uarray,clip,a) Arguments: qarray = An NDF of Q array data (output from calcqu). uarray = An NDF of U array data (output form calcqu). clip = The sigma cut for ffclean. a = A string indicating the array (eg. 'S8A'). Returned Value: qdata_total = A numpy array with the cleaned qarray data. qvar_total = A numpy array with the qarray variance data. udata_total = A numpy array with the cleaned uarray data. uvar_total = A numpy array with the uarray variance data. elevation = A numpy array with the elevation data opacity_term = A numpy array with the opacity brightness term (1-exp(-tau*air_mass)) Here tau is calculated using the WVM data as input. """ # Remove spikes from the Q images for the current subarray. The cleaned NDFs # are written to temporary NDFs specified by the new NDG object "qff", which # inherit its size from the existing group "qarray"". msg_out("Removing spikes from {0} bolometer Q values...".format(a)) qff = NDG(qarray) qff.comment = "qff" invoke("$KAPPA_DIR/ffclean in={0} out={1} genvar=yes box=3 clip=\[{2}\]". format(qarray, qff, clip)) # Remove spikes from the U images for the current subarray. The cleaned NDFs # are written to temporary NDFs specified by the new NDG object "uff", which # inherit its size from the existing group "uarray"". msg_out("Removing spikes from {0} bolometer U values...".format(a)) uff = NDG(uarray) uff.comment = "uff" invoke("$KAPPA_DIR/ffclean in={0} out={1} genvar=yes box=3 clip=\[{2}\]". format(uarray, uff, clip)) elevation = [] opacity_term = [] for stare in range(len(qff[:])): # Stack Q data in numpy array # Get elevation information elevation.append( numpy.array( float( invoke( "$KAPPA_DIR/fitsmod ndf={0} edit=print keyword=ELSTART" .format(qff[stare]))))) # Get Tau (Opacity) information tau_temp = numpy.array( float( invoke( "$KAPPA_DIR/fitsmod ndf={0} edit=print keyword=WVMTAUST". format(qff[stare])))) # Convert to obs band. if '4' in a: tau_temp = 19.04 * (tau_temp - 0.018) # Eq from Dempsey et al elif '8' in a: tau_temp = 5.36 * (tau_temp - 0.006) # Eq from Dempsey et al. opacity_term.append(1 - numpy.exp(-1 * tau_temp / numpy.sin(numpy.radians(elevation[-1])))) invoke("$KAPPA_DIR/ndftrace {0} quiet".format(qff[stare])) nx = get_task_par("dims(1)", "ndftrace") ny = get_task_par("dims(2)", "ndftrace") qdata_temp = numpy.reshape(Ndf(qff[stare]).data, (ny, nx)) qdata_temp[numpy.abs(qdata_temp) > 1e300] = numpy.nan if stare == 0: qdata_total = qdata_temp else: qdata_total = numpy.dstack((qdata_total, qdata_temp)) qvar_temp = numpy.reshape(Ndf(qff[stare]).var, (ny, nx)) qdata_temp[numpy.abs(qvar_temp) > 1e300] = numpy.nan if stare == 0: qvar_total = qvar_temp else: qvar_total = numpy.dstack((qvar_total, qvar_temp)) # Stack U data in numpy array invoke("$KAPPA_DIR/ndftrace {0} quiet".format(uff[stare])) nx = get_task_par("dims(1)", "ndftrace") ny = get_task_par("dims(2)", "ndftrace") udata_temp = numpy.reshape(Ndf(uff[stare]).data, (ny, nx)) udata_temp[numpy.abs(udata_temp) > 1e300] = numpy.nan if stare == 0: udata_total = udata_temp else: udata_total = numpy.dstack((udata_total, udata_temp)) uvar_temp = numpy.reshape(Ndf(uff[stare]).var, (ny, nx)) udata_temp[numpy.abs(uvar_temp) > 1e300] = numpy.nan if stare == 0: uvar_total = uvar_temp else: uvar_total = numpy.dstack((uvar_total, uvar_temp)) # Create bad pixel reference. bad_pixel_ref = NDG(1) invoke("$KAPPA_DIR/copybad in={0} ref={1} out={2}".format( qff, uff, bad_pixel_ref)) return (qdata_total, qvar_total, udata_total, uvar_total, elevation, opacity_term, bad_pixel_ref)