ATLAS Offline Software
DiskUtils.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
2 
3 import glob
4 import os
5 import re
6 import subprocess
7 import functools
8 
9 # DEPRECATED CODE #############################################################
10 
11 import sys
12 from functools import wraps
13 def deprecated(message):
14  def deco(fn):
15  @wraps(fn)
16  def wrapper(*args, **kwargs):
17  print('WARNING: [InDetBeamSpotExample.DiskUtils]',
18  '{}() is deprecated and will be removed'.format( fn.__name__),
19  file=sys.stderr)
20  print('WARNING: ', message,
21  file=sys.stderr)
22  return fn(*args, **kwargs)
23  return wrapper
24  return deco
25 
26 import fnmatch
27 from collections import namedtuple
28 StorageManager = namedtuple('StorageManager', ['name', 'prefix', 'cp', 'ls', 'longls'])
29 CastorMgr = StorageManager(name='castor', prefix='root://castoratlas/', cp='xrdcp', ls='nsls %s', longls='nsls -l %s')
30 RFIOMgr = StorageManager(name='rfio', prefix='rfio:', cp='rfcp', ls='rfdir %s', longls='rfdir %s')
31 EOSMgr = StorageManager(name='eos', prefix='root://eosatlas.cern.ch/', cp='xrdcp', ls='/bin/sh -l -c "LD_LIBRARY_PATH=/usr/lib64/ eos ls %s"', longls='/bin/sh -l -c "LD_LIBRARY_PATH=/usr/lib64/ eos ls -l %s"')
32 UnixMgr = StorageManager(name='unix', prefix='', cp='cp', ls='ls %s', longls='ls -l %s')
33 
34 def _rationalise(path):
35  """
36  Rationalise a path, removing prefix and esuring single leading slash
37  """
38  for p in ('root://castoratlas/', 'root://eosatlas.cern.ch/', 'rfio:', 'castor:'):
39  if path.startswith(p):
40  path = path[len(p):]
41  if path.startswith('//'):
42  path = path[1:]
43  if not path.startswith('/'):
44  path = '/'+path
45  break
46 
47  return path
48 
49 @deprecated("EOS is mounted on /eos with fuse, so you probably don't need this abstraction")
50 def storageManager(name):
51  """
52  Return SotrageManager to deal with listing, copying and reading files from various storage systems
53  """
54  name = _rationalise(name)
55  if name.startswith('/castor/'):
56  return CastorMgr
57  elif name.startswith('/eos/'):
58  return EOSMgr
59  else:
60  return UnixMgr
61 
62 @deprecated("DiskUtils.FileSet replaces this functionality")
63 def filelist(files, prefix=None):
64  """
65  lists CASTOR/EOS name server directory/file entries.
66  If path is a directory, filelist lists the entries in the directory;
67  they are sorted alphabetically.
68 
69  `files` specifies the CASTOR/EOS pathname.
70  `prefix` specifies the prefix one wants to prepend to the path found.
71  (e.g. prefix='root://castoratlas/' or 'root://eosatlas.cern.ch//')
72  if prefix=True it will determin the prefix based on the pathname
73 
74  ex:
75  filelist('/castor/cern.ch/atlas/*')
76  filelist('/castor/cern.ch/atl*/foo?[bar]/*.pool.root.?')
77  filelist('/eos/atlas/*', prefix='root://eosatlas.cern.ch/')
78  filelist('/castor/cern.ch/atlas/*', prefix=True)
79  """
80 
81  path, fname = os.path.split(files)
82  path = _rationalise(path)
83 
84  if ( path.count('*') > 0 or path.count('?') > 0 or
85  path.count('[') > 0 or path.count(']') > 0 ) :
86  paths = ls(path)
87  return sum([ls(os.path.join(p,fname))
88  for p in paths], [])
89 
90  mgr = storageManager(path)
91 
92  try:
93  flist = subprocess.check_output(mgr.ls % path, shell=True).split()
94  except subprocess.CalledProcessError as err:
95  print(err.output)
96  return []
97 
98  if not (os.path.basename(files) in ['', '*']): # no need to filter
99  pattern = fnmatch.translate(os.path.basename(files))
100  flist = filter(lambda x: re.search(pattern, x), flist)
101 
102  if prefix:
103  if isinstance(prefix, str):
104  return [os.path.join(prefix+path, p) for p in flist]
105  else:
106  return [os.path.join(mgr.prefix+path, p) for p in flist]
107  else:
108  return [os.path.join(path, p) for p in flist]
109 
110 @deprecated("EOS is mounted on /eos with fuse, so you probably don't need this abstraction")
111 def ls(path, longls=False):
112  """
113  Simple list of files
114 
115  `longls` specifies long listing format
116  """
117 
118  path = _rationalise(path)
119  mgr = storageManager(path)
120 
121  if longls:
122  return subprocess.check_output(mgr.longls % path, shell=True)
123  else:
124  return subprocess.check_output(mgr.ls % path, shell=True)
125 
126 @deprecated("EOS is mounted on /eos with fuse, so you probably don't need this abstraction")
127 def cp(src, dest='.'):
128  src = _rationalise(src)
129  dest = _rationalise(dest)
130  srcmgr = storageManager(src)
131  destmgr = storageManager(dest)
132 
133  cp = 'cp'
134  if srcmgr.cp == 'xrdcp' or destmgr.cp == 'xrdcp': cp = 'xrdcp'
135 
136  return os.system('%s %s%s %s%s' %(cp, srcmgr.prefix, src, destmgr.prefix, dest))
137 
138 
139 
140 class AccessError(RuntimeError): pass
141 
142 def get_lumi_blocks(root_file):
143 
144  try:
145  from PyUtils.RootUtils import import_root
146  root = import_root()
147  f = root.TFile.Open(root_file, 'READ')
148 
149  meta = f.Get( 'MetaData' )
150  if not meta:
151  raise Exception('No metadata')
152 
153  meta.GetEntry( 0 )
154 
155  esiName= 'Stream'
156  esiTypeName = 'EventStreamInfo'
157  for l in meta.GetListOfLeaves():
158  if l.GetTypeName().startswith(esiTypeName):
159  esiTypeName = l.GetTypeName()
160  esiName = l.GetName()
161  break
162 
163  if esiTypeName != 'EventStreamInfo_p3':
164  raise Exception("old schema is not supported:", esiTypeName)
165 
166  import cppyy
167 
168  esic = cppyy.gbl.EventStreamInfoPTCnv_p3()
169  esi = getattr (meta, esiName)
170  if esiName.startswith(esiTypeName):
171  esiName = esiName[len(esiTypeName)+1:]
172 
173  return( list(esic.lumiBlockNumbers(esi)) )
174 
175  except Exception as e:
176  print( "Failed to read MetaData will fall back to looping ", repr(e))
177  finally:
178  f.Close()
179 
180  try:
181  from PyUtils.RootUtils import import_root
182  root = import_root()
183  f = root.TFile.Open(root_file, 'READ')
184  lumiblocks = set()
185  metadata= f.Get('CollectionMetadata') if f else None
186  if metadata:
187  metadata.GetEntry(0)
188  import ctypes
189  key_name = str(ctypes.c_char_p(metadata.Key).value)
190  assert key_name == 'POOLCollectionID'
191  del metadata
192  coll_tree = f.Get('POOLCollectionTree') if f else None
193  if coll_tree:
194  evtmax = coll_tree.GetEntries()
195  if evtmax in (-1, None):
196  evtmax = 0
197  evtmax = int(evtmax)
198  for row in range(evtmax):
199  if coll_tree.GetEntry(row) < 0:
200  break
201  lbn = coll_tree.LumiBlockN
202  lumiblocks.add(lbn)
203  del coll_tree
204  return list( lumiblocks )
205  finally:
206  f.Close()
207 
208 def make_lumi_block_map_file(file_set, path):
209  with open(path, 'w') as mapfile:
210  for f, lbs in file_set.with_lumi_blocks():
211  print('Reading:', f)
212  mapfile.write('{} {}\n'.format(
213  os.path.basename(f),
214  ','.join(str(x) for x in lbs)))
215 
216 
217 class Backend:
218  def exists(self, path): raise NotImplementedError
219  def is_file(self, path): raise NotImplementedError
220  def is_directory(self, path): raise NotImplementedError
221  def children(self, path): raise NotImplementedError
222  def glob(self, pattern): raise NotImplementedError
223  def wrap(self, path): return path
224 
225 class Local(Backend):
226  def exists(self, path): return os.path.exists(path)
227  def is_directory(self, path): return os.path.isdir(path)
228  def is_file(self, path): return os.path.isfile(path)
229 
230  def children(self, path):
231  def generator(p):
232  for dir_name, dirs, files in os.walk(p):
233  for f in files:
234  yield os.path.join(dir_name, f)
235  return generator(path)
236 
237  def glob(self, pattern):
238  return glob.glob(pattern)
239 
240 class EOS(Backend):
241  """ Accesses EOS using the command line interface.
242  NB: when EOS is fuse-mounted on /eos this class is not really necessary.
243  """
244 
245  def __init__(self, prefix='root://eosatlas.cern.ch/'):
246  self.prefix = prefix
247 
248  def wrap(self, path):
249  if path.startswith('/'):
250  path = self.prefix + path
251  return path
252 
253  def unwrap(self, path):
254  if path.startswith(self.prefix):
255  path = path[len(self.prefix):]
256  return path
257 
258  def exists(self, path):
259  return self._call('eos', '-b', 'ls', '-s', self.unwrap(path)) == 0
260 
261  def is_file(self, path):
262  return self._call('eos', '-b', 'sat', '-f', self.unwrap(path)) == 0
263 
264  def is_directory(self, path):
265  return self._call('eos', '-b', 'sat', '-d', self.unwrap(path)) == 0
266 
267  def children(self, path):
268  with open(os.devnull, 'w') as null:
269  output = subprocess.check_output(['eos', '-b', 'find', '-f',
270  self.unwrap(path)], stderr=null)
271  return [l.strip() for l in output.split('\n')]
272 
273  def _call(self, *args):
274  with open(os.devnull, 'w') as null:
275  retcode = subprocess.call(args, stderr=null)
276  return retcode
277 
278 class FilterError(RuntimeError): pass
279 
280 class FileSet:
281  """ Represents a list of input files.
282  This class abstracts over the different ways files can be specified, and
283  the different storage backends/protocols on which they reside. It is an
284  iterator, and provides some methods for filtering the file set. E.g.:
285 
286  fs = FileSet.from_input('/eos/atlas/path/to/dataset/')
287  for f in fs.matching(r'.*AOD.*').only_existing():
288  print(f)
289  """
290 
291  def __init__(self, iterator, backend):
292  self.backend = backend
293  self._iter = iterator
294  self._existing = False
295  self._white_pattern = None
296  self._black_pattern = None
297  self._strict = True
298  self._explicit = None
299  self._dedup = False
300  self._single_dataset = False
301  self.broken = []
302  self.lb_map = {}
303 
304  @classmethod
305  def from_single_file(cls, path, backend=None):
306  return cls(iter([path]), backend or Local())
307 
308  @classmethod
309  def from_directory(cls, path, backend=None):
310  be = backend or Local()
311  return cls(be.children(path), be)
312 
313  @classmethod
314  def from_file_containing_list(cls, path, backend=None):
315  with open(path) as lf:
316  listtoiter = [l.strip() for l in lf.readlines()]
317  iterator = iter(listtoiter)
318  return cls(iterator, backend or Local())
319 
320  @classmethod
321  def from_glob(cls, pattern, backend=None):
322  be = backend or Local()
323  return cls(be.glob(pattern), be)
324 
325  @classmethod
326  def from_ds_info(cls, run, project, stream, base, backend=None):
327  path = os.path.join(base, project, stream,
328  '{:0{digits}d}'.format(int(run), digits=8))
329  return cls.from_directory(path, backend=backend)
330 
331  @classmethod
332  def from_input(cls, input_string, backend=None):
333  ''' Guess what kind of input file specification was provided. '''
334  be = backend or Local()
335  if be.is_directory(input_string):
336  return cls.from_directory(input_string, be)
337  elif Local().is_file(input_string) and not (
338  input_string.endswith('.root') or
339  input_string[-7:-2] == '.root'):
340  return cls.from_file_containing_list(input_string, be)
341  elif be.is_file(input_string):
342  return cls.from_single_file(input_string, be)
343  elif '*' in input_string or '?' in input_string or '[' in input_string:
344  return cls.from_glob(input_string, be)
345  else:
346  raise AccessError('Unable to resolve input: ' + repr(input_string))
347 
348  def __iter__(self):
349  it = self._iter
350  if self._white_pattern:
351  it = filter(lambda x: self._white_pattern.search(x), it)
352  if self._black_pattern:
353  it = filter(lambda x: not self._black_pattern.search(x), it)
354  if self._existing: # see: only_existing
355  if self._strict:
356  def generator(i, b):
357  for f in i:
358  if b.exists(f):
359  yield f
360  else:
361  raise AccessError('File not found: ' + f)
362  it = generator(it, self.backend)
363  else:
364  it = filter(lambda x: self.backend.exists(x), it)
365  if self._explicit is not None: # see: use_files_from
366  def generator(i, strict):
367  for f in i:
368  name = os.path.basename(f)
369  if self._explicit.pop(name, False):
370  yield f
371  if strict and self._explicit:
372  for f in self._explicit: print('Missing:', f)
373  raise FilterError('Not all explicit files were found.')
374  it = generator(it, self._strict)
375  if self._dedup: # see: only_latest
376  def fn(m, f):
377  name, ext = os.path.splitext(f)
378  if name in m:
379  m[name] = str(max(int(m[name]), int(ext[1:])))
380  else:
381  m[name] = ext[1:]
382  return m
383  def generator(em):
384  for name, ext in em.items():
385  yield '.'.join([name, ext])
386  it = generator(functools.reduce(fn, self, {}))
387  if self._single_dataset: # see: only_single_dataset
388  def generator(i):
389  dataset = None
390  for f in i:
391  ds = '.'.join(f.split('.')[0:3])
392  if dataset is None:
393  dataset = ds
394  if ds == dataset:
395  yield f
396  else:
397  raise FilterError(
398  "Files found from more than one dataset: '{}' != '{}'"
399  .format(ds, dataset))
400  it = generator(it)
401  it = map(lambda x: self.backend.wrap(x), it)
402  return it
403 
404  def strict_mode(self, setting=True):
405  """ When strict, errors are raised in the following cases (which
406  otherwise cause the corresponding files to be silently skipped):
407 
408  * When LB info is requested but cannot be found for a file (because
409  it was not in the map file, or we couldn't open the ROOT file).
410  * When `only_existing` is set and a file is missing.
411  * When a file list is provided and not all of the files it mentions
412  were encountered by the end of iteration.
413  """
414  self._strict = setting
415  return self
416 
417  def matching(self, pattern):
418  ''' Only accept filenames matching the provided regular expression. '''
419  self._white_pattern = re.compile(pattern) if pattern else None
420  return self
421 
422  def excluding(self, pattern):
423  ''' Skip filenames matching the provided regular expression. '''
424  self._black_pattern = re.compile(pattern) if pattern else None
425  return self
426 
427  def use_files_from(self, path):
428  ''' Use specific filenames from within the provided dataset. '''
429  if path:
430  with open(path) as lf:
431  self._explicit = [l.strip() for l in lf.readlines()]
432  else:
433  self._explicit = None
434  return self
435 
436  def only_existing(self, setting=True):
437  ''' Only use existing files. '''
438  self._existing = setting
439  return self
440 
441  def only_latest(self, setting=True):
442  ''' Keep only the latest retry from sets like `*.1`, `*.2`. '''
443  self._dedup = setting
444  return self
445 
446  def only_single_dataset(self, setting=True):
447  ''' Require all files to be from the same dataset. '''
448  self._single_dataset = setting
449  return self
450 
451  def with_lumi_blocks(self, map_file=None):
452  """ Lookup the luminosity blocks contained in each file.
453  If a map file is provided it will be queried for the LB mapping,
454  otherwise each file will be opened and accessed using AthenaROOTAccess
455  which can be a little slow.
456  """
457  if map_file:
458  return self._with_lumi_blocks_from_map(map_file)
459  else:
460  return self._with_lumi_blocks_from_ara()
461 
462  def _with_lumi_blocks_from_map(self, map_file):
463  with open(map_file) as mf:
464  for line in mf:
465  print(line)
466  fname = line.split(' ')[0]
467  print(line.split(' ')[0])
468  print(line.split(' ')[1])
469  lbs = set(int(l) for l in line.split(' ')[1].split(','))
470  self.lb_map[fname] = lbs
471  def generator(s):
472  for f in s:
473  try:
474  yield f, s.lb_map[os.path.basename(f)]
475  except KeyError:
476  if s._strict:
477  raise
478  else:
479  s.broken.append(f)
480  return generator(self)
481 
483  def generator(s):
484  for f in s:
485  try:
486  lbs = get_lumi_blocks(f)
487  except AccessError:
488  if s._strict:
489  raise
490  else:
491  s.broken.append(f)
492  continue
493  yield f, set(lbs)
494  return generator(self)
python.DiskUtils.AccessError
Definition: DiskUtils.py:140
python.DiskUtils.EOS.exists
def exists(self, path)
Definition: DiskUtils.py:258
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
python.DiskUtils.FileSet._white_pattern
_white_pattern
Definition: DiskUtils.py:295
python.DiskUtils.EOS.is_directory
def is_directory(self, path)
Definition: DiskUtils.py:264
vtune_athena.format
format
Definition: vtune_athena.py:14
python.DiskUtils.FileSet.broken
broken
Definition: DiskUtils.py:301
python.DiskUtils.deprecated
def deprecated(message)
Definition: DiskUtils.py:13
python.DiskUtils.FileSet.with_lumi_blocks
def with_lumi_blocks(self, map_file=None)
Definition: DiskUtils.py:451
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
python.DiskUtils.FileSet._black_pattern
_black_pattern
Definition: DiskUtils.py:296
python.DiskUtils.FileSet.use_files_from
def use_files_from(self, path)
Definition: DiskUtils.py:427
python.DiskUtils.FileSet._explicit
_explicit
Definition: DiskUtils.py:298
python.DiskUtils.FileSet._single_dataset
_single_dataset
Definition: DiskUtils.py:300
CaloClusterListBadChannel.cls
cls
Definition: CaloClusterListBadChannel.py:8
python.DiskUtils.Local
Definition: DiskUtils.py:225
python.DiskUtils.FileSet.__init__
def __init__(self, iterator, backend)
Definition: DiskUtils.py:291
python.DiskUtils.FileSet._strict
_strict
Definition: DiskUtils.py:297
search
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles
Definition: hcg.cxx:738
python.DiskUtils.EOS.__init__
def __init__(self, prefix='root://eosatlas.cern.ch/')
Definition: DiskUtils.py:245
python.DiskUtils.FilterError
Definition: DiskUtils.py:278
python.RootUtils.import_root
def import_root(batch=True)
functions --------------------------------------------------------------—
Definition: RootUtils.py:22
python.DiskUtils.EOS.prefix
prefix
Definition: DiskUtils.py:246
covarianceTool.filter
filter
Definition: covarianceTool.py:514
python.DiskUtils.Backend.is_directory
def is_directory(self, path)
Definition: DiskUtils.py:220
python.getCurrentFolderTag.fn
fn
Definition: getCurrentFolderTag.py:79
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
python.DiskUtils.FileSet.from_input
def from_input(cls, input_string, backend=None)
Definition: DiskUtils.py:332
python.DiskUtils.EOS.wrap
def wrap(self, path)
Definition: DiskUtils.py:248
python.DiskUtils.FileSet
Definition: DiskUtils.py:280
python.DiskUtils.Local.exists
def exists(self, path)
Definition: DiskUtils.py:226
python.DiskUtils.FileSet.excluding
def excluding(self, pattern)
Definition: DiskUtils.py:422
python.DiskUtils.FileSet._with_lumi_blocks_from_ara
def _with_lumi_blocks_from_ara(self)
Definition: DiskUtils.py:482
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
python.DiskUtils.FileSet.matching
def matching(self, pattern)
Definition: DiskUtils.py:417
PyAthena::repr
std::string repr(PyObject *o)
returns the string representation of a python object equivalent of calling repr(o) in python
Definition: PyAthenaUtils.cxx:106
python.DiskUtils.Local.glob
def glob(self, pattern)
Definition: DiskUtils.py:237
python.DiskUtils.cp
def cp(src, dest='.')
Definition: DiskUtils.py:127
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.DiskUtils.FileSet.only_latest
def only_latest(self, setting=True)
Definition: DiskUtils.py:441
python.DiskUtils.FileSet.from_file_containing_list
def from_file_containing_list(cls, path, backend=None)
Definition: DiskUtils.py:314
python.DiskUtils.FileSet._with_lumi_blocks_from_map
def _with_lumi_blocks_from_map(self, map_file)
Definition: DiskUtils.py:462
python.DiskUtils.FileSet.from_directory
def from_directory(cls, path, backend=None)
Definition: DiskUtils.py:309
python.DiskUtils.Local.is_file
def is_file(self, path)
Definition: DiskUtils.py:228
python.DiskUtils.get_lumi_blocks
def get_lumi_blocks(root_file)
Definition: DiskUtils.py:142
python.DiskUtils.FileSet.backend
backend
Definition: DiskUtils.py:292
python.DiskUtils.FileSet.from_single_file
def from_single_file(cls, path, backend=None)
Definition: DiskUtils.py:305
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
python.DiskUtils.StorageManager
StorageManager
Definition: DiskUtils.py:28
python.DiskUtils.filelist
def filelist(files, prefix=None)
Definition: DiskUtils.py:63
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.DiskUtils.storageManager
def storageManager(name)
Definition: DiskUtils.py:50
python.DiskUtils.EOS.is_file
def is_file(self, path)
Definition: DiskUtils.py:261
python.DiskUtils.Backend.exists
def exists(self, path)
Definition: DiskUtils.py:218
python.DiskUtils.FileSet.strict_mode
def strict_mode(self, setting=True)
Definition: DiskUtils.py:404
python.DiskUtils.FileSet.lb_map
lb_map
Definition: DiskUtils.py:302
python.DiskUtils.Local.children
def children(self, path)
Definition: DiskUtils.py:230
Trk::open
@ open
Definition: BinningType.h:40
mc.generator
generator
Configure Herwig7 These are the commands corresponding to what would go into the regular Herwig infil...
Definition: mc.MGH7_FxFx_H71-DEFAULT_test.py:18
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.DiskUtils.EOS._call
def _call(self, *args)
Definition: DiskUtils.py:273
python.DiskUtils.Local.is_directory
def is_directory(self, path)
Definition: DiskUtils.py:227
python.DiskUtils._rationalise
def _rationalise(path)
Definition: DiskUtils.py:34
str
Definition: BTagTrackIpAccessor.cxx:11
python.DiskUtils.ls
def ls(path, longls=False)
Definition: DiskUtils.py:111
python.DiskUtils.FileSet.from_ds_info
def from_ds_info(cls, run, project, stream, base, backend=None)
Definition: DiskUtils.py:326
python.DiskUtils.EOS
Definition: DiskUtils.py:240
python.DiskUtils.EOS.unwrap
def unwrap(self, path)
Definition: DiskUtils.py:253
python.dummyaccess.exists
def exists(filename)
Definition: dummyaccess.py:9
python.DiskUtils.EOS.children
def children(self, path)
Definition: DiskUtils.py:267
python.DiskUtils.FileSet._dedup
_dedup
Definition: DiskUtils.py:299
python.DiskUtils.FileSet.from_glob
def from_glob(cls, pattern, backend=None)
Definition: DiskUtils.py:321
python.DiskUtils.FileSet._existing
_existing
Definition: DiskUtils.py:294
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.DiskUtils.Backend
Definition: DiskUtils.py:217
python.DiskUtils.FileSet.__iter__
def __iter__(self)
Definition: DiskUtils.py:348
python.DiskUtils.FileSet.only_single_dataset
def only_single_dataset(self, setting=True)
Definition: DiskUtils.py:446
python.DiskUtils.FileSet.only_existing
def only_existing(self, setting=True)
Definition: DiskUtils.py:436
python.DiskUtils.make_lumi_block_map_file
def make_lumi_block_map_file(file_set, path)
Definition: DiskUtils.py:208
python.DiskUtils.FileSet._iter
_iter
Definition: DiskUtils.py:293
python.DiskUtils.Backend.glob
def glob(self, pattern)
Definition: DiskUtils.py:222