6 #include "lsst/log/Log.h" 15 #include "lsst/afw/image/Image.h" 16 #include "lsst/afw/image/VisitInfo.h" 17 #include "lsst/daf/base/PropertySet.h" 19 #include "lsst/pex/exceptions.h" 20 #include "lsst/afw/geom/Box.h" 21 #include "lsst/afw/geom/Point.h" 22 #include "lsst/afw/coord/Coord.h" 23 #include "lsst/afw/image/Calib.h" 28 LOG_LOGGER _log = LOG_GET(
"jointcal.Associations");
38 std::shared_ptr<lsst::afw::image::TanWcs> wcs,
39 std::shared_ptr<lsst::afw::image::VisitInfo> visitInfo,
40 lsst::afw::geom::Box2I
const &bbox, std::string
const &filter,
41 std::shared_ptr<afw::image::PhotoCalib> photoCalib,
42 std::shared_ptr<afw::cameraGeom::Detector> detector,
int visit,
int ccd,
44 auto ccdImage = std::make_shared<CcdImage>(catalog, wcs, visitInfo, bbox, filter, photoCalib, detector,
47 LOGLS_DEBUG(_log,
"Catalog " <<
ccdImage->getName() <<
" has " <<
ccdImage->getWholeCatalog().size()
52 _commonTangentPoint =
Point(commonTangentPoint.getX(), commonTangentPoint.getY());
53 for (
auto &
ccdImage : ccdImageList)
ccdImage->setCommonTangentPoint(_commonTangentPoint);
57 const bool enlargeFittedList) {
62 for (
auto &item : fittedStarList) {
63 item->clearBeforeAssoc();
66 if (!useFittedList) fittedStarList.clear();
68 for (
auto &
ccdImage : ccdImageList) {
69 const Gtransfo *toCommonTangentPlane =
ccdImage->getPix2CommonTangentPlane();
74 ccdImage->getCatalogForFit().clear();
84 ccdImageFrameCPT = ccdImageFrameCPT.
rescale(1.10);
90 for (
auto const &fittedStar : fittedStarList) {
91 if (ccdImageFrameCPT.inFrame(*fittedStar)) {
92 toMatch.push_back(fittedStar);
98 toCommonTangentPlane, matchCutInArcSec / 3600.);
101 LOGLS_DEBUG(_log,
"Measured-to-Fitted matches before removing ambiguities " << starMatchList->size());
102 starMatchList->removeAmbiguities(*toCommonTangentPlane);
103 LOGLS_DEBUG(_log,
"Measured-to-Fitted matches after removing ambiguities " << starMatchList->size());
108 int matchedCount = 0;
109 for (
auto const &starMatch : *starMatchList) {
110 auto bs = starMatch.s1;
111 auto ms_const = std::dynamic_pointer_cast<
const MeasuredStar>(bs);
112 auto ms = std::const_pointer_cast<
MeasuredStar>(ms_const);
113 auto bs2 = starMatch.s2;
114 auto fs_const = std::dynamic_pointer_cast<
const FittedStar>(bs2);
115 auto fs = std::const_pointer_cast<
FittedStar>(fs_const);
116 ms->setFittedStar(fs);
119 LOGLS_INFO(_log,
"Matched " << matchedCount <<
" objects in " <<
ccdImage->getName());
122 int unMatchedCount = 0;
123 for (
auto const &mstar : catalog) {
125 if (mstar->getFittedStar())
continue;
126 if (enlargeFittedList) {
127 auto fs = std::make_shared<FittedStar>(*mstar);
130 fittedStarList.push_back(fs);
131 mstar->setFittedStar(fs);
135 LOGLS_INFO(_log,
"Unmatched objects: " << unMatchedCount);
142 afw::geom::Angle matchCut, std::string
const &fluxField,
143 std::map<std::string, std::vector<double>>
const &refFluxMap,
144 std::map<std::string, std::vector<double>>
const &refFluxErrMap) {
145 if (refCat.size() == 0) {
146 throw(LSST_EXCEPT(pex::exceptions::InvalidParameterError,
147 " reference catalog is empty : stop here "));
150 afw::table::CoordKey coordKey = refCat.getSchema()[
"coord"];
151 auto fluxKey = refCat.getSchema().find<
double>(fluxField).key;
153 afw::table::Key<double> fluxErrKey;
155 fluxErrKey = refCat.getSchema().find<
double>(fluxField +
"Sigma").key;
156 }
catch (pex::exceptions::NotFoundError &) {
157 LOGLS_WARN(_log,
"Flux error field (" 158 << fluxField <<
"Sigma" 159 <<
") not found in reference catalog. Not using ref flux errors.");
162 _filterMap.reserve(refFluxMap.size());
164 for (
auto const &filter : refFluxMap) {
165 _filterMap[filter.first] = nFilters;
170 for (
size_t i = 0; i < refCat.size(); i++) {
171 auto const &record = refCat.get(i);
173 afw::coord::Coord coord = record->get(coordKey);
175 double defaultFluxErr;
176 if (fluxErrKey.isValid()) {
179 defaultFluxErr = std::numeric_limits<double>::quiet_NaN();
181 std::vector<double> fluxList(nFilters);
182 std::vector<double> fluxErrList(nFilters);
183 for (
auto const &filter : _filterMap) {
184 fluxList[filter.second] = refFluxMap.at(filter.first).at(i) /
JanskyToMaggy;
185 fluxErrList[filter.second] = refFluxErrMap.at(filter.first).at(i) /
JanskyToMaggy;
187 double ra = lsst::afw::geom::radToDeg(coord.getLongitude());
188 double dec = lsst::afw::geom::radToDeg(coord.getLatitude());
189 auto star = std::make_shared<RefStar>(ra, dec, defaultFlux, defaultFluxErr, fluxList, fluxErrList);
195 star->vx = std::pow(0.1 / 3600 / cos(coord.getLatitude()), 2);
196 star->vy = std::pow(0.1 / 3600, 2);
199 refStarList.push_back(star);
206 associateRefStars(matchCut.asArcseconds(), &raDec2CTP);
211 Frame tangentPlaneFrame;
213 for (
auto const &
ccdImage : ccdImageList) {
216 if (tangentPlaneFrame.
getArea() == 0)
217 tangentPlaneFrame = CTPFrame;
219 tangentPlaneFrame += CTPFrame;
227 lsst::afw::geom::Point<double> min(raDecFrame.
xMin, raDecFrame.
yMin);
228 lsst::afw::geom::Point<double> max(raDecFrame.
xMax, raDecFrame.
yMax);
229 lsst::afw::geom::Box2D box(min, max);
234 void Associations::associateRefStars(
double matchCutInArcSec,
const Gtransfo *
gtransfo) {
238 matchCutInArcSec / 3600.);
240 LOGLS_DEBUG(_log,
"Refcat matches before removing ambiguities " << starMatchList->size());
241 starMatchList->removeAmbiguities(*gtransfo);
242 LOGLS_DEBUG(_log,
"Refcat matches after removing ambiguities " << starMatchList->size());
245 for (
auto const &starMatch : *starMatchList) {
249 const BaseStar &bs2 = *starMatch.s2;
257 "Associated " << starMatchList->size() <<
" reference stars among " << refStarList.size());
261 LOGLS_INFO(_log,
"Fitted stars before measurement # cut: " << fittedStarList.size());
265 for (
auto const &
ccdImage : ccdImageList) {
279 if (!fstar->getRefStar() && fstar->getMeasurementCount() < minMeasurements) {
280 auto f = std::const_pointer_cast<
FittedStar>(fstar);
282 mi = catalog.erase(mi);
292 if ((*fi)->getMeasurementCount() == 0)
293 fi = fittedStarList.erase(fi);
298 LOGLS_INFO(_log,
"Fitted stars after measurement # cut: " << fittedStarList.size());
301 void Associations::assignMags() {
302 for (
auto const &
ccdImage : ccdImageList) {
304 for (
auto const &mstar : catalog) {
305 auto fstar = mstar->getFittedStar();
306 if (!fstar)
continue;
307 auto f = std::const_pointer_cast<
FittedStar>(fstar);
317 if (!fittedStarList.inTangentPlaneCoordinates) {
319 "DeprojectFittedStars: Fitted stars are already in sidereal coordinates, nothing done ");
324 fittedStarList.applyTransfo(ctp2Sky);
325 fittedStarList.inTangentPlaneCoordinates =
false;
329 void Associations::collectMCStars(
int realization) {
333 for (I = ccdImageList.begin(); I != ccdImageList.end(); I++) {
335 string dbimdir = ccdImage.Dir();
336 string mctruth = dbimdir +
"/mc/mctruth.list";
338 if (realization >= 0) {
340 sstrm << dbimdir <<
"/mc/mctruth_" << realization <<
".list";
341 mctruth = sstrm.str();
348 DicStarList mctruthlist(mctruth);
352 for (smI = starMatchList->begin(); smI != starMatchList->end(); smI++) {
357 DicStar *dstar =
dynamic_cast<DicStar *
>(bs);
358 std::unique_ptr<BaseStarWithError> mcstar(
new BaseStarWithError(*bs));
359 mcstar->GetMCInfo().iflux = dstar->getval(
"iflux");
360 mcstar->GetMCInfo().tflux = dstar->getval(
"sflux");
367 LOGLS_FATAL(_log,
"CollectMCStars Unable to match MCTruth w/ catalog!");
371 void Associations::setFittedStarColors(std::string dicStarListName, std::string color,
372 double matchCutArcSec) {
374 size_t pos_minus = color.find(
'-');
375 bool compute_diff = (pos_minus != string::npos);
377 c1 = color.substr(0, pos_minus);
378 if (compute_diff) c2 = color.substr(pos_minus + 1, string::npos);
379 DicStarList cList(dicStarListName);
380 if (!cList.HasKey(c1))
381 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
382 " misses a key named \"" + c1 +
"\""));
383 if (compute_diff && !cList.HasKey(c2))
384 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
385 " misses a key named \"" + c2 +
"\""));
393 if (fittedStarList.inTangentPlaneCoordinates) id_or_proj = &id;
398 id_or_proj, matchCutArcSec / 3600);
400 LOGLS_INFO(_log,
"Matched " << starMatchList->size() <<
'/' << fittedStarList.size()
401 <<
" FittedStars to color catalog");
403 for (
auto i = starMatchList->begin(); i != starMatchList->end(); ++i) {
407 const TStar *ts =
dynamic_cast<const TStar *
>(s2);
408 const DicStar *ds =
dynamic_cast<const DicStar *
>(ts->get_original());
409 fs->
color = ds->getval(c1);
410 if (compute_diff) fs->
color -= ds->getval(c2);
Objects used as position anchors, typically USNO stars.
implements the linear transformations (6 real coefficients).
MeasuredStarList::iterator MeasuredStarIterator
A hanger for star associations.
the transformation that handles pix to sideral transfos (Gnomonic, possibly with polynomial distortio...
void addMagMeasurement(double magValue, double magWeight)
this routine will hopefully soon disappear.
int getMeasurementCount() const
double xMin
coordinate of boundary.
void associateCatalogs(const double matchCutInArcsec=0, const bool useFittedList=false, const bool enlargeFittedList=true)
incrementaly builds a merged catalog of all image catalogs
A list of MeasuredStar. They are usually filled in Associations::AddImage.
Frame rescale(const double factor) const
rescale it. The center does not move.
void selectFittedStars(int minMeasurements)
Set the color field of FittedStar 's from a colored catalog.
The base class for handling stars. Used by all matching routines.
void collectRefStars(lsst::afw::table::SortedCatalogT< lsst::afw::table::SimpleRecord > &refCat, afw::geom::Angle matchCut, std::string const &fluxField, std::map< std::string, std::vector< double >> const &refFluxMap, std::map< std::string, std::vector< double >> const &refFluxErrMap)
Collect stars from an external reference catalog and associate them with fittedStars.
rectangle with sides parallel to axes.
Class for a simple mapping implementing a generic Gtransfo.
void setRefStar(const RefStar *_refStar)
Set the astrometric reference star associated with this star.
FittedStarList::iterator FittedStarIterator
A list of FittedStar s. Such a list is typically constructed by Associations.
std::unique_ptr< StarMatchList > listMatchCollect(const BaseStarList &list1, const BaseStarList &list2, const Gtransfo *guess, const double maxDist)
assembles star matches.
virtual void transformPosAndErrors(const FatPoint &in, FatPoint &out) const
objects measured on actual images.
::std::list< StarMatch >::iterator StarMatchIterator
void deprojectFittedStars()
Sends back the fitted stars coordinates on the sky FittedStarsList::inTangentPlaneCoordinates keeps t...
void setCommonTangentPoint(lsst::afw::geom::Point2D const &commonTangentPoint)
Sets a shared tangent point for all ccdImages.
A do-nothing transformation. It anyway has dummy routines to mimick a Gtransfo.
std::shared_ptr< const FittedStar > getFittedStar() const
This one is the Tangent Plane (called gnomonic) projection (from celestial sphere to tangent plane) ...
MeasuredStarList const & getCatalogForFit() const
Gets the catalog to be used for fitting, which may have been cleaned-up.
Combinatorial searches for linear transformations to go from list1 to list2.
BaseStarList & Fitted2Base(FittedStarList &This)
a virtual (interface) class for geometric transformations.
std::shared_ptr< const BaseStar > s2
const lsst::afw::geom::Box2D getRaDecBBox()
BaseStarList & Measured2Base(MeasuredStarList &This)
std::shared_ptr< const BaseStar > s1
Frame applyTransfo(const Frame &inputframe, const Gtransfo >ransfo, const WhichTransformed which)
Transform a Frame through a Transfo.
std::string sourceFluxField
"name of flux field in source catalog" ;
Handler of an actual image from a single CCD.
const double JanskyToMaggy
The objects which have been measured several times.
BaseStarList & Ref2Base(RefStarList &This)
void addImage(lsst::afw::table::SortedCatalogT< lsst::afw::table::SourceRecord > &catalog, std::shared_ptr< lsst::afw::image::TanWcs > wcs, std::shared_ptr< lsst::afw::image::VisitInfo > visitInfo, lsst::afw::geom::Box2I const &bbox, std::string const &filter, std::shared_ptr< afw::image::PhotoCalib > photoCalib, std::shared_ptr< afw::cameraGeom::Detector > detector, int visit, int ccd, lsst::jointcal::JointcalControl const &control)
Create a ccdImage from an exposure catalog and metadata, and add it to the list.