Index: trunk/ippMonitor/raw/dataquality.php
===================================================================
--- trunk/ippMonitor/raw/dataquality.php	(revision 42794)
+++ trunk/ippMonitor/raw/dataquality.php	(revision 42795)
@@ -22,5 +22,5 @@
 
 // Fetch data based on range selection
-$range = isset($_GET['range']) ? $_GET['range'] : 'week';
+$range = isset($_GET['range']) ? $_GET['range'] : 'yday';
 
 echo "<table border=\"0\">";
@@ -29,12 +29,14 @@
 echo "    <h1 align=\"middle\">Data Quality Report</h1>";
 echo "  <center>";
-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 week (default)</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=month">Past month</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=year">Past year </a> | ';
+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>   ';
 echo "  </td>";
 echo "</tr>";
 echo "</table>";
-echo getDataQuality2($projectdb, $range);
+echo getDataQuality($projectdb, $range);
 
 menu_end();
@@ -51,5 +53,5 @@
 #
 ###########################################################################
-function getDataQuality2($db, $range = 'week') {
+function getDataQuality($db, $range = 'yday') {
     // Start timer
     $start = microtime(true);
@@ -61,46 +63,68 @@
 
     // Determine the reference exp_name based on the selected range
-    if ($range === 'year') {
-        $expname = "o" . $mjdDay_yearback . "%";
-    } elseif ($range === 'month') {
-        $expname = "o" . $mjdDay_monthback . "%";
-    } else {
-        $expname = "o" . ($mjdDay - 7) . "%"; // Default week-based constraint
+    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';";
-
+    $expIdQuery = "SELECT MIN(exp_id) AS min_exp_id FROM rawExp WHERE rawExp.exp_name LIKE '$expname'";
     $result = $db->query($expIdQuery);
 
-    // Fetch result into $row as an associative array
-    $result->fetchInto($row, DB_FETCHMODE_ASSOC);
+    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;
+    //    echo "Minimum exp_id: " . $min_exp_id;
     } else {
         echo "No results found.";
     }
 
-    echo "<br><br>";
-
-    // Apply different constraints based on the selected range
-    if ($range === 'year') {
-        // Constraint by dateobs within the last 365 days
-        $dateConstraint = "dateobs >= NOW() - INTERVAL 365 DAY AND rawExp.exp_id >= $min_exp_id";
-    } elseif ($range === 'month') {
-        // Constraint by dateobs within the last 30 days
-        $dateConstraint = "dateobs >= NOW() - INTERVAL 30 DAY AND rawExp.exp_id >= $min_exp_id";
-    } else {
-        // Constraint by exp_name for week and day ranges
-        $expnames = array();
-        $days = ($range === 'day') ? 1 : 7; // Set days to 1 for 'day', otherwise default to 7 (week)
-
-        for ($i = 0; $i < $days; $i++) {
-            $expnames[] = "'o" . ($mjdDay - $i) . "%'";
-        }
-        $expnameFilter = " (rawExp.exp_name LIKE " . implode(" OR rawExp.exp_name LIKE ", $expnames) . ") AND rawExp.exp_id >= $min_exp_id";
-        $dateConstraint = $expnameFilter;
+    //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;
     }
 
@@ -109,5 +133,5 @@
                    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
+                   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) 
@@ -126,5 +150,5 @@
         return;
     }
-        echo "<b>Error with $sql</b><br>\n";
+    //    echo "$sql<br><br>\n";
 
     while ($qry->fetchInto($row)) {
@@ -148,5 +172,22 @@
     echo "<script>console.log(" . json_encode($dataJson) . ");</script>"; // Log JSON output to console for debugging
 echo <<<HTML
-<script type="text/javascript" src="loader.js"></script>
+<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">
@@ -168,12 +209,12 @@
 
         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] = 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,
+                "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,
+                "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
@@ -183,6 +224,11 @@
         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) ',
+            title: 'FWHM (MJD: '+firstMJD+')',
             titleTextStyle: {color: 'black', fontSize: 15},
             width: '100%',
