Index: trunk/ippMonitor/raw/pointing.php
===================================================================
--- trunk/ippMonitor/raw/pointing.php	(revision 42790)
+++ 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,
             ];
         });
