52 LOG_LOGGER _log =
LOG_GET(
"jointcal.Associations");
61 lsst::afw::geom::Box2I
const &bbox,
std::string const &filter,
65 auto ccdImage = std::make_shared<CcdImage>(catalog, wcs, visitInfo, bbox, filter, photoCalib, detector,
74 centers.
reserve(ccdImageList.size());
75 for (
auto const &
ccdImage : ccdImageList) {
78 auto commonTangentPoint = afw::geom::averageSpherePoint(centers);
79 LOGLS_DEBUG(_log,
"Using common tangent point: " << commonTangentPoint.getPosition(afw::geom::degrees));
80 setCommonTangentPoint(commonTangentPoint.getPosition(afw::geom::degrees));
84 _commonTangentPoint =
Point(commonTangentPoint.getX(), commonTangentPoint.getY());
85 for (
auto &
ccdImage : ccdImageList)
ccdImage->setCommonTangentPoint(_commonTangentPoint);
89 const bool enlargeFittedList) {
94 for (
auto &item : fittedStarList) {
95 item->clearBeforeAssoc();
98 if (!useFittedList) fittedStarList.clear();
100 for (
auto &
ccdImage : ccdImageList) {
111 Frame ccdImageFrameCPT = toCommonTangentPlane->apply(
ccdImage->getImageFrame(),
false);
112 ccdImageFrameCPT = ccdImageFrameCPT.
rescale(1.10);
117 for (
auto const &fittedStar : fittedStarList) {
118 if (ccdImageFrameCPT.
inFrame(*fittedStar)) {
125 toCommonTangentPlane.
get(), matchCutInArcSec / 3600.);
128 LOGLS_DEBUG(_log,
"Measured-to-Fitted matches before removing ambiguities " << starMatchList->size());
129 starMatchList->removeAmbiguities(*toCommonTangentPlane);
130 LOGLS_DEBUG(_log,
"Measured-to-Fitted matches after removing ambiguities " << starMatchList->size());
134 int matchedCount = 0;
135 for (
auto const &starMatch : *starMatchList) {
136 auto bs = starMatch.s1;
139 auto bs2 = starMatch.s2;
142 ms->setFittedStar(fs);
145 LOGLS_INFO(_log,
"Matched " << matchedCount <<
" objects in " <<
ccdImage->getName());
148 int unMatchedCount = 0;
149 for (
auto const &mstar : catalog) {
151 if (mstar->getFittedStar())
continue;
152 if (enlargeFittedList) {
153 auto fs = std::make_shared<FittedStar>(*mstar);
155 toCommonTangentPlane->transformPosAndErrors(*fs, *fs);
156 fittedStarList.push_back(fs);
157 mstar->setFittedStar(fs);
161 LOGLS_INFO(_log,
"Unmatched objects: " << unMatchedCount);
173 std::string const &fluxField,
float refCoordinateErr,
174 bool rejectBadFluxes) {
175 if (refCat.
size() == 0) {
177 " reference catalog is empty : stop here "));
185 raErrKey = refCat.
getSchema()[
"coord_ra_err"];
186 decErrKey = refCat.
getSchema()[
"coord_dec_err"];
196 << fluxField <<
"Err" 197 <<
") not found in reference catalog. Not using ref flux errors.");
201 for (
size_t i = 0; i < refCat.
size(); i++) {
202 auto const &record = refCat.
get(i);
204 auto coord = record->get(coordKey);
205 double flux = record->get(fluxKey);
207 if (fluxErrKey.isValid()) {
208 fluxErr = record->get(fluxErrKey);
212 double ra = lsst::afw::geom::radToDeg(coord.getLongitude());
213 double dec = lsst::afw::geom::radToDeg(coord.getLatitude());
214 auto star = std::make_shared<RefStar>(ra, dec, flux, fluxErr);
217 star->vx = record->get(raErrKey);
218 star->vy = record->get(decErrKey);
221 star->vx =
std::pow(refCoordinateErr / 1000. / 3600. /
std::cos(coord.getLatitude()), 2);
222 star->vy =
std::pow(refCoordinateErr / 1000. / 3600., 2);
229 refStarList.push_back(star);
234 TanRaDecToPixel raDecToCommonTangentPlane(identity, _commonTangentPoint);
236 associateRefStars(matchCut.asArcseconds(), &raDecToCommonTangentPlane);
241 Frame tangentPlaneFrame;
243 for (
auto const &
ccdImage : ccdImageList) {
245 if (tangentPlaneFrame.
getArea() == 0)
246 tangentPlaneFrame = CTPFrame;
248 tangentPlaneFrame += CTPFrame;
253 TanPixelToRaDec commonTangentPlaneToRaDec(identity, _commonTangentPoint);
254 Frame raDecFrame = commonTangentPlaneToRaDec.
apply(tangentPlaneFrame,
false);
256 lsst::afw::geom::Point<double>
min(raDecFrame.
xMin, raDecFrame.
yMin);
257 lsst::afw::geom::Point<double>
max(raDecFrame.
xMax, raDecFrame.
yMax);
258 lsst::afw::geom::Box2D box(min, max);
267 matchCutInArcSec / 3600.);
269 LOGLS_DEBUG(_log,
"Refcat matches before removing ambiguities " << starMatchList->size());
270 starMatchList->removeAmbiguities(*transform);
271 LOGLS_DEBUG(_log,
"Refcat matches after removing ambiguities " << starMatchList->size());
274 for (
auto const &starMatch : *starMatchList) {
278 const BaseStar &bs2 = *starMatch.s2;
286 "Associated " << starMatchList->size() <<
" reference stars among " << refStarList.size());
290 selectFittedStars(minMeasurements);
291 normalizeFittedStars();
294 void Associations::selectFittedStars(
int minMeasurements) {
295 LOGLS_INFO(_log,
"Fitted stars before measurement # cut: " << fittedStarList.size());
297 int totalMeasured = 0, validMeasured = 0;
300 for (
auto const &
ccdImage : ccdImageList) {
309 if (fittedStar ==
nullptr) {
316 if (!fittedStar->getRefStar() && fittedStar->getMeasurementCount() < minMeasurements) {
317 fittedStar->getMeasurementCount()--;
318 mi = catalog.
erase(mi);
328 if ((*fi)->getMeasurementCount() == 0) {
329 fi = fittedStarList.erase(fi);
335 LOGLS_INFO(_log,
"Fitted stars after measurement # cut: " << fittedStarList.size());
336 LOGLS_INFO(_log,
"Total, valid number of Measured stars: " << totalMeasured <<
", " << validMeasured);
339 void Associations::normalizeFittedStars()
const {
341 for (
auto &fittedStar : fittedStarList) {
344 fittedStar->setFlux(0.0);
345 fittedStar->getMag() = 0.0;
349 for (
auto const &
ccdImage : ccdImageList) {
352 for (
auto &mi : catalog) {
353 auto fittedStar = mi->getFittedStar();
354 if (fittedStar ==
nullptr)
357 "All measuredStars must have a fittedStar: did you call selectFittedStars()?"));
358 auto point = toCommonTangentPlane->apply(*mi);
359 fittedStar->x += point.x;
360 fittedStar->y += point.y;
361 fittedStar->getFlux() += mi->getFlux();
365 for (
auto &fi : fittedStarList) {
366 auto measurementCount = fi->getMeasurementCount();
367 fi->x /= measurementCount;
368 fi->y /= measurementCount;
369 fi->getFlux() /= measurementCount;
370 fi->getMag() = utils::nanojanskyToABMagnitude(fi->getFlux());
374 void Associations::assignMags() {
375 for (
auto const &
ccdImage : ccdImageList) {
377 for (
auto const &mstar : catalog) {
378 auto fstar = mstar->getFittedStar();
379 if (!fstar)
continue;
380 fstar->addMagMeasurement(mstar->getMag(), mstar->getMagWeight());
388 if (!fittedStarList.inTangentPlaneCoordinates) {
390 "DeprojectFittedStars: Fitted stars are already in sidereal coordinates, nothing done ");
395 fittedStarList.applyTransform(ctp2Sky);
396 fittedStarList.inTangentPlaneCoordinates =
false;
401 return item->getCatalogForFit().size() > 0;
407 for (
auto const &fittedStar : fittedStarList) {
408 if ((fittedStar !=
nullptr) & (fittedStar->getRefStar() !=
nullptr)) count++;
414 void Associations::collectMCStars(
int realization) {
418 for (I = ccdImageList.begin(); I != ccdImageList.end(); I++) {
420 string dbimdir = ccdImage.Dir();
421 string mctruth = dbimdir +
"/mc/mctruth.list";
423 if (realization >= 0) {
425 sstrm << dbimdir <<
"/mc/mctruth_" << realization <<
".list";
426 mctruth = sstrm.
str();
433 DicStarList mctruthlist(mctruth);
437 for (smI = starMatchList->begin(); smI != starMatchList->end(); smI++) {
442 DicStar *dstar =
dynamic_cast<DicStar *
>(bs);
444 mcstar->GetMCInfo().iflux = dstar->getval(
"iflux");
445 mcstar->GetMCInfo().tflux = dstar->getval(
"sflux");
452 LOGLS_FATAL(_log,
"CollectMCStars Unable to match MCTruth w/ catalog!");
457 double matchCutArcSec) {
459 size_t pos_minus = color.
find(
'-');
460 bool compute_diff = (pos_minus != string::npos);
462 c1 = color.
substr(0, pos_minus);
463 if (compute_diff) c2 = color.
substr(pos_minus + 1, string::npos);
464 DicStarList cList(dicStarListName);
465 if (!cList.HasKey(c1))
466 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
467 " misses a key named \"" + c1 +
"\""));
468 if (compute_diff && !cList.HasKey(c2))
469 throw(GastroException(
"Associations::SetFittedstarColors : " + dicStarListName +
470 " misses a key named \"" + c2 +
"\""));
478 if (fittedStarList.inTangentPlaneCoordinates) id_or_proj = &id;
483 id_or_proj, matchCutArcSec / 3600);
485 LOGLS_INFO(_log,
"Matched " << starMatchList->size() <<
'/' << fittedStarList.size()
486 <<
" FittedStars to color catalog");
488 for (
auto i = starMatchList->begin(); i != starMatchList->end(); ++i) {
492 const TStar *ts =
dynamic_cast<const TStar *
>(s2);
493 const DicStar *ds =
dynamic_cast<const DicStar *
>(ts->get_original());
494 fs->
color = ds->getval(c1);
495 if (compute_diff) fs->
color -= ds->getval(c2);
#define LOGLS_WARN(logger, message)
Objects used as position anchors, typically USNO stars.
The transformation that handles pixels to sideral transformations (Gnomonic, possibly with polynomial...
int nCcdImagesValidForFit() const
return the number of CcdImages with non-empty catalogs to-be-fit.
MeasuredStarList::iterator MeasuredStarIterator
A hanger for star associations.
void apply(const double xIn, const double yIn, double &xOut, double &yOut) const
Transform pixels to ICRS RA, Dec in degrees.
void collectRefStars(afw::table::SimpleCatalog &refCat, afw::geom::Angle matchCut, std::string const &fluxField, float refCoordinateErr, bool rejectBadFluxes=false)
Collect stars from an external reference catalog and associate them with fittedStars.
double xMin
coordinate of boundary.
std::unique_ptr< StarMatchList > listMatchCollect(const BaseStarList &list1, const BaseStarList &list2, const AstrometryTransform *guess, const double maxDist)
assembles star matches.
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::createCcdImage.
Frame rescale(const double factor) const
rescale it. The center does not move.
The base class for handling stars. Used by all matching routines.
void prepareFittedStars(int minMeasurements)
Set the color field of FittedStar 's from a colored catalog.
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)
SchemaItem< T > find(std::string const &name) const
Class for a simple mapping implementing a generic AstrometryTransform.
void setRefStar(const RefStar *_refStar)
Set the astrometric reference star associated with this star.
void computeCommonTangentPoint()
Sets a shared tangent point for all ccdImages, using the mean of the centers of all ccdImages...
FittedStarList::iterator FittedStarIterator
A list of FittedStar s. Such a list is typically constructed by Associations.
This one is the Tangent Plane (called gnomonic) projection (from celestial sphere to tangent plane) ...
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.
bool inFrame(double x, double y) const
inside?
#define LSST_EXCEPT(type,...)
void createCcdImage(afw::table::SourceCatalog &catalog, std::shared_ptr< lsst::afw::geom::SkyWcs > 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.
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)
std::shared_ptr< const BaseStar > s2
const lsst::afw::geom::Box2D getRaDecBBox()
BaseStarList & Measured2Base(MeasuredStarList &This)
std::shared_ptr< RecordT > const get(size_type i) const
std::shared_ptr< const BaseStar > s1
std::string sourceFluxField
"name of flux field in source catalog" ;
#define LOGLS_FATAL(logger, message)
Handler of an actual image from a single CCD.
std::shared_ptr< FittedStar > getFittedStar() const
The objects which have been measured several times.
BaseStarList & Ref2Base(RefStarList &This)