1212import xarray as xr
1313
1414from .conf import (
15+ META_ARRAY_KEYS ,
1516 META_FLOAT_KEYS ,
1617 META_INT_KEYS ,
1718 RE_PATTERNS_DORIS4 ,
@@ -360,7 +361,7 @@ def read_metadata(
360361 # if a key does not exists, a list will be created
361362 metadata = defaultdict (list )
362363 for file in files :
363- res = _parse_metadata (file , driver )
364+ res = _parse_metadata (file , driver , ifg_file_name )
364365 for key , value in res .items ():
365366 metadata [key ].append (value )
366367
@@ -370,7 +371,7 @@ def read_metadata(
370371 return metadata
371372
372373
373- def _parse_metadata (file , driver , ifg_file_name = "ifgs.res" ):
374+ def _parse_metadata (file , driver , ifg_file_name ):
374375 """Parse a single metadata file to a dictionary of strings."""
375376 # Select the appropriate patterns based on the driver
376377 if driver == "doris5" :
@@ -379,6 +380,11 @@ def _parse_metadata(file, driver, ifg_file_name="ifgs.res"):
379380 elif driver == "doris4" :
380381 patterns = RE_PATTERNS_DORIS4
381382 patterns_ifg = None
383+ else :
384+ raise NotImplementedError (
385+ f"Driver '{ driver } ' is not implemented. "
386+ "Supported drivers are: 'doris4', 'doris5'."
387+ )
382388
383389 # Open the file
384390 with open (file ) as f :
@@ -387,11 +393,18 @@ def _parse_metadata(file, driver, ifg_file_name="ifgs.res"):
387393 # Read common metadata patterns
388394 results = {}
389395 for key , pattern in patterns .items ():
390- match = re .search (pattern , content )
391- if match :
392- results [key ] = match .group (1 )
396+ if key in META_ARRAY_KEYS .keys (): # multiple hits allowed
397+ matches = re .findall (pattern , content )
398+ if matches :
399+ results [key ] = matches
400+ else :
401+ results [key ] = None
393402 else :
394- results [key ] = None
403+ match = re .search (pattern , content )
404+ if match :
405+ results [key ] = match .group (1 )
406+ else :
407+ results [key ] = None
395408
396409 # Doris5 has size information in ifgs.res file
397410 # Try to get the ifg size from ifgs.res next to slave.res, if it exists
@@ -400,12 +413,19 @@ def _parse_metadata(file, driver, ifg_file_name="ifgs.res"):
400413 if file_ifg .exists ():
401414 with open (file_ifg ) as f_ifg :
402415 content_ifg = f_ifg .read ()
403- for key , pattern in RE_PATTERNS_DORIS5_IFG .items ():
404- match = re .search (pattern , content_ifg )
405- if match :
406- results [key ] = match .group (1 )
407- else :
408- results [key ] = None
416+ for key , pattern in RE_PATTERNS_DORIS5_IFG .items ():
417+ if key in META_ARRAY_KEYS .keys (): # multiple hits allowed
418+ matches = re .findall (pattern , content_ifg )
419+ if matches :
420+ results [key ] = matches
421+ else :
422+ results [key ] = None
423+ else :
424+ match = re .search (pattern , content_ifg )
425+ if match :
426+ results [key ] = match .group (1 )
427+ else :
428+ results [key ] = None
409429
410430 return results
411431
@@ -446,34 +466,51 @@ def _regulate_metadata(metadata, driver):
446466 "Different types are found in the value list."
447467 )
448468
449- # Only keep the unique values
450- if isinstance (metadata [key ], list ):
451- metadata [key ] = set (value )
469+ if key in META_ARRAY_KEYS .keys (): # need to regulate this one separately
470+ regulated_arrays = []
471+ for arr in metadata [key ]:
472+ regulated_array = np .zeros ((len (arr ), len (arr [0 ])))
473+ for row in range (len (arr )):
474+ for col in range (len (arr [row ])):
475+ regulated_array [row , col ] = META_ARRAY_KEYS [key ](arr [row ][col ])
476+ regulated_arrays .append (np .copy (regulated_array ))
452477
453- # Unfold the single value set to strings
454- if len (metadata [key ]) == 1 :
455- metadata [key ] = next (iter (metadata [key ]))
478+ metadata [key ] = [
479+ np .copy (regulated_array ) for regulated_array in regulated_arrays
480+ ]
481+ if len (metadata [key ]) == 1 :
482+ metadata [key ] = metadata [key ][0 ]
456483
457- # if float, take the average unless std is larger than 1% of the mean
458- if key in META_FLOAT_KEYS :
459- # Convert to float
460- arr = np .array (value , dtype = np .float64 )
461- if np .std (arr ) / np .mean (arr ) < 0.01 :
462- metadata [key ] = np .mean (arr ).item () # Convert to scalar
463- else :
464- raise ValueError (
465- f"Inconsistency found in metadata key: { key } . "
466- "Standard deviation is larger than 1% of the mean."
467- )
468- if key in META_INT_KEYS :
469- if isinstance (metadata [key ], str ):
470- metadata [key ] = int (metadata [key ])
471- elif len (metadata [key ]) > 1 : # set with multiple values
472- metadata [key ] = set ([int (v ) for v in metadata [key ]])
473-
474- if key in ["number_of_lines" , "number_of_pixels" ]:
475- if isinstance (metadata [key ], set ):
476- warning_msg = f"Multiple values found in { key } : { metadata [key ]} ."
477- logger .warning (warning_msg )
484+
485+ else :
486+ # Only keep the unique values
487+ if isinstance (metadata [key ], list ):
488+ metadata [key ] = set (value )
489+
490+ # Unfold the single value set to strings
491+ if len (metadata [key ]) == 1 :
492+ metadata [key ] = next (iter (metadata [key ]))
493+
494+ # if float, take the average unless std is larger than 1% of the mean
495+ if key in META_FLOAT_KEYS :
496+ # Convert to float
497+ arr = np .array (value , dtype = np .float64 )
498+ if np .std (arr ) / np .mean (arr ) < 0.01 :
499+ metadata [key ] = np .mean (arr ).item () # Convert to scalar
500+ else :
501+ raise ValueError (
502+ f"Inconsistency found in metadata key: { key } . "
503+ "Standard deviation is larger than 1% of the mean."
504+ )
505+ if key in META_INT_KEYS :
506+ if isinstance (metadata [key ], str ):
507+ metadata [key ] = int (metadata [key ])
508+ elif len (metadata [key ]) > 1 : # set with multiple values
509+ metadata [key ] = set ([int (v ) for v in metadata [key ]])
510+
511+ if key in ["number_of_lines" , "number_of_pixels" ]:
512+ if isinstance (metadata [key ], set ):
513+ warning_msg = f"Multiple values found in { key } : { metadata [key ]} ."
514+ logger .warning (warning_msg )
478515
479516 return metadata
0 commit comments