Index: trunk/ippMonitor/raw/dataquality.php
===================================================================
--- trunk/ippMonitor/raw/dataquality.php	(revision 42795)
+++ trunk/ippMonitor/raw/dataquality.php	(revision 42972)
@@ -15,5 +15,5 @@
 else {$myMenu = "ipp.czar.dat";}
 
-menu($myMenu, 'Czartool on '.$lastUpdateTime, 'ipp.css', $ID['link'], $ID['proj']);
+menu($myMenu, 'Czartool on', ' ipp.css', $ID['link'], $ID['proj']);
 
 $pass = $ID['pass'];
@@ -22,5 +22,7 @@
 
 // Fetch data based on range selection
-$range = isset($_GET['range']) ? $_GET['range'] : 'yday';
+$range = isset($_GET['range']) ? $_GET['range'] : 'week';
+
+require_once 'functions.php';
 
 echo "<table border=\"0\">";
@@ -28,495 +30,49 @@
 echo "  <td style=width:1240>";
 echo "    <h1 align=\"middle\">Data Quality Report</h1>";
-echo "  <center>";
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=yday">Last night (default)</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=day">Today (MJD '.getMJD().')</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=week">Past 7 days</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=month">Past 30 days</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=year">Past 365 days</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=all">All </a>   ';
+
+#
+# project selector
+echo '<center>';
+# Project selector with highlight
+$projects = ["gpc1" => "GPC1", "gpc2" => "GPC2"];
+foreach ($projects as $key => $label) {
+    if ($proj == $key) {
+        echo "<strong style='color:blue;'>$label</strong> | ";
+    } else {
+        echo '<a href="?pass=' . urlencode($pass) . '&proj=' . $key . '&range=' . urlencode($range) . '">' . $label . '</a> | ';
+    }
+}
+echo "<br>";
+
+# range links with highlighting
+$ranges = [
+    "today"     => "Today",
+    "yesterday" => "Yesterday",
+    "week"      => "Week",
+    "month"     => "Month",
+    "year"      => "Year",
+    "all"       => "All"
+];
+
+foreach ($ranges as $key => $label) {
+    if ($range == $key) {
+        echo "<strong style='color:blue;'>$label</strong> | ";
+    } else {
+        echo '<a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=' . $key . '">' . $label . '</a> | ';
+    }
+}
+
 echo "  </td>";
 echo "</tr>";
 echo "</table>";
-echo getDataQuality($projectdb, $range);
+
+echo "    <div style=\"margin-bottom:10px; font-size:14px; color:#555;\">";
+echo "      Current MJD: " . getMJD();
+echo "    </div>";
+
+echo getDataQuality($projectdb, $range, $proj);
 
 menu_end();
 
