Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
<<miniBrowser hideControls http://www.aavso.org/>>
----
<<miniBrowser hideControls http://www.aavso.org/observing/charts/vsp/>>
----
[img[RefDocs/Architecture.png]]
A typical network and Internet configuration:
[img[RefDocs/WANLAN.png]]
<<miniBrowser hidecontrols http://forums.dc3.com/>>
from: ''Jörg Hanisch''
----
<<miniBrowser hideControls http://forums.dc3.com/showthread.php?p=16343#post16343>>
----
ACP serves as the hub and instrument sequencer for a fully robotic observatory, and (optionally) as a web and FTP server that provides safe and convenient internet access to a robotic observatory. It is designed to be used in conjunction with Diffraction Limited's [[MaxIm DL Image Processing and Camera Control software]], and the [[FocusMax Autofocus Software]]. Here are a few links to some of the capabilities included in ACP.
!!!Click on the following links to read about each of the following subjects
|[[Using ACP's Pointing Corrector]]|[[Using the Simulators for Test & Practice]]|
|[[Observing Plan Checker]]|[[Deep Sky Catalog]]|
|[[Coordinate Systems]]|[[Auto-Calibration of Images]]|
|[[Auto-Focus Support in ACP]]|[[Automatic Sky Flats]]|
|[[Auto-Guiding Your Mount]]|[[Extended Filter Support]]|
|[[Version Information]]|[[Standard ACP Scripts]]|
----
!How is the ACP Reference Guide organized?
This web-enabled reference guide is a hyperlinked online document containing portions of the contents of the ~ACPHelp.chm file provided with ACP, along with significantly more additional information of general astronomy interest not in the ACP Help file. Listed below are links (in ''@@color:#db0;orange@@'') to the major chapters of the Reference Guide. Click on any of them to open the section.
[[Observing Tools Online]] and [[Observing Tools Online (Abbreviated)]] -- useful web links to online resources for professional and amateur astronomers alike, like the AAVSO, Vizier, Simbad, the Sharpless Catalog, the ARP Catalog, ~GRBs, occultations, and much more
[[Technical Information]] -- references and technical information about advanced capabilities
[[FAQs, Tips & Tricks]] -- answers to frequent user questions, and other stuff
[[Star Catalog Information]] -- particulars about the catalogs used by ACP, and other catalogs, too
[[User-contributed apps and scripts]] -- a collection of useful add-ons
[[Customizing ACP]] -- making ACP "yours"
[[Share your Sky! (Browser Usage)]] -- enabling others to use your observatory
[[ACP Observatory Control Software]] -- introductory descriptions and information
[[Getting Started with ACP]] -- reference information for using ACP with your observatory, telescope and camera
[[Acquiring Images Automatically]] -- how to build plans to run with ACP -- directives, lists, examples, etc.
[[Directives]] -- descriptions of all of ACP's directives are collected here @@color:#0F0;~~^^~~REVISED~~^^~~@@
----
^^If you'd like to see more information or more tools, or if you find substantive errors, please [[suggest improvements|mailto:acp@comctr.dc3.com?subject=Re:ACP%20Reference%20Guide%20(online)]].
The ACP Reference Guide is a work in progress. Some pages might be incomplete.^^
from: ''John Winfield''
----
<<miniBrowser hideControls http://winfij.homeip.net/acp/ACPSelector.html>>
----
The form below is ready for you to fill in the pertinent information per the instructions on the page. After you submit your form, a script in the background does the format conversion to the Google Earth .kml schema. The master .kml file is updated immediately to include your observatory. You can submit a new or second entry, but you cannot edit one you've already submitted. If you make a mistake [[let me know|mailto:richard.berg@verizon.net]], and I'll fix it.
Filling out and submitting the form means that you give your tacit approval to redistribute this information to any ACP customer. There's no interest in making the ACP.kml file public, or in using it for any purpose other than as an illustration of where on Earth ACP is being used. Only those with access to the customer's parts of the Comm Center will be able to find and download the .kml file. The minimum information you need to provide is indicated by asterisks. If you want to associate a website with your placemark, please also fill in the URL.
To use the .kml file, [[click here|http://acp.dc3.com/ACPCustomers.kml]] to retrieve the file and save it someplace. Then in Google Earth, go to the File/Open... menu and point to this .kml file to open it. It will show up in the "Temporary Places" part of the Google Earth menu. You can drag it up to the "My Places" section if you like.
<<miniBrowser hideControls http://acp.dc3.com/google-earth.html>>
----
<<miniBrowser http://dc3.com/>>
<<miniBrowser hideControls http://ascom-standards.org/>>
<<miniBrowser hideControls http://en.wikipedia.org/wiki/Aberration_of_light>>
<<miniBrowser hideControls http://www.arachnoid.com/abouttime/>>
/***
|''Name:''|AccordionMacro|
|''Description:''|Create an accordion effect for menus|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#AccordionMacro|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|
|''Requires:''|InlineSlidersPlugin (http://tw.lewcid.org/#InlineSlidersPlugin)|
!!Usage
* designed to work with the InlineSlidersPlugin.
* when one slider is opened, all other sliders in that tiddler are closed.
* just put {{{<<accordion>>}}} in the tiddler.
* useful for menus.
* [[Demo|AccordionDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.macros.accordion={};
config.macros.accordion.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var tiddler = story.findContainingTiddler(place);
var btns = tiddler.getElementsByTagName("a");
for (var i=0; i<btns.length; i++){
var btn=btns[i];
if (hasClass(btn,"sliderButton")){
btn.old_onclick = btn.onclick;
btn.onclick = function(e){
this.old_onclick.apply(this,arguments);
divs = tiddler.getElementsByTagName("div");
for (var i=0; i<divs.length; i++){
if(hasClass(divs[i],"sliderPanel")){
if(divs[i]!=this.nextSibling){
divs[i].style.display = "none";
if (divs[i].nextSibling.tagName.toLowerCase()=="br"){
divs[i].nextSibling.style.display="";
}
}
else if(divs[i].nextSibling.tagName.toLowerCase()=="br"){
divs[i].nextSibling.style.display = divs[i].style.display =="none"? "": "none";
}
}
}
};
}
}
};
//!END-PLUGIN-CODE
// %/
/***
|''Name:''|AccordionMenuPlugin|
|''Description:''|Turn an unordered list into an accordion style menu|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#AccordionMenuPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.1|
|''Date:''|11/29/2007|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.5|
!!Usage:
* put {{{<<accordion>>}}} immediately after your unordered list
!!Examples:
*[[AccordionMenuPluginDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.macros.accordion={
dropchar : " \u00BB",
handler : function(place,macroName,params,wikifier,paramString,tiddler){
list = findRelated(place.lastChild,"UL","tagName","previousSibling");
if (!list)
return;
addClass(list,"accordion");
if (params.length){
addClass(list,paramString);
}
this.fixLinks(list.childNodes);
},
fixLinks : function(els){
for (var i=0; i<els.length; i++){
if(els[i].tagName.toLowerCase()=="li"){
var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");
if(!link){
var ih = els[i].firstChild.data;
els[i].removeChild(els[i].firstChild);
link = createTiddlyElement(null,"a",null,null,ih+this.dropchar,{href:"javascript:;"});
els[i].insertBefore(link,els[i].firstChild);
}
else{
link.firstChild.data = link.firstChild.data + this.dropchar;
removeClass(link,"tiddlyLinkNonExisting");
}
link.onclick = this.show;
}
}
},
show : function(e){
var list = this.parentNode.parentNode;
var els = list.childNodes;
var open = hasClass(this.parentNode,"accordion-active");
for (var i=0; i<els.length; i++){
removeClass(els[i],"accordion-active");
}
if(!open)
addClass(this.parentNode,"accordion-active");
}
};
config.shadowTiddlers["StyleSheetAccordionMenuPlugin"] = "/*{{{*/\n"+
"ul.accordion, ul.accordion li, ul.accordion li ul {margin:0; padding:0; list-style-type:none;text-align:left;}\n"+
"ul.accordion li ul {display:none;}\n"+
"ul.accordion li.accordion-active ul {display:block;}\n"+
"\n"+
"ul.accordion a {display:block; padding:0.5em;}\n"+
"ul.accordion li a.tiddlyLink, ul.accordion li a.tiddlyLinkNonExisting, ul.accordion li a {font-weight:bold;}\n"+
"ul.accordion li a {background:#202040; color:#FFBF00;}\n"+
"ul.accordion li.accordion-active a, ul.accordion li a:hover {background:#202040;color:#FFF;}\n"+
"\n"+
"ul.accordion li ul li{display:inline-block;overflow:hidden;}\n"+
"ul.accordion li.accordion-active ul li {background:#202040; color:#FFBF00; padding:0em;}\n"+
"ul.accordion li.accordion-active ul li div {padding:1em 1.5em; background:#303060;}\n"+
"ul.accordion li.accordion-active ul a{background:#303060; color:#0F0; padding:0.5em 0.5em 0.5em 1.0em;border:none;}\n"+
"ul.accordion li.accordion-active ul a:hover {background:#303060; color:#FFF;}\n" +
"/*}}}*/";
store.addNotification("StyleSheetAccordionMenuPlugin",refreshStyles);
//!END-PLUGIN-CODE
// %/
This is the script you will probably use most often. It implements ACP's sequencing capabilities with observing plan input. Normally, when started, ~AcquireImages.js will display a file-open window, asking you which observing plan you want to run. There are three ways to bypass this and have ~AcquireImages.js run without user interaction:
*~AcquireImages.js will look in the user's default plans folder for a file ''default.txt''. If it is found, ~AcquireImages.js will run it as a plan.
*~AcquireImages.js will look in the user's default plans folder for a file ''runplanonce.txt''. If this file is found, the first line in the file is read and used as the full path/name to the actual plan file, then //runplanonce.txt is deleted// (hence the name!). The first line of runplanonce.txt must contain the //full path/name// to the desired observing plan file. No folder searching is performed.
*If ~AcquireImages.js is started from another script via the Util.~ChainScript() method, and the chaining script previously set the Util.~ChainParameter property to the name or the full path/name of the observing plan file, ~AcquireImages.js will start running that plan immediately. If only the plan's file name is given, ~AcquireImages.js will look in the user's default plans folder for that plan file and if found, it will be run.
----
This script implements ACP's sequencing capabilities with Remote Telescope Markup Language 2.1 as the input. This is a special purpose script developed for the Lawrence Berkeley Laboratories [[Hands On Universe|http://www.handsonuniverse.org]] project.
----
!About Observing Plans
Observing plans are text files containing instructions on how to acquire images. The easiest way to make observing plans for most people is via the free ACP Planner. It is your responsibility to create your observing plans, using ACP Planner or by hand. Note that Planner can convert ~TheSky™ database exports and mosaics into ACP plans.
If you write plans by hand, or if you hand-edit plans created by ACP Planner, you should use the ACP Plan Checker before running them live. Or you can try running your plan, at which time the compiler/runner script ''~AcquireImages.js'' will compile it into machine format, checking even deeper than the Plan Checker. If there are errors at that time, the plan won't run and you can correct the errors, then try again.
Once created, you can either initiate acquisition by running ''~AcquireImages.js'' script and selecting the plan when it starts, or upload the plan through the web and initiate acquisition via the "Multiple Targets, Observing Plan" web page.
Each of the links below will open a new window.
[[Making Observing Plans]] -- overall format, target specifications, and mixing new and old formats
[[Directives]] -- the whole panoply of directives available for ACP plans
[[Using Tab-Delimited Lists]]
[[Asteroids and Comets]]
[[NEOCP Ephemerides]]
[[Observing Plan Checker]]
[[Sample Observing Plans]]
----
Adding your own logic to ACP's image acquisition process is accomplished through the use of scripts and scriptlets. Already in place scripting stubs, or "hooks," enable and allow the addition of almost anything at a given user site. You need to write your own script code to take advantage of these features. Here's what's covered:
[[Startup and Shutdown scripts]]
[[Script Failure script]]
[[Weather Safety script]]
[[Custom Actions (expert feature)]]
----
<<miniBrowser hideControls http://aladin.u-strasbg.fr/aladin.gml>>
----
<<miniBrowser hideControls http://www.adass.org/adass/proceedings/adass98/mighellkj/>>
----
*Open and save a .pdf version [[here|RefDocs/mighellkj.pdf]]
Just at the beginning of the "constants" section in ~AcquireImages.js (in the ../ACP Obs Control/Scripts folder), you'll see the line:
{{{
var ALWAYSSOLVEFINAL = false; // For users who want repeated attempts to solve final images
}}}
Change this to
{{{
var ALWAYSSOLVEFINAL = true; // For users who want repeated attempts to solve final images
}}}
Before you make the change, copy and save ~AcquireImages.js somewhere safe, just in case...
----
<<miniBrowser http://www.as.ap.krakow.pl/o-c/cont.html>>
----
If you happen to own Software Bisque's implementation of Patrick Wallace's [[TPOINT Telescope Analysis Software]], you can use TPOINT to analyze the pointing models generated by ACP's automatic pointing corrector. This allows you to learn about your telescope's pointing and evaluate the quality of the model. On ACP's Telescope menu, there is an option to save the current (active) model in a backup file. With this option, you can make a copy of the active model and analyze it with TPOINT.
As described on the Using ACP's Pointing Corrector page, ACP saves its model mapping points in a file that is compatible with Diffraction Limited's [[MaxPoint™ Pointing Corrector]]. These model files must be converted into a format that can be imported into TPOINT. ACP comes with a standard script [[ModelToTpoint.vbs]] that converts ACP model files into ~TPOINT-importable text format. Once converted, the resulting text file is imported into TPOINT for analysis.
!Analysis Procedure
The active model in ACP is typically saved into a separate file, for example ~MyModel.clb. The [[ModelToTpoint.vbs]] standard script is run and converts this model into a .dat file (e.g. ~MyModel.dat) that can be imported into TPOINT. Now you're ready to analyze with TPOINT. Depending on how familiar and/or advanced you are with TPOINT, the best place to start is with the "fit data" feature, which is in TPOINT's Model menu. Start with all of the checkboxes in the Terms area turned on. These terms correspond directly with ACP's corrector terms (which ACP uses at all times). You should see "8 terms in use" next to the "More Terms" button. If more than 8 are in use, go into the More Terms window and turn them off. Select Scatter Diagram in the Graph area. This should get you started using TPOINT to analyze ACP's pointing models.
----
<<miniBrowser hideControls http://en.wikipedia.org/wiki/Aberration_of_light>>
|Note: The .pdf version is 16 MB|
<<miniBrowser http://nedwww.ipac.caltech.edu/level5/Arp/Arp_contents.html>>
----
*Read the original refereed article at [[Arp 1966]]
*Here's a web page with [[Arp Galaxy Images]]
*Search a catalog for specific objects on this web page:
<<miniBrowser hideControls http://webviz.u-strasbg.fr/viz-bin/VizieR-2?-source=VII/74A>>
----
<<miniBrowser http://www.338arps.com/>>
----
<<miniBrowser hideControls http://www.asteroidoccultation.com/>>
----
Acquiring images of minor planets (asteroids and comets) is complicated by the fact that the target moves relative to our position on the Earth. This means that the coordinates change with time and thus, to center the target in the image, the coordinates must be calculated for the time of the exposure. By using orbital elements, you provide ACP with the formula for calculating the position of the target at the time we actually start the exposure.
|If your telescope supports offset tracking rates, be sure to look at the #TRACKON and #TRACKOFF plan [[Directives]]. These control ACP's orbital tracking feature, where the motion of the minor planet is fed into the telescope and its tracking is adjusted to match the motion. An orbitally tracked image will show trailed stars and a stationary minor planet.|
The formula for calculating the position of a minor planet changes over time, so orbital elements are themselves calculated for a particular epoch. If you are tracking a minor planet, you should update your orbital elements (or MPCORB.DAT) periodically. There's no set formula for how often to do this. Orbits vary, the orbit may be "improved" via additional observations, the orbit may be perturbed by a large body, etc.
!NEOCP Asteroids
Newly discovered near-earth orbit (NEO) asteroids may not have elements available. They may be listed on the Near Earth Asteroid Confirmation Page ([[NEOCP]]), however, in the form of ephemerides. ACP can also handle targets composed of multiple NEOCP ephemeris records. See [[NEOCP Ephemerides]].
!Minor Planet Elements
ACP accepts minor planet orbital elements in the Minor Planet Center "1-line" format or just the designation (numbered, named, packed or unpacked provisional, see the info on MPCORB below). To get this information directly from the Minor Planet Center's web site (as opposed to a local MPCORB database), first prepare a list of targets you want to image by designation or name. Designations should be entered in one of the following forms:
*Named objects: Denny
*Numbered objects: (1290) or 1290
*Unnumbered objects: 1997 ~XF11 or 1998 AA.
Designations are case sensitive. Once you have this list, go to the Minor Planet Ephemeris Service web page. Enter your objects as above into the list area. You can leave the Ephemeris Options section blank, as you are not getting an ephemeris. Make sure you select "MPC 1-line" for the return format, as shown in the image to the right. You will be prompted to save a file called "elements.txt" (or possibly "elements.txt.COM"), save the file with the name you wish, and an extension of ".txt".
The format of the MPC 1-line elements is shown in the figure below:
{{stretch {[<img[RefDocs/OneLineNEO.png]]}}}
The MPC furnishes elements in a number of formats used by other software, however ACP uses the standard MPC format. ACP is compatible with the new encoded numbering format used for asteroids with numbers 100000 and greater.
!Local MPCORB Database
|If you want to download the elements database from the Minor Planet Center (MPCORB.DAT), ACP can automatically retrieve elements locally, then calculate position and motion. In the folder C:\Program Files\Common Files\ASCOM\MPCORB there is a set of tools for building a fast-lookup database from MPCORB.DAT. Instructions are in the readme.txt file there. If you build the database as instructed, you need only give "MP " plus the designation (numbered, named, packed or unpacked provisional) as a target specification. ACP uses the MPCORB database wrapper object to retrieve the elements. It is very fast!|
If you built the local MPCORB database as described in the note above, you need only give "MP " (note the space after MP) and the designation. If you use a (numbered) minor planet number, you must give all 5 digits, including leading zeroes if necessary. For example:
[<img[RefDocs/~MCorb.png]]
!Comet Elements
MPC 1-Line elements of [[Observable Comets]] are available from the Minor Planet Center. The MPC 1-line format of comet elements is shown in the figure below. The MPC furnishes elements in a number of formats used by other software. ACP uses the standard [[MPC 1-line format]] and supports the specially-named comet-fragment MPS 1-line elements as well.
{{stretch {[<img[RefDocs/CometEls.png]]}}}
from: ''Stan Ralph''
----
<<miniBrowser hideControls http://www.fostersystems.com/downloadcenter1.html>>
----
from: ''Stan Ralph''
----
<<miniBrowser hideControls http://www.fostersystems.com/downloadcenter1.html>>
----
*See also the ~WCSTools Catalogs page that tells how the catalogs are implemented. (Note link at bottom)
<<miniBrowser http://tdc-www.harvard.edu/software/catalogs/>>
----
<<miniBrowser hideControls http://www.cv.nrao.edu/fits/www/yp_survey.html>>
----
Thes websites provide an estimate of the location, extent, and intensity of aurora on a global basis, in both hemispheres, under the conditions that existed at the time of the most recent polar satellite pass.
[[Auroral Ovals - Northern Hemisphere]]
[[Auroral Ovlas - Southern Hemisphere]]
----
<<miniBrowser hideControls http://www.swpc.noaa.gov/pmap/pmapN.html>>
----
<<miniBrowser hideControls http://www.swpc.noaa.gov/pmap/pmapS.html>>
----
|Satellite images are time stamped in "UTC" (Coordinated Universal Time). This is the start time of the reception of the top of the image from the satellite. It takes approximately 30 minutes for MTSAT-1R to complete a scan.
<<miniBrowser http://www.bom.gov.au/products/IDE00902.loop.shtml>>
----
!Using ~Auto-Calibration
~MaxIm DL's automatic calibration feature allows scripted systems such as ACP to use its capabilities. ~MaxIm DL 4.x and 5.0 have a sophisticated calibration group facility that allows building a library of calibration images for various binnings, exposure intervals and temperatures. ACP depends on your having set up ~MaxIm's cal-group facility. It simply calls ~MaxIm at the appropriate point in the acquisition process, and expects ~MaxIm to do the actual calibration.
Prior to doing auto-calibration, ACP saves a copy of the image with "-RAW" appended to the image's file name. Thus you can access the original uncalibrated image if, for some reason, calibration had undesired effects. __Note that this increases your disk space requirements.__
Calibration images you acquire via ACP observing plans are saved in a Calibration folder inside the current image folder. If you want to set up ~MaxIm's calibration groups, you can point the calibration groups generator to the Calibration folder and the images therein will be added to the groups.
|If you want to disable this, edit ~AcquireSupport.wsc with Notepad, look for the statement ''@@color:#ff0; Const ~AUTOCAL_SAVE_RAW = True@@'' and change True to False. Save the document and close Notepad.|
----
!Using ~Auto-Focus
ACP has built-in support for the free [[FocusMax Autofocus Software]], written by Larry Weber and Steve Brady. If you have a focuser that has an ASCOM driver, you can use ~FocusMax together with ACP.
|Do not attempt to use ACP's autofocus features until you can press the ~AcquireStar button in ~FocusMax and achieve reliable automatic focus virtually every time at any place in the sky. Plan to spend some up-front time getting familiar with ~FocusMax. It is a very sophisticated program with lots of features. We all owe a lot to Larry and Steve!|
ACP offers several ways to control autofocus.
#With multiple filters it is recommended that you configure ACP with focus offsets and use periodic autofocus in your observing plans. See [[Extended Filter Support]].
#Alternatively, or in addition to periodic autofocus, you can force an autofocus to be done during observing at specific points in your observing plan (e.g. whenever the filter switches) using the #AUTOFOCUS directive.
#ACP's unique, adaptive autofocus feature monitors focus quality and refocuses your imager only when needed. At present this depends on ~MaxIm DL's half-flux diameter measurements. This measurement is not reliable enough when the image(s) contain large extended objects (galaxies, nebulae), so if you are an astro-imager, we recommend against depending on adaptive autofocus.
!Getting Started
#Connect and install the software for your focuser. Make sure you can control the focuser using the software that comes with it.
#Install the ASCOM Focuser driver for your focuser, if necessary. Most focusers are covered by the set of drivers that come with the ASCOM Platform.
#Go to the ACP Getting Started page and run the ~FocusMax test in step 3 of Software Installation Checks. If needed, install or update your ~FocusMax. @@color:#ff0;''Don't continue here until you know that ~FocusMax 3.4.1 or later is installed.''@@
#In ~FocusMax's Telescope setup, select the ACP Telescope Hub (ASCOM) as the telescope type. __This is essential!__ If you try to use ~FocusMax as a hub between ACP and your scope, then ACP will not be aware of the slews performed by ~FocusMax and will not be able to track the flip state of German mounts. In addition, if you are using the ACP pointing corrector, you will want to give ~FocusMax the benefit of these corrections by attaching it to ACP's hub. Do not use ~FocusMax as a telescope hub!
|~FocusMax has two places where a Chooser window appears. One is for selecting the //focuser// type, the other is for selecting the //telescope// type. In this step you are selecting the //telescope// type. If you can't find the ACP Hub, you are probably looking at the focuser Chooser (which should be set for your specific focuser type).|
#Enable and configure ~FocusMax and its ~AcquireStar feature. This will probably take some effort and time if you're a newcomer to ~FocusMax. Stick with it. The documentation for ~FocusMax is bare-bones, so experiment, read, experiment, and eventually you'll get there. Do this with ACP running and being used as the telescope connection per the above step!
#Using the ~FocusMax-included documentation, configure and test ~FocusMax for your focuser and ~MaxIm DL. @@color:#ff0;''Do not go any further until you can click the ~AcquireStar button and achieve a successful hands-off autofocus with ~AcquireStar!''@@
#In ~FocusMax, select the Open menu, Options (the last menu item in ~FocusMax). In the Options window (shown at right) turn on Send log text to ACP. This will cause ~FocusMax's logging to be included in your ACP run logs, a very handy capability for diagnosing focus problems! Close the Options window.
#__Now shut down ~FocusMax completely.__
#If needed Start ACP and connect to your scope and camera, so it's ready to run and image.
#Go to ACP's Preferences window, ~AutoFocus tab, and enable ~FocusMax and @@color:#ff0;''verify that the ~AcquireStar option is ON.''@@
#Under real skies, run the ''~AutoFocus.vbs'' script from ACP's console. If all is well, you should observe an autofocus cycle being performed successfully.
#Slew the telescope to several random places in the sky. It's entirely unnecessary to go to Messier objects or bright stars. Again, run the ''~AutoFocus.vbs'' script from ACP's console. ~FocusMax should complete successfully every time!
#If you have a filter wheel and multiple filters, run the ''~FocusOffsets.vbs'' script from the console. See [[Extended Filter Support]]. This will set up ACP to adjust focus between filter changes automatically.
#You can also optionally enable adaptive autofocus if you want ACP to focus whenever it thinks it needs to. This is in ACP's Preferences window, ~AutoFocus tab. Fill in the half-flux diamter (HFD) growth percentage, a good place to start is 50%. This will cause ACP to autofocus whenever the HFD exceeds 50% above the last autofocus HFD.
!Routine Use With ACP
Once you have ACP and ~FocusMax set up per the preceding section, using autofocus with ACP is easy. It is recommended that you include periodic autofocus in your observing plans (the #AFINTERVAL directive), but you can force ACP to refocus any time you want. You can also set it to run when your HFD gets above a certain value (adaptive autofocus).
|!NOTE|
|Don't start ~FocusMax yourself. Let ACP start and stop it as needed. In order for this to work, though, you cannot be using ~FocusMax as a telescope hub.|
It is highly recommended that you read through Jim ~McMillan's excellent [[Autoguiding]] paper right now. Jim has a great deal of experience with high-precision unattended autoguiding using ACP, and he is largely responsible for the advanced capabilities of ACP's smart-start autoguiding. After you read it, go to the ACP Help file and start with Smart Autoguiding Setup.
Acquires sky flats using the "minimum gradient" position in the sky. This position is on the solar circle near the zenith, offset in the anti-solar direction by 15 degrees. This should be "close enough" for most uses, including precision photometry. For more information and the theory behind this selection, see "[[The Flat Sky: Calibration and Background Uniformity in Wide-Field Astronomical Images]]", Chromey & Hasselbacher, PASP 108: 944-949, October 1996.
|NOTE: Before using ACP's automatic sky-flat system, be certain to read Using Automatic Sky Flats. It won't work unless you set it up once for your system and prepare at least one flat plan. In particular, see the Getting Started section. ACP's automatic sky-flat capabilities are incredibly powerful, so if you are interested in automating sky-flats, do read about it!|
~AutoFlat.vbs normally runs only under control of the observing system. In this normal mode of usage it expects to find a default/standard flat plan in your Plans folder (typically My Documents/ACP Astronomy/Plans):
*~AutoFlat.vbs will look in your default plans folder for a file defaultflat.txt. If it is found, ~AutoFlat.vbs will use it as a flat plan at both dawn and dusk.
*At dusk, ~AutoFlat.vbs will look in your default plans folder for a file defaultduskflat.txt. If it is found, ~AutoFlat.vbs will use it as the dusk flat plan.
*At dawn, ~AutoFlat.vbs will look in your default plans folder for a file defaultdawnflat.txt. If it is found, ~AutoFlat.vbs will use it as the dawn flat plan.
*(advanced users) ~AutoFlat.vbs will look in your default plans folder for a file runflatplanonce.txt. If this file is found, the first line in the file is read and used as the full path/name to the actual flat plan file, then runflatplanonce.txt is deleted (hence the name!). The first line of runflatplanonce.txt must contain the full path/name to the desired flat plan file. No folder searching is performed.
*(advanced users) ~If ~AutoFlat.vbs is run directly by you, and none of the above default plans or runplanonce have been found, it will display a file-open window so you can choose the flat plan you want it to use.
*(advanced users) If ~AutoFlat.vbs is started from another script via the Util.~ChainScript() method, and the chaining script previously set the Util.~ChainParameter property to the name or the full path/name of the flat plan file, ~AutoFlat.vbs will start running that flat plan immediately. If only the flat plan's file name is given, ~AutoFlat.vbs will look in the user's default plans folder for that flat plan file and if found, it will be run.
|NOTE:: Until you get familiar with the flexibility and degrees of freedom that flat planning can provide, it is strongly recommended that you prepare one standard flat set for general use, called defaultflat.txt, put it into your default plans folder, and use the #DUSKFLATS and #DAWNFLATS directives in your ACP observing plans. It's going to take you some time to determine the optimum ordering for your filter/binning combinations to make the best use of the twilight sky window available for sky-flats.|
There's additional information in [[AutoFlatPlanGen.vbs]] that you can use to automatically generate flat plans using one of your observing plans as input.
----
Reads an observing plan (for ~AcquireImages.js) and generates an automatic sky-flat flat plan using the observing plan as a guide. The resulting flat plan will acquire all of the sky-flat fields that are needed to calibrate the images acquired by the observing plan. When started, ~AutoFlatPlanGen.vbs always displays a file-open window, asking you for the observing plan to scan.
|NOTE: Before using this script, you must do a one-time edit of ~AutoFlatConfig.txt to reflect your particular filter set. Open it with a text editor such as Notepad and look in the User Setup section. The key to success is to get the filters listed in order of increasing sensitivity for sky-flats (e.g., Red is probably your least sensitive when imaging the blue twilight sky!).|
----
This script will perform an auto-focus using ~FocusMax. The ~AutoFocus option in ACP Preferences must be enabled, and ~FocusMax must be installed. It simply calls a library function in ~AcquireSupport. If you have ~FocusMax's ~AcquireStar feature enabled, all of its features will be used, otherwise ACP will select a focus star somewhere within 5 degree radius of the current telescope position, then call ~FocusMax to focus using that star.
----
This script is useful for testing your guider setup with ACP's "smart autoguiding" startup. Position a guide star on the guide sensor with the mount tracking, then run this script. It will immediately do the smart autoguiding startup, choosing the exposure interval for the guide star, then if guiding errors meet limits it will start guiding. At this point, the script displays an OK button and "Press OK to stop guiding." When you press OK, ACP's guiding shutdown logic will run, stopping autoguiding gracefully. The mount will be left with tracking on so that the guide star will remain on the guide sensor.
----
<<miniBrowser hideControls RefDocs/AutoguidingMcMillanNov2005.pdf>>
<div class='header' macro='gradient vert #18f #04b'>
<div class='headerShadow'>
<span id='searchBar' macro="search"></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<!-- <span id='searchBar' macro="search"></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span> -->
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id='ContentFooter' refresh='content' tiddler='contentFooter'></div>
</div>
/***
Styles used in Share Your Sky! adaptation of ~TiddlyWiki. These must be completely overridden in other themes, as this style sheet is used only with the Default TW styles (StyleSheetLayout and StyleSheetColors).
!!Revision History
<<<
''2006.10.08 [rbd]'' Begin version control
''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons.
''2006.10.24 [rbd]'' Complete telemetry colors
''2006.11.07 [rbd]'' Faint border for sysmon thumbnail, add light tiddler borders (with Checketts fix), use new TW 2.1.x ColorPalette color specs.
''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers
<<<
!Overrides for Standard TW styles
***/
/*{{{*/
body {
position: static; /*Clint's IE fix part 1 (part 2 in TW now) */
}
/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/
.tiddler {
border: 1px solid [[ColorPalette::TertiaryLight]];
padding-bottom: 8px;
margin-left: 8px; /* Vastly different on IE vs FireFox! */
margin-bottom: 12px;
}
.headerForeground {
padding: 2.5em 0em 1em 1em;
}
.headerShadow {
padding: 2.5em 0em 1em 1em;
}
#searchBar {
float: right;
margin-top: 1em;
margin-right: 1em;
font-size: 0.9em;
}
#searchBar .button {
margin-right: 0.5em;
border: none;
}
.viewer input {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1.0em;
}
.viewer select {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1.0em;
}
.viewer .sortheader {
font-weight: normal;
}
.viewer .filelist table {
margin_bottom: 0px;
}
.viewer .fileList tr {
border: none;
}
.viewer .fileList td,
.viewer .fileList th {
border: 0;
padding: 2px 8px 2px 8px;
}
.viewer .noBorder table,
.viewer .noBorder th,
.viewer .noBorder tr,
.viewer .noBorder td {
border: 0;
}
.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */
border: 1px solid #eee;
padding: 0px;
}
.viewer iframe {
border: 1px dashed blue;
}
textarea {
font-family:courier !important;
}
.tagged {
display:none;
}
/*}}}*/
/***
!Special style for folded tiddlers
***/
/*{{{*/
.collapsedTitle {
color: #888;
font-size: 1.3em;
font-weight: bold;
}
/*}}}*/
/***
!System Status Display Styles
***/
/*{{{*/
div.progBarBg {
position:relative;
height:0.75em;
background-color: [[ColorPalette::SecondaryPale]];
}
div.progBarFg {
position:absolute;
overflow: hidden;
height: 0.75em;
width:0px;
background-color: [[ColorPalette::SecondaryDark]];
}
td.telemetry {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1em;
background-color: [[ColorPalette::SecondaryPale]];
white-space: pre;
color: [[ColorPalette::TertiaryLight]]; /* "off" state overridden by inner <span> tags */
}
span.telemActive { color: [[ColorPalette::Foreground]]; }
span.telemWarn { color: red; }
span.telemOff { color: [[ColorPalette::TertiaryLight]]; } /* Match color in td.telemetry */
td.telemlabel {
white-space: nowrap;
}
textarea.scriptlog {
border: 1px solid #18f;
margin: 0; padding: 0.5em;
background: [[ColorPalette::SecondaryPale]];
color: black;
font-family: "Lucida Console","Courier New",Courier,monospace !important;
font-size: 8pt !important;
white-space: pre;
line-height: 110%;
}
sidebar borders to 1px. Added Clint Checketts' IE CSS hack to permit the .tiddler CSS to work correctly. How'd he EVER figure that out?
''2006.09.30 [rbd]'' Fix "dotted-line removal" change above so buttons in viewer don't change size when highlighted. This made flickering buttons! Improve table colors in general, fix appearance of sortable table headers, add custom fileList class for the file list tables used in ~SyS.
''2006.10.08 [rbd]'' Much more work over last 10 days, add styles for System Monitor.
''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons. Style <input> and <select> colors to match the rest. OOPS, looks like hell on IE.
''2006.10.27 [rbd]'' Fix colors of SelectThemePlugin button and popup highlight. See inline comments for location.
''2006.10.31 [rbd]'' Reorganize.
''2006.11.07 [rbd]'' Faint border for sysmon thumbnail
''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers
<<<
!Colors Used
*@@bgcolor(#ff7f00):color(#000): #ff7f00@@
*@@bgcolor(#ffbf00):color(#000): #ffbf00@@
*@@bgcolor(#fff):color(#000): #fff@@
*@@bgcolor(#4c4c4c):color(#fff): #4c4c4c@@
*@@bgcolor(#5f5f5f):color(#fff): #5f5f5f@@
*@@bgcolor(#333):color(#fff): #333@@
*@@bgcolor(#666):color(#fff): #666@@
*@@bgcolor(#000030):color(#fff): #000030@@
*@@bgcolor(#000080):color(#fff): #000080@@
*@@bgcolor(#000):color(#fff): #000@@
*@@bgcolor(#000040):color(#fff): #000040@@
*@@bgcolor(#888):color(#fff): #888@@
*@@bgcolor(#ddd):color(#000): #ddd@@
*@@bgcolor(#ffe72f):color(#000): #ffe72f@@
*@@bgcolor(#300000):color(#fff): #300000@@
*@@bgcolor(#600000):color(#fff): #600000@@
*@@bgcolor(#ffffcc):color(#000): #ffffcc@@
*@@bgcolor(#fffacd):color(#000): #fffacd@@
!Generic Layout Rules
***/
/*{{{*/
body {
background: #303060;
position: static; /*Clint's IE fix part 1 (part 2 in TW now) */
}
textarea {
font-family: courier !important; /* Fixed point font for editing */
}
.title{
color: #fffacd;
border-bottom: 1px dashed #333;
}
.subtitle {
color: #666;
}
.collapsedTitle {
color: #888;
font-size: 1.3em;
font-weight: bold;
}
h1, h2, h3, h4, h5 {
color: #fffacd;
background-color: #000040;
border-top: 1px solid #333;
border-bottom: 1px solid #333;
}
/*}}}*/
/***
!Link styles
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a {
color: #ffbf00;
border: 0;
}
a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active {
color: #ff7f00;
border: 0;
border-bottom: #ff7f00 1px dashed;
background: transparent;
text-decoration: none;
}
#sidebarOptions a {
margin: 0;
color: #ffbf00;
border: 0;
}
#sidebarOptions a:active {
color: #ffbf00;
background-color: transparent;
}
#sidebarOptions a:hover {
color: #4c4c4c;
background-color: #ffbf00;
}
#sidebarTabs .tabContents a,
#popup a {
color: #ffbf00;
}
#messageArea a:link,
#messageArea a:visited {
color: #ffbf00;
text-decoration: none;
}
#messageArea a:hover,
#messageArea a:active {
color: #ff7f00;
}
#messageArea .messageToolbar a {
border: 1px solid #ffbf00;
background: #4c4c4c;
}
.headerForeground a {
color: #fff;
}
.toolbar a.button {
border: 0;
}
.editorFooter a {
border: 0;
}
/*}}}*/
/***
!Header styles
***/
/*{{{*/
.header{
border-bottom: 1px solid #ffbf00;
color: #fff;
}
.header a:hover {
border-bottom: 1px dashed #fff;
}
.headerForeground,
.headerShadow {
padding: 2.5em 0em 1em 1em;
}
#searchBar {
float: right;
margin-top: 1em;
margin-right: 1em;
font-size: 0.9em;
}
#searchBar .button {
margin-right: 0.5em;
border: none;
}
/*}}}*/
/***
!Main menu styles
***/
/*{{{*/
#mainMenu {
color: #fff;
}
#mainMenu h1 {
font-size: 1.1em;
}
#mainMenu li,
#mainMenu ul {
list-style: none;
margin: 0;
padding: 0;
}
/*}}}*/
/***
!Sidebar styles
***/
/*{{{*/
#sidebar {
right: 0;
color: #fff;
border: 1px solid #ffbf00;
border-width: 0 0 1px 1px;
}
#sidebarOptions {
background-color: #4c4c4c;
padding: 0;
}
#sidebarOptions .sliderPanel {
background-color: #333;
margin: 0;
}
#sidebarOptions input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
background-color: #666;
}
#sidebarOptions .highlight {
color: #4c4c4c;
background-color: #ffbf00;
}
.listTitle {
color: #fff;
}
/* Special for SelectThemePlugin when
leaving popup open and mousing away*/
#sidebarTabs {
background-color: #4c4c4c;
}
#sidebarTabs .tabSelected {
padding: 3px 3px;
cursor: default;
color: #ffbf00;
background-color: #666;
}
#sidebarTabs .tabUnselected {
color: #ffbf00;
background-color: #5f5f5f;
padding: 0 4px;
}
#sidebarTabs .tabContents a:hover {
color: #ff7f00;
background: transparent;
}
#sidebarTabs .txtMoreTab .tabUnselected {
color: #ffbf00;
background: #5f5f5f;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents {
color: #ffbf00;
background: #4c4c4c;
}
/*}}}*/
/***
!General tab styles
***/
/*{{{*/
.tab.tabUnselected {
background-color: #666;
}
.tab.tabSelected,
.tab.tabSelected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
cursor: default;
}
.tab.tabUnselected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
}
.tabContents {
background-color: #4c4c4c;
border: 0;
}
.tabContents .tabUnselected{
background: #5f5f5f;
}
.tabContents .tab:hover,
.tabContents .tabContents,
.tabContents .tabSelected {
background: #666;
}
/*}}}*/
/***
!Message area styles
***/
/*{{{*/
#messageArea {
background-color: #666;
color: #fff;
border: 2px solid #ffbf00;
}
/*}}}*/
/***
!Popup styles
***/
/*{{{*/
#popup {
color: #fff;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
#popup a:hover {
background: transparent;
color: #ff7f00;
border: 0;
}
#popup hr {
color: #ffbf00;
background: #ffbf00;
}
/* Special for SelectTheme popmenu */
#popup .currentlySelected {
color: #4c4c4c;
background: #ffbf00;
}
/*}}}*/
/***
!Tiddler Display styles
***/
/*{{{*/
/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/
.tiddler {
background: #000030;
border: 1px solid #000080;
padding-bottom: 8px;
margin-left: 8px; /* Vastly different on IE vs FireFox! */
margin-bottom: 12px;
}
#displayArea .button.highlight {
color: #ffbf00;
background: #4c4c4c;
}
.tiddler .button {
color: #888;
}
.tiddler .button:hover,
.tiddler .button:active {
color: #ffbf00;
background-color: #4c4c4c;
border-bottom: 1px solid #4c4c4c; /* No dotted line in buttons */
}
.viewer {
color: #FFF;
}
.viewer table{
background: transparent;
color: #fff;
border: 1px solid;
}
.viewer th {
background-color: #4c4c4c;
color: #fff;
}
.viewer hr {
color: #666;
}
.viewer input,
.viewer select {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1.0em;
/** Looks bad on IE6
padding-left:4px;
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
**/
}
.viewer .sortheader {
font-weight: normal;
}
.viewer pre,
.viewer code {
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
.viewer .button:hover,
.viewer .button:active {
border: 1px solid #4c4c4c; /* Needed to avoid button size changing */
}
.viewer .fileList table {
border-color: #ff7f00;
margin-bottom: 0px;
}
/* For Share your Sky only */
.viewer .fileList tr {
border: none;
}
.viewer .fileList td,
.viewer .fileList th {
border: 0;
padding: 2px 8px 2px 8px;
}
.viewer .noBorder table,
.viewer .noBorder th,
.viewer .noBorder tr,
.viewer .noBorder td,
.viewer iframe {
border: 0;
}
.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */
border: 1px solid #000080;
padding: 0px;
}
/* End Share Your Sky */
.toolbar {
color: #4c4c4c;
}
.footer {
color: #ddd;
}
.selectedTiddler .footer {
color: #888;
}
.editor textarea,
.editor input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
.editorFooter {
color: #aaa;
}
.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}
.tagging,
.tagged {
background: #4c4c4c;
border: 1px solid #4c4c4c;
}
.selected .tagging,
.selected .tagged{
background: #000;
border: 1px solid #ffbf00;
}
.tagging .button,
.tagged .button{
color: #ffbf00;
border: 0;
padding: 0;
}
.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}
.tagging .listTitle,
.tagged .listTitle, {
color: #fff;
}
.tagClear{
margin-top: 1em; /* clear: both; Clint's IE fix part 2 now in TW 2.1.2 */
}
.highlight,
.marked {
background-color: #000080;
color: #ffffff;
}
.cascade {
background: #4c4c4c;
color: #ddd;
border: 1px solid #ffbf00;
}
/*}}}*/
/***
!XP ~NavBar Style Overrides
***/
/*{{{*/
.topItem {
background: url("im/fire-classic-up.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemOver {
background: url("im/fire-classic-up-on.png") no-repeat 0 0;
color: #ffffff;
}
.topItemClose {
background: url("im/fire-classic-down.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemCloseOver {
background: url("im/fire-classic-down-on.png") no-repeat 0 0;
color: #ffffff;
}
.subItem,
.subSubItem,
.subItemOver,
.subSubItemOver {
color: #ffffff;
}
.dropMenu {
background-color: #4c4c4c;
color: #000;
border: 1px solid;
border-color: #4c4c4c #ff7f00 #ff7f00 #ff7f00;
}
/*}}}*/
/***
!System Status Display Styles
***/
/*{{{*/
div.progBarBg {
position: relative;
height: 0.75em;
background-color: #300000;
}
div.progBarFg {
position: absolute;
overflow: hidden;
height: 0.75em;
width: 0px;
background-color: #ff7f00;
}
td.telemetry {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1em;
background-color: #300000;
white-space: pre;
color: #600000;
// "off" state overridden by inner <span> tag: s;
}
span.telemActive {
color: #ccccff;
}
span.telemWarn {
color: #ff0000;
}
span.telemOff {
color: #600000; /* Match color in td.telemetry */
}
td.telemlabel {
white-space: nowrap;
}
textarea.scriptlog {
border: 1px solid #ffbf00;
margin: 0;
padding: 0.5em;
background: #300000;
color: #ffffff;
font-family: "Lucida Console","Courier New",Courier,monospace !important;
font-size: 1em !important;
white-space: pre;
line-height: 110%;
}
/*}}}*/
/***
!Footer styles /% ============================================================= %/
***/
/*{{{*/
#ContentFooter {background:#000; color:#fff; clear:both; padding:0.5em 1em; text-align:center;}
#ContentFooter a {color: #fff; border-bottom: 10px dotted #000;}
#ContentFooter a:hover { color: #fff; background-color:#000;}
/*}}}*/
<div class='header' macro='gradient vert #101020 #303060'>
<div class='headerShadow'>
<span id='searchBar' macro="search"></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<!-- <span id='searchBar' macro="search"></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span> -->
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id='ContentFooter' refresh='content' tiddler='contentFooter'></div>
</div>
/***
!Generic Layout Rules
***/
/*{{{*/
body {
background: #303060;
position: static; /*Clint's IE fix part 1 (part 2 in TW now) */
}
textarea {
font-family: courier !important; /* Fixed point font for editing */
}
.title{
color: #fffacd;
border-bottom: 1px dashed #333;
}
.subtitle {
color: #666;
}
.collapsedTitle {
color: #888;
font-size: 1.3em;
font-weight: bold;
}
h1, h2, h3, h4, h5 {
color: #ffff88;
background-color: #004;
border-top: 1px solid #333;
border-bottom: 1px solid #333;
}
.tagged {
display:none;
}
/*}}}*/
/***
!Link styles
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a {
color: #ffbf00;
border: 0;
}
a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active {
color: #ff7f00;
border: 0;
border-bottom: #ff7f00 1px dashed;
background: transparent;
text-decoration: none;
}
#sidebarOptions a {
margin: 0;
color: #ffbf00;
border: 0;
}
#sidebarOptions a:active {
color: #ffbf00;
background-color: transparent;
}
#sidebarOptions a:hover {
color: #4c4c4c;
background-color: #ffbf00;
}
#sidebarTabs .tabContents a,
#popup a {
color: #ffbf00;
}
#messageArea a:link,
#messageArea a:visited {
color: #ffbf00;
text-decoration: none;
}
#messageArea a:hover,
#messageArea a:active {
color: #ff7f00;
}
#messageArea .messageToolbar a {
border: 1px solid #ffbf00;
background: #4c4c4c;
}
.headerForeground a {
color: #fff;
}
.toolbar a.button {
border: 0;
}
.editorFooter a {
border: 0;
}
/*}}}*/
/***
!Header styles
***/
/*{{{*/
.header{
border-bottom: 1px solid #303060;
color: #fff;
}
.header a:hover {
border-bottom: 1px dashed #fff;
}
.headerForeground,
.headerShadow {
padding: 2.5em 0em 1em 1em;
}
#searchBar {
float: right;
margin-top: 1em;
margin-right: 1em;
font-size: 0.9em;
}
#searchBar .button {
margin-right: 0.5em;
border: none;
}
/*}}}*/
/***
!Main menu styles
***/
/*{{{*/
#mainMenu {
color: #fff;
}
#mainMenu h1 {
font-size: 1.1em;
}
#mainMenu li,
#mainMenu ul {
list-style: none;
margin: 0;
padding: 0;
}
/*}}}*/
/***
!Sidebar styles
***/
/*{{{*/
#sidebar {
right: 0;
color: #fff;
border: 1px solid #ffbf00;
border-width: 0 0 1px 1px;
}
#sidebarOptions {
background-color: #4c4c4c;
padding: 0;
}
#sidebarOptions .sliderPanel {
background-color: #333;
margin: 0;
}
#sidebarOptions input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
background-color: #666;
}
#sidebarOptions .highlight {
color: #4c4c4c;
background-color: #ffbf00;
}
.listTitle {
color: #fff;
}
/* Special for SelectThemePlugin when
leaving popup open and mousing away*/
#sidebarTabs {
background-color: #4c4c4c;
}
#sidebarTabs .tabSelected {
padding: 3px 3px;
cursor: default;
color: #ffbf00;
background-color: #666;
}
#sidebarTabs .tabUnselected {
color: #ffbf00;
background-color: #5f5f5f;
padding: 0 4px;
}
#sidebarTabs .tabContents a:hover {
color: #ff7f00;
background: transparent;
}
#sidebarTabs .txtMoreTab .tabUnselected {
color: #ffbf00;
background: #5f5f5f;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents {
color: #ffbf00;
background: #4c4c4c;
}
/*}}}*/
/***
!General tab styles
***/
/*{{{*/
.tab.tabUnselected {
background-color: #666;
}
.tab.tabSelected,
.tab.tabSelected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
cursor: default;
}
.tab.tabUnselected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
}
.tabContents {
background-color: #4c4c4c;
border: 0;
}
.tabContents .tabUnselected{
background: #5f5f5f;
}
.tabContents .tab:hover,
.tabContents .tabContents,
.tabContents .tabSelected {
background: #666;
}
/*}}}*/
/***
!Message area styles
***/
/*{{{*/
#messageArea {
background-color: #666;
color: #fff;
border: 2px solid #ffbf00;
}
/*}}}*/
/***
!Popup styles
***/
/*{{{*/
#popup {
color: #fff;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
#popup a:hover {
background: transparent;
color: #ff7f00;
border: 0;
}
#popup hr {
color: #ffbf00;
background: #ffbf00;
}
/* Special for SelectTheme popmenu */
#popup .currentlySelected {
color: #4c4c4c;
background: #ffbf00;
}
/*}}}*/
/***
!Tiddler Display styles
***/
/*{{{*/
/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/
.tiddler {
background: #202040;
border: 1px solid #000080;
padding-bottom: 8px;
margin-left: 8px; /* Vastly different on IE vs FireFox! */
margin-bottom: 12px;
}
#displayArea .button.highlight {
color: #ffbf00;
background: #4c4c4c;
}
.tiddler .button {
color: #888;
}
.tiddler .button:hover,
.tiddler .button:active {
color: #ffbf00;
background-color: #4c4c4c;
border-bottom: 1px solid #4c4c4c; /* No dotted line in buttons */
}
.viewer {
color: #FFF;
}
.viewer table{
background: #336;
color: #fff;
border: 1px solid;
}
.viewer th {
background-color: #4c4c4c;
color: #fff;
}
.viewer hr {
color: #666;
}
.viewer input,
.viewer select {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1.0em;
/** Looks bad on IE6
padding-left:4px;
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
**/
}
.viewer .sortheader {
font-weight: normal;
}
.viewer pre,
.viewer code {
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
.viewer .button:hover,
.viewer .button:active {
border: 1px solid #4c4c4c; /* Needed to avoid button size changing */
}
.viewer .fileList table {
border-color: #ff7f00;
margin-bottom: 0px;
}
/* For Share your Sky only */
.viewer .fileList tr {
border: none;
}
.viewer .fileList td,
.viewer .fileList th {
border: 0;
padding: 2px 8px 2px 8px;
}
.viewer .noBorder table,
.viewer .noBorder th,
.viewer .noBorder tr,
.viewer .noBorder td,
.viewer iframe {
border: 0;
}
.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */
border: 1px solid #000080;
padding: 0px;
}
/* End Share Your Sky */
.toolbar {
color: #4c4c4c;
}
.footer {
color: #ddd;
}
.selectedTiddler .footer {
color: #888;
}
.editor textarea,
.editor input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
.editorFooter {
color: #aaa;
}
.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}
.tagging,
.tagged {
background: #4c4c4c;
border: 1px solid #4c4c4c;
}
.selected .tagging,
.selected .tagged{
background: #000;
border: 1px solid #ffbf00;
}
.tagging .button,
.tagged .button{
color: #ffbf00;
border: 0;
padding: 0;
}
.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}
.tagging .listTitle,
.tagged .listTitle, {
color: #fff;
}
.tagClear{
margin-top: 1em; /* clear: both; Clint's IE fix part 2 now in TW 2.1.2 */
}
.highlight,
.marked {
background-color: #000080;
color: #ffffff;
}
.cascade {
background: #4c4c4c;
color: #ddd;
border: 1px solid #ffbf00;
}
.stretch img {
width:100%;
}
/*}}}*/
/***
!XP ~NavBar Style Overrides
***/
/*{{{*/
.topItem {
background: url("im/fire-classic-up.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemOver {
background: url("im/fire-classic-up-on.png") no-repeat 0 0;
color: #ffffff;
}
.topItemClose {
background: url("im/fire-classic-down.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemCloseOver {
background: url("im/fire-classic-down-on.png") no-repeat 0 0;
color: #ffffff;
}
.subItem,
.subSubItem,
.subItemOver,
.subSubItemOver {
color: #ffffff;
}
.dropMenu {
background-color: #4c4c4c;
color: #000;
border: 1px solid;
border-color: #4c4c4c #ff7f00 #ff7f00 #ff7f00;
}
/*}}}*/
/***
!System Status Display Styles
***/
/*{{{*/
div.progBarBg {
position: relative;
height: 0.75em;
background-color: #300000;
}
div.progBarFg {
position: absolute;
overflow: hidden;
height: 0.75em;
width: 0px;
background-color: #ff7f00;
}
td.telemetry {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1em;
background-color: #300000;
white-space: pre;
color: #600000;
// "off" state overridden by inner <span> tag: s;
}
span.telemActive {
color: #ccccff;
}
span.telemWarn {
color: #ff0000;
}
span.telemOff {
color: #600000; /* Match color in td.telemetry */
}
td.telemlabel {
white-space: nowrap;
}
textarea.scriptlog {
border: 1px solid #ffbf00;
margin: 0;
padding: 0.5em;
background: #300000;
color: #ffffff;
font-family: "Lucida Console","Courier New",Courier,monospace !important;
font-size: 1em !important;
white-space: pre;
line-height: 110%;
}
/*}}}*/
/***
!Footer styles /% ============================================================= %/
***/
/*{{{*/
#ContentFooter {
background: url(BlueBack.png);
color:#fff;
clear:both;
padding:0.5em 1em;
text-align:center;
}
#ContentFooter a {
color: #fff;
border-bottom: 10px dotted #0f0;
}
#ContentFooter a:hover {
color: #fff;
background-color:#f00;
}
.textcenter {text-align:center;}
/*}}}*/
!MPCORB Database Package
This package has the tools needed to convert the Minor Planet Center orbital elements catalog into a Microsoft Access database and make the elements availaable to ASCOM scripts and client programs. YOU DO NOT NEED TO HAVE MICROSOFT ACCESS. The ~MakeDB.wsf tool builds the database from scratch. The MPCORB.wsc component provides virtually instantaneous scriptable access to the database. A demo tool, ~GetElements.wsf can be used to test and browse the database.
!Building the Database
#Download the MPCORB database from the Minor Planet Center. This must be the CR/~LF-terminated version of the database. You can get the latest version of this from the [[MPCORB Database website]]. Unzip this and save as MPCORB.DAT (watch it! the file name in the zipfle is different!).
#Double-click the ~MakeDB.wsf file. You'll see a popup message immediately. Read it, then click OK. Wait a few minutes and you'll see another popup indicating that the database has been built, and the number of records that were inserted into it.
!Running the Test Program
#Open a command shell ("DOS" window) into this directory
#Type C:\xxx> cscript ~GetElements.wsf You'll get usage info.
#Try it for speed: cscript ~GetElements.wsf Denny
#Try it using various names, designations, etc.
!Troubleshooting
If you get object errors, then you don't have some required operating system components installed. With XP you should have everything. With earlier operating systems, or 95/98/Me, you'll almost certainly have to install -something-.
Required:
1) The latest ASCOM Platform (for the script engines, etc.) from the [[ASCOM Initiative Web Site]].
2) Data Access Components 2.8 or later
Jet 4.0 Service Pack 7 or later
http://msdn.microsoft.com/data/downloads/updates/default.aspx
Both are free downloads from Microsoft.
!Using This as a Template
This whole thing was developed with (1) Notepad, and (2) the Windows Script 5.6 documentation. The latter comes with the full ASCOM Platform 2.1/2.2. NO DEVELOPMENT TOOLS NEEDED, NO MS ACCESS NEEDED.
If you decide to use this as a template for providing rapid access to other catalogs from scripts, ''@@color:#ff0;YOU MUST ABSOLUTELY POSITIVELY CHANGE THE <registration> IN THE XML OF YOUR SCRIPTLET/WSC COMPONENT!@@''
<registration
progid="ASCOM.MPCORB"
classid="{~A8510BBF-40EA-4D56-9630-9752997549C0}"
description="ASCOM Minor Planet Orbit Database Component"
remotable="no"
version="1.0">
Change the progid to ASCOM.XXX, where XXX is a name for your catalog, for example ASCOM.~LandoltRef. Names are case insensitive.
Change the classid to some other globally unique identifier (GUID). Use the GUIDGEN program if you have it. At the moment, it is available from this web page:
http://webhome.idirect.com/~jhonz/Utilities.HTM
Or you can get a GUID directly from the following web page (if it still works):
http://www.hoskinson.net/webservices/guidgeneratorclient.aspx
----
<<miniBrowser hideControls http://ccdware.com/resources>>
----
This script will calibrate the auto-guider at the current telescope position. If you have a rotator, it will calculate the mechanical offset of your imager with respect to the true position angle, then send the corrected guiding angle to ~MaxIm before calibration. The Guider option in ACP Preferences must be enabled, and the guider must be set up in ~MaxIm DL.
----
You want to use Voice from a ~UserAction, right? There is a way...
1. Open ~AcquireImages.js in Notepad and find the code below. Add a variable to ~AcquireImages.js (and ~WebDocs\~plan-acquire.js):
|//|
|// Globals used by ASP web pages (Util.Script.xxx)|
|//|
|var previewImage;|
|var previewURL;|
|var targetName;|
|var targetRA;|
|var targetDec;|
|//|
|// Voice object for ~UserActions|
|//|
|''@@color:#f0f;var voiceForUA;@@''|
2. Later, in function main(), initialize it to be a copy of Voice:
|~PlanRunDate = ~SunsetOfRun();|
|''@@color:#f0f;voiceForUA = Voice;@@''|
3. Save ~AcquireImages.js. And be sure to copy ~AcquireImages.js to ~WebDocs\~plan-acquire.js.
4. Now in your ~UserAction, use ''@@color:#f0f;Util.Script.voiceForUA.Speak("xxx")@@'';
----
You sure can. Copy this script into Notepad and save it as a <anyname>.vbs file on your (observatory computer's) desktop. When you click it, the script will start both ACP and ~MaxIm, and it will connect the camera in ~MaxIm and start the cooler, and also connect ACP to the camera and the telescope. For it to work, the Windows Scripting Host must be available on your computer (this should be the norm).
----
{{{
set app = createobject ("maxim.application")
set cam = createobject ("maxim.ccdcamera")
set acpa = createobject ("ACP.application")
set tele = createobject ("ACP.Telescope")
set utils = createobject ("ACP.Util")
cam.linkenabled = true
cam.disableautoshutdown = true
cam.cooleron = true
app.LockApp = true
utils.CameraConnected = true
tele.Connected = true
}}}
*See also Bob Denny's [[Startup/Shutdown Script]]
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
!
Many available astronomy packages contain the Guide Star Catalog 1.1. Most of these GSC distributions cannot be used with ~PinPoint. Why not?
~PinPoint requires the Guide Star Catalog 1.1 in its original unmodified format (FITS tables). It will read gzip-compressed table files. In order to save disk space, programming time, or both, most application developers have created unique, private formats for their GSC distributions. There are just about as many of these private ~GSCs as there are programs which supply the GSC. There is no way ACP can support the many private formats out there.
The ~PinPoint ~CD-ROM contains the entire GSC 1.1 (North and South) in its original FITS table format, with each table file gzip-compressed. You can use the 2-disk set if it is still available from the Astronomical Society of the Pacific as well. In this case, if you need access to both North and South regions, you'll need to copy the tables to a hard disk or have 2 ~CD-ROM drives online.
The GSC catalog can also be download from [[gsc.dc3.com]].
----
By way of example, these are all simulated images, except for the real image and the annotated reference chart. The field is a Henden photometry standard field. In the ~MiniSAC Catalog, it's called "Henden ~V404Cyg", and it's located at RA 20:24:09.88, Dec 33:50:14.9.
The real image is a 3-minute exposure through an "R" filter, using a 12-inch SCT and ~ST-7XME camera, with autoguiding.
| !Real Image | !GSC 1.1 (47 catalog stars) |
|[img[RefDocs/HENDEN-V404CYG.png]]|[img[RefDocs/GSC1.1.png]]|
| !~UCAC2 (364 catalog stars) | !~UCAC3 (??? catalog stars) |
|[img[RefDocs/UCAC2.png]]| (pending) |
| !USNO A2.0 (695 Catalog Stars) | !USNO B1.0 (885 catalog stars) |
|[img[RefDocs/A2.0.png]]|[img[RefDocs/B1.0.png]]|
| !NOMAD (1286 catalog stars) | ![[Reference Chart for V404 Cygni]] |
|[img[RefDocs/NOMAD.png]]|[img[RefDocs/FindingChart.png]]|
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
<<miniBrowser hideControls http://cbastro.org/>>
----
|Past 24 hours of IR imagery from the ~MTSAT-1R bird and the Hong Kong Observatory. It takes a couple minutes to download all the images in the loop. Note HKT time; GMT is 8 hours earlier.|
<<miniBrowser http://www.hko.gov.hk/wxinfo/intersat/satpic_s.shtml?pv_mode=playback>>
----
<<miniBrowser hideControls http://www.softdevlabs.com/ClockMon/ClockMon.html>>
{{floatleft small borderright{
Sunshine: #ff0
Grass: #360
Sky: LightBlue
Dirt: #633
Apple: #C00
Banana: #FF0
Lime: #3C6
Orange: #F93
Peach: #F99
Pear: #CF6
Raspberry: #606
Background: #fff
Foreground: #000
PrimaryPale: #9cf
PrimaryLight: #09f
PrimaryMid: #03c
PrimaryDark: #003
SecondaryPale: #ffc
SecondaryLight: #fc9
SecondaryMid: #cc6
SecondaryDark: #630
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #C33
}}}PaletteMaker:<hr><<tiddler PaletteMaker>>{{clear block{}}}
<<miniBrowser http://www.cfa.harvard.edu/iau/Ephemerides/Comets/index.html>>
----
/***
|Name|ConfirmExitPlugin|
|Source|http://www.TiddlyTools.com/#ConfirmExitPlugin|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|window.confirmExit|
|Options|##Configuration|
|Description|extra safety when exiting with unsaved changes|
For extra "data safety" when exiting from a TiddlyWiki document, this plugin prompts you to ''//save any tiddlers that are still being actively edited//''. The plugin then provides an additional option to ''//save the entire TiddlyWiki document//'' before continuing. Finally, if you do not choose to save the file and there are still unsaved tiddler changes, the standard TiddlyWiki warning message is then displayed as usual, with options to ''//stay on the current page or exit and lose all changes.//''
!!!!!Configuration
<<<
<<option chkConfirmExit>> ''//always//'' confirm before exiting (even if no unsaved changes)
<<option chkSaveOnExit>> show save-before-exiting confirmation messages (if unsaved changes)
<<<
!!!!!Revisions
<<<
2008.09.05 2.2.0 renamed plugin ConfirmExitPlugin to better reflect general functionality
2008.09.05 2.1.0 added "always confirm exit" {{{<<option chkConfirmExit>>}}}
2008.04.03 2.0.0 completely re-written to provide checks for active tiddler editors and more consistent warning messages
2007.03.01 1.0.2 use apply() to invoke hijacked core function
2006.08.23 1.0.1 Re-released. Note default is now to NOT enable second message. (i.e., standard behavior)
2006.02.24 1.0.0 Initial release. Replaces ConfirmExitPlugin, which is now included in the TW core functionality.
<<<
!!!!!Code
***/
//{{{
version.extensions.SaveOnExit = {major: 2, minor: 2, revision: 0, date: new Date(2008,9,5)};
// do NOT enable safety checks by default (i.e., use standard behavior unless explicitly enabled)
if (config.options.chkSaveOnExit===undefined) config.options.chkSaveOnExit=false;
if (config.options.chkAlwaysConfirmExit===undefined) config.options.chkAlwaysConfirmExit=false;
config.messages.activeEditorWarning=
"Are you sure you want to navigate away from this page?"
+"\n\n--------------------------------\n\n"
+"'%0' is currently being edited."
+"\n\n--------------------------------\n\n"
+"Press OK to save this tiddler, or Cancel to skip this tiddler and continue.";
config.messages.unsavedChangesWarning=
"Are you sure you want to navigate away from this page?"
+"\n\n--------------------------------\n\n"
+"There are unsaved changes in this TiddlyWiki document."
+"\n\n--------------------------------\n\n"
+"Press OK to save the document, or Cancel to continue without saving.";
// for browsers that support onBeforeUnload event handling
window.saveOnExit_coreConfirmExit=window.confirmExit;
window.confirmExit=function() {
// call core handler (to invoke other hijacked 'on exit' code, e.g., [[StorySaverPlugin]])
window.saveOnExit_coreConfirmExit.apply(this,arguments);
// check for tiddlers being edited and offer chance to save/close each
if (config.options.chkSaveOnExit) story.forEachTiddler(function(tid,elem) {
if (elem.getAttribute("dirty")!="true") return;
if (!confirm(config.messages.activeEditorWarning.format([tid]))) return;
story.saveTiddler(tid);
story.closeTiddler(tid);
});
// check for unsaved changes
if(store && store.isDirty && store.isDirty()) {
if (config.options.chkSaveOnExit && confirm(config.messages.unsavedChangesWarning))
saveChanges(); // save the file
else
return config.messages.confirmExit; // 'unsaved changes' confirmation message
} else if (config.options.chkAlwaysConfirmExit)
return ""; // 'no changes' confirmation message
}
// for older browsers that only support onUnload event handling
window.checkUnsavedChanges=function() { if(window.hadConfirmExit === false) window.confirmExit(); }
//}}}
config.options.chkConfirmExit=true; // asks before unloading web page
!Introduction
Throughout ACP's help, we refer to @@color:#0F0;''J2000''@@ versus ''local topocentric'' (equatorial), also called @@color:#0F0;''~JNow''@@, coordinates. You can think of J2000 as "universal" coordinates, independent of your location on the earth, the date/time, and the motion of the target (if any). So-called "~JNow" coordinates (properly called local topocentric) are the "apparent" coordinates used to point to the object at a particular place on earth, at a particular date/time.
It is assumed that you understand the basic astronomy coordinate systems:
*Equatorial (RA/Dec or HA/Dec)
*Horizontal (Az/Alt)
If it were only that simple. The ''equatorial'' coordinates as seen from the observatory vary with location and time. The coordinates needed to center a star in Arizona tonight will be significantly different than those needed from Australia or from Arizona 5 years ago. Of course objects seem to move across the night sky due to the Earth's rotation, but we're speaking of the equatorial coordinates, not the local horizontal coordinates! What causes equatorial coordinates to change? These Wikipedia links above provide more information:
*[[Precession of the Equinoxes]]
*[[Nutation of the earth's rotation axis]]
*[[Aberration of Light (both annual and diurnal)]]
*[[Parallax]]
!Catalogs - What Coordinates to Use?
A catalog must be usable anywhere at any time. Clearly, we need a __standard coordinate system__ (frame of reference) from which the coordinates for a given place and time can be derived. This is the [[International Celestial Reference System (ICRS)]], which uses the [[International Coordinate Reference Frame (ICRF)]]. For all practical purposes, this is what we call ''J2000'', which is //geocentric// and derived from the earth's axis (equinox) at Julian calendar 2000.0. You'll hear people talking about the "J2000 epoch" but to be proper, we should refer to the coordinate system as the "J2000 equinox". An //epoch// is a time reference only; our standard coordinate reference frame is based on the orientation of the //equinox// (Earth's axis) at the epoch J2000.
!The Telescope - What Coordinates to Use?
In order to point the telescope accurately to an object, we need to "convert" the standard catalog (J2000) coordinates to those of the object as we see if from our location at the current time, called the //local topocentric equatorial coordinates//, or simply //local topo//. As originally stated, the apparent coordinates of an object change over time and with location on the Earth. Some research-grade telescopes do the conversion within their own control systems, but the vast majority of telescopes used with ACP do not. Therefore, ACP normally does this conversion for you, leaving you to (conveniently) work in J2000 coordinates for your observing plans. If you're interested in the details, read on.
!Conversion Process
As outlined above, there are several factors that influence the variation of the apparent equatorial coordinates at a location and time. To convert from J2000 to local topo involves several steps (this is simplified, omitting the very tiny corrections, which ACP nonetheless applies!):
#[[Proper motion]]: Change in apparent position in space due to motion of the object itself, from the J2000 epoch to now.
#[[So-called Precession]]: Apply the change in the tilt of the earth's axis from the J2000.0 epoch to now, actually a combination of Precession of the Equinoxes and Nutation.
#[[Parallax]]: Correct for the position of the earth in its orbit around the sun and our position on the earth as it rotates. The closer the object the greater the correction.
#[[Annual Aberration]]: Resulting from the earth's velocity around the sun relative to the inertial reference frame. This variation is around 20 arcseconds.
At this point we have local topo (assuming "tiny" corrections have been omitted). We can transform to local horizontal (alt/az) and apply the refraction correction, then back to equatorial (if we have an equatorial mount) and point it. If you hear someone talk about ''~JNow'' coordinates, be wary. This term is often imprecise, including only the first two corrections above, or maybe all four (and maybe the tiny ones too).
In any case, all coordinate input to ACP, whether it comes from a Deep Sky Catalog search, from positions you take out of specialized catalogs, or from MPC or NEO listings, must be J2000 coordinates. ACP will perform the appropriate calculations to ensure every image is centered.
----
<<miniBrowser hideControls http://iraf.noao.edu/projects/ccdmosaic/astrometry/astrom.html>>
----
!Account Setup
All of ACP's web and FTP services are protected by username/password logins. Thus it is not possible for just anyone to view pages or take control of your observatory. Only those people to whom you grant access can use your observatory. Web and FTP servers share the same user accounts.
|NOTE: You should only grant access to people who you trust. By granting someone basic access, you are giving them the right to seize control of the observatory and acquire single images. If you give them permission to upload things, they can upload observing plans and do long automated runs, acquiring many images. If you give them permission to upload and to execute scripts, they can do anything, including erasing your hard drive. For details on account permissions, see [[Web Account Privileges]].|
|''Moral: give accounts and permissions only to those you trust, and do not give "run scripts" permissions to anyone but yourself and your most trusted users!''|
Here's how to create an account for yourself. The process is the same when creating accounts for others. Be sure ACP is still running from the previous step.
#Open up the ACP Preferences, Server tab dialog. The user list is initially empty.
#Click New to display the New User dialog.
#In the upper field, enter your full name, for example, John Q. Public
#In the lower field, enter a username for login, for example, jpublic.
#Click OK to close the New User dialog. Note that the full name appears in the list.
#Click on your name in the list. Notice the generated password. ACP generates random passwords. These are difficult to remember, but also difficult to crack. Consider using the generated password. If you want to change it, do so now.
#For yourself, click Allow File Uploading, Allow Script Execution, and Allow Using FTP Server.
#Now click OK to close the Web Users dialog. ''Leave ACP running.''
You are now ready to log into ACP's web and FTP servers. First we'll use the browser on this computer, then we'll use a browser on different computer at your facility.
Go on to [[First-time Login: Local Access]]
----
<<miniBrowser http://www.cfa.harvard.edu/iau/Ephemerides/CritList/index.html>>
----
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};
//--
//-- Crypto functions and associated conversion routines
//--
// Crypto "namespace"
function Crypto() {}
// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
var be = Array();
var len = Math.floor(str.length/4);
var i, j;
for(i=0, j=0; i<len; i++, j+=4) {
be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
}
while (j<str.length) {
be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
j++;
}
return be;
};
// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
var str = "";
for(var i=0;i<be.length*32;i+=8)
str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
return str;
};
// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
var hex = "0123456789ABCDEF";
var str = "";
for(var i=0;i<be.length*4;i++)
str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
return str;
};
// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
return Crypto.be32sToHex(Crypto.sha1Str(str));
};
// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};
// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
// Add 32-bit integers, wrapping at 32 bits
add32 = function(a,b)
{
var lsw = (a&0xFFFF)+(b&0xFFFF);
var msw = (a>>16)+(b>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Add five 32-bit integers, wrapping at 32 bits
add32x5 = function(a,b,c,d,e)
{
var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Bitwise rotate left a 32-bit integer by 1 bit
rol32 = function(n)
{
return (n>>>31)|(n<<1);
};
var len = blen*8;
// Append padding so length in bits is 448 mod 512
x[len>>5] |= 0x80 << (24-len%32);
// Append length
x[((len+64>>9)<<4)+15] = len;
var w = Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for(var i=0;i<x.length;i+=16) {
var j,t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
for(j = 0;j<16;j++) {
w[j] = x[i+j];
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=16;j<20;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=20;j<40;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=40;j<60;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=60;j<80;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
h0 = add32(h0,a);
h1 = add32(h1,b);
h2 = add32(h2,c);
h3 = add32(h3,d);
h4 = add32(h4,e);
}
return Array(h0,h1,h2,h3,h4);
};
}
//}}}
Any ACP script that uses the support library ~AcquireSupport.wsc, including the standard image acquisition script ~AcquireImages.js, can call out to user-written script snippets (scriptlets). This powerful feature, custom actions, enables ACP to meet virtually any special need(s) without having to modify the standard scripts or the scripting support library (or ACP itself, of course!). Scriptlets are called for all of the following events:
*Script start
*Script end
*Slew start (see below)
*Slew end
*Image start (see below)
*Image end (see below)
*Image completion (see below)
*Target start (see below)
*Target end (see below)
*Shutdown (see below)
To use this feature, you need to insert your custom script actions (scriptlets) into an ~ACP-provided [[UserActions-template.wsc]] Windows Script Component (WSC) called ''@@color:#ff0;~UserActions.wsc@@''. This file contains the framework for the WSC, and stubbed-out implementations for each of the above actions. All functions except ~ScriptEnd() must return a Boolean (true/false) value. Returning False will stop the script with an error message. If you return False, you should log the reason in the console log in your code.
|!NOTE|
|To activate this feature, you ''@@color:#ff0;must register ~UserActions.wsc with ~REGSVR32@@''. Once registered, you will see "User actions detected" in your run logs, and the functions will be called during each invocation of a script. To deactivate this feature, unregister ''~UserActions.wsc''. For more information, look at the ''~UserActions.wsc'' file itself with Notepad.|
!Accessing the Running Script
From within your custom actions, you can access methods and properties of the running script. To access these items, use the following syntax:
|Util.Script.//property-or-method//|
Any method, and all variables defined outside the scope of a property or method implementation, in the running script are accessible this way. For example, the standard ~AcquireImages.js script contains a variable called targetName, which contains the name of the target currently being acquired.
|!NOTE|
|Don't modify the value of any script variables unless you know exactly what you're doing.|
!Accessing the ~AcquireSupport Library
From within your custom actions, you can use any of the properties and methods of the ~AcquireSupport library. To access these items, use the following syntax:
|Util.Script.SUP.//property-or-method//|
All of ACP's standard scripts define a global variable SUP which is the handle to the initialized ~AcquireSupport library. Thus, using the running-script access syntax described in the previous section, you can access ~AcquireSupport. It is chock full of useful methods, and its properties can be used to learn a lot about the running script. Have a look at ~AcquireSupport.wsc with a text editor. It is a Windows Script Component, so using ~PrimalScript will make looking at it easier.
|!NOTE|
|Don't modify the value of any of ~AcquireSupport's properties unless you know exactly what you're doing.|
!Debugging Custom Actions
The simplest way to debug custom user actions is via ~MsgBox() statements within your code. Be sure to remove them before going into production, though! Otherwise your observing work will stop if one of them are displayed, requiring you to click OK to proceed.
There are also a couple of additional levels of debugging available. User Actions are contained within a supplied template Windows Script Component (WSC), which is "known" to ACP's standard scripts. Once enabled the functions in ~UserActions.wsc are automatically called by ACP at the appropriate times during ACP's standard script execution cycles.
On this page is information about the Error Switch and the Debug Switch. Each of these switches is in the XML framework of ~UserActions.wsc and may be edited with Notepad, etc. Their function is also explained in this section of ACP help. By using the Error Switch and/or Debug Switch, you can cause ~UserActions.wsc to pop up an error message if any run-time error occurs. By using the Debug Switch, you can cause ~UserActions to invoke your script debugger on a Stop (VBS) or debugger (JS) statement, or any run time error.
For information on how to install and use the Microsoft Office Script Debugger (recommended) see Debugging.
!Slew Start Function
The ~SlewStart() function is called with parameters that contain the J2000 equatorial coordinates of the slew destination. You could use these, for example, to perform special safety tests before each slew. Returning False will stop the script with an error.
!Image Start Function
The ~ImageStart() function is called with parameters that allow you to modify the image acquisition. The exposure interval, binning, and sub frame fraction can be altered, resulting in a change from the parameters specified in the plan or script that is doing the image acquisition. Two other parameters //which must not be changed// specify the filter that is selected and whether or not this is a pointing exposure.
One way to use this feature is to alter the exposure interval to compensate for a filter's transmissivity when doing a pointing exposure. When combined with the Filter Info feature, you could use the selected imaging filter for pointing exposures as well. You could also force pointing exposures to be acquired at binning levels other than the default chosen by ACP.
!Image End Function
The ~ImageEnd() function is special. It is called with a parameter that is the full path/name of the final (closed) image file. With this information, you could apply special post-processing of the image. For example, you could mail the file to a user, or extract science information using a program such as IRAF or the ~PinPoint engine, etc. Scripts can start shell programs such as IRAF and pass command line parameters to same (see documentation on the ~WScript.Shell object in the Windows Script 5.6 documentation). ''@@color:#ff0;Do not rename or move the image file in this action!@@'' Use the ~ImageComplete() function described in the next section.
!Image Complete Function
The ~ImageComplete() function is called with a parameter that is the full path/name of the final (closed) image file, after all post-acquisition processing has been completed. It may have been plate-solved and/or calibrated. This event allows you to (among other things) change the final file path/name of the just-acquired //and processed// image.
!Target Start Function
The ~TargetStart() function is called with parameters that allow you to examine or modify virtually anything about the upcoming target. You could use this function, for example, to offset from the given coordinates or alter the name. Returning False will stop the script with an error.
!Target End Function
The ~TargetStart() function is called with parameters that allow you to examine virtually anything about the just-finished target and do some post-acquisition task, then decide whether or not to continue acquisition, and even start a new observing run. Returning False will stop the script with an error.
Shutdown Function
The Shutdown() function is called when an ACP plan uses the #shutdown directive, or when any script calls the Shutdown() method of the ~AcquireSupport library. This can be used to override or augment the default observatory shutdown logic. If this method returns True, the default logic is skipped, otherwise the default logic is executed after the logic in the custom action. This is not the same as the ACP Shutdown script, which runs when ACP itself is shut down.
!Migrating if New Actions are Added
Occasionally, upgrades to ACP will add new user actions. When this happens, you must merge your custom action code into the new template, as the new actions must exist as methods in //your// ~UserActions.wsc. The ACP installer always creates a template file, [[UserActions-template.wsc]], which contains the current set of user actions. To migrate, you have two choices. Which one you use depends on your comfort level:
#Copy your custom code from your current ~UserActions.wsc into the same methods in the ~UserActions-template.wsc, then save ~UserActions-template.wsc over the top of your ~UserActions.wsc. This will upgrade your ~UserActions.wsc.
#Look at ~UserActions-template.wsc and note any newly added methods. Add them to the interface section (XML) of your ~UserActions.wsc, and add the corresponding template method code to your ~UserActions.wsc. This will also upgrade your ~UserActions.wsc.
Sometimes ACP's standard image file naming and/or folder usage is not well suited for a particular observatory's use. Since ACP is designed to be usable by a wide spectrum of astronomers, we've provided a way to customize the image (and log) file naming, as well as the folder paths and names for same. This facility treats "light" images separately from calibration images and log files.
To activate this feature for a particular class of files (image, dark/bias, or log), you need to create a corresponding template text file (with notepad or your favorite text editor) in the ACP installation folder (typically c:\Program Files\ACP Obs Control). For live images, the config file is @@color:#0F0;~ImageFileConfig.txt@@. For dark/bias files, it is @@color:#0F0;~CalFileConfig.txt@@. For log files, it is @@color:#0F0;~LogFileConfig.txt@@. Note that, with this release of ACP, custom autoflat file and folder names are enabled (scroll down).
!Config File Format
The format of the config files (for each type of image) is the same. Blank lines and lines beginning with ; are considered to be comments. At least one line (see next section) needs to have the template for the path and name of the corresponding class of files. To generate customized file and folder paths and names, the template can contain "tokens" which will be replaced by ACP to form the final folder/file path and name. For example, an ~ImageFileConfig.txt containing
|$DEFPATH\$DATENITE\$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$FILTER|
will result in the normal/default folder and file naming for light images that ACP provides without customization. The other config files are ~CalFileConfig.txt (dark/bias images) and ~LogFileConfig.txt (log files).
|!NOTE|
|Do not include the file type (extension) such as .fts or .fit in the templates!|
!~Per-User and Separate Web Templates (advanced)
It is possible to have special file/folder naming for one or more web users. You can specify one template for all web users and/or separate templates for one or more web users. To do this, precede any default template (as described above) with user-specific templates, then (optionally) a web-specific template (applies to all web users who don't have specific templates, then end the file with the (optional) override template as described in the preceding section. Web users are designated by enclosing their login username in square brackets. An "all web users" template is specified with [*]. The user-specific templates must come first, followed by a possible all-web-users template, followed by a possible default template. Some examples should make this clearer:
|[*] $DEFPATH\$~DATENITE-$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$FILTER|
This gives web users a naming where file names start with the "run date" (see below) instead of creating separate folders with the run-date name. Note the '-' after $DATENITE, which makes it part of the file name. Local users get the standard ACP naming.
|[*] $DEFPATH\$~DATENITE-$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$FILTER|
|$DEFPATH\$DATEUTC\$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$~MERSIDE-$FILTER|
This gives all web users the custom naming from the previous example, and gives local users folders with the UTC date name (instead of the run date) as well as adding East/West meridian status to file names.
|[jdoakes] $DEFPATH\$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$FILTER|
|[kblack] D:\kblackastro\$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$FILTER|
|[*] $DEFPATH\$~DATENITE-$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$FILTER|
|$DEFPATH\$DATEUTC\$~TGTNAME-S$~SETNUM-R$~RPTNUM-C$~CNTNUM-$~MERSIDE-$FILTER|
This gives web users jdoakes and kblack their own file/folder naming, all other web users a different naming, and local users yet another naming.
|!NOTE|
|Be sure to specify (optional) web-user-specific templates first, then the (optional) all-web-user template, with the (optional) default template last.|
!~AutoFlat File and Folder Customization
The template strings for custom ~AutoFLat file/folder naming are part of the file ~AutoFlatConfig.txt. Rather than using a single template string as above, there are separate templates for folders and files. The format of each is similar to those described above, and appear in ~AutoFlatConfig.txt to produce the default/standard naming.
!Substitution Tokens
So what are the $XXX tokens that are used for substitution? And which ones are applicable for image vs dark/bias vs log files, filters and folders? Here's the list of [[Substitution Tokens]].
----
You can customize the operation of ACP in several interesting ways. Click the links below to go to those pages.
[[Filter Usage and Focus Offsets]]
[[Custom File and Folder Names]]
[[Web, Error, and Weather Alert Sounds]]
[[Tip of the Day Messages]]
[[Registry Settings]]
[[Adding to ACP Logic]]
[[More...]]
----
<<miniBrowser hideControls http://archive.stsci.edu/cgi-bin/dss_plate_finder>>
----
!ACP Deep Sky Catalog
The ACP deep sky catalog is a file of J2000 coordinates for over 45,000 designations of deep sky objects. The catalog is a combination of the [[Saguaro Astronomy Club (SAC) V7.2 catalog]], the [[Sharpless Catalog]], the [[Arp Catalog]] and the PGC galaxies from the [[Third Reference Catalog of Bright Galaxies (RC3)]]. Almost all objects are listed by the catalog abbreviation, followed by a space, followed by the number in that catalog.
|>|>|!Examples|
|M 51 |MCG -03-01-01 |Bochum 15|
|NGC 2100 |vdB 150 |Sh 2-122|
|PGC 63008 |PK 26-11.1 |LBN 623|
|Arp 312 |Abell 347 |ESO 350-23|
!!!Searching the Catalog
The ACP Go window has a Search button. This displays another form with which you can do powerful searches of the Deep Sky Catalog. The "Match pattern" box is where you enter your search specification. The power of the catalog search facility is in the construction of the match pattern. This simple form can do very sophisticated searches. First, let's look at the simplest way to use it:
!!!Simple Match Pattern - //Contains//
The easiest way to search is to enter some part of the name into the "Match pattern" box and click Search. This will return any object whose name contains the characters you entered. For example, "M" will match all objects that contain the letter "M" or "m".
!!!Simple Match Pattern - //Starts With//
If you want to specify the //starting characters// of the name, prefix your pattern with an up-arrow. For example, "^M" will match all objects that begin with the letter "M". For just Messier objects, which begin with M and a space, enter "^M " (note the space after the M).
!!!General Pattern - //Regular Expression//
You can perform arbitrarily complex catalog searches with the use of //regular expression// match patterns. If you haven't encountered these before, they can be a bit intimidating. Play around with regular expressions a bit and you may find they will enhance your searching ability greatly. If you already know about regular expressions, you will immediately be able to use the full power of ACP's catalog searching facility.
The following table shows the meta-characters that can be used in regular expression searches of the ACP Deep Sky Catalog. Multi-line features are not available. You have already seen the use of the up-arrow to force beginning-of-text matching.
|!Character|!Description|
|\ |Marks the next character as either a special character or a literal. For example, "n" matches the character "n". "\b" matches a word boundary. The sequence "\\" matches "\" and "\(" matches "(".|
|^ |Matches the beginning of input.|
|$ |Matches the end of input.|
|* |Matches the preceding character zero or more times. For example, "zo*" matches either "z" or "zoo".|
|+ |Matches the preceding character one or more times. For example, "zo+" matches "zoo" but not "z".|
|? |Matches the preceding character zero or one time. For example, "a?ve?" matches the "ve" in "never".|
|. |Matches any single character.|
|x|y |Matches either x or y. For example, "z|wood" matches "z" or "wood". "(z|w)oo" matches "zoo" or "wood".|
|{n} |n is a nonnegative integer. Matches exactly n times. For example, "o{2}" does not match the "o" in "Bob," but matches the first two o's in "foooood".|
|{n,} |n is a nonnegative integer. Matches at least n times. For example, "o{2,}" does not match the "o" in "Bob" and matches all the o's in "foooood." "o{1,}" is equivalent to "o+". "o{0,}" is equivalent to "o*".|
|{n,m} |m and n are nonnegative integers. Matches at least n and at most m times. For example, "o{1,3}" matches the first three o's in "fooooood." "o{0,1}" is equivalent to "o?".|
|[xyz] |A character set. Matches any one of the enclosed characters. For example, "[abc]" matches the "a" in "plain".|
|[^xyz] |A negative character set. Matches any character not enclosed. For example, "[^abc]" matches the "p" in "plain".|
|[a-z] |A range of characters. Matches any character in the specified range. For example, "[a-z]" matches any lowercase alphabetic character in the range "a" through "z".|
|[^m-z] |A negative range characters. Matches any character not in the specified range. For example, "[m-z]" matches any character not in the range "m" through "z".|
|\b |Matches a word boundary, that is, the position between a word and a space. For example, "er\b" matches the "er" in "never" but not the "er" in "verb".|
|\B |Matches a non-word boundary. "ea*r\B" matches the "ear" in "never early".|
|\d |Matches a digit character. Equivalent to [0-9].|
|\D |Matches a non-digit character. Equivalent to [^0-9].|
|\s |Matches any white space including space, tab, form-feed, etc. Equivalent to "[ \f\n\r\t\v]".|
|\S |Matches any nonwhite space character. Equivalent to "[^ \f\n\r\t\v]".|
|\w |Matches any word character including underscore. Equivalent to "[~A-Za-z0-9_]".|
|\W |Matches any non-word character. Equivalent to "[^~A-Za-z0-9_]".|
----
<<miniBrowser hideControls RefDocs/McMillanDeepSkyImagingOct2005.pdf>>
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};
//--
//-- Deprecated code
//--
// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};
// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,"pre",null,null,text);
w.nextMatch = lookaheadRegExp.lastIndex;
}
};
// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
createTiddlyElement(place,"br");
};
// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
var i = this.indexOf(item);
return i == -1 ? null : i;
};
// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
return store.getLoader().internalizeTiddler(store,this,title,divRef);
};
// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
return store.getSaver().externalizeTiddler(store,this);
};
// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
return store.allTiddlersAsHtml();
}
// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
refreshPageTemplate(title);
}
// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
story.displayTiddlers(srcElement,titles,template,animate);
}
// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
story.displayTiddler(srcElement,title,template,animate);
}
// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;
// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");
}
//}}}
<<miniBrowser hidecontrols http://www.cyanogen.com/>>
<<miniBrowser hideControls http://www.thinkman.com/dimension4/index.html>>
Directives may be interspersed within the target lines in your observing plans. The system recognizes a directive by its first non-blank character, which must be a "#". Directives come in five flavors, and they are arranged in the following hierarchy. Click on the Title lines to read more details about each directive.
@@color:#db0;''Once-only directive''@@. This must appear before the first target.
#NOTIMECOMPRESS - the 10x time compresson when simulating will be disabled.
<<<
[[Directives that affect the plan as a whole]]. These can appear anywhere in your plan, but only one time.
#SETS
#AFINTERVAL
#DOMEFLATS
#DUSKFLATS
#MINSETTIME
#QUITAT
#SHUTDOWN
#SHUTDOWNAT
#STARTSETNUM
#COMPLETIONSTATE
>[[Directives that affect the current and all subsequent targets]], until you change them.
> #COUNT
> #INTERVAL
> #FILTER
> #BINNING
> #SUBFRAME
> #POSANG
> #DITHER
> #DIR
> #TRACKON
> #TRACKOFF
>>[[Directives that affect only the next target]]. These must precede each target they are to act on.
>> #REPEAT
>> #CALIBRATE
>> #AUTOGUIDE
>> #STACK
>> #STACKALIGN
>> #AUTOFOCUS
>> #POINTING
>> #WAITFOR
>> #WAITUNTIL
>> #WAITINLIMITS
>> #WAITZENDIST
>> #WAITAIRMASS
>> #TAG
>>>[[Directives that act themselves like targets]]. (Targets themselves go here, too.)
>>> #DARK
>>> #BIAS
>>> #MANUAL
>>> #CHILL
>>> #DOMEOPEN
>>> #DOMECLOSE
[[Directives that terminate the plan]]
#CHAIN
#DAWNFLATS
#CHAINSCRIPT
<<<
[[Sample Observing Plans]] has some typical plans that show how to build more detailed plans.
----
!These act like targets
|!#DARK|
Acquire a ''dark'' //or// ''bias'' frame using the current target exposure interval. If you set #INTERVAL to 0 before using #DARK, ACP will acquire a bias frame, and the file naming will be adjusted. It is recommended, however, to use the #BIAS directive described below. You can use the #REPEAT directive to acquire multiple darks or biases. Multiple darks/biases will be sequence numbered as well as carrying the current #SET number, similar to file naming for light images (except no filter name is included of course). For example:
|#DARK|
results in one or more files of the form Dark-//~Snnn-Rnnn//.fts, or if the preceding #INTERVAL was 0, Bias-//~Snnn-Rnnn//.fts.
An optional ''complete'' file path and name may be given, in which case the dark or bias will be created in the given folder with the //exact given name//. Dark vs bias name changing and sequencing are not done. Any existing file with that name will be //replaced//. For example:
|#DARK D:\~MyCalibration\2006012\~Dark-Bin2.fts|
|!#BIAS|
Acquire a bias frame using the current target exposure interval. You can use the #REPEAT directive to acquire multiple biases. Multiple biases will be sequence numbered as well as carrying the current #SET number, similar to file naming for light images (except no filter name is included of course). For example:
|#BIAS|
results in one or more files of the form ~BIAS-//~Snnn-Rnnn//.fts.
An optional ''complete'' file path and name may be given, in which case the bias will be created in the given folder with the exact given name. Any existing file with that name will be replaced. For example:
|#BIAS D:\~MyCalibration\2006012\~Bias-Bin2.fts|
|!#MANUAL|
Acquire an image at the current telescope location. No pointing updates or slews will be done. This is actually a type of target, so don't include a target line. Include an object name. For example:
|#MANUAL ~MyImage|
If you don't include an object name, the current date/Time will be used. For example:
|#MANUAL|
results in an image file name of Manual-//dd-mm-yyyy@hhmmss-~Snnn-Rnnn-filter//.fts
|!#CHILL|
If needed, turns on the imager's cooler and waits for 5 seconds. In any case, the imager's temperature setpoint is changed to the given temperature (deg. C). After the change, #chill waits for up to 15 minutes for the cooler to reach a temperature within 2 degrees of the setpoint. If the chill point is not reached, at the end of 15 minutes, the plan resumes execution. This is actually a type of target, so you can wait before it, have the imager cooled, then wait again so that imaging starts later. For example:
|#CHILL -35.0|
|!#DOMEOPEN|
Opens the shutter or roll-off roof, and waits until the shutter or roof is actually open. Effective only during the first or only set-loop of the plan. This is actually a type of target, so you can wait before it, have the shutter or roof opened, then wait again so that imaging starts later. For example:
|#DOMEOPEN|
|!#DOMECLOSE|
Closes the shutter or roll-off roof, and waits until the shutter or roof is actually closed. Effective only during the last or only set-loop of the plan. For example:
|#DOMECLOSE|
----
!These affect only the next target:
|!#REPEAT|
See [[Sets, Repeats, and Filter Groups]]. Tells script to take the given number of filter groups of the next target or dark/bias frame (#DARK) in a row. #REPEAT may be combined with #SETS. For example:
|#REPEAT 5|
|!#CALIBRATE|
Forces calibration of the images for this target, even if ACP's auto-calibration preference is turned off (it is redundant if ACP's auto-calibration is turned on). This will not cause calibration of pointing exposures, only the final images. See [[Using Auto-Calibration]]. For example:
|#CALIBRATE|
|!#AUTOGUIDE|
This directive is new in version 5.1. This directive forces the next target's images to be guided, regardless of the setting of ACP's "enable autoguiding" preference or the duration of the exposure(s). For example:
|#AUTOGUIDE|
|!#STACK|
Combines repeated images within one filter group without aligning into a single image. Individual images used in the stack are preserved. File names will have -STACK in place of the repeat number. This is most useful when doing orbital tracking. See #TRACKON. The stacked image is saved in IEEE floating-point FITS format to preserve the dynamic range. For example:
|#STACK|
|!#STACKALIGN|
Combines repeated images within one filter group and aligns images into a single image. Individual images used in the stack are preserved. File names will have STACK in place of the repeat number. Use this for all stare-mode image sets. The stacked image is saved in IEEE floating-point FITS format to preserve the dynamic range. For example:
|#STACKALIGN|
|!#AUTOFOCUS|
See [[Sets, Repeats, and Filter Groups]]. Automatically refocus the optical system before each filter group in the filter group for this target. In order to preserve compatibility with the old target-per-filter plan format, this is modified if there is only one filter group. In this case, the autofocus is done once for the target, even if #repeat is greater than one. This requires that ~FocusMax 3.4.1 or later be installed and autofocus be enabled in ACP's preferences. For example:
|#AUTOFOCUS|
|NOTE|
|See the #AFINTERVAL directive (in [[Directives that affect the plan as a whole]]) for periodic autofocus. If your filters are non-parfocal, consider setting up a focus offset table so you can avoid wasting time focusing on each filter change. Finally, ACP has an adaptive autofocus feature. If you turn this on (in the ~AutoFocus tab of Preferences), then ACP will monitor the half-flux diameter (a measurement of focus quality) and autofocus when needed.|
|!#POINTING|
Schedule a pointing update prior to the target. This will work even if auto-center is disabled in Preferences. Thus, you can use #POINTING as a means to manually control when pointing updates occur in a plan. For example:
|#POINTING|
|!#WAITFOR|
Pause for the given number of seconds before processing the next target. For example:
|#WAITFOR 30|
|!#WAITUNTIL|
Pause during a specific set (see #SETS) until the given ''UTC'' date/time or (only) time. The first parameter is the set number for the pause, the second is the date/time at which to resume. The set number may range from 1 through the number of sets given by the #SETS directive. If there is no #SETS directive on the plan, the set number must be 1. If a //complete// date/time is given, and has passed, the directive is ignored. If only a time is given, it will wait //for up to 12 hours//. If the time is less than 12 hours in the past, it will not wait. The idea is that the time is relative to that observing night, and may be re-used on the next night.See the note below. For example:
|#WAITUNTIL 1, 21-Apr-2006 08:02:00|
|#WAITUNTIL 2, 08:32:00|
The above would wait till the given date/times in sets 1 and 2. This could be used to force a minimum interval between sets when acquiring images for asteroid hunting. The date/time format is flexible. We use US English here, so acceptable formats for us include:
|7/3/06 08:22|
|07/03/2006 18:34:24|
|03-July-2006 06:34 PM|
You can use any acceptable date/time format for //your version (language) of Windows//.
|NOTE|
|If the date part is not included, the directive will wiat //for up to 12 hours//. This allows plans to be re-used for multiple runs. If the time is less than 12 hours in the past, it will not wait.|
|!#WAITINLIMITS|
Pause until the target is within the observatory limits: minimum elevation, horizon, and any tilt-up limit. If target will never meet the criteria, it Is immediately skipped. A maximum time to wait (minutes) must be included. For Example:
|#WAITINLIMITS 60|
This will wait for the target to rise above the observatory limits for up to 60 minutes.
|!#WAITZENDIST|
Pause until the target is within the given zenith distance (deg) for up to the given time (min). If the target will never get within the given zenith distance, or won't get there within the time limit, it is skipped. A maximum time to wait (minutes) must be included. For Example:
|#WAITZENDIST 40, 30|
This will wait until the target is within 40 degrees of the zenith for up to 30 minutes.
|!#WAITAIRMASS|
Pause until the target is at or below the given air mass. If the target will never get within the given air mass, or won't Get there within the time limit, it is skipped. A maximum time to wait (minutes) must be included. For example:
|#WAITAIRMASS 2.5, 30|
This will wait until the target is at or below 2.5 air masses for up to 30 minutes.
|!#TAG|
Adds a named tag to the target. This directive does not affect the image acquisition process; it simply attaches the tag name and value to the target. You can specify as many of these as you want (each with different names) for any target. The tag name(s) and value(s) will be echoed to the run log, but this is most useful when you have custom actions defined for ~TargetStart and ~TargetEnd. These custom actions are passed a Target object as a parameter. Within the custom action, you can refer to tags by their name (as you defined them) with the syntax Target.Tags.name. Thus, you can use tags to alter the action of ~TargetStart and ~TargetEnd based on the tags' value(s). This is an expert feature and allows powerful custom logic to be implemented. The syntax is #TAG name=value. There must be an '=' in the #TAG directive. For example:
|#TAG type=reference star|
This will attach a tag "type" with the value "reference star" to the target.
----
!These affect the current and all subsequent targets
|!#COUNT|
See [[Sets, Repeats, and Filter Groups]]. Used only when specifying a filter group. For example:
|#Count 5,10,5,15|
|!#INTERVAL|
See [[Sets, Repeats, and Filter Groups]]. Set the final target exposure interval(s), in seconds, for subsequent targets. For example:
|#INTERVAL 31.5|
|#INTERVAL 180,240,180,180|
|!#FILTER|
See [[Sets, Repeats, and Filter Groups]]. Required if the system has filters. Set the filter(s) for subsequent targets. If the filter name is not recognized, an error is logged at plan start, and the plan will not run. For example:
|#FILTER Blue|
|#FILTER Red,Clear,Green,Blue|
|!#BINNING|
See [[Sets, Repeats, and Filter Groups]]. Sets the binning factor(s) for subsequent targets. Note that some detectors don't support arbitrary binning values. Consult the documentation for your detector for specifics. Note: for auto-calibration, of the binned size must be available in ~MaxIm's calibration groups. For example:
|#BINNING 4|
|#BINNING 2,1,2,2|
|!#SUBFRAME|
Sets the fraction of the chip to be used for subsequent images. Legal values are 0.1 to 1.0 (full frame). For example, if the chip is 1K by 1K (1024 by 1024), a subframe of 0.5 will result in using the center 512 by 512 pixels of the chip. ''Note:'' for auto-calibration, images of the subframe size must be available in ~MaxIm's calibration groups. For example:
|#SUBFRAME 0.5|
|!#POSANG|
Required if the system has a rotator. If a rotator is installed and configured in ACP, sets the position angle for subsequent images. The value of the position angle ranges from 0 up to but not including 360 degrees. 0 Degrees is pole-up, and the angle increases counterclockwise, that is, north toward east. The rotator will be positioned correctly regardless of GEM meridian flip, and the guider will be adjusted accordingly as well. For example:
|#POSANG 240.5|
|!#DITHER|
Offset each image in a repeat-set by some "small" amount. Works for both guided and unguided images. If no parameter is given, ACP chooses a value automatically. Normally, this value will be appropriate for achieving the noise reduction effect of dithering.
//If given//, the parameter specifies the maximum amount in each axis of this offset in fractional pixels. A parameter value of 0 disables dithering. ''Note:'' If guiding, the value is in guider pixels, not pixels on the main chip! You have to make the conversion if you want to know how far on the main chip the dither will be. For unguided images, the distance is in main imager chip pixels. In either case, the random offsets are applied independently in X and Y and are always relative to the initial position. For example:
|#DITHER ; Automatic dithering|
|#DITHER 1.5|
|#DITHER 0 ; Disable dithering|
|!#DIR|
Change the directory into which all subsequent images are to be stored. This can be a relative or full (with a drive letter) directory path, with multiple levels. If relative, the folder is relative to the default image folder as configured in the Local User tab of ACP Preferences (or for web users, their images folder). The folder, including all intermediate levels, is created if needed. For example:
|#DIR C:\Special\Comet Search\28-Sep-2003 (absolute)|
|#DIR Photometric Standards\Landolt (relative)|
If no folder name is given, this will switch back to the default image folder as configured in the Local User tab of ACP Preferences (or for web users, their images folder) plus the usual date-based subfolder. For example:
|#DIR ; Restore default image folder|
|NOTE|
|The file path/name customization feature may be used to change image file names and folders. This directive will override the custom folder, and if #DIR is given without a folder name, the custom folder will be restored.|
|!#TRACKON|
Initiates orbital tracking of solar system bodies. This remains in effect until canceled by #TRACKOFF. Orbital tracking will not be done except for solar system bodies, so non-solar-system targets may be intermixed without harm. Autoguiding will not be done if orbital tracking is active. Note that orbital tracking requires orbital elements as the target specification (major planet targets will also be tracked). For example:
|#TRACKON|
|!#TRACKOFF|
Cancels orbital tracking. This remains in effect until re-enabled with #TRACKON. For example:
|#TRACKOFF|
----
!These directives affect the whole plan.
@@color:#ff0;''These directives may appear anywhere in the plan. If one of these directives appears more than once, the last value given is used for the entire plan.''@@
|!#SETS|
See [[Sets, Repeats, and Filter Groups]]. Repeat the entire plan a given number of times. The images are acquired in round-robin order. The default is a single set. For example:
|#SETS 3|
|!#AFINTERVAL|
Turns on periodic autofocus. The interval is given in minutes. If an #AUTOFOCUS directive is seen, it overrides a scheduled autofocus, and the time to the next autofocus is reset to the interval. If you want an initial autofocus at plan start, include a separate #AUTOFOCUS for the first target. Plans start with the ~AF-interval expired, so a plan with start with an autofocus. For example, to do an autofocus every 30 minutes:
|#AFINTERVAL 30|
|!#DOMEFLATS|
Tells ACP not to wait for dawn or dusk and not move the telescope during flat acquisition. See the ACP Help file for more details.
|#DOMEFLATS|
|!#DUSKFLATS|
The plan starts by acquiring a series of automatic sky flats at dusk via the ~AutoFlat.vbs script (which is run under control of ~AcquireImages.js). See ''#DAWNFLATS'' below, and [[Using Automatic Sky Flats]].
If no argument is supplied, there must be a default flat plan named defaultduskflat.txt or just defaultflat.txt in the Local User's default plans folder or ~AcquireImages.js will not try to start ~AutoFlat.vbs. This avoids ~AutoFlat.vbs stalling waiting for flat plan input. If an argument is supplied it can be either a full path to a flat plan, or just a flat plan file name. If just the flat plan file name is given, it is assumed to be in your default Plans folder. Examples:
|#DUSKFLATS ;Need standard flat plan defaultflat.txt in user's default plans folder |
|#DUSKFLATS 20060122-dusk-flats.txt ; In user's default plans folder|
|#DUSKFLATS C:\~MasterCalibration\~LRGB-Standard-Flats.txt |
|!#MINSETTIME|
The minimum amount of time that a set is allowed to take. This can be used to limit the number of sets per unit time. For example:
|#MINSETTIME 00:05|
will tell ACP to wait until at least 5 minutes has elapsed before starting the next set.
|!#QUITAT|
Set a "quitting time" at which the plan will stop acquiring images. The quitting date/time is in UTC, and is interpreted the same as for ''#WAITUNTIL''. If you specify ''#DAWNFLATS'', ''#CHAIN'', or ''#CHAINSCRIPT'', these actions will still occur after the plan ends. For example:
|#QUITAT 7/1/01 08:22|
If the plan completes before the quit date/time is reached, it ends as usual. If only a time is given, it will always wait until the given time, even if it was just passed (it will wait till it is that time again).
|!#SHUTDOWNAT|
Same as ''#QUITAT'', except the scope is parked and the camera is shut down at the quitting time, ''or at normal exit''. The shutdown time is in UTC, and is interpreted the same as for ''#WAITUNTIL''. For example:
|#SHUTDOWNAT 7/1/06 08:22|
If the plan completes before the shutdown date/time is reached, it acts as though a ''#SHUTDOWN'' directive was given instead. If only a time is given, it will always wait until the given time, even if it was just passed.
|!#SHUTDOWN|
At the end of the run, parks the scope and shuts down the camera and cooler. If dome control is active, and if the "Automatically park or home and close AFTER the scope is parked" option is set, then the dome will be parked or homed and the shutter or roll-off roof will be closed. This may be used with ''#DAWNFLATS'', and shutdown will occur after dawn flats have been taken. For example:
|#SHUTDOWN|
|!#STARTSETNUM|
The starting set number used in naming image files. ''Do not include this in your plans, it is automatically inserted in all plans by ~AcquireImages.js.'' Each time the plan runs to completion, this number is incremented by the number of sets specified in #SETS or by 1. Its main use is to prevent overwriting of images when the same plan is run multiple times. For example:
|#STARTSETNUM 6|
|!#COMPLETIONSTATE|
The number of sets, targets in the current set, repeats in the current target, filter groups in the current repeat, and images in the current filter group, that have been completed. @@color:#0F0;''Do not include this in your plans. It is automatically inserted in all plans by ~AcquireImages.js each time a target is completed, then removed if and when the plan runs to completion''@@ (at which time #STARTSETNUM is adjusted as described above). Its main use is to allow an interrupted plan to resume at the point where the interruption occurred. For example:
| #COMPLETIONSTATE 2,4,1,3,1 |
----
!These terminate the plan (last or only set)
|!#CHAIN|
When encountered during the last (or only) set, //immediately// stops reading image acquisition lines from the current plan file, queues a new run of ~AcquireImages.js with the new plan, then exits. A chained-to plan is thus run in a separate invocation of ~AcquireImages.js, and starts with conditions identical to those when the same plan is run directly. Use this to chain together plans, each of which might take several sets of images, then wait for a while, then run the new plan which would also take several sets of images. For example:
|#CHAIN C:\Program Files\ACP\Plans\~LateNight.txt|
or if you just specify a file name, the plan is assumed to be in the same folder as the plan being chained-from. For example:
|#CHAIN ~LateNight.txt ; In current plan's folder|
|!#DAWNFLATS|
When encountered during the last (or only) set, immediately stops reading image acquisition lines from the current observing plan file, terminates ~AcquireImages.js, and starts ACP's automatic sky-flat script ~AutoFlat.vbs. If ~AcquireImages.js fails or is aborted, the auto-flats will ''not'' occur. See #DUSKFLATS above, and [[Using Automatic Sky Flats]].
If no argument is supplied, there must be a default flat plan named defaultdawnflat.txt or just defaultflat.txt in the Local User's default plans folder or ~AcquireImages.js will not try to start ~AutoFlat.vbs. This avoids ~AutoFlat.vbs stalling waiting for flat plan input. If an argument is supplied it can be either a full path to a flat plan, or just a flat plan file name. If just the flat plan file name is given, it is assumed to be in your default Plans folder. For example:
|#DAWNFLATS ;Need standard flat plan defaultflat.txt in user's default plans folder|
|#DAWNFLATS 20060122-dawn-flats.txt ; In user's default plans folder|
|#DAWNFLATS C:\~MasterCalibration\~LRGB-Standard-Flats.txt|
|!#CHAINSCRIPT|
When encountered during the last (or only) set, //immediately// stops reading image acquisition lines from the current plan file, terminates ~AcquireImages.js, and starts the given ACP script. If ~AcquireImages.js fails or is aborted, the chain will ''not'' occur.
The argument is either the full path/name or just the file name only of the script to be chained-to. If only the script file name is given, it is assumed to be in the ACP scripts folder. For example:
|#CHAINSCRIPT C:\Program Files\ACP Obs Control\Scripts\Cleanup.vbs|
|#CHAINSCRIPT Cleanup.vbs ; In ACP script folder|
----
!A. What’s the sidereal rate – how fast does the Earth turn?
*In one day, the Earth turns 360 degrees = 1,296,000 arcsec
*One sidereal day = 23h 56m 4.086s = 86,164.09056 seconds
Thus, the rate of the Earth’s turning is 1,296,000 arcsec / 86,164.09056 seconds =
''Sidereal rate = 15.0410686 (arcsec/second)''
!B. What’s the plate scale of the camera/telescope system?
*The focal length is usually measured from an astrometric plate solution and is not necessarily the “published” focal length of the instrument.
''The plate scale is (206.2648 x pixel size (microns) x binning) / (Focal Length (mm)) (arcsec/pixel)''
!C. At the sidereal rate, how fast do stars move across the FOV, imaging at the celestial equator?
*The sidereal rate is 15.0410686 arcsec/seconds.
*The plate scale is (206.2648 x pxsize x binning)/FL arcsec/pixel
Thus, the stars move at a rate = (15.0410686 x FL) / (206.2648 x pxsize x binning) pixels/second =
''Drift-rate = (0.07292116 x FL ) / (pxsize x binning) (pixels/second)''
where FL is in mm, pxsize is in microns, and binning is unitless. This is the “1x” sidereal rate.
!D. What about convergence of the meridians?
*Because the meridians converge at higher declinations, the drift rate is slower -- a star takes longer to cross the FOV.
*The factor is 1/cos(δ)
*This factor is NOT applied here. The effect is accounted for in the autoguiding routines of ~MaxIm with the factor called “declination compensation.”
!E. Correcting for different guiding rates (e.g. 1/2x sidereal rate)
*Some autoguiders drive the telescope in the guide mode at ½ the sidereal rate, or perhaps another known rate.
*This changes the time to drift, so we need to multiply the drift-rate by the guide rate. Autoguiding at ½ the sidereal rate will decrease the drift rate by 2x.
@@color:#0f0;''The autoguiding calibration constant = (0.07292116 x FL x guide rate) / (pxsize x binning ) (pixels/second)''@@
!F. Example
One can compute this for the main camera, and test it out by measuring directly the drift-rate. To apply this to another guider camera, whether it’s a dual-chip camera or a separately mounted “shorty” used for guiding, the drift rate can be scaled to that guider by substituting the new FL and pxsize values. Here’s an example: FL = 1630mm, pxsize = 7.4 microns, binning = 2 (using the ~TC-237 guiding chip of a dual-chip ~ST7), guiding at 1x sidereal rate
Drift-rate = (0.07292116 x 1630 x 1 ) / (7.4 x 2 ) = 8.0312 pixels/second
Measuring this experimentally at the telescope finds this to be nominally correct. The measured rate was 8.073 pixels/second.
|!NOTE|
|Calculating the drift rate in declination is another matter – this is best done experimentally since unless it’s known that the drive is 1x sidereal or some other known factor.|
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
|!Close this screen when the download is complete.|
----
<<miniBrowser hideControls http://download.dc3.com/ACPPlanner-3.2.2-Setup.msi>>
----
|!Close this window when the download is complete|
<<miniBrowser hideControls RefDocs/MosaicNxM-v131.zip>>
----
|!Close this window when the download is complete|
<<miniBrowser hideControls RefDocs/SlewToZenith.zip>>
----
|!Close this window when the download is complete|
<<miniBrowser hideControls RefDocs/AstroTwi-v3.zip>>
----
*Scroll to the bottom of this screen
<<miniBrowser hideControls http://ascom-standards.org/Downloads/ScriptableComponents.htm>>
----
/***
|''Name:''|DropDownMenuPlugin|
|''Description:''|Create dropdown menus from unordered lists|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#DropDownMenuPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.1|
|''Date:''|11/04/2007|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.5|
!!Usage:
* create a two-level unordered list using wiki syntax, and place {{{<<dropMenu>>}}} on the line after it.
* to create a vertical menu use {{{<<dropMenu vertical>>}}} instead.
* to assign custom classes to the list, just pass them as parameters to the macro {{{<<dropMenu className1 className2 className3>>}}}
!!Features:
*Supports just a single level of drop-downs, as anything more usually provides a poor experience for the user.
* Very light weight, about 1.5kb of JavaScript and 4kb of CSS.
* Comes with two built in css 'themes', the default horizontal and vertical.
!!Customizing:
* to customize the appearance of the menu's, you can either add a custom class as described above or, you can edit the CSS via the
StyleSheetDropDownMenu shadow tiddler.
!!Examples:
* [[DropDownMenuDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.macros.dropMenu={
dropdownchar: "\u25bc",
handler : function(place,macroName,params,wikifier,paramString,tiddler){
list = findRelated(place.lastChild,"UL","tagName","previousSibling");
if (!list)
return;
addClass(list,"suckerfish");
if (params.length){
addClass(list,paramString);
}
this.fixLinks(list);
},
fixLinks : function(el){
var els = el.getElementsByTagName("li");
for(var i = 0; i < els.length; i++) {
if(els[i].getElementsByTagName("ul").length>0){
var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");
if(!link){
var ih = els[i].firstChild.data;
els[i].removeChild(els[i].firstChild);
var d = createTiddlyElement(null,"a",null,null,ih+this.dropdownchar,{href:"javascript:;"});
els[i].insertBefore(d,els[i].firstChild);
}
else{
link.firstChild.data = link.firstChild.data + this.dropdownchar;
removeClass(link,"tiddlyLinkNonExisting");
}
}
els[i].onmouseover = function() {
addClass(this, "sfhover");
};
els[i].onmouseout = function() {
removeClass(this, "sfhover");
};
}
}
};
config.shadowTiddlers["StyleSheetDropDownMenuPlugin"] =
"/*{{{*/\n"+
"/***** LAYOUT STYLES - DO NOT EDIT! *****/\n"+
"ul.suckerfish, ul.suckerfish ul {\n"+
" margin: 0;\n"+
" padding: 0;\n"+
" list-style: none;\n"+
" line-height:1.4em;\n"+
"}\n\n"+
"ul.suckerfish li {\n"+
" display: inline-block; \n"+
" display: block;\n"+
" float: left; \n"+
"}\n\n"+
"ul.suckerfish li ul {\n"+
" position: absolute;\n"+
" left: -999em;\n"+
"}\n\n"+
"ul.suckerfish li:hover ul, ul.suckerfish li.sfhover ul {\n"+
" left: auto;\n"+
"}\n\n"+
"ul.suckerfish ul li {\n"+
" float: none;\n"+
" border-right: 0;\n"+
" border-left:0;\n"+
"}\n\n"+
"ul.suckerfish a, ul.suckerfish a:hover {\n"+
" display: block;\n"+
"}\n\n"+
"ul.suckerfish li a.tiddlyLink, ul.suckerfish li a, #mainMenu ul.suckerfish li a {font-weight:bold;}\n"+
"/**** END LAYOUT STYLES *****/\n"+
"\n\n"+
"/**** COLORS AND APPEARANCE - DEFAULT *****/\n"+
"ul.suckerfish li a {\n"+
" padding: 0.5em 1.5em;\n"+
" color: #FFF;\n"+
" background: #0066aa;\n"+
" border-bottom: 0;\n"+
" font-weight:bold;\n"+
"}\n\n"+
"ul.suckerfish li:hover a, ul.suckerfish li.sfhover a{\n"+
" background: #00558F;\n"+
"}\n\n"+
"ul.suckerfish li:hover ul a, ul.suckerfish li.sfhover ul a{\n"+
" color: #000;\n"+
" background: #eff3fa;\n"+
" border-top:1px solid #FFF;\n"+
"}\n\n"+
"ul.suckerfish ul li a:hover {\n"+
" background: #e0e8f5;\n"+
"}\n\n"+
"ul.suckerfish li a{\n"+
" width:9em;\n"+
"}\n\n"+
"ul.suckerfish ul li a, ul.suckerfish ul li a:hover{\n"+
" display:inline-block;\n"+
" width:9em;\n"+
"}\n\n"+
"ul.suckerfish li {\n"+
" border-left: 1px solid #00558F;\n"+
"}\n"+
"/***** END COLORS AND APPEARANCE - DEFAULT *****/\n"+
"\n\n"+
"/***** LAYOUT AND APPEARANCE: VERTICAL *****/\n"+
"ul.suckerfish.vertical li{\n"+
" width:10em;\n"+
" border-left: 0px solid #00558f;\n"+
"}\n\n"+
"ul.suckerfish.vertical ul li, ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a {\n"+
" border-left: 0.8em solid #00558f;\n"+
"}\n\n"+
"ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a, ul.suckerfish.vertical li.sfhover a:hover{\n"+
" width:8em;\n"+
"}\n\n"+
"ul.suckerfish.vertical {\n"+
" width:10em; text-align:left;\n"+
" float:left;\n"+
"}\n\n"+
"ul.suckerfish.vertical li a {\n"+
" padding: 0.5em 1em 0.5em 1em;\n"+
" border-top:1px solid #fff;\n"+
"}\n\n"+
"ul.suckerfish.vertical, ul.suckerfish.vertical ul {\n"+
" line-height:1.4em;\n"+
"}\n\n"+
"ul.suckerfish.vertical li:hover ul, ul.suckerfish.vertical li.sfhover ul { \n"+
" margin: -2.4em 0 0 10.9em;\n"+
"}\n\n"+
"ul.suckerfish.vertical li:hover ul li a, ul.suckerfish.vertical li.sfhover ul li a {\n"+
" border: 0px solid #FFF;\n"+
"}\n\n"+
"ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a{\n"+
" padding-right:1.1em;\n"+
"}\n\n"+
"ul.suckerfish.vertical li:hover ul li, ul.suckerfish.vertical li.sfhover ul li {\n"+
" border-bottom:1px solid #fff;\n"+
"}\n\n"+
"/***** END LAYOUT AND APPEARANCE: VERTICAL *****/\n"+
"/*}}}*/";
store.addNotification("StyleSheetDropDownMenuPlugin",refreshStyles);
//!END-PLUGIN-CODE
// %/
Copy this javascript to a Notepad file, call it <something>.js, save it in the .../ACP Obs Control/Scripts/ folder. Then access it from the ACP control panel.
----
//{{{
//tabs=4
/*jsl:option explicit*/
//
//
// This script reports the ending of evening astronomical twilight and
// the beginning of dawn astronomical twilight.
//
// Typically, this will converge to 1 second within 2-3 loops.
// Since the Sun ephem produces J2000 coordinates, we use local
// MEAN sidereal time instead of APPARENT for the hour angle.
// These approximations will get us typically to within
// 0.001 degree of the target sun elevation. PLENTY CLOSE!
//
// If the sun never reaches the given depression below the horizon,
// then the times shown are equal and represent the time of maximum depression,
// but don't meet the definition of the specified twilight condition.
//
function nextDuskDawn(h0, doDawn)
{
var DEGRAD = 0.0174532925;
var KT = new ActiveXObject("Kepler.Ephemeris"); // Re-usable Earth ephem (reverse = Sun!)
KT.BodyType = 0; // This is a Planet
KT.Number = 3; // Specifically, it's the Earth
var tvec = new ActiveXObject("NOVAS.PositionVector");
var LatRad = Telescope.SiteLatitude * DEGRAD; // Latitude in radians (constant)
var h0Rad = h0 * DEGRAD; // Sun altitude, radians
var JD = Util.SysJulianDate; // Start with tomorrow's date/Time
var JDPrev = JD;
var failed = false;
//
// Iteration Loop
//
do
{
var KA = KT.GetPositionAndVelocity(JD).toArray(); // Get Earth from Sun
tvec.x = -KA[0]; // Reverse cartesian vector for Sun from Earth
tvec.y = -KA[1];
tvec.z = -KA[2];
var SunRA = tvec.RightAscension; // J2000 coordinates of Sun from Earth
var SunDec = tvec.Declination;
var SunDecRad = SunDec * DEGRAD;
var HA = (Math.sin(h0Rad)-(Math.sin(LatRad) * Math.sin(SunDecRad))) / (Math.cos(LatRad) * Math.cos(SunDecRad));
if (HA > -1.0)
HA = Math.acos(HA) / DEGRAD; // HA in degrees
else {
HA = 180.0;
failed = true; // the real sun can't reach the required elevation below the horizon.
}
if (doDawn) HA = -HA; // this, for next dawn
var LMST = Util.Julian_GMST(JD) + (Telescope.SiteLongitude / 15.0); // LOCAL MEAN Sidereal Time
JD = JD + (((HA / 15.0) - Util.HourAngle12(SunRA, LMST)) / 24.0);
if(Util.SysJulianDate > JD)
JD = JD + 1; // Add a day
else if(Math.abs(JD - JDPrev) < 0.0000115741)
break; // Convergence to ~1 second accuracy; breaks out of repeat loop
JDPrev = JD;
} while(true);
if (failed) Console.PrintLine (h0 + " degree twilight condition not reached.");
KT = null; // Explicitly release these
tvec = null;
return new Date(Util.Julian_Date(JD)); // Local time of nearest dawn or dusk
}
// -----------
// Main script
// -----------
//
function main()
{
var sunset = -0.833333; // upper limb at horizon, includes refraction correction
var civil = -6.0; // need artificial illumination to read outside
var nautical = -12.0; // navigation using sea horizon no longer possible
var amateur = -15.0; // dark enough for most astronomical observations
var astronomical = -18.0; // sky is completely dark
//
Console.PrintLine("Dusk sunset is at : " + nextDuskDawn(sunset, false));
Console.PrintLine("Dusk civil twilight ends at: " + nextDuskDawn(civil, false));
Console.PrintLine("Dusk nautical twilight ends at: " + nextDuskDawn(nautical, false));
Console.PrintLine("Dusk amateur twilight ends at: " + nextDuskDawn(amateur, false));
Console.PrintLine("Dusk astronomical twilight ends at: " + nextDuskDawn(astronomical, false));
Console.PrintLine(" ");
Console.PrintLine("Dawn astronomical twilight begins at: " + nextDuskDawn(astronomical, true));
Console.PrintLine("Dawn amateur twilight begins at: " + nextDuskDawn(amateur, true));
Console.PrintLine("Dawn nautical twilight begins at: " + nextDuskDawn(nautical, true));
Console.PrintLine("Dawn civil twilight begins at: " + nextDuskDawn(civil, true));
Console.PrintLine("Dawn sunrise is at: " + nextDuskDawn(sunset, true));
}
//}}}
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
This useful tool is a spreadsheet that tabulates predicted ''local'' times of minima of eclipsing binary systems - 2303 of them - at your observatory. Each of the data columns has filters that can be used to selectively display information of interest so that only part of the data need be shown. The eclipse elements, JD epoch and period, are used to compute the heliocentric times of eclipses. These are then appropriately corrected to geocentric times depending on the positions of the Earth, Sun and object. Instructions for use are included as one of the tabs in the spreadsheet.
Click here to download [[The EclBinEph spreadsheet]] zip file (592KB).
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
!Network Access
There are two issues to be dealt with:
#access from computers on your local/home network, and
#access from the public Internet.
!!Local/Home Net Access
Go to a different computer on your local/home network. Using the same IP address, username, and password as in the previous step, try to log in. This may fail if you have firewall software (Windows Firewall, ~McAfee Personal Firewall, etc.) installed on either of the two computers.
If you do (Windows ~XPSP2 does by default!), follow the instructions for your firewall software to allow access between the computers on your local network. In particular, you must allow //inbound// access to ports 80 and 21 on the ACP computer for the other computers on your local net. Generally, putting all of your local/home computers into the "trusted" group is enough, but again see your firewall software's instructions.
If you succeeded in logging into ACP from the other local computer you're on your way, but typically you'll have to do the next task: providing access from the Internet through your cable/DSL router.
!!Access from the Internet
We'll assume you're using broadband (DSL or cable) for your internet access. If you want to try a dial up connection, go ahead. If you have problems, there is help by phone or from the [[DC-3 Dreams Communication Center]]. Meanwhile, broadband connections typically use some combination of a modem and a //router// (they may be the same box).
[img[WANLAN.png]]
The key component is the //router//. It divides the network into //your// Local Area Net (LAN) and the //public// Wide Area Net (WAN). In typical use, your computers on the LAN can connect out to servers on the WAN. But to Share Your Sky!, you want others to connect in to the ACP servers on your LAN.
!!Setting Up Port Forwarding
Since your LAN IP addresses are not visible to the WAN, allowing inbound connections requires some adjustments to the router configuration. The details vary with different router types, but the concept is usually the same: set up port-forwarding from the WAN to the LAN.
For example, referring to the figure above, the observatory/ACP computer has a LAN IP address of 192.168.1.10, and the router has a public/visible IP address of 70.121.56.149. The idea is to tell the router to forward TCP ports 80 (web) and 21 (FTP) to 192.168.1.10 on the LAN.
This makes it look like the ACP web and FTP servers are on the router's public IP, which is visible. Then people on the WAN can log into your ACP web and ftp servers by using an IP address of 70.121.56.149.
Meanwhile, inside your LAN, your computers can get to ACP via its LAN IP address 192.168.1.10. The LAN address is what shows on ACP's preferences servers tab.
!!Testing
The only reliable way to test your routing setup is to have someone on the WAN try to log into your ACP servers. From the LAN, you can log in via the public IP address, but this does not test your provider's filtering (see the next section). So to really know whether you have a usable setup, have a friend somewhere on the WAN (preferably one in another city or country) try to log on.
If it doesn't work, Check the following:
#Double check your router's WAN IP address. Did it change? It can!
#Verify basic internet connectivity. Have your friend open a command shell ("DOS" box) and type ping 70.121.56.149 (substitute your router's WAN IP). Usually this will work, but your provider may block ping packets. You never know. But if it does work (ping receives replies) then you know that there is connectivity between your friend and your router.
#Make sure ACP's web and FTP servers are turned on.
#In ACP Preferences, Servers tab, look at the IP address that shows below the IP selector. Is it the same IP you used when you set up the port forwarding?
#See the next section...
!!OK, I did all that but it still doesn't work!
Sometimes, broadband providers block inbound access to TCP port 80 (web), and less frequently, to port 21 (FTP) as well. They do this to prevent their residential customers from running web servers. But that's exactly what you want to do!
Fortunately there is a workaround: using a non-standard port. In ACP preferences, servers tab, change the web server port from 80 to 8080. Then reconfigure your router to disable any port 80 port forwarding you set up and then enable port forwarding for port 8080 to your ACP computer's LAN IP address. This creates a slight inconvenience for your Share your Sky! users; they have to include the non-standard port number in their ~URIs. In the above example, the URI for your ACP web server with port 8080 is {{{http://70.121.56.149:8080/}}}.
If you run into the same problem with FTP (unlikely), change ACP's FTP server port to 8021 and instruct your users to use this port instead of (the default) 21 in their FTP clients.
|NOTE: The ACP web content describing FTP usage automatically displays the host name or IP address, and the port (if non-standard), so your users will have all of the information they need even if you are forced to use a non-standard port.|
!!Other Common Problems
As noted in the section on Local/Home Net Access, any firewall software on the observatory/ACP computer may block inbound connects. The details vary, so consult the instructions for your firewall software. You must configure it to allow inbound access from any IP address, at least for starters. After you get it working, you can restrict the IP addresses from which people can connect to ACP if you want additional security and you can predict what range(s) of IP addresses your observers will be on.
If your router is also a wireless hub, there could be separate configuration settings for wireless and wired LAN hosts. Be sure you have port forwarding enabled for the type of connection used by your observatory/ACP computer.
!!Making it Easier: Getting a Domain Name
[[Registering an Internet Name]] describes how to get a domain name for your observatory/ACP computer. Virtually all broadband providers can change your router's IP address at will. Thus, you never really know what IP address to give your Share Your Sky! observers without first looking. Furthermore, if they bookmark an IP address, chances are it will become a broken link soon thereafter, forcing them to contact you to get the latest IP address. Read on for the right solution to this...
----
~~Copyright © 2000-2008, Robert B. Denny, Mesa, AZ~~
ACP has a powerful built-in telescope pointing corrector. It is based on the ~MaxPoint technology from [[Diffraction Limited]]. The ACP online help provides instructions for pointing corrector setup and usage. A standard script, [[TrainCorrector.vbs]] is available to specifically train the corrector. After the corrector has been trained, just start using ACP normally and the corrector will learn and improve correction as it goes, eventually reducing the frequency of ~PinPoint pointing updates to zero.
!Troubleshooting
If your pointing errors don't reduce towards zero, there is something wrong with your telescope and/or mount. Make sure you turned on "Consistent Approach Slewing" in step 2 above. Check to see that your mount's clutches are firmly engaged, that the mount is on solid ground. For a ~Schmidt-Cassegrain, make sure that your main mirror is not flopping. It's best to use an inline focuser and lock the mirror down.
If you want to make another run, be sure to click the "Reset Model" button in the Telescope tab of ACP Preferences before starting
----
|A six-hour loop of ~IR-band EUMETSAT imagery of the European continent. Click on one of the red pips on the image to zoom in to that location.|
<<miniBrowser http://www.sat24.com/homepage.aspx?page=ir>>
----
*Click on "Other Sites" for more, interesting information
----
<<miniBrowser hideControls http://exoplanet.eu/catalog.php>>
----
!Using Filters
ACP supports extended filter controls, including focus offset support and selection of filters for use in auto-focus and pointing updates. These optional settings for filter usage are contained in a file called ''~FilterInfo.txt''. This file must be placed into the same directory as ACP.exe (normally C:\Program Files\ACP Obs Control). __ACP includes a tool that can automatically create this file for you__.
ACP (without the presence of ~FilterInfo.txt) assumes that you have parfocal filters which don't need refocusing after a filter switch, and it uses the Clear filter for pointing exposures. This allows users with parfocal filters to avoid specifying extended filter info and still use the shortest possible pointing exposure times. If your filters are not parfocal (and even so-called parfocal filters aren't perfectly parfocal!), you must include #AUTOFOCUS directives at each filter change, forcing ACP to call for a refocus after the filter change.
| !NOTE |
| Whether or not you have parfocal filters, we strongly recommend that you set up your focus offsets. |
|!NOTE|
|If you have ~FocusMax installed, and if you have ~AutoFocus enabled in ACP, the focuser will be accessed through ~FocusMax. If not, the first time you run any of ACP's standard scripts after creating ~FilterInfo.txt, the ASCOM Focuser Chooser will be displayed, allowing you to tell ACP what focuser type you have. Thereafter, this info is remembered in the registry.|
!Setting Up Focus Offsets the Easy Way
ACP comes with a standard script, called [[FocusOffsets.vbs]], that will automatically determine focus offsets for your filter set and create the ''~FilterInfo.txt'' file for you. If you have ~FocusMax installed, and ~AutoFocus enabled in ACP, simply run this script in ACP's console. It will make 5 focus position measurements through each of your filters then create the ''~FilterInfo.txt'' file automatically. It takes about five minutes per filter.
!Advanced Usage
The automatic method above is suitable for most usages, however ACP has additional flexibility. It is possible to set up filter groups, each with its own reference filter. This section describes techniques for measuring focus offsets manually and creating an advanced ''~FilterInfo.txt''.
!!Measuring Focus Offsets Manually
If you want to measure your focus offsets manually:
#Pick a filter to be used as the reference filter.
#Focus using the reference filter. Note the focus position (//Fref//).
#Focus using your other filters. Note the focus position of each (//Fi//)
#For each non-reference filter, calculate the focus offset //Oi = Fi - Fref//
In other words, the focus offset is the amount to move the focuser to get from focus with the reference filter to focus with the other filter.
|!NOTE|
|You should probably focus several times with each filter and use the average of the positions.|
Now create a file called ''~FilterInfo.txt'', using Notepad or other text editor, and place it into the same directory as ACP.exe (normally C:\Program Files\ACP Obs Control). This file contains, for each filter on your system, the focus offset for the filter, the filter to which that focus offset is relative, and the filter to use for pointing exposures.
!!Format of ~FilterInfo.txt
''~FilterInfo.txt'' is an ASCII (not Unicode!) text file. It may contain spaces and tabs anywhere. Comments may be included, and they are indicated by a semicolon (';'). A line beginning with a semicolon will be ignored, and all text on any line that follows a semicolon will be ignored.
Filter info itself consists of one line per filter, ''in filter number order''. Each line consists of three comma-delimited fields:
#The focus offset for the filter, for example, Clear or V.
#The filter number to which the offset applies. This is the filter that will be used for auto-focus.
#The filter number to be used for pointing exposures
|!NOTE|
|In ACP, filter numbers start with 0. In ~MaxIm, they start with 1. So, for example, filter number 3 in ~MaxIm is filter number 2 in ACP.|
|!Simple Example ~FilterInfo.txt|
|;|
|; Sample ACP extended focus info file|
|; Fields are offset, relative-to, use for pointing|
|;|
|-10, 3, 3 ; #0 Red, relative to Clear, Pointing w/Clear|
|-5, 3, 3 ; #1 Green, relative to Clear, Pointing w/Clear|
|+15, 3, 3 ; #2 Blue, relative to Clear, Pointing w/Clear|
|0, 3, 3 ; #3 Clear, relative to Clear, Pointing w/Clear|
The observatory to which the example applies has filters of Red, Green, Blue, and Clear in ACP positions 0, 1, 2, and 3, respectively. The focus offsets for Red, Green, and Blue are relative to filter #3, the Clear filter. Thus, all auto-focus operations will be done using the Clear filter (#3) as specified by the 3 in the second field of all entries. For any filter selected for imaging, pointing exposures will be done using the Clear filter, as specified by the 3 in the third field of all entries.
|!Advanced Example ~FilterInfo.txt|
|;|
|; Sample ACP extended focus info file|
|; Fields are: offset, relative-to, use for pointing|
|;|
|; LRGB Group, relative to Clear|
|;|
|-10, 3, 3 ; #0 Red, relative to Clear, Pointing w/Clear|
|-5, 3, 3 ; #1 Green, relative to Clear, Pointing w/Clear|
|+15, 3, 3 ; #2 Blue, relative to Clear, Pointing w/Clear|
|0, 3, 3 ; #3 Clear, relative to Clear, Pointing w/Clear|
|;|
|; UBVRI Group, relative to V|
|;|
|+40, 6, 6 ; #4 U, relative to V, Pointing w/V|
|+10, 6, 6 ; #5 B, relative to V, Pointing w/V|
|0, 6, 6 ; #6 V, relative to V, Pointing w/V|
|-12, 6, 7 ; #7 R, relative to V, Pointing w/R <-- NOTE|
|-35, 6, 6 ; #8 I, relative to V, Pointing w/V|
This example organizes the filter set into two groups, one to be used for UBVRI photometry runs, and the other for use in color astrophotography. The filters have been physically placed into the filter-wheel in these groups. The first group is specified identically to the simple example above. The second group establishes the V filter as the reference for focus offsets, and therefore V will be used for auto-focus before imaging using any of these filters. U, B, V, and I use the V filter for pointing exposures. Pointing exposures with R selected for imaging will be done through the R filter, saving time for focus changes. The observer knows that R transmits enough light to be used for pointing exposures, and thus has chosen this optimization.
|!IMPORTANT|
|In this example, use of filters in the LRGB group requires that the Clear filter be focused, and use of filters in the UBVRI group requires that the V filter be focused. It is your responsibility to focus using the reference filter before using any other filters in a group! The easiest way to do this is include an ACP #AUTOFOCUS directive in your plans when switching from one filter group to another. If you don't have auto-focus available, then you cannot mix filters from both groups in one plan, and you must focus the reference filter for the group before starting a plan that uses (only) filters in that group.|
----
Here are answers to the most commonly asked questions about ACP, ~PinPoint, ~FocusMax and ~MaxIm.
[[How does #AUTOFOCUS work with filter groups?]]
[[How does ACP's focus routine work?]]
[[Where can I download the latest ACP updates?]]
[[Where are the ACP videos?]]
[[How do I disable/enable Gaussian filtering for plate solutions?]]
[[How do I log FocusMax activity in ACP logfiles?]]
[[Can I use any old GSC catalog?]]
[[Where can I get a copy of the <...> catalog?]]
[[Show me the latest version trees.]]
[[How are transforms between Alt/Az and RA/Dec done?]]
[[Can I add voice to UserActions?]] /% [[How do I do fix a PinPoint license problem?]] %/
[[Can I start ACP and MaxIm with one click?]]
[[How does ACP Planner work?]]
[[How does #CHILL work in ACP?]]
[[How do I set up FocusMax?]]
[[How do I avoid guiding on a bright galaxy?]]
[[How do I apply calibration to MaxIm guiding images?]] @@color:#f00;^^~~^^NEW^^~~^^@@
----
|NOTE: Click on "Contents" to go to the table of contents.|
<<miniBrowser hidecontrols http://archive.stsci.edu/fits/fits_standard/>>
----
<<miniBrowser hideControls http://fits.gsfc.nasa.gov/fits_wcs.html>>
<<miniBrowser hideControls http://www.atnf.csiro.au/people/mcalabre/WCS/>>
----
<<miniBrowser hideControls RefDocs/Weber-Brady_FocusMax.doc>>
----
<<miniBrowser hideControls RefDocs/FeatherTouch.pdf>>
ACP supports focus offsets and extended filter selection. To enable these features, you need to create a custom "filter info" file. For more information, see the [[Extended Filter Support]] section.
----
<<miniBrowser hideControls http://www.brightskies.us/filtCCD.html>>
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
This script will find a magnitude 6-9 star within 5 degrees of the current telescope position, assuring that it does not have another star within 30 arc seconds. It will then slew to this star, do a pointing update, and thus center the star in the field. This is useful if you want to do something like collimation or focusing by hand. The CCD must be on the telescope - it will not work for visual observing.
----
This script will take a pointing image at the current telescope coordinates and solve for the true focal length as well as the horizontal and vertical plate scales of your imager-telescope combination. This is useful for setting ~PinPoint up for plate solving in ACP preferences. The ~PinPoint plate scales must be somewhere near the actual plate scales, (within 50% either way) or the plate solution in this script may not succeed.
----
<div class='header' macro='gradient vert #300 #900'>
<div class='headerShadow'>
<span id='searchBar' macro="search"></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<!-- <span id='searchBar' macro="search"></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span> -->
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id='ContentFooter' refresh='content' tiddler='contentFooter'></div>
</div>
/***
Author: //unknown// - originally retrieved from Clint Checketts (http://www.checkettsweb.com)
!!Revision History
<<<
''2006.09.17 [rbd]'' Get rid of ghost blue borders on <input> and <textarea> elements within both the editor and the viewer content. Mute the background of <input> and <textarea> to reduce the glare of them against the dark background. Change highlighting color to match the style. Fix table cell borders so they show. Fix buttons so they don't display dotted underline hyperlink when clicked or hovered, brighten the normal text within buttons, perceptually it was too dark! Reformat rules to multi-line with tabs.
''2006.09.18 [rbd]'' Add overrides for ~XP-style navbar used on Share Your Sky! main page.
''2006.09.19 [rbd]'' More work on styles, improved bar graphics, tweaks for boxing, non-hyperlinked fonts. Looking good now.
''2006.09.20 [rbd]'' Add background and border to tiddlers, adjust padding and bottom margin for same. Remove rbd marks and dead styles. Reduce header and sidebar borders to 1px. Added Clint Checketts' IE CSS hack to permit the .tiddler CSS to work correctly. How'd he EVER figure that out?
''2006.09.30 [rbd]'' Fix "dotted-line removal" change above so buttons in viewer don't change size when highlighted. This made flickering buttons! Improve table colors in general, fix appearance of sortable table headers, add custom fileList class for the file list tables used in ~SyS.
''2006.10.08 [rbd]'' Much more work over last 10 days, add styles for System Monitor.
''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons. Style <input> and <select> colors to match the rest. OOPS, looks like hell on IE.
''2006.10.27 [rbd]'' Fix colors of SelectThemePlugin button and popup highlight. See inline comments for location.
''2006.10.31 [rbd]'' Reorganize.
''2006.11.07 [rbd]'' Faint border for sysmon thumbnail
''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers
<<<
!Colors Used
*@@bgcolor(#ff7f00):color(#000): #ff7f00@@
*@@bgcolor(#ffbf00):color(#000): #ffbf00@@
*@@bgcolor(#fff):color(#000): #fff@@
*@@bgcolor(#4c4c4c):color(#fff): #4c4c4c@@
*@@bgcolor(#5f5f5f):color(#fff): #5f5f5f@@
*@@bgcolor(#333):color(#fff): #333@@
*@@bgcolor(#666):color(#fff): #666@@
*@@bgcolor(#000030):color(#fff): #000030@@
*@@bgcolor(#000080):color(#fff): #000080@@
*@@bgcolor(#000):color(#fff): #000@@
*@@bgcolor(#000040):color(#fff): #000040@@
*@@bgcolor(#888):color(#fff): #888@@
*@@bgcolor(#ddd):color(#000): #ddd@@
*@@bgcolor(#ffe72f):color(#000): #ffe72f@@
*@@bgcolor(#300000):color(#fff): #300000@@
*@@bgcolor(#600000):color(#fff): #600000@@
*@@bgcolor(#ffffcc):color(#000): #ffffcc@@
*@@bgcolor(#fffacd):color(#000): #fffacd@@
!Generic Layout Rules
***/
/*{{{*/
body {
background: #000;
position: static; /*Clint's IE fix part 1 (part 2 in TW now) */
}
textarea {
font-family: courier !important; /* Fixed point font for editing */
}
.title{
color: #fffacd;
border-bottom: 1px dashed #333;
}
.subtitle {
color: #666;
}
.collapsedTitle {
color: #888;
font-size: 1.3em;
font-weight: bold;
}
h1, h2, h3, h4, h5 {
color: #fffacd;
background-color: #000040;
border-top: 1px solid #333;
border-bottom: 1px solid #333;
}
.tagged {
display:none;
}
/*}}}*/
/***
!Link styles
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a {
color: #ffbf00;
border: 0;
}
a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active {
color: #ff7f00;
border: 0;
border-bottom: #ff7f00 1px dashed;
background: transparent;
text-decoration: none;
}
#sidebarOptions a {
margin: 0;
color: #ffbf00;
border: 0;
}
#sidebarOptions a:active {
color: #ffbf00;
background-color: transparent;
}
#sidebarOptions a:hover {
color: #4c4c4c;
background-color: #ffbf00;
}
#sidebarTabs .tabContents a,
#popup a {
color: #ffbf00;
}
#messageArea a:link,
#messageArea a:visited {
color: #ffbf00;
text-decoration: none;
}
#messageArea a:hover,
#messageArea a:active {
color: #ff7f00;
}
#messageArea .messageToolbar a {
border: 1px solid #ffbf00;
background: #4c4c4c;
}
.headerForeground a {
color: #fff;
}
.toolbar a.button {
border: 0;
}
.editorFooter a {
border: 0;
}
/*}}}*/
/***
!Header styles
***/
/*{{{*/
.header{
border-bottom: 1px solid #ffbf00;
color: #fff;
}
.header a:hover {
border-bottom: 1px dashed #fff;
}
.headerForeground,
.headerShadow {
padding: 2.5em 0em 1em 1em;
}
#searchBar {
float: right;
margin-top: 1em;
margin-right: 1em;
font-size: 0.9em;
}
#searchBar .button {
margin-right: 0.5em;
border: none;
}
/*}}}*/
/***
!Main menu styles
***/
/*{{{*/
#mainMenu {
color: #fff;
}
#mainMenu h1 {
font-size: 1.1em;
}
#mainMenu li,
#mainMenu ul {
list-style: none;
margin: 0;
padding: 0;
}
/*}}}*/
/***
!Sidebar styles
***/
/*{{{*/
#sidebar {
right: 0;
color: #fff;
border: 1px solid #ffbf00;
border-width: 0 0 1px 1px;
}
#sidebarOptions {
background-color: #4c4c4c;
padding: 0;
}
#sidebarOptions .sliderPanel {
background-color: #333;
margin: 0;
}
#sidebarOptions input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
background-color: #666;
}
#sidebarOptions .highlight {
color: #4c4c4c;
background-color: #ffbf00;
}
.listTitle {
color: #fff;
}
/* Special for SelectThemePlugin when
leaving popup open and mousing away*/
#sidebarTabs {
background-color: #4c4c4c;
}
#sidebarTabs .tabSelected {
padding: 3px 3px;
cursor: default;
color: #ffbf00;
background-color: #666;
}
#sidebarTabs .tabUnselected {
color: #ffbf00;
background-color: #5f5f5f;
padding: 0 4px;
}
#sidebarTabs .tabContents a:hover {
color: #ff7f00;
background: transparent;
}
#sidebarTabs .txtMoreTab .tabUnselected {
color: #ffbf00;
background: #5f5f5f;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents {
color: #ffbf00;
background: #4c4c4c;
}
/*}}}*/
/***
!General tab styles
***/
/*{{{*/
.tab.tabUnselected {
background-color: #666;
}
.tab.tabSelected,
.tab.tabSelected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
cursor: default;
}
.tab.tabUnselected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
}
.tabContents {
background-color: #4c4c4c;
border: 0;
}
.tabContents .tabUnselected{
background: #5f5f5f;
}
.tabContents .tab:hover,
.tabContents .tabContents,
.tabContents .tabSelected {
background: #666;
}
/*}}}*/
/***
!Message area styles
***/
/*{{{*/
#messageArea {
background-color: #666;
color: #fff;
border: 2px solid #ffbf00;
}
/*}}}*/
/***
!Popup styles
***/
/*{{{*/
#popup {
color: #fff;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
#popup a:hover {
background: transparent;
color: #ff7f00;
border: 0;
}
#popup hr {
color: #ffbf00;
background: #ffbf00;
}
/* Special for SelectTheme popmenu */
#popup .currentlySelected {
color: #4c4c4c;
background: #ffbf00;
}
/*}}}*/
/***
!Tiddler Display styles
***/
/*{{{*/
/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/
.tiddler {
background: #000030;
border: 1px solid #000080;
padding-bottom: 8px;
margin-left: 8px; /* Vastly different on IE vs FireFox! */
margin-bottom: 12px;
}
#displayArea .button.highlight {
color: #ffbf00;
background: #4c4c4c;
}
.tiddler .button {
color: #888;
}
.tiddler .button:hover,
.tiddler .button:active {
color: #ffbf00;
background-color: #4c4c4c;
border-bottom: 1px solid #4c4c4c; /* No dotted line in buttons */
}
.viewer {
color: #FFF;
}
.viewer table{
background: transparent;
color: #fff;
border: 1px solid;
}
.viewer th {
background-color: #4c4c4c;
color: #fff;
}
.viewer hr {
color: #666;
}
.viewer input,
.viewer select {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1.0em;
/** Looks bad on IE6
padding-left:4px;
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
**/
}
.viewer .sortheader {
font-weight: normal;
}
.viewer pre,
.viewer code {
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
.viewer .button:hover,
.viewer .button:active {
border: 1px solid #4c4c4c; /* Needed to avoid button size changing */
}
.viewer .fileList table {
border-color: #ff7f00;
margin-bottom: 0px;
}
/* For Share your Sky only */
.viewer .fileList tr {
border: none;
}
.viewer .fileList td,
.viewer .fileList th {
border: 0;
padding: 2px 8px 2px 8px;
}
.viewer .noBorder table,
.viewer .noBorder th,
.viewer .noBorder tr,
.viewer .noBorder td,
.viewer iframe {
border: 0;
}
.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */
border: 1px solid #000080;
padding: 0px;
}
/* End Share Your Sky */
.toolbar {
color: #4c4c4c;
}
.footer {
color: #ddd;
}
.selectedTiddler .footer {
color: #888;
}
.editor textarea,
.editor input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
.editorFooter {
color: #aaa;
}
.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}
.tagging,
.tagged {
background: #4c4c4c;
border: 1px solid #4c4c4c;
}
.selected .tagging,
.selected .tagged{
background: #000;
border: 1px solid #ffbf00;
}
.tagging .button,
.tagged .button{
color: #ffbf00;
border: 0;
padding: 0;
}
.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}
.tagging .listTitle,
.tagged .listTitle, {
color: #fff;
}
.tagClear{
margin-top: 1em; /* clear: both; Clint's IE fix part 2 now in TW 2.1.2 */
}
.highlight,
.marked {
background-color: #000080;
color: #ffffff;
}
.cascade {
background: #4c4c4c;
color: #ddd;
border: 1px solid #ffbf00;
}
/*}}}*/
/***
!XP ~NavBar Style Overrides
***/
/*{{{*/
.topItem {
background: url("im/fire-classic-up.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemOver {
background: url("im/fire-classic-up-on.png") no-repeat 0 0;
color: #ffffff;
}
.topItemClose {
background: url("im/fire-classic-down.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemCloseOver {
background: url("im/fire-classic-down-on.png") no-repeat 0 0;
color: #ffffff;
}
.subItem,
.subSubItem,
.subItemOver,
.subSubItemOver {
color: #ffffff;
}
.dropMenu {
background-color: #4c4c4c;
color: #000;
border: 1px solid;
border-color: #4c4c4c #ff7f00 #ff7f00 #ff7f00;
}
/*}}}*/
/***
!System Status Display Styles
***/
/*{{{*/
div.progBarBg {
position: relative;
height: 0.75em;
background-color: #300000;
}
div.progBarFg {
position: absolute;
overflow: hidden;
height: 0.75em;
width: 0px;
background-color: #ff7f00;
}
td.telemetry {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1em;
background-color: #300000;
white-space: pre;
color: #600000;
// "off" state overridden by inner <span> tag: s;
}
span.telemActive {
color: #ccccff;
}
span.telemWarn {
color: #ff0000;
}
span.telemOff {
color: #600000; /* Match color in td.telemetry */
}
td.telemlabel {
white-space: nowrap;
}
textarea.scriptlog {
border: 1px solid #ffbf00;
margin: 0;
padding: 0.5em;
background: #300000;
color: #ffffff;
font-family: "Lucida Console","Courier New",Courier,monospace !important;
font-size: 1em !important;
white-space: pre;
line-height: 110%;
}
sidebar borders to 1px. Added Clint Checketts' IE CSS hack to permit the .tiddler CSS to work correctly. How'd he EVER figure that out?
''2006.09.30 [rbd]'' Fix "dotted-line removal" change above so buttons in viewer don't change size when highlighted. This made flickering buttons! Improve table colors in general, fix appearance of sortable table headers, add custom fileList class for the file list tables used in ~SyS.
''2006.10.08 [rbd]'' Much more work over last 10 days, add styles for System Monitor.
''2006.10.23 [rbd]'' Remove height from <input> and <select>, was scrunching buttons. Style <input> and <select> colors to match the rest. OOPS, looks like hell on IE.
''2006.10.27 [rbd]'' Fix colors of SelectThemePlugin button and popup highlight. See inline comments for location.
''2006.10.31 [rbd]'' Reorganize.
''2006.11.07 [rbd]'' Faint border for sysmon thumbnail
''2006.11.21 [rbd]'' Add .collapsedTitle for folded tiddlers
<<<
!Colors Used
*@@bgcolor(#ff7f00):color(#000): #ff7f00@@
*@@bgcolor(#ffbf00):color(#000): #ffbf00@@
*@@bgcolor(#fff):color(#000): #fff@@
*@@bgcolor(#4c4c4c):color(#fff): #4c4c4c@@
*@@bgcolor(#5f5f5f):color(#fff): #5f5f5f@@
*@@bgcolor(#333):color(#fff): #333@@
*@@bgcolor(#666):color(#fff): #666@@
*@@bgcolor(#000030):color(#fff): #000030@@
*@@bgcolor(#000080):color(#fff): #000080@@
*@@bgcolor(#000):color(#fff): #000@@
*@@bgcolor(#000040):color(#fff): #000040@@
*@@bgcolor(#888):color(#fff): #888@@
*@@bgcolor(#ddd):color(#000): #ddd@@
*@@bgcolor(#ffe72f):color(#000): #ffe72f@@
*@@bgcolor(#300000):color(#fff): #300000@@
*@@bgcolor(#600000):color(#fff): #600000@@
*@@bgcolor(#ffffcc):color(#000): #ffffcc@@
*@@bgcolor(#fffacd):color(#000): #fffacd@@
!Generic Layout Rules
***/
/*{{{*/
body {
background: #303060;
position: static; /*Clint's IE fix part 1 (part 2 in TW now) */
}
textarea {
font-family: courier !important; /* Fixed point font for editing */
}
.title{
color: #fffacd;
border-bottom: 1px dashed #333;
}
.subtitle {
color: #666;
}
.collapsedTitle {
color: #888;
font-size: 1.3em;
font-weight: bold;
}
h1, h2, h3, h4, h5 {
color: #fffacd;
background-color: #000040;
border-top: 1px solid #333;
border-bottom: 1px solid #333;
}
/*}}}*/
/***
!Link styles
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a {
color: #ffbf00;
border: 0;
}
a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active {
color: #ff7f00;
border: 0;
border-bottom: #ff7f00 1px dashed;
background: transparent;
text-decoration: none;
}
#sidebarOptions a {
margin: 0;
color: #ffbf00;
border: 0;
}
#sidebarOptions a:active {
color: #ffbf00;
background-color: transparent;
}
#sidebarOptions a:hover {
color: #4c4c4c;
background-color: #ffbf00;
}
#sidebarTabs .tabContents a,
#popup a {
color: #ffbf00;
}
#messageArea a:link,
#messageArea a:visited {
color: #ffbf00;
text-decoration: none;
}
#messageArea a:hover,
#messageArea a:active {
color: #ff7f00;
}
#messageArea .messageToolbar a {
border: 1px solid #ffbf00;
background: #4c4c4c;
}
.headerForeground a {
color: #fff;
}
.toolbar a.button {
border: 0;
}
.editorFooter a {
border: 0;
}
/*}}}*/
/***
!Header styles
***/
/*{{{*/
.header{
border-bottom: 1px solid #ffbf00;
color: #fff;
}
.header a:hover {
border-bottom: 1px dashed #fff;
}
.headerForeground,
.headerShadow {
padding: 2.5em 0em 1em 1em;
}
#searchBar {
float: right;
margin-top: 1em;
margin-right: 1em;
font-size: 0.9em;
}
#searchBar .button {
margin-right: 0.5em;
border: none;
}
/*}}}*/
/***
!Main menu styles
***/
/*{{{*/
#mainMenu {
color: #fff;
}
#mainMenu h1 {
font-size: 1.1em;
}
#mainMenu li,
#mainMenu ul {
list-style: none;
margin: 0;
padding: 0;
}
/*}}}*/
/***
!Sidebar styles
***/
/*{{{*/
#sidebar {
right: 0;
color: #fff;
border: 1px solid #ffbf00;
border-width: 0 0 1px 1px;
}
#sidebarOptions {
background-color: #4c4c4c;
padding: 0;
}
#sidebarOptions .sliderPanel {
background-color: #333;
margin: 0;
}
#sidebarOptions input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
background-color: #666;
}
#sidebarOptions .highlight {
color: #4c4c4c;
background-color: #ffbf00;
}
.listTitle {
color: #fff;
}
/* Special for SelectThemePlugin when
leaving popup open and mousing away*/
#sidebarTabs {
background-color: #4c4c4c;
}
#sidebarTabs .tabSelected {
padding: 3px 3px;
cursor: default;
color: #ffbf00;
background-color: #666;
}
#sidebarTabs .tabUnselected {
color: #ffbf00;
background-color: #5f5f5f;
padding: 0 4px;
}
#sidebarTabs .tabContents a:hover {
color: #ff7f00;
background: transparent;
}
#sidebarTabs .txtMoreTab .tabUnselected {
color: #ffbf00;
background: #5f5f5f;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents {
color: #ffbf00;
background: #4c4c4c;
}
/*}}}*/
/***
!General tab styles
***/
/*{{{*/
.tab.tabUnselected {
background-color: #666;
}
.tab.tabSelected,
.tab.tabSelected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
cursor: default;
}
.tab.tabUnselected:hover {
color: #ffbf00;
border: 0;
background-color: #4c4c4c;
}
.tabContents {
background-color: #4c4c4c;
border: 0;
}
.tabContents .tabUnselected{
background: #5f5f5f;
}
.tabContents .tab:hover,
.tabContents .tabContents,
.tabContents .tabSelected {
background: #666;
}
/*}}}*/
/***
!Message area styles
***/
/*{{{*/
#messageArea {
background-color: #666;
color: #fff;
border: 2px solid #ffbf00;
}
/*}}}*/
/***
!Popup styles
***/
/*{{{*/
#popup {
color: #fff;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
#popup a:hover {
background: transparent;
color: #ff7f00;
border: 0;
}
#popup hr {
color: #ffbf00;
background: #ffbf00;
}
/* Special for SelectTheme popmenu */
#popup .currentlySelected {
color: #4c4c4c;
background: #ffbf00;
}
/*}}}*/
/***
!Tiddler Display styles
***/
/*{{{*/
/** LOSER ON IE6 without Clint's IE fix (see body section at top!) **/
.tiddler {
background: #000030;
border: 1px solid #000080;
padding-bottom: 8px;
margin-left: 8px; /* Vastly different on IE vs FireFox! */
margin-bottom: 12px;
}
#displayArea .button.highlight {
color: #ffbf00;
background: #4c4c4c;
}
.tiddler .button {
color: #888;
}
.tiddler .button:hover,
.tiddler .button:active {
color: #ffbf00;
background-color: #4c4c4c;
border-bottom: 1px solid #4c4c4c; /* No dotted line in buttons */
}
.viewer {
color: #FFF;
}
.viewer table{
background: transparent;
color: #fff;
border: 1px solid;
}
.viewer th {
background-color: #4c4c4c;
color: #fff;
}
.viewer hr {
color: #666;
}
.viewer input,
.viewer select {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1.0em;
/** Looks bad on IE6
padding-left:4px;
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
**/
}
.viewer .sortheader {
font-weight: normal;
}
.viewer pre,
.viewer code {
color: #ddd;
background-color: #4c4c4c;
border: 1px solid #ffbf00;
}
.viewer .button:hover,
.viewer .button:active {
border: 1px solid #4c4c4c; /* Needed to avoid button size changing */
}
.viewer .fileList table {
border-color: #ff7f00;
margin-bottom: 0px;
}
/* For Share your Sky only */
.viewer .fileList tr {
border: none;
}
.viewer .fileList td,
.viewer .fileList th {
border: 0;
padding: 2px 8px 2px 8px;
}
.viewer .noBorder table,
.viewer .noBorder th,
.viewer .noBorder tr,
.viewer .noBorder td,
.viewer iframe {
border: 0;
}
.viewer .noBorder #sm_thumb { /* For sysmon thumbnail */
border: 1px solid #000080;
padding: 0px;
}
/* End Share Your Sky */
.toolbar {
color: #4c4c4c;
}
.footer {
color: #ddd;
}
.selectedTiddler .footer {
color: #888;
}
.editor textarea,
.editor input {
border: 1px solid #ffbf00;
background-color: #ffffcc;
}
.editorFooter {
color: #aaa;
}
.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}
.tagging,
.tagged {
background: #4c4c4c;
border: 1px solid #4c4c4c;
}
.selected .tagging,
.selected .tagged{
background: #000;
border: 1px solid #ffbf00;
}
.tagging .button,
.tagged .button{
color: #ffbf00;
border: 0;
padding: 0;
}
.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}
.tagging .listTitle,
.tagged .listTitle, {
color: #fff;
}
.tagClear{
margin-top: 1em; /* clear: both; Clint's IE fix part 2 now in TW 2.1.2 */
}
.highlight,
.marked {
background-color: #000080;
color: #ffffff;
}
.cascade {
background: #4c4c4c;
color: #ddd;
border: 1px solid #ffbf00;
}
/*}}}*/
/***
!XP ~NavBar Style Overrides
***/
/*{{{*/
.topItem {
background: url("im/fire-classic-up.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemOver {
background: url("im/fire-classic-up-on.png") no-repeat 0 0;
color: #ffffff;
}
.topItemClose {
background: url("im/fire-classic-down.png") no-repeat 0 0;
color: #ffbf00;
}
.topItemCloseOver {
background: url("im/fire-classic-down-on.png") no-repeat 0 0;
color: #ffffff;
}
.subItem,
.subSubItem,
.subItemOver,
.subSubItemOver {
color: #ffffff;
}
.dropMenu {
background-color: #4c4c4c;
color: #000;
border: 1px solid;
border-color: #4c4c4c #ff7f00 #ff7f00 #ff7f00;
}
/*}}}*/
/***
!System Status Display Styles
***/
/*{{{*/
div.progBarBg {
position: relative;
height: 0.75em;
background-color: #300000;
}
div.progBarFg {
position: absolute;
overflow: hidden;
height: 0.75em;
width: 0px;
background-color: #ff7f00;
}
td.telemetry {
font-family: "Lucida Console","Courier New",Courier,monospace;
font-size: 1em;
background-color: #300000;
white-space: pre;
color: #600000;
// "off" state overridden by inner <span> tag: s;
}
span.telemActive {
color: #ccccff;
}
span.telemWarn {
color: #ff0000;
}
span.telemOff {
color: #600000; /* Match color in td.telemetry */
}
td.telemlabel {
white-space: nowrap;
}
textarea.scriptlog {
border: 1px solid #ffbf00;
margin: 0;
padding: 0.5em;
background: #300000;
color: #ffffff;
font-family: "Lucida Console","Courier New",Courier,monospace !important;
font-size: 1em !important;
white-space: pre;
line-height: 110%;
}
/*}}}*/
/***
!Footer styles /% ============================================================= %/
***/
/*{{{*/
#ContentFooter {background:#000; color:#fff; clear:both; padding:0.5em 1em; text-align:center;}
#ContentFooter a {color: #fff; border-bottom: 10px dotted #0f0;}
#ContentFooter a:hover { color: #fff; background-color:#f00;}
/*}}}*/
!Local Access
If you left ACP running and enabled the web server as directed in previous steps, this page should have displayed without any scripting errors. If so, the URL for your ACP web pages is shown below (it may take a few seconds to appear):
|!http://127.0.0.1/|
If you have a static IP address, this will be your observatory's home page URL from now on. You'll need the username and password you set up for yourself.
#Click the above link. A browser should appear showing a username/password login box.
#Enter your username and password and click OK.
#If all went well, you should now see your observatory's home page. Note the observatory name you filled into Observatory preferences page is automatically inserted into the HTML for this page.
|!NOTE|
|If you don't see your home page, see [[Troubleshooting the Servers]].|
Next, test the FTP server. The URL is:
|!ftp://127.0.0.1/|
#Click the above link. Your browser or other FTP program should prompt you with a login dialog.
#Enter your username and password and click OK.
#If all went well, you should now see the ~WebDocs subfolder under the ACP installation area. Don't worry, your FTP users cannot access most of these files, nor can they access any web content files anywhere.
|!NOTE|
|If FTP login is not successful, see [[Troubleshooting the Servers]].|
Now proceed to [[Enabling Network Access]]
----
<<miniBrowser hidecontrols http://www.focusmax.org>>
<<miniBrowser hideControls http://download.dc3.com/FocusMax-3.4.14-Update.zip>>
This script will automatically determine the focus offsets of all of your filters with respect to a user-specified reference filter. The offset values are displayed at the end of the script on the console. Useful if you have ~FocusMax installed and ~AutoFocus enabled in ACP.
----
<<miniBrowser hideControls http://tdc-www.harvard.edu/software/catalogs/gsc_act_all.htm>>
----
<<miniBrowser hideControls http://gsss.stsci.edu/webservices/GSC2/GSC2WebForm.aspx>>
----
<<miniBrowser hideControls http://gcn.gsfc.nasa.gov/>>
----
Here's further information on [[VOEvents]].
!Introduction
Details and one-time setup information are accessible from the help file of the ACP application itself. If you are connected to the internet now (broadband is best), you can also watch the ACP [[Videos]]. These provide a great jump-start in understanding how ACP works, and what it can do for you.
|!Notes|
|If you don't yet know about the free [[ACP Planner|http://acp.dc3.com/planner.html]], this application provides an assisted process for creating an observing plan. Planner can also work in conjunction with either of [[TheSky]] or [[Starry Night Pro]] planetarium programs. For routine use, unless you are an advanced science observer, you really should use Planner to generate your plans!|
||
|You can jump start your knowledge of ACP and ~MaxIm by using the simulators. Go to [[Using the Simulators for Test & Practice]] for an overview.|
||
Each of the links below will open a new window to provide high-level descriptions.
>[[Software and Catalog Installation]]
>[[Site Information]]
>[[Enabling the ACP Pointing Corrector]]
>[[Optimizing Pointing Exposures]]
----
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
|[[Australia Weather]] - Three-hour IR color loop from the Bureau of Meteorology|
|[[Indian Ocean Basin Weather]] - METEOSAT 7 IR imagery loop|
|[[Europe Weather]] - Forecast for astronomy from Sat24|
|[[North America Weather]] - Forecast for astronomy from the Meteorological Service of Canada|
|[[China Weather]] - Eastern Asia/Hong Kong 24-hour loop|
|[[US Weather by zipcode]] - 48-hour National Weather Service graphical forecast @@color:#f00;^^~~^^NEW^^~~^^@@|
----
<<miniBrowser http://fits.gsfc.nasa.gov/>>
----
<<miniBrowser hideControls http://www.google.com/>>
<<miniBrowser hideControls http://www.timerson.net/IOTA/>>
----
[[Minor Planet Astrometry]]
[[Minor Planet Photometry]]
----
The process is essentially the same as what would be done for creating flats, darks and biases for the main camera.
!Collecting the Data
The difference is that you have to select the autoguider camera instead of the main camera. The selection will be different depending on whether you have a separate autoguider or a dual-chip camera. It's also different between ~MaxIm version 5 and ~MaxIm version 4. @@color:#ff0;You'll need to do the following three steps for each binning you want to use for the autoguider.@@ Darks and biases you can take on a cloudy night. Flats require clear skies or other uniform illumination.
#Take a large number of bias images - maybe thirty or a hundred, they go pretty fast, since there's no exposure time associated with them, just the readout time. Save all of them in a folder you have set up called, perhaps, "Calibration Images."
#Then take a pile of "darks" at 10-second exposure each - maybe 30 or a hundred of them. The more you take will ensure you have better noise reduction when they get merged. Put these all in the same "Calibration Images" folder. (I suggested 10 seconds since most autoguiding images are not anywhere near that long. If you anticipate longer autoguiding exposures, then make your darks at least as long.)
#Then on a clear day/dusk, run a series of flats using the autoguider as the "main" camera. @@color:#ff0;You'll need some of them for each filter you expect to use.@@ Flats need to be exposed to the right level so that you don't run up into the saturated part of the CCD response. For a 64,000 ADU saturation, I'd take them at 30,000 or so, maybe 35,000. If you use binning 2, the time it takes will not be too long, but you probably won't have time enough to do regular flats on the same evening. Put all flats in the "Calibration Images" folder.
!Processing the Data
So now all of these images are in one place, in your Calibration Images folder. Go to the Set Calibration menu in ~MaxIm. Here point the "Source Folder" at your folder. Press "Auto Generate" and when that's done, press "Replace with Masters." This step combines all the individual images appropriately. As an example, if you have five filters, three binnings and 200 images total (including darks and biases), there are created just 15 masters when this process finishes - one for each of the five filters at each of the three binnings. Because guiding chips have different sizes than the imaging chip, these masters will not be confused with the masters you made for your imaging camera. Furthermore, these autoguider masters will have the right FITS header information so that when you go to calibrate a single autoguider image, the correct master will be applied to do the calibration.
One difference from regular camera calibration images, though, might be that your exposures for "darks" could be 300 or 600 seconds, or longer, if you expect to take regular images with that kind of integration time. But you only need 10 seconds or so for the autoguider camera. If your guide camera is cooled, you'll want a calibration set for each particular cooled temperature you expect to operate it at, or if it's uncooled, then at a few different ambient temperatures.
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
Scroll down the list to find an area of interest. Clicking the link may open the .dat file in a pop-up browser window. Right-clicking, followed by "Save link as..." or "Copy to folder..." will download the document to your computer, where it will open in Notepad without changing the document suffix.
*Additional fields are posted in [[Sumner Photometry Fields]].
----
<<miniBrowser ftp://ftp.aavso.org/public/calib/>>
----
!ACP ~CoordinateTransform Object
!!Remarks
This object implements coordinate transformations between equatorial (RA/Dec) and topocentric (Alt/Az) coordinates. The transformation is valid for a particular latitude and sidereal time. When you create a ~CoordinateTransform object (using the Util.~NewCT() or Util.~NewCTHereAndNow() methods), the object is set for the specified latitude and sidereal time. You can then repeatedly set coordinates of one type then retrieve the transformed coordinates of the other type.
|!NOTE|
|Whenever you change one of the coordinate properties, the transformation is recalculated. For example, if you change the Altitude property, the ~RightAscension, ~HourAngle, and Declination properties are immediately recalculated.}|
The transformations are very easy to do with this object. For example, to transform between thses systems using your current geographic location and time:
*Use Util.~NewCThereAndNow() to get a new ~CoordinateTransform object set up for your current geographic location and time.
*Set the coordinate properties you know, for example RA/Dec
*Get the coordinate properties you don't know, for example Az/Elev, for example:
{{{
Set ct = Util.NewCThereAndNow()
ct.RightAscension = 8.32658
ct.Declination = 21.41097
Console.PrintLine "Azimuth = " & ct.Azimuth
Console.PrintLine "Elevation = & " ct.Elevation
}}}
You can also get a "blank" ~CoordinateTransform object and initialize it with any arbitrary geographic position and time.
|This does not do corrections for atmospheric refraction. The equatorial coordinates are for the local posiition and epoch -- they not corrected for precession and/or nutation. Use the ~NOVAS-Com object (shipped with ACP) for working with J2000 coordinates, and use ASCOM's refraction method for refractivity corrections.|
----
Courtesy of Jim ~McMillan and Bob Denny
----
If your guiding imager is particularly noisy, you can benefit by having ~MaxIm subtract a dark frame from the guider's images. Due to a limitation in ~MaxIm DL/CCD, you cannot use its "simple auto-dark" for this. Instead, you must create dark and bias frames for your guider and use ~MaxIm's "full calibration" mode for the guider imager. (However, calibration must be "none" if you are using an AO.)
To build a calibration set for the guider camera, you create a library of darks at the longest guide exposure you'll use, at the nominal ambient temperature, and you'll create bias frames, too. Remember, you don't need to take exposures at different exposure lengths. And as long as your dark images are longer than the longest expected exposure during guiding, and if you take bias frames, ~MaxIm will scale the dark frame appropriately and apply it to the guiding frame.
A typical approach, then, is to take a half-dozen darks at the longest expected guider exposure, say five or ten seconds, and a half-dozen bias images (zero seconds). These images are taken with the guider camera. Load these images into ~MaxIm's Calibration Wizard, and create a "master" calibration frame.
----
~PinPoint selects the star to guide from. Every once in a while, ~PinPoint has a difficult time distinguishing from a bright galaxy core and a real star. So when trying to autoguide in a field where there's bright galaxy, ~PinPoint may select the galaxy core as the preferred guide star. Often this is due to less than perfect focusing. So, one suggestion is to check your focus first.
If you're comfortable using a text editor to change ACP scripts, a little tricker fix is to make a small modification in ~AcquireSupport.wsc. Find:
|For i = 1 To ~StarList.Count|
At this point in the code ACP is looking at each star as measured on the initial guide exposure and listing them from brightest to dimmest. In this loop, ACP selects the first star to guide on that meets the appropriate criteria (SNR, not a double star, not too close to the edge). Since the first "star" that meets the criteria might be a galaxy center, you can get it to skip the galaxy and select the second star instead by changing it to:
|For i = 2 To ~StarList.Count|
When using "2" it will likely never select a galaxy center again. If it's still a problem, change it to 3, and so forth.
By the way, this technique works fine with a large guider FOV where there will be plenty of suitable guide stars. This won't work if you're using a small guider FOV where there might only be one suitable star to begin with.
|!Note|
|When editing, make a copy of the original first; then use a text editor like Notepad, Notepad++ or ~PSPad to make the changes. (Notepad++ and ~PSPad are editors that have line numbers in the left margin.)|
----
This tip is from Jim ~McMillan
!
Normally, ACP uses the Gaussian filter for plate solutions. In most cases, this improves the signal to noise ratio, improving the chances for success on weak images. But if the image is very noisy and contains large areas of bright gas or clusters of stars, the Gaussian filter can create too many false stars.
If you want to try disabling the Gaussian filter, edit ''~AcquireSupport.wcs'' with Notepad. Search for the following code:
{{{
plate.MaxSolveStars = SolveMax
plate.MaxSolveTime = TimeMax
plate.ConvolveGaussian(ScaleH * 1.0)
plate.ImageModified = False
If c_pp4 Then plate.CacheImageStars = True
}}}
Comment out (using at least one apostrophe) the middle line, resulting in the code below. This disables the convolution. Remove the apostrophe to re-enable convolution:
{{{
plate.MaxSolveStars = SolveMax
plate.MaxSolveTime = TimeMax
' plate.ConvolveGaussian(ScaleH * 1.0)
plate.ImageModified = False
If c_pp4 Then plate.CacheImageStars = True
}}}
----
!
Logging ~FocusMax activity into the ACP run log is a feature of ~FocusMax 3.2 and later. The log information from ~FocusMax is inserted into your ACP run log, allowing you to see its activity right inline with the rest of the run's activity.
To enable this feature, in ~FocusMax select the Open menu, Options (at the bottom of the menu). At the bottom of the Options window that will appear, check the box "Send log text to ACP". That's all there is to it!
----
This description is edited from a post by Niel Fleming on the SBIG Yahoo group, October 18, 2006.
!Here's how to set it up and use it, without invoking the ~FocusMax wizard
~FocusMax uses the left and right focus slopes, called V-curves, to determine the best focus. This is far more accurate than trying to "snoop' around for the best focus point.
*Slew to a 4th-6th magnitude star This is actually an important step. Too bright or too dim a star will not give good V-curve results.
*After you connect to your focuser, find a way to settle it more or less in the middle of its range. For example, the Optec ~TCF-S has a range of 7000 steps, so set it for 3500 to start, right in the middle. Then, use the telescope's manual focus to focus things as well as possible. This will allow the focuser and ~FocusMax to have equal latitude in and outside of focus. This will be a one-time step.
*In ~FocusMax (FM), on the setup tab (at the bottom), tell the system if you will be focusing in or focusing out to come to focus. It's a purely personal preference, but 'in' may be better so that the focuser is pulling up against the weight of the camera.
*Now click on ~V-Curve tab at the top, and the ~V-curve window will pop up.
*You will see two columns or methods of defining the V-curve parameters. In the first column (called, "end points"), you can specify the start and end points of the ~V-curve run, along with the step increment. With the ~TCF-S, it has 7000 steps. If I were successful at having the initial manual focus point set more or less at 3500, then I might set the start at 4500, and the end at 2500, with maybe a step increment of 50. This will give a V- curve of 40 steps (step size = 50). This first run will be done by specifying the start and end points. (The second method is the "half width" column, and we'll get to that later.)
*Click on the 'Run' button, and you will start your first ~V-curve run.
*FM will move the focuser to 4500, measure the half flux diameter (HFD) of the star, move the focuser in 50 position points, do it again, and again, until it gets to 2500...the end of the run. Visually, you will see the "~V-curve" on the screen, as it starts out measuring the fuzzy stars, gets sharper as it nears 3500, then gets fuzzy again as it hits 2500.
*At the end of the run, FM will take a moment to calculate the "slopes". The right side of the curve has a slope, and intercepts the '0' on the X-axis at the bottom at one value - like 3562. The left side of the slope similarly has a slope, and intercepts the '0' axis at the bottom with a slightly different value, e.g., 3470. This first V-curve run will be sloppy. The difference of where the left and right slopes intersect the X-axis is called the Position Intercept Difference, or 'PID'. With good optics and a good focuser, the agreement will approach 6-decimal between the left and right slopes, or about a value of 2-3 for the PID. It is mere microns away from perfect focus.
*Go back to the main window and click on the Focus button on the Focus tab. FM will now do a quick run to do an initial focus. We are not done - this is just for the next step.
*FM does NOT sniff around the bottom of the curve/tip of the V to "snoop" for the best focus position, as one might logically think. It instead uses one side of the V-curve slope, figures out where it is on that slope, and calculates the best focus position.
*FM will do an initial focus run and populate this value into the V-curve window in the "Half Width" column, in the "Center" value. Remember method #2 from above? Time to use it. For this, and all subsequent V-curve runs, we will allow FM to populate the "Center" value with the last focus value, and tell it the step value to use. So, if the focus point (Center) were to be 3500, and the half width is 1000 (amount on each side of focus), with a step size of 50, then again you would have 40 measurement points on your next V-curve.
*Run the next V-curve. After you have done one or two V-curve runs, increase both the width (e.g., 1500 instead of 1000), and decrease the step size (from 50 to 20). This will increase the range over which the focus is being measured, as well as the number of points on the curve. This will lead to more accurate results. You will need a minimum of 12 good V-curve runs to get a good V-curve model!
*You will notice that the wider your selection, and the smaller step size you use, the more accurate will be your V-curve, and the more closely will the left and right sides of the V's intercept '0' at the same point.
*After you have done 12-14 V-curves, you can delete the original inaccurate ones. Keep the good, accurate, ones.
*This whole process is one-time. Once you have a set of V- Curves, FM will generate superb, repeatable focus results.
*If you ever change your system, like adding in a reducer, you need to go under "file" to create a new system profile, so that the data from the two different setups does not get mixed up with one another. You can load the appropriate ~V-Curve file for each setup that you have.
For those with temperature-finicky scopes like an FSQ or TOA, frequent refocusing now becomes easy. Slew to the target, calibrate the scope for autoguiding. Then slew to a nearby 4th magnitude star (there are plenty, after all), and do a focus run. (This is not a V-curve run; we did all of that already.) A focus run takes about a minute. If you're using ~TheSky6, I just click on the "Slew Prior" button, and the scope goes right back to the target object. To refocus, just click on that "Slew Prior" button to switch between the target object and the 4th magnitude star. ACP fully automates this entire process.
----
!
The help file says the #AUTOFOCUS directive will "Automatically refocus the optical system before each filter group in the filter group for this target." Does the first occurrence of "filter group" in that sentence refer to a group of filters that have focus offsets relative to the same reference filter?
In a simple plan such as the following, assuming that filterinfo.txt offsets are specified, will autofocus be invoked once for the plan, or once per repeat, or what?
|!Example Plan|
|#Repeat 3|
|#autofocus|
|#Filter Red,Clear,Green,Blue|
|#Binning 2,1,2,2|
|#Count 5,8,5,10|
|#Interval 180,240,180,180|
|M 51|
*If filter offsets are specified, then #AUTOFOCUS causes an autofocus once for the target per set, regardless of repeat.
*If focus offsets aren't specified, then an autofocus occurs once per filter in the filter group for the target, per repeat per set.
----
!What happens
When the #CHILL <temp> directive is encountered in a plan, the imager's temperature setpoint is changed to the given temperature (deg. C). After the change, #CHILL waits for up to 15 minutes (a running plan is suspended!) for the cooler to reach a temperature within 2 degrees of the setpoint, and maintaining it for 60 seconds. The plan will continue after either reaching the right temperature or after 15 minutes, whichever is shorter.
#CHILL is actually a type of target, so you can #WAIT... before it, have the imager cooled or warmed, then #WAIT... again so that imaging starts up later.
ACP tells the camera to go to a certain value, for example -20°C. Then ACP polls the camera and asks for the actual temperature. If the camera reports back that it's reached that value, and it stays there within 2°C for 60 seconds, it returns to the plan in progress. If the camera can't reach that temperature after 15 minutes, it writes a line to the console/log, and continues running the rest of the plan.
!Effect on bias, dark and flat frames
Bias, dark and flat frames have both a ~SET-TEMP and a ~CCD-TEMP value written into the FITS header. The masters calibration frames constructed from these, however, only have the ~SET-TEMP value. So if #DHILL sets the set point at -40°C (for example), and you take bias, dark and flat frames at that set point but the real temperature is only -17°C, the master calibration frames created from them will claim to be -40°C masters and not -17°C masters.
You should select reasonable target #CHILL temperatures you can be assured your kit can achieve, anticipating what the nighttime ambient temperatures might be.
See also all the other [[Directives]].
----
Whether you use [[Starry Night Pro]] or [[TheSky]], ACP Planner works in basically the same way. You work in the planetarium, selecting targets to observe, and these are added to the "collector". As you add targets, you also specify the images to be taken. ACP Planner constantly recomputes the time needed to observe each target in the collector's list.
As you roll time back and forth (using the mouse wheel or Starry Night's Graph tool), targets move across the sky and a "guide display" tells you whether there's an active observation at the time, or how long it will be until the next observation will start, or that the remainder of the night is free. Thus, you can easily visualize which targets are in a favorable position at what times, how much time is available to insert a target between ones already selected, or start a new one at the end of the list.
When you're finished adding targets and setting up observations, simply save the observing plan (File/Save As...). At this point, if you have ACP installed, and it is ready for automated imaging, you can have your plan started automatically. Or you can save it for later running or uploading to a remote ACP observatory. Load the Plan into ACP or upload it to the remote ~ACP-based observatory and start it. That's all there is to it!
Here's a diagram that shows how the pieces fit together:
[img[RefDocs/PlannerSchema.png]]
----
!Product Improvements for v3.2:
*Many changes were made to allow planning more than 24 hours in the future. Note that no warnings are given for such targets, and the main target list still does not show dates by design.
*A new Search Names feature has been added to allow a Deep Sky target type to have its name checked against the ~MiniSAC catalog. This requires that ~MiniSAC be installed. Instructions are provided.
*Most advisory popup boxes have been changed to balloon help.
*A new preference for turning off balloon help popups has been added.
*The ~ReadMe that appears at the end of installation has been updated and contains suggestions to view the 2008 Planner videos and to install ~MiniSAC.
*Timing features are now disabled by default. This is a result of feedback from new users who were baffled by the target timing features.
!Bug Fixes
*Newly created calibration frames no longer trigger an "unsaved changes" warning.
*Off-by-one errors in importers have been corrected.
*Help for importing from TheSky Data Wizard was inadvertently omitted from 3.1 help. It is now included.
*The preset list was invisible when capturing videos, this has been fixed.
*The remote login test button now requires a non-blank domain field.
*Some advisory messages (now in balloons) have been reworded for clarity.
[[Download ACP Planner 3.2]]
Courtesy of Jim ~McMillan
----
@@color:#0f0;ACP's focus routine works like this:@@
1) Selects a suitable star within 5 degrees of the current target, eliminates doubles according to the database, and stays on the same side of the meridian.
2) It slews/centers the star to focus on and gives control to FM to focus.
3) If FM fails to achieve focus, it returns the focuser to the original position.
4) FM gives control back to ACP.
5) ACP slews back to the original target and centers it.
The only time ACP's focus routine (should) fail is because the database says the star ACP selects isn't a double but it really is. In this case, ~FocusMax usually won't focus properly. There is at least one known target (GSC 1.1) where this happens - NGC 891.
@@color:#0f0;~AcquireStar works like this@@ (and there are a couple of variants depending on how you set ~AcquireStar up):
1) ACP calls ~AcquireStar. ACP gives up control at this point.
2) ~AcquireStar selects 3 stars to focus on (with some additional control vs ACP).
3) ~AcquireStar slews (and perhaps centers), on the selected star and starts to focus.
4) If focus is achieved, ~AcquireStar slews back to the original target (perhaps centers), then gives control back to ACP.
5) If focus is not achieved, ~AcquireStar tries to focus on the 2nd star, then the 3rd star. If successful on one of those 2 stars, it does #4) above.
6) If focus is never achieved, it returns the focuser to the original position, then does #4 above.
There are 2 things to consider with respect to using ~AcquireStar:
1) Time. Even if ~AcquireStar works on the first star, it takes longer (maybe 25%-50%).
2) It requires setting up ~AcquireStar correctly - e.g. the data in the ~AcquireStar setup must match the setup in ACP, telescope driver, ~MaxIm, etc. It's just another place to keep track of - or where things can go wrong.
That said, you'll have virtually 100% reliability if you use ~AcquireStar.
I think it's fair to say that if you need 100% reliability, use ~AcquireStar. Use ACP's focus process if you're ok with something (perhaps) not quite 100% reliable due to database problems.
Personally, I use ACP's routine for all objects except NGC 891. If I image that target, I use ~AcquireStar.
----
<<miniBrowser hideControls http://hla.stsci.edu/>>
----
<<miniBrowser http://www.cfa.harvard.edu/iau/cbat.html>>
----
<<miniBrowser hideControls http://www.lunar-occultations.com/iota/iotandx.htm>>
----
A sky-limited sub-exposure tells you the minimum time that you should shoot for to optimize S/N in your images. Note that while you may not be able to achieve this exposure under some circumstances, it's not a disaster if you don't: you can always increase S/N by capturing and stacking more sub-frames to compensate.
To calculate the length of a sky-limited sub-exposure, you can use one of the on-line calculators. Here's a [[CCDWare online calculator]]. Gain is usually fixed on SBIG cameras. You can find out what yours is by examining the FITS header of an image. Look for EGAIN value.
Here is another [[Starizona web site]] that may help you get a better understanding of the technical details of image S/N.
----
|METEOSAT 7 IR imagery - 11 images on 6-hour time increments|
<<miniBrowser http://cimss.ssec.wisc.edu/tropic/real-time/indian/movies/met5irnhc/met5irnhcjava.html>>
----
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2008.06.11 [1.9.3] added $(...) function as 'shorthand' convenience syntax for document.getElementById()
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link. Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed). Thanks to Xavier Verges for suggestion and preliminary code.
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 9, revision: 3, date: new Date(2008,6,11)};
config.formatters.push( {
name: "inlineJavascript",
match: "\\<script",
lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",
handler: function(w) {
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var src=lookaheadMatch[1];
var label=lookaheadMatch[2];
var tip=lookaheadMatch[3];
var key=lookaheadMatch[4];
var show=lookaheadMatch[5];
var code=lookaheadMatch[6];
if (src) { // load a script library
// make script tag, set src, add to body to execute, then remove for cleanup
var script = document.createElement("script"); script.src = src;
document.body.appendChild(script); document.body.removeChild(script);
}
if (code) { // there is script code
if (show) // show inline script code in tiddler output
wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
if (label) { // create a link to an 'onclick' script
// add a link, define click handler, save code in link (pass 'place'), set link attributes
var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
link.code="function _out(place){"+fixup+"\n};_out(this);"
link.tiddler=w.tiddler;
link.onclick=function(){
this.bufferedHTML="";
try{ var r=eval(this.code);
if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
if(this.bufferedHTML.length)
s.innerHTML=this.bufferedHTML;
if((typeof(r)==="string")&&r.length) {
wikify(r,s,null,this.tiddler);
return false;
} else return r!==undefined?r:false;
} catch(e){alert(e.description||e.toString());return false;}
};
link.setAttribute("title",tip||"");
var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
link.setAttribute("href",URIcode);
link.style.cursor="pointer";
if (key) link.accessKey=key.substr(0,1); // single character only
}
else { // run inline script code
var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
var code="function _out(place){"+fixup+"\n};_out(w.output);"
try { var out=eval(code); } catch(e) { out=e.description?e.description:e.toString(); }
if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
}
}
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
} )
//}}}
// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
if(limit > 0) text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
//}}}
// // $(...) function: 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=="undefined") { // avoid redefinition
function $() {
var elements=new Array();
for (var i=0; i<arguments.length; i++) {
var element=arguments[i];
if (typeof element=='string') element=document.getElementById(element);
if (arguments.length==1) return element;
elements.push(element);
}
return elements;
}
}
//}}}
/***
|Name|InlineJavascriptPluginInfo|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for InlineJavascriptPlugin|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated ~TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code.
<script show>
/* javascript code goes here... */
</script>Every time the tiddler content is rendered, the javascript code is automatically evaluated, allowing you to invoke 'side-effect' processing and/or produce dynamically-generated content that is then inserted into the tiddler content, immediately following the script (see below). By including the optional ''show'' keyword as the final parameter in a {{{<script>}}} marker, the plugin will also include the script source code in the output that it displays in the tiddler. This is helpful when creating examples for documentation purposes (such as used in this tiddler!)
__''Deferred execution from an 'onClick' link''__
<script label="click here" title="mouseover tooltip text" key="X" show>
/* javascript code goes here... */
alert('you clicked on the link!');
</script>
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered. You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text, and a {{{key="X"}}} parameter to specify an //access key// (which must be a //single// letter or numeric digit only).
__''Loading scripts from external source files''__
<script src="URL" show>
/* optional javascript code goes here... */
</script>You can also load javascript directly from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.
In addition to loading the javascript from the external file, you can also use this feature to invoke javascript code contained within the {{{<script>...</script>}}} markers. This code is invoked //after// the external script file has been processed, and can make immediate use of the functions and/or global variables defined by the external script file.
>Note: To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that is rendered as soon as your TiddlyWiki document is opened, such as MainMenu. For example: put your {{{<script src="..."></script>}}} syntax into a separate 'library' tiddler (e.g., LoadScripts), and then add {{{<<tiddler LoadScripts>>}}} to MainMenu so that the library is loaded before any other tiddlers that rely upon the functions it defines.
>
>Normally, loading external javascript in this way does not produce any direct output, and should not have any impact on the appearance of your MainMenu. However, if your LoadScripts tiddler contains notes or other visible content, you can suppress this output by using 'inline CSS' in the MainMenu, like this: {{{@@display:none;<<tiddler LoadScripts>>@@}}}
<<<
!!!!!Creating dynamic tiddler content and accessing the ~TiddlyWiki DOM
<<<
An important difference between TiddlyWiki inline scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document: in a typical web document, you use the {{{document.write()}}} (or {{{document.writeln()}}}) function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.
However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and instead will //completely replace the entire ~TiddlyWiki document in your browser window (which is clearly not a good thing!)//. In order to allow scripts to use {{{document.write()}}}, the plugin automatically converts and buffers all HTML output so it can be safely inserted into your tiddler content, immediately following the script.
''Note that {{{document.write()}}} can only be used to output "pure HTML" syntax. To produce //wiki-formatted// output, your script should instead return a text value containing the desired wiki-syntax content'', which will then be automatically rendered immediately following the script. If returning a text value is not sufficient for your needs, the plugin also provides an automatically-defined variable, 'place', that gives the script code ''direct access to the //containing DOM element//'' into which the tiddler output is being rendered. You can use this variable to ''perform direct DOM manipulations'' that can, for example:
* generate wiki-formatted output using {{{wikify("...content...",place)}}}
* vary the script's actions based upon the DOM element in which it is embedded
* access 'tiddler-relative' DOM information using {{{story.findContainingTiddler(place)}}}
Note:
''When using an 'onclick' script, the 'place' element actually refers to the onclick //link text// itself, instead of the containing DOM element.'' This permits you to directly reference or modify the link text to reflect any 'stateful' conditions that might set by the script. To refer to the containing DOM element from within an 'onclick' script, you can use "place.parentNode" instead.
<<<
!!!!!Instant "bookmarklets"
<<<
You can also use an 'onclick' link to define a "bookmarklet": a small piece of javascript that can be ''invoked directly from the browser without having to be defined within the current document.'' This allows you to create 'stand-alone' commands that can be applied to virtually ANY TiddlyWiki document... even remotely-hosted documents that have been written by others!! To create a bookmarklet, simply define an 'onclick' script and then grab the resulting link text and drag-and-drop it onto your browser's toolbar (or right-click and use the 'bookmark this link' command to add it to the browser's menu).
Notes:
*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script. As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,'' and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
<<<
!!!!!Special reserved function name
<<<
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
<<<
!!!!!$(...) 'shorthand' function
<<<
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
{{{
$(id)
}}}
in place of the normal standard javascript syntax:
{{{
document.getElementById(id)
}}}
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
<<<
!!!!!Examples
<<<
simple dynamic output:
><script show>
document.write("The current date/time is: "+(new Date())+"<br>");
return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
if (!window.story) window.story=window;
var title=story.findContainingTiddler(place).getAttribute("tiddler");
var size=store.getTiddlerText(title).length;
return title+" is using "+size+" bytes";
</script>
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
document.write("<br>The current date/time is: "+(new Date())+"<br>");
return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
if (!window.story) window.story=window;
var txt=place.firstChild.data;
var tid=story.findContainingTiddler(place).getAttribute('tiddler');
alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
</script>
dynamically setting onclick link text based on stateful information:
>{{block{
{{{
<script label="click here">
/* toggle "txtSomething" value */
var on=(config.txtSomething=="ON");
place.innerHTML=on?"enable":"disable";
config.txtSomething=on?"OFF":"ON";
return "\nThe current value is: "+config.txtSomething;
</script><script>
/* initialize onclick link text based on current "txtSomething" value */
var on=(config.txtSomething=="ON");
place.lastChild.previousSibling.innerHTML=on?"disable":"enable";
</script>
}}}
<script label="click here">
/* toggle "txtSomething" value */
var on=(config.txtSomething=="ON");
place.innerHTML=on?"enable":"disable";
config.txtSomething=on?"OFF":"ON";
return "\nThe current value is: "+config.txtSomething;
</script><script>
/* initialize onclick link text based on current "txtSomething" value */
var on=(config.txtSomething=="ON");
place.lastChild.innerHTML=on?"enable":"disable";
</script>
}}}
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
>
><script src="demo.js" show>
return "inlineJavascriptDemo() function has been defined"
</script>
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
inlineJavascriptDemo();
</script>
<<<
!!!!!Revisions
<<<
2008.06.11 [1.9.3] added $(...) function as 'shorthand' convenience syntax for document.getElementById()
2008.03.03 [1.9.2] corrected declaration of wikifyPlainText() for 'TW 2.1.x compatibility fallback' (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' attribute on link element (fixes IE errors)
2008.02.21 [1.9.0] 'onclick' scripts now allow returned text (or document.write() calls) to be wikified into a span that immediately follows the onclick link. Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed). Thanks to Xavier Verges for suggestion and preliminary code.
2008.02.14 [1.8.1] added backward-compatibility for use of wikifyPlainText() in ~TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 [1.8.0] added support for key="X" syntax to specify custom access key definitions
2007.12.15 [1.7.0] autogenerate URI encoded HREF on links for onclick scripts. Drag links to browser toolbar to create bookmarklets. IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets. In addition, double-quotes will cause syntax errors. Thanks to Paul Reiber for debugging and brainstorming.
2007.11.26 [1.6.2] when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 [1.6.1] when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 [1.6.0] added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 [1.5.2] add newline before closing '}' in 'function out_' wrapper. Fixes error caused when last line of script is a comment.
2006.06.01 [1.5.1] when calling wikify() on script return value, pass ~hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 [1.5.0] added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 [1.4.0] added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.
2005.12.13 [1.3.1] when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by Udo Borkowski
2005.11.09 [1.3.0] for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by Bradley Meck
2005.11.08 [1.2.0] handle loading of javascript from an external URL via src="..." syntax
2005.11.08 [1.1.0] pass 'place' param into scripts to provide direct DOM access
2005.11.08 [1.0.0] initial release
<<<
/***
|''Name:''|InlineSlidersPlugin|
|''Description:''|super light weight plugin for inline sliders|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#InlineSlidersPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|
!!Usage
* Create sliders inline using a {{{<slider label>text of slider</slider>}}} syntax
* Also supports a {{{+++++ =====}}} syntax
* Please note
* Example:
+++++ Demo
This is an example slider
=====
***/
// /%
//!BEGIN-PLUGIN-CODE
config.formatters.unshift( {
name: "inlinesliders",
match: "\\+\\+\\+\\+\\+|\\<slider",
lookaheadRegExp: /(?:\+\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:=====|<\/slider>)/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
{
var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\u00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");
var panel = createTiddlyElement(w.output,"div",null,"sliderPanel inlineSlider");
panel.style.display = "none";
panel.raw = lookaheadMatch[2];
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
onClickSlider : function(e)
{
if(!e) var e = window.event;
var n = this.nextSibling;
removeChildren(n);
wikify(n.raw,n);
n.style.display = (n.style.display=="none") ? "block" : "none";
return false;
}
});
setStylesheet("div.inlineSlider {margin-left:1em; padding:0 0.5em;}","InlineSliderStyles");
//!END-PLUGIN-CODE
// %/
!Using the MS Office Script Debugger
The Office script debugger can be used outside Office as a general purpose script debugger. Instructions for installation are given below:
1. First, install the Office script debugger. In the Office setup program, click Add or Remove Features, then select
|!Office Tools|
|HTML Source Editing <-- INSTALL|
|Web Scripting <-- INSTALL|
2. Once this installation is complete, you'll have the debugger installed.
!!Office 2007
Create a shortcut to (TBD).EXE (the debugger) and (TBD).CHM (the help file for the debugger) on your desktop or start menu. On my system, these ended up at:
|C:\Program Files\Microsoft Office\Office12\(TBD)|
|C:\Program Files\Microsoft Office\Office12\1033\(TBD)|
!!Office 2003
Create a shortcut to ~MSE7.EXE (the debugger) and ~MSE10.CHM (the help file for the debugger) on your desktop or start menu. On my system, these ended up at:
|C:\Program Files\Microsoft Office\Office11\~MSE7.EXE|
|C:\Program Files\Microsoft Office\Office11\1033\~MSE10.CHM|
!!Office 2000
Create a shortcut to MSE.EXE (the debugger) and ~CSOF98.COL (the help file for the debugger) on your desktop or start menu. On my system, these ended up at:
|C:\Program Files\Visual Studio\Common\IDE\~IDE98\MSE.EXE|
|C:\Program Files\Visual Studio\Common\IDE\~IDE98\MSE\1033\~CSOF98.COL|
I already had Visual Studio installed, they may end up at some other location on your system if you don't have Visual Studio.
3. Now open the Office debugger. Select the Tools menu, Options... and under Debugger, check General/~Just-In-Time-Debugger, Script/Attach to programs running on this machine, as well as Script/~Just-In-Time-Debugging. Exit from MSE.
@@color:#ff0;The debugger functions as a script editor also, nicer than Notepad. Try opening a document from the File menu and see what happens.@@
To force a break into the debugger, put a Stop statement into your script (~VBScript, for ~JScript use "debugger;"). When you hit the Stop/debugger' statement or encounter an error, you'll get a "do you want to debug?" alert. Answer Yes and you'll be in the MSE debugger with the source showing.
You cannot edit the source at that point (it's not VB!), but you can inspect variables, step through the code, etc. To get past a line that raises an error, use the "Set Next Statement" button to move the
execution point past the statement, and if needed type in a corrected statement in the Immediate window.
''Warning'': If you click the stop button or exit the debugger, it will stop the entire program.
''Workaround'': The workaround to the above is to Open the Debug Processes window (menu Debug/Processes..., or Ctrl+Shift+R), and Detach your process. This will cause the error condition to be passed on to the script-host application and the debugger to be taken out of the picture. It's not much of a hassle given the enormous improvement from the Microsoft Script Debugger.
----
<<miniBrowser hideControls http://en.wikipedia.org/wiki/International_Celestial_Reference_System>>
<<miniBrowser hideControls http://en.wikipedia.org/wiki/International_Celestial_Reference_Frame>>
<<miniBrowser hideControls http://ssd.jpl.nasa.gov/sbdb.cgi>>
----
ACP has code within ~AcquireImages.js to stop the tracking at the end of a run. If you want to defeat this, look in ~Acquireimages.js (in the Scripts folder, or ~plan-acquire.js in the Scripts/~WebDocs folder for web usage) for this code:
Code:
{{{
if(Telescope.CanSetTracking && Telescope.Tracking)
{
Console.PrintLine(" (turning tracking off for safety)");
Telescope.Tracking = false;
Util.WaitForMilliseconds(1000);
}
}}}
and change it to
Code:
{{{
if(false) // if(Telescope.CanSetTracking && Telescope.Tracking)
{
Console.PrintLine(" (turning tracking off for safety)");
Telescope.Tracking = false;
Util.WaitForMilliseconds(1000);
}
}}}
It will no longer turn off tracking at the end of a run. @@color:#ff0;''THIS IS A BIT DANGEROUS...''@@ if you forget about it your scope could track into the mount.
----
*Mouse around near the axes!
(:graph({scales:[-6,6],coords:"polar"})
dynamic.moveit = function() {
var angle = getAngle();
parametricPlot("dynamic.a*cos(x)","dynamic.b*sin(x)",{max:angle,id:"ell",stroke:"darkorange",strokewidth:2});
path([[-dynamic.c,0],[dynamic.a*cos(angle),dynamic.b*sin(angle)],[dynamic.c,0]],{id:"gen",stroke:"blue",strokewidth:1,strokedasharray:"5,5"});
image('figuras/moon.png',{id:"moon",point:[dynamic.a*cos(angle),dynamic.b*sin(angle)],width:20,height:20});
}
setAction("mousemove",dynamic.moveit);
axes({ticklabels:false, stroke:"white"});
dynamic.a = 5;
dynamic.b = 3.5;
dynamic.c = sqrt(dynamic.a*dynamic.a-dynamic.b*dynamic.b);
dot([-dynamic.c,0],{id:"sol",marker:"*",size:40,markerstroke:"#FFD500",label:"Sol",pos:"S",fontfill:"white"});
dot([dynamic.c,0],{marker:"*",size:8,markerstroke:"#0F0"});
:)
This 13 Mar 2003 version is the latest version of catalog. It contains a total of 33,860 stars. Michael Richmond (Rochester Inst. Technology), of the TASS amateur sky survey group, has kindly produced plots of the distribution of the stars from my list, and posted them at the TASS Web site:
http://stupendous.rit.edu/tass/catalogs/catalogs.html#loneos
----
<<miniBrowser hideControls http://www.tass-survey.org/tass/catalogs/loneos.cat>>
----
<<miniBrowser hideControls http://adsbit.harvard.edu/cgi-bin/nph-iarticle_query?1983AJ%2E%2E%2E%2E%2E88%2E%2E439L>>
<<miniBrowser hideControls http://adsabs.harvard.edu/abs/1983AJ.....88..439L>>
----
<<miniBrowser hideControls http://adsbit.harvard.edu/cgi-bin/nph-iarticle_query?1992AJ%2E%2E%2E%2E104%2E%2E340L>>
<<miniBrowser hideControls http://adsabs.harvard.edu/abs/1992AJ....104..340L>>
----
*Read his original refereed publications at [[Landolt 1983]] and [[Landolt 1992]] (big articles, but quick download)
*Read an article containing additional photometric standard fields called [[Stetson Standards]]
*Read this article about [[Photometric Accuracy of the USNO A2.0 Catalog]] determined from Landolt standards
----
*Here's an online table of Landolt Standards close to the equator, with pointers to finding charts:
<<miniBrowser hideControls http://www.ls.eso.org/lasilla/Telescopes/2p2T/Landolt/>>
----
Download this as an Excel [[Landolt Standards Spreadsheet]]
----
|Close this window after downloading|
<<miniBrowser hideControls RefDocs/Landolt.xls>>
----
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/
//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};
config.formatters.push(
{
name: "legacyStrikeByChar",
match: "==",
termRegExp: /(==)/mg,
element: "strike",
handler: config.formatterHelpers.createElementAndWikify
});
} //# end of "install only once"
//}}}
<<miniBrowser http://www.cfa.harvard.edu/iau/lists/Dangerous.html>>
----
<<miniBrowser hideControls http://www.cfa.harvard.edu/iau/lists/RecentSupernovae.html>>
----
<<miniBrowser hideControls http://exoplanet.eu/catalog-all.php>>
----
*IR
<<miniBrowser hideControls http://www.novac.com/weather/irloop.gif>>
----
from: ''John Winfield''
----
<<miniBrowser hideControls http://winfij.homeip.net/development/CloudDetector.html>>
----
from: ''Stan Ralph''
----
<<miniBrowser hideControls http://www.fostersystems.com/downloadcenter1.html>>
----
This is the up-to-date list of orbital elements for observable comets.
<<miniBrowser hideControls http://www.cfa.harvard.edu/iau/Ephemerides/Comets/Soft00Cmt.txt>>
----
<<miniBrowser hideControls http://mpcorb.klet.org/>>
[[ACP Reference Guide]]
<<toggleSideBar " " "Don't click this" hide>>
[[ACP Comm Center]]
[[Videos]]
[[ACP Architecture]]
[[ACP Website]]
[[Site Map]]
/% [[SiteMap-2]] %/
[[Google]]
[[Register Your Observatory]]
!Overall Format
Plan files are text files. Each line of a plan file must be one of the following:
*[[Directives]] (line beginning with '#')
*Target specifications
*Comment (line beginning with ';') These are echoed into the log file (though sometimes at unexpected times due to ACP's slew-ahead logic!)
Typically, a plan will consist of some directives followed by a target, some more directives, another target, etc. Lines may be indented by tabs or spaces. Any leading or trailing tabs or spaces are removed as soon as each line is read from the file. Comments beginning with ';' may appear anywhere in a live line, and will be ignored.
!Target Specifications
The heart of a plan file is its target specification lines. Most commonly, each target specification line contains three pieces of information:
#The name of the target,
#The J2000 right ascension of the target, and
#The J2000 declination of the target.
Other information may be in the line, but it is ignored. One special type of target specification contains the orbital elements of a minor planet or comet, allowing ~AcquireImages.js to calculate its position at the precise time of the exposure, and optionally perform orbital tracking (if the mount supports it) to follow the motion of the object. Another special target specification contains ephemerides for a near-earth object. In this case, you supply several ephemeris records, spaced 1 or 2 hours apart, and ACP will perform a Lagrange interpolation on the positions to determine a precise position and velocity (for orbital tracking) of the NEO.
ACP and ~AcquireImages.js accepts target specifications in several formats. These target specifications may be freely intermixed within a single plan file.
They are:
*''Deep sky object or major planet name:'' If you specify only a name (nothing more on the target line) ACP will first try to match it to a major planet name and calculate an instant ephemeris for the time of the image. Otherwise it will attempt to find the object in its [[Deep Sky Catalog]] and retrieve the coordinates. Note that the catalog name and number must be separated by a space (e.g. "M 51", "PGC 12345").
|!NOTE|
|Use the Slew or Sync (catalog) button to open a window in which you can search the deep sky catalog. For details on how to search, see ACP [[Deep Sky Catalog]]. There are over 70,000 deep sky objects, so don't give up. It's probably in there!|
*''"MP" followed by minor planet name:'' If you have installed and built the fast-lookup database based on MPCORB.DAT, the Minor Planet Center's orbital elements database, you can simply give the minor planet designation (packed or unpacked), number, or name, and ACP will retrieve the orbital elements from this database, then calculate coordinates for the exposure time. Look at the readme.txt file in C:\Program Files\Common Files\ASCOM\MPCORB for instructions.
*''Simple tab-delimited format:'' Use this with objects for which you know the J2000 coordinates. This is really easy, but not as easy as just supplying the name as described above!
*''Asteroid or Comet:'' 1-Line orbital elements from the IAU Minor Planet Center. This is a bit time-consuming because you have to get the elements for each of your targets from the MPC. For minor planets (not comets), see above.
*[[''Near-Earth Object Ephemerides'']]: from the IAU Minor Planet Center.
!Mixing Old and New Target Formats
Previous versions of ACP did not have support for filter groups. ACP will still run these old format plans, however in general you cannot mix old and new formats within a single plan. If you specify any target with more than one filter group, you must specify #Count, #Binning, #Interval, and (if you have filters) #Filter explicitly for the first target in the old format.
|!Example|
|#Filter Red,Clear,Green,Blue|
|#Binning 2,1,2,2|
|#Count 5,8,5,10|
|#Interval 180,240,180,180|
|M 51|
|#Count 1 ; Reset these to one filter group|
|#Filter Clear|
|#Binning 1|
|#Interval 120|
|M 13|
|#interval 240|
|M 21|
----
/***
|''Name:''|MathSVGPlugin|
|''Description:''|This plugin translates a subset of the LaTeX math notation to MathML with a customisable image fallback when MathML is not supported. It also provides an easy way to produce mathematical SVG graphics with dynamical features and animation.|
|''Version:''|1.2.2|
|''Date:''|2009-06-25|
|''Source:''|http://www.math.ist.utl.pt/~psoares/mathsvg.html|
|''Author:''|Paulo Soares|
|''License:''|[[GNU Lesser General Public License|http://www.gnu.org/licences/lgpl.html]]|
|''~CoreVersion:''|2.5.0|
!Original copyright notice
{{{
ASCIIMathML.js
==============
Version 2.1 Oct 8, 2008, (c) Peter Jipsen http://www.chapman.edu/~jipsen
This version extends ASCIIMathML.js with LaTeXMathML.js and ASCIIsvg.js.
Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
If you use it on a webpage, please send the URL to jipsen@chapman.edu
The LaTeXMathML modifications were made by Douglas Woodall, June 2006.
(for details see header on the LaTeXMathML part in middle of file)
Extensive clean-up and improvements by Paulo Soares, Oct 2007.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
(at http://www.gnu.org/licences/lgpl.html) for more details.
}}}
!~MathSVG code (minified)
***/
//{{{
Math.sec=function(a){return 1/Math.cos(a)};Math.csc=function(a){return 1/Math.sin(a)};Math.cot=function(a){return 1/Math.tan(a)};Math.asec=function(a){return Math.acos(1/a)};Math.acsc=function(a){return Math.asin(1/a)};Math.acot=function(a){return Math.atan(1/a)};Math.sinh=function(a){return(Math.exp(a)-Math.exp(-a))/2};Math.cosh=function(a){return(Math.exp(a)+Math.exp(-a))/2};Math.tanh=function(a){return(Math.exp(a)-Math.exp(-a))/(Math.exp(a)+Math.exp(-a))};Math.sech=function(a){return 1/Math.cosh(a)};Math.csch=function(a){return 1/Math.sinh(a)};Math.coth=function(a){return 1/Math.tanh(a)};Math.asinh=function(a){return Math.log(a+Math.sqrt(a*a+1))};Math.acosh=function(a){return Math.log(a+Math.sqrt(a*a-1))};Math.atanh=function(a){return Math.log((1+a)/(1-a))/2};Math.sech=function(a){return 1/Math.cosh(a)};Math.csch=function(a){return 1/Math.sinh(a)};Math.coth=function(a){return 1/Math.tanh(a)};Math.asech=function(a){return Math.acosh(1/a)};Math.acsch=function(a){return Math.asinh(1/a)};Math.acoth=function(a){return Math.atanh(1/a)};Math.sign=function(a){return(a===0?0:(a<0?-1:1))};Math.step=function(a,c,b){return(a<0?(b?b:0):(c?c:1))};Math.root=function(a,b){return Math.pow(a,1/b)};Math.factorial=function(b){if(b===0){return 1}if(b<0){if((b%1)===0){return}if(b>-1){return Math.factorial(b+1)/(b+1)}return -Math.PI/(Math.factorial(-1-b)*Math.sin(Math.PI*b))}var a=b;if((b%1)===0){while(b>1){b=b-1;a=a*b}}else{a=Math.exp((b+0.5)*Math.log(b+1)-b-b*(0.1121105+b*0.08106103)/(1.452342+b*(2.410858+b)))}return a};Math.Gamma=function(a){return Math.factorial(a-1)};Math.Beta=function(a,b){return Math.Gamma(a)*Math.Gamma(b)/Math.Gamma(a+b)};Math.C=function(a,b){var c=1/((a+1)*Math.Beta(b+1,a-b+1));return c};Math.truncate=function(a,c){var b=c||0;return Math.floor(a*Math.pow(10,b))/Math.pow(10,b)};Math.randomString=function(a,g){var f=(g||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").split("");var e=[],c=Math.random;var d=f.length;for(var b=0;b<a;b++){e[b]=f[0|c()*d]}return e.join("")};Math.runif=function(d,c,f){var e=f||0;return Math.truncate((c+Math.pow(10,-e)-d)*Math.random()+d,e)};Math.rnormal=function(a,b){a=a||0;b=b||1;var d=0,c=0;while(d*c===0){d=Math.random();c=Math.random()}return b*(Math.sqrt(-2*Math.log(d))*Math.cos(2*Math.PI*c))+a};var MSVG=function(j){var s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";var q=["\uD835\uDC9C","\u212C","\uD835\uDC9E","\uD835\uDC9F","\u2130","\u2131","\uD835\uDCA2","\u210B","\u2110","\uD835\uDCA5","\uD835\uDCA6","\u2112","\u2133","\uD835\uDCA9","\uD835\uDCAA","\uD835\uDCAB","\uD835\uDCAC","\u211B","\uD835\uDCAE","\uD835\uDCAF","\uD835\uDCB0","\uD835\uDCB1","\uD835\uDCB2","\uD835\uDCB3","\uD835\uDCB4","\uD835\uDCB5","\uD835\uDCB6","\uD835\uDCB7","\uD835\uDCB8","\uD835\uDCB9","\u212F","\uD835\uDCBB","\u210A","\uD835\uDCBD","\uD835\uDCBE","\uD835\uDCBF","\uD835\uDCC0","\uD835\uDCC1","\uD835\uDCC2","\uD835\uDCC3","\u2134","\uD835\uDCC5","\uD835\uDCC6","\uD835\uDCC7","\uD835\uDCC8","\uD835\uDCC9","\uD835\uDCCA","\uD835\uDCCB","\uD835\uDCCC","\uD835\uDCCD","\uD835\uDCCE","\uD835\uDCCF"];var B=["\uD835\uDD04","\uD835\uDD05","\u212D","\uD835\uDD07","\uD835\uDD08","\uD835\uDD09","\uD835\uDD0A","\u210C","\u2111","\uD835\uDD0D","\uD835\uDD0E","\uD835\uDD0F","\uD835\uDD10","\uD835\uDD11","\uD835\uDD12","\uD835\uDD13","\uD835\uDD14","\u211C","\uD835\uDD16","\uD835\uDD17","\uD835\uDD18","\uD835\uDD19","\uD835\uDD1A","\uD835\uDD1B","\uD835\uDD1C","\u2128","\uD835\uDD1E","\uD835\uDD1F","\uD835\uDD20","\uD835\uDD21","\uD835\uDD22","\uD835\uDD23","\uD835\uDD24","\uD835\uDD25","\uD835\uDD26","\uD835\uDD27","\uD835\uDD28","\uD835\uDD29","\uD835\uDD2A","\uD835\uDD2B","\uD835\uDD2C","\uD835\uDD2D","\uD835\uDD2E","\uD835\uDD2F","\uD835\uDD30","\uD835\uDD31","\uD835\uDD32","\uD835\uDD33","\uD835\uDD34","\uD835\uDD35","\uD835\uDD36","\uD835\uDD37"];var p=["\uD835\uDD38","\uD835\uDD39","\u2102","\uD835\uDD3B","\uD835\uDD3C","\uD835\uDD3D","\uD835\uDD3E","\u210D","\uD835\uDD40","\uD835\uDD41","\uD835\uDD42","\uD835\uDD43","\uD835\uDD44","\u2115","\uD835\uDD46","\u2119","\u211A","\u211D","\uD835\uDD4A","\uD835\uDD4B","\uD835\uDD4C","\uD835\uDD4D","\uD835\uDD4E","\uD835\uDD4F","\uD835\uDD50","\u2124","\uD835\uDD52","\uD835\uDD53","\uD835\uDD54","\uD835\uDD55","\uD835\uDD56","\uD835\uDD57","\uD835\uDD58","\uD835\uDD59","\uD835\uDD5A","\uD835\uDD5B","\uD835\uDD5C","\uD835\uDD5D","\uD835\uDD5E","\uD835\uDD5F","\uD835\uDD60","\uD835\uDD61","\uD835\uDD62","\uD835\uDD63","\uD835\uDD64","\uD835\uDD65","\uD835\uDD66","\uD835\uDD67","\uD835\uDD68","\uD835\uDD69","\uD835\uDD6A","\uD835\uDD6B"];var x=0,b=1,c=2,m=3,v=4,d=5,n=6,o=7,l=8,e=9,z=10,y=11,g=13,i=14;var a=[{input:"\\varepsilon",tag:"mi",output:"\u025B",ttype:x},{input:"\\varsigma",tag:"mi",output:"\u03C2",ttype:x},{input:"\\vartheta",tag:"mi",output:"\u03D1",ttype:x},{input:"\\varphi",tag:"mi",output:"\u03D5",ttype:x},{input:"\\varpi",tag:"mi",output:"\u03D6",ttype:x},{input:"\\varrho",tag:"mi",output:"\u03F1",ttype:x},{input:"\\alpha",tag:"mi",output:"\u03B1",ttype:x},{input:"\\beta",tag:"mi",output:"\u03B2",ttype:x},{input:"\\gamma",tag:"mi",output:"\u03B3",ttype:x},{input:"\\delta",tag:"mi",output:"\u03B4",ttype:x},{input:"\\epsilon",tag:"mi",output:"\u03B5",ttype:x},{input:"\\zeta",tag:"mi",output:"\u03B6",ttype:x},{input:"\\eta",tag:"mi",output:"\u03B7",ttype:x},{input:"\\theta",tag:"mi",output:"\u03B8",ttype:x},{input:"\\iota",tag:"mi",output:"\u03B9",ttype:x},{input:"\\kappa",tag:"mi",output:"\u03BA",ttype:x},{input:"\\lambda",tag:"mi",output:"\u03BB",ttype:x},{input:"\\mu",tag:"mi",output:"\u03BC",ttype:x},{input:"\\nu",tag:"mi",output:"\u03BD",ttype:x},{input:"\\xi",tag:"mi",output:"\u03BE",ttype:x},{input:"\\omicron",tag:"mi",output:"\u03BF",ttype:x},{input:"\\pi",tag:"mi",output:"\u03C0",ttype:x},{input:"\\rho",tag:"mi",output:"\u03C1",ttype:x},{input:"\\sigma",tag:"mi",output:"\u03C3",ttype:x},{input:"\\tau",tag:"mi",output:"\u03C4",ttype:x},{input:"\\upsilon",tag:"mi",output:"\u03C5",ttype:x},{input:"\\phi",tag:"mi",output:"\u03C6",ttype:x},{input:"\\chi",tag:"mi",output:"\u03C7",ttype:x},{input:"\\psi",tag:"mi",output:"\u03C8",ttype:x},{input:"\\omega",tag:"mi",output:"\u03C9",ttype:x},{input:"\\Alpha",tag:"mo",output:"\u0391",ttype:x},{input:"\\Beta",tag:"mo",output:"\u0392",ttype:x},{input:"\\Gamma",tag:"mo",output:"\u0393",ttype:x},{input:"\\Delta",tag:"mo",output:"\u0394",ttype:x},{input:"\\Epsilon",tag:"mo",output:"\u0395",ttype:x},{input:"\\Zeta",tag:"mo",output:"\u0396",ttype:x},{input:"\\Eta",tag:"mo",output:"\u0397",ttype:x},{input:"\\Theta",tag:"mo",output:"\u0398",ttype:x},{input:"\\Iota",tag:"mo",output:"\u0399",ttype:x},{input:"\\Kappa",tag:"mo",output:"\u039A",ttype:x},{input:"\\Lambda",tag:"mo",output:"\u039B",ttype:x},{input:"\\Mu",tag:"mo",output:"\u039C",ttype:x},{input:"\\Nu",tag:"mo",output:"\u039D",ttype:x},{input:"\\Xi",tag:"mo",output:"\u039E",ttype:x},{input:"\\Omicron",tag:"mo",output:"\u039F",ttype:x},{input:"\\Pi",tag:"mo",output:"\u03A0",ttype:x},{input:"\\Rho",tag:"mo",output:"\u03A1",ttype:x},{input:"\\Sigma",tag:"mo",output:"\u03A3",ttype:x},{input:"\\Tau",tag:"mo",output:"\u03A4",ttype:x},{input:"\\Upsilon",tag:"mo",output:"\u03A5",ttype:x},{input:"\\Phi",tag:"mo",output:"\u03A6",ttype:x},{input:"\\Chi",tag:"mo",output:"\u03A7",ttype:x},{input:"\\Psi",tag:"mo",output:"\u03A8",ttype:x},{input:"\\Omega",tag:"mo",output:"\u03A9",ttype:x},{input:"\\frac12",tag:"mo",output:"\u00BD",ttype:x},{input:"\\frac14",tag:"mo",output:"\u00BC",ttype:x},{input:"\\frac34",tag:"mo",output:"\u00BE",ttype:x},{input:"\\frac13",tag:"mo",output:"\u2153",ttype:x},{input:"\\frac23",tag:"mo",output:"\u2154",ttype:x},{input:"\\frac15",tag:"mo",output:"\u2155",ttype:x},{input:"\\frac25",tag:"mo",output:"\u2156",ttype:x},{input:"\\frac35",tag:"mo",output:"\u2157",ttype:x},{input:"\\frac45",tag:"mo",output:"\u2158",ttype:x},{input:"\\frac16",tag:"mo",output:"\u2159",ttype:x},{input:"\\frac56",tag:"mo",output:"\u215A",ttype:x},{input:"\\frac18",tag:"mo",output:"\u215B",ttype:x},{input:"\\frac38",tag:"mo",output:"\u215C",ttype:x},{input:"\\frac58",tag:"mo",output:"\u215D",ttype:x},{input:"\\frac78",tag:"mo",output:"\u215E",ttype:x},{input:"\\pm",tag:"mo",output:"\u00B1",ttype:x},{input:"\\mp",tag:"mo",output:"\u2213",ttype:x},{input:"\\triangleleft",tag:"mo",output:"\u22B2",ttype:x},{input:"\\triangleright",tag:"mo",output:"\u22B3",ttype:x},{input:"\\cdot",tag:"mo",output:"\u22C5",ttype:x},{input:"\\star",tag:"mo",output:"\u22C6",ttype:x},{input:"\\ast",tag:"mo",output:"\u002A",ttype:x},{input:"\\times",tag:"mo",output:"\u00D7",ttype:x},{input:"\\div",tag:"mo",output:"\u00F7",ttype:x},{input:"\\circ",tag:"mo",output:"\u2218",ttype:x},{input:"\\bullet",tag:"mo",output:"\u2022",ttype:x},{input:"\\oplus",tag:"mo",output:"\u2295",ttype:x},{input:"\\ominus",tag:"mo",output:"\u2296",ttype:x},{input:"\\otimes",tag:"mo",output:"\u2297",ttype:x},{input:"\\bigcirc",tag:"mo",output:"\u25CB",ttype:x},{input:"\\oslash",tag:"mo",output:"\u2298",ttype:x},{input:"\\odot",tag:"mo",output:"\u2299",ttype:x},{input:"\\land",tag:"mo",output:"\u2227",ttype:x},{input:"\\wedge",tag:"mo",output:"\u2227",ttype:x},{input:"\\lor",tag:"mo",output:"\u2228",ttype:x},{input:"\\vee",tag:"mo",output:"\u2228",ttype:x},{input:"\\cap",tag:"mo",output:"\u2229",ttype:x},{input:"\\cup",tag:"mo",output:"\u222A",ttype:x},{input:"\\sqcap",tag:"mo",output:"\u2293",ttype:x},{input:"\\sqcup",tag:"mo",output:"\u2294",ttype:x},{input:"\\uplus",tag:"mo",output:"\u228E",ttype:x},{input:"\\amalg",tag:"mo",output:"\u2210",ttype:x},{input:"\\bigtriangleup",tag:"mo",output:"\u25B3",ttype:x},{input:"\\bigtriangledown",tag:"mo",output:"\u25BD",ttype:x},{input:"\\dag",tag:"mo",output:"\u2020",ttype:x},{input:"\\dagger",tag:"mo",output:"\u2020",ttype:x},{input:"\\ddag",tag:"mo",output:"\u2021",ttype:x},{input:"\\ddagger",tag:"mo",output:"\u2021",ttype:x},{input:"\\lhd",tag:"mo",output:"\u22B2",ttype:x},{input:"\\rhd",tag:"mo",output:"\u22B3",ttype:x},{input:"\\unlhd",tag:"mo",output:"\u22B4",ttype:x},{input:"\\unrhd",tag:"mo",output:"\u22B5",ttype:x},{input:"\\sum",tag:"mo",output:"\u2211",ttype:o},{input:"\\prod",tag:"mo",output:"\u220F",ttype:o},{input:"\\bigcap",tag:"mo",output:"\u22C2",ttype:o},{input:"\\bigcup",tag:"mo",output:"\u22C3",ttype:o},{input:"\\bigwedge",tag:"mo",output:"\u22C0",ttype:o},{input:"\\bigvee",tag:"mo",output:"\u22C1",ttype:o},{input:"\\bigsqcap",tag:"mo",output:"\u2A05",ttype:o},{input:"\\bigsqcup",tag:"mo",output:"\u2A06",ttype:o},{input:"\\coprod",tag:"mo",output:"\u2210",ttype:o},{input:"\\bigoplus",tag:"mo",output:"\u2A01",ttype:o},{input:"\\bigotimes",tag:"mo",output:"\u2A02",ttype:o},{input:"\\bigodot",tag:"mo",output:"\u2A00",ttype:o},{input:"\\biguplus",tag:"mo",output:"\u2A04",ttype:o},{input:"\\int",tag:"mo",output:"\u222B",ttype:x},{input:"\\oint",tag:"mo",output:"\u222E",ttype:x},{input:":=",tag:"mo",output:":=",ttype:x},{input:"\\lt",tag:"mo",output:"<",ttype:x},{input:"\\gt",tag:"mo",output:">",ttype:x},{input:"\\ne",tag:"mo",output:"\u2260",ttype:x},{input:"\\neq",tag:"mo",output:"\u2260",ttype:x},{input:"\\le",tag:"mo",output:"\u2264",ttype:x},{input:"\\leq",tag:"mo",output:"\u2264",ttype:x},{input:"\\leqslant",tag:"mo",output:"\u2264",ttype:x},{input:"\\ge",tag:"mo",output:"\u2265",ttype:x},{input:"\\geq",tag:"mo",output:"\u2265",ttype:x},{input:"\\geqslant",tag:"mo",output:"\u2265",ttype:x},{input:"\\equiv",tag:"mo",output:"\u2261",ttype:x},{input:"\\ll",tag:"mo",output:"\u226A",ttype:x},{input:"\\gg",tag:"mo",output:"\u226B",ttype:x},{input:"\\doteq",tag:"mo",output:"\u2250",ttype:x},{input:"\\prec",tag:"mo",output:"\u227A",ttype:x},{input:"\\succ",tag:"mo",output:"\u227B",ttype:x},{input:"\\preceq",tag:"mo",output:"\u227C",ttype:x},{input:"\\succeq",tag:"mo",output:"\u227D",ttype:x},{input:"\\subset",tag:"mo",output:"\u2282",ttype:x},{input:"\\supset",tag:"mo",output:"\u2283",ttype:x},{input:"\\subseteq",tag:"mo",output:"\u2286",ttype:x},{input:"\\supseteq",tag:"mo",output:"\u2287",ttype:x},{input:"\\sqsubset",tag:"mo",output:"\u228F",ttype:x},{input:"\\sqsupset",tag:"mo",output:"\u2290",ttype:x},{input:"\\sqsubseteq",tag:"mo",output:"\u2291",ttype:x},{input:"\\sqsupseteq",tag:"mo",output:"\u2292",ttype:x},{input:"\\sim",tag:"mo",output:"\u223C",ttype:x},{input:"\\simeq",tag:"mo",output:"\u2243",ttype:x},{input:"\\approx",tag:"mo",output:"\u2248",ttype:x},{input:"\\cong",tag:"mo",output:"\u2245",ttype:x},{input:"\\Join",tag:"mo",output:"\u22C8",ttype:x},{input:"\\bowtie",tag:"mo",output:"\u22C8",ttype:x},{input:"\\in",tag:"mo",output:"\u2208",ttype:x},{input:"\\ni",tag:"mo",output:"\u220B",ttype:x},{input:"\\owns",tag:"mo",output:"\u220B",ttype:x},{input:"\\propto",tag:"mo",output:"\u221D",ttype:x},{input:"\\vdash",tag:"mo",output:"\u22A2",ttype:x},{input:"\\dashv",tag:"mo",output:"\u22A3",ttype:x},{input:"\\models",tag:"mo",output:"\u22A8",ttype:x},{input:"\\perp",tag:"mo",output:"\u22A5",ttype:x},{input:"\\smile",tag:"mo",output:"\u2323",ttype:x},{input:"\\frown",tag:"mo",output:"\u2322",ttype:x},{input:"\\asymp",tag:"mo",output:"\u224D",ttype:x},{input:"\\notin",tag:"mo",output:"\u2209",ttype:x},{input:"\\begin{eqnarray}",output:"X",ttype:i,invisible:true},{input:"\\begin{array}",output:"X",ttype:i,invisible:true},{input:"\\\\",output:"}&{",ttype:l},{input:"\\end{eqnarray}",output:"}}",ttype:l},{input:"\\end{array}",output:"}}",ttype:l},{input:"\\big",tag:"mo",output:"X",atval:"1.2",ttype:y},{input:"\\Big",tag:"mo",output:"X",atval:"1.8",ttype:y},{input:"\\bigg",tag:"mo",output:"X",atval:"2.3",ttype:y},{input:"\\Bigg",tag:"mo",output:"X",atval:"2.9",ttype:y},{input:"\\left",tag:"mo",output:"X",ttype:v},{input:"\\right",tag:"mo",output:"X",ttype:d},{input:"{",output:"{",ttype:v,invisible:true},{input:"}",output:"}",ttype:d,invisible:true},{input:"(",tag:"mo",output:"(",atval:"1",ttype:g},{input:"[",tag:"mo",output:"[",atval:"1",ttype:g},{input:"\\lbrack",tag:"mo",output:"[",atval:"1",ttype:g},{input:"\\{",tag:"mo",output:"{",atval:"1",ttype:g},{input:"\\lbrace",tag:"mo",output:"{",atval:"1",ttype:g},{input:"\\langle",tag:"mo",output:"\u2329",atval:"1",ttype:g},{input:"\\lfloor",tag:"mo",output:"\u230A",atval:"1",ttype:g},{input:"\\lceil",tag:"mo",output:"\u2308",atval:"1",ttype:g},{input:")",tag:"mo",output:")",rtag:"mi",atval:"1",ttype:g},{input:"]",tag:"mo",output:"]",rtag:"mi",atval:"1",ttype:g},{input:"\\rbrack",tag:"mo",output:"]",rtag:"mi",atval:"1",ttype:g},{input:"\\}",tag:"mo",output:"}",rtag:"mi",atval:"1",ttype:g},{input:"\\rbrace",tag:"mo",output:"}",rtag:"mi",atval:"1",ttype:g},{input:"\\rangle",tag:"mo",output:"\u232A",rtag:"mi",atval:"1",ttype:g},{input:"\\rfloor",tag:"mo",output:"\u230B",rtag:"mi",atval:"1",ttype:g},{input:"\\rceil",tag:"mo",output:"\u2309",rtag:"mi",atval:"1",ttype:g},{input:"|",tag:"mo",output:"\u2223",atval:"1",ttype:g},{input:"\\|",tag:"mo",output:"\u2225",atval:"1",ttype:g},{input:"\\vert",tag:"mo",output:"\u2223",atval:"1",ttype:g},{input:"\\Vert",tag:"mo",output:"\u2225",atval:"1",ttype:g},{input:"\\mid",tag:"mo",output:"\u2223",atval:"1",ttype:g},{input:"\\parallel",tag:"mo",output:"\u2225",atval:"1",ttype:g},{input:"/",tag:"mo",output:"/",atval:"1.01",ttype:g},{input:"\\backslash",tag:"mo",output:"\u2216",atval:"1",ttype:g},{input:"\\setminus",tag:"mo",output:"\\",ttype:x},{input:"\\!",tag:"mspace",atname:"width",atval:"-0.167em",ttype:n},{input:"\\,",tag:"mspace",atname:"width",atval:"0.167em",ttype:n},{input:"\\>",tag:"mspace",atname:"width",atval:"0.222em",ttype:n},{input:"\\:",tag:"mspace",atname:"width",atval:"0.222em",ttype:n},{input:"\\;",tag:"mspace",atname:"width",atval:"0.278em",ttype:n},{input:"~",tag:"mspace",atname:"width",atval:"0.333em",ttype:n},{input:"\\quad",tag:"mspace",atname:"width",atval:"1em",ttype:n},{input:"\\qquad",tag:"mspace",atname:"width",atval:"2em",ttype:n},{input:"\\prime",tag:"mo",output:"\u2032",ttype:x},{input:"'",tag:"mo",output:"\u02B9",ttype:x},{input:"''",tag:"mo",output:"\u02BA",ttype:x},{input:"'''",tag:"mo",output:"\u2034",ttype:x},{input:"''''",tag:"mo",output:"\u2057",ttype:x},{input:"\\ldots",tag:"mo",output:"\u2026",ttype:x},{input:"\\cdots",tag:"mo",output:"\u22EF",ttype:x},{input:"\\vdots",tag:"mo",output:"\u22EE",ttype:x},{input:"\\ddots",tag:"mo",output:"\u22F1",ttype:x},{input:"\\forall",tag:"mo",output:"\u2200",ttype:x},{input:"\\exists",tag:"mo",output:"\u2203",ttype:x},{input:"\\Re",tag:"mo",output:"\u211C",ttype:x},{input:"\\Im",tag:"mo",output:"\u2111",ttype:x},{input:"\\aleph",tag:"mo",output:"\u2135",ttype:x},{input:"\\hbar",tag:"mo",output:"\u210F",ttype:x},{input:"\\ell",tag:"mo",output:"\u2113",ttype:x},{input:"\\wp",tag:"mo",output:"\u2118",ttype:x},{input:"\\emptyset",tag:"mo",output:"\u2205",ttype:x},{input:"\\infty",tag:"mo",output:"\u221E",ttype:x},{input:"\\surd",tag:"mo",output:"\\sqrt{}",ttype:l},{input:"\\partial",tag:"mo",output:"\u2202",ttype:x},{input:"\\nabla",tag:"mo",output:"\u2207",ttype:x},{input:"\\triangle",tag:"mo",output:"\u25B3",ttype:x},{input:"\\therefore",tag:"mo",output:"\u2234",ttype:x},{input:"\\angle",tag:"mo",output:"\u2220",ttype:x},{input:"\\diamond",tag:"mo",output:"\u22C4",ttype:x},{input:"\\Diamond",tag:"mo",output:"\u25C7",ttype:x},{input:"\\neg",tag:"mo",output:"\u00AC",ttype:x},{input:"\\lnot",tag:"mo",output:"\u00AC",ttype:x},{input:"\\bot",tag:"mo",output:"\u22A5",ttype:x},{input:"\\top",tag:"mo",output:"\u22A4",ttype:x},{input:"\\square",tag:"mo",output:"\u25AB",ttype:x},{input:"\\Box",tag:"mo",output:"\u25A1",ttype:x},{input:"\\wr",tag:"mo",output:"\u2240",ttype:x},{input:"\\arccos",tag:"mi",output:"arccos",ttype:b,func:true},{input:"\\arcsin",tag:"mi",output:"arcsin",ttype:b,func:true},{input:"\\arctan",tag:"mi",output:"arctan",ttype:b,func:true},{input:"\\arg",tag:"mi",output:"arg",ttype:b,func:true},{input:"\\cos",tag:"mi",output:"cos",ttype:b,func:true},{input:"\\cosh",tag:"mi",output:"cosh",ttype:b,func:true},{input:"\\cot",tag:"mi",output:"cot",ttype:b,func:true},{input:"\\coth",tag:"mi",output:"coth",ttype:b,func:true},{input:"\\csc",tag:"mi",output:"csc",ttype:b,func:true},{input:"\\deg",tag:"mi",output:"deg",ttype:b,func:true},{input:"\\det",tag:"mi",output:"det",ttype:b,func:true},{input:"\\dim",tag:"mi",output:"dim",ttype:b,func:true},{input:"\\exp",tag:"mi",output:"exp",ttype:b,func:true},{input:"\\gcd",tag:"mi",output:"gcd",ttype:b,func:true},{input:"\\hom",tag:"mi",output:"hom",ttype:b,func:true},{input:"\\inf",tag:"mo",output:"inf",ttype:o},{input:"\\ker",tag:"mi",output:"ker",ttype:b,func:true},{input:"\\lg",tag:"mi",output:"lg",ttype:b,func:true},{input:"\\lim",tag:"mo",output:"lim",ttype:o},{input:"\\liminf",tag:"mo",output:"liminf",ttype:o},{input:"\\limsup",tag:"mo",output:"limsup",ttype:o},{input:"\\ln",tag:"mi",output:"ln",ttype:b,func:true},{input:"\\log",tag:"mi",output:"log",ttype:b,func:true},{input:"\\max",tag:"mo",output:"max",ttype:o},{input:"\\min",tag:"mo",output:"min",ttype:o},{input:"\\Pr",tag:"mi",output:"Pr",ttype:b,func:true},{input:"\\sec",tag:"mi",output:"sec",ttype:b,func:true},{input:"\\sin",tag:"mi",output:"sin",ttype:b,func:true},{input:"\\sinh",tag:"mi",output:"sinh",ttype:b,func:true},{input:"\\sup",tag:"mo",output:"sup",ttype:o},{input:"\\tan",tag:"mi",output:"tan",ttype:b,func:true},{input:"\\tanh",tag:"mi",output:"tanh",ttype:b,func:true},{input:"\\gets",tag:"mo",output:"\u2190",ttype:x},{input:"\\leftarrow",tag:"mo",output:"\u2190",ttype:x},{input:"\\to",tag:"mo",output:"\u2192",ttype:x},{input:"\\rightarrow",tag:"mo",output:"\u2192",ttype:x},{input:"\\leftrightarrow",tag:"mo",output:"\u2194",ttype:x},{input:"\\uparrow",tag:"mo",output:"\u2191",ttype:x},{input:"\\downarrow",tag:"mo",output:"\u2193",ttype:x},{input:"\\updownarrow",tag:"mo",output:"\u2195",ttype:x},{input:"\\Leftarrow",tag:"mo",output:"\u21D0",ttype:x},{input:"\\Rightarrow",tag:"mo",output:"\u21D2",ttype:x},{input:"\\Leftrightarrow",tag:"mo",output:"\u21D4",ttype:x},{input:"\\iff",tag:"mo",output:"~\\Longleftrightarrow~",ttype:l},{input:"\\Uparrow",tag:"mo",output:"\u21D1",ttype:x},{input:"\\Downarrow",tag:"mo",output:"\u21D3",ttype:x},{input:"\\Updownarrow",tag:"mo",output:"\u21D5",ttype:x},{input:"\\mapsto",tag:"mo",output:"\u21A6",ttype:x},{input:"\\longleftarrow",tag:"mo",output:"\u27F5",ttype:x},{input:"\\longrightarrow",tag:"mo",output:"\u27F6",ttype:x},{input:"\\longleftrightarrow",tag:"mo",output:"\u27F7",ttype:x},{input:"\\Longleftarrow",tag:"mo",output:"\u27F8",ttype:x},{input:"\\Longrightarrow",tag:"mo",output:"\u27F9",ttype:x},{input:"\\Longleftrightarrow",tag:"mo",output:"\u27FA",ttype:x},{input:"\\longmapsto",tag:"mo",output:"\u27FC",ttype:x},{input:"\\sqrt",tag:"msqrt",output:"sqrt",ttype:b},{input:"\\root",tag:"mroot",output:"root",ttype:c},{input:"\\frac",tag:"mfrac",output:"/",ttype:c},{input:"\\stackrel",tag:"mover",output:"stackrel",ttype:c},{input:"\\atop",tag:"mfrac",output:"",ttype:m},{input:"\\choose",tag:"mfrac",output:"",ttype:m},{input:"_",tag:"msub",output:"_",ttype:m},{input:"^",tag:"msup",output:"^",ttype:m},{input:"\\mbox",tag:"mtext",output:"mbox",ttype:z},{input:"\\acute",tag:"mover",output:"\u00B4",ttype:b,acc:true},{input:"\\grave",tag:"mover",output:"\u0060",ttype:b,acc:true},{input:"\\breve",tag:"mover",output:"\u02D8",ttype:b,acc:true},{input:"\\check",tag:"mover",output:"\u02C7",ttype:b,acc:true},{input:"\\dot",tag:"mover",output:".",ttype:b,acc:true},{input:"\\ddot",tag:"mover",output:"..",ttype:b,acc:true},{input:"\\mathring",tag:"mover",output:"\u00B0",ttype:b,acc:true},{input:"\\vec",tag:"mover",output:"\u20D7",ttype:b,acc:true},{input:"\\overrightarrow",tag:"mover",output:"\u20D7",ttype:b,acc:true},{input:"\\overleftarrow",tag:"mover",output:"\u20D6",ttype:b,acc:true},{input:"\\hat",tag:"mover",output:"\u005E",ttype:b,acc:true},{input:"\\widehat",tag:"mover",output:"\u0302",ttype:b,acc:true},{input:"\\tilde",tag:"mover",output:"~",ttype:b,acc:true},{input:"\\widetilde",tag:"mover",output:"\u02DC",ttype:b,acc:true},{input:"\\bar",tag:"mover",output:"\u203E",ttype:b,acc:true},{input:"\\overbrace",tag:"mover",output:"\u23B4",ttype:b,acc:true},{input:"\\overline",tag:"mover",output:"\u00AF",ttype:b,acc:true},{input:"\\underbrace",tag:"munder",output:"\u23B5",ttype:b,acc:true},{input:"\\underline",tag:"munder",output:"\u00AF",ttype:b,acc:true},{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true",ttype:b},{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false",ttype:b},{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1",ttype:b},{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2",ttype:b},{input:"\\mathrm",tag:"mtext",output:"text",ttype:z},{input:"\\textrm",tag:"mtext",output:"text",ttype:z},{input:"\\mathbf",tag:"mstyle",atname:"mathvariant",atval:"bold",ttype:b,codes:s},{input:"\\textbf",tag:"mstyle",atname:"mathvariant",atval:"bold",ttype:b,codes:s},{input:"\\mathit",tag:"mstyle",atname:"mathvariant",atval:"italic",ttype:b},{input:"\\textit",tag:"mstyle",atname:"mathvariant",atval:"italic",ttype:b},{input:"\\mathtt",tag:"mstyle",atname:"mathvariant",atval:"monospace",ttype:b,codes:s},{input:"\\texttt",tag:"mstyle",atname:"mathvariant",atval:"monospace",ttype:b,codes:s},{input:"\\mathsf",tag:"mstyle",atname:"mathvariant",atval:"sans-serif",ttype:b,codes:s},{input:"\\mathbb",tag:"mstyle",atname:"mathvariant",atval:"double-struck",ttype:b,codes:p},{input:"\\mathcal",tag:"mstyle",atname:"mathvariant",atval:"script",ttype:b,codes:q},{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant",atval:"fraktur",ttype:b,codes:B}];var r=[];function k(){return(j.browser.mozilla||j.browser.opera)}function E(F,G){if(F.input>G.input){return 1}else{return -1}}function u(){var F=a.length;a.sort(E);for(var G=0;G<F;G++){r[G]=a[G].input}}function w(F,G){return j.trim(F.slice(G))}function C(G,I){var H=r.indexOf(G,I);if(H<0){var F=r.concat([G]);F.sort();H=F.indexOf(G,I)}return H}function t(M){var F=0;var G=0;var I;var O;var N;var J="";var L=true;var K=M.length;for(var H=1;H<=K&&L;H++){O=M.slice(0,H);G=F;F=C(O,G);if(F<r.length&&M.slice(0,r[F].length)==r[F]){J=r[F];I=F;H=J.length}L=F<r.length&&M.slice(0,r[F].length)>=r[F]}if(J!==""){return a[I]}F=1;O=M.slice(0,1);if("0"<=O&&O<="9"){N="mn"}else{N=(("A">O||O>"Z")&&("a">O||O>"z")?"mo":"mi")}return{input:O,tag:N,output:O,ttype:x}}function f(N){var I,G,S,H,K,Q,M=document.createDocumentFragment();N=j.trim(N);I=t(N);if(I===null||I.ttype==d){return[null,N,null]}if(I.ttype==l){N=I.output+w(N,I.input.length);I=t(N);if(I===null||I.ttype==d){return[null,N,null]}}N=w(N,I.input.length);switch(I.ttype){case n:G=A(I.tag);G.setAttribute(I.atname,I.atval);return[G,N,I.tag];case o:return[A(I.tag,document.createTextNode(I.output)),N,I.tag];case x:G=A(I.tag,document.createTextNode(I.output));return[G,N,I.tag];case g:G=A(I.tag,document.createTextNode(I.output));if(I.input=="|"||I.input=="\\vert"||I.input=="\\|"||I.input=="\\Vert"){G.setAttribute("lspace","0em");G.setAttribute("rspace","0em")}G.setAttribute("maxsize",I.atval);if(I.rtag!==null){return[G,N,I.rtag]}else{return[G,N,I.tag]}case y:var L=I.atval;I=t(N);if(I===null){return[null,N,null]}N=w(N,I.input.length);G=A(I.tag,document.createTextNode(I.output));G.setAttribute("minsize",L);G.setAttribute("maxsize",L);return[G,N,I.tag];case v:if(I.input=="\\left"){I=t(N);if(I!==null){if(I.input=="."){I.invisible=true}N=w(N,I.input.length)}}S=h(N,true,false);if(I===null||(typeof I.invisible=="boolean"&&I.invisible)){G=A("mrow",S[0])}else{G=A("mo",document.createTextNode(I.output));G=A("mrow",G);G.appendChild(S[0])}return[G,S[1],S[2]];case i:if(I.input=="\\begin{array}"){var R="";I=t(N);N=j.trim(N);if(I===null){R="l"}else{N=w(N,I.input.length);if(I.input!="{"){R="l"}else{do{I=t(N);if(I!==null){N=w(N,I.input.length);if(I.input!="}"){R=R+I.input}}}while(I!==null&&I.input!==""&&I.input!="}")}}S=h("{"+N,true,true);G=A("mtable",S[0]);R=R.replace(/l/g,"left ");R=R.replace(/r/g,"right ");R=R.replace(/c/g,"center ");G.setAttribute("columnalign",R);G.setAttribute("displaystyle","false");return[G,S[1],null]}else{S=h("{"+N,true,true);G=A("mtable",S[0]);G.setAttribute("columnspacing","0.167em");G.setAttribute("columnalign","right center left");G.setAttribute("displaystyle","true");G=A("mrow",G);return[G,S[1],null]}case z:if(N.charAt(0)=="{"){K=N.indexOf("}")}else{K=0}if(K==-1){K=N.length}Q=N.slice(1,K);M.appendChild(A(I.tag,document.createTextNode(Q)));N=w(N,K+1);return[A("mrow",M),N,null];case b:S=f(N);if(S[0]===null){return[A(I.tag,document.createTextNode(I.output)),N]}if(typeof I.func=="boolean"&&I.func){Q=N.charAt(0);if(Q=="^"||Q=="_"||Q==","){return[A(I.tag,document.createTextNode(I.output)),N,I.tag]}else{G=A("mrow",A(I.tag,document.createTextNode(I.output)));G.appendChild(S[0]);return[G,S[1],I.tag]}}if(I.input=="\\sqrt"){return[A(I.tag,S[0]),S[1],I.tag]}else{if(typeof I.acc=="boolean"&&I.acc){G=A(I.tag,S[0]);var F=I.output;var P=A("mo",document.createTextNode(F));if(I.input=="\\vec"||I.input=="\\check"){P.setAttribute("maxsize","1.2")}if(I.input=="\\underbrace"||I.input=="\\underline"){P.setAttribute("accentunder","true")}else{P.setAttribute("accent","true")}G.appendChild(P);if(I.input=="\\overbrace"||I.input=="\\underbrace"){G.ttype=o}return[G,S[1],I.tag]}else{if(typeof I.codes!="undefined"){for(K=0;K<S[0].childNodes.length;K++){if(S[0].childNodes[K].nodeName=="mi"||S[0].nodeName=="mi"){Q=(S[0].nodeName=="mi"?S[0].firstChild.nodeValue:S[0].childNodes[K].firstChild.nodeValue);var O=[];for(var J=0;J<Q.length;J++){if(Q.charCodeAt(J)>64&&Q.charCodeAt(J)<91){O=O+I.codes[Q.charCodeAt(J)-65]}else{if(Q.charCodeAt(J)>96&&Q.charCodeAt(J)<123){O=O+I.codes[Q.charCodeAt(J)-71]}}}if(S[0].nodeName=="mi"){S[0]=A("mo").appendChild(document.createTextNode(O))}else{S[0].replaceChild(A("mo").appendChild(document.createTextNode(O)),S[0].childNodes[K])}}}}G=A(I.tag,S[0]);G.setAttribute(I.atname,I.atval);if(I.input=="\\scriptstyle"||I.input=="\\scriptscriptstyle"){G.setAttribute("displaystyle","false")}return[G,S[1],I.tag]}}case c:S=f(N);if(S[0]===null){return[A("mo",document.createTextNode(I.input)),N,null]}H=f(S[1]);if(H[0]===null){return[A("mo",document.createTextNode(I.input)),N,null]}if(I.input=="\\root"||I.input=="\\stackrel"){M.appendChild(H[0])}M.appendChild(S[0]);if(I.input=="\\frac"){M.appendChild(H[0])}return[A(I.tag,M),H[1],I.tag];case m:N=w(N,I.input.length);return[A("mo",document.createTextNode(I.output)),N,I.tag];default:return[A(I.tag,document.createTextNode(I.output)),N,I.tag]}}function D(K){var J,H,G,I,M,N,L;H=t(K);M=f(K);I=M[0];K=M[1];N=M[2];J=t(K);if(J.ttype==m){K=w(K,J.input.length);M=f(K);if(M[0]===null){M[0]=A("mo",document.createTextNode("\u25A1"))}K=M[1];N=M[2];if(J.input=="_"||J.input=="^"){G=t(K);N=null;L=((H.ttype==o)||(I.ttype==o));if(J.input=="_"&&G.input=="^"){K=w(K,G.input.length);var F=f(K);K=F[1];N=F[2];I=A((L?"munderover":"msubsup"),I);I.appendChild(M[0]);I.appendChild(F[0])}else{if(J.input=="_"){I=A((L?"munder":"msub"),I);I.appendChild(M[0])}else{I=A((L?"mover":"msup"),I);I.appendChild(M[0])}}I=A("mrow",I)}else{I=A(J.tag,I);if(J.input=="\\atop"||J.input=="\\choose"){I.setAttribute("linethickness","0ex")}I.appendChild(M[0]);if(J.input=="\\choose"){I=A("mfenced",I)}}}return[I,K,N]}function h(M,L,R){var Q,N,I,T,X,J=document.createDocumentFragment();do{M=j.trim(M);I=D(M);N=I[0];M=I[1];X=I[2];Q=t(M);if(N!=undefined){if((X=="mn"||X=="mi")&&Q!==null&&typeof Q.func=="boolean"&&Q.func){var W=A("mspace");W.setAttribute("width","0.167em");N=A("mrow",N);N.appendChild(W)}J.appendChild(N)}}while((Q.ttype!=d)&&Q!==null&&Q.output!="");X=null;if(Q.ttype==d){if(Q.input=="\\right"){M=w(M,Q.input.length);Q=t(M);if(Q!==null&&Q.input=="."){Q.invisible=true}if(Q!==null){X=Q.rtag}}if(Q!==null){M=w(M,Q.input.length)}var U=J.childNodes.length;if(R&&U>0&&J.childNodes[U-1].nodeName=="mrow"&&U>1&&J.childNodes[U-2].nodeName=="mo"&&J.childNodes[U-2].firstChild.nodeValue=="&"){var G=[];var O=J.childNodes.length;for(T=0;R&&T<O;T=T+2){G[T]=[];N=J.childNodes[T];for(var S=0;S<N.childNodes.length;S++){if(N.childNodes[S].firstChild.nodeValue=="&"){G[T][G[T].length]=S}}}var H,F,K,P,V=document.createDocumentFragment();for(T=0;T<O;T=T+2){H=document.createDocumentFragment();F=document.createDocumentFragment();N=J.firstChild;K=N.childNodes.length;P=0;for(S=0;S<K;S++){if(typeof G[T][P]!="undefined"&&S==G[T][P]){N.removeChild(N.firstChild);H.appendChild(A("mtd",F));P++}else{F.appendChild(N.firstChild)}}H.appendChild(A("mtd",F));if(J.childNodes.length>2){J.removeChild(J.firstChild);J.removeChild(J.firstChild)}V.appendChild(A("mtr",H))}return[V,M]}if(typeof Q.invisible!="boolean"||!Q.invisible){N=A("mo",document.createTextNode(Q.output));J.appendChild(N)}}return[J,M,X]}if(!document.createElementNS){document.createElementNS=function(G,F){return this.createElement(F)}}function A(F,H){var G=document.createElementNS("http://www.w3.org/1998/Math/MathML",F);if(H){j(G).append(H)}return G}return{showFormulaOnMouseOver:false,latexImages:false,latexConverter:"http://www.forkosh.dreamhost.com/mimetex.cgi?",mathColor:"black",mathFontSize:"",mathFontFamily:"",createElementXHTML:function(F,G,I){var H=document.createElementNS("http://www.w3.org/1999/xhtml",F);if(G){H.id=G}if(I){H.className=I}return H},define:function(H,I){if(MSVG.latexImages){return}if((typeof H)=="string"){H=[H];I=[I]}var G,F=H.length;if(F!=I.length){return}for(G=0;G<F;G++){a=a.concat([{input:"\\"+H[G],tag:"mo",output:I[G],ttype:l}])}u()},parseMath:function(J,I,G,F){if(J===null){return null}var K=h(J.replace(/^\s+/g,""),false,false)[0];var H=A("mstyle",K);if(I){j(H).attr({displaystyle:"true"})}j(H).attr({mathcolor:F||MSVG.mathColor,fontsize:G||MSVG.mathFontSize,fontfamily:MSVG.mathFontFamily});H=A("math",H);if(MSVG.showFormulaOnMouseOver){j(H).attr({title:J.replace(/\s+/g," ")})}return H},parseMathExternal:function(K,J,G,F){if(K===null){return null}var I=MSVG.createElementXHTML("img");var H=MSVG.latexConverter+K;j(I).attr({src:H});if(MSVG.showFormulaOnMouseOver){j(I).attr({title:K.replace(/\s+/g," ")})}return I},generic:function(){if(MSVG.latexImages||!k()){MSVG.parseMath=MSVG.parseMathExternal}else{u()}if(!(window.SVGElement||j.browser.opera||j.browser.safari)){ASVG.drawPictures=ASVG.removePictures}}}}(jQuery);var ASVG=function($){var SVG;var collection=[];var markerChars="o*sSx+<>|";function createSVGElement(elType){return document.createElementNS("http://www.w3.org/2000/svg",elType)}function getSVGElement(id,el){var node,res={node:null,newEl:false};if(id){id=SVG.id+"_"+id;res.node=$("#"+id)[0]}if(!res.node){res.node=createSVGElement(el);if(id){res.node.id=id}res.newEl=true}return res}function appendSVG(elmt){if(elmt.newEl){$(SVG.canvas).append(elmt.node)}}function setButton(text,title,func){var node=MSVG.createElementXHTML("span",null,"svgButton");node.title=title;node.onclick=func;$(node).append(text);$(node).css({paddingRight:"0.5em",paddingLeft:"0.5em",fontSize:"1em",fontFamily:"monospace",background:"blue",color:"yellow",cursor:"pointer"});$(node).mouseover(function(){$(this).css({background:"yellow",color:"blue"})});$(node).mouseout(function(){$(this).css({background:"blue",color:"yellow"})});node.setAttribute("owner",SVG.id);return node}function pictureAttributes(){this.id=null;this.stroke="blue";this.strokewidth=1;this.strokeopacity=1;this.strokedasharray="none";this.fill="none";this.fillopacity=1;this.fontstyle="normal";this.fontfamily="serif";this.fontweight="normal";this.fontsize=12;this.fontstroke="none";this.fontstrokewidth=1;this.fontstrokeopacity=1;this.fontstrokedasharray="none";this.fontfill="black";this.fontfillopacity=1;this.sector=false;this.largearc=0;this.marker="o";this.size=8;this.orient="auto";this.units="userSpaceOnUse";this.markerstroke="blue";this.markerstrokewidth=1;this.markerstrokeopacity=1;this.markerstrokedasharray="none";this.markerfill="none";this.markerfillopacity=1;this.sweep=0;this.rx=0;this.ry=0;this.closed=false;this.curve="";this.direction=[1,0];this.ticklabels="";this.pos="";this.points=200;this.backgroundcolor="none";this.backgroundopacity=1}function pictureObject(){this.id=null;this.pos=null;this.src="";this.canvas=null;this.border=0;this.width=300;this.height=200;this.factor=1;this.xmin=-5;this.xmax=5;this.ymin=null;this.ymax=null;this.xunitlength=null;this.yunitlength=null;this.origin=[0,0];this.coords="cartesian";this.mouse=[null,null];this.drag=null;this.pan=true;this.locked=false;this.attr=new pictureAttributes()}function refresh(){translateAndEval(SVG.id)}function translateAndEval(id){var errstr;var src=SVG.src;$("#"+SVG.id+" .svgMarker").remove();$("#"+SVG.id+"Canvas").empty();$("#"+SVG.id+"mml").empty();ASVG.dynamic[id]={};src=src.replace(/dynamic\./g,"ASVG.dynamic."+id+".");SVG.attr=new pictureAttributes();try{with(Math){eval(src)}}catch(err){if(typeof err=="object"){errstr=err.name+" "+err.message+" "+err.number+" "+err.description}else{errstr=err}alert(errstr+"\n"+src)}collection[SVG.id]=SVG}function setOptions(atr){for(var i in atr){SVG.attr[i]=atr[i]}}function getOptions(attr,options,prefix){var pref=prefix||"";if(typeof attr=="string"){return(options[pref+attr]==undefined?SVG.attr[pref+attr]:options[pref+attr])}else{var i,newAttr={},len=attr.length,item;for(i=0;i<len;i++){item=attr[i];newAttr[item]=options[pref+item]==undefined?SVG.attr[pref+item]:options[pref+item]}return newAttr}}function setAction(evt,fn,id){if(!$.isFunction(fn)){return}var node=id?$("#"+SVG.id+"_"+id):$("#"+SVG.id);$(node).bind(evt,fn)}function getPosition(evt){var off=$(evt.currentTarget.parentNode).offset();var posX=(evt.pageX-off.left-SVG.origin[0]-SVG.border)/SVG.xunitlength;var posY=(SVG.height-SVG.origin[1]-evt.pageY+off.top+SVG.border)/SVG.yunitlength;return[posX,posY]}function getAngle(p){p=p||[0,0];var res=Math.atan2(SVG.mouse[1]-p[1],SVG.mouse[0]-p[0]);res=(res<0)?res+2*Math.PI:res;return res}function getDistance(p){p=p||[0,0];return Math.sqrt(Math.pow(SVG.mouse[0]-p[0],2)+Math.pow(SVG.mouse[1]-p[1],2))}function updateButton(obj){var id=$(obj).attr("owner");var node=$("#"+id+"src");if(obj.firstChild.nodeValue=="Edit"){obj.firstChild.nodeValue="Update";obj.title="Update picture";node.val(SVG.src).css("display","block")}else{SVG.src=node.val();translateAndEval(id)}}function switchTo(evt){var name=evt.currentTarget.id;if(SVG.id==name||SVG.locked){return}SVG=collection[name]}function onWheel(evt){if(SVG.locked){return false}evt=evt||window.event;var factor=1;if(evt.wheelDelta){factor=(evt.wheelDelta>0)?0.8:1.25}else{if(evt.detail){factor=(evt.detail<0)?0.8:1.25}}if(evt.shiftKey){changeSize(factor)}else{changeScales(factor)}evt.preventDefault();evt.stopPropagation();return false}function onClick(evt){if(evt.button===0){if(evt.shiftKey){$("#"+SVG.id+"toolbar").slideToggle();$("#"+SVG.id+"src").val(SVG.src);SVG.locked=!SVG.locked;evt.stopImmediatePropagation()}else{if(SVG.pan&&!SVG.locked){SVG.drag=[evt.clientX,evt.clientY]}}}return false}function onDrop(evt){if(SVG.drag==null){return false}var xlen=(SVG.drag[0]-evt.clientX)/SVG.xunitlength;var ylen=(-SVG.drag[1]+evt.clientY)/SVG.yunitlength;SVG.drag=null;if(xlen==0&&ylen==0){return false}changeScales(1,[SVG.xmin+xlen,SVG.xmax+xlen,SVG.ymin+ylen,SVG.ymax+ylen]);return false}function setScales(){SVG.xunitlength=SVG.width/(SVG.xmax-SVG.xmin);SVG.yunitlength=SVG.height/(SVG.ymax-SVG.ymin);SVG.origin=[-SVG.xmin*SVG.xunitlength,-SVG.ymin*SVG.yunitlength]}function getScales(scales){scales=scales||[];var res=[null,null,null,null];switch(scales.length){case 0:res[0]=SVG.xmin;res[1]=SVG.xmax;break;case 2:res[0]=scales[0];res[1]=scales[1];break;case 4:res=scales}return res}function setSize(){var picture=$("#"+SVG.id)[0];picture.setAttribute("width",SVG.width);picture.setAttribute("height",SVG.height);picture.parentNode.style.width=SVG.width+"px";picture.parentNode.style.height=SVG.height+"px";var node=$("#"+SVG.id+"ClipPath")[0];node.firstChild.setAttribute("d","M0,0 "+SVG.width+",0 "+SVG.width+","+SVG.height+" 0,"+SVG.height);node=$("#"+SVG.id+"Coords")[0];if(node){node.setAttribute("x",SVG.width);node.setAttribute("y",SVG.height-2)}}function changeSize(factor){SVG.factor*=factor;SVG.width/=factor;SVG.height/=factor;setSize();setScales();translateAndEval(SVG.id)}function changeScales(factor,trans){trans=trans||[SVG.xmin,SVG.xmax,SVG.ymin,SVG.ymax];SVG.factor*=factor;var dx=(SVG.xmax-SVG.xmin)*(1-factor)*0.5;var dy=(SVG.ymax-SVG.ymin)*(1-factor)*0.5;SVG.xmin=trans[0]+dx;SVG.xmax=trans[1]-dx;SVG.ymin=trans[2]+dy;SVG.ymax=trans[3]-dy;setScales();translateAndEval(SVG.id)}function updateCoord(evt){if(SVG.locked){return false}if($.browser.opera){switchTo(evt)}SVG.mouse=getPosition(evt);if(SVG.coords!="none"){var coords;if(SVG.coords=="cartesian"){coords="C: ("+SVG.mouse[0].toFixed(2)+", "+SVG.mouse[1].toFixed(2)+")"}else{coords="P: ("+getDistance().toFixed(2)+", "+getAngle().toFixed(2)+")"}$("#"+SVG.id+"Coords").text(coords)}return false}function removeCoord(){$("#"+SVG.id+"Coords").text("")}function exportSVG(obj){var name=$(obj).attr("owner");var pic=$("#"+name)[0].parentNode.innerHTML;var pos=pic.indexOf("</svg")+6;pic=pic.substr(0,pos);var svg="<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n";if(pic.indexOf("svgCoords")>-1){pos=pic.lastIndexOf("<text");svg+=pic.substr(0,pos);pos=pic.lastIndexOf("</text")+7;svg+=pic.substr(pos)}else{svg+=pic}svg=svg.replace(/ /g,"");svg=svg.replace(/><(?!\/)/g,">\n<");obj.previousSibling.firstChild.nodeValue="Edit";$("#"+name+"src").val(svg).css("display","block")}function toSVG(p){var x=p[0]*SVG.xunitlength+SVG.origin[0];var y=SVG.height-p[1]*SVG.yunitlength-SVG.origin[1];return[x,y]}function toSVGPair(p){var q=toSVG(p);return q[0]+" "+q[1]}function setStrokeAndFill(node,options,prefix){var attributes=["stroke","strokewidth","strokedasharray","strokeopacity","fill","fillopacity"];var attr=getOptions(attributes,options,prefix);node.setAttribute("stroke",attr.stroke);node.setAttribute("stroke-width",attr.strokewidth/SVG.factor);node.setAttribute("stroke-dasharray",attr.strokedasharray);node.setAttribute("stroke-opacity",attr.strokeopacity);node.setAttribute("fill",attr.fill);node.setAttribute("fill-opacity",attr.fillopacity)}function button(p,q,txt,action,options){options=options||{};options.id=(options.id||Math.randomString(8));rect(p,q,options);setAction("click",action,options.id);options.fill=null;options.fillopacity=1;options.id+="_t";text([(p[0]+q[0])*0.5,(p[1]+q[1])*0.5],txt,options);setAction("click",action,options.id)}function setMarkers(obj,options){var attributes=["marker","size","units","orient","markerstroke","markerstrokeopacity"];var attr=getOptions(attributes,options);var node,node2,i,id,pos=["marker-start","marker-mid","marker-end"];var lim=attr.marker.length;for(i=0;i<lim;i++){var type=attr.marker.charAt(i);if(type=="-"||markerChars.indexOf(type)<0){continue}id=(options.id||Math.randomString(8))+"Marker_"+markerChars.indexOf(type);node=$("#"+SVG.id+"_"+id)[0];if(!node){node=getSVGElement(id,"marker").node;node.setAttribute("class","svgMarker");node.setAttribute("viewBox","0 0 10 10");node.setAttribute("refX",5);node.setAttribute("refY",5);node.setAttribute("orient",attr.orient);node.setAttribute("markerUnits",attr.units);switch(type){case"*":case"o":node2=createSVGElement("circle");node2.setAttribute("cx",5);node2.setAttribute("cy",5);node2.setAttribute("r",4);break;case">":node2=createSVGElement("path");node2.setAttribute("d","M0 0 L10 5 L0 10 z");node.setAttribute("refX",10);break;case"<":node2=createSVGElement("path");node2.setAttribute("d","M10 0 L10 10 L0 5 z");node.setAttribute("refX",0);break;case"x":node2=createSVGElement("path");node2.setAttribute("d","M0 0 L10 10 M0 10 L10 0");break;case"+":node2=createSVGElement("path");node2.setAttribute("d","M5 0 L5 10 M0 5 L10 5");break;case"|":node2=createSVGElement("path");node2.setAttribute("d","M5 0 L5 10");break;case"S":case"s":node2=createSVGElement("rect");node2.setAttribute("x",0);node2.setAttribute("y",0);node2.setAttribute("width",10);node2.setAttribute("height",10)}setStrokeAndFill(node2,options,"marker");if("*<>S".indexOf(type)>-1){node2.setAttribute("fill",attr.markerstroke);node2.setAttribute("fill-opacity",attr.markerstrokeopacity)}$(node).append(node2);$("#"+SVG.id+"_Defs:first").append(node)}node.setAttribute("markerWidth",attr.size/SVG.factor);node.setAttribute("markerHeight",attr.size/SVG.factor);obj.setAttribute(pos[i],"url(#"+SVG.id+"_"+id+")")}}function setLabels(p,options){var i,point,pos;var label=(typeof options.label=="string")?[options.label]:options.label;var labelpos=getOptions("pos",options);labelpos=(typeof labelpos=="string")?[labelpos]:labelpos;var poslen=labelpos.length;var size=options.size||SVG.attr.size;var dx=(0.5*size/SVG.xunitlength)/SVG.factor;var dy=(0.5*size/SVG.yunitlength)/SVG.factor;for(i=0;i<label.length;i++){options.isLabel="_label"+i;point=p[i];pos=(poslen>i)?labelpos[i].toUpperCase():pos;if(/E/.test(pos)){point[0]+=dx}if(/W/.test(pos)){point[0]-=dx}if(/N/.test(pos)){point[1]+=dy}if(/S/.test(pos)){point[1]-=dy}options.pos=pos;text(point,label[i],options)}}function line(p,q,options){options=options||{};options.closed=false;options.curve="";path([p,q],options)}function dot(p,options){options=options||{};var direction=getOptions("direction",options);var q=[p[0]+direction[0]/SVG.xunitlength,p[1]+direction[1]/SVG.yunitlength];var elmt=getSVGElement(options.id,"path");var st="M"+toSVGPair(p)+" "+toSVGPair(q);elmt.node.setAttribute("d",st);elmt.node.setAttribute("stroke","none");setMarkers(elmt.node,options);if(options.label){setLabels([p,q],options)}appendSVG(elmt)}function path(list,options){options=options||{};var st,i,elmt=getSVGElement(options.id,"path");var attr=getOptions(["curve","closed"],options);var len=list.length;if(len===0){return}st="M"+toSVGPair(list[0])+" "+attr.curve;for(i=1;i<len;i++){st+=toSVGPair(list[i])+" "}if(attr.closed){st+="Z"}elmt.node.setAttribute("d",st);setStrokeAndFill(elmt.node,options);if(options.marker){setMarkers(elmt.node,options)}if(options.label){setLabels(list,options)}appendSVG(elmt)}function rotate(id,angle,options){if(!id||!angle){return}var node=$("#"+SVG.id+"_"+id)[0];if(node){options=options||{};var center=options.center?toSVG(options.center):SVG.origin;angle=-angle*180/Math.PI;var transform=node.getAttribute("transform")||"";transform="rotate("+angle+" "+center+") "+(options.replace?"":transform);node.setAttribute("transform",transform)}}function translate(id,delta,options){if(!id||!delta){return}var node=$("#"+SVG.id+"_"+id)[0];if(node){options=options||{};delta=toSVG(delta);var transform=node.getAttribute("transform")||"";transform="translate("+(delta[0]-SVG.origin[0])+" "+(SVG.origin[1]+delta[1]-SVG.height)+") "+(options.replace?"":transform);node.setAttribute("transform",transform)}}function curve(list,options){options=options||{};options.curve=options.curve||"T";path(list,options)}function circle(center,radius,options){ellipse(center,radius,radius,options)}function loop(p,options){options=options||{};var d=options.direction||[1,0];options.curve="C";options.closed=false;path([p,[p[0]+d[0],p[1]+d[1]],[p[0]-d[1],p[1]+d[0]],p],options)}function arc(options){options=options||{};var start=options.start;var end=options.end;var center=options.center;var startangle=options.startangle;var endangle=options.endangle;var st="M",elmt=getSVGElement(options.id,"path");var attr=getOptions(["largearc","sweep","closed","sector"],options);var radius=options.radius;if(center!=null&&startangle!=null&&endangle!=null&&radius!=null){start=[radius*Math.cos(startangle)+center[0],radius*Math.sin(startangle)+center[1]];end=[radius*Math.cos(endangle)+center[0],radius*Math.sin(endangle)+center[1]]}if(start==null||end==null){return}if(!radius){var v=[end[0]-start[0],end[1]-start[1]];radius=Math.sqrt(v[0]*v[0]+v[1]*v[1])}if(attr.sector){st+=toSVGPair(center)+" "}st+=toSVGPair(start)+" A"+radius*SVG.xunitlength+","+radius*SVG.yunitlength+" 0 "+attr.largearc+","+attr.sweep+" "+toSVGPair(end);if(attr.sector||attr.closed){st+=" z"}elmt.node.setAttribute("d",st);setStrokeAndFill(elmt.node,options);if(options.marker){setMarkers(elmt.node,options)}if(options.label){setLabels([start,end],options)}appendSVG(elmt)}function sector(options){if(!options.center||!options.startangle||!options.endangle||!options.radius){return}options.sector=true;arc(options)}function ellipse(center,rx,ry,options){options=options||{};var elmt=getSVGElement(options.id,"ellipse");center=toSVG(center);elmt.node.setAttribute("cx",center[0]);elmt.node.setAttribute("cy",center[1]);elmt.node.setAttribute("rx",rx*SVG.xunitlength);elmt.node.setAttribute("ry",ry*SVG.yunitlength);setStrokeAndFill(elmt.node,options);appendSVG(elmt)}function polygon(list,options){options=options||{};options.closed=true;path(list,options)}function rect(p,q,options){options=options||{};var elmt=getSVGElement(options.id,"rect");var attr=getOptions(["rx","ry"],options);elmt.node.setAttribute("x",toSVG(p)[0]);elmt.node.setAttribute("y",toSVG(q)[1]);elmt.node.setAttribute("width",(q[0]-p[0])*SVG.xunitlength);elmt.node.setAttribute("height",(q[1]-p[1])*SVG.yunitlength);elmt.node.setAttribute("rx",attr.rx*SVG.xunitlength);elmt.node.setAttribute("ry",attr.ry*SVG.yunitlength);setStrokeAndFill(elmt.node,options);appendSVG(elmt)}function text(p,st,options){options=options||{};var id=options.id;var fill=getOptions("fontfill",options);if(id&&options.isLabel){id+=options.isLabel}var pos=getOptions("pos",options).toUpperCase();var fontsize=getOptions("fontsize",options)/SVG.factor;var node,dx=0,dy=0,str=st.toString();var q=toSVG(p);if(/\$/.test(str)){if(p[0]>SVG.xmax||p[0]<SVG.xmin||p[1]>SVG.ymax||p[1]<SVG.ymin){return}var dnode=$("#"+SVG.id+"mml:first");if(id){node=$("#"+id)[0]}if(!node){node=MSVG.createElementXHTML("div",id);node.style.position="absolute";dnode.append(node)}else{$(node).empty()}str=$.trim(str);str=str.substr(1,str.length-2);$(node).append(MSVG.parseMath(str,true,fontsize+"px",fill));dx=-node.offsetWidth/2;dy=-node.offsetHeight/2;if(/N/.test(pos)){dy=-node.offsetHeight}if(/S/.test(pos)){dy=0}if(/E/.test(pos)){dx=0}if(/W/.test(pos)){dx=-node.offsetWidth}node.style.left=(q[0]+dx)+"px";node.style.top=(q[1]+dy)+"px"}else{var baseline="middle",textanchor="middle";if(/E/.test(pos)){textanchor="start"}if(/W/.test(pos)){textanchor="end"}if(/N/.test(pos)){baseline="text-after-edge"}if(/S/.test(pos)){baseline="text-before-edge"}var attr=getOptions(["fontstyle","fontfamily","fontweight"],options);var elmt=getSVGElement(id,"text");$(elmt.node).empty().text(str);elmt.node.setAttribute("x",q[0]);elmt.node.setAttribute("y",q[1]);elmt.node.setAttribute("font-style",attr.fontstyle);elmt.node.setAttribute("font-family",attr.fontfamily);elmt.node.setAttribute("font-weight",attr.fontweight);elmt.node.setAttribute("font-size",fontsize);elmt.node.setAttribute("text-anchor",textanchor);elmt.node.setAttribute("dominant-baseline",baseline);setStrokeAndFill(elmt.node,options,"font");appendSVG(elmt)}}function image(url,options){options=options||{};var elmt=getSVGElement(options.id,"image");var height=options.height||SVG.height;var width=options.width||SVG.width;var point=toSVG(options.point||[SVG.xmin,SVG.ymin]);var pos=(options.pos||"").toUpperCase();var x=point[0]-width*0.5;var y=point[1]-height*0.5;if(/N/.test(pos)){y-=height*0.5}if(/S/.test(pos)){y+=height*0.5}if(/E/.test(pos)){x+=width*0.5}if(/W/.test(pos)){x-=width*0.5}elmt.node.setAttribute("x",x);elmt.node.setAttribute("y",y);elmt.node.setAttribute("width",width);elmt.node.setAttribute("height",height);elmt.node.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",url);appendSVG(elmt)}function grid(options){options=options||{};var dx,dy,x,y,k;var orig=options.origin||[0,0];options.stroke=options.stroke||"grey";options.strokewidth=(options.strokewidth||SVG.attr.strokewidth*0.25)/SVG.factor;var lim=getScales(options.scales);lim[2]=lim[2]||SVG.ymin;lim[3]=lim[3]||SVG.ymax;var group=getSVGElement("Grid","g");$(group.node).empty();var tempNode=SVG.canvas;SVG.canvas=group.node;if(SVG.coords=="polar"){dx=options.dx||1;dy=options.dy||3;var limit=Math.max(Math.abs(lim[0]),Math.abs(lim[1]),Math.abs(lim[2]),Math.abs(lim[3]));for(x=dx;x<limit;x+=dx){circle(orig,x,options)}if(dy>1){for(y=1;y<dy;y++){k=Math.tan(y*Math.PI/(2*dy));line([lim[0],(lim[0]-orig[0])*k+orig[1]],[SVG.xmax,(lim[1]-orig[0])*k+orig[1]],options);line([lim[0],-(lim[0]-orig[0])*k+orig[1]],[SVG.xmax,-(lim[1]-orig[0])*k+orig[1]],options)}}}else{dx=options.dx||1;dy=options.dy||dx;for(x=orig[0];x<lim[1];x+=dx){line([x,lim[2]],[x,lim[3]],options)}for(x=orig[0]-dx;x>lim[0];x-=dx){line([x,lim[2]],[x,lim[3]],options)}for(y=orig[1];y<lim[3];y+=dy){line([lim[0],y],[lim[1],y],options)}for(y=orig[1]-dy;y>lim[2];y-=dy){line([lim[0],y],[lim[1],y],options)}}SVG.canvas=tempNode;appendSVG(group)}function axes(options){options=options||{};options.marker="-|"+(options.marker?options.marker.charAt(0):"-");var x,y,start,stop;var orig=options.origin||[0,0];var origin=toSVG(orig);var dx=options.dx||1;var dy=options.dy||dx;var fontsize=getOptions("fontsize",options);var ddx=Math.max(0,Math.floor(-Math.log(dx+1e-9)/Math.log(10))+1);var ddy=Math.max(0,Math.floor(-Math.log(dy+1e-9)/Math.log(10))+1);options.stroke=options.stroke||"black";options.strokewidth=options.strokewidth||SVG.attr.strokewidth*0.5;options.markerstroke=options.stroke;options.markerstrokewidth=2*options.strokewidth;options.units="strokeWidth";options.size=fontsize*SVG.factor;var lim=getScales(options.scales);lim[2]=lim[2]||SVG.ymin;lim[3]=lim[3]||SVG.ymax;var list1=[],label1=[];start=orig[0]+dx;stop=lim[1]-0.25*dx;for(x=start;x<stop;x+=dx){list1.push([x,orig[1]]);label1.push(String(x.toFixed(ddx)))}list1.push([lim[1],orig[1]]);label1.push("");var list2=[],label2=[];start=orig[0]-dx;stop=lim[0]+0.25*dx;for(x=start;x>stop;x-=dx){list2.push([x,orig[1]]);label2.push(String(x.toFixed(ddx)))}list2.push([lim[0],orig[1]]);label2.push("");list2.reverse();list2=list2.concat(list1);if(options.ticklabels!=false){label2.reverse();options.label=label2.concat(label1);options.pos=(SVG.height-origin[1]>2*fontsize)?"S":"N"}var group=getSVGElement("Axes","g");$(group.node).empty();var tempNode=SVG.canvas;SVG.canvas=group.node;path(list2,options);list1=[],label1=[];start=orig[1]+dy;stop=lim[3]-0.25*dy;for(y=start;y<stop;y+=dy){list1.push([orig[0],y]);label1.push(String(y.toFixed(ddy)))}list1.push([orig[0],lim[3]]);label1.push("");list2=[];label2=[];start=orig[1]-dy;stop=lim[2]+0.25*dy;for(y=start;y>stop;y-=dy){list2.push([orig[0],y]);label2.push(String(y.toFixed(ddy)))}list2.push([orig[0],lim[2]]);label2.push("");list2.reverse();list2=list2.concat(list1);if(options.ticklabels!=false){label2.reverse();options.label=label2.concat(label1);options.pos=(origin[0]>2*fontsize)?"W":"E"}options.stroke=options.markerstroke;path(list2,options);SVG.canvas=tempNode;appendSVG(group)}function list(fun,tmin,tmax,options){var inc=(tmax-tmin)/getOptions("points",options);if(inc<=0||fun.length==0){return}var t,pth,g=[],xt,yt;for(t=1;t>=0;t--){if($.isFunction(fun[t])){g[t]=fun[t]}else{if(typeof fun[t]=="string"){with(Math){eval("g["+t+"] = function(x){return "+fun[t]+"}")}}else{return}}}if(g.length<2){return}pth=[];for(t=tmin;t<=tmax;t+=inc){xt=g[0](t);yt=g[1](t);if(isFinite(xt)&&isFinite(yt)){pth[pth.length]=[xt,yt]}}return pth}function plot(fun,options){options=options||{};var i,steps=options.steps||[];if(steps.length===0){plotter(fun,options)}else{var leftMarkers=options.leftMarkers||"-";var rightMarkers=options.rightMarkers||"-";var n_steps=steps.length-1;options.max=steps[0];options.marker="--"+leftMarkers.charAt(0);plotter(fun,options);for(i=0;i<n_steps;i++){options.max=steps[i+1];options.min=steps[i];options.marker=rightMarkers.charAt((rightMarkers.length>i)?i:0)+"-"+leftMarkers.charAt((leftMarkers.length>i+1)?i+1:0);plotter(fun,options)}options.max=null;options.min=steps[n_steps];options.marker=rightMarkers.charAt((rightMarkers.length==n_steps)?n_steps-1:0)+"--";plotter(fun,options)}}function plotter(fun,options){options=options||{};options.closed=false;options.curve="";var xmin=(options.min==null)?SVG.xmin:options.min;var xmax=(options.max==null)?SVG.xmax:options.max;var pth=list(["x",fun],xmin,xmax,options);if(pth){path(pth,options)}}function area(fun1,fun2,options){options=options||{};options.curve="";options.closed=true;var xmin=(options.min==null)?SVG.xmin:options.min;var xmax=(options.max==null)?SVG.xmax:options.max;var pth1=list(["x",fun1],xmin,xmax,options);var pth2=list(["x",fun2],xmin,xmax,options);if(pth1&&pth2){pth2.reverse();pth1=pth1.concat(pth2);path(pth1,options)}}function polarPlot(fun,options){var g1,g2;if(typeof fun=="string"){with(Math){eval("g1 = function(x){return ("+fun+")*cos(x)}");eval("g2 = function(x){return ("+fun+")*sin(x)}")}}else{if($.isFunction(fun)){with(Math){eval("g1 = function(x){return fun(x)*cos(x)}");eval("g2 = function(x){return fun(x)*sin(x)}")}}}parametricPlot(g1,g2,options)}function parametricPlot(fun1,fun2,options){options=options||{};options.closed=false;options.curve="";var xmin=(options.min==null)?0:options.min;var xmax=(options.max==null)?2*Math.PI:options.max;var pth=list([fun1,fun2],xmin,xmax,options);if(pth){path(pth,options)}}function slopeField(fun,options){options=options||{};var g=fun;if(typeof fun=="string"){with(Math){eval("g = function(x,y){return "+fun+"}")}}var gxy,x,y,u,v,dz;var dx=(options.dx==null)?1:options.dx;var dy=(options.dy==null)?1:options.dy;dz=Math.sqrt(dx*dx+dy*dy)/6;var xmin=Math.ceil(SVG.xmin/dx);var ymin=Math.ceil(SVG.ymin/dy);for(x=xmin;x<=SVG.xmax;x+=dx){for(y=ymin;y<=SVG.ymax;y+=dy){gxy=g(x,y);if(!isNaN(gxy)){if(Math.abs(gxy)=="Infinity"){u=0;v=dz}else{u=dz/Math.sqrt(1+gxy*gxy);v=gxy*u}line([x-u,y-v],[x+u,y+v],options)}}}}return{dynamic:{},removePictures:function(obj){var pictures=obj?[obj]:$(".svgGraph");$(pictures).each(function(){var target=this.parentNode;$(this).remove();$(target).css({color:"red",background:"yellow"});$(target).text("Missing picture: your browser does not support inline SVG");window.setTimeout(function(){$(target).remove()},10000)})},drawPictures:function(obj){var options,xmin,xmax,ymin,ymax;var pictures=obj?[obj]:$(".svgGraph");$(pictures).each(function(){SVG=new pictureObject();options=this.getAttribute("options");if(options!=""){with(Math){eval("options="+options)}setOptions(options)}else{options={}}SVG.pos=options.pos||SVG.pos;if(SVG.pos=="inline"){$(this).wrap("<span></span>")}else{$(this).wrap("<div></div>")}SVG.width=options.width||SVG.width;SVG.height=options.height||SVG.height;SVG.coords=options.coords||SVG.coords;SVG.border=options.borderwidth||SVG.border;var borderstroke=options.borderstroke||"black";var borderstyle=options.borderstyle||"solid";if(options.pan==false){SVG.pan=false}SVG.src=this.getAttribute("script");var container=this.parentNode;switch(SVG.pos){case"left":$(container).css("float","left");break;case"right":$(container).css("float","right");break;case"center":$(container).css("margin","auto auto")}$(container).css("border",SVG.border+"px "+borderstyle+" "+borderstroke);container.removeChild(this);var scales=getScales(options.scales);SVG.xmin=scales[0];SVG.xmax=scales[1];SVG.ymin=scales[2];SVG.ymax=scales[3];if(SVG.xmin>=SVG.xmax){throw"Incorrect values: xmax<=xmin."}var xunitlength=SVG.width/(SVG.xmax-SVG.xmin);if(typeof SVG.ymin!="number"){SVG.ymin=-SVG.height/(2*xunitlength);SVG.ymax=-SVG.ymin}else{if(SVG.ymin>=SVG.ymax){throw"Incorrect values: ymax<=ymin."}}setScales();SVG.id=Math.randomString(16);var qnode=createSVGElement("svg");qnode.id=SVG.id;qnode.setAttribute("xmlns","http://www.w3.org/2000/svg");var node=createSVGElement("clipPath");node.id=SVG.id+"ClipPath";var node2=createSVGElement("path");$(node).append(node2);node2=createSVGElement("defs");node2.id=SVG.id+"_Defs";$(node2).append(node);$(qnode).append(node2);node=createSVGElement("rect");node.setAttribute("class","svgBackground");node.setAttribute("x","0");node.setAttribute("y","0");node.setAttribute("width","100%");node.setAttribute("height","100%");node.setAttribute("fill",SVG.attr.backgroundcolor);node.setAttribute("fill-opacity",SVG.attr.backgroundopacity);$(qnode).append(node);node=createSVGElement("g");node.id=SVG.id+"Canvas";node.setAttribute("clip-path","url(#"+SVG.id+"ClipPath)");SVG.canvas=node;$(qnode).append(node);if(SVG.coords!="none"&&SVG.pos!="inline"){node=createSVGElement("text");node.id=SVG.id+"Coords";node.setAttribute("class","svgCoords");node.setAttribute("text-anchor","end");node.setAttribute("font-size",(SVG.attr.fontsize*0.8));$(qnode).append(node)}$(container).append(qnode);container.style.position="relative";node=MSVG.createElementXHTML("span",SVG.id+"mml");$(container).append(node);if(SVG.pos!="inline"){node=MSVG.createElementXHTML("span",SVG.id+"toolbar");node.style.position="absolute";node.style.textAlign="left";node.style.zIndex=10;node2=setButton("Update","Edit script",function(){updateButton(this)});$(node).append(node2);node2=setButton("SVG","View SVG code",function(){exportSVG(this)});$(node).append(node2);node2=setButton("-","Zoom out",function(){changeScales(1.25)});$(node).append(node2);node2=setButton("+","Zoom in",function(){changeScales(0.8)});$(node).append(node2);node2=setButton("\u2191","Enlarge picture",function(){changeSize(0.8)});$(node).append(node2);node2=setButton("\u2193","Reduce picture",function(){changeSize(1.25)});$(node).append(node2);$(node).append("<br />");node2=MSVG.createElementXHTML("textarea",SVG.id+"src");$(node2).attr({rows:8,cols:80});$(node).append(node2);$(node).hide();$(container).append(node);setAction("mousemove",updateCoord);setAction("mouseout",removeCoord);setAction("mousedown",onClick);if(SVG.pan){setAction("mouseup",onDrop)}if(window.addEventListener){var evt=$.browser.mozilla?"DOMMouseScroll":"mousewheel";qnode.addEventListener(evt,onWheel,false)}}setAction("mouseover",switchTo);setSize();translateAndEval(SVG.id)})}}}(jQuery);
//}}}
/***
!~TiddlyWiki formatters
***/
//{{{
if(!version.extensions.MathSVGPlugin) { //# ensure that the plugin is only installed once
version.extensions.MathSVGPlugin = {installed: true};
MSVG.generic();
config.formatterHelpers.MathSVGHelper = function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch){
var eq = MSVG.parseMath(lookaheadMatch[1],this.displaystyle);
if(this.displaystyle){
var node = createTiddlyElement(w.output,"div");
node.style.textAlign='center';
node.appendChild(eq);
w.output.appendChild(node);
} else {w.output.appendChild(eq);}
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
config.formatters.push( {
name: "clatex",
match: "\\$\\$",
lookaheadRegExp: /\$\$((?:.|\n)*?)\$\$/mg,
displaystyle: true,
handler: config.formatterHelpers.MathSVGHelper
})
config.formatters.push( {
name: "clatex2",
match: "\\\\\\\[",
lookaheadRegExp: /\\\[\s*(.*?)\s*\\\]/mg,
displaystyle: true,
handler: config.formatterHelpers.MathSVGHelper
})
config.formatters.push( {
name: "latex",
match: "\\$",
lookaheadRegExp: /\$((?:.|\n)*?)\$/mg,
displaystyle: false,
handler: config.formatterHelpers.MathSVGHelper
})
config.formatters.push( {
name: "graph",
match: "\\(:graph",
lookaheadRegExp: /\(:graph(?:\((\{.+?\})?\))?[\s]+((?:.|\n)*?)[\s]+:\)/mg,
handler: function(w){
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch){
var svg = createTiddlyElement(w.output,"embed");
svg.className="svgGraph";
svg.setAttribute('options',lookaheadMatch[1]||"");
svg.setAttribute('script',lookaheadMatch[2]);
ASVG.drawPictures(svg);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
})
}
//}}}
/***
The script should not be edited. All available options can be set by the following variables:
***/
//{{{
//MSVG.showFormulaOnMouseOver = false; //show LaTeX code on mouse over the equation
//MSVG.latexImages = false; //set to true to force the use of an external converter
//MSVG.latexConverter = "http://www.yourequations.com/eq.latex?"; //link to external converter
//MSVG.mathColor = "green"; //font color
//MSVG.mathFontSize = ""; //font size
//MSVG.mathFontFamily = ""; //font family
//}}}
/***
New symbols or commands can be defined here:
***/
//{{{
var commands = ["nle","R","diagup","varnothing","ind","DD"];
var symbols = ["\u2270","\u211D","\u2571","\u2205","\u2AEB","\\frac{d}{dr}"];
MSVG.define(commands,symbols);
//}}}
<<miniBrowser http://www.cyanogen.com/video/Guiding.htm>>
----
@@color:#f00;~~~MaxIm DL is a trademark of Diffraction Limited. Videos are Copyright © 2008, Diffraction Limited~~@@
<<miniBrowser http://www.cyanogen.com/video/Calibration.htm>>
----
@@color:#f00;~~~MaxIm DL is a trademark of Diffraction Limited. Videos are Copyright © 2008, Diffraction Limited~~@@
<<miniBrowser hidecontrols http://www.cyanogen.com/>>
<<miniBrowser hideControls http://winfij.homeip.net/maximdl/index.html>>
----
!Fundamentals
Learn how to view and save images in ~MaxIm DL. Includes important information on CCD image bit depth, and how this affects the screen display and file formats. Watch [[MaxIm Fundamentals]].
!Autoguiding
Learn the basics of autoguiding with ~MaxIm DL. Includes focusing, calibrating, guiding, and graphical track logs. Watch [[MaxIm Autoguiding]].
!Calibration
Learn how fast and convenient it is to perform image calibration with ~MaxIm DL. Watch [[MaxIm Calibration]].
----
@@color:#f00;~~~MaxIm DL is a trademark of Diffraction Limited. Videos are Copyright © 2008-2009, Diffraction Limited~~@@
<<miniBrowser hideControls http://www.cyanogen.com/maxdlfaq.php>>
----
<<miniBrowser http://www.cyanogen.com/video/Fundamentals.htm>>
----
@@color:#f00;~~~MaxIm DL is a trademark of Diffraction Limited. Videos are Copyright © 2008, Diffraction Limited~~@@
<<miniBrowser http://www.cyanogen.com/help/maximdl/MaxIm-DL.htm#Introduction.htm>>
----
<<miniBrowser hideControls http://www.cyanogen.com/point_main.php>>
*Here is the ordered list known as the [[Messier Marathon Search Sequence]], or click links in the page below.
*See how ACP Scheduler performed in the [[Denny Messier Marathon|http://scheduler.dc3.com/marathon.html]].
----
<<miniBrowser http://www.seds.org/Messier/xtra/marathon/marathon.html>>
----
*See the general description of the [[Messier Marathon]].
----
<<miniBrowser http://www.seds.org/messier/xtra/marathon/marath.html>>
----
Bright Skies website
http://www.brightskies.us/
----
/***
|Name|MiniBrowserPlugin|
|Source|http://www.TiddlyTools.com/#MiniBrowserPlugin|
|Version|1.2.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|PlayerPlugin (optional, recommended)|
|Overrides||
|Options|##Configuration|
|Description|embedded browser-in-browser with favorites lists and media support|
!!!!!Usage
<<<
{{{<<miniBrowser noplayer hidecontrols URL TiddlerName TiddlerName TiddlerName...>>}}}
* ''noplayer'' (optional)<br>disables support for embedded media player (using [[PlayerPlugin]], if installed)
* ''hidecontrols'' (optional)<br>hide initial display of minibrowser controls (except for 'show controls' checkbox)<br>//note: if no initial URL is specified, controls will be shown anyway//
* ''URL'' (optional)<br>specifies an initial URL to open when the mini browser is rendered
* ''TiddlerName'', ''TiddlerName''... (optional)<br>indicates one or more tiddlers containing "HR-separated" lists of favorites.<br>//notes: if no tiddler is specified, [[MiniBrowserList]] is used by default. In addition, when adding/deleting favorites, the plugin automatically updates [[MiniBrowserList]], regardless of any alternative lists of favorites stored in separate tiddlers. After changes to [[MiniBrowserList]] are made, you can then use cut/paste to manually move entries from that tiddler into other tiddlers.//
<<<
!!!!!Configuration
<<<
Default mini browser size:
width: <<option txtMiniBrowserWidth>> height: <<option txtMiniBrowserHeight>>
<<<
!!!!!Example
>{{{<<miniBrowser>>}}}<br>{{smallform small{<<miniBrowser>>}}}
>{{{<<miniBrowser hidecontrols http://www.TiddlyWiki.com>>}}}<br>{{smallform small{<<miniBrowser hidecontrols http://www.TiddlyWiki.com>>}}}
!!!!!Revisions
<<<
2008.04.07 [1.2.1] added txtMiniBrowserWidth and txtMiniBrowserHeight. cleanup init handling (somewhat)
2008.04.06 [1.2.0] added support for specifying initial URL to view (suggested by Richard Berg). When opening a URL, select matching entry (if any) in bookmarks droplist. Added support for hiding minibrowser controls.
2008.01.19 [1.1.0] added support for optional extra favorites lists stored in separate tiddlers
2007.10.15 [1.0.0] combined MiniBrowser and MediaCenter inline scripts and converted to true plugin
2006.03.01 [0.0.0] inline script
<<<
!!!!!Code
***/
//{{{
version.extensions.MiniBrowser={major: 1, minor: 2, revision: 1, date: new Date(2008,4,6)};
//}}}
//{{{
config.shadowTiddlers.MiniBrowser="<<miniBrowser>>";
//}}}
//{{{
if (config.options.txtMiniBrowserWidth==undefined) config.options.txtMiniBrowserWidth="100%";
if (config.options.txtMiniBrowserHeight==undefined) config.options.txtMiniBrowserHeight="640";
//}}}
//{{{
config.macros.miniBrowser= {
favoritesList:
"MiniBrowserList",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var noPlayer=params[0]&¶ms[0].toLowerCase()=="noplayer"; if (noPlayer) params.shift();
if (!config.macros.player) noPlayer=true; // if PlayerPlugin not installed
var hideControls=params[0]&¶ms[0].toLowerCase()=="hidecontrols"; if (hideControls) params.shift();
var url=(params[0]&&!store.tiddlerExists(params[0]))?params.shift():"";
hideControls=hideControls&&url.length; // if no initial URL, then show controls anyway
var w=config.options.txtMiniBrowserWidth;
var h=config.options.txtMiniBrowserHeight;
// create form
var guid=new Date().getTime()+Math.random().toString(); // globally unique ID
var html=this.html;
html=html.replace(/%id%/g,guid);
html=html.replace(/%noplayer%/g,noPlayer?"true":"");
html=html.replace(/%hidecontrols%/g,hideControls?"none":"block");
html=html.replace(/%favorites%/g,params[0]||config.macros.miniBrowser.favoritesList);
createTiddlyElement(place,"span").innerHTML=html;
// init form
document.getElementById("minibrowser_controls_"+guid).style.display=hideControls?"none":"block";
document.getElementById("minibrowser_resize_"+guid).style.display=hideControls?"none":"block";
document.getElementById("minibrowser_togglecontrols_"+guid).checked=!hideControls;
document.getElementById("minibrowser_form_"+guid).url.value=url;
document.getElementById("minibrowser_form_"+guid).w.value=w;
document.getElementById("minibrowser_form_"+guid).h.value=h;
if (noPlayer) { // hide "type" list no PlayerPlugin
document.getElementById("minibrowser_type_"+guid).style.display="none";
document.getElementById("minibrowser_url_"+guid).style.width="36%";
}
// load bookmarks droplist from HR-separated tiddler contents
var b=document.getElementById("minibrowser_bookmarks_"+guid);
while (b.options[1]) b.options[1]=null; // clear list but leave 'prompt' item
var p; while (p=params.shift()) this.getFavorites(b,p); // load custom bookmarks
if (b.length<2) this.getFavorites(b,config.macros.miniBrowser.favoritesList); // default list
// load initial URL (if any)
var place=document.getElementById("minibrowser_player_"+guid);
this.load(place,guid,"","",w,h,true,noPlayer);
this.go(document.getElementById("minibrowser_form_"+guid));
},
getFavorites: function(list,tid) {
var txt=store.getTiddlerText(tid); if (!txt||!txt.trim().length) return;
var parts=txt.split("\n----\n");
for (var p=0; p<parts.length; p++) {
var lines=parts[p].split("\n");
var label=lines.shift()||""; // 1st line=display text
var value=lines.shift()||""; // 2nd line=item value
var indent=value&&value.length?"\xa0\xa0":"";
list.options[list.length]=new Option(indent+label,value,false,false);
}
},
load: function(place,id,type,url,w,h,showcontrols,noPlayer) {
if (noPlayer) {
if (!place) place=document.getElementById(id).parentNode;
place.innerHTML="<iframe name='"+id+"' id='"+id+"' \
src='"+url+"' width='"+w+"' height='"+h+"' \
style='background:#fff;border:1px solid'></iframe>"
} else
config.macros.player.loadURL(place,id,type,url,w,h,showcontrols);
},
go: function(f) {
var url=f.url.value.trim();
if (!url.length) url=f.url.value=f.bookmarks.value.trim();
if (!url.length) { this.done(f); return false; }
var id=f.playerID.value;
document.getElementById("minibrowser_player_"+id).style.display="block";
document.getElementById("minibrowser_controls2_"+id).style.display="block";
this.load(null,id,f.type.value,f.url.value,f.w.value,f.h.value,f.ctrls.checked,f.noPlayer.value=="true");
var matched=false; for (var i=0; i<f.bookmarks.options.length; i++) // select matching bookmark
if (f.bookmarks.options[i].value==url) { f.bookmarks.selectedIndex=i; matched=true; break; }
if (!matched) f.bookmarks.selectedIndex=0;
f.done.disabled=false;
return false;
},
done: function(f) {
var id=f.playerID.value;
this.load(null,id,null,null,f.w.value,0,f.ctrls.checked,f.noPlayer.value=="true");
document.getElementById("minibrowser_player_"+id).style.display="none";
document.getElementById("minibrowser_controls2_"+id).style.display="none";
f.done.disabled=true;
return false;
},
fit: function(place) {
var trim=89; // fudge factor to account for the other controls + padding + borders. ADJUST THIS VALUE TO FIT LAYOUT
var t=story.findContainingTiddler(place);
if (!t) { t=place; while (t && t.className!='floatingPanel') t=t.parentNode; } if (!t) return;
var w="100%"; // horizontal stretching via CSS works, but vertical stretching doesn't... so:
var h=t.offsetHeight-trim; // workaround: get containing panel/tiddler height and subtract "trim" height
var f=place.form;
this.load(null,f.playerID.value,f.type.value,f.url.value,w,h,f.ctrls.checked,f.noPlayer.value=="true"); // reload player with new size
place.form.w.value=w; place.form.h.value=h; // update width/height input fields
},
add: function(place,title) {
var v=place.value; if (!v.length) return;
var d=prompt("Please enter a description for\n"+place.value); if (!d || !d.length) return;
var who=config.options.txtUserName;
var when=new Date();
var tid=store.getTiddler(title);
var txt="%0\n%1\n----\n%2".format([d,v,tid?tid.text:""]);
store.saveTiddler(title,title,txt,who,when,tid?tid.tags:[],tid?tid.fields:{});
if (!tid) story.displayTiddler(story.findContainingTiddler(place),title);
else story.refreshTiddler(title,1,true);
var here=story.findContainingTiddler(place);
if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);
},
del: function(place,title) {
var v=place.value; if (!v.length) return;
var d=place.options[place.selectedIndex].text; if (!d.length) return;
if (!confirm("Are you sure you want to remove this favorite?\n\n"+d+"\n"+v)) return;
var tid=store.getTiddler(title); if (!tid) return;
var who=config.options.txtUserName;
var when=new Date();
var pat='%0\n%1\n----\n'.format([d.replace(/\xa0/g,''),v]); var re=new RegExp(pat,"i");
var txt=tid.text.replace(re,"");
store.saveTiddler(title,title,txt,who,when,tid?tid.tags:[],tid?tid.fields:{});
story.refreshTiddler(title,1,true);
var here=story.findContainingTiddler(place);
if (here) story.refreshTiddler(here.getAttribute("tiddler"),1,true);
},
html: "<form id='minibrowser_form_%id%' style='display:block;margin:0;padding:0' onsubmit='return config.macros.miniBrowser.go(this);'><!-- \
--><nobr><input type='hidden' name='playerID' value='%id%'><input type='hidden' name='noPlayer' value='%noplayer%'><!-- \
--><div id='minibrowser_controls_%id%' style='display:%hidecontrols%'><!-- \
--><input type='button' value='<' title='back' style='font-size:8pt;width:3%' \
onclick='try{window.frames[\"player_%id%\"].history.go(-1)}catch(e){window.history.go(-1)}' ><!-- \
--><input type='button' value='>' title='forward' style='font-size:8pt;width:3%' \
onclick='try{window.frames[\"player_%id%\"].history.go(+1)}catch(e){window.history.go(+1)}'><!-- \
--><input type='button' value='+' title='refresh'style='font-size:8pt;width:3%' \
onclick='try{window.frames[\"player_%id%\"].location.reload()}catch(e){;}'><!-- \
--><input type='button' value='x' title='stop'style='font-size:8pt;width:3%' \
onclick='window.stop()'><!-- \
--><select name='bookmarks' id='minibrowser_bookmarks_%id%' size='1' style='font-size:8pt;width:20%' \
onchange='this.form.url.value=this.value; return config.macros.miniBrowser.go(this.form);'><!-- \
--><option value=''>bookmarks...</option><!-- \
--></select><!-- \
--><input type='button' value='add' title='add URL to the bookmarks' style='font-size:8pt;width:5%' \
favorites=\"%favorites%\" \
onclick='config.macros.miniBrowser.add(this.form.url,this.getAttribute(\"favorites\"));'><!-- \
--><input type='button' value='del' title='remove URL from the bookmarks' style='font-size:8pt;width:5%' \
favorites=\"%favorites%\" \
onclick='config.macros.miniBrowser.del(this.form.bookmarks,this.getAttribute(\"favorites\"));'><!-- \
--><input type='button' value='edit' title='edit the bookmarks list' style='font-size:8pt;width:5%' \
favorites=\"%favorites%\" \
onclick='story.displayTiddler(null,this.getAttribute(\"favorites\"),2)'><!-- \
--><input type='text' name='url' id='minibrowser_url_%id%' size='60' value='' style='font-size:8pt;width:23%' \
onfocus='this.select()'><!-- \
--><select name='type' id='minibrowser_type_%id%' size='1' style='font-size:8pt;width:13%'><!-- \
--><option value=''>media type...</option><!-- \
--><option value=''>auto-detect</option><!-- \
--><option value='iframe'>web page</option><!-- \
--><option value='windows'>windows media</option><!-- \
--><option value='realone'>real one</option><!-- \
--><option value='quicktime'>quicktime</option><!-- \
--><option value='flash'>flash</option><!-- \
--><option value='image'>jpg/gif/png</option><!-- \
--></select><!-- \
--><input type='submit' value='go' title='view URL in embedded player' style='font-size:8pt;width:4%'><!-- \
--><input type='button' value='open' title='view URL in a separate player' style='font-size:8pt;width:6%' \
onclick='if (this.form.url.value.length) window.open(this.form.url.value)'><!-- \
--><input type='button' value='done' name='done' disabled title='disconnect from URL' style='font-size:8pt;width:6%' \
onclick='return config.macros.miniBrowser.done(this.form);'><!-- \
--></div><!-- \
--><div id='minibrowser_player_%id%' style='display:none;text-align:center'></div><!-- \
--><span id='minibrowser_controls2_%id%' style='margin-top:2px;display:none;font-size:8pt;'><!-- \
--><div id='minibrowser_resize_%id%' style='display:%hidecontrols%;float:right;font-size:8pt'><!-- \
--> size: <input type='text' name='w' size='3' value='' style='font-size:8pt;' \
onfocus='this.select()'><!-- \
-->x<input type='text' name='h' size='3' value='' style='font-size:8pt;' \
onfocus='this.select()'><!-- \
--> <input type='submit' value='set' style='font-size:8pt;width:5%' \
onclick='var f=this.form; \
if(!f.w.value.trim().length) f.w.value=config.options.txtMiniBrowserWidth; \
if(!f.h.value.trim().length) f.h.value=config.options.txtMiniBrowserHeight; \
config.options.txtMiniBrowserWidth=f.w.value; config.options.txtMiniBrowserHeight=f.h.value; \
saveOptionCookie(\"txtMiniBrowserWidth\"); saveOptionCookie(\"txtMiniBrowserHeight\");'><!-- \
--><input type='submit' value='reset' style='font-size:8pt;width:5%' \
onclick='var f=this.form; f.ctrls.checked=true; f.w.value=\"100%\"; f.h.value=\"480\"; \
config.options.txtMiniBrowserWidth=f.w.value; config.options.txtMiniBrowserHeight=f.h.value; \
saveOptionCookie(\"txtMiniBrowserWidth\"); saveOptionCookie(\"txtMiniBrowserHeight\");'><!-- \
--><input type='button' value='fit' title='resize player to fit containing window' style='font-size:8pt;width:5%' \
onclick='config.macros.miniBrowser.fit(this)'><!-- \
--></div><!-- \
--> <input type='checkbox' name='ctrls' id='minibrowser_togglecontrols_%id%' title='toggle minibrowser controls' CHECKED \
onclick='document.getElementById(\"minibrowser_controls_%id%\").style.display=this.checked?\"block\":\"none\"; \
document.getElementById(\"minibrowser_resize_%id%\").style.display=this.checked?\"block\":\"none\";' \
><a href='' title='toggle minibrowser controls' \
onclick='this.previousSibling.click();return false;'>show navigation toolbar</a><!-- \
--></span><!-- \
--></nobr></form> \
"
}
//}}}
<<miniBrowser http://www.cfa.harvard.edu/iau/info/Astrometry.html>>
----
<<miniBrowser hideControls http://cfa-www.harvard.edu/iau/NEO/ToConfirm.html>>
*The IAU Minor Planet Center has an MP Checker service. Use Visual ~PinPoint to do a manual designation on the suspected minor planet. You might have to re-scan with really low sigma. Let VPP produce a MPC report. Copy and paste it into the big box on the MP Checker and click the "these observations" radiobutton, and it will tell you what asteroid(s) it thinks they are.
*For planning purposes, you can also enter any given RA and Dec to get a list of asteroids in the neighborhod.
<<miniBrowser hideControls http://scully.cfa.harvard.edu/~cgi/CheckMP>>
----
<<miniBrowser hideControls http://www.cfa.harvard.edu/iau/MPEph/MPEph.html>>
----
<<miniBrowser http://www.minorplanetobserver.com/astlc/PhotometryGuide.htm>>
----
Useful if you happen to own Software Bisque's version of Patrick Wallace's the TPOINT Telescope Analysis Software. This script will convert a ~MaxPoint calibration file into a ~TPOINT-importable text file. Thus, you can transfer a pointing model generated by ~MaxPoint into TPOINT's analysis program. For more information, see [[Analyzing With TPOINT]].
----
from: ''Dick Berg''
----
This script uses the ACP environment to facilitate constructing the mosaic. It writes a complete plan to the default plan folder. The plan can be further edited by hand if necessary. The plan building process is logged in the default log folder. The camera and telescope must be connected.
The script senses if there are filters available and, if not, skips a filter selection. If you do not have a "~RotatorInfo.txt" file in the ACP root file, the script also skips a rotator position angle selection.
When run, the completed plan will image an area of the sky located at the image center coordinates, with a matrix of images from 1x1 up to 7x7 in any size and combination, with a specified overlap of between 15% and 40%, and rotation angle 0-360. The algorithm for generating the matrix images' center coordinates does work for a 1x1 matrix, although you probably wouldn't want to use this script that way. However, you might want to have a single row or single column of images, like 4x1 or 1x7.
Unzip the downloaded file and put the .vbs file in the "ACP Obs Control/Scripts" folder and run it from the control panel. You can run this script in the simulation or live mode, building a plan, and then running that plan in the simulation or the live mode.
This script can also work in the remote web environment, but that requires modifications to the Utility Tasks interface in your copy of ACP.
[[Download Mosaic NxM Script]]
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
<<miniBrowser http://www.cfa.harvard.edu/iau/Ephemerides/Unusual/index.html>>
----
<<miniBrowser hideControls http://cfa-www.harvard.edu/iau/NEO/ToConfirm.html>>
A near-earth object listed on the [[Minor Planet Center's Near Earth Object Confirmation Page (NEOCP)]] will not have orbital elements available. Instead, the MPC publishes short-term ephemerides on the NEOCP. You can retrieve the ephemerides for one or more ~NEOs and construct target specifications for each.
|!NOTE|
|The format of NEO Ephemeris target specifications is strict. You must follow the directions explicitly or your plan will fail on the bad specifications.|
Set up the NEOCP ephemeris generator web page with the following options in order to get ephemeris lines in the expected format (all of these options are ''vital''):
*''Geocentric'' observing point
*Ephemeris Interval of ''1 hour''
*''Decimal'' coordinate format
*Motions in "/''hr''
*Separate RA and Dec ''coordinate'' rates (not sky rates!)
*''Full'' output (not brief!)
The length of the resulting ephemeris lines should be exactly 65 characters (ignoring any uncertainty hyperlinks that may be present!). If not, you picked the wrong options above. A typical ephemeris line from the MPC should like this (''this is not the target specification format!''):
|!Example|
|2004 10 27 02 01.6915 -40.095 126.8 18.7 -69.29 -2.51|
Once you have the NEO ephemerides displayed on your browser, select from 4 to 6 lines (spaced two hours apart) that will provide data for the entire night (so you don't have to know just when ACP will observe the NEO). Then build your ACP target specification as:
#A 10-character target name (add spaces to make it 10-characters)
#Exactly one space
#The first 35 characters of the first ephemeris line (Time, RA, Dec only)
#A "|"
#The first 35 characters of the next ephemeris line (use the one for 2 hours later than the first)
#... and so on, for 4 to 6 lines.
This may seem complex, but once you get it, it's actually straightforward. Here is an example ACP plan target line for NEO A123456789 (hypothetical!) with 3 ephemeris records spaced 2 hours apart:
|!Example|
|{{{1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890}}}|
|{{{A123456789 2004 10 27 02 01.6915 -40.095|2004 10 27 04 01.6834 -40.167|2004 10 27 06 01.6689 -40.301}}}|
This target specification format is the most demanding of care and accuracy of any of ACP's target lines. The benefit is that your NEO images will be at precisely the coordinates predicted by the MPC, and if you use orbital tracking, your scope will move to track the motion of the NEO during the exposure.
----
!NEO Ephemerides
A near-earth object listed on the Minor Planet Center's Near Earth Object Confirmation Page (NEOCP) will not have orbital elements available. Instead, the MPC publishes short-term ephemerides on the NEOCP. You can retrieve the ephemerides for one or more ~NEOs and construct target specifications for each.
|NOTE: The format of NEO Ephemeris target specifications is strict. You must follow the directions explicitly or your plan will fail on the bad specifications.|
You must set up the NEOCP ephemeris generator web page with the following options in order to get ephemeris lines in the expected format (all of these options are vital):
*''Geocentric'' observing point
*Ephemeris Interval of ''1 hour''
*''Decimal'' coordinate format
*Motions in ''"/hr''
*Separate RA and Dec ''coordinate'' rates (not sky rates!)
*''Full'' output (not brief!)
The length of the resulting ephemeris lines should be exactly 65 characters (ignoring any uncertainty hyperlinks that may be present!). If not, you picked the wrong options above. A typical ephemeris line from the MPC should like this (''this is not the target specification format!''):
{{{2004 10 27 02 01.6915 -40.095 126.8 18.7 -69.29 -2.51}}}
Once you have the NEO ephemerides displayed on your browser, select from 4 to 6 lines (spaced two hours apart) that will provide data for the entire night (so you don't have to know just when ACP will observe the NEO). Then build your ACP target specification as:
#A 10-character target name (add spaces to make it 10-characters)
#Exactly one space
#The first 35 characters of the first ephemeris line (Time, RA, Dec only)
#A "|"
#The first 35 characters of the next ephemeris line (use the one for 2 hours later than the first)
#... and so on, for 4 to 6 lines.
This may seem complex, but once you get it, it's actually straightforward. Here is an example ACP plan target line for NEO A123456789 (hypothetical!) with 4 ephemeris records spaced 2 hours apart:
{{{A123456789 2004 10 27 02 01.6915 -40.095|2004 10 27 04 01.6834 -40.167|2004 10 27 06 01.6689 -40.301|2004 10 27 08 01.6721 -40.462}}}
This target specification format is the most demanding of care and accuracy of any of ACP's target lines. The benefit is that your NEO images will be at precisely the coordinates predicted by the MPC, and if you use orbital tracking, your scope will move to track the motion of the NEO during the exposure.
----
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.9|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.11.15 - 2.4.9 in adjustNestedSlider(), don't make adjustments if panel is marked as 'undocked' (CSS class). In onClickNestedSlider(), SHIFT-CLICK docks panel (see [[MoveablePanelPlugin]])
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release. Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
<<<
!!!!!Code
***/
//{{{
version.extensions.NestedSlidersPlugin= {major: 2, minor: 4, revision: 9, date: new Date(2008,11,15)};
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkFloatingSlidersAnimate===undefined)
config.options.chkFloatingSlidersAnimate=false; // avoid clipping problems in IE
// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
window.removeCookie=function(name) {
document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
}
}
config.formatters.push( {
name: "nestedSliders",
match: "\\n?\\+{3}",
terminator: "\\s*\\={3}\\n?",
lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\@\\[\\>]*\\^)?)?(\\*)?(\\@)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
handler: function(w)
{
lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
var defopen=lookaheadMatch[1];
var cookiename=lookaheadMatch[2];
var header=lookaheadMatch[3];
var panelwidth=lookaheadMatch[4];
var transient=lookaheadMatch[5];
var hover=lookaheadMatch[6];
var buttonClass=lookaheadMatch[7];
var label=lookaheadMatch[8];
var openlabel=lookaheadMatch[9];
var panelID=lookaheadMatch[10];
var blockquote=lookaheadMatch[11];
var deferred=lookaheadMatch[12];
// location for rendering button and panel
var place=w.output;
// default to closed, no cookie, no accesskey, no alternate text/tip
var show="none"; var cookie=""; var key="";
var closedtext=">"; var closedtip="";
var openedtext="<"; var openedtip="";
// extra "+", default to open
if (defopen) show="block";
// cookie, use saved open/closed state
if (cookiename) {
cookie=cookiename.trim().slice(1,-1);
cookie="chkSlider"+cookie;
if (config.options[cookie]==undefined)
{ config.options[cookie] = (show=="block") }
show=config.options[cookie]?"block":"none";
}
// parse label/tooltip/accesskey: [label=X|tooltip]
if (label) {
var parts=label.trim().slice(1,-1).split("|");
closedtext=parts.shift();
if (closedtext.substr(closedtext.length-2,1)=="=")
{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
openedtext=closedtext;
if (parts.length) closedtip=openedtip=parts.join("|");
else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
}
// parse alternate label/tooltip: [label|tooltip]
if (openlabel) {
var parts=openlabel.trim().slice(1,-1).split("|");
openedtext=parts.shift();
if (parts.length) openedtip=parts.join("|");
else openedtip="hide "+openedtext;
}
var title=show=='block'?openedtext:closedtext;
var tooltip=show=='block'?openedtip:closedtip;
// create the button
if (header) { // use "Hn" header format instead of button/link
var lvl=(header.length>5)?5:header.length;
var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,buttonClass,title);
btn.onclick=onClickNestedSlider;
btn.setAttribute("href","javascript:;");
btn.setAttribute("title",tooltip);
}
else
var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,buttonClass);
btn.innerHTML=title; // enables use of HTML entities in label
// set extra button attributes
btn.setAttribute("closedtext",closedtext);
btn.setAttribute("closedtip",closedtip);
btn.setAttribute("openedtext",openedtext);
btn.setAttribute("openedtip",openedtip);
btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
btn.defOpen=defopen!=null; // save default open/closed state (boolean)
btn.keyparam=key; // save the access key letter ("" if none)
if (key.length) {
btn.setAttribute("accessKey",key); // init access key
btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
}
btn.setAttribute("hover",hover?"true":"false");
btn.onmouseover=function(ev) {
// optional 'open on hover' handling
if (this.getAttribute("hover")=="true" && this.sliderPanel.style.display=='none') {
document.onclick.call(document,ev); // close transients
onClickNestedSlider(ev); // open this slider
}
// mouseover on button aligns floater position with button
if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel);
}
// create slider panel
var panelClass=panelwidth?"floatingPanel":"sliderPanel";
if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
panel.button = btn; // so the slider panel know which button it belongs to
btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
panel.defaultPanelWidth=(panelwidth && panelwidth.length>2)?panelwidth.slice(1,-1):"";
panel.setAttribute("transient",transient=="*"?"true":"false");
panel.style.display = show;
panel.style.width=panel.defaultPanelWidth;
panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this); }
// render slider (or defer until shown)
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
if ((show=="block")||!deferred) {
// render now if panel is supposed to be shown or NOT deferred rendering
w.subWikify(blockquote?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
// align floater position with button
if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel);
}
else {
var src = w.source.substr(w.nextMatch);
var endpos=findMatchingDelimiter(src,"+++","===");
panel.setAttribute("raw",src.substr(0,endpos));
panel.setAttribute("blockquote",blockquote?"true":"false");
panel.setAttribute("rendered","false");
w.nextMatch += endpos+3;
if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
}
}
}
}
)
function findMatchingDelimiter(src,starttext,endtext) {
var startpos = 0;
var endpos = src.indexOf(endtext);
// check for nested delimiters
while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
// count number of nested 'starts'
var startcount=0;
var temp = src.substring(startpos,endpos-1);
var pos=temp.indexOf(starttext);
while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
// set up to check for additional 'starts' after adjusting endpos
startpos=endpos+endtext.length;
// find endpos for corresponding number of matching 'ends'
while (startcount && endpos!=-1) {
endpos = src.indexOf(endtext,endpos+endtext.length);
startcount--;
}
}
return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
while (theTarget && theTarget.sliderPanel==undefined) theTarget=theTarget.parentNode;
if (!theTarget) return false;
var theSlider = theTarget.sliderPanel;
var isOpen = theSlider.style.display!="none";
// if SHIFT-CLICK, dock panel first (see [[MoveablePanelPlugin]])
if (e.shiftKey && config.macros.moveablePanel) config.macros.moveablePanel.dock(theSlider,e);
// toggle label
theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
// toggle tooltip
theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));
// deferred rendering (if needed)
if (theSlider.getAttribute("rendered")=="false") {
var place=theSlider;
if (theSlider.getAttribute("blockquote")=="true")
place=createTiddlyElement(place,"blockquote");
wikify(theSlider.getAttribute("raw"),place);
theSlider.setAttribute("rendered","true");
}
// show/hide the slider
if(config.options.chkAnimate && (!hasClass(theSlider,'floatingPanel') || config.options.chkFloatingSlidersAnimate))
anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
else
theSlider.style.display = isOpen ? "none" : "block";
// reset to default width (might have been changed via plugin code)
theSlider.style.width=theSlider.defaultPanelWidth;
// align floater panel position with target button
if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider);
// if showing panel, set focus to first 'focus-able' element in panel
if (theSlider.style.display!="none") {
var ctrls=theSlider.getElementsByTagName("*");
for (var c=0; c<ctrls.length; c++) {
var t=ctrls[c].tagName.toLowerCase();
if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
{ try{ ctrls[c].focus(); } catch(err){;} break; }
}
}
var cookie=theTarget.sliderCookie;
if (cookie && cookie.length) {
config.options[cookie]=!isOpen;
if (config.options[cookie]!=theTarget.defOpen) window.saveOptionCookie(cookie);
else window.removeCookie(cookie); // remove cookie if slider is in default display state
}
// prevent SHIFT-CLICK from being processed by browser (opens blank window... yuck!)
// prevent clicks *within* a slider button from being processed by browser
// but allow plain click to bubble up to page background (to close transients, if any)
if (e.shiftKey || theTarget!=resolveTarget(e))
{ e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); }
Popup.remove(); // close open popup (if any)
return false;
}
//}}}
//{{{
// click in document background closes transient panels
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);
if (document.nestedSliders_savedOnClick)
var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
// if click was inside a popup... leave transient panels alone
var p=target; while (p) if (hasClass(p,"popup")) break; else p=p.parentNode;
if (p) return retval;
// if click was inside transient panel (or something contained by a transient panel), leave it alone
var p=target; while (p) {
if ((hasClass(p,"floatingPanel")||hasClass(p,"sliderPanel"))&&p.getAttribute("transient")=="true") break;
p=p.parentNode;
}
if (p) return retval;
// otherwise, find and close all transient panels...
var all=document.all?document.all:document.getElementsByTagName("DIV");
for (var i=0; i<all.length; i++) {
// if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
// otherwise, if the panel is currently visible, close it by clicking it's button
if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button})
if (!hasClass(all[i],"floatingPanel")&&!hasClass(all[i],"sliderPanel")) all[i].style.display="none";
}
return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel) {
if (hasClass(panel,"floatingPanel") && !hasClass(panel,"undocked")) {
// see [[MoveablePanelPlugin]] for use of 'undocked'
var rightEdge=document.body.offsetWidth-1;
var panelWidth=panel.offsetWidth;
var left=0;
var top=btn.offsetHeight;
if (place.style.position=="relative" && findPosX(btn)+panelWidth>rightEdge) {
left-=findPosX(btn)+panelWidth-rightEdge; // shift panel relative to button
if (findPosX(btn)+left<0) left=-findPosX(btn); // stay within left edge
}
if (place.style.position!="relative") {
var left=findPosX(btn);
var top=findPosY(btn)+btn.offsetHeight;
var p=place; while (p && !hasClass(p,'floatingPanel')) p=p.parentNode;
if (p) { left-=findPosX(p); top-=findPosY(p); }
if (left+panelWidth>rightEdge) left=rightEdge-panelWidth;
if (left<0) left=0;
}
panel.style.left=left+"px"; panel.style.top=top+"px";
}
}
//}}}
//{{{
// TW2.1 and earlier:
// hijack Slider stop handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
Morpher.prototype.coreStop = Morpher.prototype.stop;
Morpher.prototype.stop = function() {
this.coreStop.apply(this,arguments);
var e=this.element;
if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
// adjust panel overflow and position after animation
e.style.overflow = "visible";
if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
}
};
}
//}}}
<<miniBrowser http://www.weatheroffice.gc.ca/astro/imageview/viewImage_e.html?urlpath=/data/prog/regional&Type=ANIMATE&start=3&end=48&format=png&imagename=12_054_R1_north@america@southeast_I_ASTRO_nt>>
----
<<miniBrowser http://www.weatheroffice.gc.ca/astro/imageview/viewImage_e.html?urlpath=/data/prog/regional&Type=ANIMATE&start=3&end=48&format=png&imagename=12_054_R1_north@america@southwest_I_ASTRO_nt>>
----
<<miniBrowser http://www.weatheroffice.gc.ca/astro/imageview/viewImage_e.html?urlpath=/data/prog/regional&Type=ANIMATE&TITLE=Seeing_Forecast&start=3&end=48&format=png&imagename=12_054_R1_north@america@astro_I_ASTRO_seeing>>
----
|Here are weather forecasts for astronomy compiled by the Meteorological Service of Canada. Click on one of the "direction" buttons on the following pages to activate the animation controls. The first image will be one at 15h UT, followed by up to 44 subsequent images.|
| !Cloud Cover at 1-hr intervals | !Seeing at 3-hr intervals |
| [[North America (Eastern) Cloud Cover]] | [[North America Seeing]] |
| [[North America (Western) Cloud Cover]] | |
See also [[Unisys Weather]] @@color:#f00;^^~~^^NEW^^~~^^@@
See also [[Local Clouds (Middle Atlantic Region)]] @@color:#f00;^^~~^^EXPERIMENTAL^^~~^^@@
----
<<miniBrowser hideControls http://en.wikipedia.org/wiki/Nutation>>
<<miniBrowser hideControls http://cfa-www.harvard.edu/iau/Ephemerides/Comets/>>
<<miniBrowser http://www.cfa.harvard.edu/iau/Ephemerides/Distant/index.html>>
----
Here are links to the ephemerides and orbital elements for currently-observable objects of the following kind:
|[[Observable Distant Minor Planets]]|
|[[Observable Comets]]|
|[[Critical-list Numbered Minor Planets]]|
|[[NEO and Unusual Minor Planets]]|
|[[List of Potentially Hazardous Asteroids]]|
----
!Observatory horizon for Anyone's Observatory
(:graph({width:540,height:270,scales:[-20,370,-12,100],borderwidth:2,borderstroke:"white"})
axes({dx:30,dy:10,stroke:"yellow",marker:">",fontfill:"orange"});
dynamic.a = [];
for(dynamic.j=0;dynamic.j<181;dynamic.j++){
dynamic.a.push([dynamic.j*2,dynamic.j/2]);
}
dynamic.mb=1; // fill opacity
dynamic.mc=3; // size
dynamic.d="#0f0"; // color
path(dynamic.a,{stroke:"none",marker:"-o-",size:dynamic.mc,markerstroke:"none",markerfill:"#0f0",markerfillopacity:dynamic.mb});
:)
----
!ACP Plan Checker
When you install ACP, an icon is placed on your desktop labeled ACP Plan Checker. This useful tool provides you a way to check an ACP Observing Plan (see [[Making Observing Plans]]) for validity before submitting it for a run. It will detect many types of errors, including invalid directives, bad coordinate or orbital element formats, missing arguments on directives. etc. It will also detect conflicting directives such as a plan with both #chain and #shutdown.
|NOTE: The Plan Checker does not check all of the errors that are checked at run start by the ''~AcquireImages.js'' script. The Plan Checker is designed to run on a system that doesn't have ACP installed. However ''~AcquireImages.js'' by definition is running on a system with ACP, so it can do deeper checking. Be aware that Plan Checker is a good tool for detecting most errors, but you may still find more obscure errors at the start of a plan.|
!How to Use Plan Checker
Drag and drop a plan file on to the ACP Plan Checker icon (recommended for ease of use). You can also double-click the icon, in which case you'll see a popup "ease of use" message telling you that you can drag and drop and asking if you want to browse for the file. Clicking Yes will show the file browser where you can select the plan to check. Shortly thereafter, a Notepad window will appear containing either a list of errors in the plan, or if the plan is error-free, a detailed dump of the plan's observing requests.
----
!!!Click on the links to open the web pages
|[[Global Weather]] - Satellite imagery of the Earth from various viewpoints|
|[[AAVSO]] - American Association of Variable Star Observers|
|[[AAVSO Charts]] - The AAVSO Variable Star Plotter|
|[[Aladin]] - An interactive software sky atlas allowing the user to visualize digitized astronomical images, superimpose entries from astronomical catalogues or databases, and interactively access related data and information from the Simbad database, the VizieR service and other archives for all known sources in the field|
|[[Arp Catalog]] - The Arp Catalog of Peculiar Galaxies (1966) archive with query capability; and a link to images of each|
|[[Asteroid Occultations]] - Everything you need for observing occultations of stars by asteroids|
|[[Astronomical Survey Projects]] - Links to dozens and dozens of on-going survey projects, such as 2MASS, MACHO, TASS and more|
|[[Astronomical Catalogs and Catalog Formats]] - searching and mapping tools within 24 catalogs at the SAO Telescope Data Center|
|[[An Atlas of O-C Diagrams of Eclipsing Binaries]] - A total of 1,140 binaries for which at least 20 minima had been timed|
|[[Auroral Ovals]] - the current extent and position of the auroral ovals in both hemispheres|
|[[Center for Backyard Astrophysics]] - A global network of small telescopes dedicated to photometry of cataclysmic variables|
|[[Eclipsing Binary Times of Minima]] - A downloadable Excel spreadsheet for computing minima predictions for 2303 eclipsing binaries|
|[[Exoplanet Catalog]] - The interactive catalog of extra-Solar planets|
|[[Gamma-ray Bursters]] - The Gamma ray bursts Coordinates Network -- Notices, Circulars and Reports|
|[[Grazing Occultations]] - Predictions and maps for grazing occultations of stars by the Moon|
|[[Guide to Minor Planet Astrometry & Photometry]] - For those interested in undertaking CCD observing programs|
|[[Henden Photometry Fields]] - Reference stars for developing transformations for extinction correction and/or transforms to standard photometric systems (e.g. UBVRI), and for comparison stars for variables and comets|
|[[Hubble Legacy Archives]] - A repository for observations from most of Hubble's instruments|
|[[IAU Central Bureau for Astronomical Telegrams]] - Clearinghouse for dissemination of information on transient astronomical events|
|[[IOTA]] - The International Occultation Timing Association|
|[[Landolt Special Areas Catalogs]] @@color:#0F0;^^~~^^REVISED^^~~^^@@ - UBVRI photometry of many areas of the sky along the celestial equator|
|[[List of Recent Supernovae]] - Details on supernovae that have occurred since the start of 2007|
|[[List of Stars with Confirmed Extrasolar Planets]] - There are 326 planets listed, along with other astrophysical data for each system|
|[[JPL Small-Body Database Browser]] - JPL provides data and visualizations for all known asteroids and many comets.|
|[[Messier Marathon]] - An approach to seeing all the Messier objects in one evening!|
|[[Minor Planet Checker]] @@color:#F00;~~^^~~NEW~~^^~~@@ - a resource for comparing your observations with known minor planets|
|[[Minor Planet Ephemeris Service]] - An ephemeris generator geared toward observers|
|[[Observable Solar System Objects]] - Orbital elements and ephemerides of observable minor planets, comets, ~NEOs, distant minor planets, critical-list numbered minor planets, unusual minor planets and bright minor planets|
|[[SDSS DR5 Finding Charts]] - Returns a JPEG image centered on //(ra,dec)//, of size //(height x width)// where the image is scaled to an arbitrary //(scale)//|
|[[Sharpless Catalog]] - The Sharpless 2nd Catalog of ~H-II Regions (1959) archive with query capability|
|[[SIMBAD]] - Basic data, cross-identifications, bibliography and measurements for astronomical objects outside the solar system|
|[[Sky-Map.org]] - An online, detailed star sky map|
|[[STSci Digitized Sky Survey]] - all-sky photographic survey, digitized and available in either FITS or GIF formats. Also available through [[Aladin]]|
|[[Third Reference Catalog of Bright Galaxies (RC3)]] - Galaxies with diam>1 arcmin, B-band magnitudes <15.5, and redshift<15,000 km/s|
|[[VizieR]] - Browse through the world's most complete collection of astronomical catalogs|
|[[The Whole NGC]] - Images of all 7,900 NGC galaxies from the Digitized Sky Survey|
| |
----
!!!Click on the links to open the web pages
*Earth and Weather
**[[Global Weather]]
**[[Auroral Ovals]]
*Observer's Tools
**[[Aladin]]
**[[Astronomical Survey Projects]]
**[[IAU Central Bureau for Astronomical Telegrams]]
**[[SIMBAD]]
**[[VizieR]]
*Catalogs & Charts
**[[AAVSO Charts]]
**[[Arp Catalog]]
**[[Astronomical Catalogs and Catalog Formats]]
**[[Landolt Special Areas Catalogs]]
**[[SDSS DR5 Finding Charts]]
**[[Saguaro Astronomy Club (SAC) V7.2 catalog]]
**[[Sharpless Catalog]]
**[[STSci Digitized Sky Survey]]
**[[Third Reference Catalog of Bright Galaxies (RC3)]]
*Photometry Standards
**[[Henden Photometry Fields]]
**[[Sumner Photometry Fields]]
**[[Landolt Special Areas Catalogs]]
*Solar System
**[[Guide to Minor Planet Astrometry & Photometry]]
**[[JPL Small-Body Database Browser]]
**[[Minor Planet Checker]]
**[[Minor Planet Ephemeris Service]]
**[[Observable Solar System Objects]]
*Occultations
**[[Asteroid Occultations]]
**[[Grazing Occultations]]
*Organizations
**[[AAVSO]]
**[[Center for Backyard Astrophysics]]
**[[IOTA]]
*Stars and Milky Way
**[[An Atlas of O-C Diagrams of Eclipsing Binaries]]
**[[Eclipsing Binary Times of Minima]]
**[[Exoplanet Catalog]]
**[[Gamma-ray Bursters]]
**[[List of Recent Supernovae]]
**[[List of Stars with Confirmed Extrasolar Planets]]
*Extragalactic
**[[Hubble Legacy Archives]]
**[[Messier Marathon]]
**[[The Whole NGC]]
<<accordion>>
----
Go to [[Observing Tools Online]] for more details
Pointing exposures are typically taken through a clear or open filter, and typically taken at binnings greater than 1. This maximizes the number of stars seen in the image for a given exposure time. Said another way, this ensures that there are an adequate number of stars in the image to "guarantee" that ~PinPoint will get a correct solution for the image coordinates and other astrometric values.
In order to __optimize__ the pointing exposure, it's necessary to determine the length of the exposure that yields an image with stars reaching to the magnitude limit of the available catalog used by ~PinPoint. This is done by taking a series of manual exposures through the clear filter (or no filter), at the binning determined by ACP, and seeing which time give an image matching the magnitude limit of the catalog reference.
The Guide Star Catalog contains stars down to 17th magnitude. If an image's faintest detected stars are fainter than mag 17, the pointing exposure time should be decreased. Since the GSC reference catalog does not have stars fainter than mag 17, it's unnecessary to expose for an image that has stars fainter than mag 17. Likewise, if your image's faintest star is brighter than mag 17, then the pointing exposure time needs to be increased. In this case, especially with a small FOV, there may be too few stars available for solving the plate.
When the right exposure time is determined, that value is entered into the ACP/Preferences/~PinPoint tab as the "Exp. interval".
!The Situation and the Impact
Have you noticed that your Windows system doesn't keep time accurately? The PC clock with constantly lose time, anywhere from several seconds per hour or so to many minutes per day (sometimes as much as 15 minutes or more in a single day!) You might have thought that the battery was low or something.
Even if you've installed a little freeware clock synchronization program, like [[Dimension 4]], that syncs up your computer clock to one of the many atomic clock time servers out there on the Internet, the Windows system clock can still be very frequently very out-of-sync with the rest of the world.
A slowdown of the Windows system clock has significant ramification for astronomical observations. Experience has shown that repeating a long sequence of short-duration images, say a Plan of 100 sixty-second images repeated several times during the night, can slow down the Windows system clock by many tens of seconds. If you are timing eclipses, your timings are wrong. If you are computing astrometric positions of NEO's, your positions are wrong. If you are depending on precise intervals for special observing requirements, those intervals are wrong.
!Two Clocks and Probable Cause
There are actually two clocks on your computer. There is the hardware (BIOS or CMOS) Real Time Clock (RTC), and there is the Windows operating system clock. The Windows operating system clock starts out with the same value as the Real Time Clock whenever you reboot your computer, but from then on, it is updated completely independently of the RTC via periodic clock interrupts. Thus, over time, as the system runs, it is possible for the Windows operating system clock to get out of sync with the actual hardware RTC clock (i.e. the actual "wall clock" time).
This happens because as the system runs, certain software and operating system functions sometimes have to disable all interrupts causing the operating system to sometimes miss a clock interrupt. Most software that disable all interrupts (including the Windows operating system) don't keep interrupts disabled for very long (usually only for a few microseconds at most), but because they DO disable all interrupts from time to time, clock ticks ARE unfortunately periodically lost. Over time these add up, causing the Windows operating system clock to fall behind and differ considerably from the actual "wall clock" time (sometimes by several minutes or more, depending on system load and the variety and type of software programs running during the time period in question).
!The Remedy
While lots of factors can impact an observing Plan, a clock drift doesn't have to be one of them. When [[ClockMon™]] notices the Windows operating system clock differs from the actual hardware Real Time Clock by more than a predefined amount (but less than 30 minutes), it resets the minutes and seconds portion of the Windows system clock to that of the RTC, thereby eliminating this annoying "Windows Clock Drift" problem and ensuring a more accurate Windows clock value. Put a shortcut to the ~ClockMon™ executable in your startup folder and kiss clock errors goodbye!
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
<!--{{{-->
<div class='header' macro='gradient vert #300000 #900000'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<div id='ContentFooter' refresh='content' tiddler='contentFooter'></div>
<!--}}}-->
/%
!info
|Name|PaletteMaker|
|Source|http://www.TiddlyTools.com/#PaletteMaker|
|Version|1.2.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|Type|transclusion|
|Description|edit/create ColorPalette using interactive grid/list|
Usage
<<<
{{{
<<tiddler PaletteMaker with: PaletteName GridName noList noGrid allowOther>>
}}}
*''~PaletteName'' (default=ColorPalette)<br>specifies a tiddler containing {{{name:value}}} slices that assign names to color values
*''~GridName'' (default=[[216-color 'web safe' grid|http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors]])<br>specifies a tiddler (or section) that defines a table, where each table cell contains one of:
**a 3-digit #RGB or 6-digit #RRGGBB color value
**an [[X11 Color Name|http://en.wikipedia.org/wiki/X11_color_names]]
**another valid CSS attribute value (see ''allowOther'', below)
*''noList'' //or// ''noGrid''<br>omits the palette listbox or color grid to provide a more compact layout
*''allowOther''<br>permit non-color CSS attribute values to be entered/selected, e.g., {{{url('images/somefile.jpg')}}}
<<<
Notes:
<<<
*{{block{
You can use "-" as placeholders for the default values of ''~PaletteName'' and/or ''~GridName'':
{{{
<<tiddler PaletteMaker with: - - nogrid>>
}}}
}}}
*{{block{
The grid/list are rendered with 'float:left' styles so content that follows will be rendered next to them. To show your content below the grid/list display, embed an //empty// 'tagClear' CSS wrapper after the PaletteMaker:
{{{
<<tiddler PaletteMaker ...>>{{tagClear{
}}}
}}}
You can also customize the default styles contained in [[PaletteMakerStyles]]:
<<tiddler PaletteMaker##showcode with: styles>>
}}}
*The default color grid definition is:<br><<tiddler PaletteMaker##showcode with: colorgrid>>
<<<
Examples
<<<
Edit ColorPalette (allow non-color values to be entered):
{{{<<tiddler PaletteMaker with: - - allowOther>>}}}
<<tiddler PaletteMaker##show with: - - allowOther>>{{tagClear{
}}}
Create/edit NewPalette using a 16-color 'rainbow' and/or shades of gray (no list):
{{{<<tiddler PaletteMaker with: NewPalette PaletteMaker##grayscale noList>>}}}
<<tiddler PaletteMaker##show with: NewPalette PaletteMaker##grayscale noList>>
{{{<<tiddler PaletteMaker with: NewPalette PaletteMaker##rainbow noList>>}}}
<<tiddler PaletteMaker##show with: NewPalette PaletteMaker##rainbow noList>>
<<<
!showcode
<<tiddler PaletteMaker##out with: {{store.getTiddlerText('PaletteMaker##$1')}}>>
!out
{{{
$1
}}}
!end
!colorgrid
|white || | | | | | |FC0|F90|F60|F30| | | | | | ||FFF|
|black ||9C0| | | | |C90|FC3|FC6|F96|F63|C30| | | | |C03||EEE|
|red ||CF0|CF3|330|660|990|CC0|FF0|C93|C63|300|600|900|C00|F00|F36|F03||DDD|
|orange ||9F0|CF6|9C3|663|993|CC3|FF3|960|930|633|933|C33|F33|C36|F69|F06||CCC|
|yellow ||6F0|9F6|6C3|690|996|CC6|FF6|963|630|966|C66|F66|903|C39|F6C|F09||BBB|
|green ||3F0|6F3|390|6C0|9F3|CC9|FF9|C96|C60|C99|F99|F39|C06|906|F3C|F0C||AAA|
|blue ||0C0|3C0|360|693|9C6|CF9|FFC|FC9|F93|FCC|F9C|C69|936|603|C09|303||999|
|darkmagenta ||3C3|6C6|0F0|3F3|6F6|9F9|CFC| | | |C9C|969|939|909|636|606||888|
|violet ||060|363|090|393|696|9C9| | | |FCF|F9F|F6F|F3F|F0F|C6C|C3C||777|
|darkred ||030|0C3|063|396|6C9|9FC|CFF|39F|9CF|CCF|C9F|96C|639|306|90C|C0C||666|
|darkorange ||0F3|3F6|093|0C6|3F9|9FF|9CC|06C|69C|99F|99C|93F|60C|609|C3F|C0F||555|
|gold ||0F6|6F9|3C6|096|6FF|6CC|699|036|369|66F|66C|669|309|93C|C6F|90F||444|
|darkgreen ||0F9|6FC|3C9|3FF|3CC|399|366|069|039|33F|33C|339|336|63C|96F|60F||333|
|darkblue ||0FC|3FC|0FF|0CC|099|066|033|39C|36C|00F|00C|009|006|003|63F|30F||222|
|indigo ||0C9| | | | |09C|3CF|6CF|69F|36F|03C| | | | |30C||111|
|darkviolet || | | | | | |0CF|09F|06F|03F| | | | | | ||000|
!grayscale
|FFF|EEE|DDD|CCC|BBB|AAA|999|888|777|666|555|444|333|222|111|000|
!rainbow
|black|white|red|orange|yellow|green|blue|darkmagenta|violet|darkred|darkorange|gold|darkgreen|darkblue|indigo|darkviolet|
!end
!styles
/*{{{*/
.colorgrid table
{ float:left; margin:0 !important; border:0 !important; }
.colorgrid table, .colorgrid tr, .colorgrid th, .colorgrid tbody
{ color:black; border:0 !important; }
.colorgrid td
{ height:16px; width:16px; text-align:center; padding:0; line-height:100%; }
.colorgrid select
{ float:left; margin-left:16px; font-size:80%; height:255px; }
/*}}}*/
!end
!code
<<tiddler {{
config.shadowTiddlers.PaletteMakerStyles=store.getTiddlerText('PaletteMaker##styles');
setStylesheet(store.getTiddlerText('PaletteMakerStyles'),'paletteMakerStyles');
window.paletteMaker = {
getColor: function(t){ if (!t||!t.length) return null;
var s=document.createElement('span').style;
try { s.color='#'+t; if (s.color.length) return '#'+t; }
catch(e) { try{ s.color=t; } catch(e){ return null; } return t; } // IE
s.color=t; return s.color.length?t:null; // FF
},
getTextColor: function(t){
t=this.getColor(t);
if (!t||!t.length||!t.startsWith('#')) return 'black'; // BAD COLOR or X11 COLOR NAME
var rgb=t.substr(1).split(''); var long=t.length>=6;
function h2d(h){return '0123456789ABCDEF'.indexOf(h?h.toUpperCase():'');};
var r=h2d(rgb[0]); var g=h2d(rgb[long?2:1]); var b=h2d(rgb[long?4:2]);
if (r<0||g<0||b<0||r+g+b>=15) return 'black'; // BAD RGB or BRIGHT COLOR
return 'white'; // DARK COLOR
},
getPalette: function(palette) {
var pal={};
var slices=store.calcAllSlices(palette);
for (var s in slices) {
var color=slices[s].toUpperCase().replace(/#/,'');
if (!pal[color]) pal[color]=new Array();
pal[color].push(s);
}
return pal;
},
drawGrid: function(place,grid,palette,opts) {
var pm=window.paletteMaker; // abbrev
removeChildren(place);
if (!opts.contains('NOGRID')) wikify(store.getTiddlerText(grid,''),place);
if (!opts.contains('NOLIST')) var s=pm.drawList(place,
{ palette:palette,min:0,max:0,edit:true,callback:pm.callback,place:place,opts:opts });
var pal=pm.getPalette(palette);
var cells=place.getElementsByTagName('td');
for (var i=0; i<cells.length; i++) { var td=cells[i];
td.style.border=0;
var txt=getPlainText(td).trim(); if (!txt.length) continue;
var c=pm.getColor(txt); if (!c && !opts.contains('ALLOWOTHER')) continue;
if (c) { td.style.backgroundColor=c; td.innerHTML=''; td.style.fontSize='70%'; }
td.title=c||txt;
td.style.cursor=c?'crosshair':'pointer';
td.params={ palette:palette, min:0, max:15, edit:true, callback:pm.callback,
place:place, grid:grid, opts:opts, pick:c||txt };
if (pal[txt.toUpperCase()]) {
td.params.names=pal[txt.toUpperCase()];
td.title+='='+td.params.names.join(', ');
if (c) { td.style.color=pm.getTextColor(c); td.innerHTML='√'; }
}
td.onclick=function(ev) { ev=ev||window.event;
var p=Popup.create(this); if(!p)return false;
p.className+=' sticky smallform';
var s=window.paletteMaker.drawList(p,this.params);
s.style.fontSize='80%'; Popup.show(); s.focus();
ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation();
return false;
};
}
},
drawList: function(here,p) {
var pm=window.paletteMaker; // abbrev
var s=createTiddlyElement(here,'select');
s.params=p;
s.options[s.length]=new Option(p.palette+':','_view');
s.options[s.length-1].title='open '+p.palette;
if (p.edit && p.pick!==undefined) {
var c=pm.getColor(p.pick);
s.options[s.length]=new Option('+Add this color...','_add');
if (c) s.options[s.length-1].style.backgroundColor=c;
if (c) s.options[s.length-1].style.color=pm.getTextColor(c);
s.options[s.length-1].title=p.pick;
}
var colors=store.calcAllSlices(p.palette);
for (var x in colors) {
var c=pm.getColor(colors[x]);
var prefix=p.names&&p.names.contains(x)?'=':'\xA0\xA0';
s.options[s.length]=new Option(prefix+x,colors[x]);
if (c) s.options[s.length-1].style.backgroundColor=c;
if (c) s.options[s.length-1].style.color=pm.getTextColor(c)
s.options[s.length-1].title=(!c?'other: "':'')+colors[x]+(!c?'"':'');
}
s.size=p.min&&s.length<p.min?p.min:p.max&&s.length>p.max?p.max:s.length;
s.onclick=function(ev){ ev=ev||window.event;
var name=this.options[this.selectedIndex].text.replace(/[\xA0=]+/,'').trim();
if (this.params.callback) this.params.callback(this,name,this.value,this.params);
return false;
};
s.onkeyup=function(ev){ ev=ev||window.event;
if (ev.keyCode==13) { this.onclick(); Popup.remove(); }
if (ev.keyCode==27) Popup.remove();
return false;
};
return s;
},
callback: function(here,name,val,p){
var pm=window.paletteMaker; // abbrev
if (!val.length) return;
var pick=p.pick!==undefined?p.pick:val;
if (val=='_view') {
story.displayTiddler(story.findContainingTiddler(this.place),p.palette);
Popup.remove();
return false;
} else if (val=='_add') {
var msg='Enter a new name for "'+pick+'"';
name=prompt(msg,'');
var slices=store.calcAllSlices(p.palette);
while (name && slices[name])
name=prompt('"'+name+'" is already in use\n'+msg,name);
} else if (p.edit) {
var allow=p.opts.contains('ALLOWOTHER');
var msg='Change "'+name+'" from "'+val+'" to:';
pick=prompt(msg,pick);
while (pick && !pm.getColor(pick)) {
var err='"'+pick+'" is not a recognized color\n\xa0';
if (!allow) err+='Please try again\n\n';
else err+='Press OK to use this value anyway\n\n';
var pre=pick; pick=prompt(err+msg,pick);
if (pre==pick && allow) break;
}
} else {
// TBD: callback without editing
Popup.remove(); return false;
}
here.selectedIndex=0;
if (!name||!pick) return false;
pm.set(p.palette,name.replace(/ /g,''),pick);
pm.drawGrid(p.place,p.grid,p.palette,p.opts);
Popup.remove();
return false;
},
set: function(palette,name,newval) {
var tid=store.getTiddler(palette);
if (!tid) { var tid=new Tiddler(); tid.text=store.getTiddlerText(palette,''); }
var oldval=store.getTiddlerSlice(palette,name)||'';
var pattern="((?:^|\\n)(?:[\\'\\/]{0,2})~?(?:"
+name.escapeRegExp()
+")\\1\\:[\\t\\x20]*)(?:"
+oldval.escapeRegExp()
+")([\\t\\x20]*(?:\\n|$))";
var t=tid.text; var match=t.match(new RegExp(pattern));
if (match) {
var pos=t.indexOf(match[0]);
var newText=t.substr(0,pos)+
match[1]+newval+match[2]+
t.substr(pos+match[0].length);
} else { // place new slice at top of list or start of tiddler
var match=t.match(store.slicesRE);
var pos=t.indexOf(match?match[0]:'');
var newText=t.substr(0,pos)
+name+': '+newval+(t.length?'\n':'')
+t.substr(pos);
}
var who=config.options.txtUserName; var when=new Date();
if (config.options.chkForceMinorUpdate)
{ var who=tid.modifier; var when=tid.modified; }
displayMessage('setting "'+palette+'::'+name+'" to "'+newval+'"');
store.saveTiddler(palette,palette,newText,who,when,tid.tags,tid.fields);
story.refreshTiddler(palette,null,true);
}
};
'';}}>>
!end
!show
<<tiddler {{
var opts=[]
var palette=('$1'!='$'+'1' && '$1'!='-')?'$1':'ColorPalette';
var grid =('$2'!='$'+'2' && '$2'!='-')?'$2':'PaletteMaker##colorgrid';
opts.push('$3'.toUpperCase());
opts.push('$4'.toUpperCase());
opts.push('$5'.toUpperCase());
if (!place.lastChild||!hasClass(place.lastChild,'colorgrid')) {
var wrapper=createTiddlyElement(place,'span',null,'colorgrid');
window.paletteMaker.drawGrid(wrapper,grid,palette,opts);
}
'';}}>>
!end
%/<<tiddler PaletteMaker##code>>/%
%/<<tiddler {{var src='PaletteMaker'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}
with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]]>>
<<miniBrowser hideControls http://en.wikipedia.org/wiki/Parallax#Stellar_parallax>>
|NOTE: Clicking on the plot below does not work.|
<<miniBrowser hideControls http://quasars.org/docs/USNO_Landolt.htm>>
----
The term "residual" comes from the mathematical/statistical processes used to calculate the plate solution - that is, the plate scale, the orientation, the center coordinates, and the distortions of the image. In the FITS header, these terms are captured with names like "~CRVAL1," "~CDELT2" and the like, or "~CD1_1," "~TR2_6," etc. These terms are described in more detail in the document called [[FITS World Coordinate Systems]] (WCS).
The residuals are computed after the WCS plate solution is determined. It's a measure of how well that solution fits all the positions of the stars that were used in finding the solution. If the residual would be equal to zero, it would mean that the plate solution is perfect and fits the existing data exactly without any statistical errors. In practice, the actual residual will never be zero because we're talking about a statistical process. Usually there are many more reference stars available than are necessary, so the solution is "overdetermined." As a result, the residuals give one a sense of what the error is likely to be for any other "unknown" object's coordinates - for example, the position of an observed asteroid. When the plate solution is derived from very few known stars, the residuals are likely to be larger than they would be when many stars are used in the solution. This increases the uncertainty in unknown objects' coordinates.
Different images for the same star fields also result in different RA/DEC positions for the same objects, by small amounts. For example, with 25 images of the same object, the positions of the object are all slightly different. This comes about because each plate solution will always be slightly different for each image due to the different properties of each image, again in the numerical way described above.
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
from: ''Mike Dodd''
----
<<miniBrowser hideControls http://astronomy.mdodd.com/planalyzer.html>>
----
/***
|Name|PlayerPlugin|
|Source|http://www.TiddlyTools.com/#PlayerPlugin|
|Version|1.1.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Embed a media player in a tiddler|
!!!!!Usage
<<<
{{{<<player [id=xxx] [type] [URL] [width] [height] [autoplay|true|false] [showcontrols|true|false] [extras]>>}}}
''id=xxx'' is optional, and specifies a unique identifier for each embedded player. note: this is required if you intend to display more than one player at the same time.
''type'' is optional, and is one of the following: ''windows'', ''realone'', ''quicktime'', ''flash'', ''image'' or ''iframe''. If the media type is not specified, the plugin automatically detects Windows, Real, QuickTime, Flash video or JPG/GIF images by matching known file extensions and/or specialized streaming-media transfer protocols (such as RTSP:). For unrecognized media types, the plugin displays an error message.
''URL'' is the location of the media content
''width'' and ''height'' are the dimensions of the video display area (in pixels)
''autoplay'' or ''true'' or ''false'' is optional, and specifies whether the media content should begin playing as soon as it is loaded, or wait for the user to press the "play" button. Default is //not// to autoplay.
''showcontrols'' or ''true'' or ''false'' is optional, and specifies whether the embedded media player should display its built-in control panel (e.g., play, pause, stop, rewind, etc), if any. Default is to display the player controls.
''extras'' are optional //pairs// of parameters that can be passed to the embedded player, using the {{{<param name=xxx value=yyy>}}} HTML syntax.
''If you use [[AttachFilePlugin]] to encode and store a media file within your document, you can play embedded media content by using the title of the //attachment tiddler//'' as a parameter in place of the usual reference to an external URL. When playing an attached media content, you should always explicitly specify the media type parameter, because the name used for the attachment tiddler may not contain a known file extension from which a default media type can be readily determined.
<<<
!!!!!Configuration
<<<
Default player size:
width: <<option txtPlayerDefaultWidth>> height: <<option txtPlayerDefaultHeight>>
<<<
!!!!!Examples
<<<
+++[Windows Media]...
Times Square Live Webcam
{{{<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>}}}
<<player id=1 http://www.earthcam.com/usa/newyork/timessquare/asx/tsq_stream.asx>>
===
+++[RealOne]...
BBC London: Live and Recorded news
{{{<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>}}}
<<player id=2 http://www.bbc.co.uk/london/realmedia/news/tvnews.ram>>
===
+++[Quicktime]...
America Free TV: Classic Comedy
{{{<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>}}}
<<player id=3 http://www.americafree.tv/unicast_mov/AmericaFreeTVComedy.mov>>
===
+++[Flash]...
Asteroids arcade game
{{{<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>}}}
<<player id=4 http://www.80smusiclyrics.com/games/asteroids/asteroids.swf 400 300>>
Google Video
{{{<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774 400 326>>}}}
<<player id=5 flash http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoQAAAIVnUNP6GYRY8YnIRNPe4Uk5-j1q1MVpJIW4uyEFpq5Si0hcSDuig_JZcB9nNpAhbScm9W_8y_vDJQBw1DRdCVbXl-wwm5dyUiiStl_rXt0ATlstVzrUNC4fkgK_j7nmse7kxojRj1M3eo3jXKm2V8pQjWk97GcksMFFwg7BRAXmRSERexR210Amar5LYzlo9_k2AGUWPLyRhMJS4v5KtDSvNK0neL83ZjlHlSECYXyk%26sigh%3Dmpt2EOr86OAUNnPQ3b9Tr0wnDms%26begin%3D0%26len%3D429700%26docid%3D-914679554478687740&thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fcontentid%3De7e77162deb04c42%26second%3D5%26itag%3Dw320%26urlcreated%3D1144620753%26sigh%3DC3fqXPPS1tFiUqLzmkX3pdgYc2Y&playerId=-91467955447868774 400 326>>
YouTube Video
{{{<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>}}}
<<player id=6 flash http://www.youtube.com/v/OdT9z-JjtJk 400 300>>
===
+++[Still Images]...
GIF (best for illustrations, animations, diagrams, etc.)
{{{<<player id=7 image images/meow.gif auto auto>>}}}
<<player id=7 image images/meow.gif auto auto>>
JPG (best for photographs, scanned images, etc.)
{{{<<player id=8 image images/meow2.jpg 200 150>>}}}
<<player id=8 image images/meow2.jpg 200 150>>
===
<<<
!!!!!Revisions
<<<
2008.05.10 [1.1.4] in handlers(), immediately return if no params (prevents error in macro). Also, refactored auto-detect code to make type mapping configurable.
2007.10.15 [1.1.3] in loadURL(), add recognition for .PNG (still image), fallback to iframe for unrecognized media types
2007.08.31 [1.1.2] added 'click-through' link for JPG/GIF images
2007.06.21 [1.1.1] changed "hidecontrols" param to "showcontrols" and recognize true/false values in addition to 'showcontrols', added "autoplay" param (also recognize true/false values), allow "auto" as value for type param
2007.05.22 [1.1.0] added support for type=="iframe" (displays src URL in an IFRAME)
2006.12.06 [1.0.1] in handler(), corrected check for config.macros.attach (instead of config.macros.attach.getAttachment) so that player plugin will work when AttachFilePlugin is NOT installed. (Thanks to Phillip Ehses for bug report)
2006.11.30 [1.0.0] support embedded media content using getAttachment() API defined by AttachFilePlugin or AttachFilePluginFormatters. Also added support for 'image' type to render JPG/GIF still images
2006.02.26 [0.7.0] major re-write. handles default params better. create/recreate player objects via loadURL() API for use with interactive forms and scripts.
2006.01.27 [0.6.0] added support for 'extra' macro params to pass through to object parameters
2006.01.19 [0.5.0] Initial ALPHA release
2005.12.23 [0.0.0] Started
<<<
!!!!!Code
***/
//{{{
version.extensions.PlayerPlugin= {major: 1, minor: 1, revision: 4, date: new Date(2008,5,10)};
config.macros.player = {};
config.macros.player.html = {};
config.macros.player.handler= function(place,macroName,params) {
if (!params.length) return; // missing parameters - do nothing
var id=null;
if (params[0].substr(0,3)=="id=") id=params.shift().substr(3);
var type="";
if (!params.length) return; // missing parameters - do nothing
var p=params[0].toLowerCase();
if (p=="auto" || p=="windows" || p=="realone" || p=="quicktime" || p=="flash" || p=="image" || p=="iframe")
type=params.shift().toLowerCase();
var url=params.shift(); if (!url || !url.trim().length) url="";
if (url.length && config.macros.attach!=undefined) // if AttachFilePlugin is installed
if ((tid=store.getTiddler(url))!=null && tid.isTagged("attachment")) // if URL is attachment
url=config.macros.attach.getAttachment(url); // replace TiddlerTitle with URL
var width=params.shift();
var height=params.shift();
var autoplay=false;
if (params[0]=='autoplay'||params[0]=='true'||params[0]=='false')
autoplay=(params.shift()!='false');
var show=true;
if (params[0]=='showcontrols'||params[0]=='true'||params[0]=='false')
show=(params.shift()!='false');
var extras="";
while (params[0]!=undefined)
extras+="<param name='"+params.shift()+"' value='"+params.shift()+"'> ";
this.loadURL(place,id,type,url,width,height,autoplay,show,extras);
}
if (config.options.txtPlayerDefaultWidth==undefined) config.options.txtPlayerDefaultWidth="100%";
if (config.options.txtPlayerDefaultHeight==undefined) config.options.txtPlayerDefaultHeight="480"; // can't use "100%"... player height doesn't stretch right :-(
config.macros.player.typeMap={
windows: ['mms', '.asx', '.wvx', '.wmv', '.mp3'],
realone: ['rtsp', '.ram', '.rpm', '.rm', '.ra'],
quicktime: ['.mov', '.qt'],
flash: ['.swf', '.flv'],
image: ['.jpg', '.gif', '.png'],
iframe: ['.htm', '.html', '.shtml', '.php']
};
config.macros.player.loadURL=function(place,id,type,url,width,height,autoplay,show,extras) {
if (id==undefined) id="tiddlyPlayer";
if (!width) var width=config.options.txtPlayerDefaultWidth;
if (!height) var height=config.options.txtPlayerDefaultHeight;
if (url && (!type || !type.length || type=="auto")) { // determine type from URL
u=url.toLowerCase();
var map=config.macros.player.typeMap;
for (var t in map) for (var i=0; i<map[t].length; i++)
if (u.indexOf(map[t][i])!=-1) var type=t;
}
if (!type || !config.macros.player.html[type]) var type="none";
if (!url) var url="";
if (show===undefined) var show=true;
if (!extras) var extras="";
if (type=="none" && url.trim().length) type="iframe"; // fallback to iframe for unrecognized media types
// adjust parameter values for player-specific embedded HTML
switch (type) {
case "windows":
autoplay=autoplay?"1":"0"; // player-specific param value
show=show?"1":"0"; // player-specific param value
break;
case "realone":
autoplay=autoplay?"true":"false";
show=show?"block":"none";
height-=show?60:0; // leave room for controls
break;
case "quicktime":
autoplay=autoplay?"true":"false";
show=show?"true":"false";
break;
case "image":
show=show?"block":"none";
break;
case "iframe":
show=show?"block":"none";
break;
}
// create containing div for player HTML
// and add or replace player in TW DOM structure
var newplayer = document.createElement("div");
newplayer.playerType=type;
newplayer.setAttribute("id",id+"_div");
var existing = document.getElementById(id+"_div");
if (existing && !place) place=existing.parentNode;
if (!existing)
place.appendChild(newplayer);
else {
if (place==existing.parentNode) place.replaceChild(newplayer,existing)
else { existing.parentNode.removeChild(existing); place.appendChild(newplayer); }
}
var html=config.macros.player.html[type];
html=html.replace(/%i%/mg,id);
html=html.replace(/%w%/mg,width);
html=html.replace(/%h%/mg,height);
html=html.replace(/%u%/mg,url);
html=html.replace(/%a%/mg,autoplay);
html=html.replace(/%s%/mg,show);
html=html.replace(/%x%/mg,extras);
newplayer.innerHTML=html;
}
//}}}
// // Player-specific API functions: isReady(id), isPlaying(id), toggleControls(id), showControls(id,flag)
//{{{
// status values:
// Windows: 0=Undefined, 1=Stopped, 2=Paused, 3=Playing, 4=ScanForward, 5=ScanReverse
// 6=Buffering, 7=Waiting, 8=MediaEnded, 9=Transitioning, 10=Ready, 11=Reconnecting
// RealOne: 0=Stopped, 1=Contacting, 2=Buffering, 3=Playing, 4=Paused, 5=Seeking
// QuickTime: 'Waiting', 'Loading', 'Playable', 'Complete', 'Error:###'
// Flash: 0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete
config.macros.player.isReady=function(id)
{
var d=document.getElementById(id+"_div"); if (!d) return false;
var p=document.getElementById(id); if (!p) return false;
if (d.playerType=='windows') return !((p.playState==0)||(p.playState==7)||(p.playState==9)||(p.playState==11));
if (d.playerType=='realone') return (p.GetPlayState()>1);
if (d.playerType=='quicktime') return !((p.getPluginStatus()=='Waiting')||(p.getPluginStatus()=='Loading'));
if (d.playerType=='flash') return (p.ReadyState>2);
return true;
}
config.macros.player.isPlaying=function(id)
{
var d=document.getElementById(id+"_div"); if (!d) return false;
var p=document.getElementById(id); if (!p) return false;
if (d.playerType=='windows') return (p.playState==3);
if (d.playerType=='realone') return (p.GetPlayState()==3);
if (d.playerType=='quicktime') return (p.getPluginStatus()=='Complete');
if (d.playerType=='flash') return (p.ReadyState<4);
return false;
}
config.macros.player.showControls=function(id,flag) {
var d=document.getElementById(id+"_div"); if (!d) return false;
var p=document.getElementById(id); if (!p) return false;
if (d.playerType=='windows') { p.ShowControls=flag; p.ShowStatusBar=flag; }
if (d.playerType=='realone') { alert('show/hide controls not available'); }
if (d.playerType=='quicktime') // if player not ready, retry in one second
{ if (this.isReady(id)) p.setControllerVisible(flag); else setTimeout('config.macros.player.showControls("'+id+'",'+flag+')',1000); }
if (d.playerType=='flash') { alert('show/hide controls not available'); }
}
config.macros.player.toggleControls=function(id) {
var d=document.getElementById(id+"_div"); if (!d) return false;
var p=document.getElementById(id); if (!p) return false;
if (d.playerType=='windows') var flag=!p.ShowControls;
if (d.playerType=='realone') var flag=true; // TBD
if (d.playerType=='quicktime') var flag=!p.getControllerVisible();
if (d.playerType=='flash') var flag=true; // TBD
this.showControls(id,flag);
}
config.macros.player.fullScreen=function(id) {
var d=document.getElementById(id+"_div"); if (!d) return false;
var p=document.getElementById(id); if (!p) return false;
if (d.playerType=='windows') p.DisplaySize=3;
if (d.playerType=='realone') p.SetFullScreen();
if (d.playerType=='quicktime') { alert('full screen not available'); }
if (d.playerType=='flash') { alert('full screen not available'); }
}
//}}}
// // Player HTML
//{{{
// placeholder (no player)
config.macros.player.html.none=' \
<table id="%i%" width="%w%" height="%h%" style="background-color:#111;border:0;margin:0;padding:0;"> \
<tr style="background-color:#111;border:0;margin:0;padding:0;"> \
<td width="%w%" height="%h%" style="background-color:#111;color:#ccc;border:0;margin:0;padding:0;text-align:center;"> \
\
%u% \
\
</td></tr></table>';
//}}}
//{{{
// JPG/GIF/PNG still images
config.macros.player.html.image='\
<a href="%u%" target="_blank"><img width="%w%" height="%h%" style="display:%s%;" src="%u%"></a>';
//}}}
//{{{
// IFRAME web page viewer
config.macros.player.html.iframe='\
<iframe id="%i%" width="%w%" height="%h%" style="display:%s%;background:#fff;" src="%u%"></iframe>';
//}}}
//{{{
// Windows Media Player
// v7.1 ID: classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6
// v9 ID: classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95
config.macros.player.html.windows=' \
<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;width:%w%;height:%h%px;" \
classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" \
codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" \
align="baseline" border="0" \
standby="Loading Microsoft Windows Media Player components..." \
type="application/x-oleobject"> \
<param name="FileName" value="%u%"> <param name="ShowControls" value="%s%"> \
<param name="ShowPositionControls" value="1"> <param name="ShowAudioControls" value="1"> \
<param name="ShowTracker" value="1"> <param name="ShowDisplay" value="0"> \
<param name="ShowStatusBar" value="1"> <param name="AutoSize" value="1"> \
<param name="ShowGotoBar" value="0"> <param name="ShowCaptioning" value="0"> \
<param name="AutoStart" value="%a%"> <param name="AnimationAtStart" value="1"> \
<param name="TransparentAtStart" value="0"> <param name="AllowScan" value="1"> \
<param name="EnableContextMenu" value="1"> <param name="ClickToPlay" value="1"> \
<param name="InvokeURLs" value="1"> <param name="DefaultFrame" value="datawindow"> \
%x% \
<embed src="%u%" style="margin:0;padding:0;width:%w%;height:%h%px;" \
align="baseline" border="0" width="%w%" height="%h%" \
type="application/x-mplayer2" \
pluginspage="http://www.microsoft.com/windows/windowsmedia/download/default.asp" \
name="%i%" showcontrols="%s%" showpositioncontrols="1" \
showaudiocontrols="1" showtracker="1" showdisplay="0" \
showstatusbar="%s%" autosize="1" showgotobar="0" showcaptioning="0" \
autostart="%a%" autorewind="0" animationatstart="1" transparentatstart="0" \
allowscan="1" enablecontextmenu="1" clicktoplay="0" invokeurls="1" \
defaultframe="datawindow"> \
</embed> \
</object>';
//}}}
//{{{
// RealNetworks' RealOne Player
config.macros.player.html.realone=' \
<table width="%w%" style="border:0;margin:0;padding:0;"><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \
<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \
CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \
<PARAM NAME="CONSOLE" VALUE="player"> \
<PARAM NAME="CONTROLS" VALUE="ImageWindow"> \
<PARAM NAME="AUTOSTART" Value="%a%"> \
<PARAM NAME="MAINTAINASPECT" Value="true"> \
<PARAM NAME="NOLOGO" Value="true"> \
<PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \
<PARAM NAME="SRC" VALUE="%u%"> \
%x% \
<EMBED width="%w%" height="%h%" controls="ImageWindow" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;" \
name="%i%" \
src="%u%" \
console=player \
maintainaspect=true \
nologo=true \
backgroundcolor=#333333 \
autostart=%a%> \
</OBJECT> \
</td></tr><tr style="border:0;margin:0;padding:0;"><td style="border:0;margin:0;padding:0;"> \
<object id="%i%_controls" width="%w%" height="60" style="margin:0;padding:0;display:%s%" \
CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> \
<PARAM NAME="CONSOLE" VALUE="player"> \
<PARAM NAME="CONTROLS" VALUE="All"> \
<PARAM NAME="NOJAVA" Value="true"> \
<PARAM NAME="MAINTAINASPECT" Value="true"> \
<PARAM NAME="NOLOGO" Value="true"> \
<PARAM name="BACKGROUNDCOLOR" VALUE="#333333"> \
<PARAM NAME="SRC" VALUE="%u%"> \
%x% \
<EMBED WIDTH="%w%" HEIGHT="60" NOJAVA="true" type="audio/x-pn-realaudio-plugin" style="margin:0;padding:0;display:%s%" \
controls="All" \
name="%i%_controls" \
src="%u%" \
console=player \
maintainaspect=true \
nologo=true \
backgroundcolor=#333333> \
</OBJECT> \
</td></tr></table>';
//}}}
//{{{
// QuickTime Player
config.macros.player.html.quicktime=' \
<OBJECT ID="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \
CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" \
CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab"> \
<PARAM name="SRC" VALUE="%u%"> \
<PARAM name="AUTOPLAY" VALUE="%a%"> \
<PARAM name="CONTROLLER" VALUE="%s%"> \
<PARAM name="BGCOLOR" VALUE="#333333"> \
<PARAM name="SCALE" VALUE="aspect"> \
<PARAM name="SAVEEMBEDTAGS" VALUE="true"> \
%x% \
<EMBED name="%i%" WIDTH="%w%" HEIGHT="%h%" style="margin:0;padding:0;" \
SRC="%u%" \
AUTOPLAY="%a%" \
SCALE="aspect" \
CONTROLLER="%s%" \
BGCOLOR="#333333" \
EnableJavaSript="true" \
PLUGINSPAGE="http://www.apple.com/quicktime/download/"> \
</EMBED> \
</OBJECT>';
//}}}
//{{{
// Flash Player
config.macros.player.html.flash='\
<object id="%i%" width="%w%" height="%h%" style="margin:0;padding:0;" \
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" \
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"> \
<param name="movie" value="%u%"> \
<param name="quality" value="high"> \
<param name="SCALE" value="exactfit"> \
<param name="bgcolor" value="333333"> \
%x% \
<embed name="%i%" src="%u%" style="margin:0;padding:0;" \
height="%h%" width="%w%" quality="high" \
pluginspage="http://www.macromedia.com/go/getflashplayer" \
type="application/x-shockwave-flash" scale="exactfit"> \
</embed> \
</object>';
//}}}
<<miniBrowser hidecontrols http://en.wikipedia.org/wiki/Precession_of_the_equinoxes>>
<<miniBrowser hideControls http://en.wikipedia.org/wiki/Proper_Motion>>
It's not too difficult to modify ACP's web interface to install the code needed to view web pages, and particularly web cameras, within ACP. The [[ACP Reference Guide]] itself makes extensive use of the browser-in-a-browser to display the great variety of information.
Let's tackle a web-cam, which is relatively easy. All these code changes are made through the browser interface to the authoring environment. If you make these changes using the browser on the local observatory computer that's running ACP, I find that Google Chrome won't save changes, so I have to use IE or Firefox. If I'm making changes to the remote location, then Firefox won't save changes, but IE and Google Chrome will. Go figure.
If you feel comfortable modifying the ACP web environment, here are the steps to follow to incorporate a webcam (wonderful that it's ~IP-addressable!) into ACP. I'd recommend that you start by going to the ''ACP.../~WebDocs folder'' and saving a copy of the files called ''Author.html'' and ''index.asp'' in a safe place as backup recovery files. If anything goes wrong, you can always copy these directly back into the ~WebDocs folder, overwriting the files there and restoring the original functionality.
*[[STEP ONE - Changing the Main Menu (left sidebar)]]
*[[STEP TWO - Add a new item that displays the webcam]]
*[[STEP THREE - Add web browsing functionality to the ACP environment]]
*[[STEP FOUR (simple) - Test it]]
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
<<miniBrowser hideControls http://ad.usno.navy.mil/star/star_cats_rec.shtml>>
----
<<miniBrowser hideControls http://joevp.20m.com/charts/henden/And%20to%20Gem/Cyg_V404.txt>>
The form below is ready for you to fill in the pertinent information per the instructions on the page. After you submit your form, a script in the background does the format conversion to the Google Earth .kml schema. The master .kml file is updated immediately to include your observatory. You can submit a new or second entry, but you cannot edit one you've already submitted. If you make a mistake I'll fix it if you [[let me know|mailto:richard.berg@verizon.net]].
@@color:#0f0;Filling out and submitting the form is voluntary.@@ But it also means that you give your tacit approval to redistribute this information to any ACP customer. There's no intention of using it for any purpose other than as an illustration of where on Earth ACP is being used. Only those with access to the customer's parts of the Comm Center will be able to find and download the .kml file. The minimum information you need to provide is indicated by asterisks. If you want to associate a website with your placemark, please also fill in the URL.
To use the .kml file, [[click here|http://acp.dc3.com/ACPCustomers.kml]] to retrieve the file and save it someplace. Then start Google Earth, go to the File/Open... menu and select this .kml file to open it. It will show up in the "Temporary Places" part of the Google Earth menu. You can drag it up to the "My Places" section if you like.
<<miniBrowser hideControls http://acp.dc3.com/google-earth.html>>
----
Most users will find that ACP serves their needs without adjustments. Most of the techniques described in this section involve editing the registry information for ACP. If you haven't used the registry editor before, please be aware that you need to be careful in what you do. As long as you restrict your editing to the data that belongs to ACP, you'll have no problems. I suggest you use the new style registry editor, regedit.exe (as opposed to regedt32.exe which is on NT/2K/XP). Here is a (slightly doctored) picture of regedit's main screen.
[img[RefDocs/Registry.png]]
The left side contains a tree display of the keys. Under each key there can be values. A value consists of a name and its data. Data items can be in several formats (string, binary, DWORD), but ACP uses only string format data for its configuration information. In each section, you will find data already there. You can use these data as samples.
In the sections below, the key name refers to the sub-key under the Denny key as shown in the figure above. For example, the "Align Stars key" refers to
|~HKEY_LOCAL_MACHINE\SOFTWARE\DENNY\ACP\Align Stars|
!Alignment stars
''Key:'' Align Stars
''Name:'' name of the alignment star
''Value:'' J2000 Right Ascension (hours, decimal) and Declination (degrees, decimal) separated by a space
This is the list of alignment stars is used in the Go window, Alignment Star list.
!Spoken startup greeting
''Key:'' General
''Name:'' ~AgentGreeting
''Value:'' text to speak when the program is first started
This string is used as input to the text-to-speech engine when the program is first started. If you change this to the empty string (do not remove the entry), the spoken startup greeting is suppressed.
!Dome Slaving Interval
This sets the interval at which dome slaving checks the telescope position and, if needed, repositions the dome. The default is 10 seconds. If this value doesn't exist in the registry, create it. It is a ''string'' (~REG_SZ) value!
''Key:'' Dome
''Name:'' ~SlavingInterval
''Value:'' interval (sec)
!Weather Check Interval
This sets the interval at which ACP checks the weather safe/unsafe condition. The default is 5 seconds. If this value doesn't exist in the registry, create it. It is a ''string'' (~REG_SZ) value!
''Key:'' General
''Name:'' ~WeatherInterval
''Value:'' interval (sec)
!Pointing Model Folder
This is the folder in which ACP looks for the active pointing model file Active.clb, and also the default folder used in Load Model and Save Model As... This belongs to the local user, because web users have no access or use to this info.
''Key:'' ~UserData\local_user
''Name:'' ~ModelDir
''Value:'' full model file folder path
----
!Critical Changes:
The following critical changes may affect the way you use ACP:
#If you are upgrading from ACP 4.x, see the critical changes for 5.0, they are important.
#~FocusMax 3.4.1 or later is now required. It is available on the ACP Home Page in the left margin.
#If you use ACP's auto-calibration feature, the uncalibrated images will be saved with a name "Raw-xxxx". Be aware of this, as it increases disk space requirements. You can disable this with a simple edit to ~AcquireSupport.wsc.
#The observatory is now immediately released for web users on script completion. This was done to prevent users from needlessly tying up the observatory, however it does allow another user to jump in and lock the observatory before the first user starts another run.
#Autoguider start/resume failures no longer end the run. Instead, imaging continues unguided. This was done to prevent passage of "small clouds" from ending a run. Be aware that you may get images with unusable tracking, so you need to check your images to make sure they were guided and discard those that were not.
#The Web interface files author.html and index.asp have been updated. If you customized the web UI, the installer saved a copy in ACP\~WebDocs\~UpgradeSavedContent. Your existing web UI should work fine, but you'll notice some weird stuff at the beginning of error responses from starting runs. If you steal the ~PostFormPlugin item from the new content and use it in your content, you'll get the ~LightBox alerts too.
!Product Improvements
#The ~PinPoint 5.0 engine is now included. ~PinPoint 5 has improvements in plate solving speed and reliability as well as a new robust FWHM measurement feature (see below, adaptive autofocus).
#Adaptive Autofocus, which has been a disappointing feature, is now all-new. It uses the ~PinPoint 5 FWHM measurement feature and no longer relies on ~MaxIm DL's HFD measurement. Along with this, the autofocus logic in general has been refactored and smoothed out. A side effect is that FWHM in arc seconds is reported in logs following plate solutions. HFD is no longer reported for images, only for the result of ~FocusMax focus runs.
#A new directive ''#autoguide'' has been added. This will force the next target's images to be autoguided regardless of the exposure duration. It will force autoguiding whether the existing ACP Enable Autoguiding preference is on or off.
#It is now possible to control the pre- and post-flip timing margins via a new config file ''~FlipConfig.txt''. This is now described in ACP Help, including the usage of negative flip margins to optimize auto-flip for mounts that will track past their westbound flip point. The German Mount Flipping page has been updated to include information on this.
#It is now possible to control the amount of time reserved for auto-focus by ACP's auto-flip via the new file ~FlipConfig.txt. This is now described in ACP Help. The German Mount Flipping page has been updated to include information on this.
#Twilight flats now have ~ROT_PA in their FITS headers if a rotator is in use.
#When an image is auto-calibrated by ACP (~Auto-Cal preference or #calibrate directive), the original uncalibrated image is saved with a name "Raw-xxxx". You can disable this with a simple edit to ~AcquireSupport.wsc.
#ACP now automatically releases the observatory for web use at the end of any script. This helps prevent people needlessly tying up the observatory.
#Running a plan from the web interface (Multiple Objects, Observing Plan) now allows starting the plan before dusk and with the dome shutter closed. This permits plans to start in the afternoon and sequence shutter opening and cooler chilling.
#The Rotator control applet now has separate controls for guiding polarity and rotation reversal. This provides increased flexibility in setting up various guiding systems.
#The ~TargetStart() custom user action can now return a value of 2 to indicate that the current target is to be skipped (instead of ending the run). This was done for the Puckett Supernova Search to pause for re-shoots in the middle of a run.
#The catalog selector now reflects the new catalog types supported by ~PinPoint 5: the USNO B1.0 and NOMAD. Either can be set to retrieve reference stars over the internet, and the B1.0 can be set to access a local disk-resident 80 Gigabyte catalog.
#Autoguider startup failure, or failure during repeat sequences, no longer ends the run. Instead, imaging continues unguided for the current exposure, and the guider will be re-started for the next one. This was done to prevent passage of "small clouds" from ending a run. Be aware that you may get images with unusable tracking, so you need to check your images to make sure they were guided and discard those that were not.
#Autoguiding re-starts are more robust now. If, during a filter sequence, the guider is found to have stopped, a pointing update is done (for internal guiders) and an attempt is made to restart it. If that fails, another pointing update is done (for internal guiders) and another attempt is made to start it. If all of this fails, imaging continues unguided (see previous item).
#An updated USNO ~NOVAS-COM Vector Astrometry component is installed if needed. It has new ~Delta-T tables and a small correction to the z-vector of the Position Vector object.
#For safety, ACP now forces tracking off after any script runs, if the script is run from the web.
#If Scope Clears Closed Dome is set, the automatic shutter close on scope park will now take place without waiting for the scope to park, making response to weather safety events faster. The dome will start closing almost immediately. Another vote against roll-offs which don't clear the scope in unattended remote situations! Help for Dome Control has been updated to reflect this new feature.
#A default ~ACP-Weather script is now included. It simply parks the scope, relying on Dome Preferences "Close and park/home when scope is parked by script" to close the shutter and park/home the dome. Weather help has been updated for this new feature.
#The web user interface Single target forms now immediately report a "below the horizon" error. This is popped up in a ~LightBox (see next item).
#Many problems when starting a run from the web forms or starting a plan from the web are now reported in a popup ~LightBox alert.
!Bug Fixes
#Relative paths given with the #dir directive now work as documented.
#Pointing images no longer call for HFD calculation, in fact, ~MaxIm's HFD is never used due to new FWHM based adaptive autofocus.
#Weather safe/unsafe is now monitored in its own timer. This fixes the bug where weather could not interrupt a running script if "disable slew during image download" option was turned on. A side effect of turning on that option is the complete cessation of refresh/poll timer activity in ACP (to minimize CPU effects on flaky CCD imagers). With its own timer, the weather check is never disabled.
#The Preferences form has been corrected to use explicitly the words "true" and "false" in the registry, preventing problems on non-English systems.
#The web server now properly sets an ancient Expires: header on responses, preventing caching problems when used with systems whose local time is slightly behind that at the server/ACP end.
#Auto-flip logic has been substantially rewritten, including fixing the lead time calculation (which was incorrectly using the autofocus time instead of the image time). The result is a much simpler and robust logic. lead time is separately checked for a periodic or adaptive autofocus that may have come due, then again for the upcoming image that may follow an autofocus. This way, the lead time is no longer ever the sum of those times.
#Logic to prevent slew-ahead (after taking image) if scope doesn't clear closed shutter has been fixed.
#A compact format #dark target consisting of a mixture of zero (bias) and non-zero (dark) image durations is now executed properly.
#Bias exposures no longer produce voice output. The rapid-fire timing of bias frames was causing the voice to get way behind the action.
#Slew completion is now positively checked after an auto-focus slew-back.
#Tracking is now turned off for #chill, #domeopen, and #domeclose.
#The plan compiler has been fixed so it no longer compiles -00:xx:xx into a positive number.
#The plan compiler now compiles comet elements properly.
#The plan compiler now permits #dawnflats and #shutdown to be in the same plan. This was already supported by ACP 5.0, where a #shutdown would be passed to ~AutoFlat via the sequence token, eliminating the need for #dawnshutdown in the flat plan.
#The plan compiler nas been fixed for short-format #bias. All intervals in the image set are set to 0 now instead of just the first.
#The ~FocusMax version check now looks at the Version property, and requires 3.4.1 or later (as required for ~PinPoint 5).
#Script ending no longer unslaves the dome if it happens to be slewing at the time the script ends. Script end no longer issues a Halt to the dome.
#~AutoFlat now properly deals with filter names containing spaces.
#The exposure timing loop has been refactored and now includes checks every 10 seconds for image completion even in the "pre-wait" loop. Hopefully, this light activity with ~MaxIm won't disturb flaky CCD imagers.
#If autoguiding is disabled in preferences, the plan compiler now generates an error on #afinterval.
#If an #autofocus starts the plan, yet ~AutoFocus preference is off, a needless post-focus pointing update is no longer done.
#During shutdown, cooler warm up now quits if the cooler hasn't reached +5 deg. C after 20 minutes. It is assumed that it's too cold for that.
#AO recalibration rotation tolerance has been increased from 1 degree to 15 degrees.
#The web UI's Multiple Objects Plan form has been fixed so that navigation from a sub folder to the top-level plans folder now works.
!Known Issues
#Just prior to release, a conflict was discovered with the new Internet Explorer 7 only when using it locally on the same system as ACP (remote users can use ~IE7 with no problems). Specifically, ACP can crash and exit due to hard errors in the new ~JScript 5.7 script engine that comes with ~IE7. Until we can resolve this, @@color:#ff0;we suggest you do not upgrade ~IE6 to ~IE7 on your observatory/ACP system@@. If you already have upgraded, try uninstalling ~IE7. Be sure to set a System Restore Point before doing so, as we have reports of uninstalling ~IE7 destabilizing the system. If you'd rather not uninstall ~IE7, you can try using the free ~FireFox browser when running the web interface in the observatory. Or just run your plans the old fashioned way using the ACP control system interface. As soon as we can resolve this issue, we'll release a free update if needed (though it may be resolved by an ~IE7 service pack).
#The built-in FTP server can, under as yet unknown conditions, slow down the rest of ACP such that images may take longer than they should. Until we get this issue resolved, we suggest you do ~FTP-based downloading of images during non-observing times. If you need to do mass downloading of images (best done with FTP) during observing times, we suggest turning off ACP's internal FTP server and using one of the free Windows FTP servers such as ~FileZilla or Golden FTP Server (free version) on the ACP system. You will have to set up accounts for your users separately, and we strongly suggest you give them access only to their own images folder and subfolders! The internal FTP server is based on a 3rd party engine and we are working with the vendor to identify the problem. We hope to have a fix in the next release.
#The Stop Dome Motion button of the Dome Control panel, the Stop Slew button, and scripted slew aborts may all fail to stop shutter opening/closing. This is not an ACP bug, but a problem with the Dome driver. It should stop shutter motion on a Dome.~AbortSlew call. But the Dome specification is not clear on that, thus most drivers don't do this. There is no defined call in the driver spec for stopping shutter motion.
#Clicking on ACP while it is waiting for ~MaxIm or a telescope driver will sometimes cause a fatal runtime error in ACP "It is illegal to call out while in a message filter". This appears to be unavoidable under some circumstances, and is a quirk in the Microsoft Component Object Model inter-process messaging stuff. Moral: Don't click around or use your observatory computer for other stuff while doing a run.
#The console display shown on some web pages is too big for 640 x 480 screens or when the browser is set for large type sizes. I don't want to shrink the console any more. I may move the buttons to the top of the console blue box, though. The best thing is to reduce the browser font size to 'smaller' or whatever.
#If ~MaxIm DL fails, ACP will fail with an Automation Error. This is also true of any other ~EXE-based object server that may be in use.
!Uninstalling the program
This program supports the standard Windows uninstall system. Locate the program name in the Add/Remove programs control panel and click the Add/Remove button. After the process completes, you may remove any files that may be left in the installation directory (for example, files you may have created there are not removed by uninstall). @@color:#ff0;Warning! Everything, including configuration settings, is removed when you uninstall!@@
Microsoft Agent is not designed to be uninstalled. It is considered a part of the operating system, and is delivered as a standard part of Windows 2000 and later.
----
!The following changes may affect the way you use ACP:
#The main image acquisition script is now ''~AcquireImages.js'' (not .vbs). This new script contains many of the new features and improvements in 5.0. Select this one for running ACP observing plans. This change is transparent to web users, as they don't see the script name anyway.
# ''#shutdown'' no longer immediately stops the plan; it causes shutdown when the plan ends. Thus, it may appear anywhere in a plan. __This is changed behavior__.
# ''#shutdown'' now carries into ''#dawnflats'', so it is no longer necessary to have a separate #DAWNSHUTDOWN directive in your flat plan. __This is changed behavior__. If you currently rely on ''#shutdown'' not affecting dawn flats, you will have to change the relevant plans.
#ACP now supports auto-resume. If the plan is interrupted, and later you you re-use the plan, it will automatically start where it was interrupted. __This is new behavior__. To start the plan from the beginning, update ''#startsetnum'' directive to the starting set number you want, then remove the ''#completionstate'' directive from the plan.
#Dark and Bias frames are no longer rolled 180 degrees if taken when the GEM is on the east side looking west and auto-rollover is in effect. The mount position should never affect the orientation of cal images. Flats were never rolled over.
#Filters must now be specified by name, numbers will no longer work. This was done to maximize the portability of plans across different observatories.
# ''#stack'' and ''#stackalign'' have changed meaning. They now cause images in each group (filter) of a filter group to be stacked. See Sets, Repeats and Filter Groups .
#If you are using ~UserActions.wsc, you will have to modify the ~TargetStart() and ~TargetEnd() functions. The parameters passed have changed, and ~UserActions for ACP 4.2 or earlier will not work.
----
!Updated
The Rotated Guiding engineering paper has been updated to relfect the lessons learned with AO and off-axis guiding, as well as to correct a few errors in terminology. In the preface to the previous version, Bob says, "Here's the paper I wrote as part of the AO/rotator testing and analysis I did at New Mexico Skies. As I wrote this, Mike Rice's 24" f/10 RC was tracking beautifully, with tiny bumps every few minutes. I have successfully checked out my idea of avoiding AO calibrations altogether at 8 position angles. The results are the same as an actual calibration at those angles, but it is based on the PA and not an actual calibration. My test on a GEM made me realize that a GEM on the east side of the pier (looking west) has the same declination sense as a simple/fork mount. I have corrected and clarified this in the final paper, which is shown here."
<<miniBrowser hideControls RefDocs/RotGuidePaperMay2009[1].pdf>>
*See also this more technical article by [[Thierry Legault]]
----
<<miniBrowser hideControls http://www.astromart.com/articles/article.asp?article_id=548>>
----
<<miniBrowser hideControls http://cas.sdss.org/dr5/en/tools/chart/chart.asp>>
----
<<miniBrowser hideControls http://simbad.u-strasbg.fr/simbad/>>
----
@@color:#0f0;You're now at the point of having a new, updated ''Author.html'' file that contains the necessary parts to view a webcam image. It's almost ready to go.@@
----
1. Close the authoring environment tabbed window. If a message pops up worrying that you haven't saved the current window, go over and click on "save to web" - then close the authoring environment.
2. In the normal ACP web GUI, reload the page. This causes ACP to compile the Author.html document you just revised into the index.asp document it normally serves up when you access the web GUI. If you don't reload the page, you'll get the old, un-updated version of index.asp.
3. In the Main Menu, find your link to "Observatory Webcam" in the Observatory Info section and click on it. If everything's okay, the ~WebcamViewer window will open, and the webcam view of the observatory should appear in a mini-browser window.
----
^^Additional information Copyright © 2008-<<today YYYY>>, Richard A. Berg, Washington, DC^^
@@color:#0f0;This is the longest and most difficult part of the modification. Read through the steps first, then make the changes. Remember, you can always undo it all by copying back the two files you saved.@@
----
1. Open up the web browser interface to ACP - the one you would normally use to run plans, etc. You can do this during the day. You do not need to connect the camera or the telescope to make the modifications.
2. In the bottom block of the Main Menu (left side), open the Toolbox, and click on "Authoring System". If you're not an administrator, you won't see this link. I like to open this in a separate tab, although that's not necessary.
3. In the authoring window, make sure the right sidebar is exposed - it may default this way for you, or you may need to click on the "side-bar <<" label in the toolbar of the System Status window.
4. Click on the "options >>" label; make sure you have your author name, username and password in place - you need this to be able to save changes. When it's righ, you can click on the "options >>" to close that little section (or not).
5. On the tabs in the right sidebar, click on "All." Scroll down to "~MainMenu" and click on it. A new window will open in the middle,and it will look just like the real Main Menu next to it. In that window's toolbar, click on "edit". The toolbar may no