Skip to content
seqIDataMgr.cpp 164 KiB
Newer Older
Davide Ricci's avatar
Davide Ricci committed
//    fits_write_key(fptr, TFLOAT,  "HIERARCH LBT INS TEMP1 VAL END ",  &ih.temperature_end, "Cryo-vacuum T [K] at end of observation", &FitStatus);
sharknirws2's avatar
sharknirws2 committed
    fits_write_record(fptr, "        ------------------------------------------------------------------------", &FitStatus);

    getMaskCombo(ih);
// Table 10 Instrument setup keyword
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    fits_write_key(fptr, TSTRING, "INS INSTRUMENT MODE",        su::get_char_star(m_sashaSetup[suc::InstrumentMode]), "Instrument Mode", &FitStatus);

    U9_LLOG("------------CORO_SLIT_W  :  " << ih.coro_slit_w.type);
sharknirws2's avatar
sharknirws2 committed
    fits_write_key(fptr, TSTRING, "INS MASKCOMBO",              su::get_char_star(ih.mask_comb.type), "Mask Combination", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS SHUTTER",                su::get_char_star(ih.shutter.type), "Shutter Deployer", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS INBEAM_DEP",             su::get_char_star(ih.inbeam_dep.type), "Input Beam Deployer", &FitStatus);
