def _aw_imager(self, prepare_phase_output, major_cycle, sky_path, skip=False): """ Create an image based on the calibrated, filtered and combined data. """ # Create parset for the awimage recipe parset = self.parset.makeSubset("AWimager.") # Get maxbaseline from 'full' parset max_baseline = self.parset.getInt("Imaging.maxbaseline") patch_dictionary = {"maxbaseline": str(max_baseline)} try: temp_parset_filename = patch_parset(parset, patch_dictionary) aw_image_parset = get_parset(temp_parset_filename) aw_image_parset_path = self._write_parset_to_file( aw_image_parset, "awimager_cycle_{0}".format(major_cycle), "Awimager recipe parset") finally: # remove tempfile os.remove(temp_parset_filename) # Create path to write the awimage files intermediate_image_path = os.path.join( self.scratch_directory, "awimage_cycle_{0}".format(major_cycle), "image") output_mapfile = self._write_datamap_to_file( None, "awimager", "output map for awimager recipe") mask_patch_size = self.parset.getInt("Imaging.mask_patch_size") auto_imaging_specs = self.parset.getBool("Imaging.auto_imaging_specs") fov = self.parset.getFloat("Imaging.fov") specify_fov = self.parset.getBool("Imaging.specify_fov") if skip: pass else: # run the awimager recipe self.run_task("imager_awimager", prepare_phase_output, parset=aw_image_parset_path, mapfile=output_mapfile, output_image=intermediate_image_path, mask_patch_size=mask_patch_size, sourcedb_path=sky_path, working_directory=self.scratch_directory, autogenerate_parameters=auto_imaging_specs, specify_fov=specify_fov, fov=fov) return output_mapfile, max_baseline
def _aw_imager(self, prepare_phase_output, major_cycle, sky_path, skip = False): """ Create an image based on the calibrated, filtered and combined data. """ # Create parset for the awimage recipe parset = self.parset.makeSubset("AWimager.") # Get maxbaseline from 'full' parset max_baseline = self.parset.getInt("Imaging.maxbaseline") patch_dictionary = {"maxbaseline": str( max_baseline)} try: temp_parset_filename = patch_parset(parset, patch_dictionary) aw_image_parset = get_parset(temp_parset_filename) aw_image_parset_path = self._write_parset_to_file(aw_image_parset, "awimager_cycle_{0}".format(major_cycle), "Awimager recipe parset") finally: # remove tempfile os.remove(temp_parset_filename) # Create path to write the awimage files intermediate_image_path = os.path.join(self.scratch_directory, "awimage_cycle_{0}".format(major_cycle), "image") output_mapfile = self._write_datamap_to_file(None, "awimager", "output map for awimager recipe") mask_patch_size = self.parset.getInt("Imaging.mask_patch_size") autogenerate_parameters = self.parset.getBool( "Imaging.auto_imaging_specs") specify_fov = self.parset.getBool( "Imaging.specify_fov") if skip: pass else: # run the awimager recipe self.run_task("imager_awimager", prepare_phase_output, parset = aw_image_parset_path, mapfile = output_mapfile, output_image = intermediate_image_path, mask_patch_size = mask_patch_size, sourcedb_path = sky_path, working_directory = self.scratch_directory, autogenerate_parameters = autogenerate_parameters, specify_fov = specify_fov) return output_mapfile, max_baseline
def run(self, executable, environment, parset, working_directory, output_image, concatenated_measurement_set, sourcedb_path, mask_patch_size, autogenerate_parameters, specify_fov, fov): """ :param executable: Path to awimager executable :param environment: environment for catch_segfaults (executable runner) :param parset: parameters for the awimager, :param working_directory: directory the place temporary files :param output_image: location and filesname to story the output images the multiple images are appended with type extentions :param concatenated_measurement_set: Input measurement set :param sourcedb_path: Path the the sourcedb used to create the image mask :param mask_patch_size: Scaling of the patch around the source in the mask :param autogenerate_parameters: Turns on the autogeneration of: cellsize, npix, wprojplanes, wmax, fov :param fov: if autogenerate_parameters is false calculate imageparameter (cellsize, npix, wprojplanes, wmax) relative to this fov :rtype: self.outputs["image"] The path to the output image """ self.logger.info("Start imager_awimager node run:") log4_cplus_name = "imager_awimager" self.environment.update(environment) with log_time(self.logger): # Read the parameters as specified in the parset parset_object = get_parset(parset) # ************************************************************* # 1. Calculate awimager parameters that depend on measurement set # and the parset cell_size, npix, w_max, w_proj_planes = \ self._get_imaging_parameters( concatenated_measurement_set, parset, autogenerate_parameters, specify_fov, fov) self.logger.info("Using autogenerated parameters; ") self.logger.info( "Calculated parameters: cell_size: {0}, npix: {1}".format( cell_size, npix)) self.logger.info("w_max: {0}, w_proj_planes: {1} ".format( w_max, w_proj_planes)) # **************************************************************** # 2. Get the target image location from the mapfile for the parset. # Create target dir if it not exists image_path_head = os.path.dirname(output_image) create_directory(image_path_head) self.logger.debug("Created directory to place awimager output" " files: {0}".format(image_path_head)) # **************************************************************** # 3. Create the mask mask_file_path = self._create_mask(npix, cell_size, output_image, concatenated_measurement_set, executable, working_directory, log4_cplus_name, sourcedb_path, mask_patch_size, image_path_head) # ***************************************************************** # 4. Update the parset with calculated parameters, and output image patch_dictionary = {'uselogger': 'True', # enables log4cpluscd log 'ms': str(concatenated_measurement_set), 'cellsize': str(cell_size), 'npix': str(npix), 'wmax': str(w_max), 'wprojplanes': str(w_proj_planes), 'image': str(output_image), 'maxsupport': str(npix), # 'mask':str(mask_file_path), #TODO REINTRODUCE # MASK, excluded to speed up in this debug stage } # save the parset at the target dir for the image calculated_parset_path = os.path.join(image_path_head, "parset.par") try: temp_parset_filename = patch_parset(parset, patch_dictionary) # Copy tmp file to the final location shutil.copyfile(temp_parset_filename, calculated_parset_path) self.logger.debug("Wrote parset for awimager run: {0}".format( calculated_parset_path)) finally: # remove temp file os.remove(temp_parset_filename) # ***************************************************************** # 5. Run the awimager with the updated parameterset cmd = [executable, calculated_parset_path] try: with CatchLog4CPlus(working_directory, self.logger.name + "." + os.path.basename(log4_cplus_name), os.path.basename(executable) ) as logger: catch_segfaults(cmd, working_directory, self.environment, logger) # Thrown by catch_segfault except CalledProcessError, exception: self.logger.error(str(exception)) return 1 except Exception, exception: self.logger.error(str(exception)) return 1
def _get_imaging_parameters(self, measurement_set, parset, autogenerate_parameters, specify_fov, fov): """ (1) calculate and format some parameters that are determined runtime. Based on values in the measurementset and input parameter (set): a. <string> The cellsize b. <int> The npixels in a each of the two dimension of the image c. <string> The largest baseline in the ms smaller then the maxbaseline d. <string> The number of projection planes The calculation of these parameters is done in three steps: 1. Calculate intermediate results based on the ms. 2. The calculation of the actual target values using intermediate result """ # ********************************************************************* # 1. Get partial solutions from the parameter set # Get the parset and a number of raw parameters from this parset parset_object = get_parset(parset) baseline_limit = parset_object.getInt('maxbaseline') # Get the longest baseline max_baseline = pt.taql( 'CALC sqrt(max([select sumsqr(UVW[:2]) from ' + \ '{0} where sumsqr(UVW[:2]) <{1} giving as memory]))'.format(\ measurement_set, baseline_limit * baseline_limit))[0] # ask ger van diepen for details if ness. # Calculate the wave_length table_ms = pt.table(measurement_set) table_spectral_window = pt.table( table_ms.getkeyword("SPECTRAL_WINDOW")) freq = table_spectral_window.getcell("REF_FREQUENCY", 0) table_spectral_window.close() wave_length = pt.taql('CALC C()') / freq wave_length = wave_length[0] # Calculate the cell_size from the ms arc_sec_in_degree = 3600 arc_sec_in_rad = (180.0 / math.pi) * arc_sec_in_degree cell_size = (1.0 / 3) * (wave_length / float(max_baseline))\ * arc_sec_in_rad # Calculate the number of pixels in x and y dim # fov and diameter depending on the antenna name fov_from_ms, station_diameter = self._get_fov_and_station_diameter( measurement_set) # use fov for to calculate a semi 'user' specified npix and cellsize # The npix thus depends on the ms cellsize and fov # Do not use use supplied Fov if autogenerating if not autogenerate_parameters and specify_fov: if fov == 0.0: raise PipelineException("fov set to 0.0: invalid value.") # else use full resolution (calculate the fov) else: self.logger.info("Using fov calculated on measurement data: " + str(fov_from_ms)) fov = fov_from_ms # ******************************************************************** # 2. Calculate the ms based output variables # 'optimal' npix based on measurement set calculations or user specified npix = (arc_sec_in_degree * fov) / cell_size # Get the closest power of two larger then the calculated pixel size npix = self._nearest_ceiled_power2(npix) # Get the max w with baseline < 10000 w_max = pt.taql('CALC max([select UVW[2] from ' + \ '{0} where sumsqr(UVW[:2]) <{1} giving as memory])'.format( measurement_set, baseline_limit * baseline_limit))[0] # Calculate number of projection planes w_proj_planes = min(257, math.floor((max_baseline * wave_length) / (station_diameter ** 2))) w_proj_planes = int(round(w_proj_planes)) # MAximum number of proj planes set to 1024: George Heald, Ger van # Diepen if this exception occurs maxsupport = max(1024, npix) if w_proj_planes > maxsupport: raise Exception("The number of projections planes for the current" + "measurement set is to large.") # ********************************************************************* # 3. if the npix from the parset is different to the ms calculations, # calculate a sizeconverter value (to be applied to the cellsize) if npix < 256: self.logger.warn("Using a image size smaller then 256x256:" " This leads to problematic imaging in some instances!!") cell_size_formatted = str( int(round(cell_size))) + 'arcsec' self.logger.info("Using the following dynamic generated awimager parameters:" " cell_size: {0}, npix: {1},".format( cell_size_formatted, npix) + " w_max: {0}, w_proj_planes: {1}".format(w_max, w_proj_planes)) # If we are not autocalculating based on ms or fov, use the npix # and cell_size specified in the parset # keep the wmax and w_proj_planes if (not autogenerate_parameters and not specify_fov): npix = parset_object.getString('npix') cell_size = parset_object.getString('cellsize') return cell_size_formatted, str(npix), str(w_max), str(w_proj_planes)
def run(self, executable, environment, parset, working_directory, output_image, concatenated_measurement_set, sourcedb_path, mask_patch_size, autogenerate_parameters, specify_fov, fov, major_cycle, nr_cycles, perform_self_cal): """ :param executable: Path to awimager executable :param environment: environment for catch_segfaults (executable runner) :param parset: parameters for the awimager, :param working_directory: directory the place temporary files :param output_image: location and filesname to story the output images the multiple images are appended with type extentions :param concatenated_measurement_set: Input measurement set :param sourcedb_path: Path the the sourcedb used to create the image mask :param mask_patch_size: Scaling of the patch around the source in the mask :param autogenerate_parameters: Turns on the autogeneration of: cellsize, npix, wprojplanes, wmax, fov :param fov: if autogenerate_parameters is false calculate imageparameter (cellsize, npix, wprojplanes, wmax) relative to this fov :param major_cycle: number of the self calibration cycle to determine the imaging parameters: cellsize, npix, wprojplanes, wmax, fov :param nr_cycles: The requested number of self cal cycles :param perform_self_cal: Bool used to control the selfcal functionality or the old semi-automatic functionality :rtype: self.outputs["image"] The path to the output image """ self.logger.info("Start selfcal_awimager node run:") log4_cplus_name = "selfcal_awimager" self.environment.update(environment) with log_time(self.logger): # Read the parameters as specified in the parset parset_object = get_parset(parset) # ************************************************************* # 1. Calculate awimager parameters that depend on measurement set # and the parset if perform_self_cal: # Calculate awimager parameters that depend on measurement set # and the parset self.logger.info( "Calculating selfcalibration parameters ") cell_size, npix, w_max, w_proj_planes, \ UVmin, UVmax, robust, threshold =\ self._get_selfcal_parameters( concatenated_measurement_set, parset, major_cycle, nr_cycles) self._save_selfcal_info(concatenated_measurement_set, major_cycle, npix, UVmin, UVmax) else: self.logger.info( "Calculating parameters.. ( NOT selfcalibration)") cell_size, npix, w_max, w_proj_planes = \ self._get_imaging_parameters( concatenated_measurement_set, parset, autogenerate_parameters, specify_fov, fov) self.logger.info("Using autogenerated parameters; ") self.logger.info( "Calculated parameters: cell_size: {0}, npix: {1}".format( cell_size, npix)) self.logger.info("w_max: {0}, w_proj_planes: {1} ".format( w_max, w_proj_planes)) # **************************************************************** # 2. Get the target image location from the mapfile for the parset. # Create target dir if it not exists image_path_head = os.path.dirname(output_image) create_directory(image_path_head) self.logger.debug("Created directory to place awimager output" " files: {0}".format(image_path_head)) # **************************************************************** # 3. Create the mask #mask_file_path = self._create_mask(npix, cell_size, output_image, # concatenated_measurement_set, executable, # working_directory, log4_cplus_name, sourcedb_path, # mask_patch_size, image_path_head) # ***************************************************************** # 4. Update the parset with calculated parameters, and output image patch_dictionary = {'uselogger': 'True', # enables log4cpluscd log 'ms': str(concatenated_measurement_set), 'cellsize': str(cell_size), 'npix': str(npix), 'wmax': str(w_max), 'wprojplanes': str(w_proj_planes), 'image': str(output_image), 'maxsupport': str(npix) # 'mask':str(mask_file_path), #TODO REINTRODUCE # MASK, excluded to speed up in this debug stage } # Add some aditional keys from the self calibration method if perform_self_cal: self_cal_patch_dict = { 'weight': 'briggs', 'padding': str(1.18), 'niter' : str(1000000), 'operation' : 'mfclark', 'timewindow' : '300', 'fits' : '', 'threshold' : str(threshold), 'robust' : str(robust), 'UVmin' : str(UVmin), 'UVmax' : str(UVmax), 'maxbaseline' : str(10000000), 'select' : str("sumsqr(UVW[:2])<1e12"), } patch_dictionary.update(self_cal_patch_dict) # save the parset at the target dir for the image calculated_parset_path = os.path.join(image_path_head, "parset.par") try: temp_parset_filename = patch_parset(parset, patch_dictionary) # Copy tmp file to the final location shutil.copyfile(temp_parset_filename, calculated_parset_path) self.logger.debug("Wrote parset for awimager run: {0}".format( calculated_parset_path)) finally: # remove temp file os.remove(temp_parset_filename) # ***************************************************************** # 5. Run the awimager with the parameterset cmd = [executable, calculated_parset_path] self.logger.debug("Parset used for awimager run:") self.logger.debug(cmd) try: with CatchLog4CPlus(working_directory, self.logger.name + "." + os.path.basename(log4_cplus_name), os.path.basename(executable) ) as logger: catch_segfaults(cmd, working_directory, self.environment, logger, usageStats=self.resourceMonitor) # Thrown by catch_segfault except CalledProcessError as exception: self.logger.error(str(exception)) return 1 except Exception as exception: self.logger.error(str(exception)) return 1 # ********************************************************************* # 6. Return output # Append static .restored: This might change but prob. not # The actual output image has this extention always, default of # awimager self.outputs["image"] = output_image + ".restored" return 0
def _get_imaging_parameters(self, measurement_set, parset, autogenerate_parameters, specify_fov, fov): """ (1) calculate and format some parameters that are determined runtime. Based on values in the measurementset and input parameter (set): a. <string> The cellsize b. <int> The npixels in a each of the two dimension of the image c. <string> The largest baseline in the ms smaller then the maxbaseline d. <string> The number of projection planes The calculation of these parameters is done in three steps: 1. Calculate intermediate results based on the ms. 2. The calculation of the actual target values using intermediate result """ # ********************************************************************* # 1. Get partial solutions from the parameter set # Get the parset and a number of raw parameters from this parset parset_object = get_parset(parset) baseline_limit = parset_object.getInt('maxbaseline') # Get the longest baseline max_baseline = pt.taql( 'CALC sqrt(max([select sumsqr(UVW[:2]) from ' + \ '{0} where sumsqr(UVW[:2]) <{1} giving as memory]))'.format(\ measurement_set, baseline_limit * baseline_limit))[0] # ask ger van diepen for details if ness. # Calculate the wave_length table_ms = pt.table(measurement_set) table_spectral_window = pt.table( table_ms.getkeyword("SPECTRAL_WINDOW")) freq = table_spectral_window.getcell("REF_FREQUENCY", 0) table_spectral_window.close() wave_length = pt.taql('CALC C()') / freq wave_length = wave_length[0] # Calculate the cell_size from the ms arc_sec_in_degree = 3600 arc_sec_in_rad = (180.0 / math.pi) * arc_sec_in_degree cell_size = (1.0 / 3) * (wave_length / float(max_baseline))\ * arc_sec_in_rad # Calculate the number of pixels in x and y dim # fov and diameter depending on the antenna name fov_from_ms, station_diameter = self._get_fov_and_station_diameter( measurement_set) # use fov for to calculate a semi 'user' specified npix and cellsize # The npix thus depends on the ms cellsize and fov # Do not use use supplied Fov if autogenerating if not autogenerate_parameters and specify_fov: if fov == 0.0: raise PipelineException("fov set to 0.0: invalid value.") # else use full resolution (calculate the fov) else: self.logger.info("Using fov calculated on measurement data: " + str(fov_from_ms)) fov = fov_from_ms # ******************************************************************** # 2. Calculate the ms based output variables # 'optimal' npix based on measurement set calculations or user specified npix = (arc_sec_in_degree * fov) / cell_size # Get the closest power of two larger then the calculated pixel size npix = self._nearest_ceiled_power2(npix) # Get the max w with baseline < 10000 w_max = pt.taql('CALC max([select UVW[2] from ' + \ '{0} where sumsqr(UVW[:2]) <{1} giving as memory])'.format( measurement_set, baseline_limit * baseline_limit))[0] # Calculate number of projection planes w_proj_planes = min(257, math.floor((max_baseline * wave_length) / (station_diameter ** 2))) w_proj_planes = int(round(w_proj_planes)) # MAximum number of proj planes set to 1024: George Heald, Ger van # Diepen if this exception occurs maxsupport = max(1024, npix) if w_proj_planes > maxsupport: raise Exception("The number of projections planes for the current" + "measurement set is to large.") # ********************************************************************* # 3. if the npix from the parset is different to the ms calculations, # calculate a sizeconverter value (to be applied to the cellsize) if npix < 256: self.logger.warn("Using a image size smaller then 256x256:" " This leads to problematic imaging in some instances!!") # If we are not autocalculating based on ms or fov, use the npix # and cell_size specified in the parset # keep the wmax and w_proj_planes if (not autogenerate_parameters and not specify_fov): npix = parset_object.getString('npix') cell_size_formatted = parset_object.getString('cellsize') else: cell_size_formatted = str( int(round(cell_size))) + 'arcsec' self.logger.info("Using the following awimager parameters:" " cell_size: {0}, npix: {1},".format( cell_size_formatted, npix) + " w_max: {0}, w_proj_planes: {1}".format(w_max, w_proj_planes)) return cell_size_formatted, str(npix), str(w_max), str(w_proj_planes)
def run(self, executable, environment, parset, working_directory, output_image, concatenated_measurement_set, sourcedb_path, mask_patch_size, autogenerate_parameters, specify_fov, fov, major_cycle, nr_cycles, perform_self_cal): """ :param executable: Path to awimager executable :param environment: environment for catch_segfaults (executable runner) :param parset: parameters for the awimager, :param working_directory: directory the place temporary files :param output_image: location and filesname to story the output images the multiple images are appended with type extentions :param concatenated_measurement_set: Input measurement set :param sourcedb_path: Path the the sourcedb used to create the image mask :param mask_patch_size: Scaling of the patch around the source in the mask :param autogenerate_parameters: Turns on the autogeneration of: cellsize, npix, wprojplanes, wmax, fov :param fov: if autogenerate_parameters is false calculate imageparameter (cellsize, npix, wprojplanes, wmax) relative to this fov :param major_cycle: number of the self calibration cycle to determine the imaging parameters: cellsize, npix, wprojplanes, wmax, fov :param nr_cycles: The requested number of self cal cycles :param perform_self_cal: Bool used to control the selfcal functionality or the old semi-automatic functionality :rtype: self.outputs["image"] The path to the output image """ self.logger.info("Start selfcal_awimager node run:") log4_cplus_name = "selfcal_awimager" self.environment.update(environment) with log_time(self.logger): # Read the parameters as specified in the parset parset_object = get_parset(parset) # ************************************************************* # 1. Calculate awimager parameters that depend on measurement set # and the parset if perform_self_cal: # Calculate awimager parameters that depend on measurement set # and the parset self.logger.info( "Calculating selfcalibration parameters ") cell_size, npix, w_max, w_proj_planes, \ UVmin, UVmax, robust, threshold =\ self._get_selfcal_parameters( concatenated_measurement_set, parset, major_cycle, nr_cycles) self._save_selfcal_info(concatenated_measurement_set, major_cycle, npix, UVmin, UVmax) else: self.logger.info( "Calculating parameters.. ( NOT selfcalibration)") cell_size, npix, w_max, w_proj_planes = \ self._get_imaging_parameters( concatenated_measurement_set, parset, autogenerate_parameters, specify_fov, fov) self.logger.info("Using autogenerated parameters; ") self.logger.info( "Calculated parameters: cell_size: {0}, npix: {1}".format( cell_size, npix)) self.logger.info("w_max: {0}, w_proj_planes: {1} ".format( w_max, w_proj_planes)) # **************************************************************** # 2. Get the target image location from the mapfile for the parset. # Create target dir if it not exists image_path_head = os.path.dirname(output_image) create_directory(image_path_head) self.logger.debug("Created directory to place awimager output" " files: {0}".format(image_path_head)) # **************************************************************** # 3. Create the mask #mask_file_path = self._create_mask(npix, cell_size, output_image, # concatenated_measurement_set, executable, # working_directory, log4_cplus_name, sourcedb_path, # mask_patch_size, image_path_head) # ***************************************************************** # 4. Update the parset with calculated parameters, and output image patch_dictionary = {'uselogger': 'True', # enables log4cpluscd log 'ms': str(concatenated_measurement_set), 'cellsize': str(cell_size), 'npix': str(npix), 'wmax': str(w_max), 'wprojplanes': str(w_proj_planes), 'image': str(output_image), 'maxsupport': str(npix) # 'mask':str(mask_file_path), #TODO REINTRODUCE # MASK, excluded to speed up in this debug stage } # Add some aditional keys from the self calibration method if perform_self_cal: self_cal_patch_dict = { 'weight': 'briggs', 'padding': str(1.18), 'niter' : str(1000000), 'operation' : 'mfclark', 'timewindow' : '300', 'fits' : '', 'threshold' : str(threshold), 'robust' : str(robust), 'UVmin' : str(UVmin), 'UVmax' : str(UVmax), 'maxbaseline' : str(10000000), 'select' : str("sumsqr(UVW[:2])<1e12"), } patch_dictionary.update(self_cal_patch_dict) # save the parset at the target dir for the image calculated_parset_path = os.path.join(image_path_head, "parset.par") try: temp_parset_filename = patch_parset(parset, patch_dictionary) # Copy tmp file to the final location shutil.copyfile(temp_parset_filename, calculated_parset_path) self.logger.debug("Wrote parset for awimager run: {0}".format( calculated_parset_path)) finally: # remove temp file os.remove(temp_parset_filename) # ***************************************************************** # 5. Run the awimager with the parameterset cmd = [executable, calculated_parset_path] self.logger.debug("Parset used for awimager run:") self.logger.debug(cmd) try: with CatchLog4CPlus(working_directory, self.logger.name + "." + os.path.basename(log4_cplus_name), os.path.basename(executable) ) as logger: catch_segfaults(cmd, working_directory, self.environment, logger, usageStats=self.resourceMonitor) # Thrown by catch_segfault except CalledProcessError, exception: self.logger.error(str(exception)) return 1 except Exception, exception: self.logger.error(str(exception)) return 1
def run(self, executable, environment, parset, working_directory, output_image, concatenated_measurement_set, sourcedb_path, mask_patch_size, autogenerate_parameters, specify_fov, fov): """ :param executable: Path to awimager executable :param environment: environment for catch_segfaults (executable runner) :param parset: parameters for the awimager, :param working_directory: directory the place temporary files :param output_image: location and filesname to story the output images the multiple images are appended with type extentions :param concatenated_measurement_set: Input measurement set :param sourcedb_path: Path the the sourcedb used to create the image mask :param mask_patch_size: Scaling of the patch around the source in the mask :param autogenerate_parameters: Turns on the autogeneration of: cellsize, npix, wprojplanes, wmax, fov :param fov: if autogenerate_parameters is false calculate imageparameter (cellsize, npix, wprojplanes, wmax) relative to this fov :rtype: self.outputs["image"] The path to the output image """ self.logger.info("Start imager_awimager node run:") log4_cplus_name = "imager_awimager" self.environment.update(environment) with log_time(self.logger): # Read the parameters as specified in the parset parset_object = get_parset(parset) #****************************************************************** # 0. Create the directories used in this recipe create_directory(working_directory) # ************************************************************* # 1. Calculate awimager parameters that depend on measurement set # and the parset cell_size, npix, w_max, w_proj_planes = \ self._get_imaging_parameters( concatenated_measurement_set, parset, autogenerate_parameters, specify_fov, fov) self.logger.info("Using autogenerated parameters; ") self.logger.info( "Calculated parameters: cell_size: {0}, npix: {1}".format( cell_size, npix)) self.logger.info("w_max: {0}, w_proj_planes: {1} ".format( w_max, w_proj_planes)) # **************************************************************** # 2. Get the target image location from the mapfile for the parset. # Create target dir if it not exists image_path_head = os.path.dirname(output_image) create_directory(image_path_head) self.logger.debug("Created directory to place awimager output" " files: {0}".format(image_path_head)) # **************************************************************** # 3. Create the mask mask_file_path = self._create_mask(npix, cell_size, output_image, concatenated_measurement_set, executable, working_directory, log4_cplus_name, sourcedb_path, mask_patch_size, image_path_head) # ***************************************************************** # 4. Update the parset with calculated parameters, and output image patch_dictionary = { 'uselogger': 'True', # enables log4cpluscd log 'ms': str(concatenated_measurement_set), 'cellsize': str(cell_size), 'npix': str(npix), 'wmax': str(w_max), 'wprojplanes': str(w_proj_planes), 'image': str(output_image), 'maxsupport': str(npix), # 'mask':str(mask_file_path), #TODO REINTRODUCE # MASK, excluded to speed up in this debug stage } # save the parset at the target dir for the image calculated_parset_path = os.path.join(image_path_head, "parset.par") try: temp_parset_filename = patch_parset(parset, patch_dictionary) # Copy tmp file to the final location shutil.copyfile(temp_parset_filename, calculated_parset_path) self.logger.debug("Wrote parset for awimager run: {0}".format( calculated_parset_path)) finally: # remove temp file os.remove(temp_parset_filename) # ***************************************************************** # 5. Run the awimager with the updated parameterset cmd = [executable, calculated_parset_path] try: with CatchLog4CPlus( working_directory, self.logger.name + "." + os.path.basename(log4_cplus_name), os.path.basename(executable)) as logger: catch_segfaults(cmd, working_directory, self.environment, logger, usageStats=self.resourceMonitor) # Thrown by catch_segfault except CalledProcessError, exception: self.logger.error(str(exception)) return 1 except Exception, exception: self.logger.error(str(exception)) return 1