& /htmlheader &>
<& modelheader &>
% if (defined($all_aref)) {
| Selected |
Plots |
The Rest |
|
<& stamp_decider, dets => \@sel_stamps, ktbl => \%ktbl &>
|
% foreach my $stub (@plot_stubs) {
<% $stub %>
% }
|
<& stamp_decider, dets => \@unsel_stamps, ktbl => \%ktbl &>
|
% }
<& /htmlfooter &>
<%args>
$fpa_id => undef
$where => ''
$limit => 500
$bins => 25
$pseudo1 => undef
$pseudo2 => undef
$pseudo3 => undef
$pseudo1_sql => ''
$pseudo2_sql => ''
$pseudo3_sql => ''
$scatter1_x => ''
$scatter1_y => ''
$scatter2_x => ''
$scatter2_y => ''
$scatter3_x => ''
$scatter3_y => ''
$scatter4_x => ''
$scatter4_y => ''
%args>
<%init>
use URI::Escape;
use Data::Dumper;
use Astro::Time;
use PS::MOPS::Lib qw(:all);
use PS::MOPS::Constants qw(:all);
use PS::MOPS::DC::Field;
use PS::MOPS::DC::Detection;
my $SQL_STUB = <<"SQL";
SELECT d.det_id det_id
FROM det_rawattr_v2 dr JOIN detections d USING(det_id)
LEFT JOIN tracklet_attrib ta USING(det_id)
LEFT JOIN tracklets t USING(tracklet_id)
LEFT JOIN known k USING(known_id)
SQL
my %cols = (
);
my @extcolnames = qw(
mag s2n psf_chi2 psf_dof cr_sig ext_sig psf_major psf_minor psf_theta psf_quality psf_npix moments_xx moments_xy moments_yy n_pos f_pos ratio_bad ratio_mask ratio_all flags ipp_idet psf_inst_flux psf_inst_flux_sig ap_mag ap_mag_raw ap_mag_radius ap_flux ap_flux_sig peak_flux_as_mag cal_psf_mag cal_psf_mag_sig sky sky_sigma psf_qf_perfect moments_r1 moments_rh kron_flux kron_flux_err kron_flux_inner kron_flux_outer diff_r_p diff_sn_p diff_r_m diff_sn_m flags2 n_frames pseudo1 pseudo2 pseudo3
);
my %extcols = (
psf_chi2 => 'float',
psf_dof => 'int',
cr_sig => 'float',
ext_sig => 'float',
psf_major => 'float',
psf_minor => 'float',
psf_theta => 'float',
psf_quality => 'float',
psf_npix => 'int',
moments_xx => 'float',
moments_xy => 'float',
moments_yy => 'float',
n_pos => 'int',
f_pos => 'float',
ratio_bad => 'float',
ratio_mask => 'float',
ratio_all => 'float',
flags => 'int',
ipp_idet => 'int',
psf_inst_flux => 'float',
psf_inst_flux_sig => 'float',
ap_mag => 'float',
ap_mag_raw => 'float',
ap_mag_radius => 'float',
ap_flux => 'float',
ap_flux_sig => 'float',
peak_flux_as_mag => 'float',
cal_psf_mag => 'float',
cal_psf_mag_sig => 'float',
sky => 'float',
sky_sigma => 'float',
psf_qf_perfect => 'float',
moments_r1 => 'float',
moments_rh => 'float',
kron_flux => 'float',
kron_flux_err => 'float',
kron_flux_inner => 'float',
kron_flux_outer => 'float',
diff_r_p => 'float',
diff_sn_p => 'float',
diff_r_m => 'float',
diff_sn_m => 'float',
flags2 => 'int',
n_frames => 'int',
);
my $inst = $m->notes('INST');
my $dbname = $inst->dbname;
my $model = $m->notes('MODEL');
my $dbh = $inst->dbh();
my $sth;
my $field;
my $field_id;
my $field_info = '';
my $all_href;
my $all_aref;
my $sel_aref;
my %sel_tbl;
my $det_id;
my $sql;
my %ktbl; # known table det_id => known_name
if ($fpa_id) {
$field = modcf_retrieve($inst, fpaId => $fpa_id);
$field_info = '' . join("
\n", $field->fpaId, 'Field ID ' . $field->fieldId, sprintf("%.6f", $field->epoch), mopslib_mjd2utctimestr($field->epoch), $field->surveyMode) . "\n";
$field_id = $field->fieldId;
}
# We will do two queries: one to get all detections from the field, and another
# specified by the user to discriminate. We will display two columns of stamps,
# one selected for, and all others.
if ($field) {
my @p;
if ($pseudo1_sql) { push @p, "$pseudo1_sql as pseudo1"; }
if ($pseudo2_sql) { push @p, "$pseudo2_sql as pseudo2"; }
if ($pseudo3_sql) { push @p, "$pseudo3_sql as pseudo3"; }
my $pseudo_str = '';
if (@p) {
$pseudo_str = ', ' . join(', ', @p);
}
$sql = <<"SQL";
select d.det_id det_id, d.mag as mag, d.s2n as s2n, k.known_name as known_name, dr.* $pseudo_str
from det_rawattr_v2 dr join detections d using(det_id)
left join tracklet_attrib ta using(det_id)
left join tracklets t using(tracklet_id)
left join known k using(known_id)
where d.field_id=?
SQL
$sth = $dbh->prepare($sql) or die $dbh->errstr;
$sth->execute($field_id) or die $sql;
while (my $href = $sth->fetchrow_hashref) {
$all_href->{$href->{det_id}} = $href; # save entire row
push @{$all_aref}, $href->{det_id};
$ktbl{$href->{det_id}} = $href->{known_name} if $href->{known_name};
}
$sth->finish;
}
# This is very dangerous! We are passing a query directly from a form field.
$sql = '';
if (defined($all_aref) && $where) {
$sql = "$SQL_STUB WHERE d.field_id=$field_id and ($where)";
$sel_aref = $dbh->selectcol_arrayref($sql);
# $sel_aref = [];
foreach my $sel_id (@{$sel_aref}) {
$sel_tbl{$sel_id} = 1; # mark as in selected column
}
}
# Now create Detection lists.
my @sel_dets = map { modcd_retrieve($inst, detId => $_) } @{$sel_aref};
my @unsel_dets = map { modcd_retrieve($inst, detId => $_) } grep { !$sel_tbl{$_} } @{$all_aref};
# Truncated lists for stamps only.
my @sel_stamps = @sel_dets;
@sel_stamps = @sel_stamps[0..$limit-1] if ($limit and scalar @sel_stamps > $limit);
my @unsel_stamps = @unsel_dets;
@unsel_stamps = @unsel_stamps[0..$limit-1] if ($limit and scalar @unsel_stamps > $limit);
# Raw attribute lists.
my @sel_raw = map { $all_href->{$_->detId} } @sel_dets;
my @unsel_raw = map { $all_href->{$_->detId} } @unsel_dets;
sub make_jquery_pairhist_stub {
# Create a Javascript JQuery stub for Flot.
my ($num, $col, $bins, $det1, $det2) = @_;
my $h;
my $x0;
my $x;
my $bw;
my $n;
my @d; # list of single det column values
my @dd; # x,y pairs for Flot
my $nd;
@d = map { $_->{$col} } @{$det1};
$h = mopslib_histogram(data => \@d, bins => $bins);
$bw = $h->{binsize};
$x0 = $h->{min};
$n = 0;
@dd = ();
$nd = scalar @{$det1} || 1;
foreach $x (@{$h->{hist}}) {
push @dd, [ $x0 + $n * $bw, $x / $nd];
$n++;
}
my $d1str = "var d${num}1 = [" .
join(',', map {'[' . $_->[0] . ', ' . $_->[1] . ']'} @dd) .
'];';
my $bw1 = $bw;
my $sel1 = sprintf 'Sel (%d)', scalar @{$det1};
@d = map { $_->{$col} } @{$det2};
$h = mopslib_histogram(data => \@d, bins => $bins);
$bw = $h->{binsize};
$x0 = $h->{min};
$n = 0;
@dd = ();
$nd = scalar @{$det2} || 1;
foreach $x (@{$h->{hist}}) {
push @dd, [ $x0 + $n * $bw, $x / $nd];
$n++;
}
my $d2str = "var d${num}2 = [" . join(',', map {'[' . $_->[0] . ', ' . $_->[1] . ']'} @dd) . ']';
my $bw2 = $bw;
my $sel2 = sprintf 'Unsel (%d)', scalar @{$det2};
my $stub = <<"STUB";
STUB
return $stub;
}
sub make_jquery_scatter_stub {
# Create a Javascript JQuery stub for Flot.
my ($num, $xcol, $ycol, $det1, $det2) = @_;
my @d;
@d = map { [$_->{$xcol}, $_->{$ycol}] } @{$det2}; # list of 2-el arrayrefs
my $d2str = "var d${num}2 = [" .
join(',', map {'[' . $_->[0] . ', ' . $_->[1] . ']'} @d) .
']';
my $sel2 = sprintf 'Unsel (%d)', scalar @{$det2};
@d = map { [$_->{$xcol}, $_->{$ycol}] } @{$det1}; # list of 2-el arrayrefs
my $d1str = "var d${num}1 = [" .
join(',', map {'[' . $_->[0] . ', ' . $_->[1] . ']'} @d) .
'];';
my $sel1 = sprintf 'Sel (%d)', scalar @{$det1};
my $stub = <<"STUB";
STUB
return $stub;
}
sub make_cb {
#
my ($args, $param) = @_;
return sprintf qq{},
($args->{$param} ? ' checked' : '');
}
sub make_scatter {
#
my ($cols, $idx, $x, $y) = @_;
$x ||= '';
$y ||= '';
my $str1;
my $str2;
$str1 = qq{Scatter plot ${idx}: \n};
$str2 = qq{\n};
return "$str1 vs $str2\n";
}
my $checkboxes = join("\n", map { make_cb(\%ARGS, $_) } @extcolnames). "\n";
my $scatter1 = make_scatter(\@extcolnames, 1, $scatter1_x, $scatter1_y);
my $scatter2 = make_scatter(\@extcolnames, 2, $scatter2_x, $scatter2_y);
my $scatter3 = make_scatter(\@extcolnames, 3, $scatter3_x, $scatter3_y);
my $scatter4 = make_scatter(\@extcolnames, 4, $scatter4_x, $scatter4_y);
# Create histogram JQuery stubs.
my @plot_stubs;
my $istub = 1;
#foreach my $v (qw(mag s2n)) {
# push @plot_stubs, make_jquery_pairhist_stub($istub++, $v, $bins, \@sel_dets, \@unsel_dets);
#}
foreach my $v (@extcolnames, qw(pseudo1 pseudo2 pseudo3)) {
if ($ARGS{$v}) {
push @plot_stubs, make_jquery_pairhist_stub($istub++, $v, $bins, \@sel_raw, \@unsel_raw);
}
}
# Create scatterplot stubs.
if ($scatter1_x ne 'N/A' and $scatter1_y ne 'N/A' ) {
push @plot_stubs, make_jquery_scatter_stub($istub++, $scatter1_x, $scatter1_y, \@sel_raw, \@unsel_raw);
}
if ($scatter2_x ne 'N/A' and $scatter2_y ne 'N/A' ) {
push @plot_stubs, make_jquery_scatter_stub($istub++, $scatter2_x, $scatter2_y, \@sel_raw, \@unsel_raw);
}
if ($scatter3_x ne 'N/A' and $scatter3_y ne 'N/A' ) {
push @plot_stubs, make_jquery_scatter_stub($istub++, $scatter3_x, $scatter3_y, \@sel_raw, \@unsel_raw);
}
if ($scatter4_x ne 'N/A' and $scatter4_y ne 'N/A' ) {
push @plot_stubs, make_jquery_scatter_stub($istub++, $scatter4_x, $scatter4_y, \@sel_raw, \@unsel_raw);
}
%init>