LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | Public Attributes | List of all members
lsst.daf.persistence.fsScanner.FsScanner Class Reference

Public Member Functions

def __init__ (self, pathTemplate)
 
def getFields (self)
 
def isNumeric (self, name)
 
def isInt (self, name)
 
def isFloat (self, name)
 
def processPath (self, location)
 

Public Attributes

 globString
 
 fields
 
 reString
 

Detailed Description

Class to scan a filesystem location for paths matching a template.

Decomposes the resulting paths into fields and passes them to a callback
function.

Definition at line 32 of file fsScanner.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.daf.persistence.fsScanner.FsScanner.__init__ (   self,
  pathTemplate 
)
Constructor.  Takes the path template, which should be in the form
of a Python string with named format substitution specifications.
Such a template would be suitable for generating a path given a set of
fields in a dictionary.  Does not handle hex (%x or %X).

Example:
    %(field)s/%(visit)d/%(exposure)d/raw-%(visit)d-e%(exposure)03d-c%(ccd)03d-a%(amp)03d.fits

Note that fields may appear multiple times; the second and subsequent
appearances of such fields will have "_{number}" appended to them to
disambiguate, although it is typically assumed that they will all be
identical.

Trailing brackets (and their contents) can be used to indicate which HDU from a file should
be used. They will not be included in the filename search.

Definition at line 39 of file fsScanner.py.

39  def __init__(self, pathTemplate):
40  """Constructor. Takes the path template, which should be in the form
41  of a Python string with named format substitution specifications.
42  Such a template would be suitable for generating a path given a set of
43  fields in a dictionary. Does not handle hex (%x or %X).
44 
45  Example:
46  %(field)s/%(visit)d/%(exposure)d/raw-%(visit)d-e%(exposure)03d-c%(ccd)03d-a%(amp)03d.fits
47 
48  Note that fields may appear multiple times; the second and subsequent
49  appearances of such fields will have "_{number}" appended to them to
50  disambiguate, although it is typically assumed that they will all be
51  identical.
52 
53  Trailing brackets (and their contents) can be used to indicate which HDU from a file should
54  be used. They will not be included in the filename search.
55  """
56 
57  # Trim any trailing braces off the end of the path template.
58  if pathTemplate.endswith(']'):
59  pathTemplate = pathTemplate[0:pathTemplate.rfind('[')]
60 
61  # Change template into a globbable path specification.
62  fmt = re.compile(r'%\‍((\w+)\‍).*?([dioueEfFgGcrs])')
63 
64  self.globString = fmt.sub('*', pathTemplate)
65 
66  # Change template into a regular expression.
67  last = 0
68  self.fields = {}
69  self.reString = ""
70  n = 0
71  pos = 0
72  for m in fmt.finditer(pathTemplate):
73  fieldName = m.group(1)
74  if fieldName in self.fields:
75  fieldName += "_%d" % (n,)
76  n += 1
77 
78  prefix = pathTemplate[last:m.start(0)]
79  last = m.end(0)
80  self.reString += prefix
81 
82  if m.group(2) in 'crs':
83  fieldType = str
84  self.reString += r'(?P<' + fieldName + '>.+)'
85  elif m.group(2) in 'eEfFgG':
86  fieldType = float
87  self.reString += r'(?P<' + fieldName + r'>[\d.eE+-]+)'
88  else:
89  fieldType = int
90  self.reString += r'(?P<' + fieldName + r'>[\d+-]+)'
91 
92  self.fields[fieldName] = dict(pos=pos, fieldType=fieldType)
93  pos += 1
94 
95  self.reString += pathTemplate[last:]
96 

Member Function Documentation

◆ getFields()

def lsst.daf.persistence.fsScanner.FsScanner.getFields (   self)
Return the list of fields that will be returned from matched
paths, in order.

Definition at line 97 of file fsScanner.py.

97  def getFields(self):
98  """Return the list of fields that will be returned from matched
99  paths, in order."""
100 
101  fieldList = ["" for i in range(len(self.fields))]
102  for f in list(self.fields.keys()):
103  fieldList[self.fields[f]['pos']] = f
104  return fieldList
105 
daf::base::PropertyList * list
Definition: fits.cc:913

◆ isFloat()

def lsst.daf.persistence.fsScanner.FsScanner.isFloat (   self,
  name 
)
Return true if the given field contains an float.

Definition at line 116 of file fsScanner.py.

116  def isFloat(self, name):
117  """Return true if the given field contains an float."""
118 
119  return self.fields[name]['fieldType'] == float
120 

◆ isInt()

def lsst.daf.persistence.fsScanner.FsScanner.isInt (   self,
  name 
)
Return true if the given field contains an integer.

Definition at line 111 of file fsScanner.py.

111  def isInt(self, name):
112  """Return true if the given field contains an integer."""
113 
114  return self.fields[name]['fieldType'] == int
115 

◆ isNumeric()

def lsst.daf.persistence.fsScanner.FsScanner.isNumeric (   self,
  name 
)
Return true if the given field contains a number.

Definition at line 106 of file fsScanner.py.

106  def isNumeric(self, name):
107  """Return true if the given field contains a number."""
108 
109  return self.fields[name]['fieldType'] in (float, int)
110 

◆ processPath()

def lsst.daf.persistence.fsScanner.FsScanner.processPath (   self,
  location 
)
Scan a given path location. Return info about paths that conform to the path template:
:param location:
:return: Path info: {path: {key:value ...}, ...} e.g.:
    {'0239622/instcal0239622.fits.fz': {'visit_0': 239622, 'visit': 239622}}

Definition at line 121 of file fsScanner.py.

121  def processPath(self, location):
122  """
123  Scan a given path location. Return info about paths that conform to the path template:
124  :param location:
125  :return: Path info: {path: {key:value ...}, ...} e.g.:
126  {'0239622/instcal0239622.fits.fz': {'visit_0': 239622, 'visit': 239622}}
127  """
128  ret = {}
129  curdir = os.getcwd()
130  os.chdir(location)
131  pathList = glob.glob(self.globString)
132  for path in pathList:
133  m = re.search(self.reString, path)
134  if m:
135  dataId = m.groupdict()
136  for f in self.fields:
137  if self.isInt(f):
138  dataId[f] = int(dataId[f])
139  elif self.isFloat(f):
140  dataId[f] = float(dataId[f])
141  ret[path] = dataId
142  else:
143  print("Warning: unmatched path: %s" % (path,), file=sys.stderr)
144  os.chdir(curdir)
145  return ret

Member Data Documentation

◆ fields

lsst.daf.persistence.fsScanner.FsScanner.fields

Definition at line 68 of file fsScanner.py.

◆ globString

lsst.daf.persistence.fsScanner.FsScanner.globString

Definition at line 64 of file fsScanner.py.

◆ reString

lsst.daf.persistence.fsScanner.FsScanner.reString

Definition at line 69 of file fsScanner.py.


The documentation for this class was generated from the following file: