Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

# 

# LSST Data Management System 

# 

# Copyright 2008-2016 AURA/LSST. 

# 

# This product includes software developed by the 

# LSST Project (http://www.lsst.org/). 

# 

# This program is free software: you can redistribute it and/or modify 

# it under the terms of the GNU General Public License as published by 

# the Free Software Foundation, either version 3 of the License, or 

# (at your option) any later version. 

# 

# This program is distributed in the hope that it will be useful, 

# but WITHOUT ANY WARRANTY; without even the implied warranty of 

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

# GNU General Public License for more details. 

# 

# You should have received a copy of the LSST License Statement and 

# the GNU General Public License along with this program. If not, 

# see <https://www.lsstcorp.org/LegalNotices/>. 

# 

import traceback 

 

import lsst.pex.config 

from .transforms import PassThroughTransform 

 

__all__ = ("BasePluginConfig", "BasePlugin") 

 

 

class BasePluginConfig(lsst.pex.config.Config): 

"""! 

Base class measurement Plugin config classes. 

 

Most derived classes will want to set defaults that make sense for the plugin type 

""" 

pass 

 

 

class BasePlugin: 

"""! 

Base class for measurement plugins. 

 

This is the base class for SingleFramePlugin and ForcedPlugin; derived classes should inherit 

from one of those. 

""" 

# named class constants for execution order 

CENTROID_ORDER = 0.0 

SHAPE_ORDER = 1.0 

FLUX_ORDER = 2.0 

APCORR_ORDER = 3.0 

DEFAULT_CATALOGCALCULATION = 4.0 

 

@classmethod 

def getExecutionOrder(cls): 

"""Sets the relative order of plugins (smaller numbers run first). 

 

In general, the following class constants should be used (other values 

are also allowed, but should be avoided unless they are needed): 

CENTROID_ORDER centroids and other algorithms that require only a Footprint 

and its Peaks as input 

SHAPE_ORDER shape measurements and other algorithms that require getCentroid() to return 

a good centroid (in addition to a Footprint and its Peaks). 

FLUX_ORDER flux algorithms that require both getShape() and getCentroid(), 

in addition to a Footprint and its Peaks 

DEFAULT_CATALOGCALCULATION plugins that only operate on the catalog 

 

Must be reimplemented as a class method by concrete derived classes. 

 

This approach was chosen instead of a full graph-based analysis of dependencies 

because algorithm dependencies are usually both quite simple and entirely substitutable: 

an algorithm that requires a centroid can typically make use of any centroid algorithms 

outputs. That makes it relatively easy to figure out the correct value to use for any 

particular algorithm. 

""" 

raise NotImplementedError("All plugins must implement getExecutionOrder()") 

 

def __init__(self, config, name, logName=None): 

"""! 

Initialize the plugin object. 

 

@param[in] config An instance of this class's ConfigClass. 

@param[in] name The string the plugin was registered with. 

""" 

object.__init__(self) 

self.config = config 

self.name = name 

self.logName = logName 

 

def getLogName(self): 

return self.logName 

 

def fail(self, measRecord, error=None): 

"""! 

Record a failure of the measure or measureN() method. 

 

When the plugin raises an exception, framework will call 

fail() to allow the plugin to set its failure flag 

field(s). When measureN() raises an exception, fail() will be 

called repeatedly with all the records that were being 

measured. 

 

If the exception is a MeasurementError, it will be passed as 

the error argument; in all other cases the error argument will 

be None, and the failure will be logged by the measurement 

framework as a warning. 

""" 

traceback.print_exc() 

message = ("The algorithm '%s' thinks it cannot fail, but it did; " 

"please report this as a bug (the full traceback is above)." 

% (self.__class__.__name__,)) 

raise NotImplementedError(message) 

 

@staticmethod 

def getTransformClass(): 

"""! 

Get the measurement transformation appropriate to this plugin. 

 

This returns a subclass of MeasurementTransform, which may be 

instantiated with details of the algorithm configuration and then 

called with information about calibration and WCS to convert from raw 

measurement quantities to calibrated units. Calibrated data is then 

provided in a separate output table. 

 

By default, we copy everything from the input to the output without 

transformation. 

""" 

return PassThroughTransform