@@ -190,6 +236,6 @@
             legend: { position: 'top', alignment: 'center' },
             series: {
-                0: { color: '#0000ff', pointSize: 3, lineWidth: 1 },
-                1: { color: '#33a532', pointSize: 3, lineWidth: 1 },
+                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 }
@@ -208,5 +254,5 @@
         };
 
-        const chart = new google.visualization.LineChart(document.getElementById('dq_div_fwhm'));
+        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_fwhm'));
         chart.draw(data, options);
     }
@@ -244,5 +290,5 @@
 
         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] = 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
@@ -273,10 +319,16 @@
             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,  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,  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,  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,  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,  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,  parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1)
+                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)
             ];
         });
@@ -291,12 +343,12 @@
             legend: { position: 'top', alignment: 'start', maxLines: 3 },
             series: {
-                0: { color: '#00f000', pointSize: 10, pointShape: 'circle',   linewidth: 1},  // 'g' filter
-                1: { color: '#f00000', pointSize: 10, pointShape: 'triangle', linewidth: 1},  // 'r' filter
-                2: { color: '#f05000', pointSize: 10, pointShape: 'square',   linewidth: 1},  // 'i' filter
-                3: { color: '#0050a0', pointSize: 10, pointShape: 'diamond',  linewidth: 1},  // 'z' filter
-               4: { color: '#ffe000', pointSize: 10, pointShape: 'star',     linewidth: 1},  // 'y' filter
-                5: { color: '#808080', pointSize: 10, pointShape: 'polygon',  linewidth: 1},  // 'w' filter
-            },
-            intervals: { color: 'red', lineWidth: 1, style: 'sticks' },
+                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',
@@ -312,5 +364,5 @@
         };
 
-        const chart = new google.visualization.LineChart(document.getElementById('dq_div_zoomzpt'));
+        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zoomzpt'));
         chart.draw(data, options);
     }
@@ -350,5 +402,5 @@
         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] = 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
@@ -384,10 +436,16 @@
             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,  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,  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,  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,  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,  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,  parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1),
+                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),
             ];
         });
@@ -407,12 +465,12 @@
             legend: { position: 'top', alignment: 'center' },
             series: {
-                0: { color: '#00f000', pointSize: 10, pointShape: 'circle',   linewidth: 1},  // 'g' filter
-                1: { color: '#f00000', pointSize: 10, pointShape: 'triangle', linewidth: 1},  // 'r' filter
-                2: { color: '#f05000', pointSize: 10, pointShape: 'square',   linewidth: 1},  // 'i' filter
-                3: { color: '#0050a0', pointSize: 10, pointShape: 'diamond',  linewidth: 1},  // 'z' filter
-                4: { color: '#ffe000', pointSize: 10, pointShape: 'star',     linewidth: 1},  // 'y' filter
-                5: { color: '#808080', pointSize: 10, pointShape: 'polygon',  linewidth: 1},  // 'w' filter
-            },
-            intervals: { color: 'red', lineWidth: 1, style: 'sticks' },
+                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',
@@ -427,5 +485,5 @@
         };
 
-        const chart = new google.visualization.LineChart(document.getElementById('dq_div_zpt'));
+        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zpt'));
         chart.draw(data, options);
     }
