20 LOG_LOGGER _log =
LOG_GET(
"jointcal.ConstrainedAstrometryModel");
25 template <
typename KeyType,
typename ValueType>
29 for (
auto const &i : map) {
43 ConstrainedAstrometryModel::ConstrainedAstrometryModel(
45 int chipOrder,
int visitOrder)
46 : _sky2TP(projectionHandler) {
52 for (
auto &
ccdImage : ccdImageList) {
56 auto visitp = _visitMap.find(visit);
57 if (visitp == _visitMap.end()) {
60 auto chipp = _chipMap.find(chip);
61 if (chipp == _chipMap.end()) {
64 if (radius2 < minRadius2) {
66 constrainedChip = chip;
76 std::make_shared<SimplePolyMapping>(shiftAndNormalize, pol * shiftAndNormalize.invert());
81 _chipMap.at(constrainedChip)->setToBeFit(
false);
84 for (
auto &
ccdImage : ccdImageList) {
91 if (_chipMap.find(chip) == _chipMap.end()) {
92 LOGLS_WARN(_log,
"Chip " << chip <<
" is missing in the reference exposure, expect troubles.");
94 _chipMap[chip] = std::make_shared<SimplePolyMapping>(norm,
GtransfoPoly(chipOrder));
97 std::make_unique<TwoTransfoMapping>(_chipMap[chip], _visitMap[visit]);
99 LOGLS_INFO(_log,
"Got " << _chipMap.size() <<
" chip mappings and " << _visitMap.size()
100 <<
" visit mappings; holding chip " << constrainedChip <<
" fixed (" 102 LOGLS_DEBUG(_log,
"CcdImage map has " << _mappings.size() <<
" mappings, with " 103 << _mappings.bucket_count() <<
" buckets and a load factor of " 104 << _mappings.load_factor());
108 return findMapping(ccdImage);
116 unsigned index = firstIndex;
117 if (whatToFit.
find(
"Distortions") == std::string::npos) {
118 LOGLS_ERROR(_log,
"assignIndices was called and Distortions is *not* in whatToFit");
122 _fittingChips = (whatToFit.
find(
"DistortionsChip") != std::string::npos);
123 _fittingVisits = (whatToFit.
find(
"DistortionsVisit") != std::string::npos);
125 if ((!_fittingChips) && (!_fittingVisits)) {
126 _fittingChips = _fittingVisits =
true;
129 for (
auto &i : _chipMap) {
130 i.second->setIndex(index);
131 index += i.second->getNpar();
134 for (
auto &i : _visitMap) {
135 i.second->setIndex(index);
136 index += i.second->getNpar();
139 for (
auto &i : _mappings) {
140 i.second->setWhatToFit(_fittingChips, _fittingVisits);
147 for (
auto &i : _chipMap) {
148 auto mapping = i.second.get();
149 mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
152 for (
auto &i : _visitMap) {
153 auto mapping = i.second.get();
154 mapping->offsetParams(delta.segment(mapping->getIndex(), mapping->getNpar()));
159 for (
auto i = _visitMap.begin(); i != _visitMap.end(); ++i) i->second->freezeErrorTransform();
160 for (
auto i = _chipMap.begin(); i != _chipMap.end(); ++i) i->second->freezeErrorTransform();
164 auto chipp = _chipMap.find(chip);
165 if (chipp == _chipMap.end()) {
167 errMsg <<
"No such chipId: " << chip <<
" among ";
168 outputMapKeys(_chipMap, errMsg);
172 return chipp->second->getTransfo();
179 for (
auto i = _visitMap.begin(); i != _visitMap.end(); ++i) res.
push_back(i->first);
184 auto visitp = _visitMap.find(visit);
185 if (visitp == _visitMap.end()) {
187 errMsg <<
"No such visitId: " << visit <<
" among ";
188 outputMapKeys(_visitMap, errMsg);
192 return visitp->second->getTransfo();
197 for (
auto &i : _chipMap) {
198 total += i.second->getNpar();
200 for (
auto &i : _visitMap) {
201 total += i.second->getNpar();
221 afw::geom::Point2D(0, 0),
222 afw::geom::SpherePoint(tangentPoint.x, tangentPoint.y, afw::geom::degrees),
224 auto iwcToSkyMap = iwcToSkyWcs->getFrameDict()->getMapping(
"PIXELS",
"SKY");
225 auto skyFrame = iwcToSkyWcs->getFrameDict()->getFrame(
"SKY");
228 frameDict.
addFrame(
"PIXELS", *pixelsToFocal, focalFrame);
229 frameDict.
addFrame(
"FOCAL", *focalToIwc, iwcFrame);
230 frameDict.
addFrame(
"IWC", *iwcToSkyMap, *skyFrame);
231 return std::make_shared<afw::geom::SkyWcs>(frameDict);
235 auto i = _mappings.find(ccdImage.
getHashKey());
236 if (i == _mappings.end())
238 "ConstrainedAstrometryModel cannot find CcdImage " + ccdImage.
getName());
239 return i->second.get();
unsigned assignIndices(std::string const &whatToFit, unsigned firstIndex) override
Positions the various parameter sets into the parameter vector, starting at firstIndex.
VisitIdType getVisit() const
returns visit ID
implements the linear transformations (6 real coefficients).
const std::shared_ptr< Gtransfo const > getSky2TP(CcdImage const &ccdImage) const override
The mapping of sky coordinates (i.e.
std::string getName() const
Return the _name that identifies this ccdImage.
CameraSysPrefix const PIXELS
std::vector< VisitIdType > getVisits() const
Access to array of visits involved in the solution.
CcdIdType getCcdId() const
returns ccd ID
Gtransfo const & getVisitTransfo(VisitIdType const &visit) const
Access to mappings.
Polynomial transformation class.
GtransfoLin normalizeCoordinatesTransfo(const Frame &frame)
Returns the transformation that maps the input frame along both axes to [-1,1].
AstrometryMapping const * getMapping(CcdImage const &) const override
Mapping associated to a given CcdImage.
#define LOGLS_INFO(logger, message)
void addFrame(int iframe, Mapping const &map, Frame const &frame) override
rectangle with sides parallel to axes.
Class for a simple mapping implementing a generic Gtransfo.
std::shared_ptr< afw::geom::SkyWcs > makeSkyWcs(CcdImage const &ccdImage) const override
Make a SkyWcs that contains this model.
void freezeErrorTransform() override
From there on, measurement errors are propagated using the current transfos (and no longer evolve)...
T dynamic_pointer_cast(T... args)
Gtransfo const & getChipTransfo(CcdIdType const chip) const
Access to mappings.
#define LSST_EXCEPT(type,...)
void offsetParams(Eigen::VectorXd const &Delta) override
Dispaches the offsets after a fit step into the actual locations of parameters.
This one is the Tangent Plane (called gnomonic) projection (from celestial sphere to tangent plane) ...
int getTotalParameters() const override
Return the total number of parameters in this model.
a virtual (interface) class for geometric transformations.
std::shared_ptr< SkyWcs > makeSkyWcs(daf::base::PropertySet &metadata, bool strip=false)
#define LOGLS_DEBUG(logger, message)
Eigen::Matrix2d makeCdMatrix(lsst::geom::Angle const &scale, lsst::geom::Angle const &orientation=0 *lsst::geom::degrees, bool flipX=false)
virtual class needed in the abstraction of the distortion model
CcdImageKey getHashKey() const
std::shared_ptr< afw::cameraGeom::Detector > getDetector() const
Handler of an actual image from a single CCD.
CameraSys const FOCAL_PLANE
Frame const & getImageFrame() const
Frame in pixels.
#define LOGLS_ERROR(logger, message)
#define LOGLS_WARN(logger, message)