29 LOG_LOGGER _log =
LOG_GET(
"jointcal.Associations");
45 auto ccdImage = std::make_shared<CcdImage>(catalog, wcs, visitInfo, bbox, filter, photoCalib, detector,
53 _commonTangentPoint =
Point(commonTangentPoint.getX(), commonTangentPoint.getY());
54 for (
auto &
ccdImage : ccdImageList)
ccdImage->setCommonTangentPoint(_commonTangentPoint);
58 const bool enlargeFittedList) {
63 for (
auto &item : fittedStarList) {
64 item->clearBeforeAssoc();
67 if (!useFittedList) fittedStarList.clear();
69 for (
auto &
ccdImage : ccdImageList) {
70 const Gtransfo *toCommonTangentPlane =
ccdImage->getPix2CommonTangentPlane();
75 ccdImage->getCatalogForFit().clear();
85 ccdImageFrameCPT = ccdImageFrameCPT.
rescale(1.10);
91 for (
auto const &fittedStar : fittedStarList) {
92 if (ccdImageFrameCPT.inFrame(*fittedStar)) {
99 toCommonTangentPlane, matchCutInArcSec / 3600.);
102 LOGLS_DEBUG(_log,
"Measured-to-Fitted matches before removing ambiguities " << starMatchList->size());
103 starMatchList->removeAmbiguities(*toCommonTangentPlane);
104 LOGLS_DEBUG(_log,
"Measured-to-Fitted matches after removing ambiguities " << starMatchList->size());
109 int matchedCount = 0;
110 for (
auto const &starMatch : *starMatchList) {
111 auto bs = starMatch.s1;
114 auto bs2 = starMatch.s2;
117 ms->setFittedStar(fs);
120 LOGLS_INFO(_log,
"Matched " << matchedCount <<
" objects in " <<
ccdImage->getName());
123 int unMatchedCount = 0;
124 for (
auto const &mstar : catalog) {
126 if (mstar->getFittedStar())
continue;
127 if (enlargeFittedList) {
128 auto fs = std::make_shared<FittedStar>(*mstar);
131 fittedStarList.push_back(fs);
132 mstar->setFittedStar(fs);
136 LOGLS_INFO(_log,
"Unmatched objects: " << unMatchedCount);
146 bool rejectBadFluxes) {
147 if (refCat.
size() == 0) {
149 " reference catalog is empty : stop here "));
153 auto fluxKey = refCat.
getSchema().find<
double>(fluxField).key;
157 fluxErrKey = refCat.
getSchema().find<
double>(fluxField +
"Sigma").key;
160 << fluxField <<
"Sigma" 161 <<
") not found in reference catalog. Not using ref flux errors.");
164 _filterMap.reserve(refFluxMap.size());
166 for (
auto const &filter : refFluxMap) {
167 _filterMap[filter.first] = nFilters;
172 for (
size_t i = 0; i < refCat.
size(); i++) {
173 auto const &record = refCat.
get(i);
177 double defaultFluxErr;
178 if (fluxErrKey.isValid()) {
185 for (
auto const &filter : _filterMap) {
186 fluxList[filter.second] = refFluxMap.
at(filter.first).at(i) /
JanskyToMaggy;
187 fluxErrList[filter.second] = refFluxErrMap.
at(filter.first).at(i) /
JanskyToMaggy;
191 auto star = std::make_shared<RefStar>(ra, dec, defaultFlux, defaultFluxErr, fluxList, fluxErrList);
202 if (rejectBadFluxes &&
205 refStarList.push_back(star);
217 Frame tangentPlaneFrame;
219 for (
auto const &
ccdImage : ccdImageList) {
222 if (tangentPlaneFrame.
getArea() == 0)
223 tangentPlaneFrame = CTPFrame;
225 tangentPlaneFrame += CTPFrame;
240 void Associations::associateRefStars(
double matchCutInArcSec,
const Gtransfo *
gtransfo) {
244 matchCutInArcSec / 3600.);
246 LOGLS_DEBUG(_log,
"Refcat matches before removing ambiguities " << starMatchList->size());
247 starMatchList->removeAmbiguities(*gtransfo);
248 LOGLS_DEBUG(_log,
"Refcat matches after removing ambiguities " << starMatchList->size());
251 for (
auto const &starMatch : *starMatchList) {
255 const BaseStar &bs2 = *starMatch.s2;
263 "Associated " << starMatchList->size() <<
" reference stars among " << refStarList.size());
267 LOGLS_INFO(_log,
"Fitted stars before measurement # cut: " << fittedStarList.size());
271 for (
auto const &
ccdImage : ccdImageList) {
285 if (!fstar->getRefStar() && fstar->getMeasurementCount() < minMeasurements) {
288 mi = catalog.
erase(mi);
298 if ((*fi)->getMeasurementCount() == 0)
299 fi = fittedStarList.erase(fi);
304 LOGLS_INFO(_log,
"Fitted stars after measurement # cut: " << fittedStarList.size());
307 void Associations::assignMags() {
308 for (
auto const &
ccdImage : ccdImageList) {
310 for (
auto const &mstar : catalog) {
311 auto fstar = mstar->getFittedStar();
312 if (!fstar)
continue;
323 if (!fittedStarList.inTangentPlaneCoordinates) {
325 "DeprojectFittedStars: Fitted stars are already in sidereal coordinates, nothing done ");
330 fittedStarList.applyTransfo(ctp2Sky);
331 fittedStarList.inTangentPlaneCoordinates =
false;
336 return item->getCatalogForFit().size() > 0;
342 for (
auto const &fittedStar : fittedStarList) {
343 if ((fittedStar !=
nullptr) & (fittedStar->getRefStar() !=
nullptr)) count++;
349 void Associations::collectMCStars(
int realization) {
353 for (I = ccdImageList.begin(); I != ccdImageList.end(); I++) {
355 string dbimdir = ccdImage.Dir();
356 string mctruth = dbimdir +
"/mc/mctruth.list";
358 if (realization >= 0) {
360 sstrm << dbimdir <<
"/mc/mctruth_" << realization <<
".list";
361 mctruth = sstrm.
str();
368 DicStarList mctruthlist(mctruth);
372 for (smI = starMatchList->begin(); smI != starMatchList->end(); smI++) {
377 DicStar *dstar =
dynamic_cast<DicStar *
>(bs);
379 mcstar->GetMCInfo().iflux = dstar->getval(
"iflux");
380 mcstar->GetMCInfo().tflux = dstar->getval(
"sflux");
387 LOGLS_FATAL(_log,
"CollectMCStars Unable to match MCTruth w/ catalog!");
392 double matchCutArcSec) {
394 size_t pos_minus = color.
find(
'-');
395 bool compute_diff = (pos_minus != string::npos);
397 c1 = color.
substr(0, pos_minus);
398 if (compute_diff) c2 = color.
substr(pos_minus + 1, string::npos);
399 DicStarList cList(dicStarListName);
400 if (!cList.HasKey(c1))
401 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
402 " misses a key named \"" + c1 +
"\""));
403 if (compute_diff && !cList.HasKey(c2))
404 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
405 " misses a key named \"" + c2 +
"\""));
413 if (fittedStarList.inTangentPlaneCoordinates) id_or_proj = &id;
418 id_or_proj, matchCutArcSec / 3600);
420 LOGLS_INFO(_log,
"Matched " << starMatchList->size() <<
'/' << fittedStarList.size()
421 <<
" FittedStars to color catalog");
423 for (
auto i = starMatchList->begin(); i != starMatchList->end(); ++i) {
427 const TStar *ts =
dynamic_cast<const TStar *
>(s2);
428 const DicStar *ds =
dynamic_cast<const DicStar *
>(ts->get_original());
429 fs->
color = ds->getval(c1);
430 if (compute_diff) fs->
color -= ds->getval(c2);
#define LOGLS_WARN(logger, message)
Objects used as position anchors, typically USNO stars.
implements the linear transformations (6 real coefficients).
int nCcdImagesValidForFit() const
return the number of CcdImages with non-empty catalogs to-be-fit.
lsst::afw::geom::Angle getLongitude() const
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.
constexpr double asArcseconds() const noexcept
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.
lsst::afw::geom::Angle getLatitude() const
Frame rescale(const double factor) const
rescale it. The center does not move.
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, bool rejectBadFluxes=false)
Collect stars from an external reference catalog and associate them with fittedStars.
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.
size_t nFittedStarsWithAssociatedRefStar() const
Return the number of fittedStars that have an associated refStar.
rectangle with sides parallel to axes.
#define LOGLS_DEBUG(logger, message)
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.
T dynamic_pointer_cast(T... args)
::std::list< StarMatch >::iterator StarMatchIterator
void deprojectFittedStars()
Sends back the fitted stars coordinates on the sky FittedStarsList::inTangentPlaneCoordinates keeps t...
#define LOGLS_INFO(logger, message)
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.
#define LSST_EXCEPT(type,...)
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)
constexpr double radToDeg(double x) noexcept
std::shared_ptr< RecordT > const get(size_type i) const
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" ;
#define LOGLS_FATAL(logger, message)
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.