def thomson(data, cube, u=.5, **kwargs): """ Defines a Thomson scattering model for white light coronographs. Parameters ---------- data: 3D InfoArray Data stack. cube: 3D FitsArray Map cube. Returns ------- P : The projector with masking D : Smoothness priors obj_mask : object mask array data_mask : data mask array """ # data mask data_mask = solar.define_data_mask(data, **kwargs) # projector pb = kwargs.get('pb', 'pb') if pb == 'pb': P = pb_thomson_lo(data, cube, u, mask=data_mask) else: raise ValueError('Only pb implemented for now.') # priors D = [lo.diff(cube.shape, axis=i) for i in xrange(cube.ndim)] # masks kwargs['remove_nan'] = True P, D, obj_mask = _apply_object_mask(P, D, cube, **kwargs) return P, D, obj_mask, data_mask
def stsrt(data, cube, **kwargs): """ Smooth Temporal Solar Rotational Tomography. Assumes data is sorted by observation time 'DATE_OBS'. Returns ------- P : The projector with masking D : Smoothness priors obj_mask : object mask array data_mask : data mask array """ # Parse kwargs. obj_rmin = kwargs.get('obj_rmin', None) obj_rmax = kwargs.get('obj_rmax', None) # mask data data_mask = solar.define_data_mask(data, **kwargs) # define temporal groups times = [solar.convert_time(h['DATE_OBS']) for h in data.header] ## if no interval is given separate every image dt_min = kwargs.get('dt_min', np.max(np.diff(times)) + 1) #groups = solar.temporal_groups(data, dt_min) ind = solar.temporal_groups_indexes(data, dt_min) n = len(ind) # define new 4D cube cube4 = cube[..., np.newaxis].repeat(n, axis=-1) cube4.header = copy.copy(cube.header) cube4.header['NAXIS'] = 4 cube4.header['NAXIS4'] = cube4.shape[3] # define 4d model # XXX assumes all groups have same number of elements ng = data.shape[-1] / n P = siddon4d_lo(data.header, cube4.header, ng=ng, mask=data_mask, obstacle="sun") # priors D = smoothness_prior(cube4, kwargs.get("height_prior", False)) # mask object if obj_rmin is not None or obj_rmax is not None: Mo, obj_mask = mask_object(cube, **kwargs) obj_mask = obj_mask[..., np.newaxis].repeat(n, axis=-1) if kwargs.get("decimate", False) or kwargs.get("remove_nan", False): Mo = lo.decimate(obj_mask) else: Mo = lo.ndmask(obj_mask) P = P * Mo.T D = [Di * Mo.T for Di in D] else: obj_mask = None return P, D, obj_mask, data_mask
def _apply_data_mask(P, data, **kwargs): # Parse kwargs. data_rmin = kwargs.get('data_rmin', None) data_rmax = kwargs.get('data_rmax', None) mask_negative = kwargs.get('mask_negative', False) mask_nan = kwargs.get('mask_nan', True) # define mask if required if (data_rmin is not None or data_rmax is not None or mask_negative is not False or mask_nan is not False): data_mask = solar.define_data_mask(data, **kwargs) Md = lo.mdmask(data_mask) # apply mask to model P = Md * P else: data_mask = None return P, data_mask
def srt(data, cube, **kwargs): """ Define Solar Rotational Tomography model with optional masking of data and map areas. Can also define priors. Parameters ---------- data: InfoArray data cube cube: FitsArray map cube obj_rmin: float Object minimal radius. Areas below obj_rmin are masked out. obj_rmax: float Object maximal radius. Areas above obj_rmax are masked out. data_rmin: float Data minimal radius. Areas below data_rmin are masked out. data_rmax: float Data maximal radius. Areas above data_rmax are masked out. mask_negative: boolean If true, negative values in the data are masked out. Returns ------- P : The projector with masking D : Smoothness priors obj_mask : object mask array data_mask : data mask array """ # Model : it is Solar rotational tomography, so obstacle="sun". data_mask = solar.define_data_mask(data, **kwargs) P = siddon_lo(data.header, cube.header, mask=data_mask, obstacle="sun") D = smoothness_prior(cube, kwargs.get("height_prior", False)) P, D, obj_mask = _apply_object_mask(P, D, cube, **kwargs) return P, D, obj_mask, data_mask