LSST Applications g0265f82a02+0e5473021a,g02d81e74bb+0dd8ce4237,g1470d8bcf6+3ea6592b6f,g2079a07aa2+86d27d4dc4,g2305ad1205+5ca4c0b359,g295015adf3+d10818ec9d,g2a9a014e59+6f9be1b9cd,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g3ddfee87b4+703ba97ebf,g487adcacf7+4fa16da234,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+ffa42b374e,g5a732f18d5+53520f316c,g64a986408d+0dd8ce4237,g858d7b2824+0dd8ce4237,g8a8a8dda67+585e252eca,g99cad8db69+d39438377f,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+f1d96605c8,gb0e22166c9+60f28cb32d,gb6a65358fc+0e5473021a,gba4ed39666+c2a2e4ac27,gbb8dafda3b+e5339d463f,gc120e1dc64+da31e9920e,gc28159a63d+0e5473021a,gcf0d15dbbd+703ba97ebf,gdaeeff99f8+f9a426f77a,ge6526c86ff+889fc9d533,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gf18bd8381d+7268b93478,gff1a9f87cc+0dd8ce4237,w.2024.16
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | List of all members
lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin Class Reference
Inheritance diagram for lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin:

Public Member Functions

 getExecutionOrder (cls)
 
 __init__ (self, config, name, schema, metadata, logName=None)
 
 measureDipoles (self, measRecord, exposure, posExp=None, negExp=None)
 
 doClassify (self, measRecord, chi2val)
 
 fail (self, measRecord, error=None)
 

Public Attributes

 log
 
 posFluxKey
 
 negFluxKey
 
 fluxKey
 
 posCentroidKey
 
 negCentroidKey
 
 centroidKey
 
 orientationKey
 
 separationKey
 
 chi2dofKey
 
 nDataKey
 
 signalToNoiseKey
 
 classificationFlagKey
 
 classificationAttemptedFlagKey
 
 flagKey
 
 edgeFlagKey
 
 FAILURE_TOO_LARGE
 
 FAILURE_EDGE
 
 FAILURE_FIT
 

Static Public Attributes

 ConfigClass = DipoleFitPluginConfig
 
 DipoleFitAlgorithmClass = DipoleFitAlgorithm
 
int FAILURE_EDGE = 1
 
int FAILURE_FIT = 2
 
int FAILURE_NOT_DIPOLE = 4
 
int FAILURE_TOO_LARGE = 8
 

Protected Member Functions

 _setupSchema (self, config, name, schema, metadata)
 

Detailed Description

A single frame measurement plugin that fits dipoles to all merged (two-peak) ``diaSources``.

This measurement plugin accepts up to three input images in
its `measure` method. If these are provided, it includes data
from the pre-subtraction posImage (science image) and optionally
negImage (template image) to constrain the fit. The meat of the
fitting routines are in the class `~lsst.module.name.DipoleFitAlgorithm`.

