46template <
typename KeyType,
typename ValueType>
50 for (
auto const &i : map) {
66 int chipOrder,
int visitOrder)
68 _skyToTangentPlane(projectionHandler) {
74 for (
auto &ccdImage : ccdImageList) {
78 auto visitp = _visitMap.find(visit);
79 if (visitp == _visitMap.end()) {
83 auto chipp = _chipMap.find(chip);
84 if (chipp == _chipMap.end()) {
87 if (radius2 < minRadius2) {
89 constrainedChip = chip;
99 _chipMap[chip] = std::make_shared<SimplePolyMapping>(shiftAndNormalize,
100 pol * shiftAndNormalize.
inverted());
105 _chipMap.at(constrainedChip)->setToBeFit(
false);
108 for (
auto &ccdImage : ccdImageList) {
115 if (_chipMap.find(chip) == _chipMap.end()) {
116 LOGLS_WARN(
_log,
"Chip " << chip <<
" is missing in the reference exposure, expect troubles.");
121 _mappings[ccdImage->getHashKey()] =
122 std::make_unique<ChipVisitAstrometryMapping>(_chipMap[chip], _visitMap[visit]);
124 LOGLS_INFO(
_log,
"Got " << _chipMap.size() <<
" chip mappings and " << _visitMap.size()
125 <<
" visit mappings; holding chip " << constrainedChip <<
" fixed ("
127 LOGLS_DEBUG(
_log,
"CcdImage map has " << _mappings.size() <<
" mappings, with "
128 << _mappings.bucket_count() <<
" buckets and a load factor of "
129 << _mappings.load_factor());
133 return findMapping(ccdImage);
141 Eigen::Index firstIndex) {
142 Eigen::Index index = firstIndex;
143 if (whatToFit.
find(
"Distortions") == std::string::npos) {
144 LOGLS_ERROR(
_log,
"assignIndices was called and Distortions is *not* in whatToFit");
148 _fittingChips = (whatToFit.
find(
"DistortionsChip") != std::string::npos);
149 _fittingVisits = (whatToFit.
find(
"DistortionsVisit") != std::string::npos);
151 if ((!_fittingChips) && (!_fittingVisits)) {
152 _fittingChips = _fittingVisits =
true;
155 for (
auto &i : _chipMap) {
156 i.second->setIndex(index);
157 index += i.second->getNpar();
160 for (
auto &i : _visitMap) {
161 i.second->setIndex(index);
162 index += i.second->getNpar();
165 for (
auto &i : _mappings) {
166 i.second->setWhatToFit(_fittingChips, _fittingVisits);
173 for (
auto &i : _chipMap) {
174 auto mapping = i.second.get();
175 mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
178 for (
auto &i : _visitMap) {
179 auto mapping = i.second.get();
180 mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
185 for (
auto i = _visitMap.begin(); i != _visitMap.end(); ++i) i->second->freezeErrorTransform();
186 for (
auto i = _chipMap.begin(); i != _chipMap.end(); ++i) i->second->freezeErrorTransform();
190 auto chipp = _chipMap.find(chip);
191 if (chipp == _chipMap.end()) {
193 errMsg <<
"No such chipId: " << chip <<
" among ";
194 outputMapKeys(_chipMap, errMsg);
198 return chipp->second->getTransform();
205 for (
auto i = _visitMap.begin(); i != _visitMap.end(); ++i) res.
push_back(i->first);
210 auto visitp = _visitMap.find(visit);
211 if (visitp == _visitMap.end()) {
213 errMsg <<
"No such visitId: " << visit <<
" among ";
214 outputMapKeys(_visitMap, errMsg);
218 return visitp->second->getTransform();
223 for (
auto &i : _chipMap) {
224 total += i.second->getNpar();
226 for (
auto &i : _visitMap) {
227 total += i.second->getNpar();
249 auto iwcToSkyMap = iwcToSkyWcs->getFrameDict()->getMapping(
"PIXELS",
"SKY");
250 auto skyFrame = iwcToSkyWcs->getFrameDict()->getFrame(
"SKY");
253 frameDict.
addFrame(
"PIXELS", *pixelsToFocal, focalFrame);
254 frameDict.
addFrame(
"FOCAL", *focalToIwc, iwcFrame);
255 frameDict.
addFrame(
"IWC", *iwcToSkyMap, *skyFrame);
256 return std::make_shared<afw::geom::SkyWcs>(frameDict);
260 out <<
"Constrained Astrometry Model (" << _mappings.size() <<
" composite mappings; " << _chipMap.size()
261 <<
" sensor mappings, " << _visitMap.size() <<
" visit mappings):" <<
std::endl;
263 out <<
"Sensor to sky transforms:" <<
std::endl;
264 for (
auto &i : _mappings) {
271 auto i = _mappings.find(ccdImage.
getHashKey());
272 if (i == _mappings.end())
274 "ConstrainedAstrometryModel cannot find CcdImage " + ccdImage.
getName());
275 return i->second.get();
#define LOGLS_WARN(logger, message)
#define LOGLS_INFO(logger, message)
#define LOGLS_ERROR(logger, message)
#define LOGLS_DEBUG(logger, message)
#define LSST_EXCEPT(type,...)
void addFrame(int iframe, Mapping const &map, Frame const &frame) override
virtual class needed in the abstraction of the distortion model
Interface between AstrometryFit and the combinations of Mappings from pixels to some tangent plane (a...
LOG_LOGGER _log
lsst.logging instance, to be created by a subclass so that messages have consistent name.
Handler of an actual image from a single CCD.
CcdIdType getCcdId() const
returns ccd ID
std::shared_ptr< afw::cameraGeom::Detector > getDetector() const
VisitIdType getVisit() const
returns visit ID
Frame const & getImageFrame() const
Frame in pixels.
std::string getName() const
Return the _name that identifies this ccdImage.
CcdImageKey getHashKey() const
ConstrainedAstrometryModel(CcdImageList const &ccdImageList, std::shared_ptr< ProjectionHandler const > projectionHandler, int chipOrder, int visitOrder)
std::size_t getTotalParameters() const override
Return the total number of parameters in this model.
void offsetParams(Eigen::VectorXd const &Delta) override
Dispaches the offsets after a fit step into the actual locations of parameters.
void freezeErrorTransform() override
From there on, measurement errors are propagated using the current transforms (and no longer evolve).
void print(std::ostream &out) const override
Print a string representation of the contents of this mapping, for debugging.
AstrometryTransform const & getChipTransform(CcdIdType const chip) const
Access to mappings.
AstrometryTransform const & getVisitTransform(VisitIdType const &visit) const
Access to mappings.
const std::shared_ptr< AstrometryTransform const > getSkyToTangentPlane(CcdImage const &ccdImage) const override
The mapping of sky coordinates (i.e.
std::vector< VisitIdType > getVisits() const
Access to array of visits involved in the solution.
Eigen::Index assignIndices(std::string const &whatToFit, Eigen::Index firstIndex) override
Positions the various parameter sets into the parameter vector, starting at firstIndex.
std::shared_ptr< afw::geom::SkyWcs > makeSkyWcs(CcdImage const &ccdImage) const override
Make a SkyWcs that contains this model.
AstrometryMapping const * getMapping(CcdImage const &) const override
Mapping associated to a given CcdImage.
rectangle with sides parallel to axes.
CameraSys const FOCAL_PLANE
CameraSysPrefix const PIXELS
std::shared_ptr< SkyWcs > makeSkyWcs(daf::base::PropertySet &metadata, bool strip=false)
Eigen::Matrix2d makeCdMatrix(lsst::geom::Angle const &scale, lsst::geom::Angle const &orientation=0 *lsst::geom::degrees, bool flipX=false)
constexpr AngleUnit degrees
AstrometryTransformLinear normalizeCoordinatesTransform(const Frame &frame)
Returns the transformation that maps the input frame along both axes to [-1,1].
Class for a simple mapping implementing a generic AstrometryTransform.