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);
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.
#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::createCcdImage.
Frame rescale(const double factor) const
rescale it. The center does not move.
#define LOGLS_INFO(logger, message)
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.
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...
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)
#define LOGLS_DEBUG(logger, message)
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" ;
Handler of an actual image from a single CCD.
std::shared_ptr< FittedStar > getFittedStar() const
The objects which have been measured several times.
#define LOGLS_WARN(logger, message)
BaseStarList & Ref2Base(RefStarList &This)