46 template <
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();