def _task_ms(task: Task) -> (str, str): try: task.resolve() _, _m = task.get_valid_key('master') if task.kind == 'cluster': _, _s = task.get_valid_key('slave') else: _s = None return _m, _s except RuntimeError as e: log.debug(str(e)) return None, None
def _bkt_info( repo: Repo, task: Task, geometry: Polygon, bucket_name: str, sort: tuple, limit: int, column: tuple, where: str, check=False, ) -> (GeoDataFrame, list): if geometry.area == 0: raise click.BadArgumentUsage('ROI has zero area') cache_file_name = _cache_pairs_file_name(repo) # TODO check ROI exists _df = pairs.load_from_cache(cache_file_name=cache_file_name, geometry=geometry) _bk = bucket.create_list(_df, buckets_dir='') if _bk is None or _bk.empty: raise AssertionError(f'No products could be found for ROI ') if bucket_name.isnumeric(): _t = _bk.groupby('bucket', as_index=False).ngroup() _df = _bk[_t == int(bucket_name)] else: _df = _bk[_bk['bucket'] == bucket_name] _f = list(column) _ds = _list_products(_df, where=where, sort=list(sort), limit=limit) _m, _s = _task_ms(task) # log.error(f"{_m} {_s}") if task.loaded: if _m or _s: def _ms(b): _x = 'm' if _m == b else ' ' _x += 's' if _s == b else ' ' return _x _ds['task'] = _ds['title'].apply(_ms) _f += ['task'] _e, eodata = task.get_valid_key('eodata') # TODO other formats parsers: Sentinel-1.ZIP ,TOPSAR def _ch_fs(b): _p = _local_eodata_relative_path(eodata, b) if os.path.isfile(os.path.join(_p, 'manifest.safe')): _m = os.path.join(_p, 'measurement') if os.path.isdir(_m): return '+' if any(os.scandir(_m)) else '~' return '' if check and not _e: _ds['exists'] = _ds['productIdentifier'].apply(_ch_fs) _f += ['exists'] pass # _ds = _ds.reindex(['task', *_f], axis=1, copy=False) # output.comment(f"Task '{_tname}' applied\n\n") headers = ['#', 'task', *_f] if _df.empty: raise OCLIException(f"bucket {bucket_name} not found") bname = _df.iloc[0]['bucket'] _ds = _ds[_f] # remove injected title if not in columns return bname, _ds, _ds.columns.to_list()
def bkt_info( repo: Repo, task: Task, roi_id, less, # sort, limit, column, where, check, delta, product_id, platform): """ find pairs by given PRODUCT_ID \b PRODUCT_ID: 4-digits hex number (Sentinel product identifier, last 4 symbols in product name). PLATFORM: like 'S1A' or 'S1B' to narrow search in case PRODUCT_ID is ambiguous """ _id, _roi = resolve_roi(roi_id, repo) _m, _s = _task_ms(task) geometry = _roi['geometry'] output.comment(f"active task master: {_m}") _df = pairs.load_from_cache(cache_file_name=(_cache_pairs_file_name(repo))) _df = _df.set_index('productId') try: _ds = _df.loc[product_id][['startDate', 'platform']] # print( _ds) if isinstance(_ds, DataFrame): # print(f"-----{len(_ds)}--------{type(_ds)}----------") if platform != '': _ds = _ds[_ds['platform'] == platform].loc[product_id] if isinstance(_ds, DataFrame): raise OCLIException( f"Could not resolve '{product_id}' for platform {platform}" ) else: output.table(_ds, headers=['PRODUCT_ID', 'startDate', 'platform']) # print( _ds) raise OCLIException( f"Product ID {product_id} is ambiguous, use <PALTFORM> argument to narrow search " ) ts, platform = _ds[['startDate', 'platform']] # print(f"----------- {ts}") except KeyError: raise OCLIException(f'Product id "{product_id}" not found') output.comment( f"Building bucket for product {product_id} , startDate={ts}") f = unitime_delta_factory(ts) _df['cycle_dt'] = _df['startDate'].apply(f) _df = _df[(_df['cycle_dt'] <= delta) & (_df['platform'] == platform)] cols = [ 'productId', 'cycle_dt', 'startDate', 'platform', 'relativeOrbitNumber', 'polarisation', 'fit', 'task' ] try: if geometry.area == 0: raise AssertionError('ROI has zero area') _df['fit'] = _df['geometry'].intersection( geometry).area / geometry.area _df['task'] = '' _df = _df.reset_index() _df = _df.set_index('title') if _m in _df.index: _df.loc[_m, 'task'] = 'm' else: output.warning('Current task master not found in bucket') if _s in _df.index: _df.loc[_s, 'task'] = 's' else: output.warning('Current task slave not found in bucket') _df = _df.reset_index() _e, eodata = task.get_valid_key('eodata') def _ch_fs(b): _p = _local_eodata_relative_path(eodata, b) if os.path.isfile(os.path.join(_p, 'manifest.safe')): _m = os.path.join(_p, 'measurement') if os.path.isdir(_m): return '+' if any(os.scandir(_m)) else '~' return '' if check and not _e: _df['exists'] = _df['productIdentifier'].apply(_ch_fs) cols += ['exists'] pass _df = _df[cols] except AssertionError as e: raise RuntimeError(e) headers = ['#'] + cols output.table( _df, headers=headers, )