<& /htmlheader, title => ('D' . $det_id) &> <& modelheader &>
<% $field_info %>

% 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, hide_if_nostamp => 1 &>
% } <& /htmlfooter &> <%args> $det_id $limit => 500 $bins => 25 $pseudo1 => undef $pseudo2 => undef $pseudo3 => undef $pseudo1_sql => 'least(sqrt(moments_xx*moments_yy/(psf_major*psf_minor)),6)' $pseudo2_sql => 'f_pos * ratio_bad * psf_quality' $pseudo3_sql => 'log10(s2n)' $scatter1_x => 'pseudo1' $scatter1_y => 'pseudo2' $scatter2_x => 'pseudo1' $scatter2_y => 'probability' $scatter3_x => 'pseudo1' $scatter3_y => 'pseudo3' $scatter4_x => 'N/A' $scatter4_y => 'N/A' <%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 $det; my $dr; my $tp; my $field; my $field_id; my $field_info = ''; my $all_href; my $all_aref; my $sel_aref; my %sel_tbl; my $sql; my %ktbl; # known table det_id => known_name if ($det_id) { $det = modcd_retrieve($inst, detId => $det_id); $dr = $dbh->selectrow_hashref("select * from det_rawattr_v2 dr where det_id=?", undef, $det->detId); ($tp) = $dbh->selectrow_array("select probability from tracklets t join tracklet_attrib ta using(tracklet_id) where det_id=? limit 1", undef, $det->detId); if ($tp) { $tp = sprintf "%.2f", $tp; } else { $tp = 'NA'; } $field = modcf_retrieve($inst, fieldId => $det->fieldId); $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; my $mr = 0; # final computed moment ratio, needs to check for sqrt() args >= 0 my ($arg1, $arg2); $arg1 = $dr->{psf_major} * $dr->{psf_minor}; # denominator if ($arg1 != 0) { $arg2 = ($dr->{moments_xx} * $dr->{moments_yy}) / $arg1; if ($arg2 >= 0) { $mr = sqrt($arg2); } } my $dr_info = "\n

" . join( "
\n", sprintf('Moment Ratio: %.2f', $mr), sprintf('PSF Quality: %.2f', $dr->{psf_qf_perfect} * $dr->{f_pos} * $dr->{ratio_all}), sprintf('Probability: %s', $tp), sprintf('S/N: %.2f', $det->s2n), ) . "\n"; my $q_info = "\n

" . join( "
\n", sprintf('pseudo1: %s', $pseudo1_sql), sprintf('pseudo2: %s', $pseudo2_sql), sprintf('pseudo3: %s', $pseudo3_sql), ) . "\n"; $field_info .= $dr_info; $field_info .= $q_info; } # 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, t.probability as probability, 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) && $det_id) { $sql = "$SQL_STUB WHERE d.field_id=$field_id and det_id=$det_id"; $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, $title) = @_; 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 $x = sprintf "%.2f", $det1->[0]->{$xcol}; my $y = sprintf "%.2f", $det1->[0]->{$ycol}; my $stub = <<"STUB";
Selected X: $x, Y: $y


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, 'Moment Ratio (x) vs. PSF Quality (y)'); } 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, 'Moment Ratio (x) vs. Tracklet Probability (y)'); } 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, 'Moment Ratio (x) vs. Log(S/N) (y)'); } 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); }