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;
335 void Associations::collectMCStars(
int realization) {
339 for (I = ccdImageList.begin(); I != ccdImageList.end(); I++) {
341 string dbimdir = ccdImage.Dir();
342 string mctruth = dbimdir +
"/mc/mctruth.list";
344 if (realization >= 0) {
346 sstrm << dbimdir <<
"/mc/mctruth_" << realization <<
".list";
347 mctruth = sstrm.
str();
354 DicStarList mctruthlist(mctruth);
358 for (smI = starMatchList->begin(); smI != starMatchList->end(); smI++) {
363 DicStar *dstar =
dynamic_cast<DicStar *
>(bs);
365 mcstar->GetMCInfo().iflux = dstar->getval(
"iflux");
366 mcstar->GetMCInfo().tflux = dstar->getval(
"sflux");
373 LOGLS_FATAL(_log,
"CollectMCStars Unable to match MCTruth w/ catalog!");
378 double matchCutArcSec) {
380 size_t pos_minus = color.
find(
'-');
381 bool compute_diff = (pos_minus != string::npos);
383 c1 = color.
substr(0, pos_minus);
384 if (compute_diff) c2 = color.
substr(pos_minus + 1, string::npos);
385 DicStarList cList(dicStarListName);
386 if (!cList.HasKey(c1))
387 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
388 " misses a key named \"" + c1 +
"\""));
389 if (compute_diff && !cList.HasKey(c2))
390 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
391 " misses a key named \"" + c2 +
"\""));
399 if (fittedStarList.inTangentPlaneCoordinates) id_or_proj = &id;
404 id_or_proj, matchCutArcSec / 3600);
406 LOGLS_INFO(_log,
"Matched " << starMatchList->size() <<
'/' << fittedStarList.size()
407 <<
" FittedStars to color catalog");
409 for (
auto i = starMatchList->begin(); i != starMatchList->end(); ++i) {
413 const TStar *ts =
dynamic_cast<const TStar *
>(s2);
414 const DicStar *ds =
dynamic_cast<const DicStar *
>(ts->get_original());
415 fs->
color = ds->getval(c1);
416 if (compute_diff) fs->
color -= ds->getval(c2);
Objects used as position anchors, typically USNO stars.
implements the linear transformations (6 real coefficients).
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
#define LOGLS_FATAL(logger, message)
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.
#define LOGLS_INFO(logger, message)
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.
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.
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...
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)
#define LOGLS_DEBUG(logger, message)
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" ;
Handler of an actual image from a single CCD.
const double JanskyToMaggy
The objects which have been measured several times.
#define LOGLS_WARN(logger, message)
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.