Here is a 3D version with color specrogram showing th ~2.6 days period and the emission evolution:
Substracting the first spectrum, this similar graph focus on the emission only:
Personal blog of my astronomical work, specially done at my private Observatory of the "Belle Etoile" named like this from a mountain peak in the french Alps, not too far from the observatory.
/////////////////////////////////////////////////////////////////////////////////
// //
// OTZ_Auto - Script to observe automatically (c) Olivier Thizy //
// //
/////////////////////////////////////////////////////////////////////////////////
//
// Some specificities to equipment used:
// -Losmandy Titan mount (upgraded witrh Maxxon motors & Germini 2 in 2019)
// Connected through Gemini.Net + POTH (mandatory for PRISM to work properly) with 2.5sec regular readout (idem)
// -echelle spectrograph with Velmann board to control calibration lamps
// -observing bright Be star as primary (only!) focus
// -Atik 460ex for spectra acquisition
// -Zwo ASI174MM (was Atik Titan) for guiding
// -Dome (controled by Dome Tracker)
// -RoboFocus
//
// Brief description of the algorythm:
// -I wait for the Sun to be below some limit (bsed on experience)
// -First I create my night's directory, copy/paste my usual CALIB files (master darks, current version of script...).
// -I connect my equipment (note that I usually switch my Power Manager ON manually because it's not stable,
// I also connect my cameras and my telescope manually because PRISM/ASCOM seems to be unstable there.
// -I lower the temperature of the main camera and wait for the Sun to be at a certain elevation.
// -I acquire (if necessary) my calibration frames for the night: a long serie of Tungsten for the blaze of the echelle spectrum,
// three LED to get the geometry of the echelle orders and three Thorium-Argon for wavelength calibration
// -I wait for th Sun's elevation to be at the level that allow observation to start
// -I load my catalog file which is created by an Excel spreadsheet where I import BeSS robot file;
// in a nutshell, the catalog file lists my ~200 Be stars targets with catalog name for PRISM to use, magnitude
// (used to calculate the guiding exposure time), the BeSS priority based on required observing period and last observation date
// (I also take into account if I have observed it myself as BeSS takes time to be validated/updated sometimes),
// a bonus priority for my favorite targets or current hot targets, individual exposure time and number of exposure to acquire.
// -Then I enter a loop for the night:
// >based on telescope position, and excluding targets below minimum elevation (40°), crossing the meridien at mid exposure
// (I always observe in the East part of the sky) and below a DEC limit (just because my pointing accuracy there is lower),
// I select my next target (of course, one that has not been observed that night so far)
// >I point the telescope to the target, wait for the dome, center target (brightest star) and then start the autoguiding
// (if no star is found, I try an astrometry and if not possible then I wait 5min with telescope tracking stopped)
// >then I start the exposure until the target is crossing the meridian or I reach the required number of exposures
// or if the Sun elevation if above the limit to end the observations --> then I go to the end of Session
// >and I loop to go to the next target...
// -End of Session: I stop telescope, I close the dome, I increase the temperature of the main camera, I close all equipment
//
// After a session, I reduce all my spectra using ISIS, the clean up all the intermediate files, create an archive and a ZIP file with
// all my spectra to upload them in BeSS database... and I wait until the sky is clear for next session!
// BUGS / ROBUSTNESS (TO DO)
// ------------------
// -improve mechanical holder for the dome sensor (ie: spring to be improved)
// -Goto with WaitForDome option failed sometimes: removed from script for now / to be checked
// -replace USB by LAN gembird: hardware ready when needed, not critical for now
// -pb with telescope connexion (hardware?): done manually for now, to check again ?
// -pb with Zwo ASI that sometimes freeze (USB link to improve?)
//
// WEATHER MANAGEMENT (TO DO)
// -------------------
// -rain detection -> wiring to dome tracker + software test to stop telescope & close everything else
// -calibrate Sentinel cloud sensor: seems very difficult to find the righ parameters, need more work on this
// -wait for good weather: tested but failed; need to be improved
// -check weather: pause
// -multiple pause: close equipment
// -sentinel relay script activation
//
// IMPROVEMENTS (TO DO)
// -------------
// -when a target not found, skip it (could try later? limit to 3 retries total?)
// -add list of targets done during last few nights to add to BeSS priority calculation (to limit same target several nights)
// -automated ISIS data reduction with Actiona external tool
// -at the end creates a simple web page with guiding image, last ARASBeAm spectrum graph and our Halpha graph
// -catalog of bright isolated stars or astrometry on the field
// -goto with star hopping or astrometry on the field
// -improve simulator mode to take into account elevation & distance to meridian at time of observation (targets.txt mode)
// -add management of star to Synch at the end of a session to "park" scope
// -split start & calib & directory setup
// -search for object$ to avoid local/global variables
// -add the ability to do calibration at the end in case weather is bad at the beginning of the session
// -check disc space at the beginning
// -add to the ARASBeAm priority calculation my own observations (not validated in BeSS yet) to avoid always doing the same targets
// -add fainter target with an astrometry mode
//
// REVISION HISTORY (WHAT HAS BEEN DONE)
// ----------------
// -05/08/2018: first "stable version", target list inside script, some bugs (telescope connexion, USB Gembird, first autoguiding).
// Lack weather management, good target catalog, star hopping method for large GoTo, etc... some comments in french.
// Based on brightest star in the field, very specific to my own equipment. 60 Be stars spectra (Halpha) acquired so far with the script.
// -15/08/2018: add printed info when star lower than HauteurMin; read targets from an external text file; simulation & total exposure time calculation
// Some functions to read a Be star catalog with BeSS priorities, my own priorities & calculate a weight to sort stars by interest. Seems to work ok.
// -19/08/2018: fix of the displayed hor angle (calculated on target and not from telescope position)
// -09/09/2018: automatic check if calibration is done; simulation removed (always done, user can stop script if he wants),
// calibration, goTo and download time added in time for session calculation, directory naming/creation done at beginning
// -15/09/2018: first test of automatic target finding based on catalog file (BeSS priorities still manual),
// elevation of the Sun calculated for end of acquisition (not begining), if object$ is not recognize: skip target,
// automatic guiding exposure based on Vmag, automatic scheduling based on priority & time allocation
// -17/09/2018: correct end of night bug with Sun's elevation calculation on limit hour angle calculation
// -27/09/2018: fixed starDeltaRA calculation when telescope close to 24h, fixed AngleHor calculation in CheckStarCatalogForVisibility
// -07/10/2018: fixed end of observersion date and add DateFrac test (Sun elevation after midnight!)
// -09/10/2018: improve stop observing time Vs begin time to avoid trying to observe too late...
// -23/10/2018: limites après méridien fortement diminuée pour éviter les pertes de GoTo
// -15/02/2019: alphaplus=alpha+0.005 (au lieu de -0.005 avant) pour améliorer le pointage
// -02/06/2019: modifications following Gemini 2 upgrade; no pointing model in Gemioni 2 or PRISM for now...
// -03/06/2019: adding AskForManualAutoGuiding option as it doens't work in PRISM with new ATIK drivers !!!
// Removing of recentering of the brightest object in the field as it doesn't work anymore in PRISM with latest update :-(
// -16/06/2019: replacing Atik Titan by Zwo ASI 178MC guiding camera
// -22/06/2019: replacing guiding camera by a Zwo ASI 174MM, added several comments & cleaning the script file
// -23/06/2019: added SHIFT_TELESCOPE to recenter the target and it works!!!
// -24/06/2019: added a two steps approach for GoTo & reecentering (due to a bug in PRISM/POTH/Gemini.Net chain somewhere...)
// Add couple of log files with stats
// -30/06/2019: switched to OTH_Catalog2 with MyName added (target list name with spaces). Checked several bugs that I can remove:
// >sometimes fails at first autoguiding, root cause not found yet, didn't happend with Zwo ASI174 so ok...
// >end of night, dome disconnected? didn't happend for long time now? seems OK...
// >at end of the night it doesn't stop early enough, need to revisit how scheduler works: better since early 2019 - ok...
// >sometimes it tries to go to a target but it is too close to meridian, loosing 5min each time (improved in eartly 2019) - ok...
// >stop telescope tracking while waiting for next target, done ok
// -07/07/2019: added an astrometry search in case target is not found (to be improved to gain time)
// >catalog file read for each target (so can be modified even when script is running)
// >if star is already close to the fiber hole, no need to recenter it so skiping it then
// -13/07/2019: BINNINGREDUCE (instead of SCALE) 4x4 for BRIGHTEST_STAR
// >add FIND_ALLSKY_POSITION (with binning 2x2) when star not found
// -14/07/2019: Move astrometry search at beginning of each target GoTo
// -17/07/2019: move back to brightest star in the field as astrometry isn't reliable yet... Pb with Gemini.Net more than PRISM scripts at the moment...
//
//
/////////////////////////////////////////////////////////////////////////////////
print "OTZ_Auto: (semi)automatic observation script (c) Olivier Thizy"
print "Version of 17/07/2019"
// Key debug/temporary parameters to control manual interventions...
// Note: for full automated observations all parameters should be to FALSE except ExposureCloudFactor which should be 1.0 (1.6 works fine too)
TRUE=1
FALSE=0
// ExposureCloudFactor: set to 1.4 but increase up to 3.0 if sky is cloudy (will increase guiding image exposure time)
ExposureCloudFactor=2.0
// CheckIfPowerManagerIsOK: set to TRUE to make a double check of the Power Manager as USB isn't always working properly
CheckIfPowerManagerIsOK=FALSE
// ConnectTelescopeManually: set to TRUE if you want to connect manually telescope/equipment in prism
ConnectTelescopeManually=FALSE
// RequestManualInitialSynch: set to TRUE if you want to manually synch telescope to first star
RequestManualInitialSynch=FALSE
// UseTargetFile: set to TRUE to use targets.txt file for the targets; otherwise script will use catalog to find automatically next target
UseTargetFile=FALSE
// SkipCalibration: set to TRUE if you do not want to look for calibration frames (and acquire them), alternative is to have a dummy "ref_thor-3.fits" file
SkipCalibration=FALSE
// AskForManualAutoGuiding: set to TRUE if you want to start & end autoguiding manually
AskForManualAutoGuiding=FALSE
// Allow for astrometry calibration to reynch in case star not found ?
AllowAstrometry=FALSE
// OpenDomeManually: Set to TRUE if you want to open dome manually (to make sure weather is OK when ready for observations)
OpenDomeManually=TRUE
//
// General parameters
//
TWOPI=2*PI
// do not point telescope past meridian
AngleHorMin=0
// minimum elevation = do not observe below... (in °); usually 40° for me
HauteurMin=45
// Maximum distance for next target (in degrees)
MaximumStarDistanceToTelescope=45.0
// Maximum DEC for targets
MaximumStarDEC=48
// parameters for guiding camera ASI174MM:
// fiber position
GuidePosX=897.5
GuidePosY=541.7
// image will be reduce by 4 in each axis to do the search for brightest star (speed up processing time)
Facteur=0.25
GuidePosXFact=897.5*Facteur
GuidePosYFact=541.7*Facteur
// scale for the pixel size, important to adjust the RA/DEC shift to center target to the fiber tip
EchelleXFact=0.46311/Facteur
EchelleYFact=EchelleXFact
EchelleXFactAstro=0.46311*2
EchelleYFactAstro=EchelleXFactAstro
MinDynamiqueAutoguidage=700
MaxDynamique=65000
// max Observed Minus Calculated, see result when doing manual centroid, usually MaxOMC=2000 works better than 900...
MaxOmC=2000
PSFMin=2
// not sure if I need to *Facteur there or not...
DemLargFenCentro=28
ZoneRecherche=DemLargFenCentro+1
// for ASI174MM in full frame bin 1x1 (image : 1936x1216)
GuidingExpFactor=2
GuidingDelayACQSec=10
GuidingCentroSize=25
GuidingStarThresADU=100
GuideXMax_2=200
// For astrometry search...
GExpTimeAstrometryChamp=45000
CatalogAst$="UCAC 2/3/4"
ChemCatalogAst$="D:\UCAC4\u4b\"
MaxStarImg=40
MaxStarCat=120
FieldAllSky=1
// For Atik 460ex camera, cooling in 16 minutes to -10°C (winter) or 0°C (summer) seems enough
minutestogodowntotemp=16
Detectortemperature=0.0
// Elevation of the sun at which we start the instrumentation (degrees converted to radians)
// I usually start equipment when Sun is below 0°, start calibration when below 4° in order to start observing when below -8°
Summer=TRUE
Season=Summer
if Season=Summer then
elevsunstartinitnight_Deg=-2.0
elevsunstartbegnight_Deg=-5.0
elevsunstartobservations_Deg=-8.0
elevsunstopobservations_Deg=-11.0
elevsunstopgoto_Deg=-13.0
else
elevsunstartinitnight_Deg=-1.0
elevsunstartbegnight_Deg=-4.0
elevsunstartobservations_Deg=-9.0
elevsunstopobservations_Deg=-9.0
elevsunstopgoto_Deg=-11.0
endif
// CCD numbers
GuidingCamNumber=1
AcqCamNumber=2
// difference between local time and UT
deltaUT=-1
// time (in milliseconds) to wait after GoTo so dome can be synch' with telescope
if AskForManualAutoGuiding=TRUE then
WaitForDomeTime=5000
else
WaitForDomeTime=90000
endif
// Sentinel weather station parameters
LimitTempCiel=-100.0
LimitMagnitudeCiel=-100.0
ValMinBelleMeteo=5
// Root directory for acquisition. Contains CALIB with catalog files & directory will be created there for each new night
//RootDirName$="D:\Acquisitions\"
RootDirName$="C:\Users\ObsBE\Documents\Acquisitions\"
// Catalog filenames
StarCatalogFileName$=RootDirName$+"CALIB\OTH_Catalog2.txt"
// Log file where exposure results will be added
ObjectLog$=RootDirName$+"CALIB\elog_objects.txt"
StatsLog$=RootDirName$+"CALIB\elog_stats.txt"
// GoTo TestCatalogFunctions:
// Check if calibration has been done already or not
GoSub CalculateNightDate:
File$=sDirSave$+"ref_thor-3.fits"
FileExists File$ StartAndCalibDone
if UseTargetFile=TRUE then
// Reading Target list
Now Date
Datetostr Date Date$
print "[" Date$ "] Reading 'targets.txt' file"
DirTargetList$="C:\Users\ObsBE\Documents\Acquisitions\CALIB\targets.txt"
Open_FileTxt_For_Read ObjectTargetFile DirTargetList$
NbTargets=1
ReadFileTXT ObjectTargetFile Target[NbTargets]$
LoopObjectTargetList:
ENDOFFILE ObjectTargetFile resultat
if resultat=FALSE then
NbTargets=NbTargets+1
ReadFileTXT ObjectTargetFile Target[NbTargets]$
GoTo LoopObjectTargetList:
EndIf
// Simulation pf the session
TotalExpTimeForTargets=0
elevsunstartbegnight=elevsunstartbegnight_Deg/TODEG
// Search for date/time Sun is ok to start observation...
Step=0.002
Now DateSessionWillBegin
LoopSearchBegTime:
GETRADECSUN DateSessionWillBegin AlphaS DeltaS sunelevation
if sunelevation>elevsunstartbegnight
DateSessionWillBegin=DateSessionWillBegin+Step
else
goTo EndLoopSearchBegTime:
endif
goTo LoopSearchBegTime:
EndLoopSearchBegTime:
for NumeroObject=1 to NbTargets
Object$=Target[NumeroObject]$
GoSub LookUpObject:
// 240sec for GoTo sequence + 30sec par pose (download)
TotalExpTimeForSession=TotalExpTimeForSession+240+(ExpSec+30)*NbExposure
TotalExpTimeForTargets=TotalExpTimeForTargets+ExpSec*NbExposure
Now Date
Datetostr Date Date$
print NumeroObject "; " Object$ "; " ExpSec "; " NbExposure
next NumeroObject
str TotalExpTimeForTargets TotalExpTimeForTargets$
TotalExpTimeForTargetsMin=(TotalExpTimeForTargets/60)
round TotalExpTimeForTargetsMin TotalExpTimeForTargetsMin
str TotalExpTimeForTargetsMin TotalExpTimeForTargetsMin$
TotalExpTimeForTargetsHours=(TotalExpTimeForTargets/3660)
frac TotalExpTimeForTargetsHours TotalExpTimeForTargetsHoursM
TotalExpTimeForTargetsHoursM=TotalExpTimeForTargetsHoursM*60
round TotalExpTimeForTargetsHoursM TotalExpTimeForTargetsHoursM
TotalExpTimeForTargetsHoursH=TotalExpTimeForTargetsHours-TotalExpTimeForTargetsHoursM/60
round TotalExpTimeForTargetsHoursH TotalExpTimeForTargetsHoursH
str TotalExpTimeForTargetsHoursH TotalExpTimeForTargetsHoursH$
str TotalExpTimeForTargetsHoursM TotalExpTimeForTargetsHoursM$
if TotalExpTimeForTargetsHoursM=0
TotalExpTimeForTargetsHoursM$="00"
endif
if TotalExpTimeForTargetsHoursM<10
TotalExpTimeForTargetsHoursM$="0"+TotalExpTimeForTargetsHoursM$
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] Total Exposure should be: " TotalExpTimeForTargets$ " sec., " TotalExpTimeForTargetsMin$ " min., " TotalExpTimeForTargetsHoursH$ "h" TotalExpTimeForTargetsHoursM$ "."
str TotalExpTimeForSession TotalExpTimeForSession$
TotalExpTimeForSessionMin=(TotalExpTimeForSession/60)
round TotalExpTimeForSessionMin TotalExpTimeForSessionMin
str TotalExpTimeForSessionMin TotalExpTimeForSessionMin$
TotalExpTimeForSessionHours=(TotalExpTimeForSession/3660)
frac TotalExpTimeForSessionHours TotalExpTimeForSessionHoursM
TotalExpTimeForSessionHoursM=TotalExpTimeForSessionHoursM*60
round TotalExpTimeForSessionHoursM TotalExpTimeForSessionHoursM
TotalExpTimeForSessionHoursH=TotalExpTimeForSessionHours-TotalExpTimeForSessionHoursM/60
round TotalExpTimeForSessionHoursH TotalExpTimeForSessionHoursH
str TotalExpTimeForSessionHoursH TotalExpTimeForSessionHoursH$
str TotalExpTimeForSessionHoursM TotalExpTimeForSessionHoursM$
if TotalExpTimeForSessionHoursM=0
TotalExpTimeForSessionHoursM$="00"
endif
if TotalExpTimeForSessionHoursM<10
TotalExpTimeForSessionHoursM$="0"+TotalExpTimeForSessionHoursM$
endif
DateEndSession=DateSessionWillBegin+TotalExpTimeForSessionMin/(24*60)
Datetostr DateSessionWillBegin DateSessionWillBegin$
Datetostr DateEndSession DateEndSession$
print "[" Date$ "] Total session should be: " TotalExpTimeForSession$ " sec., " TotalExpTimeForSessionMin$ " min., " TotalExpTimeForSessionHoursH$ "h" TotalExpTimeForSessionHoursM$ "."
print "[" Date$ "] Session from " DateSessionWillBegin$ " to " DateEndSession$ " (UT)"
Input "WAIT for you to press enter before continuing the script" Dummy$
endif
//
// START & CALIBRATION
//
if StartAndCalibDone=FALSE then
Now Date
Datetostr Date Date$
print "[" Date$ "] Starting Calibration sequence"
GoSub Start_and_Calib:
else
Now Date
Datetostr Date Date$
print "[" Date$ "] Calibration sequence already done"
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] Starting observing sequence"
// Just to test it...
//GoSub BoucleAttendBeauTemp:
// Resynch telescope on delta Her
if RequestManualInitialSynch=1 then
Input "TEST: ensure telescope is synch (& focused ?) near to first target - then press ENTER" Dummy$
else
// Synch sequence for the beginning of the bight - todo
// look for a bright star near telecope position and/or astrometry.net ?
endif
if UseTargetFile=1 then
for NumeroObject=1 to NbTargets
Object$=Target[NumeroObject]$
if NbExposure<>0 then
GoSub TakeObject:
endif
next NumeroObject
else
// Each target will be found with minimum elevation & far enough from meridian
// using a score calculation based on distance to telescope, my own priority and BeSS priorities
// BeSS: Be Star Spectra database
NumeroObject=0
LoopAcquisitionOfTargets:
stoptelescope
Now Date
Datetostr Date Date$
print "[" Date$ "] Reading target star catalog"
GoSub ReadStarCatalog:
Now Date
Datetostr Date Date$
print "[" Date$ "] number of stars in the target list : " numberofstarsintargetlist
// Check Sun elevation before continuing observing next target...
GetStdrLongitude Longitude
GetStdrLatitude Latitude
elevsunstopgoto=elevsunstopgoto_Deg/TODEG
Now Date
GETRADECSUN Date AlphaS DeltaS sunelevation
FRAC Date DateFrac
if sunelevation>elevsunstopgoto
if DateFrac<0.5
Now Date
Datetostr Date Date$
print "[" Date$ "] Sun too high to continue observing"
GoTo EndOfSession:
endif
endif
// Reset sort order & look for next target (not done during the night and highest score)
for Temp_i=1 to numberofstarsintargetlist
sortIndex[Temp_i]=Temp_i
next Temp_i
Now Date
Datetostr Date Date$
print "[" Date$ "] Calculating telescope distance for all star in catalog"
GET_TELESCOPE_POSITION Alpha2000 Delta2000 Hauteur Azimuth AngleHor
RARef=24.0*Alpha2000/(2.0*PI)
DECRef=180*Delta2000/PI
GoSub CalculateDistanceStarCatalogToRef:
Now Date
Datetostr Date Date$
print "[" Date$ "] Checking visibility for all stars in catalog"
GoSub CheckStarCatalogForVisibility:
// Need to add here a function to check when the target has been acquired (cf StatsLog$) to overwrite BeSS priority based on my own observation
Now Date
Datetostr Date Date$
print "[" Date$ "] Sorting stars in catalog"
GoSub SortStarCatalog:
Now Date
Datetostr Date Date$
print "[" Date$ "] Looking for next target..."
GoSub CalculateNightDate:
HasATargetBeenFound=0
for Temp_i=1 to numberofstarsintargetlist
Temp_j=SortIndex[Temp_i]
Temp_Prio=SortCriteria[Temp_j]
// print "Prio=" Temp_Prio " starname number : " Temp_i " is : " starFileName[Temp_j]$ " star RA in decimal : " starRA[Temp_j] " star Dec in decimal : " starDec[Temp_j] " Vmag=" starVMag[Temp_j] " Guiding Exp Time=" starGuideExposureSec[Temp_j] " BeSS=" starWeightBeSS[Temp_j] " MyPrio=" starWeightOTH[Temp_j] " Distance=" starWeightDistance[Temp_j]
if Temp_Prio>0 then
File$=sDirSave$+starFileName[Temp_j]$+"-1.fits"
FileExists File$ TargetAlreadyAcquired
Now Date
Datetostr Date Date$
print "[" Date$ "] Target " File$ "Valid?=" TargetAlreadyAcquired
if TargetAlreadyAcquired=FALSE then
print "[" Date$ "] Target confirmed : " starFileName[Temp_j]$
NumeroObject=NumeroObject+1
Now Date
Datetostr Date Date$
print "[" Date$ "] Next target (#" NumeroObject ") : " starFileName[Temp_j]$ " RA=" starRA[Temp_j] " DEC=" starDec[Temp_j] " Vmag=" starVMag[Temp_j] " Guiding Exp Time=" starGuideExposureSec[Temp_j] " BeSS=" starWeightBeSS[Temp_j] " MyPrio=" starWeightOTH[Temp_j] " Distance=" starWeightDistance[Temp_j]
Object$=starFileName[Temp_j]$
objet$=starname[Temp_j]$
myObjectName$=myobjname[Temp_j]$
GExpTime=starGuideExposureSec[Temp_j]
ExpSec=starExpTimeSec[Temp_j]
NbExposure=starNbExposure[Temp_j]
GoSub GoToTargetAndAcquisition:
File$=sDirSave$+starFileName[Temp_j]$+"-1.fits"
FileExists File$ TargetAlreadyAcquired
if TargetAlreadyAcquired=FALSE then
Now Date
Datetostr Date Date$
print "[" Date$ "] Waiting 5min for a new target to come nearby..."
stoptelescope
DelayBlock 300000
endif
GoTo LoopAcquisitionOfTargets:
endif
endif
next Temp_i
Now Date
Datetostr Date Date$
print "[" Date$ "] No target found, waiting for 5min..."
DelayBlock 300000
GoTo LoopAcquisitionOfTargets:
endif
EndOfSession:
// END OF SESSION
print "-----------------------------------------------------------"
EquipmentClosed=0
// Synch on bet And first
GoSub IsSunStillBelow:
if SunStillBelow=1 then
// Add synchronisation on a star there is needed (not really needed anymore)
else
GoSub endnight:
GoTo EndOfMainSequence:
endif
// Synch on eta Psc then
GoSub IsSunStillBelow:
if SunStillBelow=1 then
// Add synchronisation on a star there is needed (not really needed anymore)
else
GoSub endnight:
GoTo EndOfMainSequence:
endif
FinishScriptHere:
GoSub endnight:
EndOfMainSequence:
// Et message de fin...
Now Date
Datetostr Date Date$
print "[" Date$ "] That's all folks..."
sOutput$=" "
Print sOutput$
sOutput$="DDD OOO N N EEEEE"
Print sOutput$
sOutput$="D D O O N N N E "
Print sOutput$
sOutput$="D D O O N N N EEE "
Print sOutput$
sOutput$="D D O O N NN E "
Print sOutput$
sOutput$="DDD OOO N N EEEEE"
Print sOutput$
sOutput$=" "
Print sOutput$
END
/////////////////////////////////////////////////////////////////////////////////
//
// Goto a target, center object, run autoguiding and acquire spectra
//
/////////////////////////////////////////////////////////////////////////////////
GoToTargetAndAcquisition:
print "-----------------------------------------------------------"
REM Coordonnées équatoriales de l'objet en radians
GETOBJECTCOORD objet$ alpha delta
if alpha=-100
Now Date
Datetostr Date Date$
print "[" Date$ "] Object " objet$ " is not recognized by PRISM !"
return
endif
str alpha alphaRad$
str delta deltaRad$
RAD_TO_RA alpha alpha$
RAD_TO_DEC delta delta$
Now Date
Datetostr Date Date$
PRINT "[" Date$ "] " Object$ " (" objet$ ") is at coordinates :"
PRINT "[" Date$ "] RA : " alpha$ " (" alphaRad$ " radians)"
PRINT "[" Date$ "] DEC : " delta$ " (" deltaRad$ " radians)"
//Longitude du lieu = celle du site par défaut
GETSTDRLONGITUDE Longitude
// Latitude du lieu
GETSTDRLATITUDE Latitude
// Loop to wait for the target to reach proper altitude in the sky
LoopWaitHauteur:
// Date du moment :
NOW Date
// Hauteur de l'objet en radian :
GETHEIGHT alpha delta Date Longitude Latitude Hauteur
// Hauteur en degrés
Hauteur=Hauteur*TODEG
if Hauteur<HauteurMin then
stoptelescope
Now Date
Datetostr Date Date$
print "[" Date$ "] Target too low, elevation at " Hauteur " target: " HauteurMin ")"
DelayBlock 300000
Goto LoopWaitHauteur:
endif
// Look for telescope position at the end of acquisition to check if not past meridian+limit / give 50% margin to allow half exposure...
// TSL pour calculer angle horaire
SIDERALTIME Date Longitude TSL
// Angle horaire objet en radian :
COMPUTEANGLEHOR TSL alpha AngleHor
//Angle horaire en heures décimales:
AngleHor=AngleHor*12/PI
AngleHorEndOfExposure=AngleHor+((ExpSec*NbExposure)/3600.0)/2.0
AngleHorLimit=0.0
// si DEC<45°: 10min supplémentaires
if delta<(45.0/180.*3.1415) then
AngleHorLimit=0.0/60.0
endif
// si DEC<30°: 20min supplémentaires -> 15min
if delta<(30.0/180.*3.1415) then
AngleHorLimit=0.0/60.0
endif
// si DEC<25°: 1h10 supplémentaires -> diminué à 20min par sécurité
if delta<(25.0/180.*3.1415) then
AngleHorLimit=0.0/60.0
endif
// si DEC<6°: 1h45 supplémentaires -> diminué à 30min par sécurité?
if delta<(6.0/180.*3.1415) then
AngleHorLimit=0.0/60.0
endif
if AngleHorEndOfExposure>AngleHorLimit
Now Date
Datetostr Date Date$
print "[" Date$ "] Target at mid sequence will be at hour angle: " AngleHorEndOfExposure " so target skipped"
return
endif
// Pointage ou non ?
If AngleHor<AngleHorMin then
If Hauteur>HauteurMin then
str Hauteur Hauteur$
Now Date
Datetostr Date Date$
print "[" Date$ "] GoTo Target at Elevation : " Hauteur$ "°"
WaitForDome=1
alphaplus=alpha+0.003
deltaplus=delta+0.003
if alphaplus>TwoPI then
alphaplus=alphaplus-2*PI
endif
MoveTelescope alphaplus deltaplus
WaitForEndMoveTelescope
DelayBlock WaitForDomeTime
alphaplus=alphaplus-0.003
deltaplus=deltaplus-0.003
if alphaplus<0 then
alphaplus=alphaplus+2*PI
endif
MoveTelescope alphaplus deltaplus
WaitForEndMoveTelescope
DelayBlock 10000
Else
Now Date
Datetostr Date Date$
print "[" Date$ "] Target too low"
return
EndIf
Else
Now Date
Datetostr Date Date$
print "[" Date$ "] Target too close to meridian"
return
EndIf
Now Date
Datetostr Date Date$
print "[" Date$ "] Telescope at target position now"
// Wait for the dome
//Now Date
//Datetostr Date Date$
//print "[" Date$ "] Waiting for the dome"
//DelayBlock WaitForDomeTime
//Now Date
//Datetostr Date Date$
//print "[" Date$ "] Dome should be at telescope position now"
GoSub CalculateNightDate:
// First do a long exposure and an astrometry to resynch telescope
if AllowAstrometry=TRUE then
Now Date
Datetostr Date Date$
print "[" Date$ "] Acquiring a long exposure and trying an astrometry first"
StartExposure_EX 1 GExpTimeAstrometryChamp
WaitForEndExposure_EX 1
GetLastImageExposure_EX 1 ImgChampToCenter
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+"_astrometry.fits"
SAVEFIT ImgChampToCenter sFullPath$
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+"_astrometry.jpg"
SAVEJPG ImgChampToCenter sFullPath$
BinX=2
BinY=BinX
BINNINGREDUCE ImgChampToCenter BinX BinY
FIND_ALLSKY_POSITION ImgChampToCenter MaxStarImg MaxStarCat FieldAllSky CatalogAst$ Valid
if Valid=TRUE then
GetAlpha ImgChampToCenter AD
GetDelta ImgChampToCenter DC
// STR DC DC$
// STR AD AD$
RAD_TO_RA AD AD$
RAD_TO_DEC DC DC$
Now Date
Datetostr Date Date$
print "[" Date$ "] Astrometry OK, resynchronizing telescope at RA=" AD$ ", DEC=" DC$
// Check if I was close enough to the target and GoTo again if necessary
DeltaADPixel=3600*180*(alpha-AD)/(PI*EchelleXFactAstro)
if DeltaADPixel<0 then
DeltaADPixel=-DeltaADPixel
endif
DeltaDCPixel=3600*180*(delta-DC)/(PI*EchelleYFactAstro)
if DeltaDCPixel<0 then
DeltaDCPixel=-DeltaDCPixel
endif
AmICloseEnough=FALSE
MarginMax=(GuideXMax_2-ZoneRecherche)
if DeltaADPixel<MarginMax then
if DeltaDCPixel<MarginMax then
AmICloseEnough=TRUE
endif
endif
STR DeltaADPixel DeltaADPixel$
STR DeltaDCPixel DeltaDCPixel$
if AmICloseEnough=TRUE then
Now Date
Datetostr Date Date$
print "[" Date$ "] Telescope close enough to target (dX=" DeltaADPixel$ ", dY=" DeltaDCPixel$ ") so skipping a new GoTo now"
else
Now Date
Datetostr Date Date$
print "[" Date$ "] Telescope too far from target (dX=" DeltaADPixel$ ", dY=" DeltaDCPixel$ ") / GoTo target again"
alphaplus=alpha+0.003
deltaplus=delta+0.003
if alphaplus>TwoPI then
alphaplus=alphaplus-2*PI
endif
MoveTelescope alphaplus deltaplus
WaitForEndMoveTelescope
DelayBlock 10000
alphaplus=alphaplus-0.003
deltaplus=deltaplus-0.003
if alphaplus<0 then
alphaplus=alphaplus+2*PI
endif
MoveTelescope alphaplus deltaplus
WaitForEndMoveTelescope
DelayBlock 10000
endif
else
Now Date
Datetostr Date Date$
print "[" Date$ "] Astrometry didn't work"
endif
CLOSE ImgChampToCenter
endif
// if AmICloseEnough=TRUE then
// Now Date
// Datetostr Date Date$
// print "[" Date$ "] and no need to search for brigthest star"
// else
// Centering the brightest star on the consign (fiber hole) position
GExpTimeMilSec=GExpTime*1000
GExpTimeChamp=GExpTimeMilSec*5
StartExposure_EX 1 GExpTimeChamp
WaitForEndExposure_EX 1
GetLastImageExposure_EX 1 ImgChampToCenter
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+"_tocenter.fits"
SAVEFIT ImgChampToCenter sFullPath$
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+"_tocenter.jpg"
SAVEJPG ImgChampToCenter sFullPath$
Now Date
Datetostr Date Date$
print "[" Date$ "] Looking for beightest star in the field"
BinX=4
BinY=BinX
BINNINGREDUCE ImgChampToCenter BinX BinY
// Alternative to limit number of stars to look for: BRIGHTEST_STAR2 Img SeuilMin SeuilMax OmC PSFMin DemiLargeur SearchField MaxPoints Xcentro Ycentro
BRIGHTEST_STAR ImgChampToCenter MinDynamiqueAutoguidage MaxDynamique MaxOmC PSFMin DemLargFenCentro ZoneRecherche XGuideCentro YGuideCentro
if YGuideCentro<0 then
XGuideCentro=-1
endif
if XGuideCentro<0 then
Now Date
Datetostr Date Date$
print "[" Date$ "] Star not found... Skipping target for now"
CLOSE ImgChampToCenter
return
endif
str XGuideCentro XStar$
str YGuideCentro YStar$
Now Date
Datetostr Date Date$
print "[" Date$ "] Star found at position (taking into account 'Facteur') " XStar$ ", " YStar$
str GuidePosXFact GuidePosX$
str GuidePosYFact GuidePosY$
// margin (GuideXMax_2-ZoneRecherche)
MarginX=(GuidePosXFact-XGuideCentro)
MarginY=(GuidePosYFact-YGuideCentro)
if MarginX<0 then
MarginX=0-MarginX
endif
if MarginY<0 then
MarginY=0-MarginY
endif
if MarginX<MarginY then
Margin=MarginY/Facteur
else
Margin=MarginX/Facteur
endif
MarginMax=(GuideXMax_2-ZoneRecherche)
if Margin<MarginMax then
Now Date
Datetostr Date Date$
print "[" Date$ "] Taget close to fiber, no need to center it and go to autoguiding directly"
else
Now Date
Datetostr Date Date$
print "[" Date$ "] Centering at Fiber position at (incl. Facteur) " GuidePosX$ ", " GuidePosY$
// OFFSET_TELESCOPE ImgChampToCenter XGuideCentro YGuideCentro GuidePosX GuidePosYDecale
GET_TELESCOPE_POSITION RA2000 DEC2000 Haut Azi AHor
// str RA2000 RA$
// str DEC2000 DEC$
RAD_TO_RA RA2000 RA$
RAD_TO_DEC DEC2000 DEC$
print "[" Date$ "] RA2000=" RA$ ", DEC2000=" DEC$
// For some reason I have to substract 14.3 arcsec in my RA position to be OK... ASCOM or Gemini.Net problem ???
AlphaNew=alphaplus-(GuidePosXFact-XGuideCentro)*EchelleXFact/3600*3.1415/180
DeltaNew=deltaplus-(GuidePosYFact-YGuideCentro)*EchelleYFact/3600*3.1415/180
// str alphaplus RA$
// str deltaplus DEC$
RAD_TO_RA alphaplus RA$
RAD_TO_DEC deltaplus DEC$
print "[" Date$ "] AlphaPlus=" RA$ ", DecPlus=" DEC$
str AlphaNew RA$
str DeltaNew DEC$
RAD_TO_RA AlphaNew RA$
RAD_TO_DEC DeltaNew DEC$
print "[" Date$ "] AlphaNew=" RA$ ", Dec.New=" DEC$
print "[" Date$ "] Shifting Telescope (two steps approach)"
// GoTo nearby (to work around a bug in ASCOM / POTH / Gemini.Net)
AlphaNew=AlphaNew+0.003
DeltaNew=DeltaNew+0.003
if AlphaNew>TwoPI then
AlphaNew=AlphaNew-2*PI
endif
MoveTelescope AlphaNew DeltaNew
WAITFORENDMOVETELESCOPE
DelayBlock 2000
// Then GoTo the right position (should be very close to fiber now...
AlphaNew=AlphaNew-0.003
DeltaNew=DeltaNew-0.003
if AlphaNew<0 then
AlphaNew=AlphaNew+2*PI
endif
MoveTelescope AlphaNew DeltaNew
WAITFORENDMOVETELESCOPE
DelayBlock 2000
endif
CLOSE ImgChampToCenter
if AskForManualAutoGuiding=TRUE then
Input "Wait for Dome, Center target and then press ENTER" Dummy$
endif
GExpTimeChamp=GExpTimeMilSec*40
if GExpTimeChamp>60000 then
GExpTimeChamp=60000
endif
StartExposure_EX 1 GExpTimeChamp
WaitForEndExposure_EX 1
GetLastImageExposure_EX 1 ImgChamp
// Sauvegarde de l'image de guidage surexposée (FITS et JPG)
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+".fits"
SAVEFIT ImgChamp sFullPath$
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+".jpg"
SAVEJPG ImgChamp sFullPath$
CLOSE ImgChamp
if AskForManualAutoGuiding=TRUE then
Input "Start autoguiding manually - then press ENTER" Dummy$
else
DelayBlock 5000
// Run autoguiding
TRUE=1
FALSE=0
NumCam=1
CCDNum=1
// GExpTime=0.5
DelayACQSec=GuidingDelayACQSec
WindowSize=GuideXMax_2
CentroSize=GuidingCentroSize
StarThresADU=GuidingStarThresADU
AgressRA=0.7
AgressDEC=0.7
RaMin=3.0
RaMax=GuideXMax_2
DecMin=3.0
DecMax=GuideXMax_2
Backlash=0
CurrentDEC=FALSE
AlarmEnabled=FALSE
DeltaMoveFashion=FALSE
// GuidePosX=291.0
// GuidePosY=213.0
SaveImagettes=FALSE
DirSaveImg$="c:\ccd"
AllFrame=TRUE
WindowAllFrame=400
WaitForScript=60
GExpTimeBis=GExpTime*GuidingExpFactor
str GExpTimeBis GExpTimeBis$
Now Date
Datetostr Date Date$
print "[" Date$ "] Autoguidage ON (ExpTime: " GExpTimeBis "ms)"
STARTGUIDECONSIGNE NumCam CCDNum GExpTimeBis DelayACQSec WindowSize CentroSize StarThresADU AgressRA AgressDEC RaMin RaMax DecMin DecMax Backlash CurrentDEC AlarmEnabled DeltaMoveFashion GuidePosX GuidePosY SaveImagettes DirSaveImg$ AllFrame WindowAllFrame Valid message$
DelayBlock 5000
endif
//str Valid Valid$
//Now Date
//Datetostr Date Date$
//print "[" Date$ "] Valid: " Valid$ " / Status: " message$
/////////////////////
// Acquiring Target
/////////////////////
ExpTime=ExpSec*1000
REM StatWindow Img X1 Y1 X2 Y2 Mean Quadratic_mean Stddev Max Min Flux Median
HaX1=864
HaY1=1710
HaX2=984
HaY2=1722
ContX1=1543
ContY1=1640
ContX2=1588
ContY2=1189
WinPosX=500
WinPosY=100
WinSizeX=1000
WinSizeY=1000
str ExpSec ExpSec$
str NbExposure NbExposure$
sOutput$="Starting sequence for Target: "+Object$+" ("+NbExposure$+" x "+ExpSec$+" seconds)"
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
sOutput$="Target filename: "+Object$
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
GetStdrLongitude Longitude
GetStdrLatitude Latitude
Now Date
Datetostr Date Date$
print "[" Date$ "] Longitude = " Longitude*TODEG " Latitude = " Latitude*TODEG
Now Date
GETRADECSUN Date AlphaS DeltaS sunelevation
Datetostr Date Date$
RAD_TO_DEC sunelevation ElevationS$
GET_TELESCOPE_POSITION Alpha2000 Delta2000 Hauteur Azimuth AngleHor
// TSL pour calculer angle horaire
SIDERALTIME Date Longitude TSL
// Angle horaire objet en radian :
COMPUTEANGLEHOR TSL alpha AngleHor
Hauteur=Hauteur*TODEG
AngleHor=AngleHor*TODEG/15.0
round Hauteur Hauteur
AngleHor=AngleHor*10.0
round AngleHor AngleHor
AngleHor=AngleHor/10.0
str Hauteur Hauteur$
str AngleHor AngleHor$
print "[" Date$ "] Sun at " ElevationS$ "°, Telescope at " Hauteur$ "° & Hour Angle: " AngleHor "h"
MaxHaAvg=0
MaxContAvg=0
NbMeasures=0
For i=1 NbExposure
// Ensure proper Dome tracking - just to make sure...
DOME_SET_CONTROL 1 1
GoSub CanIContontinueToObserve:
if ContinueObservations=0 then
Now Date
Datetostr Date Date$
print "[" Date$ "] Sun too high, stopping observations"
GoTo EndOfGoToTargetAndAcquisition:
endif
StartExposure_EX 2 ExpTime
WaitForEndExposure_EX 2
GetLastImageExposure_EX 2 img
STR i i$
sFullPath$=sDirSave$+Object$+"-"+i$+".fits"
SAVEFIT img sFullPath$
StatWindow Img HaX1 HaY1 HaX2 HaY2 Mean Quadratic_mean Stddev Max Min Flux Median
MaxHa=Max-Min
MaxHaAvg=MaxHaAvg+MaxHa
NbMeasures=NbMeasures+1
str MaxHa MaxHa$
StatWindow Img ContX1 ContY1 ContX2 ContY2 Mean Quadratic_mean Stddev Max Min Flux Median
MaxCont=Max-Min
MaxContAvg=MaxContAvg+MaxCont
str MaxCont MaxCont$
sOutput$=">>> "+i$+" <<< : Max. Ha="+MaxHa$+" / Continuum="+MaxCont$
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
GetStdrLongitude Longitude
GetStdrLatitude Latitude
Now Date
GETRADECSUN Date AlphaS DeltaS sunelevation
Datetostr Date Date$
RAD_TO_DEC sunelevation ElevationS$
GET_TELESCOPE_POSITION Alpha2000 Delta2000 Hauteur Azimuth AngleHor
// TSL pour calculer angle horaire
SIDERALTIME Date Longitude TSL
// Angle horaire objet en radian :
COMPUTEANGLEHOR TSL alpha AngleHor
//Angle horaire en heures décimales:
//AngleHor=AngleHor*12/PI
Hauteur=Hauteur*TODEG
AngleHor=AngleHor*TODEG/15.0
round Hauteur Hauteur
AngleHor=AngleHor*10.0
round AngleHor AngleHor
AngleHor=AngleHor/10.0
str Hauteur Hauteur$
str AngleHor AngleHor$
print "[" Date$ "] Sun at " ElevationS$ "°, Telescope at " Hauteur$ "° & Hour Angle: " AngleHor "h"
SetWindowPos img WinPosX WinPosY
SizeWindowX img WinSizeX
SizeWindowY img WinSizeY
Close img
DelayBlock 3000
Next i
EndOfGoToTargetAndAcquisition:
if NbMeasures>0 then
MaxHaAvg=MaxHaAvg/NbMeasures
round MaxHaAvg MaxHaAvg
MaxContAvg=MaxContAvg/NbMeasures
round MaxContAvg MaxContAvg
str MaxHaAvg MaxHaAvg$
str MaxContAvg MaxContAvg$
Now Date
Datetostr Date Date$
print "[" Date$ "] STATISTICS: Halpha at " MaxHaAvg$ ", continuum at: " MaxContAvg$
str NbMeasures NbMeasures$
// save stats
Open_FileTxt_For_Append fichier StatsLog$
if MaxHaAvg>MaxContAvg then
StatsMax=MaxHaAvg/1000.0
else
StatsMax=MaxContAvg/1000.0
endif
str StatsMax StatsMax$
texte$=DateStats$+";"+myObjectName$+";"+ExpSec$+";"+NbMeasures$+";"+Hauteur$+";"+StatsMax$
WRITEFILETXT fichier texte$
CLOSEFILETXT fichier
// save just BeSS object name (usually HD #) & date (goal is to avoid redoing them the following nights depending on BeSS required period... work in progress)
Open_FileTxt_For_Append fichier ObjectLog$
texte$=Objet$+";"+Date$
WRITEFILETXT fichier texte$
CLOSEFILETXT fichier
endif
if AskForManualAutoGuiding=TRUE then
Now Date
Datetostr Date Date$
print "[" Date$ "] ===="
print "[" Date$ "] =============================="
print "[" Date$ "] ========================="
print "[" Date$ "] =============================="
print "[" Date$ "] ===="
Input "Please STOP autoguiding manually - then press ENTER" Dummy$
else
Now Date
Datetostr Date Date$
print "[" Date$ "] Stopping autoguiding"
StopGuide_Ex 1 1
endif
GExpTimeChamp=GExpTimeMilSec*40
if GExpTimeChamp>60000 then
GExpTimeChamp=60000
endif
StartExposure_EX 1 GExpTimeChamp
WaitForEndExposure_EX 1
GetLastImageExposure_EX 1 ImgChamp
// Sauvegarde de l'image de guidage surexposée après séquence(FITS et JPG)
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+"_after.fits"
SAVEFIT ImgChamp sFullPath$
sFullPath$=sDirSave$+"ZWO_ASI174MM_"+Object$+"_after.jpg"
SAVEJPG ImgChamp sFullPath$
CLOSE ImgChamp
// Synchronise télescope sur la cible pointée (car ça a bougé pendant l'autoguidage)
Now Date
Datetostr Date Date$
print "[" Date$ "] Resynch telescope on position for " Object$ " (" objet$ ")"
CALIBRATE_TELESCOPE alpha delta
DelayBlock 15000
return
/////////////////////////////////////////////////////////////////////////////////
//
// Start_and_Calib - Routine to begin the night: connecting equipment, spectral calibration, opening dome...
//
/////////////////////////////////////////////////////////////////////////////////
Start_and_Calib:
// Switch ON Gembird USB & LAN multiplug
if CheckIfPowerManagerIsOK=1 then
Input "Please check Power Manager is ON, OK and connect to USB socket - then press ENTER" Dummy$
else
ExecExternal "C:\Program Files\Power Manager\pm.exe" ""
delayBlock 3000
Now Date
Datetostr Date Date$
print "[" Date$ "] Power Manager started"
endif
REM Switch ON the power for the mount, dome & focuser
Now Date
Datetostr Date Date$
print "[" Date$ "] Switching mount, dome & robofocus ON"
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-on -Device3 -Mount"
delayBlock 1000
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-on -Device3 -DomeTrackerd"
delayBlock 1000
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-on -Device3 -RoboFocus"
if ConnectTelescopeManually=1 then
Input "Please connect Telescope/Dome/Focuser in PRISM... and press ENTER" Dummy$
else
delayBlock 15000
Now Date
Datetostr Date Date$
print "[" Date$ "] Connecting to Telescope/Dome/Focuser"
CONNECT_OBSERVATORY Valid
delayBlock 30000
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] Stopping the sidereal tracking"
stoptelescope
Now Date
Datetostr Date Date$
print "[" Date$ "] Set dome moving on telescope tracking & GoTo"
DOME_SET_CONTROL 1 1
delayBlock 3000
REM *** calculating night's directory
GoSub CalculateNightDate:
createdir sDirSave$
createdir sDirSave$+"CALIB"
ExecExternal "C:\Users\ObsBE\Documents\Acquisitions\CALIB\CopyDirs.bat" sDirSave$+"CALIB"
ExecExternal "C:\Users\ObsBE\Documents\Acquisitions\CALIB\CopyZip.bat" sDirSave$+"Resultats"
createdir sDirSave$+"Poubelle"
createdir sDirSave$+"Raw"
createdir sDirSave$+"Resultats"
Now Date
Datetostr Date Date$
print "[" Date$ "] Tonight directory is: "+sDirSave$
REM *** Waiting for the Sun to be below "elevsunstartinitnight" to start initialising CCD
GetStdrLongitude Longitude
GetStdrLatitude Latitude
REM print "Longitude = " Longitude*TODEG " Latitude = " Latitude*TODEG
elevsunstartinitnight=elevsunstartinitnight_Deg/TODEG
beginnighttime:
Now Date
Datetostr Date Date$
GETRADECSUN Date AlphaS DeltaS sunelevation
RAD_TO_DEC sunelevation ElevationS$
if sunelevation>0
position$="above"
else
position$="below"
endif
print "[" Date$ "] Sun at " ElevationS$ position$ " horizon (Tgt: " elevsunstartinitnight_Deg "°)"
if sunelevation>elevsunstartinitnight
delayBlock 60000
goto beginnighttime:
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] The sun is now " ElevationS$ " degrees below horizon, starting up camera and mount"
REM Switch ON Gembird LAN multiplug: calibration unit & Atik460 CCD camera
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-on -GemBirdLAN -Atik460"
Now Date
Datetostr Date Date$
print "[" Date$ "] Atik 460 camera power ON now"
delayBlock 10000
REM *** Initialisations CCDs
Now Date
Datetostr Date Date$
print "[" Date$ "] Connect/Initialise guiding (#1) & acquisition (#2) cameras; cooling the main one"
GoSub init_camera:
elevsunstartbegnight=elevsunstartbegnight_Deg/TODEG
REM *** Waiting for the sun to be below "elevsunstartbegnight", then start telescope & open dome
waittillstarttime:
Now Date
GETRADECSUN Date AlphaS DeltaS sunelevation
Datetostr Date Date$
RAD_TO_DEC sunelevation ElevationS$
if sunelevation>0
position$="above"
else
position$="below"
endif
print "[" Date$ "] Sun at " ElevationS$ position$ " horizon (Tgt: " elevsunstartbegnight_Deg "°)"
if sunelevation>elevsunstartbegnight
delayBlock 60000
goto waittillstarttime:
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] The sun is now " ElevationS$ " degrees below horizon, starting the observations"
REM echelle calibration
REM Switch ON Gembird LAN multiplug: calibration unit
Now Date
Datetostr Date Date$
print "[" Date$ "] Switch calibration unit ON & start spectral calibration"
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-on -GemBirdLAN -Calib"
delayBlock 3000
if SkipCalibration=0
GoSub AcquireCalibration:
endif
REM Switch OFF Gembird LAN multiplug: calibration unit
delayBlock 3000
Now Date
Datetostr Date Date$
print "[" Date$ "] Switch calibration unit OFF"
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-off -GemBirdLAN -Calib"
REM *** Waiting for the Sun to be below "elevsunstartobservations" to start observations
GetStdrLongitude Longitude
GetStdrLatitude Latitude
REM print "Longitude = " Longitude*TODEG " Latitude = " Latitude*TODEG
elevsunstartobservations=elevsunstartobservations_Deg/TODEG
beginobservationtime:
Now Date
GETRADECSUN Date AlphaS DeltaS sunelevation
Datetostr Date Date$
RAD_TO_DEC sunelevation ElevationS$
if sunelevation>0
position$="above"
else
position$="below"
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] Sun at " ElevationS$ position$ " horizon (Tgt: " elevsunstartobservations_Deg "°)"
if sunelevation>elevsunstartobservations
delayBlock 60000
goto beginobservationtime:
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] The sun is now " ElevationS$ " degrees below horizon, ready to start observations"
// Open DOME and start observations !
if OpenDomeManually=1 then
Input "Please open Dome when ready - then press ENTER" Dummy$
else
Open_Dome
DelayBlock 30000
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] Dome is now open"
return
/////////////////////////////////////////////////////////////////////////////////
//
// Subroutine to initialize the camera, contains informations and settings of the camera
//
/////////////////////////////////////////////////////////////////////////////////
init_camera:
Now Date
Datetostr Date Date$
print "[" Date$ "] Connecting the Zwo ASI178MC guiding camera (1)"
cameraerror$=""
INIT_CCD_CAMERA_EX GuidingCamNumber Valid cameraerror$
if Valid=2 then
nbinning=1
SetBinningX_Ex GuidingCamNumber nBinning
SetBinningY_Ex GuidingCamNumber nBinning
else
Now Date
Datetostr Date Date$
print "[" Date$ "] ERREUR initialisation camera 1: Atik Titan"
print cameraerror$
EXIT
endif
REM We start the camera
Now Date
Datetostr Date Date$
print "[" Date$ "] Connecting the Atik 460ex camera (2)"
Detector_number=2
CameraChannel=1
cameraerror$=""
INIT_CCD_CAMERA_EX AcqCamNumber Valid cameraerror$
if Valid=2 then
nbinning=1
SetBinningX_Ex AcqCamNumber nBinning
SetBinningY_Ex AcqCamNumber nBinning
for i=1 to minutestogodowntotemp
GetCCDTemperature_Ex AcqCamNumber CameraChannel Starttemperature
deltaT=Detectortemperature-Starttemperature
deltaTperminute=deltaT/minutestogodowntotemp
Now Date
Datetostr Date Date$
print "[" Date$ "] Going from " Starttemperature " to " Detectortemperature " we need to cool " deltaTperminute " degrees per minute"
Currenttemperature=Starttemperature+(deltaTperminute*i)
round Currenttemperature Currenttemperature
if Currenttemperature<Detectortemperature+0.2 then
goto endcooling1:
else
SetCCDTemperature_Ex AcqCamNumber CameraChannel Currenttemperature
Now Date
Datetostr Date Date$
print "[" Date$ "] " i " minute, CCD going down to " Currenttemperature " degrees"
delayBlock 60000
endif
next i
else
REM The camera didn't initialize correctly
Now Date
Datetostr Date Date$
print "[" Date$ "] ERREUR initialisation camera 2: Atik 460ex"
print cameraerror$
EXIT
endif
endcooling1:
Now Date
Datetostr Date Date$
print "[" Date$ "] END COOLING"
SetCCDTemperature_Ex AcqCamNumber CameraChannel Detectortemperature
return
/////////////////////////////////////////////////////////////////////////////////
//
// Initializing the telescope / NOT USED...
//
/////////////////////////////////////////////////////////////////////////////////
init_telescope:
print "Connecting to the telescope"
OPEN_TELESCOPE_DEVICES 0 0
print "Connected"
print "stopping the sidereal tracking..."
stoptelescope
return
/////////////////////////////////////////////////////////////////////////////////
//
// End of night, closing telescope, camera, etc...
//
/////////////////////////////////////////////////////////////////////////////////
endnight:
REM We have to see how to bring the camera back to ambient temperature before closing it.
Now Date
Datetostr Date Date$
print "[" Date$ "] Observing is finished, so closing the telescope..."
REM Closing the telescope
//CLOSE_TELESCOPE_DEVICES
close_dome
delayBlock 20000
stoptelescope
delayBlock 10000
// A ajouter: prévoir le cas de la calibration en fin de nuit si météo mauvaise en début de nuit...
//GoSub AcquireCalibration:
Now Date
Datetostr Date Date$
print "[" Date$ "] Setting main camera temperature to positive (10°C) & wait 2 minutes"
Currenttemperature=20
CameraChannel=1
SetCCDTemperature_Ex AcqCamNumber CameraChannel Currenttemperature
delayBlock 120000
Now Date
Datetostr Date Date$
print "[" Date$ "] Closing cameras connexion"
CLOSE_CCD_CAMERA_EX 1
delayBlock 2000
CLOSE_CCD_CAMERA_EX 2
close_dome
delayBlock 20000
CLOSE_TELESCOPE_DEVICES
Now Date
Datetostr Date Date$
print "[" Date$ "] Telescope tracking stopped & dome closed, equipment closed"
Now Date
Datetostr Date Date$
print "[" Date$ "] Switching OFF mount, dome, robofocus and CCD cameras"
REM Switch OFF the power for the mount, dome & focuser
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-off -Device3 -Mount"
delayBlock 2000
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-off -Device3 -DomeTracker"
delayBlock 2000
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-off -Device3 -RoboFocus"
delayBlock 2000
REM Switch OFF Gembird LAN multiplug: calibration unit & Atik460 CCD camera
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-off -GemBirdLAN -Calib"
delayBlock 2000
ExecExternal "C:\Program Files\Power Manager\pm.exe" "-off -GemBirdLAN -Atik460"
delayBlock 2000
Now Date
Datetostr Date Date$
print "[" Date$ "] End of night sequence done"
return
/////////////////////////////////////////////////////////////////////////////////
//
// Acquire calibration for the echelle spectrograph
//
/////////////////////////////////////////////////////////////////////////////////
AcquireCalibration:
REM Penser à enlever la sauvegarde automatique dans PRISM avant de lancer le script!
Object$="ref"
PoseThAr=60000
PoseTung=2800
PoseLEDs=2800
ON=1
OFF=0
Port1=1
Port2=2
Port3=3
Port4=4
Switchdesired=1
// Recupere l'etat des swiches d'un coup dans une table
GETSWITCH Switchdesired nbSwitches ArrayName ArrayState
sOutput$="Dir: "+sDirSave$
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
sOutput$="Object: "+Object$
print "[" Date$ "] " sOutput$
REM =================
REM Miroir + Tungsten
REM =================
SETSWITCH Port1 ON
DelayBlock 1000
SETSWITCH Port4 ON
DelayBlock 1000
For i=1 33
STR i i$
StartExposure_EX AcqCamNumber PoseTung
sFullPath$=sDirSave$+Object$+"_tung-"+i$+".fits"
sOutput$="Tungsten: "+Object$+"_tung-"+i$+".fits"
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
WaitForEndExposure_EX AcqCamNumber
GetLastImageExposure_EX AcqCamNumber img
SAVEFIT img sFullPath$
Close img
Next i
REM =================
REM LEDs + Tungsten
REM =================
SETSWITCH Port2 ON
DelayBlock 1000
For i=1 3
STR i i$
StartExposure_EX AcqCamNumber PoseLEDs
sFullPath$=sDirSave$+Object$+"_led-"+i$+".fits"
sOutput$="Flat: "+Object$+"_led-"+i$+".fits"
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
WaitForEndExposure_EX AcqCamNumber
GetLastImageExposure_EX AcqCamNumber img
SAVEFIT img sFullPath$
Close img
Next i
DelayBlock 2000
SETSWITCH Port2 OFF
DelayBlock 2000
SETSWITCH Port4 OFF
DelayBlock 2000
REM =================
REM ThAr
REM =================
SETSWITCH Port3 ON
DelayBlock 3000
For i=1 3
STR i i$
StartExposure_EX AcqCamNumber PoseThAr
sFullPath$=sDirSave$+Object$+"_thor-"+i$+".fits"
sOutput$="ThAr: "+Object$+"_thor-"+i$+".fits"
Now Date
Datetostr Date Date$
print "[" Date$ "] " sOutput$
WaitForEndExposure_EX AcqCamNumber
DelayBlock 1000
GetLastImageExposure_EX AcqCamNumber img
DelayBlock 1000
SAVEFIT img sFullPath$
Close img
DelayBlock 1000
Next i
DelayBlock 3000
SETSWITCH Port3 OFF
DelayBlock 1000
SETSWITCH Port1 OFF
DelayBlock 1000
REM sOutput$="That's all folks"
REM Print sOutput$
return
/////////////////////////////////////////////////////////////////////////////////
//
// Check if I can continue to observe another 20min based on Sun position & telescope Vs meridian
//
/////////////////////////////////////////////////////////////////////////////////
CanIContontinueToObserve:
NOW Date
GET_TELESCOPE_POSITION RA2000 DEC2000 Haut Azi AHor
GETSTDRLONGITUDE Longitude
GETSTDRLATITUDE Latitude
GETHEIGHT RA2000 DEC2000 Date Longitude Latitude Hauteur
// Hauteur en degrés
Hauteur=Hauteur*TODEG
if Hauteur<HauteurMin then
Now Date
Datetostr Date Date$
print "[" Date$ "] Target too low"
ContinueObservations=0
return
endif
DateEndOfObs=Date+ExpSec/(3600.0*24.0)
// TSL pour calculer angle horaire
SIDERALTIME DateEndOfObs Longitude TSL
// Angle horaire objet en radian :
COMPUTEANGLEHOR TSL RA2000 AngleHor
//Angle horaire en heures décimales:
AngleHor=AngleHor*12/PI
AngleHorLimit=0.0
// si DEC<45°: 10min supplémentaires
if DEC2000<0.75 then
AngleHorLimit=10.0/60.0
endif
// si DEC<30°: 20min supplémentaires -> 15min
if DEC2000<0.5 then
AngleHorLimit=15.0/60.0
endif
// si DEC<25°: 1h10 supplémentaires -> 20min
if DEC2000<0.44 then
AngleHorLimit=20.0/60.0
endif
// si DEC<6°: 1h45 supplémentaires -> 30 min
if DEC2000>0.1 then
AngleHorLimit=30.0/60.0
endif
if AngleHor>AngleHorLimit
Now Date
Datetostr Date Date$
print "[" Date$ "] Target will be too close to meridian (telescope too close to pier) at the end of next exposure"
ContinueObservations=0
return
endif
// Check Sun elevation
GetStdrLongitude Longitude
GetStdrLatitude Latitude
elevsunstartobservations=elevsunstartobservations_Deg/TODEG
Now Date
DateEndOfObs=Date+ExpSec/(3600.0*24.0)
GETRADECSUN DateEndOfObs AlphaS DeltaS sunelevation
Datetostr Date Date$
Frac DateEndOfObs DateFrac
RAD_TO_DEC sunelevation ElevationS$
if sunelevation>elevsunstartobservations
if DateFrac<0.5
Now Date
Datetostr Date Date$
print "[" Date$ "] Sun too high to continue observing"
ContinueObservations=0
return
endif
endif
ContinueObservations=1
return
/////////////////////////////////////////////////////////////////////////////////
//
// Check if Sun is still below horizon limit, check if observations can continu...
//
/////////////////////////////////////////////////////////////////////////////////
IsSunStillBelow:
// Check Sun elevation
GetStdrLongitude Longitude
GetStdrLatitude Latitude
elevsunstopobservations=elevsunstopobservations_Deg/TODEG
Now Date
GETRADECSUN Date AlphaS DeltaS sunelevation
Datetostr Date Date$
Frac Date DateFrac
RAD_TO_DEC sunelevation ElevationS$
if sunelevation>elevsunstopobservations
if DateFrac<0.5 then
Now Date
Datetostr Date Date$
print "[" Date$ "] Sun too high to continue observing"
SunStillBelow=1
ContinueObservations=0
return
endif
endif
SunStillBelow=1
ContinueObservations=1
return
/////////////////////////////////////////////////////////////////////////////////
//
// Wait several minutes (for long waiting time)...
//
/////////////////////////////////////////////////////////////////////////////////
WaitForMinutes:
//MinutesToWait=5
str MinutesToWait MinutesToWait$
Now Date
Datetostr Date Date$
print "[" Date$ "] Start waiting for " MinutesToWait$ " minutes"
Now DateBegin
WaitForMinutesLoop:
Now Date
Ecart=(Date-DateBegin)*24.0*60.0
if Ecart<MinutesToWait then
goto WaitForMinutesLoop:
endif
Now Date
Datetostr Date Date$
print "[" Date$ "] Fin (MinutesToWait=" MinutesToWait ")"
return
/////////////////////////////////////////////////////////////////////////////////
//
// CATALOG / Look up for Object$ parameters in terms of single exposure time, Nb of exposures...
//
/////////////////////////////////////////////////////////////////////////////////
// Initially used (with longuer list), now using an external file with target list...
LookUpObject:
NbExposure=0
if Object$="QRVul" then
objet$="hd192685"
GExpTime=0.5
ExpSec=1200
NbExposure=3
endif
if Object$="V442And" then
objet$="hd6226"
GExpTime=0.75
ExpSec=1200
NbExposure=6
endif
return
/////////////////////////////////////////////////////////////////////////////////
//
// TakeObject: acquire spectra of Object$
//
/////////////////////////////////////////////////////////////////////////////////
TakeObject:
GoSub LookUpObject:
GExpTime=GExpTime*ExposureCloudFactor
GoSub GoToTargetAndAcquisition:
GoSub IsSunStillBelow:
if SunStillBelow=0 then
if StarToSynchForObject$="" then
// Add synchronisation on a star there is needed (not really needed anymore)
endif
GoTo EndOfSession:
endif
return
/////////////////////////////////////////////////////////////////////////////////
//
// Meteo.pgm: Sentinel weather station management (T.Lemoult)
//
/////////////////////////////////////////////////////////////////////////////////
// Note: doesn't work yet, to be improved later...
ReadMeteo:
//Print "Donnees de la station meteo Sentinel:"
pathSentinel$="C:\Users\ObsBE\Documents\Sentinel\Datas\infodata.txt"
Open_FileTxt_For_Read fichier pathSentinel$
for i=1 7
ReadFileTXT fichier ligneDummy$
next i
ReadFileTXT fichier ligneTempExt$
CUTSTR ligneTempExt$ "=" 2 out$
val out$ TempExt
ReadFileTXT fichier ligneHumidity$
CUTSTR ligneHumidity$ "=" 2 out$
val out$ Humidity
//print "Humidity=" out$
ReadFileTXT fichier ligneDummy$
ReadFileTXT fichier ligneDummy$
ReadFileTXT fichier ligneTempSkyIR$
CUTSTR ligneTempSkyIR$ "=" 2 out$
val out$ TempskyIR
//print "TempskyIR=" out$
ReadFileTXT fichier ligneTempDetectorIR$
CUTSTR ligneTempDetectorIR$ "=" 2 out$
val out$ TempDetectorIR
//print "TempDetectorIR=" out$
ReadFileTXT fichier ligneRainFall$
CUTSTR ligneRainFall$ "=" 2 out$
if Out$="No" then
RainFall=0
RainFall$="N"
ELSE
RainFall=1
RainFall$="Y"
ENDIF
//print "RainFall=" out$
ReadFileTXT fichier ligneWindSpeedGust$
CUTSTR ligneWindSpeedGust$ "=" 2 out$
val out$ WindSpeedGust
//print "WindSpeedGust=" out$
ReadFileTXT fichier ligneDummy$
ReadFileTXT fichier ligneDummy$
ReadFileTXT fichier ligneDummy$
ReadFileTXT fichier ligneDummy$
ReadFileTXT fichier ligneLightLevel$
CUTSTR ligneLightLevel$ "=" 2 out$
val out$ LightLevel
//print "LightLevel=" out$
tempCiel=TempSkyIR-TempExt
STR tempCiel tempCiel$
//print "calcul temperature ciel =" tempCiel$
////////////////////////
if (tempCiel<LimitTempCiel) then
if RainFall=0 then
if LightLevel>LimitMagnitudeCiel
BeauTemp=1
ELSE
BeauTemp=0
ENDIF
ELSE
BeauTemp=0
ENDIF
ELSE
BeauTemp=0
ENDIF
// Beautemp est obtenus en regardant que la derniere valeur du Sentinel.
if BeauTemp=1 then
CompteurBeauTemp=CompteurBeauTemp+1
ELSE
CompteurBeauTemp=0
ENDIF
// MeteoOK donne un résultat filtree..
if CompteurBeauTemp>ValMinBelleMeteo then
// Print "Il fait beau depuis un moment.. On va pouvoir observer"
MeteoOK=1
else
MeteoOK=0
IF (BeauTemp=1) then
// Print "Si le beau temps se maintien, on pourra observer"
ELSE
// Print "Il ne fait pas assez beau pour observer"
ENDIF
ENDIF
CLOSEFILETXT fichier
return
// Other weather function - to be improved/checked...
BoucleAttendBeauTemp:
Now Date
Datetostr Date Date$
print "[" Date$ "] Waiting for good weather. Sky temp=" tempCiel$ " (" LimitTempCiel "), Rain=" RainFall$
GOSUB ReadMeteo:
DELAYBLOCK 60000
if MeteoOK=0 THEN
GOTO BoucleAttendBeauTemp:
ENDIF
return
/////////////////////////////////////////////////////////////////////////////////
//
// calculating night's date (from A. Maury)
//
/////////////////////////////////////////////////////////////////////////////////
CalculateNightDate:
NOW year month day hour minute second MS
lengthmonth[1]=31
REM bissextile years
yearfrac=year/4
frac yearfrac bissextile
if bissextile=0 then
lengthmonth[2]=29
else
lengthmonth[2]=28
endif
lengthmonth[3]=31
lengthmonth[4]=30
lengthmonth[5]=31
lengthmonth[6]=30
lengthmonth[7]=31
lengthmonth[8]=31
lengthmonth[9]=30
lengthmonth[10]=31
lengthmonth[11]=30
lengthmonth[12]=31
if hour<12 then
if day=1 then
if month=1 then
year=year-1
month=12
day=31
else
month=month-1
endif
day=lengthmonth[month]
else
day=day-1
endif
endif
str year year$
str month month$
if month<10 then
month$="0"+month$
endif
str day day$
if day<10 then
day$="0"+day$
endif
CurrentDate$=year$+month$+day$
DateStats$=day$+"/"+month$+"/"+year$
// set directory to save file and copy CALIB files in
sDirSave$="C:\Users\ObsBE\Documents\Acquisitions\"+CurrentDate$+"_eShel101_Atik460-1x1_38420_Revel\"
return
/////////////////////////////////////////////////////////////////////////////////
//
// Read my own Be Star Catalog + top target list (inspired from A. Maury)
//
/////////////////////////////////////////////////////////////////////////////////
ReadStarCatalog:
// start with Be star catalog (my own one, selection among BeSS catalog)
Open_FileTxt_For_Read StarCatalog StarCatalogFileName$
numberofstarsintargetlist=0
// Dummy (title) first line
ReadFileTxt StarCatalog line$
readnextline:
ENDOFFILE StarCatalog result
if result=FALSE then
numberofstarsintargetlist=numberofstarsintargetlist+1
REM we have not arrived till the end of the file
ReadFileTxt StarCatalog line$
REM we split the line
CUTSTR line$ ";" 1 starname[numberofstarsintargetlist]$
CUTSTR line$ ";" 2 myobjname[numberofstarsintargetlist]$
// myobjname[numberofstarsintargetlist]$=starname[numberofstarsintargetlist]$
CUTSTR line$ ";" 3 starRAH$
CUTSTR line$ ";" 4 starRAM$
CUTSTR line$ ";" 5 starDecD$
CUTSTR line$ ";" 6 starDecM$
CUTSTR line$ ";" 7 starFileName[numberofstarsintargetlist]$
CUTSTR line$ ";" 8 starVMag$
CUTSTR line$ ";" 9 starOTHPriority$
CUTSTR line$ ";" 10 starBeSSPriority$
CUTSTR line$ ";" 11 starExpTimeSec$
CUTSTR line$ ";" 12 starNbExposure$
val starRAH$ starRAH
val starRAM$ starRAM
val starDecD$ starDecD
val starDecM$ starDecM
starRA[numberofstarsintargetlist]=starRAH+(starRAM/60)
if starDecD<0 then
starDec[numberofstarsintargetlist]=starDecD-(starDecM/60)
else
starDec[numberofstarsintargetlist]=starDecD+(starDecM/60)
endif
val starVMag$ starVMag[numberofstarsintargetlist]
// Calculate the typical guiding exposure time for a Be star with this VMag (empiric formulae!)
PowerVal=starVMag[numberofstarsintargetlist]-4.0)/2.5
Power 10.0 PowerVal
starGuideExposureSec[numberofstarsintargetlist]=0.045*PowerVal*100.0*ExposureCloudFactor
round starGuideExposureSec[numberofstarsintargetlist] starGuideExposureSec[numberofstarsintargetlist]
starGuideExposureSec[numberofstarsintargetlist]=starGuideExposureSec[numberofstarsintargetlist]/100.0
numberofimages[numberofstarsintargetlist]=0
val starBeSSPriority$ starWeightBeSS[numberofstarsintargetlist]
val starOTHPriority$ starWeightOTH[numberofstarsintargetlist]
starWeightDistance[numberofstarsintargetlist]=0
sortIndex[numberofstarsintargetlist]=numberofstarsintargetlist
SortCriteria[numberofstarsintargetlist]=starWeightBeSS[numberofstarsintargetlist]+starWeightOTH[numberofstarsintargetlist]+starWeightDistance[numberofstarsintargetlist]
val starExpTimeSec$ starExpTimeSec[numberofstarsintargetlist]
val starNbExposure$ starNbExposure[numberofstarsintargetlist]
goto readnextline:
endif
closefiletxt StarCatalog
// print "number of stars in the target list : " numberofstarsintargetlist
Return
/////////////////////////////////////////////////////////////////////////////////
//
// Calculate the distance from (RARef/DECRef) for all targets in Star Catalog & add a weight factor
//
/////////////////////////////////////////////////////////////////////////////////
CalculateDistanceStarCatalogToRef:
for Temp_i=1 to numberofstarsintargetlist
starDeltaRA=(starRA[Temp_i]-RARef)*15.0
if starDeltaRA<-180.0 then
starDeltaRA=starDeltaRA+360.0
endif
if starDeltaRA>180.0 then
starDeltaRA=360.0-starDeltaRA
endif
starDeltaDEC=starDec[Temp_i]-DECRef
starDistance=(starDeltaRA*starDeltaRA)+(starDeltaDEC*starDeltaDEC)
sqr starDistance starDistance
if starDistance>MaximumStarDistanceToTelescope then
starDistance=MaximumStarDistanceToTelescope
endif
// CarreNum=(MaximumStarDistanceToTelescope-starDistance)*(MaximumStarDistanceToTelescope-starDistance)
// CarreDen=MaximumStarDistanceToTelescope*MaximumStarDistanceToTelescope
// starWeightDistance[Temp_i]=300.0*CarreNum/CarreDen
starWeightDistance[Temp_i]=300.0*(MaximumStarDistanceToTelescope-starDistance)/MaximumStarDistanceToTelescope
round starWeightDistance[Temp_i] starWeightDistance[Temp_i]
if starWeightDistance[Temp_i]<>0 then
SortCriteria[Temp_i]=starWeightBeSS[Temp_i]*2+starWeightOTH[Temp_i]+starWeightDistance[Temp_i]
else
SortCriteria[Temp_i]=0
endif
// Avoid going above DEC limit
if starDEC[Temp_i]>MaximumStarDEC then
SortCriteria[Temp_i]=0
endif
next Temp_i
return
/////////////////////////////////////////////////////////////////////////////////
//
// Check the star catalog with elevation, distance to meridian+safety limit
//
/////////////////////////////////////////////////////////////////////////////////
CheckStarCatalogForVisibility:
NOW Date
for Temp_i=1 to numberofstarsintargetlist
// GET_TELESCOPE_POSITION RA2000 DEC2000 Haut Azi AHor
GETSTDRLONGITUDE Longitude
GETSTDRLATITUDE Latitude
RATemp=starRA[Temp_i]/12*PI
DECTemp=starDEC[Temp_i]/180*PI
GETHEIGHT RATemp DECTemp Date Longitude Latitude Hauteur
// Hauteur en degrés
Hauteur=Hauteur*TODEG
if Hauteur<HauteurMin then
SortCriteria[Temp_i]=0
endif
// TSL pour calculer angle horaire
SIDERALTIME Date Longitude TSL
// Angle horaire objet en radian :
COMPUTEANGLEHOR TSL RATemp AngleHor
//Angle horaire en heures décimales, on ajoute la moitié du temps de pose
AngleHor=AngleHor*12/PI+(starExpTimeSec[Temp_i]*starNbExposure[Temp_i]/7200.0))
AngleHorLimit=0.0
// si DEC<45°: 10min supplémentaires /2
if starDEC[Temp_i]<45 then
AngleHorLimit=0.0/60.0
endif
// si DEC<30°: 15min supplémentaires /2
if starDEC[Temp_i]<30 then
AngleHorLimit=0.0/60.0
endif
// si DEC<25°: 20 supplémentaires /2
if starDEC[Temp_i]<25 then
AngleHorLimit=0.0/60.0
endif
// si DEC<6°: 30 supplémentaires /2
if starDEC[Temp_i]<6 then
AngleHorLimit=0.0/60.0
endif
if AngleHor>AngleHorLimit
SortCriteria[Temp_i]=0
endif
// if Temp_i=133 then
// print "DEBUG: AnleHor (V442 And)=" AngleHor
// print "DEBUG: AnleHorLimit=" AngleHorLimit
// print "DEBUG: Haueur=" Hauteur
// print "DEBUG: HauterMin=" HauteurMin
// print "DEBUG RA=" RATemp
// print "DEBUG RA=" DECTemp
// endif
next Temp_i
return
/////////////////////////////////////////////////////////////////////////////////
//
// Sort star catalog : sort my star catalog based on a weight criteria (usually sum of different criteria)
//
/////////////////////////////////////////////////////////////////////////////////
SortStarCatalog:
// SortIndex[]: table of index to sort
// numberofstarsintargetlist: number of index to sort
// SortCriteria[]: criteria (numerical) to use to sort, from highest to lowest number
// advance the position through the entire array
// (could do j < n-1 because single element is also min element)
for Sort_j=1 to numberofstarsintargetlist
// find the min element in the unsorted a[j .. n-1]
// assume the min is the first element
Sort_iMax=Sort_j
// test against elements after j to find the smallest
Sort_i_start=Sort_j+1
for Sort_i=Sort_i_start to numberofstarsintargetlist
// if this element is less, then it is the new minimum */
if SortCriteria[SortIndex[Sort_i]]>SortCriteria[SortIndex[Sort_iMax]] then
// found new maximum; remember its index
Sort_iMax=Sort_i
endif
next Sort_i
if (Sort_iMax<>Sort_j)
SortTemp=SortIndex[Sort_j]
SortIndex[Sort_j]=SortIndex[Sort_iMax]
SortIndex[Sort_iMax]=SortTemp
endif
next NumeroObject
return
/////////////////////////////////////////////////////////////////////////////////
//
// Testing: read catalog, calculate distance to V442 And & sort by weighted criteria -> look for next target?
//
/////////////////////////////////////////////////////////////////////////////////
// DO NOT USE - FOR TESTING PURPOSES ONLY...
TestCatalogFunctions:
GoSub ReadStarCatalog:
print "number of stars in the target list : " numberofstarsintargetlist
// QR Vul
RARef=20.0+15.0/60.0
DECRef=25.0/35.0
// lam Cyg
RARef=20.78
DECRef=36.48
// V442 And
RARef=1.05
DECRef=47.63
// lam Cyg
RARef=20.78
DECRef=36.48
// 28 Cyg
RARef=19.98
DECRef=37.03
GET_TELESCOPE_POSITION Alpha2000 Delta2000 Hauteur Azimuth AngleHor
RARef=Alpha2000
DECRef=Delta2000
GoSub CalculateDistanceStarCatalogToRef:
GoSub CheckStarCatalogForVisibility:
GoSub SortStarCatalog:
for Temp_i=1 to numberofstarsintargetlist
Temp_j=SortIndex[Temp_i]
Temp_Prio=SortCriteria[Temp_j]
if Temp_Prio>-1 then
print "Prio=" Temp_Prio " starname number : " Temp_i " is : " starFileName[Temp_j]$ " star RA in decimal : " starRA[Temp_j] " star Dec in decimal : " starDec[Temp_j] " Vmag=" starVMag[Temp_j] " Guiding Exp Time=" starGuideExposureSec[Temp_j] " BeSS=" starWeightBeSS[Temp_j] " MyPrio=" starWeightOTH[Temp_j] " Distance=" starWeightDistance[Temp_j]
endif
next Temp_i
END
return
/////////////////////////////////////////////////////////////////////////////////
//
// ReadObsC2A - download ARASBeAm BeSS target files to get priorities from it/ Need wget.exe to work.
//
/////////////////////////////////////////////////////////////////////////////////
ReadObsC2A:
execexternal "C:\Users\ObsBE\Documents\Acquisitions\CALIB\wget.exe" "http://arasbeam.free.fr/robot/ObsC2A.txt"
ObsC2A$="C:\Users\ObsBE\Documents\Acquisitions\CALIB\ObsC2A.txt"
Open_FileTxt_For_Read ObsC2A ObsC2A$
NbObsC2A=0
// Dummy (title) first line
ReadFileTxt ObsC2A line$
readnextline:
ENDOFFILE ObsC2A result
if result=FALSE then
NbObsC2A=NbObsC2A+1
REM we have not arrived till the end of the file
ReadFileTxt ObsC2A line$
REM we split the line
Deb=16
Fin=6
SUBSTRING line$ Deb Fin objet$
print line$
print objet$
goto readnextline:
endif
closefiletxt ObsC2A
Return
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// END OF SCRIPT //
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
BeSSName;MyName;RA;RAm;DEC;DECm;FileName;VMag;OTHPriority;BeSSPriority;ExpSec;NbExposure
HD103287;gam Uma;+11;53;+53;41;gamUma;2.44;0;17;600;4
HD5394;gam Cas;+00;56;+60;43;gamCas;2.47;0;80;60;20
HD58715;bet CMi;+07;27;+08;17;betCMi;2.89;0;32;600;4
HD37202;zet Tau;+05;37;+21;08;zetTau;3.03;0;100;450;4
HD205021;ALFIRK;+21;28;+70;33;ALFIRK;3.22;0;100;600;4
HD11415;eps Cas;+01;54;+63;40;epsCas;3.34;0;3;450;3
HD35411;eta Ori;+05;24;-02;23;etaOri;3.38;0;100;600;4
HD174638;bet Lyr;+18;50;+33;21;betLyr;3.52;0;3;600;4
HD217675;omi And;+23;01;+42;19;omiAnd;3.63;100;2;800;4
HD166014;omi Her;+18;07;+28;45;omiHer;3.84;0;2;900;4
HD109387;kap Dra;+12;33;+69;47;kapDra;3.88;0;6;900;4
HD199629;nu Cyg;+20;57;+41;10;nuCyg;3.94;0;1;900;4
HD25940;48 Per;+04;08;+47;42;48Per;4;0;28;900;4
HD24912;xi Per;+03;58;+35;47;xiPer;4.06;0;100;900;4
HD10516;phi Per;+01;43;+50;41;phiPer;4.09;0;33;900;4
HD45542;nu Gem;+06;28;+20;12;nuGem;4.14;0;31;900;4
HD138749;tet CrB;+15;32;+31;21;tetCrB;4.15;0;24;900;3
HD6811;phi And;+01;09;+47;14;phiAnd;4.25;0;4;600;4
HD22192;psi Per;+03;36;+48;11;psiPer;4.31;0;55;900;3
HD30739;2 Ori;+04;50;+08;54;2Ori;4.35;0;34;900;6
HD202904;ups Cyg;+21;17;+34;53;upsCyg;4.43;0;1;600;4
HD98058;phi Leo;+11;16;-03;39;phiLeo;4.47;0;24;900;4
HD4180;omi Cas;+00;44;+48;17;omiCas;4.48;0;70;600;6
HD217891;bet Psc;+23;03;+03;49;betPsc;4.49;0;1;600;4
HD37490;ome Ori;+05;39;+04;07;omeOri;4.57;0;47;900;4
HD47839;15 Mon;+06;40;+09;53;15Mon;4.64;0;37;900;4
HD209409;omi Aqr;+22;03;-02;09;omiAqr;4.7;0;69;900;4
HD20336;BK Cam;+03;19;+65;39;BKCam;4.73;0;20;900;4
HD200120;59 Cyg;+20;59;+47;31;59Cyg;4.74;0;20;900;4
HD198183;lam Cyg;+20;47;+36;29;lamCyg;4.75;0;10;900;3
HD192685;QR Vul;+20;15;+25;35;QRVul;4.76;40;29;900;3
HD164284;66 Oph;+18;00;+04;22;66Oph;4.78;100;17;900;3
HD212571;pi Aqr;+22;25;+01;22;piAqr;4.79;60;100;600;4
HD212076;31 Peg;+22;21;+12;12;31Peg;4.81;0;5;1200;4
HD35439;25 Ori;+05;24;+01;50;25Ori;4.87;0;100;1200;4
HD187811;12 Vul;+19;51;+22;36;12Vul;4.89;0;8;1200;4
HD191610;28 Cyg;+20;09;+36;50;28Cyg;4.93;0;67;900;3
HD24479;HD24479;+03;57;+63;04;HD24479;4.95;0;26;1200;4
HD42545;69 Ori;+06;12;+16;07;69Ori;4.95;0;100;1200;4
HD52918;19 Mon;+07;02;-04;14;19Mon;4.99;0;44;1200;4