Changeset 42972 for trunk/ippMonitor/raw/dataquality.php
- Timestamp:
- Mar 19, 2026, 5:23:27 PM (7 weeks ago)
- File:
-
- 1 edited
-
trunk/ippMonitor/raw/dataquality.php (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippMonitor/raw/dataquality.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\">"; … … 28 30 echo " <td style=width:1240>"; 29 31 echo " <h1 align=\"middle\">Data Quality 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> '; 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 getDataQuality($projectdb, $range); 68 69 echo " <div style=\"margin-bottom:10px; font-size:14px; color:#555;\">"; 70 echo " Current MJD: " . getMJD(); 71 echo " </div>"; 72 73 echo getDataQuality($projectdb, $range, $proj); 41 74 42 75 menu_end(); 43 76 44 /////////////////////////////////////////////////////////////////////////////45 // //46 // Functions //47 // //48 /////////////////////////////////////////////////////////////////////////////49 50 ###########################################################################51 #52 # Get data quality53 #54 ###########################################################################55 function getDataQuality($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,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, 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.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 FWHM vs MJD200 function drawFWHMChart() {201 var data = new google.visualization.DataTable();202 data.addColumn('number', 'MJD');203 data.addColumn('number', 'FWHM_major');204 data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});205 data.addColumn('number', 'FWHM_minor');206 data.addColumn({'type': 'string', 'role': 'tooltip', 'p': {'html': true}});207 data.addColumn('number', 'seeing ~ 1"');208 data.addColumn('number', 'seeing ~ 3"');209 210 const rows = dataArray.map(row => {211 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;212 213 return [214 parseFloat(mjd), // Position Angle215 parseFloat(iq_fwhm_maj), // RA_offset (AST_R0)216 "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,217 parseFloat(iq_fwhm_min), // Dec_offset (AST_D0)218 "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,219 4,220 12221 ];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][1])) : "N/A";229 console.log("First MJD Value:", firstMJD);230 231 const options = {232 title: 'FWHM (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: 2, lineWidth: 0. },239 1: { color: '#33a532', pointSize: 2, lineWidth: 0. },240 2: { color: 'red', lineWidth: 2, pointSize: 0 },241 3: { color: 'red', lineWidth: 2, lineDashStyle: [8, 4], pointSize: 0 }242 },243 intervals: { color: 'red', lineWidth: 2, style: 'sticks' },244 hAxis: {245 title: 'MJD',246 gridlines: {count: -1}247 },248 vAxis: {249 title: 'FWHM (pixels)',250 },251 tooltip: { isHtml: true }, // Render tooltips as HTML252 chartArea: {left: '8%', top: 60, right: '5%', bottom: 50}, // Adjust left and right253 fontSize: 12,254 };255 256 const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_fwhm'));257 chart.draw(data, options);258 }259 260 // draw zoomed zerpoint vs mjd261 function drawZOOMZPTChart() {262 var data = new google.visualization.DataTable();263 data.addColumn('number', 'MJD');264 265 // Add columns for each filter type to handle separate colors266 data.addColumn('number', 'g (24.563, 25.013)');267 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});268 data.addColumn({type: 'number', role: 'interval'});269 data.addColumn({type: 'number', role: 'interval'});270 data.addColumn('number', 'r (24.750, 24.840)');271 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});272 data.addColumn({type: 'number', role: 'interval'});273 data.addColumn({type: 'number', role: 'interval'});274 data.addColumn('number', 'i (24.611, 24.711)');275 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});276 data.addColumn({type: 'number', role: 'interval'});277 data.addColumn({type: 'number', role: 'interval'});278 data.addColumn('number', 'z (24.240, 24.300)');279 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});280 data.addColumn({type: 'number', role: 'interval'});281 data.addColumn({type: 'number', role: 'interval'});282 data.addColumn('number', 'y (23.320, 23.570)');283 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});284 data.addColumn({type: 'number', role: 'interval'});285 data.addColumn({type: 'number', role: 'interval'});286 data.addColumn('number', 'w (26.000, 26.300)');287 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});288 data.addColumn({type: 'number', role: 'interval'});289 data.addColumn({type: 'number', role: 'interval'});290 291 const rows = dataArray.map(row => {292 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;293 294 // Initialize all filter values as null295 let zp_g = null, zp_r = null, zp_i = null, zp_z = null, zp_y = null, zp_w = null;296 297 // Set the zeropoint offset based on filter and assign it to the correct series298 switch (filter[0]) {299 case 'g':300 zp_g = zpt_obs - 24.563;301 break;302 case 'r':303 zp_r = zpt_obs - 24.750;304 break;305 case 'i':306 zp_i = zpt_obs - 24.611;307 break;308 case 'z':309 zp_z = zpt_obs - 24.240;310 break;311 case 'y':312 zp_y = zpt_obs - 23.320;313 break;314 case 'w':315 zp_w = zpt_obs - 26.000;316 break;317 }318 319 return [320 parseFloat(mjd), // MJD value321 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,322 parseFloat(zp_g - zpt_stdev), parseFloat(zp_g - zpt_stdev*-1),323 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,324 parseFloat(zp_r - zpt_stdev), parseFloat(zp_r - zpt_stdev*-1),325 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,326 parseFloat(zp_i - zpt_stdev), parseFloat(zp_i - zpt_stdev*-1),327 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,328 parseFloat(zp_z - zpt_stdev), parseFloat(zp_z - zpt_stdev*-1),329 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,330 parseFloat(zp_y - zpt_stdev), parseFloat(zp_y - zpt_stdev*-1),331 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,332 parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1)333 ];334 });335 336 data.addRows(rows);337 338 const options = {339 title: 'Zeropoint zoom-in (MJD)',340 titleTextStyle: { color: 'black', fontSize: 15 },341 width: '100%',342 height: 480,343 legend: { position: 'top', alignment: 'start', maxLines: 3 },344 series: {345 0: { color: '#00f000', pointSize: 5, pointShape: 'circle', linewidth: .0}, // 'g' filter346 1: { color: '#f00000', pointSize: 5, pointShape: 'triangle', linewidth: .0}, // 'r' filter347 2: { color: '#f05000', pointSize: 5, pointShape: 'square', linewidth: .0}, // 'i' filter348 3: { color: '#0050a0', pointSize: 5, pointShape: 'diamond', linewidth: .0}, // 'z' filter349 4: { color: '#ffe000', pointSize: 5, pointShape: 'star', linewidth: .0}, // 'y' filter350 5: { color: '#808080', pointSize: 5, pointShape: 'polygon', linewidth: .0}, // 'w' filter351 },352 intervals: { color: 'red', lineWidth: .0, style: 'sticks' },353 hAxis: {354 title: 'MJD',355 gridlines: { count: -1 }356 },357 vAxis: {358 title: 'Zeropoint (mag)',359 viewWindow: { min: -1.00, max: .5 },360 },361 tooltip: { isHtml: true },362 chartArea: { left: '9%', top: 60, right: '5%', bottom: 50 },363 fontSize: 12,364 };365 366 const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zoomzpt'));367 chart.draw(data, options);368 }369 370 // draw zeropoint vs mjd371 function drawZPTChart() {372 var data = new google.visualization.DataTable();373 data.addColumn('number', 'MJD');374 375 // Add columns for each filter type to handle separate colors376 data.addColumn('number', 'g' );377 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});378 data.addColumn({type: 'number', role: 'interval'});379 data.addColumn({type: 'number', role: 'interval'});380 data.addColumn('number', 'r' );381 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});382 data.addColumn({type: 'number', role: 'interval'});383 data.addColumn({type: 'number', role: 'interval'});384 data.addColumn('number', 'i' );385 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});386 data.addColumn({type: 'number', role: 'interval'});387 data.addColumn({type: 'number', role: 'interval'});388 data.addColumn('number', 'z' );389 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});390 data.addColumn({type: 'number', role: 'interval'});391 data.addColumn({type: 'number', role: 'interval'});392 data.addColumn('number', 'y' );393 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});394 data.addColumn({type: 'number', role: 'interval'});395 data.addColumn({type: 'number', role: 'interval'});396 data.addColumn('number', 'w' );397 data.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});398 data.addColumn({type: 'number', role: 'interval'});399 data.addColumn({type: 'number', role: 'interval'});400 401 // Count occurrences of each filter402 const filterCounts = { g: 0, r: 0, i: 0, z: 0, y: 0, w: 0 };403 const rows = dataArray.map(row => {404 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;405 406 // Initialize all filter values as null407 let zp_g = null, zp_r = null, zp_i = null, zp_z = null, zp_y = null, zp_w = null;408 409 // Increment the count for the filter410 if (filterCounts.hasOwnProperty(filter[0])) {411 filterCounts[filter[0]] += 1;412 }413 414 // Set the zeropoint offset based on filter and assign it to the correct series415 switch (filter[0]) {416 case 'g':417 zp_g = zpt_obs - 0.0;418 break;419 case 'r':420 zp_r = zpt_obs - 0.0;421 break;422 case 'i':423 zp_i = zpt_obs - 0.0;424 break;425 case 'z':426 zp_z = zpt_obs - 0.0;427 break;428 case 'y':429 zp_y = zpt_obs - 0.0;430 break;431 case 'w':432 zp_w = zpt_obs - 0.0;433 break;434 }435 436 return [437 parseFloat(mjd), // MJD value438 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,439 parseFloat(zp_g - zpt_stdev), parseFloat(zp_g - zpt_stdev*-1),440 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,441 parseFloat(zp_r - zpt_stdev), parseFloat(zp_r - zpt_stdev*-1),442 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,443 parseFloat(zp_i - zpt_stdev), parseFloat(zp_i - zpt_stdev*-1),444 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,445 parseFloat(zp_z - zpt_stdev), parseFloat(zp_z - zpt_stdev*-1),446 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,447 parseFloat(zp_y - zpt_stdev), parseFloat(zp_y - zpt_stdev*-1),448 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,449 parseFloat(zp_w - zpt_stdev), parseFloat(zp_w - zpt_stdev*-1),450 ];451 });452 data.addRows(rows);453 454 // Include counts in the title using string concatenation455 const countsTitle = 'Zeropoint (MJD) g: ' + filterCounts.g + ', r: ' + filterCounts.r + ', i: ' + filterCounts.i + ', z: ' + filterCounts.z + ', y: ' + filterCounts.y + ', w: ' + filterCounts.w;456 457 458 console.log(countsTitle);459 460 const options = {461 title: countsTitle,462 titleTextStyle: { color: 'black', fontSize: 15 },463 width: '100%',464 height: 480,465 legend: { position: 'top', alignment: 'center' },466 series: {467 0: { color: '#00f000', pointSize: 5, pointShape: 'circle', linewidth: 1}, // 'g' filter468 1: { color: '#f00000', pointSize: 5, pointShape: 'triangle', linewidth: 1}, // 'r' filter469 2: { color: '#f05000', pointSize: 5, pointShape: 'square', linewidth: 1}, // 'i' filter470 3: { color: '#0050a0', pointSize: 5, pointShape: 'diamond', linewidth: 1}, // 'z' filter471 4: { color: '#ffe000', pointSize: 5, pointShape: 'star', linewidth: 1}, // 'y' filter472 5: { color: '#808080', pointSize: 5, pointShape: 'polygon', linewidth: 1}, // 'w' filter473 },474 intervals: { color: 'red', lineWidth: 0, style: 'sticks' },475 hAxis: {476 title: 'MJD',477 gridlines: { count: -1 }478 },479 vAxis: {480 title: 'Zeropoint (mag)'481 },482 tooltip: { isHtml: true },483 chartArea: { left: '9%', top: 60, right: '5%', bottom: 50 },484 fontSize: 12,485 };486 487 const chart = new google.visualization.ScatterChart(document.getElementById('dq_div_zpt'));488 chart.draw(data, options);489 }490 491 google.charts.setOnLoadCallback(drawFWHMChart);492 google.charts.setOnLoadCallback(drawZPTChart);493 google.charts.setOnLoadCallback(drawZOOMZPTChart);494 495 </script>496 497 <div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">498 <div id="dq_div_fwhm" style="width:100%;"></div>499 <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>500 </div>501 502 <div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">503 <div id="dq_div_zpt" style="width:100%;"></div>504 <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>505 </div>506 507 <div class="chartWithOverlay" style="position: relative; width: 1240px; height:500px;">508 <div id="dq_div_zoomzpt" style="width:100%;"></div>509 <div class="overlay" style="position: absolute; width: 400px; bottom: 60px; left: 85px;"></div>510 </div>511 512 HTML;513 // End timer514 $total_time = round(microtime(true) - $start, 3);515 echo "<center>loading plot in $total_time seconds<br></center>";516 517 }518 519 520 521 77 ?> 522 78
Note:
See TracChangeset
for help on using the changeset viewer.