Notes
-----
The motivation behind this plugin and the necessity for including more than
one exposure are documented in DMTN-007 (http://dmtn-007.lsst.io).

This class is named `ip_diffim_DipoleFit` so that it may be used alongside
the existing `ip_diffim_DipoleMeasurement` classes until such a time as those
are deemed to be replaceable by this.

Definition at line 954 of file dipoleFitTask.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.__init__ ( self,
config,
name,
schema,
metadata,
logName = None )

Definition at line 988 of file dipoleFitTask.py.

988 def __init__(self, config, name, schema, metadata, logName=None):
989 if logName is None:
990 logName = name
991 measBase.SingleFramePlugin.__init__(self, config, name, schema, metadata, logName=logName)
992
993 self.log = logging.getLogger(logName)
994
995 self._setupSchema(config, name, schema, metadata)
996

Member Function Documentation

◆ _setupSchema()

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin._setupSchema ( self,
config,
name,
schema,
metadata )
protected
Add fields for the outputs, and save the keys for fast assignment.

Definition at line 997 of file dipoleFitTask.py.

997 def _setupSchema(self, config, name, schema, metadata):
998 """Add fields for the outputs, and save the keys for fast assignment.
999 """
1000 self.posFluxKey = measBase.FluxResultKey.addFields(schema,
1001 schema.join(name, "pos"),
1002 "Dipole positive lobe instrumental flux.")
1003 self.negFluxKey = measBase.FluxResultKey.addFields(schema,
1004 schema.join(name, "neg"),
1005 "Dipole negative lobe instrumental flux.")
1006 doc = "Dipole overall instrumental flux (mean of absolute value of positive and negative lobes)."
1007 self.fluxKey = measBase.FluxResultKey.addFields(schema, name, doc)
1008
1009 self.posCentroidKey = measBase.CentroidResultKey.addFields(schema,
1010 schema.join(name, "pos"),
1011 "Dipole positive lobe centroid position.",
1012 measBase.UncertaintyEnum.NO_UNCERTAINTY)
1013 self.negCentroidKey = measBase.CentroidResultKey.addFields(schema,
1014 schema.join(name, "neg"),
1015 "Dipole negative lobe centroid position.",
1016 measBase.UncertaintyEnum.NO_UNCERTAINTY)
1017 self.centroidKey = measBase.CentroidResultKey.addFields(schema,
1018 name,
1019 "Dipole centroid position.",
1020 measBase.UncertaintyEnum.SIGMA_ONLY)
1021
1022 self.orientationKey = schema.addField(
1023 schema.join(name, "orientation"), type=float, units="deg",
1024 doc="Dipole orientation")
1025
1026 self.separationKey = schema.addField(
1027 schema.join(name, "separation"), type=float, units="pixel",
1028 doc="Pixel separation between positive and negative lobes of dipole")
1029
1030 self.chi2dofKey = schema.addField(
1031 schema.join(name, "chi2dof"), type=float,
1032 doc="Chi2 per degree of freedom (chi2/(nData-nVariables)) of dipole fit")
1033
1034 self.nDataKey = schema.addField(
1035 schema.join(name, "nData"), type=np.int64,
1036 doc="Number of data points in the dipole fit")
1037
1038 self.signalToNoiseKey = schema.addField(
1039 schema.join(name, "signalToNoise"), type=float,
1040 doc="Estimated signal-to-noise of dipole fit")
1041
1042 self.classificationFlagKey = schema.addField(
1043 schema.join(name, "flag", "classification"), type="Flag",
1044 doc="Flag indicating diaSource is classified as a dipole")
1045
1046 self.classificationAttemptedFlagKey = schema.addField(
1047 schema.join(name, "flag", "classificationAttempted"), type="Flag",
1048 doc="Flag indicating diaSource was attempted to be classified as a dipole")
1049
1050 self.flagKey = schema.addField(
1051 schema.join(name, "flag"), type="Flag",
1052 doc="General failure flag for dipole fit")
1053
1054 self.edgeFlagKey = schema.addField(
1055 schema.join(name, "flag", "edge"), type="Flag",
1056 doc="Flag set when dipole is too close to edge of image")
1057

◆ doClassify()

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.doClassify ( self,
measRecord,
chi2val )
Classify a source as a dipole.

Parameters
----------
measRecord : TODO: DM-17458
    TODO: DM-17458
chi2val : TODO: DM-17458
    TODO: DM-17458

Notes
-----
Sources are classified as dipoles, or not, according to three criteria:

1. Does the total signal-to-noise surpass the ``minSn``?
2. Are the pos/neg fluxes greater than 1.0 and no more than 0.65 (``maxFluxRatio``)
   of the total flux? By default this will never happen since ``posFlux == negFlux``.
3. Is it a good fit (``chi2dof`` < 1)? (Currently not used.)

Definition at line 1160 of file dipoleFitTask.py.

1160 def doClassify(self, measRecord, chi2val):
1161 """Classify a source as a dipole.
1162
1163 Parameters
1164 ----------
1165 measRecord : TODO: DM-17458
1166 TODO: DM-17458
1167 chi2val : TODO: DM-17458
1168 TODO: DM-17458
1169
1170 Notes
1171 -----
1172 Sources are classified as dipoles, or not, according to three criteria:
1173
1174 1. Does the total signal-to-noise surpass the ``minSn``?
1175 2. Are the pos/neg fluxes greater than 1.0 and no more than 0.65 (``maxFluxRatio``)
1176 of the total flux? By default this will never happen since ``posFlux == negFlux``.
1177 3. Is it a good fit (``chi2dof`` < 1)? (Currently not used.)
1178 """
1179
1180 # First, does the total signal-to-noise surpass the minSn?
1181 passesSn = measRecord[self.signalToNoiseKey] > self.config.minSn
1182
1183 # Second, are the pos/neg fluxes greater than 1.0 and no more than 0.65 (param maxFluxRatio)
1184 # of the total flux? By default this will never happen since posFlux = negFlux.
1185 passesFluxPos = (abs(measRecord[self.posFluxKey.getInstFlux()])
1186 / (measRecord[self.fluxKey.getInstFlux()]*2.)) < self.config.maxFluxRatio
1187 passesFluxPos &= (abs(measRecord[self.posFluxKey.getInstFlux()]) >= 1.0)
1188 passesFluxNeg = (abs(measRecord[self.negFluxKey.getInstFlux()])
1189 / (measRecord[self.fluxKey.getInstFlux()]*2.)) < self.config.maxFluxRatio
1190 passesFluxNeg &= (abs(measRecord[self.negFluxKey.getInstFlux()]) >= 1.0)
1191 allPass = (passesSn and passesFluxPos and passesFluxNeg) # and passesChi2)
1192
1193 # Third, is it a good fit (chi2dof < 1)?
1194 # Use scipy's chi2 cumulative distrib to estimate significance
1195 # This doesn't really work since I don't trust the values in the variance plane (which
1196 # affects the least-sq weights, which affects the resulting chi2).
1197 # But I'm going to keep this here for future use.
1198 if False:
1199 from scipy.stats import chi2
1200 ndof = chi2val / measRecord[self.chi2dofKey]
1201 significance = chi2.cdf(chi2val, ndof)
1202 passesChi2 = significance < self.config.maxChi2DoF
1203 allPass = allPass and passesChi2
1204
1205 measRecord.set(self.classificationAttemptedFlagKey, True)
1206
1207 if allPass: # Note cannot pass `allPass` into the `measRecord.set()` call below...?
1208 measRecord.set(self.classificationFlagKey, True)
1209 else:
1210 measRecord.set(self.classificationFlagKey, False)
1211

◆ fail()

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.fail ( self,
measRecord,
error = None )
Catch failures and set the correct flags.

Fallback on the current slot centroid positions, but set the dipole
failure flag, since we attempted to fit the source.

Definition at line 1212 of file dipoleFitTask.py.

1212 def fail(self, measRecord, error=None):
1213 """Catch failures and set the correct flags.
1214
1215 Fallback on the current slot centroid positions, but set the dipole
1216 failure flag, since we attempted to fit the source.
1217 """
1218 measRecord[self.centroidKey.getX()] = measRecord.getX()
1219 measRecord[self.centroidKey.getY()] = measRecord.getY()
1220 self.centroidKey.getCentroidErr().set(measRecord, measRecord.getCentroidErr())
1221
1222 measRecord.set(self.flagKey, True)
1223 if error is not None:
1224 if error.getFlagBit() == self.FAILURE_EDGE:
1225 self.log.debug('DipoleFitPlugin not run on record %d: %s', measRecord.getId(), str(error))
1226 measRecord.set(self.edgeFlagKey, True)
1227 if error.getFlagBit() == self.FAILURE_FIT:
1228 self.log.warning('DipoleFitPlugin failed on record %d: %s', measRecord.getId(), str(error))
1229 if error.getFlagBit() == self.FAILURE_TOO_LARGE:
1230 self.log.debug('DipoleFitPlugin not run on record with too large footprint %d: %s',
1231 measRecord.getId(), str(error))
1232 else:
1233 self.log.warning('DipoleFitPlugin failed on record %d', measRecord.getId())
daf::base::PropertySet * set
Definition fits.cc:931

◆ getExecutionOrder()

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.getExecutionOrder ( cls)
This algorithm simultaneously fits the centroid and flux, and does
not require any previous centroid fit.

Definition at line 982 of file dipoleFitTask.py.

982 def getExecutionOrder(cls):
983 """This algorithm simultaneously fits the centroid and flux, and does
984 not require any previous centroid fit.
985 """
986 return cls.CENTROID_ORDER
987

◆ measureDipoles()

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.measureDipoles ( self,
measRecord,
exposure,
posExp = None,
negExp = None )
Perform the non-linear least squares minimization on the putative dipole source.

Parameters
----------
measRecord : `lsst.afw.table.SourceRecord`
    diaSources that will be measured using dipole measurement
exposure : `lsst.afw.image.Exposure`
    Difference exposure on which the diaSources were detected; `exposure = posExp-negExp`
    If both `posExp` and `negExp` are `None`, will attempt to fit the
    dipole to just the `exposure` with no constraint.
posExp : `lsst.afw.image.Exposure`, optional
    "Positive" exposure, typically a science exposure, or None if unavailable
    When `posExp` is `None`, will compute `posImage = exposure + negExp`.
negExp : `lsst.afw.image.Exposure`, optional
    "Negative" exposure, typically a template exposure, or None if unavailable
    When `negExp` is `None`, will compute `negImage = posExp - exposure`.

Notes
-----
The main functionality of this routine was placed outside of
this plugin (into `DipoleFitAlgorithm.fitDipole()`) so that
`DipoleFitAlgorithm.fitDipole()` can be called separately for
testing (@see `tests/testDipoleFitter.py`)

Definition at line 1058 of file dipoleFitTask.py.

1058 def measureDipoles(self, measRecord, exposure, posExp=None, negExp=None):
1059 """Perform the non-linear least squares minimization on the putative dipole source.
1060
1061 Parameters
1062 ----------
1063 measRecord : `lsst.afw.table.SourceRecord`
1064 diaSources that will be measured using dipole measurement
1065 exposure : `lsst.afw.image.Exposure`
1066 Difference exposure on which the diaSources were detected; `exposure = posExp-negExp`
1067 If both `posExp` and `negExp` are `None`, will attempt to fit the
1068 dipole to just the `exposure` with no constraint.
1069 posExp : `lsst.afw.image.Exposure`, optional
1070 "Positive" exposure, typically a science exposure, or None if unavailable
1071 When `posExp` is `None`, will compute `posImage = exposure + negExp`.
1072 negExp : `lsst.afw.image.Exposure`, optional
1073 "Negative" exposure, typically a template exposure, or None if unavailable
1074 When `negExp` is `None`, will compute `negImage = posExp - exposure`.
1075
1076 Notes
1077 -----
1078 The main functionality of this routine was placed outside of
1079 this plugin (into `DipoleFitAlgorithm.fitDipole()`) so that
1080 `DipoleFitAlgorithm.fitDipole()` can be called separately for
1081 testing (@see `tests/testDipoleFitter.py`)
1082 """
1083 result = None
1084 pks = measRecord.getFootprint().getPeaks()
1085
1086 # Check if the footprint consists of a putative dipole - else don't fit it.
1087 if (
1088 # One peak in the footprint (not a dipole)
1089 ((nPeaks := len(pks)) <= 1)
1090 # Peaks are the same sign (not a dipole); peaks are ordered
1091 # from highest to lowest.
1092 or (nPeaks > 1 and (np.sign(pks[0].getPeakValue())
1093 == np.sign(pks[-1].getPeakValue())))
1094 ):
1095 if not self.config.fitAllDiaSources:
1096 # Non-dipoles fall back on the centroid slot for positions,
1097 # errors, and the failure flag, if we're not fitting them.
1098 measRecord[self.centroidKey.getX()] = measRecord.getX()
1099 measRecord[self.centroidKey.getY()] = measRecord.getY()
1100 self.centroidKey.getCentroidErr().set(measRecord, measRecord.getCentroidErr())
1101 measRecord[self.flagKey] = measRecord.getCentroidFlag()
1102 return
1103
1104 # Footprint is too large (not a dipole).
1105 if ((area := measRecord.getFootprint().getArea()) > self.config.maxFootprintArea):
1106 self.fail(measRecord, measBase.MeasurementError(f"{area} > {self.config.maxFootprintArea}",
1107 self.FAILURE_TOO_LARGE))
1108
1109 try:
1110 alg = self.DipoleFitAlgorithmClass(exposure, posImage=posExp, negImage=negExp)
1111 result, _ = alg.fitDipole(
1112 measRecord, rel_weight=self.config.relWeight,
1113 tol=self.config.tolerance,
1114 maxSepInSigma=self.config.maxSeparation,
1115 fitBackground=self.config.fitBackground,
1116 separateNegParams=self.config.fitSeparateNegParams,
1117 verbose=False, display=False)
1118 except pexExcept.LengthError:
1119 self.fail(measRecord, measBase.MeasurementError('edge failure', self.FAILURE_EDGE))
1120 except Exception as e:
1121 errorMessage = f"Exception in dipole fit. {e.__class__.__name__}: {e}"
1122 self.fail(measRecord, measBase.MeasurementError(errorMessage, self.FAILURE_FIT))
1123
1124 self.log.debug("Dipole fit result: %d %s", measRecord.getId(), str(result))
1125
1126 if result is None:
1127 self.fail(measRecord, measBase.MeasurementError("bad dipole fit", self.FAILURE_FIT))
1128 return
1129
1130 # add chi2, coord/flux uncertainties (TBD), dipole classification
1131 # Add the relevant values to the measRecord
1132 measRecord[self.posFluxKey.getInstFlux()] = result.posFlux
1133 measRecord[self.posFluxKey.getInstFluxErr()] = result.signalToNoise # to be changed to actual sigma!
1134 measRecord[self.posCentroidKey.getX()] = result.posCentroidX
1135 measRecord[self.posCentroidKey.getY()] = result.posCentroidY
1136
1137 measRecord[self.negFluxKey.getInstFlux()] = result.negFlux
1138 measRecord[self.negFluxKey.getInstFluxErr()] = result.signalToNoise # to be changed to actual sigma!
1139 measRecord[self.negCentroidKey.getX()] = result.negCentroidX
1140 measRecord[self.negCentroidKey.getY()] = result.negCentroidY
1141
1142 # Dia source flux: average of pos+neg
1143 measRecord[self.fluxKey.getInstFlux()] = (abs(result.posFlux) + abs(result.negFlux))/2.
1144 measRecord[self.orientationKey] = result.orientation
1145 measRecord[self.separationKey] = np.sqrt((result.posCentroidX - result.negCentroidX)**2.
1146 + (result.posCentroidY - result.negCentroidY)**2.)
1147 measRecord[self.centroidKey.getX()] = result.centroidX
1148 measRecord[self.centroidKey.getY()] = result.centroidY
1149
1150 measRecord[self.signalToNoiseKey] = result.signalToNoise
1151 measRecord[self.chi2dofKey] = result.redChi2
1152
1153 if result.nData >= 1:
1154 measRecord[self.nDataKey] = result.nData
1155 else:
1156 measRecord[self.nDataKey] = 0
1157
1158 self.doClassify(measRecord, result.chi2)
1159
Reports attempts to exceed implementation-defined length limits for some classes.
Definition Runtime.h:76

Member Data Documentation

◆ centroidKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.centroidKey

Definition at line 1017 of file dipoleFitTask.py.

◆ chi2dofKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.chi2dofKey

Definition at line 1030 of file dipoleFitTask.py.

◆ classificationAttemptedFlagKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.classificationAttemptedFlagKey

Definition at line 1046 of file dipoleFitTask.py.

◆ classificationFlagKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.classificationFlagKey

Definition at line 1042 of file dipoleFitTask.py.

◆ ConfigClass

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.ConfigClass = DipoleFitPluginConfig
static

Definition at line 973 of file dipoleFitTask.py.

◆ DipoleFitAlgorithmClass

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.DipoleFitAlgorithmClass = DipoleFitAlgorithm
static

Definition at line 974 of file dipoleFitTask.py.

◆ edgeFlagKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.edgeFlagKey

Definition at line 1054 of file dipoleFitTask.py.

◆ FAILURE_EDGE [1/2]

int lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_EDGE = 1
static

Definition at line 976 of file dipoleFitTask.py.

◆ FAILURE_EDGE [2/2]

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_EDGE

Definition at line 1119 of file dipoleFitTask.py.

◆ FAILURE_FIT [1/2]

int lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_FIT = 2
static

Definition at line 977 of file dipoleFitTask.py.

◆ FAILURE_FIT [2/2]

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_FIT

Definition at line 1122 of file dipoleFitTask.py.

◆ FAILURE_NOT_DIPOLE

int lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_NOT_DIPOLE = 4
static

Definition at line 978 of file dipoleFitTask.py.

◆ FAILURE_TOO_LARGE [1/2]

int lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_TOO_LARGE = 8
static

Definition at line 979 of file dipoleFitTask.py.

◆ FAILURE_TOO_LARGE [2/2]

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.FAILURE_TOO_LARGE

Definition at line 1107 of file dipoleFitTask.py.

◆ flagKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.flagKey

Definition at line 1050 of file dipoleFitTask.py.

◆ fluxKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.fluxKey

Definition at line 1007 of file dipoleFitTask.py.

◆ log

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.log

Definition at line 993 of file dipoleFitTask.py.

◆ nDataKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.nDataKey

Definition at line 1034 of file dipoleFitTask.py.

◆ negCentroidKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.negCentroidKey

Definition at line 1013 of file dipoleFitTask.py.

◆ negFluxKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.negFluxKey

Definition at line 1003 of file dipoleFitTask.py.

◆ orientationKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.orientationKey

Definition at line 1022 of file dipoleFitTask.py.

◆ posCentroidKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.posCentroidKey

Definition at line 1009 of file dipoleFitTask.py.

◆ posFluxKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.posFluxKey

Definition at line 1000 of file dipoleFitTask.py.

◆ separationKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.separationKey

Definition at line 1026 of file dipoleFitTask.py.

◆ signalToNoiseKey

lsst.ip.diffim.dipoleFitTask.DipoleFitPlugin.signalToNoiseKey

Definition at line 1038 of file dipoleFitTask.py.


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