Changeset 42972 for trunk/ippMonitor/raw/pointing.php
- Timestamp:
- Mar 19, 2026, 5:23:27 PM (7 weeks ago)
- File:
-
- 1 edited
-
trunk/ippMonitor/raw/pointing.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippMonitor/raw/pointing.php
r42795 r42972 15 15 else {$myMenu = "ipp.czar.dat";} 16 16 17 menu($myMenu, 'Czartool on ' .$lastUpdateTime, 'ipp.css', $ID['link'], $ID['proj']);17 menu($myMenu, 'Czartool on ', 'ipp.css', $ID['link'], $ID['proj']); 18 18 19 19 $pass = $ID['pass']; … … 22 22 23 23 // Fetch data based on range selection 24 $range = isset($_GET['range']) ? $_GET['range'] : 'yday'; 24 $range = isset($_GET['range']) ? $_GET['range'] : 'week'; 25 26 require_once 'functions.php'; 25 27 26 28 echo "<table border=\"0\">"; 27 29 echo "<tr>"; 28 30 echo " <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> '; 31 echo " <h1 align=\"middle\">Data Quality Report</h1>"; 32 33 # 34 # project selector 35 echo '<center>'; 36 # Project selector with highlight 37 $projects = ["gpc1" => "GPC1", "gpc2" => "GPC2"]; 38 foreach ($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 } 45 echo "<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 57 foreach ($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 37 65 echo " </td>"; 38 66 echo "</tr>"; 39 67 echo "</table>"; 40 echo getPointing($projectdb, $range);41 68 69 echo " <div style=\"margin-bottom:10px; font-size:14px; color:#555;\">"; 70 echo " Current MJD: " . getMJD(); 71 echo " </div>"; 72 73 echo getPointing($projectdb, $range, $proj); 42 74 menu_end(); 43 44 45 /////////////////////////////////////////////////////////////////////////////46 // //47 // Functions //48 // //49 /////////////////////////////////////////////////////////////////////////////50 ###########################################################################51 #52 # Get data quality53 #54 ###########################################################################55 function getPointing($db, $range = 'yday') {56 // Start timer57 $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 range65 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 night80 break;81 }82 83 // Query to get the minimum exp_id84 $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 range103 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 night127 $dateConstraint = "rawExp.exp_name LIKE 'o" . ($mjdDay - 1) . "%' AND rawExp.exp_id >= $min_exp_id";128 break;129 }130 131 // Updated SQL query132 $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.label136 FROM rawExp137 JOIN chipRun USING (exp_id)138 JOIN camRun USING (chip_id)139 JOIN camProcessedExp USING (cam_id)140 WHERE $dateConstraint141 AND exp_type = 'OBJECT'142 AND camRun.state LIKE 'full'143 AND camProcessedExp.fault = 0144 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 empty159 if (empty($DQarray)) {160 echo "<center><b> No data for MJD: $mjdDay </b></center>";161 return; // Stop execution if no data to encode162 }163 164 // Convert data array to JSON for easier handling in JavaScript165 $dataJson = json_encode($DQarray);166 167 if ($dataJson === false) {168 echo "<b>Error encoding JSON:</b> " . json_last_error_msg(); // Display any JSON encoding errors169 return; // Stop execution if JSON encoding fails170 }171 172 echo "<script>console.log(" . json_encode($dataJson) . ");</script>"; // Log JSON output to console for debugging173 echo <<<HTML174 <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 successfully178 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 fails185 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 file189 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 JavaScript197 const dataArray = JSON.parse('{$dataJson}'); // Directly parse the PHP JSON string198 199 // draw pointing vs mjd200 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), // MJD215 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 unit220 -20 // Dummy value for -20 TP unit221 ];222 });223 224 data.addRows(rows);225 226 // Extract the first MJD value from dataArray227 //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 series239 1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series240 2: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }, // Line at y = 20241 3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 } // Line at y = -20242 },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 HTML252 chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right253 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 scatter261 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), // MJD274 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 series291 1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series292 2: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }, // Line at y = 20293 3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 } // Line at y = -20294 },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 HTML304 chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right305 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 angle314 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 Angle327 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 plot343 // lineWidth: 2,344 series: {345 0: { color: '#0000ff', pointSize: 3, lineWidth: 0 }, // RA_offset series346 1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series347 },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 HTML357 chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right358 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 Angle378 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 series395 1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series396 },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 HTML406 //chartArea: {left: 80, top: 50, right: 20, bottom: 50},407 chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right408 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 Angle428 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 series445 1: { color: '#33a532', pointSize: 3, lineWidth: 0 }, // Dec_offset series446 },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 HTML456 //chartArea: {left: 80, top: 50, right: 20, bottom: 50},457 chartArea: {left: '7%', top: 60, right: '4%', bottom: 50}, // Adjust left and right458 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 timer499 $total_time = round(microtime(true) - $start, 3);500 echo "<center>Loading plot in $total_time seconds<br></center>";501 502 }503 75 504 76 ?>
Note:
See TracChangeset
for help on using the changeset viewer.
