1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

# http://pyrocko.org - GPLv3 

# 

# The Pyrocko Developers, 21st Century 

# ---|P------/S----------~Lg---------- 

 

from __future__ import absolute_import, print_function 

 

import os.path as op 

import logging 

 

from pyrocko.guts import List, load, StringPattern 

 

from ..has_paths import HasPaths 

from .client.base import Source 

from .error import SquirrelError 

from .selection import re_persistent_name 

 

guts_prefix = 'squirrel' 

 

logger = logging.getLogger('psq.dataset') 

 

 

class PersistentID(StringPattern): 

pattern = re_persistent_name 

 

 

class Dataset(HasPaths): 

''' 

Dataset description. 

''' 

sources = List.T(Source.T()) 

persistent = PersistentID.T(optional=True) 

 

def setup(self, squirrel, check=True, progress_viewer='terminal'): 

for source in self.sources: 

source.setup( 

squirrel, check=check, progress_viewer=progress_viewer) 

 

def get_squirrel( 

self, 

update=False, 

check=True, 

how_to_update='Avoiding dataset rescan. ' 

'Enable updating to force refresh or delete the ' 

'persistent selection for a clean start.'): 

 

from pyrocko.squirrel import base 

squirrel = base.Squirrel(persistent=self.persistent) 

 

if self.persistent and not squirrel.is_new(): 

if not update: 

logger.info( 

'Using existing persistent selection: %s' 

% self.persistent) 

logger.info(how_to_update) 

return squirrel 

 

else: 

logger.info( 

'Updating existing persistent selection: %s' 

% self.persistent) 

 

squirrel.add_dataset(self, check=check) 

return squirrel 

 

 

def read_dataset(path): 

''' 

Read dataset description file. 

''' 

try: 

dataset = load(filename=path) 

except OSError: 

raise SquirrelError( 

'Cannot read dataset file: %s' % path) 

 

if not isinstance(dataset, Dataset): 

raise SquirrelError('Invalid dataset file "%s".' % path) 

 

dataset.set_basepath(op.dirname(path) or '.') 

return dataset 

 

 

def from_dataset(path, update=False, check=True): 

ds = read_dataset(path) 

return ds.get_squirrel(update=update, check=check) 

 

 

__all__ = [ 

'PersistentID', 

'Dataset', 

'read_dataset', 

'from_dataset' 

]