== Example of calibration observation with pointing request == ''' Header's information''' {{{ // $Id$ // Missionphase : PACS PV Phase // // Purpose : Wavelength calibration and instrumental profile // with Chop/Nod // Author : HF // // Arguments   : // // Prerequisite : PACS does not need to be on nor setup for spectroscopy // // Description : Uses OBCP27 for executing a parameterized scan of any length, //  stepsize etc. Represents a generic chopped grating scan // Comments : // // Version : 1.0 // // History : 0.1 Using example from PacsCal_WaveCalNoChop // : 1.0 perform calibrations during slew and // then a wavelength calibration on source // usng NOD=1 and Choping }}} Script type declaration as observation (i.e. inc. a pointing request), and X-HSPOT readable variables {{{ obs PacsCal_WaveCalChop { /* Needed variables to call WaveCalChop */ string fltPOS = "POS A" in ["POS A","POS B"]; //Filter wheel position 0="POS A", 1="POS B" int grat_pos = 500000; // grating start position for scan int grat_time = 0; // time for grating to move to start position [msec] int grat_step_up = 200; // grating step size int nb_ramps_plateau = 1; // number of readouts per grating position int grat_step_dn = 200; // grating step size int nb_grat_steps = 50; // number of grating steps in one direction int order = 2; // Where to leave FltW (as order 1=Red, 2= or 3= Blue) int nb_SRC_REF = 3; // number of ramps (cycles) per grating position int nb_CS1_CS2 = 0; // nb of cycles on internal CS int nb_rdouts_ramp = 64; // number of readouts per ramp int nb_up_down = 1; // number of grating updown scans int nb_raw_red = 3; // number of red pixels int nb_raw_blu = 3; // number of blue pixels int capa_red = 12; // Red capacitor int capa_blu = 12; // Blue capacitor double bias_r_blu = 0.01; // Bias "r" blue double bias_r_red = 0.01; // Bias "r" red double bias_d_blu = 0.198; // Bias "d" blue double bias_d_red = 0.069; // Bias "d" red int comp_mode_blu = 16; // compression mode for blue detector int detector = 1; // 1=blue 2=red (sync on detector) int comp_mode_red = 16; // compression mode for red detector int nb_samp_subramp_blu = 64; // Nb of blue samples per sub-ramp int nb_samp_subramp_red = 64; // Nb of red samples per sub-ramp int naifid = 0; //0 = Non Solar System source, >0 if fast tracking is required (Solar System sources) double yoffset = 0.0; // yoffset [arcsec] double zoffset = 0.0; // xoffset [arcsec] double ra = 0.0; // RA double dec = 0.0; // DEC int nnod = 1; // number of nods (AB or BA) double chopthrow = 30.; // chop/nod throw bool verbose = true; } }}} internal variables declaration and timing computation {{{ { // compiting time for slw / calibration during slew time and others //Execute the pointing request bool execute = true; // Set OBSID int tobsid = duration(WriteOBSID($OBSID)); // Verification for grating and chopper hard limits int [] gratpos = [grat_pos,grat_step_up,nb_grat_steps]; Pacs_HardLimitsCheck(gratpos,chopthrow); // end verif' // Calibration time during slew // SPEC parameters for BLU and RED {int,int,int,int,int,int,int,int,int} [] confSPECblu = [{0,comp_mode_blu,nb_raw_blu,0,0,0,0,0,0}]; {int,int,int,int,int,int,int,int,int} [] confSPECred = [{0,comp_mode_red,nb_raw_red,0,0,0,0,0,0}]; // OBCP parameters none is given since PacsSpecSlewCal takes them from OBCPparam {int,int,int,int,int,int,int,int,int,int, int,int,int,int,int,int,int,int,int,int} [] confOBCP = [{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}]; // frstLstGratPos is the last position for the grating after the Cals done // during Slew time... must be same as observations start position: grat_pos // Perform/don't AOT prologue bool doPROLOG= true; // "N/A" in string because of indexing 0,1,2,3 string [] choix = ["N/A","order1","order2","order3"]; string order_str = ""+order; if ( choix[order] != "order1" ) { double keyWAVE1 = dlookup("KEY_WAVES",order_str,"KeyWave1"); double [] keyWAVE = [keyWAVE1]; int tpacsSlewCal = duration(PacsSpecSlewCal(verbose,confSPECblu,confSPECred,confOBCP,doPROLOG,keyWAVE,order,grat_pos,choix[order])); } else { keyWAVE1 = dlookup("KEY_WAVES",order_str,"KeyWave1"); double keyWAVE2 = dlookup("KEY_WAVES",order_str,"KeyWave2"); keyWAVE = [keyWAVE1,keyWAVE2]; tpacsSlewCal = duration(PacsSpecSlewCal(verbose,confSPECblu,confSPECred,confOBCP,doPROLOG,keyWAVE,order,grat_pos,choix[order])); } //Initial hold int tih = 0; //Final hold int tendobsid = duration(WriteEndID()); int grat_def = ilookup("SPEC_MEC_Defaults","Spectroscopy","grating"); int tepilog = duration(SPEC_aot_epilogue(grat_pos,grat_def,verbose)); int tfh = tendobsid + tepilog; //Duration of stable pointing int tp = duration(WaveCalChop(fltPOS,grat_pos,grat_time,grat_step_up,grat_step_dn, nb_grat_steps,nb_CS1_CS2,nb_rdouts_ramp,nb_ramps_plateau,nb_up_down, capa_red,capa_blu,bias_r_blu,bias_r_red,bias_d_blu,bias_d_red, nb_samp_subramp_blu,nb_samp_subramp_red,nb_SRC_REF,chopthrow, detector)); if ( verbose ){debug_print("Duration of WaveCalChop" +tp+"sec");} if (tp < 10){error ("The dwell time cannot be smaller than 10 sec, adjust parameters");} // //Use SPECTRO virtual aperture string ib = "P02_0"; //Non-solar source int naifid = 0; bool startAtB = false; // start AB cycle (true start BA) bool fixed = false; // NOD same direction as CHOPPING fixed ON sky double pattnod = 0.; // Nod along chop direction int tloadmin = 0; int nload = 0; int thold = 0; int nhold = 0; int tpa = tp; int tpb = tp; //Issue PointReq int tslewmin = tobsid + tpacsSlewCal; if ( verbose ){debug_print("Slewing time is:"+tslewmin+"sec");} }}} Pointing request(s), here may be included logical statements to request different pointings {{{ int[] ts = nodding_pointing(execute,tslewmin,tih,tfh,ib,naifid,ra,dec,fixed,pattnod,yoffset,zoffset,nnod,chopthrow,tpa,tpb,tloadmin,nload,thold,nhold,startAtB); // } }}} State machine: each state corresponds to a telescope pointing status: an observation corresponds to a sequence of pointing state determined by the pointing request {{{ { int[] state = [0]; while(state[0] >= 0) { state = next_state(); if ( state[0] == 1 ) { int tNOW = time(); // slew time calibration WriteOBSID($OBSID); if ( verbose ){debug_print("Slewing starts at :"+tNOW+" sec");} if ( choix[order] == "order1" ) { PacsSpecSlewCal(false,confSPECblu,confSPECred,confOBCP,doPROLOG,keyWAVE,order,grat_pos,choix[order]); } else { PacsSpecSlewCal(false,confSPECblu,confSPECred,confOBCP,doPROLOG,keyWAVE,order,grat_pos,choix[order]); } tNOW = time(); if ( verbose ){debug_print("Slewing ends at "+tNOW+" sec");} } else { if ( state[0] == 3 ) { // Call the WaveCal procedure tNOW = time(); if (verbose ){debug_print("Observation on SRC starts at :"+tNOW+" sec");} WaveCalChop(fltPOS,grat_pos,grat_time,grat_step_up,grat_step_dn,nb_grat_steps,nb_CS1_CS2,nb_rdouts_ramp,nb_ramps_plateau,nb_up_down,capa_red,capa_blu,bias_r_blu,bias_r_red,bias_d_blu,bias_d_red,nb_samp_subramp_blu,nb_samp_subramp_red,nb_SRC_REF,chopthrow,detector); tNOW = time(); if (verbose ){debug_print("Observation on SRC ends at :"+tNOW+" sec");} } else { if(state[0] == 7 ) { // Call the WaveCal procedure tNOW = time(); if (verbose ){debug_print("Observation at NOD starts at :"+tNOW+" sec");} WaveCalChop(fltPOS,grat_pos,grat_time,grat_step_up,grat_step_dn,nb_grat_steps,nb_CS1_CS2,nb_rdouts_ramp,nb_ramps_plateau,nb_up_down,capa_red,capa_blu,bias_r_blu,bias_r_red,bias_d_blu,bias_d_red,nb_samp_subramp_blu,nb_samp_subramp_red,nb_SRC_REF,chopthrow,detector); tNOW = time(); if (verbose ){debug_print("Observation at NOD ends at :"+tNOW+" sec");} } else { if ( state[0] == 5 ) { tNOW = time(); if (verbose ){debug_print("Final Hold starts at :"+tNOW+" sec");} SPEC_aot_epilogue(grat_pos,grat_def,verbose); WriteEndID(); tNOW = time(); if (verbose ){debug_print("Final Hold ends at :"+tNOW+" sec");} } } // End of Observation }}}