@@ -460,398 +518,4 @@
 
 
-###########################################################################
-#
-# Get data quality
-#
-###########################################################################
-function getDataQuality($db, $range = 'week') {
-    // Start timer
-    $start = microtime(true);
-
-    $mjdDay  = getMJD();
-
-    $expnames = array();
-    // Determine the number of days based on the selected range
-    switch ($range) {
-        case 'week':
-            $days = 7;
-            break;
-        case 'month':
-            $days = 30;
-            break;
-        case 'day':
-        default:
-            $days = 1;
-            break;
-    }
-
-    for ($i = 0; $i < $days; $i++) {
-        $expnames[] = "'o" . ($mjdDay - $i) . "%'";
-    }
-    $expnameFilter = implode(" OR rawExp.exp_name LIKE ", $expnames);
-    $sql = "SELECT SUBTIME(dateobs, '10:00:00') AS time, AST_R0, AST_D0, 
-                   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, exp_time, comment, ra*180/pi() as RA, decl*180/pi() as DECL, AST_RS, AST_DS, AST_T0, posang, exp_name, alt, az, rawExp.exp_id
-            FROM rawExp JOIN chipRun using (exp_id) JOIN camRun using (chip_id) JOIN camProcessedExp using (cam_id)
-            WHERE (rawExp.exp_name LIKE " . $expnameFilter . ")
-               AND exp_type = 'OBJECT'
-               AND camRun.state like 'full'
-               AND camProcessedExp.fault = 0
-               AND camProcessedExp.zpt_obs != 0; ";
-
-    $DQarray = array();
-    $qry = $db->query($sql);
-    if (dberror($qry)) {
-        echo "<b>Error with $sql</b><br>\n";
-        return;
-    }
-    
-    while ($qry->fetchInto($row)) {
-        $DQarray[] = $row;
-    }
-    
-    // Ensure $DQarray is not empty
-    if (empty($DQarray)) {
-        echo "<b>Error:</b> Data array is empty.";
-        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
-    <!-- Attempt to load Google Charts library from the Google CDN -->
-    <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 pointing vs mjd
-    function drawMJDChart() {
-        var data = new google.visualization.DataTable();
-            data.addColumn('number', 'MJD');
-            data.addColumn('number', 'RA_offset (AST_R0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'Dec_offset (AST_D0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', '20 TP unit ~5.1"');
-            data.addColumn('number', '-20 TP unit ~5.1"');
-
-        const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
-
-            return [
-                parseFloat(mjd),               // MJD
-                parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-                parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-                20,                            // Dummy value for 20 TP unit
-                -20                            // Dummy value for -20 TP unit
-            ];
-        });
-
-        data.addRows(rows);
-       const options = {
-            title: 'Pointing Offset (MJD)',
-            titleTextStyle: {color: 'black', fontSize: 15},
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            series: {
-                0: { color: '#0000ff', pointSize: 3, lineWidth: 0 }, // RA_offset series
-                1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series
-                2: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }, // Line at y = 20
-                3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }  // Line at y = -20
-            },
-            intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
-            hAxis: {
-                title: 'MJD',
-                gridlines: {count: -1}
-            },
-            vAxis: {
-                title: 'Offset (TP units)',
-            },
-            tooltip: { isHtml: true }, // Render tooltips as HTML
-            chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right
-            fontSize: 15,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_mjd'));
-        chart.draw(data, options);
-    }
-
-
-    // draw pointing scatter
-    function drawSIGChart() {
-        var data = new google.visualization.DataTable();
-            data.addColumn('number', 'MJD');
-            data.addColumn('number', 'RA_offset_scatter (AST_RS)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'Dec_offset_scatter (AST_DS)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-
-        const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
-
-            return [
-                parseFloat(mjd),               // MJD
-                parseFloat(ra_offset_sig),     // RA_offset_scatter (AST_RS)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-                parseFloat(dec_offset_sig),    // Dec_offset_scatter (AST_DS)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-            ];
-        });
-
-        data.addRows(rows);
-
-        const options = {
-            title: 'Pointing Offset Scatter (MJD)',
-            titleTextStyle: {color: 'black', fontSize: 15},
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            series: {
-                0: { color: '#0000ff', pointSize: 3, lineWidth: 0 }, // RA_offset series
-                1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series
-                2: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }, // Line at y = 20
-                3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }  // Line at y = -20
-            },
-            intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
-            hAxis: {
-                title: 'MJD',
-                gridlines: {count: -1}
-            },
-            vAxis: {
-                title: 'Offset Scatter (TP units)',
-            },
-            tooltip: { isHtml: true }, // Render tooltips as HTML
-            chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right
-            fontSize: 15,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_sig'));
-        chart.draw(data, options);
-    }
-
-
-    // position angle
-    function drawPOSChart() {
-        var data = new google.visualization.DataTable();
-            data.addColumn('number', 'MJD');
-            data.addColumn('number', 'RA_offset (AST_R0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'Dec_offset (AST_D0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-
-        const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
-
-            return [
-                parseFloat(position_ang),      // Position Angle
-                parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-                parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-            ];
-        });
-
-        data.addRows(rows);
-
-        const options = {
-            title: 'Pointing Offset (Position Angle)',
-            titleTextStyle: {color: 'black', fontSize: 15},
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            // pointSize: 5, // Point size for scatter plot
-            // lineWidth: 2,
-            series: {
-                0: { color: '#0000ff', pointSize: 3, lineWidth: 0 }, // RA_offset series
-                1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series
-            },
-            intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
-            hAxis: {
-                title: 'Position Angle',
-                gridlines: {count: -1}
-            },
-            vAxis: {
-                title: 'Offset (TP units)',
-            },
-            tooltip: { isHtml: true }, // Render tooltips as HTML
-            chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right
-            fontSize: 15,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_pos'));
-        chart.draw(data, options);
-    }
-
-    function drawALTChart() {
-        var data = new google.visualization.DataTable();
-            data.addColumn('number', 'Altitute');
-            data.addColumn('number', 'RA_offset (AST_R0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'Dec_offset (AST_D0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-
-        const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
-
-            return [
-                parseFloat(alt),      // Position Angle
-                parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-                parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-            ];
-        });
-
-        data.addRows(rows);
-
-        const options = {
-            title: 'Pointing Offset (Altitude)',
-            titleTextStyle: {color: 'black', fontSize: 15},
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            series: {
-                0: { color: '#0000ff', pointSize: 3, lineWidth: 0 }, // RA_offset series
-                1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series
-            },
-            intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
-            hAxis: {
-                title: 'Altitude',
-                gridlines: {count: -1}
-            },
-            vAxis: {
-                title: 'Offset (TP units)',
-            },
-            tooltip: { isHtml: true }, // Render tooltips as HTML
-            //chartArea: {left: 80, top: 50, right: 20, bottom: 50},
-            chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right
-            fontSize: 15,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_alt'));
-        chart.draw(data, options);
-    }
-
-   function drawAZChart() {
-        var data = new google.visualization.DataTable();
-            data.addColumn('number', 'Azumith');
-            data.addColumn('number', 'RA_offset (AST_R0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-            data.addColumn('number', 'Dec_offset (AST_D0)');
-            data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});
-
-        const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
-
-            return [
-                parseFloat(az),      // Position Angle
-                parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-                parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
-            ];
-        });
-
-        data.addRows(rows);
-
-        const options = {
-            title: 'Pointing Offset (Azumith)',
-            titleTextStyle: {color: 'black', fontSize: 15},
-            width: '100%',
-            height: 480,
-            legend: { position: 'top', alignment: 'center' },
-            series: {
-                0: { color: '#0000ff', pointSize: 3, lineWidth: 0 }, // RA_offset series
-                1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series
-            },
-            intervals: { color: 'red', lineWidth: 2, style: 'sticks' },
-            hAxis: {
-                title: 'Azumith',
-                gridlines: {count: -1}
-            },
-            vAxis: {
-                title: 'Offset (TP units)',
-            },
-            tooltip: { isHtml: true }, // Render tooltips as HTML
-            //chartArea: {left: 80, top: 50, right: 20, bottom: 50},
-            chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right
-            fontSize: 15,
-        };
-
-        const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_az'));
-        chart.draw(data, options);
-    }
-
-    google.charts.setOnLoadCallback(drawMJDChart);
-    google.charts.setOnLoadCallback(drawSIGChart);
-    google.charts.setOnLoadCallback(drawPOSChart);
-    google.charts.setOnLoadCallback(drawALTChart);
-    google.charts.setOnLoadCallback(drawAZChart);
-</script>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_mjd" style="width:1240px;"></div>
-    <div class="overlay" style="position: absolute; width: 800px; bottom: 60px; left: 85px;"></div>
-</div>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_sig" style="width:1240px;"></div>
-    <div class="overlay" style="position: absolute; width: 800px; bottom: 60px; left: 85px;"></div>
-</div>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_pos" style="width:1240px;"></div>
-    <div class="overlay" style="position: absolute; width: 800px; bottom: 60px; left: 85px;"></div>
-</div>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_alt" style="width:1240px;"></div>
-    <div class="overlay" style="position: absolute; width: 800px; bottom: 60px; left: 85px;"></div>
-</div>
-
-<div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">
-    <div id="dq_div_az" style="width:1240px;"></div>
-    <div class="overlay" style="position: absolute; width: 800px; 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>";
-
-}
 
 ?>