sharknirws2's avatar
sharknirws2 committed
    fits_write_key(fptr, TSTRING, "INS INBEAM_TT",              su::get_char_star(ih.inbeam_tt.type), "Input Beam TipTilt Mirror", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS APODIZER_W",             su::get_char_star(ih.apodizer_w.type), "Apodizer Wheel", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS ND_FILT_W",              su::get_char_star(ih.nd_filt_w.type), "Neutral Density Filter Wheel", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CORO_SLIT_W",            su::get_char_star(ih.coro_slit_w.type), "Coronagraphic Filter Wheel", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS LYOT_GRISM_W",           su::get_char_star(ih.lyot_grism_w.type), "Lyot Grism Wheel", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS DB_FILT_W",              su::get_char_star(ih.db_filt_w.type), "Dual Band Filter Wheel", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS SCI_FILT_W1",            su::get_char_star(ih.sci_filt_w1.type), "Scientific Filter Wheel 1", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS SCI_FILT_W2",            su::get_char_star(ih.sci_filt_w2.type), "Scientific Filter Wheel 2", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS PUPIL_LENS_DEP",         su::get_char_star(ih.pupil_lens_dep.type), "Pupil Lens Deployer", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CAL_FIBER_FOCUS_LAMP",   su::get_char_star(ih.cal_fiber_focus_lamp.type), "Calibration Fiber Focus Lamp", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CAL_FIBER_DEFOCUS_LAMP", su::get_char_star(ih.cal_fiber_defocus_lamp.type), "Calibration Fiber Defocus Lamp", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CAL_FF_LAMP",            su::get_char_star(ih.cal_flat_field_lamp.type), "Calibration Flat Field Lamp", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CAL_FIBER_DEP",          su::get_char_star(ih.cal_fiber_dep.type), "Calibration Fiber Deployer", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CAL_FILTER_DEP",         su::get_char_star(ih.cal_filter_dep.type), "Calibration Filter Deployer", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS CAL_MIRROR_DEP",         su::get_char_star(ih.cal_mirror_dep.type), "Calibratio Mirror Deployer", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS ADC_MODE",               su::get_char_star(ih.adc_mode.type), "Atmospheric Dispersion Corrector Mode", &FitStatus);
    fits_write_key(fptr, TSTRING, "INS DROT_MODE",              su::get_char_star(ih.drot_mode.type), "Derotator Mode", &FitStatus);

    fits_write_record(fptr, "        ------------------------------------------------------------------------", &FitStatus);
    // Table 11 Detector Setup keywords
Davide Ricci's avatar
Davide Ricci committed
    floatValue = 0.f;
Davide Ricci's avatar
Davide Ricci committed
//    su::getValue<float>(m_sashaSetup["DIT"], floatValue);
//    fits_write_key(fptr, TFLOAT,  "DET DIT",   &floatValue, "Detector Integration Time", &FitStatus);
//    intValue = su::convertStringToType<int>(sashaNumReads["value"].getValue());
//    fits_write_key(fptr, TINT,    "DET NREADS", &intValue, "Number of Reads", &FitStatus);
//    intValue = su::convertStringToType<int>(sashaNumDrops["value"].getValue());
//    fits_write_key(fptr, TINT,    "DET NDROPS", &intValue, "Number of Drops", &FitStatus);
//    intValue = su::convertStringToType<int>(sashaNumGroups["value"].getValue());
//    fits_write_key(fptr, TINT,    "DET NGROUPS", &intValue, "Number of Groups", &FitStatus);
//    intValue = su::convertStringToType<int>(sashaNumCoadds["value"].getValue());
//    fits_write_key(fptr, TINT,    "DET NCOADDS", &intValue, "Number of Coadditions", &FitStatus);
//    intValue = su::convertStringToType<int>(sashaNumSeqs["value"].getValue());
//    fits_write_key(fptr, TINT,    "DET NDIT", &intValue, "Number of DITs", &FitStatus);
Davide Ricci's avatar
Davide Ricci committed
    fits_write_key(fptr, TSTRING, "DET READOUT", su::get_char_star(sashaReadout["value"].getValue()), "Readout Mode", &FitStatus);
    intValue = su::convertStringToType<int>(sashaSeqNum["value"].getValue());
    fits_write_key(fptr, TINT,    "DET CEXP", &intValue, "Current exposure", &FitStatus);

    fits_write_key(fptr, TINT,    "DET XMIN", &xmin, "Minimum of X-axis", &FitStatus);
    fits_write_key(fptr, TINT,    "DET XMAX", &xmax, "Maximum of X-axis", &FitStatus);
    fits_write_key(fptr, TINT,    "DET YMIN", &ymin, "Minimum of Y-axis", &FitStatus);
    fits_write_key(fptr, TINT,    "DET YMAX", &ymax, "Maximum of Y-axis", &FitStatus);
Davide Ricci's avatar
Davide Ricci committed
//    fits_write_key(fptr, TLOGICAL,"DET NEXTASBG", &intValue, "Next", &FitStatus);
//    fits_write_key(fptr, TLOGICAL,"DET PREVASBG", &intValue, "Previous", &FitStatus);
Davide Ricci's avatar
Davide Ricci committed
    intValue = sashaSave["value"].getSwitchState() == IElement::On;
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    fits_write_key(fptr, TLOGICAL,"DET SAVE", &intValue, "Save Flag on SASHA", &FitStatus);
    fits_write_record(fptr, "        ------------------------------------------------------------------------", &FitStatus);
    // Table 12 RTC Setup Keywords
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTWINCOORDX"]);
    fits_write_key(fptr, TINT,    "TTWINCOORDX", &intValue, "Distance in rows from px in full frame", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTWINCOORDY"]);
    fits_write_key(fptr, TINT,    "TTWINCOORDY", &intValue, "Distance in cols from px in full frame", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTWINROWS"]);
    fits_write_key(fptr, TINT,    "TTWINROWS", &intValue, "Tiptilt Window Rows", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTWINCOLS"]);
    fits_write_key(fptr, TINT,    "TTWINCOLS", &intValue, "Tiptilt Window Columns", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTFRAMERATE"]);
    fits_write_key(fptr, TINT,    "TTFRAMERATE", &intValue, "TipTilt frame rate", &FitStatus);
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTCAMTINT"]);
    fits_write_key(fptr, TFLOAT,  "TTCAMTINT", &floatValue, "TipTilt Camera integration time", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
//    if(m_pGetRtcStatus){ intValue = su::convertStringToType<int>(m_pGetRtcStatus("TTLOOPENABLED"));}
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTLOOPENABLED"]);
    fits_write_key(fptr, TLOGICAL,"TTLOOPENABLED", &intValue, "Flag indicating fast tip/tilt loop status", &FitStatus);
//    fits_write_key(fptr, TLOGICAL,"TTHISTORYENABLED", &intValue, "Number of images save", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
//    fits_write_key(fptr, TSTRING, "TTTIMEHISTORYFILE", (char *)"", "Time History Filename", &FitStatus);
//    fits_write_key(fptr, TINT,    "TTTIMEHISTLEN", &intValue, "Number of history lines if history is enabled", &FitStatus);
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTDMMAXPOWER"]);
    fits_write_key(fptr, TFLOAT,  "TTDMMAXPOWER", &floatValue, "Max Power allowed to DM", &FitStatus);
    fits_write_key(fptr, TSTRING, "TTBIASFILE", su::get_char_star(m_rtcKeywords["TTBIASFILE"]), "Bias File", &FitStatus);
    fits_write_key(fptr, TSTRING, "TTDMFLATFILE", su::get_char_star(m_rtcKeywords["TTDMFLATFILE"]), "Flat File", &FitStatus);
    if(m_pGetRtcStatus && !m_bFastSavingMode){m_rtcKeywords["TTSENSORTEMP"] = m_pGetRtcStatus("TTSENSORTEMP");}
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTSENSORTEMP"]);
    fits_write_key(fptr, TFLOAT,  "TTSENSORTEMP", &floatValue, "sensor temperature in degree C", &FitStatus);
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTCENTROIDGAINX"]);
    fits_write_key(fptr, TFLOAT,  "TTCENTROIDGAINX", &floatValue, "TipTilt gain on centroid X", &FitStatus);
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTCENTROIDGAINY"]);
    fits_write_key(fptr, TFLOAT,  "TTCENTROIDGAINY", &floatValue, "TipTilt gain on centroid Y", &FitStatus);
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTCENTROIDORIGX"]);
    fits_write_key(fptr, TFLOAT,  "TTCENTROIDORIGX", &floatValue, "X Origin position in [-1,1] coordinates", &FitStatus);
    floatValue = su::convertStringToType<float>(m_rtcKeywords["TTCENTROIDORIGY"]);
    fits_write_key(fptr, TFLOAT,  "TTCENTROIDORIGY", &floatValue, "Y Origin position in [-1,1] coordinates", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTDMMODESNUM"]);
    fits_write_key(fptr, TINT,    "TTDMMODESNUM", &intValue, "number of modes in zonal influence matrix", &FitStatus);
    fits_write_key(fptr, TSTRING, "TTPIXELGAINFILE", su::get_char_star(m_rtcKeywords["TTPIXELGAINFILE"]), "Gain factor for each pixel in which the centroid is calculated", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTPIXELENABLED"]);
    fits_write_key(fptr, TLOGICAL,"TTPIXELENABLED", &intValue, "Enable saving frames on memory", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTPIXELDECIMATION"]);
    fits_write_key(fptr, TINT,    "TTPIXELDECIMATION", &intValue,   "Frame saving decimation factor", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTDIAGENABLED"]);
    fits_write_key(fptr, TLOGICAL,"TTDIAGENABLED", &intValue, "Diagnostic enabled", &FitStatus);
    intValue = su::convertStringToType<int>(m_rtcKeywords["TTDIAGDECIMATION"]);
    fits_write_key(fptr, TINT,    "TTDIAGDECIMATION", &intValue,   "TipTilt diagnostic decimation factor", &FitStatus);
    fits_write_record(fptr, "        ------------------------------------------------------------------------", &FitStatus);
    int WCSAXES = 2;
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    if(m_sashaSetup[suc::InstrumentMode] == "LSS") { WCSAXES = 3;}
    fits_write_key(fptr, TINT,    "WCSAXES   ", &WCSAXES,     "Dimensionality of WCS: 2 for image, 3 for spectrum", &FitStatus);
    if(WCSAXES == 2)
        fits_write_key(fptr, TSTRING, "CTYPE1   ", (char *)"RA---TAN",    "Pixel coordinate system", &FitStatus);
        fits_write_key(fptr, TSTRING, "CTYPE2   ", (char *)"DEC--TAN",    "Pixel coordinate system", &FitStatus);
        fits_write_key(fptr, TSTRING, "RADESYS  ", (char *)"ICRS",        "reference system", &FitStatus);
        fits_write_key(fptr, TSTRING, "CUNIT1   ", (char *)"deg",         "Unit of coordinate transformation", &FitStatus);
        fits_write_key(fptr, TSTRING, "CUNIT2   ", (char *)"deg",         "Unit of coordinate transformation", &FitStatus);

        floatValue2 = 0.0000040277777777777;
        fits_write_key(fptr, TFLOAT,  "CDELT1   ", &floatValue2,"Increment along axis 1 as [CUNIT1]/pxl", &FitStatus);
        fits_write_key(fptr, TFLOAT,  "CDELT2   ", &floatValue2,"Increment along axis 2 as [CUNIT2]/pxl", &FitStatus);
        float ra_tel_deg = tenv.achieved_ra/suc::DEGREE, ra_point_offset = 0.f, ra_guide_offset = 0.f, ra_shark = 0.f;
        float dec_tel_deg = tenv.achieved_dec/suc::DEGREE, dec_point_offset = 0.f, dec_guide_offset = 0.f, dec_shark = 0.f;
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        floatValue = ra_tel_deg + ra_point_offset + ra_guide_offset + ra_shark;
        fits_write_key(fptr, TFLOAT,  "CRVAL1   ", &floatValue, "RA at CRPIX1 in units CUNIT1", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        floatValue = dec_tel_deg + dec_point_offset + dec_guide_offset + dec_shark;
        fits_write_key(fptr, TFLOAT,  "CRVAL2   ", &floatValue, "DEC at CRPIX2 in units CUNIT2", &FitStatus);

        floatValue = 58.1f + 885.f - xmin;
        fits_write_key(fptr, TFLOAT,  "CRPIX1   ", &floatValue, "Value of X Ref. pixel", &FitStatus);
        floatValue = 51.5f + 1020.f - ymin;
        fits_write_key(fptr, TFLOAT,  "CRPIX2   ", &floatValue, "Value of Y Ref. pixel", &FitStatus);

Fulvio Laudisio's avatar
Fulvio Laudisio committed
        double sign = (m_bTest01 ? 1. : -1.);
        floatValue = std::cos((ih.derotator.position1 - gDrotRef + sign*tenv.parallactic_angle)*suc::DEGREE);
        fits_write_key(fptr, TFLOAT,  "PC1_1    ", &floatValue, "Scale in [CUNIT1]/pixel", &FitStatus);
        int flip = -1;
        floatValue *= flip;
        fits_write_key(fptr, TFLOAT,  "PC2_2    ", &floatValue, "Scale in [CUNIT2]/pixel", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        floatValue = std::sin((ih.derotator.position1 - gDrotRef + sign*tenv.parallactic_angle)*suc::DEGREE);
        fits_write_key(fptr, TFLOAT,  "PC1_2    ", &floatValue, "Rotation and skew", &FitStatus);
        fits_write_key(fptr, TFLOAT,  "PC2_1    ", &floatValue, "Rotation and skew", &FitStatus);
    else if(WCSAXES == 3)
    {
        fits_write_key(fptr, TSTRING, "CTYPE1   ", (char *)"WAVE",    "Pixel coordinate system", &FitStatus);
Davide Ricci's avatar
Davide Ricci committed
        fits_write_key(fptr, TSTRING, "CTYPE2   ", (char *)"DIST",    "Pixel coordinate system", &FitStatus);
        // fits_write_key(fptr, TSTRING, "CTYPE3   ", strValue,    "Pixel coordinate system", &FitStatus);
        fits_write_key(fptr, TSTRING, "CUNIT1   ", (char *)"mas",    "Unit of coordinate transformation", &FitStatus);
        fits_write_key(fptr, TSTRING, "CUNIT2   ", (char *)"nm",    "Unit of coordinate transformation", &FitStatus);
        // fits_write_key(fptr, TSTRING, "CUNIT3   ", strValue,    "Unit of coordinate transformation", &FitStatus);
        float crval_1 = 0.0;
        float crval_2 = 800;
        fits_write_key(fptr, TFLOAT,  "CRVAL1   ", &crval_1, "Wavelength at CRPIX1", &FitStatus);
        fits_write_key(fptr, TFLOAT,  "CRVAL2   ", &crval_2, "RA at CRPIX1 in units CUNIT1", &FitStatus);
        float cdelt_1 = pixscale;
        float cdelt_2 = (2000-800)/2048;
        fits_write_key(fptr, TFLOAT,  "CDELT1   ", &cdelt_1,"Increment along axis 1 as [CUNIT1]/pxl", &FitStatus);
        fits_write_key(fptr, TFLOAT,  "CDELT2   ", &cdelt_2,"Increment along axis 2 as [CUNIT2]/pxl", &FitStatus);
        float crpix_1 = 0;
        float crpix_2 = 0;
        fits_write_key(fptr, TFLOAT,  "CRPIX1   ", &crpix_1, "Value of X Ref. pixel", &FitStatus);
        fits_write_key(fptr, TFLOAT,  "CRPIX2   ", &crpix_2, "Value of Y Ref. pixel", &FitStatus);
        // fits_write_key(fptr, TFLOAT,  "CRVAL3   ", &floatValue, "DEC at CRPIX2 in units CUNIT2", &FitStatus);
        // fits_write_key(fptr, TFLOAT,  "CD1_1    ", &floatValue, "Increment for CTYPE1", &FitStatus);
        // fits_write_key(fptr, TFLOAT,  "CD2_2    ", &floatValue, "Increment for CTYPE2", &FitStatus);
        // fits_write_key(fptr, TFLOAT,  "CD3_3    ", &floatValue, "Increment for CTYPE3", &FitStatus);
        int dispAxis = 1;
        fits_write_key(fptr, TINT,    "DISPAXIS ", &dispAxis,       "Dispersion axis (1=rows; 2=columns)", &FitStatus);
        fits_write_key(fptr, TSTRING, "DISPUNIT ", (char *)"Pixel", "Units for coordinate along DISPAXIS", &FitStatus);
        fits_write_key(fptr, TSTRING, "DISPWC   ", strValue,        "Approximate central dispersion coordinate on detector [DISPAXIS]", &FitStatus);
        fits_write_key(fptr, TSTRING, "DISPDW   ", strValue,        "Approximate central dispersion per pixel on the detector", &FitStatus);
   // TODO : Table 15 Enclosure, environment, and weather specific keywords
    fits_write_record(fptr, "        ------------------------------------------------------------------------", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    floatValue = 0.f;
//    fits_write_key(fptr, TFLOAT,  "DOMEPAN  ", &floatValue, "Dome position angle [degrees E of N]", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "DOMTEM   ", &floatValue, "Dome temperature [degrees C]", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "DOMHUM   ", &floatValue, "Dome relative humidity [%]", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "DOMDEWPT ", &floatValue, "Dome dew point [degrees C]", &FitStatus);

    fits_write_record(fptr, "        ------------------------------------------------------------------------", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "ENVTEM   ", &tenv.lbt_temp, "Outside temperature, C, at MJD-OBS", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "ENVPRE   ", &tenv.lbt_pressure, "Atmospheric pressure [mbar]", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "ENVWIN   ", &tenv.smt_wind_speed, "Outside wind speed (m/s) at MJD-OBS", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "ENVDIR   ", &tenv.smt_wind_dir, "(degrees) Direction of wind: E from N", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "ENVHUM   ", &tenv.lbt_humidity, "Outside relative humidity % at MJD-OBS", &FitStatus);
    //   fits_write_key(fptr, TFLOAT,  "ENVDEWPT ", &tenv.lbt_dewpoint, "Outside dew point (degrees C) at MJD-OBS", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
//    fits_write_key(fptr, TFLOAT,  "ENVTAU   ", &tenv.smt_tau, "Opacity at 225 GHz, from SMT", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "SEEING   ", &tenv.dimm_seeing, "Seeing estimate from S-H WFS", &FitStatus);
Fulvio Laudisio's avatar
Fulvio Laudisio committed
//    std::string operator_comment = " no comment by operator ";
//    fits_write_key(fptr, TSTRING, "WEATHER  ", su::get_char_star(operator_comment), "Comment by telescope operator or observer", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "SEEWAV   ", &floatValue, "Wavelength for seeing estimate", &FitStatus);
//    fits_write_key(fptr, TFLOAT,  "SEECAL   ", &floatValue, "Seeing: S-H to seeing calibration curve", &FitStatus);
void SeqDataMgr::getTelescopeEnv(STelescopeEnv & env)
{

    // DIMMFWHM                 DIMM seeing, [arcsecs]                      DIMMSeeing (DIMMSeeingZenith, DIMMSeeingElevation)
    // DIMMFLUX                 DIMM mean centroid flux                     DIMMMeanFlux
    // LBTWLINK                 Weather Station Link State                  LBTWeatherAlive (LBTWeatherAliveFront)
    // LBTPRES                  Ambient Pressure [hPa]                      LBTPressure
    // LBTTEMP                  Ambient Temperature [deg C]                 LBTTemp
    // LBTHUM                   LBT Relative Humidity [percent]             LBTHumidity
    // LBTDWPT                  LBT Dew Point [deg C]                       LBTDewPoint
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    static Nice::Date lastCall;
    Nice::Date currentCall = Nice::Date::now();
    if(currentCall - lastCall < Nice::Time::seconds(5))return;

    lbto::result res;
    lbto::DDstruct ddt;
    lbto::SeqDD dd;
    ddt.DDname = "DIMMSeeingZenith";                  //float         //1
    ddt.DDname = "DIMMSeeingElevation";               //float         //2
    dd.push_back(ddt);
    ddt.DDname = "LBTWeatherAlive";                   //bool          //3
    dd.push_back(ddt);
    ddt.DDname = "LBTPressure";                       //float         //4
    dd.push_back(ddt);
    ddt.DDname = "LBTTemp";                           //float         //5
    dd.push_back(ddt);
    ddt.DDname = "LBTHumidity";                       //float         //6
    dd.push_back(ddt);
    ddt.DDname = "LBTDewPoint";                       //float         //7
    dd.push_back(ddt);
    ddt.DDname = "LBTWindSpeed";                      //float         //8
    dd.push_back(ddt);
    ddt.DDname = "LBTWindDir";                        //float         //9
Davide Ricci's avatar
Davide Ricci committed
    dd.push_back(ddt);
    ddt.DDname = "LBTWindDirRaw";                     //float         //10
Davide Ricci's avatar
Davide Ricci committed
    dd.push_back(ddt);
    ddt.DDname = "LBTWindSpeedFront";                 //float         //11
Davide Ricci's avatar
Davide Ricci committed
    dd.push_back(ddt);
    ddt.DDname = "LBTWindDirFront";                   //float         //12
    dd.push_back(ddt);
    ddt.DDname = "LBTWindDirFrontRaw";                //float         //13
    dd.push_back(ddt);

    ddt.DDname = "AirMass";                           //float         //14
    dd.push_back(ddt);

    ddt.DDname = "ELPosition";                        //float         //15
    dd.push_back(ddt);
    ddt.DDname = "AZPosition";                        //float         //16
    dd.push_back(ddt);
    ddt.DDname = "L_AchievedALT";                     //float         //17
    dd.push_back(ddt);
    ddt.DDname = "L_AchievedAZ";                      //float         //18
    dd.push_back(ddt);
    ddt.DDname = "AZTrackingState";                   //String        //19
    dd.push_back(ddt);
    ddt.DDname = "ELTrackingState";                   //String        //20
    dd.push_back(ddt);
Fulvio Laudisio's avatar
Fulvio Laudisio committed

    ddt.DDname = "L_PresetRotMode";                   //String        //21
    dd.push_back(ddt);
    ddt.DDname = "L_AOmode";                          //String        //22
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "Epoch";                             //float         //23
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_TargetRA";                        //float         //24
    dd.push_back(ddt);
    ddt.DDname = "L_TargetDEC";                       //float         //25
    dd.push_back(ddt);
    ddt.DDname = "L_AchievedRA";                      //float         //26
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AchievedDEC";                     //float         //27
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AchievedRAHMS";                   //String        //28
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AchievedDECDMS";                  //String        //29
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AOReferenceRA";                   //float         //30
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AOReferenceDEC";                  //float         //31
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AORefMag";                        //float         //32
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_GuideRA";                         //float         //33
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_GuideDEC";                        //float         //34
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_DECOffset";                       //float         //35
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_RAOffset";                        //float         //36
    dd.push_back(ddt);
    ddt.DDname = "L_POXOffset";                       //float         //37
    dd.push_back(ddt);
    ddt.DDname = "L_POYOffset";                       //float         //38
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);

    ddt.DDname = "L_AOOffsetX";                       //float         //39  // WFS_LBTI_SX_baysidex_L_PSO_CUR 1; WFS_LBTI_SX_auxloops_L_modalplotTask_MAG
    ddt.DDname = "L_AOOffsetY";                       //float         //40
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_AOOffsetZ";                       //float         //41
    dd.push_back(ddt);

    ddt.DDname = "L_NSRATRKRate";                     //float         //42
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    ddt.DDname = "L_NSDECTRKRate";                    //float         //43
    dd.push_back(ddt);

    ddt.DDname = "MoonAlt";                           //float         //44
    dd.push_back(ddt);
    ddt.DDname = "MoonAz";                            //float         //45
    dd.push_back(ddt);
    ddt.DDname = "SunAlt";                            //float         //46
    dd.push_back(ddt);
    ddt.DDname = "SunAz";                             //float         //47
    dd.push_back(ddt);

    ddt.DDname = "LST";                               //String        //48
    dd.push_back(ddt);
    ddt.DDname = "ParAngle";                          //float         //49
    dd.push_back(ddt);
    ddt.DDname = "L_PointingModel";                  //String         //50
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    dd.push_back(ddt);
    //ddt.DDname = "UTC";
    //dd.push_back(ddt);
Fulvio Laudisio's avatar
Fulvio Laudisio committed

    bool get_parameters = true;
    int retry_counter = 0;
    while(get_parameters)
    {
        get_parameters = false;
        try
        {
            res = m_iif->iifGetParameter(dd);
        }
        catch(Basda::ServiceIsBusyException)
        {
Fulvio Laudisio's avatar
Fulvio Laudisio committed
            if(retry_counter && retry_counter % 10 == 0)
            {
                W_LLOG("Busy : retrying " << retry_counter);
            }
            retry_counter++;
            get_parameters = true;
            usleep(50000);
            continue;
        }
        catch(const std::exception& e)
        {
            W_LLOG(e.what());
            return;
        }
        catch(...)
        {
            std::string what = boost::current_exception_diagnostic_information();
            std::string toErase = "std::exception::what :";
            size_t pos = what.find(toErase);
            if(pos != std::string::npos)what.erase(pos, toErase.length());
            what.erase(std::remove(what.begin(), what.end(), '\n'), what.end());
            std::stringstream log_msg;
            log_msg << "Error trying getting DD parmateres : " << what;
            W_LLOG(log_msg.str());
            return;
        }
    }
    if(res.rescode == EXIT_SUCCESS)
    {
        double temp;
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        // std::vector<std::string>::const_iterator it;
        // int counter = 0;
        // for(it = res.resmsg.begin(); it < res.resmsg.end(); it++)
        // {
        //     counter++;
        //     U9_LLOG(counter << " ~ " << *it);
        // }
        env.dimm_seeing_zenith = atof(res.resmsg[1].c_str());          //f   //1
        env.dimm_seeing_elevation = atof(res.resmsg[2].c_str());       //f   //2
        env.lbt_weather_alive = (bool)atoi(res.resmsg[3].c_str());     //b   //3
        env.lbt_pressure = atof(res.resmsg[4].c_str());                //f   //4
        env.lbt_temp = atof(res.resmsg[5].c_str());                    //f   //5
//        U9_LLOG(env.lbt_temp);
        env.lbt_humidity = atof(res.resmsg[6].c_str());                //f   //6
        env.lbt_dewpoint = atof(res.resmsg[7].c_str());                //f   //7
        env.lbt_wind_speed = atof(res.resmsg[8].c_str());              //f   //8
        env.lbt_wind_dir = atof(res.resmsg[9].c_str());                //f   //9
        env.lbt_wind_dir_raw = atof(res.resmsg[10].c_str());           //f   //10
        env.lbt_wind_speed_front = atof(res.resmsg[11].c_str());       //f   //11
        env.lbt_wind_dir_front = atof(res.resmsg[12].c_str());         //f   //12
        env.lbt_wind_dir_raw_front = atof(res.resmsg[13].c_str());     //f   //13

        env.air_mass = atof(res.resmsg[14].c_str());                   //f   //14
        env.mcs_elevation = atof(res.resmsg[15].c_str())/3600;         //f   //15
        env.mcs_azimuth = atof(res.resmsg[16].c_str())/3600;           //f   //16
        env.achieved_alt = atof(res.resmsg[17].c_str());               //f   //17
        env.achieved_az = atof(res.resmsg[18].c_str());                //f   //18
        env.az_tracking_state = res.resmsg[19];                        //S   //19
        env.el_tracking_state = res.resmsg[20];                        //S   //20

        env.telescope_mode = res.resmsg[21];                           //S   //21
        env.ao_mode = res.resmsg[22];                                  //S   //22
        env.epoch = atof(res.resmsg[23].c_str());                      //f   //23
        env.target_ra = atof(res.resmsg[24].c_str());                  //f   //24
        env.target_dec = atof(res.resmsg[25].c_str());                 //f   //25
        env.achieved_ra = atof(res.resmsg[26].c_str());                //f   //26 ?
        env.achieved_dec = atof(res.resmsg[27].c_str());               //f   //27 ?
        env.tcs_ra = res.resmsg[28];                                   //S   //28
        env.tcs_dec = res.resmsg[29];                                  //S   //29
        env.ao_ref_ra = atof(res.resmsg[30].c_str());                  //f   //30
        env.ao_ref_dec = atof(res.resmsg[31].c_str());                 //f   //31
        env.ao_ref_mag = atof(res.resmsg[32].c_str());                 //f   //32
        env.guide_star_ra = atof(res.resmsg[33].c_str());              //f   //33
        env.guide_star_dec = atof(res.resmsg[34].c_str());             //f   //34
        env.target_decoffset = atof(res.resmsg[37].c_str());           //f   //37  (or 35?)
        env.target_raoffset = atof(res.resmsg[38].c_str());            //f   //38  (or 36?)

        env.ao_offsetx = atof(res.resmsg[39].c_str());                 //f   //39
        env.ao_offsety = atof(res.resmsg[40].c_str());                 //f   //40
        env.ao_offsetz = atof(res.resmsg[41].c_str());                 //f   //41

        env.tel_trk_RA = atof(res.resmsg[42].c_str());                 //f   //42
        env.tel_trk_DEC = atof(res.resmsg[43].c_str());                //f   //43

        env.moon_alt = atof(res.resmsg[44].c_str());                   //f   //44
        env.moon_az = atof(res.resmsg[45].c_str());                    //f   //45
        env.sun_alt = atof(res.resmsg[45].c_str());                    //f   //46
        env.sun_az = atof(res.resmsg[47].c_str());                     //f   //47

        env.lst = res.resmsg[48];                                      //S   //48

        env.parallactic_angle = atof(res.resmsg[49].c_str());          //f   //49
        env.pointing_model = res.resmsg[50];                           //S   //50
//        env.utc = atof(res.resmsg[40].c_str());

        //Converting string to int arr
        float rad2deg = 180/M_PI;
        float sec2rad = M_PI/(12*3600);
        int lst_arr[4];
        lst_arr[0] = atoi(env.lst.substr(0,2).c_str());
        lst_arr[1] = atoi(env.lst.substr(3,2).c_str());
        lst_arr[2] = atoi(env.lst.substr(6,2).c_str());
        lst_arr[3] = atoi(env.lst.substr(9,5).c_str()); //5 decimal digits after ','
        float lst = lst_arr[0]*3600 + lst_arr[1]*60 + lst_arr[2] + (float)lst_arr[3]/100000; //division by 100000 due to the choicheq
        U9_LLOG("____________ LST destruct: "<<lst_arr[0]<<" : "<<lst_arr[1]<<" : "<<lst_arr[2]<<" . "<<lst_arr[3]);

        //Converting string to int arr
        int ra_arr[4];
        ra_arr[0] = atoi(env.tcs_ra.substr(0,2).c_str());
        ra_arr[1] = atoi(env.tcs_ra.substr(3,2).c_str());
        ra_arr[2] = atoi(env.tcs_ra.substr(6,2).c_str());
        ra_arr[3] = atoi(env.tcs_ra.substr(9,5).c_str()); //5 decimal digits after ','
        float ra = ra_arr[0]*3600 + ra_arr[1]*60 + ra_arr[2] + (float)ra_arr[3]/100000; //division by 100000 due to the choicheq
        U9_LLOG("____________ RA destruct: "<<ra_arr[0]<<" : "<<ra_arr[1]<<" : "<<ra_arr[2]<<" . "<<ra_arr[3]);

        //Converting float val to int arr in format hh:mm:ss.sss
        float ha = ra-lst;
        if(ha<0) {ha = ha+24*3600;}
        U9_LLOG("____________ ha in seconds: "<<ha);
        int ha_arr[4];
        ha_arr[0] = ha/3600;
        ha_arr[1] = ((int)ha%3600)/60;
        ha_arr[2] = ((int)ha%3600)%60;
        ha_arr[3] = (ha-(int)ha)*1000;
        U9_LLOG("____________ HA destruct: "<<ha_arr[0]<<" : "<<ha_arr[1]<<" : "<<ha_arr[2]<<" . "<<ha_arr[3]);

        std::stringstream hour_angle;
        if(ha_arr[0]<10) {hour_angle<<"0";}
        hour_angle << ha_arr[0] << ":";
        if(ha_arr[1]<10) {hour_angle<<"0";}
        hour_angle << ha_arr[1] << ":";
        if(ha_arr[2]<10) {hour_angle<<"0";}
        hour_angle << ha_arr[2] << "." <<ha_arr[4];
        U9_LLOG("Hour Angle =  "<<hour_angle.str());
        env.hour_angle = hour_angle.str();

        //Converting string to int arr
        int dec_arr[4];
        dec_arr[0] = atoi(env.tcs_dec.substr(0,2).c_str());
        dec_arr[1] = atoi(env.tcs_dec.substr(3,2).c_str());
        dec_arr[2] = atoi(env.tcs_dec.substr(6,2).c_str());
        dec_arr[3] = atoi(env.tcs_dec.substr(9,2).c_str()); //2 decimal digits after ','
        float dec = dec_arr[0] + dec_arr[1]/60 + dec_arr[2]/3600 + (float)dec_arr[3]/(3600*100); //division by 100 due to the choiche
        U9_LLOG("____________ DEC destruct: "<<dec_arr[0]<<" : "<<dec_arr[1]<<" : "<<dec_arr[2]<<" . "<<dec_arr[3]);

        //Converting all values in rad
        ha  = ha*sec2rad;
        dec = dec/rad2deg;
        float lat = 32.701309/rad2deg;
        float h = asin(cos(ha)*cos(dec)*cos(lat)+sin(dec)*sin(lat));
        U9_LLOG("_______________________ h = "<<h<<" rad ,h = "<<h*rad2deg<<" deg. _______ Zen Dist = "<<90-h*rad2deg<<" deg.");
        env.zenith_dist = ceil((90-h*rad2deg)*100)/100;
    }
    else
    {
        for(unsigned int i = 0; i < res.resmsg.size(); i++)
        {
            U9_LLOG(res.resmsg[i]);
        }
    }
}

void SeqDataMgr::getMaskCombo(SInstrumentHeader & ih)
{
    int coro_delimiter = ih.coro_slit_w.type.find(":");
    int coro_word_len = ih.coro_slit_w.type.length()-coro_delimiter;
    std::string coro_named_pos= ih.coro_slit_w.type.substr(coro_delimiter+1,coro_word_len);

    int lyot_delimiter = ih.lyot_grism_w.type.find(":");
    int lyot_word_len = ih.lyot_grism_w.type.length()-lyot_delimiter;
    std::string lyot_named_pos= ih.lyot_grism_w.type.substr(lyot_delimiter+1,lyot_word_len);

    ih.mask_comb.type = coro_named_pos+"+"+lyot_named_pos;

    U9_LLOG("Prova funzione, IH.Mask_Comb : " << ih.mask_comb.type);
}

std::string SeqDataMgr::GetReadoutRegion(int & xmin, int & xmax, int & ymin, int & ymax)
Davide Ricci's avatar
Davide Ricci committed
{
    xmin = xmax = ymin = ymax = 0;
    std::map<std::string, indi::IElement>::const_iterator itRegion;
    const std::map<std::string, indi::IElement> & elements = sashaReadoutRegion.getElements();
    itRegion = elements.find("x1");
Davide Ricci's avatar
Davide Ricci committed
    if(itRegion != elements.end())
Davide Ricci's avatar
Davide Ricci committed
        if(!su::getValue<int>(itRegion->second.get(), xmin)){ W_LLOG("Could not get readout region XMIN value");}
Davide Ricci's avatar
Davide Ricci committed
    else { W_LLOG("Could not find readout region XMIN value");}
    itRegion = elements.find("x2");
Davide Ricci's avatar
Davide Ricci committed
    if(itRegion != elements.end())
    {
        if(!su::getValue<int>(itRegion->second.get(), xmax)){ W_LLOG("Could not get readout region XMAX value");}
    }
Davide Ricci's avatar
Davide Ricci committed
    else { W_LLOG("Could not find readout region XMAX value");}
    itRegion = elements.find("y1");
Davide Ricci's avatar
Davide Ricci committed
    if(itRegion != elements.end())
    {
        if(!su::getValue<int>(itRegion->second.get(), ymin)){ W_LLOG("Could not get readout region YMIN value");}
    }
Davide Ricci's avatar
Davide Ricci committed
    else { W_LLOG("Could not find readout region YMIN value");}
    itRegion = elements.find("y2");
Davide Ricci's avatar
Davide Ricci committed
    if(itRegion != elements.end())
    {
        if(!su::getValue<int>(itRegion->second.get(), ymax)){ W_LLOG("Could not get readout region YMAX value");}
    }
Davide Ricci's avatar
Davide Ricci committed
    else { W_LLOG("Could not find readout region YMAX value");}
    
    std::stringstream activeRegion;
    activeRegion << "["<< xmin <<":"<< xmax <<", "<< ymin <<":"<< ymax << "]";
    return activeRegion.str();
int SeqDataMgr::sashaEnableSave(const std::map<std::string, std::string> & _dSashaSetup)
{
    // To be Implemented
    U6_LLOG(__FUNCTION__ << " ~ DEPRECATED");
    Ice::Int status = EXIT_SUCCESS;
#ifdef UNDEFINED
    IProperty sashaSave(IProperty::Switch), recvProp;
    std::map<std::string, std::string>::const_iterator itFind;
    itFind = _dSashaSetup.find("SAVE");

    // m_ptrIc->connect();
    // NOTE while alive, indiserver does not close the connection to the client.
    // U1_LLOG("Command sasha to save to file");
    U1_LLOG("Command sasha to save to file");

    sashaSave.setDevice("sasha_save");
    sashaSave.setName("enable_save");
    sashaSave.setPerm(IProperty::ReadWrite);
    sashaSave.setState(IProperty::Busy);
    sashaSave.add(IElement("value"));
    // Switch properties can have value On or Off
    sashaSave["value"].setSwitchState(IElement::Off);
    U1_LLOG(sashaSave.getType());
Davide Ricci's avatar
Davide Ricci committed
    if(!(itFind == _dSashaSetup.end()))
Davide Ricci's avatar
Davide Ricci committed
        if((su::str_tolower(itFind->second) == "true") || (itFind->second == "1"))
        {
            sashaSave["value"].setSwitchState(IElement::On);
        }
    }

    //
    m_ptrIc2->send_new_property_wait2(sashaSave, recvProp);
#endif
    // status = m_ptrIc->close();
    U8_LLOG(__FUNCTION__);
    return status;
}


int SeqDataMgr::sashaGetFitsFile(const std::map<std::string, std::string> & _dSashaSetup, const std::string & _instMode, std::string & _outFilename)
{
    U6_LLOG(__FUNCTION__ << " ~ DEPRECATED");
    int status = EXIT_FAILURE;
#ifdef UNDEFINED
        std::string strObjname = "test";
        Ice::CommunicatorPtr dataMgrIC;
        // std::ostringstream streamRsync;
        // std::ostringstream streamFileNum;
        // std::ostringstream streamFileName;
        std::ofstream fout;
        // --Ice.Config=$INSROOT/etc/data_mgr/data_mgr-ice.cfg
    //    char* argvDataMgr[] = { "SequencerI::sashaGetFITSFile",
    //                           "--Ice.Config=/opt/tan/etc/data_mgr/data_mgr-ice.cfg" };
    //    int argcDataMgr = 2;

        // CFITSIO related
                           //
                            // Saving file to disk
                            // filename format is SHARKNIR.YYYY-MM-DDThh:mm:ss.ssssssZ.<_instMode>.fits
                            // this is passed to data manager for future use in mearging headers
                            // and saved in output parameter
                            //

                            // get date of file creation by INDI in ISO8601 format
                            dateISO8601 = recvProp.getTimeStamp().getFormattedIso8601Str();

                            filenameSASHA = "SHARKNIR." + dateISO8601 + "." + _instMode + ".SASHA.fits";

                            filenameSHINS = "SHARKNIR." + dateISO8601 + "." + _instMode + ".fits";


                            /* what follows is most likely old code to be erased
                             at this moment dataMgr will take care of ingesting file to
                             LBT archive mount point

                             // setting filenameSASHA as filename of acquired FITS file to data_mgr for its reference
                             // NOTE: may not be necessary
                             dataMgrIC = Ice::initialize(argcDataMgr, argvDataMgr);
                             Ice::ObjectPrx base = dataMgrIC->stringToProxy("dataManagerAdapter:default -p 10501");
                             sd::fitsFilePrx archiver = sd::fitsFilePrx::checkedCast(base);
Davide Ricci's avatar
Davide Ricci committed
                             if(!archiver)
                             throw("Invalid Proxy");
                             // setting name of SASHA produced FITS in data manager component
                             status = archiver->setCurrentFilenameSASHA(filenameSASHA);
                             U4_LLOG(archiver->getCurrentFilenameSASHA());


                             // creating fits file with no data and with complete+populated header.
                             status = archiver->createEmptyAndPopulateHeader(filnameSHINS, bitpix, naxis, vecNaxes);
                             status = archiver->mergeHeadersAndCopyData(filenameSHINS, filenameSASHA);
                             */
                        }
                    }
                }

            }
        }
        if(dataMgrIC)dataMgrIC->destroy();

        // creating standard vectors with keywords values and comments for SHINS part of header.
        // These vectors will be passed to data manager which will merge them to SASHA header
        // by creating in place a FITS header and merging it to SASHA header, without creating
        // a second file on disk

        // create header only fits file to fill with SHINS values for keywords

        // try 
        // {
        //     dataMgrIC = Ice::initialize(argcDataMgr, argvDataMgr);
        //     Ice::ObjectPrx base = dataMgrIC->stringToProxy("dataManagerAdapter:default -p 10501");
        //     sd::fitsFilePrx archiver = sd::fitsFilePrx::checkedCast(base);
Davide Ricci's avatar
Davide Ricci committed
        //     if(!archiver)
        //         throw("Invalid Proxy");
        //     status = archiver->saveSASHABLOB(toBitsBlob, counter);
        //     status = archiver->setCurrentFilenameSASHA(_outFilenameSASHA);
        // } 
Davide Ricci's avatar
Davide Ricci committed
        // catch(const Ice::Exception& ex)
        // catch(const char* msg)
        // if(dataMgrIC)dataMgrIC->destroy();

        // timeOut = su::convertStringToType<long>(itDit->second)*
        //           su::convertStringToType<float>(itNDit->second)*std::pow(10,6); // time out have to be in micro seconds
        // U1_LLOG("time out = " << timeOut*2 << " micro seconds");
        // IndiProperty sashaSaveFileNum(IndiProperty::Text);
        // IndiProperty sharknirUTCDate(IndiProperty::Number);
        // the method shouhld check on remote INDI property for info on exposure status
        // alredy done by sashaExpose, but to control twice is better
        // _outFilenameSASHA = "No Filename Retrieved";
        // boost::thread fits_notify_thread(inotifierInstance.start, _remotePathToWatch,
        //                                  boost::ref(_outFilenameSASHA),
        //                                  timeOut*6); // create and start thread
        // fits_notify_thread.join();               // Wait for thread to finish
        // check on _outFilenameSASHA
        // fits_notify_thread should have timeout parameter for INotifier::start
        itFind = _dSashaSetup.find("OBJECTNAME");
Davide Ricci's avatar
Davide Ricci committed
        if(!(itFind == _dSashaSetup.end()))strObjname = itFind->second;

        // sashaSaveFileNum = init_indi_property("sasha_save", "largest_filenum", IndiProperty::Text, std::vector<std::string>(1, "value"));

        // vecElemNames.push_back("JD");
        // vecElemNames.push_back("UTC");
        // vecElemNames.push_back("UTCDate");
        // vecElemNames.push_back("LT");
        // vecElemNames.push_back("LST");
        // vecElemNames.push_back("MoonAz");
        // vecElemNames.push_back("MoonAlt");
        // vecElemNames.push_back("MoonElong");
        // vecElemNames.push_back("MoonLit");
        // vecElemNames.push_back("SunAz");
        // vecElemNames.push_back("SunAlt");
        // sharknirUTCDate = init_indi_property("sharknir_time", "Now",
        //                                      IndiProperty::Number,
        //                                      vecElemNames);
        // // NOTE while alive, indiserver does not close the connection to the client.

        // U1_LLOG("Asking INDI for file number ...");
        // m_ptrIc2->send_get_property_wait(sashaSaveFileNum, recvProp);
        // streamFileNum << std::setfill('0') << std::setw(6)
        //               << recvProp["value"].getValue() << std::setfill(' ');

        // recvProp.clear();
        // U1_LLOG("Asking INDI for UTC date ... ");
        // m_ptrIc2->send_get_property_wait(sharknirUTCDate, recvProp);
        // strUTCDate = recvProp["UTCDate"].getValue().substr(2,recvProp["UTCDate"].getValue().size()-2);
        // U1_LLOG("Got " << recvProp["UTCDate"].getValue());
        // U1_LLOG("Extracted " << strUTCDate);
        // streamRsync << "rsync -avzh " << su::get_LLOGin() << "@sashaws::fits/" << strUTCDate
        //             << "/sa_" << strUTCDate << "_" << streamFileNum.str()
        //             << ".fits " << dataDir
        //             << "SHARKNIR_" << strObjname << "_" << recvProp["UTCDate"].getValue()
        //             << "_" << streamFileNum.str() << ".fits";
        // streamFileName << "SHARKNIR_" << strObjname << "_" << recvProp["UTCDate"].getValue()
        //                << "_" << streamFileNum.str() << ".fits";

        // status = std::system(streamRsync.str().c_str());

    }
#endif
    U8_LLOG("");
    return status;
}

Davide Ricci's avatar
Davide Ricci committed
//  Patch to get rid of the timeout problem of sasha driver. NREAD is sent whenever NDIT changes and no other parameters are sent
int SeqDataMgr::sashaEndSetup(std::map<std::string, std::string> & _dTimeoutSetup, bool ndit_changed)
{
    U6_LLOG(__FUNCTION__);
Davide Ricci's avatar
Davide Ricci committed
    int status = EXIT_SUCCESS;
    if(ndit_changed && _dTimeoutSetup.empty())
    {
        IProperty & prop = m_sashaProps.find("NREADS")->second;
        const std::map<std::string, indi::IElement> elements = prop.getElements();
        if(elements.find("value") != elements.end())
        {
            _dTimeoutSetup["NREADS"] = prop["value"].getValue();
        }
        else
        {
            std::stringstream log_msg;
            log_msg << "Error : IProperty \"" << prop.getDevice() << "." << prop.getName() << "\" from INDI Server has changed";
            E_LLOG(log_msg.str());
            throw(std::runtime_error(log_msg.str()));
        }
    }
    std::map<std::string, std::string>::iterator itSetup;
    int num_properties = _dTimeoutSetup.size();
    int counter = 0, sent_properties = 0;
    try
    {
        for(itSetup = _dTimeoutSetup.begin(); itSetup != _dTimeoutSetup.end(); itSetup++)
        {
            if(m_getFitsAbortFlag)break;
            counter++;
            IProperty & prop = m_sashaProps.find(itSetup->first)->second;
            const std::map<std::string, indi::IElement> elements = prop.getElements();
            bool bPropError = false, bSetProperty = false;
            if(elements.find("value") != elements.end())
            {
                if(m_bForcePropertySet || itSetup->second != prop["value"].getValue())
                {
                    prop["value"].setValue<int>(su::convertStringToType<int>(itSetup->second));
                    bSetProperty = true;
                }
            }
            else
                bPropError = true;
            if(bPropError)
            {
                std::stringstream log_msg;
                log_msg << "Error : IProperty \"" << prop.getDevice() << "." << prop.getName() << "\" from INDI Server has changed";
                E_LLOG(log_msg.str());
                throw(std::runtime_error(log_msg.str()));
            }
            else if(bSetProperty || (ndit_changed && sent_properties == 0 && counter == num_properties))
                if(!bSetProperty && (ndit_changed && sent_properties == 0 && counter == num_properties))
                {
                    U9_LLOG("Sending property " << itSetup->first << " to make camera driver recalculate exposure duration");
                }
                m_sashaPropsSet[itSetup->first] = false;
                SendNewProperty(prop);
                sent_properties++;
            }
        }
        bool wait_result = false;
        wait_result = WaitSetMessages(60000000);
        if(!wait_result)status = EXIT_FAILURE;
    }
    catch(...)
    {
        E_LLOG(__FUNCTION__);
        U8_LLOG("");
        throw;
    }
    
    U8_LLOG("");
    return status;
}
int SeqDataMgr::sashaSetup(const std::map<std::string, std::string> & _dSashaExpose)
{
    U6_LLOG(__FUNCTION__);
    int status = EXIT_SUCCESS;
    m_exposeMutex.lock();
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    m_getFitsAbortFlag = 0;
Fulvio Laudisio's avatar
Fulvio Laudisio committed
    bool bObjectNamesSet = false;
Davide Ricci's avatar
Davide Ricci committed
        std::map<std::string, std::string>::iterator itSashaSetup;
        for(itSashaSetup = m_sashaSetup.begin(); itSashaSetup != m_sashaSetup.end(); itSashaSetup++)
        {
Fulvio Laudisio's avatar
Fulvio Laudisio committed
            if(itSashaSetup->first == suc::InstrumentMode)
            {
                itSashaSetup->second = "GEN";
            }
Davide Ricci's avatar
Davide Ricci committed
            else
                itSashaSetup->second.clear();
        }
        std::map<std::string, std::string>::const_iterator itSetup;
        for(itSetup = _dSashaExpose.begin(); itSetup != _dSashaExpose.end(); itSetup++)
        {
            U9_LLOG("Keyword : " << itSetup->first << "; Value : " << itSetup->second);
Davide Ricci's avatar
Davide Ricci committed
            if(m_sashaSetup.find(itSetup->first) == m_sashaSetup.end())
            {
                std::stringstream log_msg;
                log_msg << "Keyword not allowed in sashaExpose : " << itSetup->first;
                E_LLOG(log_msg.str());
                throw(std::invalid_argument(log_msg.str()));
            }
Davide Ricci's avatar
Davide Ricci committed
            m_sashaSetup[itSetup->first] = itSetup->second;
        bool bForceTimeoutRefresh = false;
        bool ndit_changed = false;
        std::map<std::string, std::string> incomingSetup = _dSashaExpose;
        std::map<std::string, std::string> timeoutSetup;
        timeoutSetup = su::extract_setup(m_timeoutSetup, incomingSetup);
        for(itSetup = incomingSetup.begin(); itSetup != incomingSetup.end(); itSetup++)
        {
            if(m_getFitsAbortFlag)break;
            if(itSetup->first == "DIT" || itSetup->first == "InstrumentMode")
            {
            }
            else
            {
    //            U9_LLOG("setup : " << itSetup->first << ":" << itSetup->second);
                IProperty & prop = m_sashaProps.find(itSetup->first)->second;
                const std::map<std::string, indi::IElement> elements = prop.getElements();
                bool bPropError = false, bSetProperty = false;
                if(itSetup->first == "SAVE")
                {
                    bool bSave = true;
                    su::get_bool_from_setup(_dSashaExpose,  "SAVE",  bSave);
                    std::map<std::string, indi::IElement>::const_iterator itEl;
                    if(elements.find("value") != elements.end())
                    {
                        indi::IElement::SwitchStateType switch_state = (bSave ? IElement::On : IElement::Off);
                        if(m_bForcePropertySet || prop["value"].getSwitchState() != switch_state)
                        {
                            prop["value"].setSwitchState(switch_state);
Davide Ricci's avatar
Davide Ricci committed
//                            U9_LLOG("Setting : " << "value" << " to " << bSave);
                    else
                        bPropError = true;
                }
                else if(itSetup->first == "OBJECTNAME")
                {
                    if(elements.find("value") != elements.end())
                    {
                        std::string current_name = prop["value"].getValue();
                        if(m_bForcePropertySet || current_name != itSetup->second)
                        {
                            prop["value"].setValue(itSetup->second);
                            bSetProperty = true;
Fulvio Laudisio's avatar
Fulvio Laudisio committed
                            bObjectNamesSet = true;
                    else
                        bPropError = true;
                }
    //            else if(itSetup->first == "NCOADDS")
    //            {
    //                if(elements.find("num_coadds") != elements.end())
    //                    prop["num_coadds"].setValue<int>(su::convertStringToType<int>(itSetup->second));
    //                else
    //                    bPropError = true;
    //            }
                else if(itSetup->first == "READOUT")
                {
                    if(elements.find("value") != elements.end())
                        if(m_bForcePropertySet || prop["value"].getValue() != itSetup->second)
                        {
                            prop["value"].setValue(itSetup->second);
                            bSetProperty = true;
                        }
                    }
                    else
                        bPropError = true;
                }
                else
                {
                    if(elements.find("value") != elements.end())
                    {
//                        int value = su::convertStringToType<int>(prop["value"].getValue());
                        if(m_bForcePropertySet || itSetup->second != prop["value"].getValue())
                            if(itSetup->first == "NDIT")ndit_changed = true;
                            prop["value"].setValue<int>(su::convertStringToType<int>(itSetup->second));
                            bSetProperty = true;
                        }
                    }
                    else
                        bPropError = true;
                }
                if(bPropError)
                {
                    std::stringstream log_msg;
                    log_msg << "Error : IProperty \"" << prop.getDevice() << "." << prop.getName() << "\" from INDI Server has changed";
                    E_LLOG(log_msg.str());
                    throw(std::runtime_error(log_msg.str()));
                }
                else if(bSetProperty)
                {
                    m_sashaPropsSet[itSetup->first] = false;
                    SendNewProperty(prop);
                }
            }
        }
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        updateInstrumentHeader();
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        if(false && !bObjectNamesSet)
Fulvio Laudisio's avatar
Fulvio Laudisio committed
        {
            const std::map<std::string, indi::IElement> elements = sashaObjName.getElements();
            if(elements.find("value") != elements.end())
            {
                m_sashaPropsSet["OBJECTNAME"] = false;
                sashaObjName["value"].setValue(m_TcsPreset.object_name);
                SendNewProperty(sashaObjName);
            }
        }
        bool wait_result = false;
        wait_result = WaitSetMessages(60000000);
        if(!wait_result)status = EXIT_FAILURE;
Davide Ricci's avatar
Davide Ricci committed
        int status2 = sashaEndSetup(timeoutSetup, ndit_changed);
        if(status == EXIT_FAILURE || status2 == EXIT_FAILURE)status = EXIT_FAILURE;
    }
    catch(...)
    {
        m_exposeMutex.unlock();
        U8_LLOG("");
        throw;
    }
    m_exposeMutex.unlock();
    U8_LLOG(__FUNCTION__ << " exiting");
    return status;
}


int SeqDataMgr::sashaSetFrequency(const std::map<std::string, std::string> & _dSashaExpose)
{
    U6_LLOG(__FUNCTION__);
    int status = EXIT_SUCCESS;
    m_exposeMutex.lock();
    try
    {
        std::map<std::string, std::string>::const_iterator itSetup;
        itSetup = _dSashaExpose.find("FREQUENCY");
        if(itSetup != _dSashaExpose.end())
        {
            IProperty & prop = m_sashaProps.find(itSetup->first)->second;
            const std::map<std::string, indi::IElement> elements = prop.getElements();
            if(elements.find("value") != elements.end())
            {
                if(m_bForcePropertySet || prop["value"].getValue() != itSetup->second)
                {
                    prop["value"].setValue(itSetup->second);
                    m_sashaPropsSet[itSetup->first] = false;
                    SendNewProperty(prop);
                    //camera reinitializes and readout region is reset