IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

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

update function.php

File:
1 edited

Legend:

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

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