-/////////////////////////////////////////////////////////////////////////////
-//                                                                         //
-//                               Functions                                 //
-//                                                                         //
-/////////////////////////////////////////////////////////////////////////////
-
-###########################################################################
-#
-# Get data quality
-#
-###########################################################################
-function getDataQuality($db, $range = 'yday') {
-    // Start timer
-    $start = microtime(true);
-
-    $mjdDay  = getMJD();
-    $mjdDay_yearback = $mjdDay - 366;
-    $mjdDay_monthback = $mjdDay - 32;
-    $min_exp_id = 0;
-
-    // Determine the reference exp_name based on the selected range
-    switch ($range) {
-        case 'year':
-            $expname = "o" . $mjdDay_yearback . "%";
-            break;
-        case 'month':
-            $expname = "o" . $mjdDay_monthback . "%";
-            break;
-        case 'week':
-            $expname = "o" . ($mjdDay - 7) . "%";
-            break;
-        case 'day':
-            $expname = "o" . $mjdDay . "%";
-            break;
-        default:
-            $expname = "o" . ($mjdDay - 1) . "%"; // Default: last night
-            break;
-    }
-
-    // Query to get the minimum exp_id
-    $expIdQuery = "SELECT MIN(exp_id) AS min_exp_id FROM rawExp WHERE rawExp.exp_name LIKE '$expname'";
-    $result = $db->query($expIdQuery);
-
-    if (DB::isError($result)) {
-        die("Database error: " . $result->getMessage());
-    }
-
-    $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
-
-    if (!empty($row['min_exp_id'])) {
-        $min_exp_id = $row['min_exp_id'];
-    //    echo "Minimum exp_id: " . $min_exp_id;
-    } else {
-        echo "No results found.";
-    }
-
-    //echo "<br><br>";
-
-    // Determine the date constraint based on the range
-    switch ($range) {
-        case 'year':
-            $dateConstraint = "dateobs >= NOW() - INTERVAL 365 DAY AND rawExp.exp_id >= $min_exp_id";
-            break;
-        case 'month':
-            $dateConstraint = "dateobs >= NOW() - INTERVAL 30 DAY AND rawExp.exp_id >= $min_exp_id";
-            break;
-        case 'week':
-            $expnames = array();
-            for ($i = 0; $i < 7; $i++) {
-                $expnames[] = "rawExp.exp_name LIKE 'o" . ($mjdDay - $i) . "%'";
-            }
-            $dateConstraint = "(" . implode(" OR ", $expnames) . ") AND rawExp.exp_id >= $min_exp_id";
-            break;
-        case 'yday':
-            $dateConstraint = "rawExp.exp_name LIKE 'o" . ($mjdDay - 1) . "%' AND rawExp.exp_id >= $min_exp_id";
-            break;
-        case 'day':
-            $dateConstraint = "rawExp.exp_name LIKE 'o$mjdDay%' AND rawExp.exp_id >= $min_exp_id";
-            break;
-        case 'all':
-            $dateConstraint = "rawExp.exp_id >= 0";
-            break;
-        default: // Default to last night
-            $dateConstraint = "rawExp.exp_name LIKE 'o" . ($mjdDay - 1) . "%' AND rawExp.exp_id >= $min_exp_id";
-            break;
-    }
-
-    // Updated SQL query
-    $sql = "select * from (SELECT SUBTIME(dateobs, '10:00:00') AS time,
-                   round(( 367*YEAR(dateobs)- FLOOR((7 * (YEAR(dateobs) + FLOOR((MONTH(dateobs) + 9) / 12))) / 4) + FLOOR(275 * MONTH(dateobs) / 9)
-                   + DAY(dateobs) + 1721013.5 + (HOUR(dateobs) / 24.0) + (MINUTE(dateobs) / 1440.0) + (SECOND(dateobs) / 86400.0) - 2400000.5), 5) AS MJD,
-                   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
-            FROM rawExp 
-            JOIN chipRun USING (exp_id) 
-            JOIN camRun USING (chip_id) 
-            JOIN camProcessedExp USING (cam_id)
-            WHERE $dateConstraint
-              AND exp_type = 'OBJECT'
-              AND camRun.state LIKE 'full'
-              AND camProcessedExp.fault = 0
-              AND camProcessedExp.zpt_obs != 0 ORDER BY RAND() limit 5000) as sub order by time;";
-
-    $DQarray = array();
-    $qry = $db->query($sql);
-    if (dberror($qry)) {
-        echo "<b>Error with $sql</b><br>\n";
-        return;
-    }
-    //    echo "$sql<br><br>\n";
-
-    while ($qry->fetchInto($row)) {
-        $DQarray[] = $row;
-    }
-
-    // Ensure $DQarray is not empty
-    if (empty($DQarray)) {
-        echo "<center><b> No data for MJD: $mjdDay </b></center>";
-        return; // Stop execution if no data to encode
-    }
-
-    // Convert data array to JSON for easier handling in JavaScript
-    $dataJson = json_encode($DQarray);
-
-    if ($dataJson === false) {
-        echo "<b>Error encoding JSON:</b> " . json_last_error_msg(); // Display any JSON encoding errors
-        return; // Stop execution if JSON encoding fails
-    }
-
-    echo "<script>console.log(" . json_encode($dataJson) . ");</script>"; // Log JSON output to console for debugging
-echo <<<HTML
-<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js" onerror="loadLocalGoogleCharts()"></script>
-
-<script type="text/javascript">
-    // Check if Google Charts library loaded successfully
-    window.addEventListener("load", function() {
-        if (typeof google === "undefined" || typeof google.charts === "undefined") {
-            loadLocalGoogleCharts();
-        }
-    });
-
-    // Function to load local version of Google Charts if CDN fails
-    function loadLocalGoogleCharts() {
-        console.warn("Google Charts CDN failed, loading local loader.js instead.");
-        var script = document.createElement("script");
-        script.src = "loader.js"; // Path to your local loader.js file
-        document.head.appendChild(script);
-    }
-</script>
-
-<script type="text/javascript">
-    google.charts.load('current', {packages: ['corechart']});
-
-    // Use the encoded JSON directly in JavaScript
-    const dataArray = JSON.parse('{$dataJson}'); // Directly parse the PHP JSON string
-
-    // draw FWHM vs MJD
-    function drawFWHMChart() {
-        var data = new google.visualization.DataTable();
-            data.addColumn('number', 'MJD');
-            data.addColumn('number', 'FWHM_major');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'FWHM_minor');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'seeing ~ 1"');
-            data.addColumn('number', 'seeing ~ 3"');
-
-        const rows = dataArray.map(row => {
-            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;
-
-            return [
-                parseFloat(mjd),      // Position Angle
-                parseFloat(iq_fwhm_maj),         // RA_offset (AST_R0)
-                "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,
-                parseFloat(iq_fwhm_min),        // Dec_offset (AST_D0)
-                "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,
-                4,
-                12
-            ];
-        });
-
-        data.addRows(rows);
-
-        // Extract the first MJD value from dataArray
-        //const firstMJD = dataArray.length > 0 ? parseFloat(dataArray[0][1]) : "N/A"; 
-        const firstMJD = dataArray.length > 0 ? Math.floor(parseFloat(dataArray[0][1])) : "N/A";
-        console.log("First MJD Value:", firstMJD);
-
-        const options = {
-            title: 'FWHM (MJD: '+firstMJD+')',
-            titleTextStyle: {color: 'black', fontSize: 15},
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            series: {
-                0: { color: '#0000ff', pointSize: 2, lineWidth: 0. },
-                1: { color: '#33a532', pointSize: 2, lineWidth: 0. },
-                2: { color: 'red', lineWidth: 2, pointSize: 0 },
-                3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }
-            },
-            intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
-            hAxis: {
-                title: 'MJD',
-                gridlines: {count: -1}
-            },
-            vAxis: {
-                title: 'FWHM (pixels)',
-            },
-            tooltip: { isHtml: true }, // Render tooltips as HTML
-            chartArea: {left: '8%', top: 60, right: '5%', bottom: 50}, // Adjust left and right
-            fontSize: 12,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_fwhm'));
-        chart.draw(data, options);
-    }
-
-    // draw zoomed zerpoint vs mjd
-    function drawZOOMZPTChart() {
-        var data = new google.visualization.DataTable();
-        data.addColumn('number', 'MJD');
-
-        // Add columns for each filter type to handle separate colors
-        data.addColumn('number', 'g (24.563, 25.013)');
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'r (24.750, 24.840)');
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'i (24.611, 24.711)');
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'z (24.240, 24.300)');
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'y (23.320, 23.570)');
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'w (26.000, 26.300)');
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-
-        const rows = dataArray.map(row => {
-            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;
-
-            // Initialize all filter values as null
-            let zp_g = null, zp_r = null, zp_i = null, zp_z = null, zp_y = null, zp_w = null;
-
-            // Set the zeropoint offset based on filter and assign it to the correct series
-            switch (filter[0]) {
-                case 'g':
-                    zp_g = zpt_obs - 24.563;
-                    break;
-                case 'r':
-                    zp_r = zpt_obs - 24.750;
-                    break;
-                case 'i':
-                    zp_i = zpt_obs - 24.611;
-                    break;
-                case 'z':
-                    zp_z = zpt_obs - 24.240;
-                    break;
-                case 'y':
-                   zp_y = zpt_obs - 23.320;
-                    break;
-                case 'w':
-                    zp_w = zpt_obs - 26.000;
-                    break;
-            }
-
-            return [
-                parseFloat(mjd), // MJD value
-                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,  
-parseFloat(zp_g - zpt_stdev), parseFloat(zp_g - zpt_stdev*-1),
-                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,  
-parseFloat(zp_r - zpt_stdev), parseFloat(zp_r - zpt_stdev*-1),
-                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,  
-parseFloat(zp_i - zpt_stdev), parseFloat(zp_i - zpt_stdev*-1),
-                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,  
-parseFloat(zp_z - zpt_stdev), parseFloat(zp_z - zpt_stdev*-1),
-                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,  
-parseFloat(zp_y - zpt_stdev), parseFloat(zp_y - zpt_stdev*-1),
-                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,  
-parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1)
-            ];
-        });
-
-        data.addRows(rows);
-
-        const options = {
-            title: 'Zeropoint zoom-in (MJD)',
-            titleTextStyle: { color: 'black', fontSize: 15 },
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'start', maxLines: 3 },
-            series: {
-                0: { color: '#00f000', pointSize: 5, pointShape: 'circle',   linewidth: .0},  // 'g' filter
-                1: { color: '#f00000', pointSize: 5, pointShape: 'triangle', linewidth: .0},  // 'r' filter
-                2: { color: '#f05000', pointSize: 5, pointShape: 'square',   linewidth: .0},  // 'i' filter
-                3: { color: '#0050a0', pointSize: 5, pointShape: 'diamond',  linewidth: .0},  // 'z' filter
-                4: { color: '#ffe000', pointSize: 5, pointShape: 'star',     linewidth: .0},  // 'y' filter
-                5: { color: '#808080', pointSize: 5, pointShape: 'polygon',  linewidth: .0},  // 'w' filter
-            },
-            intervals: { color: 'red', lineWidth: .0, style: 'sticks' },
-            hAxis: {
-                title: 'MJD',
-                gridlines: { count: -1 }
-            },
-            vAxis: {
-                title: 'Zeropoint (mag)',
-                viewWindow: {   min: -1.00, max: .5    },
-            },
-            tooltip: { isHtml: true },
-            chartArea: { left: '9%', top: 60, right: '5%', bottom: 50 },
-            fontSize: 12,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zoomzpt'));
-        chart.draw(data, options);
-    }
-
-    // draw zeropoint vs mjd
-    function drawZPTChart() {
-        var data = new google.visualization.DataTable();
-        data.addColumn('number', 'MJD');
-
-        // Add columns for each filter type to handle separate colors
-        data.addColumn('number', 'g' );
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'r' );
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'i' );
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'z' );
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'y' );
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn('number', 'w' );
-        data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
-        data.addColumn({type: 'number', role: 'interval'});
-        data.addColumn({type: 'number', role: 'interval'});
-
-        // Count occurrences of each filter
-        const filterCounts = { g: 0, r: 0, i: 0, z: 0, y: 0, w: 0 };
-       const rows = dataArray.map(row => {
-            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;
-
-            // Initialize all filter values as null
-            let zp_g = null, zp_r = null, zp_i = null, zp_z = null, zp_y = null, zp_w = null;
-
-            // Increment the count for the filter
-            if (filterCounts.hasOwnProperty(filter[0])) {
-                filterCounts[filter[0]] += 1;
-            }
-
-            // Set the zeropoint offset based on filter and assign it to the correct series
-            switch (filter[0]) {
-                case 'g':
-                    zp_g = zpt_obs - 0.0;
-                    break;
-                case 'r':
-                    zp_r = zpt_obs - 0.0;
-                    break;
-                case 'i':
-                    zp_i = zpt_obs - 0.0;
-                    break;
-                case 'z':
-                    zp_z = zpt_obs - 0.0;
-                    break;
-                case 'y':
-                    zp_y = zpt_obs - 0.0;
-                    break;
-                case 'w':
-                    zp_w = zpt_obs - 0.0;
-                    break;
-            }
-
-            return [
-                parseFloat(mjd), // MJD value
-                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,  
-parseFloat(zp_g - zpt_stdev), parseFloat(zp_g - zpt_stdev*-1),
-                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,  
-parseFloat(zp_r - zpt_stdev), parseFloat(zp_r - zpt_stdev*-1),
-                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,  
-parseFloat(zp_i - zpt_stdev), parseFloat(zp_i - zpt_stdev*-1),
-                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,  
-parseFloat(zp_z - zpt_stdev), parseFloat(zp_z - zpt_stdev*-1),
-                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,  
-parseFloat(zp_y - zpt_stdev), parseFloat(zp_y - zpt_stdev*-1),
-                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,  
-parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1),
-            ];
-        });
-      data.addRows(rows);
-
-        // Include counts in the title using string concatenation
-        const countsTitle = 'Zeropoint (MJD) g: ' + filterCounts.g + ', r: ' + filterCounts.r + ', i: ' + filterCounts.i + ', z: ' + filterCounts.z + ', y: ' + filterCounts.y + ', w: ' + filterCounts.w;
-
-
-        console.log(countsTitle);
-
-        const options = {
-            title: countsTitle,
-            titleTextStyle: { color: 'black', fontSize: 15 },
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            series: {
-                0: { color: '#00f000', pointSize: 5, pointShape: 'circle',   linewidth: 1},  // 'g' filter
-                1: { color: '#f00000', pointSize: 5, pointShape: 'triangle', linewidth: 1},  // 'r' filter
-                2: { color: '#f05000', pointSize: 5, pointShape: 'square',   linewidth: 1},  // 'i' filter
-                3: { color: '#0050a0', pointSize: 5, pointShape: 'diamond',  linewidth: 1},  // 'z' filter
-                4: { color: '#ffe000', pointSize: 5, pointShape: 'star',     linewidth: 1},  // 'y' filter
-                5: { color: '#808080', pointSize: 5, pointShape: 'polygon',  linewidth: 1},  // 'w' filter
-            },
-            intervals: { color: 'red', lineWidth: 0, style: 'sticks' },
-            hAxis: {
-                title: 'MJD',
-                gridlines: { count: -1 }
-            },
-            vAxis: {
-                title: 'Zeropoint (mag)'
-            },
-            tooltip: { isHtml: true },
-            chartArea: { left: '9%', top: 60, right: '5%', bottom: 50 },
-            fontSize: 12,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zpt'));
-        chart.draw(data, options);
-    }
-
-    google.charts.setOnLoadCallback(drawFWHMChart);
-    google.charts.setOnLoadCallback(drawZPTChart);
-    google.charts.setOnLoadCallback(drawZOOMZPTChart);
-
-</script>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_fwhm" style="width:100%;"></div>
-    <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>
-</div>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_zpt" style="width:100%;"></div>
-    <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>
-</div>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_zoomzpt" style="width:100%;"></div>
-    <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>
-</div>
-
-HTML;
-    // End timer
-    $total_time = round(microtime(true) - $start, 3);
-    echo "<center>loading plot in $total_time seconds<br></center>";
-
-}
-
-
-
 ?>
 
