Ignore:
Timestamp:
06/10/12 14:51:43 (12 years ago)
Author:
tbretz
Message:
Added run-number to ovservation list; create hist-visibility.bin containing the visibility curves of all database sources; some updates and improvements to the warnings (mainly the warning in case of no trigger rate) and the drive deviation. Small updates to audio
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/smartfact.cc

    r14140 r14145  
    422422
    423423     int64_t fFadControlNumEvents;
     424     int64_t fFadControlStartRun;
    424425     int32_t fFadControlDrsStep;
    425426    vector<uint32_t> fFadControlDrsRuns;
    426427
    427428    deque<float> fFtmControlTriggerRateHist;
    428     bool         fFtmControlNewRunStarted;
     429    uint32_t     fFtmControlNewRunStarted;
     430    uint32_t     fFtmControlTriggerRateTooLow;
    429431
    430432    float fFtmPatchThresholdMed;
     
    526528
    527529    template<class T>
    528         void WriteBinaryVec(const EventImp &d, const string &fname, const vector<T> &vec, double scale, double offset=0)
     530        void WriteBinaryVec(const Time &tm, const string &fname, const vector<T> &vec, double scale, double offset=0, const string &title="")
    529531    {
    530532        if (vec.size()==0)
    531533            return;
    532534
    533         const Statistics stat(vec[0]);
    534 
    535535        ostringstream out;
    536         out << d.GetJavaDate() << '\n';
     536        out << tm.JavaDate() << '\n';
    537537        out << offset << '\n';
    538538        out << offset+scale << '\n';
    539539        out << setprecision(3);
    540         out << stat.min << '\n';
    541         out << stat.med << '\n';
    542         out << stat.max << '\x7f';
     540        if (!title.empty())
     541            out << title <<  '\x7f';
     542        else
     543        {
     544            const Statistics stat(vec[0]);
     545            out << stat.min << '\n';
     546            out << stat.med << '\n';
     547            out << stat.max << '\x7f';
     548        }
    543549        for (auto it=vec.begin(); it!=vec.end(); it++)
    544550        {
     
    565571
    566572    template<class T>
     573        void WriteBinaryVec(const EventImp &d, const string &fname, const vector<T> &vec, double scale, double offset=0, const string &title="")
     574    {
     575        WriteBinaryVec(d.GetTime(), fname, vec, scale, offset, title);
     576    }
     577
     578    template<class T>
     579        void WriteBinary(const Time &tm, const string &fname, const T &t, double scale, double offset=0)
     580    {
     581        WriteBinaryVec(tm, fname, vector<T>(&t, &t+1), scale, offset);
     582    }
     583
     584    template<class T>
    567585        void WriteBinary(const EventImp &d, const string &fname, const T &t, double scale, double offset=0)
    568586    {
    569         WriteBinaryVec(d, fname, vector<T>(&t, &t+1), scale, offset);
     587        WriteBinaryVec(d.GetTime(), fname, vector<T>(&t, &t+1), scale, offset);
    570588    }
    571589
     
    716734        if (fMcpConfigurationState==MCP::State::kTakingData && d.GetQoS()==MCP::State::kIdle)
    717735        {
    718             //...and no script is running just play a simple 'tick'
    719             if (fDimControl.state()<-2)
     736            // ...and no script is running just play a simple 'tick'
     737            // ...and a script is running just play a simple 'tick'
     738            if (/*fDimControl.state()<-2 &&*/ fDimControl.scriptdepth==0)
    720739                SetAudio("dong");
    721 
    722             // ...and a script is running just play a simple 'tick'
    723             if (fDimControl.state()>=-2)
     740            else
    724741                SetAudio("losticks");
    725742
    726743            ostringstream out;
    727             out << d.GetTimeAsStr("%H:%M:%S") << " <#darkgreen>" << d.Ptr<char>(16);
     744            out << d.GetTimeAsStr("%H:%M:%S") << " <#darkred>" << d.Ptr<char>(16);
    728745            if (!fDriveControlSourceName.empty())
    729746                out << " [" << fDriveControlSourceName << ']';
     747            out << " (N=" << fFadControlNumEvents << ')';
    730748            out << "</#><br/>";
    731749            fMcpConfigurationHist.push_back(out.str());
     
    738756
    739757            ostringstream out;
    740             out << d.GetTimeAsStr("%H:%M:%S") << " <#darkred>" << fMcpConfigurationName;
     758            out << d.GetTimeAsStr("%H:%M:%S") << " <#darkgreen>" << fMcpConfigurationName;
    741759            if (!fDriveControlSourceName.empty())
    742760                out << " [" << fDriveControlSourceName << ']';
     761            if (fFadControlStartRun>0)
     762                out << " (Run " << fFadControlStartRun << ')';
    743763            out << "</#><br/>";
    744764            fMcpConfigurationHist.push_back(out.str());
     
    11751195    }
    11761196
     1197    int HandleFadStartRun(const EventImp &d)
     1198    {
     1199        if (!CheckDataSize(d, "FadControl:StartRun", 16))
     1200        {
     1201            fFadControlStartRun = -1;
     1202            return GetCurrentState();
     1203        }
     1204
     1205        fFadControlStartRun = d.Get<int64_t>();
     1206
     1207        return GetCurrentState();
     1208    }
     1209
    11771210    int HandleFadDrsRuns(const EventImp &d)
    11781211    {
     
    12461279    {
    12471280        if (!CheckDataSize(d, "FtmControl:TriggerRates", 24+160+640+8))
     1281        {
     1282            fFtmControlTriggerRateTooLow = 0;
    12481283            return GetCurrentState();
     1284        }
    12491285
    12501286        const double crate = d.Get<float>(20);     // Camera rate
     
    12531289        if (crate<0)
    12541290        {
    1255             fFtmControlNewRunStarted = true;
     1291            fFtmControlNewRunStarted     = 0;
     1292            fFtmControlTriggerRateTooLow = 0;
    12561293            return GetCurrentState();
    12571294        }
    1258         fFtmControlNewRunStarted = false;
    1259 
    1260         const float *brates = d.Ptr<float>(24);     // Board rate
    1261         const float *prates = d.Ptr<float>(24+160); // Patch rate
     1295
     1296        // At the end of a run sometimes the trigger rate drops (the
     1297        // service is trasmitted) before the run is 'officially' finished
     1298        // by the MCP. Hence, we get a warning. So we have to require
     1299        // two consecutive low rates.
     1300        if (crate<0.1)
     1301            fFtmControlTriggerRateTooLow++;
     1302        else
     1303            fFtmControlTriggerRateTooLow=0;
     1304
     1305        fFtmControlNewRunStarted++;
     1306
     1307        const float *brates = d.Ptr<float>(24);                  // Board rate
     1308        const float *prates = d.Ptr<float>(24+40*sizeof(float)); // Patch rate
    12621309
    12631310        // Store a history of the last 60 entries
     
    15761623        out << HTML::kWhite << '\t' << fFtmBoardThresholdMed << '\n';
    15771624        out << HTML::kWhite << '\t' << fFtmPatchThresholdMed << '\n';
    1578         out << HTML::kWhite << '\t' << pow(10, fRateScanDataHist[0].back()) << '\n';
    1579         out << HTML::kWhite << '\t' << max << '\n';
     1625        out << HTML::kWhite << '\t' << floor(pow(10, fRateScanDataHist[0].back())+.5) << '\n';
     1626        out << HTML::kWhite << '\t' << floor(max+.5) << '\n';
    15801627
    15811628        ofstream(fPath+"/ratescan.data") << out.str();
     
    17211768    }
    17221769
     1770#ifdef HAVE_NOVA
     1771    pair<vector<float>, pair<Time, float>> GetVisibility(ln_equ_posn *src, ln_lnlat_posn *observer, double jd)
     1772    {
     1773        jd = floor(jd);
     1774
     1775        const double jd0 = fmod(fSun.fSetAstronomical.JD(),  1);
     1776        const double jd1 = fmod(fSun.fRiseAstronomical.JD(), 1);
     1777
     1778        ln_equ_posn  moon;
     1779        ln_equ_posn *pos = src ? src : &moon;
     1780
     1781        double max   = 0;
     1782        double maxjd = jd0;
     1783
     1784
     1785        vector<float> alt;
     1786        for (double h=0; h<1; h+=1./(24*12))
     1787        {
     1788            if (src==0)
     1789                ln_get_lunar_equ_coords(jd+h, &moon);
     1790
     1791            ln_hrz_posn hrz;
     1792            ln_get_hrz_from_equ(pos, observer, jd+h, &hrz);
     1793
     1794            if (h>jd0 && h<jd1 && hrz.alt>15)
     1795                alt.push_back(hrz.alt);
     1796
     1797            if (hrz.alt>max)
     1798            {
     1799                max   = hrz.alt;
     1800                maxjd = jd+h;
     1801            }
     1802        }
     1803
     1804        if (max<15)
     1805            return make_pair(vector<float>(), make_pair(Time(), 0));
     1806
     1807        return make_pair(alt, make_pair(maxjd, maxjd>jd0+jd&&maxjd<jd1+jd?max:0));
     1808    }
     1809#endif
     1810
    17231811    void UpdateAstronomy()
    17241812    {
     
    17621850
    17631851        if (!fMoon.visible)
    1764             out << HTML::kWhite << "\t&mdash;\n";
     1852            out << HTML::kWhite << "\t&mdash;\t\n";
    17651853        else
    17661854        {
     
    17791867        }
    17801868
    1781         ostringstream out2;
     1869        ostringstream out2, out3;
    17821870        out2 << setprecision(3);
    17831871        out2 << now.JavaDate() << '\n';
     1872        out3 << now.JavaDate() << '\n';
     1873
     1874        map<Time, pair<string, float>> culmination;
     1875        vector<vector<float>> alt;
     1876
     1877#ifdef HAVE_NOVA
     1878        ln_lnlat_posn observer;
     1879        observer.lng = lon;
     1880        observer.lat = lat;
     1881
     1882        const pair<vector<float>, pair<Time, float>> vism = GetVisibility(0, &observer, now.JD());
     1883        if (vism.first.size()>0)
     1884        {
     1885            alt.push_back(vism.first);
     1886            culmination[vism.second.first] = make_pair("Moon", vism.second.second);
     1887        }
     1888#endif
    17841889
    17851890#ifdef HAVE_SQL
     
    17911896            out  << HTML::kWhite << '\t';
    17921897            out2 << HTML::kWhite << '\t';
     1898            out3 << HTML::kWhite << '\t';
    17931899
    17941900            for (vector<mysqlpp::Row>::const_iterator v=res.begin(); v<res.end(); v++)
     
    17981904                const double dec  = (*v)[2];
    17991905#ifdef HAVE_NOVA
    1800                 ln_lnlat_posn observer;
    1801                 observer.lng = lon;
    1802                 observer.lat = lat;
    1803 
    18041906                ln_equ_posn pos;
    18051907                pos.ra  = ra*15;
     
    18081910                ln_hrz_posn hrz;
    18091911                ln_get_hrz_from_equ(&pos, &observer, now.JD(), &hrz);
     1912
     1913                const pair<vector<float>, pair<Time, float>> vis = GetVisibility(&pos, &observer, now.JD());
     1914                if (vis.first.size()>0)
     1915                {
     1916                    alt.push_back(vis.first);
     1917                    culmination[vis.second.first] = make_pair(name, vis.second.second);
     1918                }
     1919
     1920                //out3 << vis.second.first << "/" << vis.second.second << " ";
    18101921
    18111922                string col = HTML::kWhite;
     
    18351946                out << "</tr>";
    18361947            }
     1948
     1949            for (auto it=culmination.begin(); it!=culmination.end(); it++)
     1950            {
     1951                if (it!=culmination.begin())
     1952                    out3 << ", ";
     1953                out3 << "<B>" << it->second.first << "</B>";
     1954                if (it->second.second>0)
     1955                    out3 << " [" << nearbyint(90-it->second.second) << "&deg;]";
     1956            }
     1957
     1958            ostringstream title;
     1959            title << "Alt ";
     1960            title << fSun.fSetAstronomical.GetAsStr("%H:%M");
     1961            title << " / ";
     1962            title << ((fSun.fRiseAstronomical-fSun.fSetAstronomical)/20).minutes();
     1963            title << "' / ";
     1964            title << fSun.fRiseAstronomical.GetAsStr("%H:%M");
     1965
    18371966            out  << '\n';
    18381967            out2 << '\n';
     1968            out3 << '\n';
    18391969            out  << HTML::kWhite << '\t' << Time()-now << '\n';
    18401970            out2 << HTML::kWhite << '\t' << Time()-now << '\n';
     1971
     1972            WriteBinaryVec(now, "hist-visibility", alt, 75, 15, title.str());
    18411973        }
    18421974        catch (const exception &e)
     
    18461978            out  << HTML::kWhite << '\t' << "ERROR  - "+string(e.what()) << '\n';
    18471979            out2 << HTML::kWhite << '\t' << "ERROR  - "+string(e.what()) << '\n';
     1980            out3 << HTML::kWhite << '\t' << "ERROR  - "+string(e.what()) << '\n';
    18481981        }
    18491982#endif
     
    18511984        ofstream(fPath+"/moon.data") << out.str();
    18521985        ofstream(fPath+"/source-list.data") << out2.str();
     1986        ofstream(fPath+"/visibility.data") << out3.str();
    18531987    }
    18541988
     
    19252059                           "Sensor temperature exceeds outside temperature by more than 8&deg;C");
    19262060
    1927         if (fFtmControlTriggerRateHist.size()>0 && !fFtmControlNewRunStarted)
    1928         {
    1929             newerr |= SetError(fFtmControlTriggerRateHist.size()>0 && fFtmControlTriggerRateHist.back()<0.01 && fDimMcp.state()==MCP::State::kTakingData,
    1930                                "Trigger rate below 10mHz during data taking");
    1931         }
     2061        newerr |= SetError(fFtmControlNewRunStarted>0 && fFtmControlTriggerRateTooLow>1 && fDimMcp.state()==MCP::State::kTakingData,
     2062                           "Trigger rate below 100mHz during data taking");
    19322063
    19332064        newerr |= SetError(fDimTimeCheck.state()==1,
     
    21162247        if (fDimDNS.online() && fDimDriveControl.state()>=Drive::State::kArmed)   // Armed, Moving, Tracking
    21172248        {
    2118             const double dev = fDriveControlTrackingDevHist.size()>0 ? fDriveControlTrackingDevHist.back() : 0;
     2249            const uint32_t dev = fDriveControlTrackingDevHist.size()>0 ? round(fDriveControlTrackingDevHist.back()) : 0;
    21192250            const State rc = fDimDriveControl.description();
    21202251            string col = HTML::kGreen;
     
    21672298                }
    21682299        }
    2169 
    21702300        if (fDimDNS.online() && fDimDriveControl.state()==0x100)   // Armed, Moving, Tracking
    21712301            out << " [ERR]";
     
    22132343        {
    22142344            string col = HTML::kGreen;
    2215             if (fFtmControlTriggerRateHist.size()>0 && !fFtmControlNewRunStarted)
     2345            if (fFtmControlTriggerRateHist.size()>0 && fFtmControlNewRunStarted>0)
    22162346            {
    22172347                if (fFtmControlTriggerRateHist.back()<15)
     
    24372567        Subscribe("FAD_CONTROL/EVENTS")
    24382568            (bind(&StateMachineSmartFACT::HandleFadEvents,           this, placeholders::_1));
     2569        Subscribe("FAD_CONTROL/START_RUN")
     2570            (bind(&StateMachineSmartFACT::HandleFadStartRun,         this, placeholders::_1));
    24392571        Subscribe("FAD_CONTROL/DRS_RUNS")
    24402572            (bind(&StateMachineSmartFACT::HandleFadDrsRuns,          this, placeholders::_1));
Note: See TracChangeset for help on using the changeset viewer.