Index: trunk/ippMonitor/raw/pointing.php
===================================================================
--- trunk/ippMonitor/raw/pointing.php	(revision 42794)
+++ trunk/ippMonitor/raw/pointing.php	(revision 42795)
@@ -22,5 +22,5 @@
 
 // Fetch data based on range selection
-$range = isset($_GET['range']) ? $_GET['range'] : 'week';
+$range = isset($_GET['range']) ? $_GET['range'] : 'yday';
 
 echo "<table border=\"0\">";
@@ -29,12 +29,14 @@
 echo "    <h1 align=\"middle\">Pointing Report</h1>";
 echo "  <center>";
-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 week (default)</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=month">Past month</a> | ';
-echo '    <a href="?pass=' . urlencode($pass) . '&proj=' . urlencode($proj) . '&range=year">Past year </a> | ';
+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>   ';
 echo "  </td>";
 echo "</tr>";
 echo "</table>";
-echo getDataQuality($projectdb, $range);
+echo getPointing($projectdb, $range);
 
 menu_end();
@@ -51,5 +53,5 @@
 #
 ###########################################################################
-function getDataQuality($db, $range = 'week') {
+function getPointing($db, $range = 'yday') {
     // Start timer
     $start = microtime(true);
@@ -61,53 +63,75 @@
 
     // Determine the reference exp_name based on the selected range
-    if ($range === 'year') {
-        $expname = "o" . $mjdDay_yearback . "%";
-    } elseif ($range === 'month') {
-        $expname = "o" . $mjdDay_monthback . "%";
-    } else {
-        $expname = "o" . ($mjdDay - 7) . "%"; // Default week-based constraint
+    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';";
-
+    $expIdQuery = "SELECT MIN(exp_id) AS min_exp_id FROM rawExp WHERE rawExp.exp_name LIKE '$expname'";
     $result = $db->query($expIdQuery);
 
-    // Fetch result into $row as an associative array
-    $result->fetchInto($row, DB_FETCHMODE_ASSOC);
+    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;
+    //    echo "Minimum exp_id: " . $min_exp_id;
     } else {
         echo "No results found.";
     }
 
-    echo "<br><br>";
-
-    // Apply different constraints based on the selected range
-    if ($range === 'year') {
-        // Constraint by dateobs within the last 365 days
-        $dateConstraint = "dateobs >= NOW() - INTERVAL 365 DAY AND rawExp.exp_id >= $min_exp_id";
-    } elseif ($range === 'month') {
-        // Constraint by dateobs within the last 30 days
-        $dateConstraint = "dateobs >= NOW() - INTERVAL 30 DAY AND rawExp.exp_id >= $min_exp_id";
-    } else {
-        // Constraint by exp_name for week and day ranges
-        $expnames = array();
-        $days = ($range === 'day') ? 1 : 7; // Set days to 1 for 'day', otherwise default to 7 (week)
-
-        for ($i = 0; $i < $days; $i++) {
-            $expnames[] = "'o" . ($mjdDay - $i) . "%'";
-        }
-        $expnameFilter = " (rawExp.exp_name LIKE " . implode(" OR rawExp.exp_name LIKE ", $expnames) . ") AND rawExp.exp_id >= $min_exp_id";
-        $dateConstraint = $expnameFilter;
-    }
-
-   // Updated SQL query
+    //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, AST_R0, AST_D0,
                    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, exp_time, comment, ra*180/pi() as RA, decl*180/pi() as DECL, AST_RS, AST_DS, AST_T0, posang, exp_name, alt, az, rawExp.exp_id
+                   filter, exp_time, comment, ra*180/pi() as RA, decl*180/pi() as DECL, AST_RS, AST_DS, AST_T0, posang, exp_name, alt, az, rawExp.exp_id, camRun.label
             FROM rawExp
             JOIN chipRun USING (exp_id)
@@ -126,5 +150,5 @@
         return;
     }
-        echo "$sql<br><br>\n";
+    //    echo "$sql<br><br>\n";
     
     while ($qry->fetchInto($row)) {
@@ -134,5 +158,5 @@
     // Ensure $DQarray is not empty
     if (empty($DQarray)) {
-        echo "<b>Error:</b> Data array is empty.";
+        echo "<center><b> No data for MJD: $mjdDay </b></center>";
         return; // Stop execution if no data to encode
     }
@@ -147,24 +171,22 @@
     
     echo "<script>console.log(" . json_encode($dataJson) . ");</script>"; // Log JSON output to console for debugging
-    
-    echo <<<HTML
-    <!-- Attempt to load Google Charts library from the Google CDN -->
-    <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);
+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>
 
@@ -187,12 +209,12 @@
 
         const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
+            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id, cam_label] = row;
 
             return [
                 parseFloat(mjd),               // MJD
                 parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
                 parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
                 20,                            // Dummy value for 20 TP unit
                 -20                            // Dummy value for -20 TP unit
@@ -201,6 +223,12 @@
 
         data.addRows(rows);
-       const options = {
-            title: 'Pointing Offset (MJD)',
+
+        // 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][3])) : "N/A";
+        console.log("First MJD Value:", firstMJD);
+
+        const options = {
+            title: 'Pointing Offset (MJD: '+firstMJD+')',
             titleTextStyle: {color: 'black', fontSize: 15},
             width: '100%',
@@ -230,5 +258,4 @@
     }
 
-
     // draw pointing scatter
     function drawSIGChart() {
@@ -241,12 +268,12 @@
 
         const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
+            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id, cam_label] = row;
 
             return [
                 parseFloat(mjd),               // MJD
                 parseFloat(ra_offset_sig),     // RA_offset_scatter (AST_RS)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
                 parseFloat(dec_offset_sig),    // Dec_offset_scatter (AST_DS)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
             ];
         });
@@ -294,12 +321,12 @@
 
         const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
+            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id, cam_label] = row;
 
             return [
                 parseFloat(position_ang),      // Position Angle
                 parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
                 parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
             ];
         });
@@ -345,12 +372,12 @@
 
         const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
+            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id, cam_label] = row;
 
             return [
                 parseFloat(alt),      // Position Angle
                 parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
                 parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
             ];
         });
@@ -395,12 +422,12 @@
 
         const rows = dataArray.map(row => {
-            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id] = row;
+            const [timestamp, ra_offset, dec_offset, mjd, filter, exp_time, comment, ra, dec, ra_offset_sig, dec_offset_sig, boresite_ang, position_ang, exp_name, alt, az, exp_id, cam_label] = row;
 
             return [
                 parseFloat(az),      // Position Angle
                 parseFloat(ra_offset),         // RA_offset (AST_R0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
                 parseFloat(dec_offset),        // Dec_offset (AST_D0)
-                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment,
+                "expname: "+exp_name+"<br>exp_id: "+exp_id+"<br>timestamp: "+timestamp+"<br>RA: "+ra+"<br>DEC: "+dec+"<br>filter: "+filter+"<br>comment: "+comment+"<br>cam_label: "+cam_label,
             ];
         });
