IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 19, 2026, 5:23:27 PM (7 weeks ago)
Author:
cclin33
Message:

update function.php

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippMonitor/raw/dataquality.php

    r42795 r42972  
    1515else {$myMenu = "ipp.czar.dat";}
    1616
    17 menu($myMenu, 'Czartool on '.$lastUpdateTime, 'ipp.css', $ID['link'], $ID['proj']);
     17menu($myMenu, 'Czartool on', ' ipp.css', $ID['link'], $ID['proj']);
    1818
    1919$pass = $ID['pass'];
     
    2222
    2323// Fetch data based on range selection
    24 $range = isset($_GET['range']) ? $_GET['range'] : 'yday';
     24$range = isset($_GET['range']) ? $_GET['range'] : 'week';
     25
     26require_once 'functions.php';
    2527
    2628echo "<table border=\"0\">";
     
    2830echo "  <td style=width:1240>";
    2931echo "    <h1 align=\"middle\">Data Quality Report</h1>";
    30 echo "  <center>";
    31 echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=yday">Last night (default)</a> | ';
    32 echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=day">Today (MJD '.getMJD().')</a> | ';
    33 echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=week">Past 7 days</a> | ';
    34 echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=month">Past 30 days</a> | ';
    35 echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=year">Past 365 days</a> | ';
    36 echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=all">All </a>   ';
     32
     33#
     34# project selector
     35echo '<center>';
     36# Project selector with highlight
     37$projects = ["gpc1" => "GPC1", "gpc2" => "GPC2"];
     38foreach ($projects as $key => $label) {
     39    if ($proj == $key) {
     40        echo "<strong style='color:blue;'>$label</strong> | ";
     41    } else {
     42        echo '<a href="?pass=' . urlencode($pass) . '&proj=' . $key . '&range=' . urlencode($range) . '">' . $label . '</a> | ';
     43    }
     44}
     45echo "<br>";
     46
     47# range links with highlighting
     48$ranges = [
     49    "today"     => "Today",
     50    "yesterday" => "Yesterday",
     51    "week"      => "Week",
     52    "month"     => "Month",
     53    "year"      => "Year",
     54    "all"       => "All"
     55];
     56
     57foreach ($ranges as $key => $label) {
     58    if ($range == $key) {
     59        echo "<strong style='color:blue;'>$label</strong> | ";
     60    } else {
     61        echo '<a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=' . $key . '">' . $label . '</a> | ';
     62    }
     63}
     64
    3765echo "  </td>";
    3866echo "</tr>";
    3967echo "</table>";
    40 echo getDataQuality($projectdb, $range);
     68
     69echo "    <div style=\"margin-bottom:10px; font-size:14px; color:#555;\">";
     70echo "      Current MJD: " . getMJD();
     71echo "    </div>";
     72
     73echo getDataQuality($projectdb, $range, $proj);
    4174
    4275menu_end();
    4376
    44 /////////////////////////////////////////////////////////////////////////////
    45 //                                                                         //
    46 //                               Functions                                 //
    47 //                                                                         //
    48 /////////////////////////////////////////////////////////////////////////////
    49 
    50 ###########################################################################
    51 #
    52 # Get data quality
    53 #
    54 ###########################################################################
    55 function getDataQuality($db, $range = 'yday') {
    56     // Start timer
    57     $start = microtime(true);
    58 
    59     $mjdDay  = getMJD();
    60     $mjdDay_yearback = $mjdDay - 366;
    61     $mjdDay_monthback = $mjdDay - 32;
    62     $min_exp_id = 0;
    63 
    64     // Determine the reference exp_name based on the selected range
    65     switch ($range) {
    66         case 'year':
    67             $expname = "o" . $mjdDay_yearback . "%";
    68             break;
    69         case 'month':
    70             $expname = "o" . $mjdDay_monthback . "%";
    71             break;
    72         case 'week':
    73             $expname = "o" . ($mjdDay - 7) . "%";
    74             break;
    75         case 'day':
    76             $expname = "o" . $mjdDay . "%";
    77             break;
    78         default:
    79             $expname = "o" . ($mjdDay - 1) . "%"; // Default: last night
    80             break;
    81     }
    82 
    83     // Query to get the minimum exp_id
    84     $expIdQuery = "SELECT MIN(exp_id) AS min_exp_id FROM rawExp WHERE rawExp.exp_name LIKE '$expname'";
    85     $result = $db->query($expIdQuery);
    86 
    87     if (DB::isError($result)) {
    88         die("Database error: " . $result->getMessage());
    89     }
    90 
    91     $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
    92 
    93     if (!empty($row['min_exp_id'])) {
    94         $min_exp_id = $row['min_exp_id'];
    95     //    echo "Minimum exp_id: " . $min_exp_id;
    96     } else {
    97         echo "No results found.";
    98     }
    99 
    100     //echo "<br><br>";
    101 
    102     // Determine the date constraint based on the range
    103     switch ($range) {
    104         case 'year':
    105             $dateConstraint = "dateobs >= NOW() - INTERVAL 365 DAY AND rawExp.exp_id >= $min_exp_id";
    106             break;
    107         case 'month':
    108             $dateConstraint = "dateobs >= NOW() - INTERVAL 30 DAY AND rawExp.exp_id >= $min_exp_id";
    109             break;
    110         case 'week':
    111             $expnames = array();
    112             for ($i = 0; $i < 7; $i++) {
    113                 $expnames[] = "rawExp.exp_name LIKE 'o" . ($mjdDay - $i) . "%'";
    114             }
    115             $dateConstraint = "(" . implode(" OR ", $expnames) . ") AND rawExp.exp_id >= $min_exp_id";
    116             break;
    117         case 'yday':
    118             $dateConstraint = "rawExp.exp_name LIKE 'o" . ($mjdDay - 1) . "%' AND rawExp.exp_id >= $min_exp_id";
    119             break;
    120         case 'day':
    121             $dateConstraint = "rawExp.exp_name LIKE 'o$mjdDay%' AND rawExp.exp_id >= $min_exp_id";
    122             break;
    123         case 'all':
    124             $dateConstraint = "rawExp.exp_id >= 0";
    125             break;
    126         default: // Default to last night
    127             $dateConstraint = "rawExp.exp_name LIKE 'o" . ($mjdDay - 1) . "%' AND rawExp.exp_id >= $min_exp_id";
    128             break;
    129     }
    130 
    131     // Updated SQL query
    132     $sql = "select * from (SELECT SUBTIME(dateobs, '10:00:00') AS time,
    133                    round(( 367*YEAR(dateobs)- FLOOR((7 * (YEAR(dateobs) + FLOOR((MONTH(dateobs) + 9) / 12))) / 4) + FLOOR(275 * MONTH(dateobs) / 9)
    134                    + DAY(dateobs) + 1721013.5 + (HOUR(dateobs) / 24.0) + (MINUTE(dateobs) / 1440.0) + (SECOND(dateobs) / 86400.0) - 2400000.5), 5) AS MJD,
    135                    filter, comment, ra*180/pi() as RA, decl*180/pi() as DECL, exp_name, alt, az, fwhm_major, fwhm_minor, zpt_obs, zpt_stdev, rawExp.exp_id, camRun.label
    136             FROM rawExp
    137             JOIN chipRun USING (exp_id)
    138             JOIN camRun USING (chip_id)
    139             JOIN camProcessedExp USING (cam_id)
    140             WHERE $dateConstraint
    141               AND exp_type = 'OBJECT'
    142               AND camRun.state LIKE 'full'
    143               AND camProcessedExp.fault = 0
    144               AND camProcessedExp.zpt_obs != 0 ORDER BY RAND() limit 5000) as sub order by time;";
    145 
    146     $DQarray = array();
    147     $qry = $db->query($sql);
    148     if (dberror($qry)) {
    149         echo "<b>Error with $sql</b><br>\n";
    150         return;
    151     }
    152     //    echo "$sql<br><br>\n";
    153 
    154     while ($qry->fetchInto($row)) {
    155         $DQarray[] = $row;
    156     }
    157 
    158     // Ensure $DQarray is not empty
    159     if (empty($DQarray)) {
    160         echo "<center><b> No data for MJD: $mjdDay </b></center>";
    161         return; // Stop execution if no data to encode
    162     }
    163 
    164     // Convert data array to JSON for easier handling in JavaScript
    165     $dataJson = json_encode($DQarray);
    166 
    167     if ($dataJson === false) {
    168         echo "<b>Error encoding JSON:</b> " . json_last_error_msg(); // Display any JSON encoding errors
    169         return; // Stop execution if JSON encoding fails
    170     }
    171 
    172     echo "<script>console.log(" . json_encode($dataJson) . ");</script>"; // Log JSON output to console for debugging
    173 echo <<<HTML
    174 <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js" onerror="loadLocalGoogleCharts()"></script>
    175 
    176 <script type="text/javascript">
    177     // Check if Google Charts library loaded successfully
    178     window.addEventListener("load", function() {
    179         if (typeof google === "undefined" || typeof google.charts === "undefined") {
    180             loadLocalGoogleCharts();
    181         }
    182     });
    183 
    184     // Function to load local version of Google Charts if CDN fails
    185     function loadLocalGoogleCharts() {
    186         console.warn("Google Charts CDN failed, loading local loader.js instead.");
    187         var script = document.createElement("script");
    188         script.src = "loader.js"; // Path to your local loader.js file
    189         document.head.appendChild(script);
    190     }
    191 </script>
    192 
    193 <script type="text/javascript">
    194     google.charts.load('current', {packages: ['corechart']});
    195 
    196     // Use the encoded JSON directly in JavaScript
    197     const dataArray = JSON.parse('{$dataJson}'); // Directly parse the PHP JSON string
    198 
    199     // draw FWHM vs MJD
    200     function drawFWHMChart() {
    201         var data = new google.visualization.DataTable();
    202             data.addColumn('number', 'MJD');
    203             data.addColumn('number', 'FWHM_major');
    204             data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
    205             data.addColumn('number', 'FWHM_minor');
    206             data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
    207             data.addColumn('number', 'seeing ~ 1"');
    208             data.addColumn('number', 'seeing ~ 3"');
    209 
    210         const rows = dataArray.map(row => {
    211             const [timestamp, mjd, filter, comment, ra, dec, exp_name, alt, az, iq_fwhm_maj, iq_fwhm_min, zpt_obs, zpt_stdev, exp_id, cam_label] = row;
    212 
    213             return [
    214                 parseFloat(mjd),      // Position Angle
    215                 parseFloat(iq_fwhm_maj),         // RA_offset (AST_R0)
    216                 "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
    217                 parseFloat(iq_fwhm_min),        // Dec_offset (AST_D0)
    218                 "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
    219                 4,
    220                 12
    221             ];
    222         });
    223 
    224         data.addRows(rows);
    225 
    226         // Extract the first MJD value from dataArray
    227         //const firstMJD = dataArray.length > 0 ? parseFloat(dataArray[0][1]) : "N/A";
    228         const firstMJD = dataArray.length > 0 ? Math.floor(parseFloat(dataArray[0][1])) : "N/A";
    229         console.log("First MJD Value:", firstMJD);
    230 
    231         const options = {
    232             title: 'FWHM (MJD: '+firstMJD+')',
    233             titleTextStyle: {color: 'black', fontSize: 15},
    234             width: '100%',
    235             height: 480,
    236             legend: { position: 'top', alignment: 'center' },
    237             series: {
    238                 0: { color: '#0000ff', pointSize: 2, lineWidth: 0. },
    239                 1: { color: '#33a532', pointSize: 2, lineWidth: 0. },
    240                 2: { color: 'red', lineWidth: 2, pointSize: 0 },
    241                 3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }
    242             },
    243             intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
    244             hAxis: {
    245                 title: 'MJD',
    246                 gridlines: {count: -1}
    247             },
    248             vAxis: {
    249                 title: 'FWHM (pixels)',
    250             },
    251             tooltip: { isHtml: true }, // Render tooltips as HTML
    252             chartArea: {left: '8%', top: 60, right: '5%', bottom: 50}, // Adjust left and right
    253             fontSize: 12,
    254         };
    255 
    256         const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_fwhm'));
    257         chart.draw(data, options);
    258     }
    259 
    260     // draw zoomed zerpoint vs mjd
    261     function drawZOOMZPTChart() {
    262         var data = new google.visualization.DataTable();
    263         data.addColumn('number', 'MJD');
    264 
    265         // Add columns for each filter type to handle separate colors
    266         data.addColumn('number', 'g (24.563, 25.013)');
    267         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    268         data.addColumn({type: 'number', role: 'interval'});
    269         data.addColumn({type: 'number', role: 'interval'});
    270         data.addColumn('number', 'r (24.750, 24.840)');
    271         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    272         data.addColumn({type: 'number', role: 'interval'});
    273         data.addColumn({type: 'number', role: 'interval'});
    274         data.addColumn('number', 'i (24.611, 24.711)');
    275         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    276         data.addColumn({type: 'number', role: 'interval'});
    277         data.addColumn({type: 'number', role: 'interval'});
    278         data.addColumn('number', 'z (24.240, 24.300)');
    279         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    280         data.addColumn({type: 'number', role: 'interval'});
    281         data.addColumn({type: 'number', role: 'interval'});
    282         data.addColumn('number', 'y (23.320, 23.570)');
    283         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    284         data.addColumn({type: 'number', role: 'interval'});
    285         data.addColumn({type: 'number', role: 'interval'});
    286         data.addColumn('number', 'w (26.000, 26.300)');
    287         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    288         data.addColumn({type: 'number', role: 'interval'});
    289         data.addColumn({type: 'number', role: 'interval'});
    290 
    291         const rows = dataArray.map(row => {
    292             const [timestamp, mjd, filter, comment, ra, dec, exp_name, alt, az, iq_fwhm_maj, iq_fwhm_min, zpt_obs, zpt_stdev, exp_id, cam_label] = row;
    293 
    294             // Initialize all filter values as null
    295             let zp_g = null, zp_r = null, zp_i = null, zp_z = null, zp_y = null, zp_w = null;
    296 
    297             // Set the zeropoint offset based on filter and assign it to the correct series
    298             switch (filter[0]) {
    299                 case 'g':
    300                     zp_g = zpt_obs - 24.563;
    301                     break;
    302                 case 'r':
    303                     zp_r = zpt_obs - 24.750;
    304                     break;
    305                 case 'i':
    306                     zp_i = zpt_obs - 24.611;
    307                     break;
    308                 case 'z':
    309                     zp_z = zpt_obs - 24.240;
    310                     break;
    311                 case 'y':
    312                    zp_y = zpt_obs - 23.320;
    313                     break;
    314                 case 'w':
    315                     zp_w = zpt_obs - 26.000;
    316                     break;
    317             }
    318 
    319             return [
    320                 parseFloat(mjd), // MJD value
    321                 zp_g, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    322 parseFloat(zp_g - zpt_stdev), parseFloat(zp_g - zpt_stdev*-1),
    323                 zp_r, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    324 parseFloat(zp_r - zpt_stdev), parseFloat(zp_r - zpt_stdev*-1),
    325                 zp_i, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    326 parseFloat(zp_i - zpt_stdev), parseFloat(zp_i - zpt_stdev*-1),
    327                 zp_z, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    328 parseFloat(zp_z - zpt_stdev), parseFloat(zp_z - zpt_stdev*-1),
    329                 zp_y, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    330 parseFloat(zp_y - zpt_stdev), parseFloat(zp_y - zpt_stdev*-1),
    331                 zp_w, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    332 parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1)
    333             ];
    334         });
    335 
    336         data.addRows(rows);
    337 
    338         const options = {
    339             title: 'Zeropoint zoom-in (MJD)',
    340             titleTextStyle: { color: 'black', fontSize: 15 },
    341             width: '100%',
    342             height: 480,
    343             legend: { position: 'top', alignment: 'start', maxLines: 3 },
    344             series: {
    345                 0: { color: '#00f000', pointSize: 5, pointShape: 'circle',   linewidth: .0},  // 'g' filter
    346                 1: { color: '#f00000', pointSize: 5, pointShape: 'triangle', linewidth: .0},  // 'r' filter
    347                 2: { color: '#f05000', pointSize: 5, pointShape: 'square',   linewidth: .0},  // 'i' filter
    348                 3: { color: '#0050a0', pointSize: 5, pointShape: 'diamond',  linewidth: .0},  // 'z' filter
    349                 4: { color: '#ffe000', pointSize: 5, pointShape: 'star',     linewidth: .0},  // 'y' filter
    350                 5: { color: '#808080', pointSize: 5, pointShape: 'polygon',  linewidth: .0},  // 'w' filter
    351             },
    352             intervals: { color: 'red', lineWidth: .0, style: 'sticks' },
    353             hAxis: {
    354                 title: 'MJD',
    355                 gridlines: { count: -1 }
    356             },
    357             vAxis: {
    358                 title: 'Zeropoint (mag)',
    359                 viewWindow: {   min: -1.00, max: .5    },
    360             },
    361             tooltip: { isHtml: true },
    362             chartArea: { left: '9%', top: 60, right: '5%', bottom: 50 },
    363             fontSize: 12,
    364         };
    365 
    366         const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zoomzpt'));
    367         chart.draw(data, options);
    368     }
    369 
    370     // draw zeropoint vs mjd
    371     function drawZPTChart() {
    372         var data = new google.visualization.DataTable();
    373         data.addColumn('number', 'MJD');
    374 
    375         // Add columns for each filter type to handle separate colors
    376         data.addColumn('number', 'g' );
    377         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    378         data.addColumn({type: 'number', role: 'interval'});
    379         data.addColumn({type: 'number', role: 'interval'});
    380         data.addColumn('number', 'r' );
    381         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    382         data.addColumn({type: 'number', role: 'interval'});
    383         data.addColumn({type: 'number', role: 'interval'});
    384         data.addColumn('number', 'i' );
    385         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    386         data.addColumn({type: 'number', role: 'interval'});
    387         data.addColumn({type: 'number', role: 'interval'});
    388         data.addColumn('number', 'z' );
    389         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    390         data.addColumn({type: 'number', role: 'interval'});
    391         data.addColumn({type: 'number', role: 'interval'});
    392         data.addColumn('number', 'y' );
    393         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    394         data.addColumn({type: 'number', role: 'interval'});
    395         data.addColumn({type: 'number', role: 'interval'});
    396         data.addColumn('number', 'w' );
    397         data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    398         data.addColumn({type: 'number', role: 'interval'});
    399         data.addColumn({type: 'number', role: 'interval'});
    400 
    401         // Count occurrences of each filter
    402         const filterCounts = { g: 0, r: 0, i: 0, z: 0, y: 0, w: 0 };
    403        const rows = dataArray.map(row => {
    404             const [timestamp, mjd, filter, comment, ra, dec, exp_name, alt, az, iq_fwhm_maj, iq_fwhm_min, zpt_obs, zpt_stdev, exp_id, cam_label] = row;
    405 
    406             // Initialize all filter values as null
    407             let zp_g = null, zp_r = null, zp_i = null, zp_z = null, zp_y = null, zp_w = null;
    408 
    409             // Increment the count for the filter
    410             if (filterCounts.hasOwnProperty(filter[0])) {
    411                 filterCounts[filter[0]] += 1;
    412             }
    413 
    414             // Set the zeropoint offset based on filter and assign it to the correct series
    415             switch (filter[0]) {
    416                 case 'g':
    417                     zp_g = zpt_obs - 0.0;
    418                     break;
    419                 case 'r':
    420                     zp_r = zpt_obs - 0.0;
    421                     break;
    422                 case 'i':
    423                     zp_i = zpt_obs - 0.0;
    424                     break;
    425                 case 'z':
    426                     zp_z = zpt_obs - 0.0;
    427                     break;
    428                 case 'y':
    429                     zp_y = zpt_obs - 0.0;
    430                     break;
    431                 case 'w':
    432                     zp_w = zpt_obs - 0.0;
    433                     break;
    434             }
    435 
    436             return [
    437                 parseFloat(mjd), // MJD value
    438                 zp_g, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    439 parseFloat(zp_g - zpt_stdev), parseFloat(zp_g - zpt_stdev*-1),
    440                 zp_r, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    441 parseFloat(zp_r - zpt_stdev), parseFloat(zp_r - zpt_stdev*-1),
    442                 zp_i, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    443 parseFloat(zp_i - zpt_stdev), parseFloat(zp_i - zpt_stdev*-1),
    444                 zp_z, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    445 parseFloat(zp_z - zpt_stdev), parseFloat(zp_z - zpt_stdev*-1),
    446                 zp_y, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    447 parseFloat(zp_y - zpt_stdev), parseFloat(zp_y - zpt_stdev*-1),
    448                 zp_w, "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>HST: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label, 
    449 parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1),
    450             ];
    451         });
    452       data.addRows(rows);
    453 
    454         // Include counts in the title using string concatenation
    455         const countsTitle = 'Zeropoint (MJD) g: ' + filterCounts.g + ', r: ' + filterCounts.r + ', i: ' + filterCounts.i + ', z: ' + filterCounts.z + ', y: ' + filterCounts.y + ', w: ' + filterCounts.w;
    456 
    457 
    458         console.log(countsTitle);
    459 
    460         const options = {
    461             title: countsTitle,
    462             titleTextStyle: { color: 'black', fontSize: 15 },
    463             width: '100%',
    464             height: 480,
    465             legend: { position: 'top', alignment: 'center' },
    466             series: {
    467                 0: { color: '#00f000', pointSize: 5, pointShape: 'circle',   linewidth: 1},  // 'g' filter
    468                 1: { color: '#f00000', pointSize: 5, pointShape: 'triangle', linewidth: 1},  // 'r' filter
    469                 2: { color: '#f05000', pointSize: 5, pointShape: 'square',   linewidth: 1},  // 'i' filter
    470                 3: { color: '#0050a0', pointSize: 5, pointShape: 'diamond',  linewidth: 1},  // 'z' filter
    471                 4: { color: '#ffe000', pointSize: 5, pointShape: 'star',     linewidth: 1},  // 'y' filter
    472                 5: { color: '#808080', pointSize: 5, pointShape: 'polygon',  linewidth: 1},  // 'w' filter
    473             },
    474             intervals: { color: 'red', lineWidth: 0, style: 'sticks' },
    475             hAxis: {
    476                 title: 'MJD',
    477                 gridlines: { count: -1 }
    478             },
    479             vAxis: {
    480                 title: 'Zeropoint (mag)'
    481             },
    482             tooltip: { isHtml: true },
    483             chartArea: { left: '9%', top: 60, right: '5%', bottom: 50 },
    484             fontSize: 12,
    485         };
    486 
    487         const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zpt'));
    488         chart.draw(data, options);
    489     }
    490 
    491     google.charts.setOnLoadCallback(drawFWHMChart);
    492     google.charts.setOnLoadCallback(drawZPTChart);
    493     google.charts.setOnLoadCallback(drawZOOMZPTChart);
    494 
    495 </script>
    496 
    497 <div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
    498     <div id="dq_div_fwhm" style="width:100%;"></div>
    499     <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>
    500 </div>
    501 
    502 <div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
    503     <div id="dq_div_zpt" style="width:100%;"></div>
    504     <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>
    505 </div>
    506 
    507 <div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
    508     <div id="dq_div_zoomzpt" style="width:100%;"></div>
    509     <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>
    510 </div>
    511 
    512 HTML;
    513     // End timer
    514     $total_time = round(microtime(true) - $start, 3);
    515     echo "<center>loading plot in $total_time seconds<br></center>";
    516 
    517 }
    518 
    519 
    520 
    52177?>
    52278
Note: See TracChangeset for help on using the changeset viewer.