Changeset 13751


Ignore:
Timestamp:
05/16/12 09:34:05 (13 years ago)
Author:
tbretz
Message:
Added time to graphics output; some improvements to coloring; some improvements to state handling - especially for the dimctrl states.
File:
1 edited

Legend:

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

    r13704 r13751  
    101101    public:
    102102        DimState(const string &n, const string s="STATE") :
    103             server(n), info(make_pair(Time(), -2)),
     103            server(n), info(make_pair(Time(), -4)),
    104104            dim((n+"/"+s).c_str(), (void*)NULL, 0, this) { }
    105105
     
    123123
    124124            info = make_pair(Time(tsec, tms*1000),
    125                              disconnected ? -2 : dim.getQuality());
     125                             disconnected ? -4 : dim.getQuality());
    126126
    127127            msg = disconnected ? "" : dim.getString();
     
    130130        const Time &time() const { return info.first; }
    131131        const int  &state() const { return info.second; }
     132
     133        bool online() const { return info.second>-4; }
    132134
    133135        const string &name() const { return server; }
     
    211213    }
    212214
     215    // -------------------------------------------------------------------
     216
    213217    bool HandleService(DimInfo *curr, const DimInfo &service, void (StateMachineSmartFACT::*handle)(const DimData &))
    214218    {
     
    239243
    240244    template<class T>
    241         void WriteBinary(const string &fname, const T &t, double scale, double offset=0)
     245        void WriteBinary(const DimData &d, const string &fname, const T &t, double scale, double offset=0)
    242246    {
    243247        vector<uint8_t> val(t.size(), 0);
     
    255259
    256260        ofstream fout(fPath+"/"+fname+".bin");
     261        fout << d.time.JavaDate() << '\n';
    257262        fout << offset << '\n';
    258263        fout << offset+scale << '\n';
     
    324329        ofstream(fPath+"/"+name+".txt") << out.str();
    325330
    326         WriteBinary("magicweather-"+name+"-hist", fMagicWeatherHist[i], max-min, min);
     331        WriteBinary(d, "magicweather-"+name+"-hist", fMagicWeatherHist[i], max-min, min);
    327332    }
    328333
     
    472477
    473478        // Write the 160 patch values to a file
    474         WriteBinary("feedback-deviation", dev, 1);
     479        WriteBinary(d, "feedback-deviation", dev, 1);
    475480
    476481        const Statistics stat(dev, 3);
    477482
    478483        ostringstream out;
    479         out << setprecision(3);
    480484        out << d.time.JavaDate() << '\n';
    481485        out << kHtmlWhite << '\t' << fFeedbackUserOffset << '\n';
     486        out << setprecision(3);
    482487        out << kHtmlWhite << '\t' << fFeedbackTempOffset << '\n';
    483488        out << kHtmlWhite << '\t' << stat.min << '\n';
     
    510515
    511516        if (fDimBiasControl.state()==BIAS::kVoltageOn)
    512             WriteBinary("biascontrol-voltage", val, 10, 65);
     517            WriteBinary(d, "biascontrol-voltage", val, 10, 65);
    513518        else
    514             WriteBinary("biascontrol-voltage", val, 75);
     519            WriteBinary(d, "biascontrol-voltage", val, 75);
    515520
    516521        ostringstream out;
     
    537542        const bool cal = fFeedbackCalibration.size()>0 && fBiasControlVoltageVec.size()>0;
    538543
     544        double power_tot = 0;
     545        double power_apd = 0;
     546
     547        // 3900 Ohm/n + 1000 Ohm + 1100 Ohm  (with n=4 or n=5)
     548        const double R[2] = { 3075, 2870 };
     549
    539550        // Calibrate the data (subtract offset)
    540551        if (cal)
    541552            for (int i=0; i<320; i++)
    542553            {
     554                // Measued current minus leakage current (bias crate calibration)
    543555                v[i] -= fBiasControlVoltageVec[i]/fFeedbackCalibration[i]*1e6;
    544                 v[i] /= fPixelMap.hv(i).group() ? 5 : 4;
     556
     557                // Total power participated in the camera at the G-APD
     558                // and the serial resistors (total voltage minus voltage
     559                // drop at resistors in bias crate)
     560                power_tot += v[i]*(fBiasControlVoltageVec[i] - 1100e-6*v[i])*1e-6;
     561
     562                // Group index (0 or 1) of the of the pixel (4 or 5 pixel patch)
     563                const int g = fPixelMap.hv(i).group();
     564
     565                // Current per G-APD
     566                v[i] /= g ? 5 : 4;
     567
     568                // Power consumption per G-APD
     569                if (i!=66 && i!=191 && i!=193)
     570                    power_apd += v[i]*(fBiasControlVoltageVec[i]-R[g]*v[i]*1e-6)*1e-6;
    545571            }
     572
     573        // Divide by number of summed channels, concert to mW
     574        power_apd /= 317e-3; // [mW]
     575
     576        if (power_tot<1e-3)
     577            power_tot = 0;
     578        if (power_apd<1e-3)
     579            power_apd = 0;
    546580
    547581        // Get the maximum of each patch
     
    554588
    555589        // Write the 160 patch values to a file
    556         WriteBinary("biascontrol-current", val, 100);
     590        WriteBinary(d, "biascontrol-current", val, 100);
    557591
    558592        const Statistics stat(v, 0, 3);
     
    568602
    569603        // write the history to a file
    570         WriteBinary("biascontrol-current-hist", fBiasControlCurrentHist, 100);
     604        WriteBinary(d, "biascontrol-current-hist", fBiasControlCurrentHist, 100);
    571605
    572606        const string col0 = cal ? kHtmlGreen : kHtmlWhite;
     
    598632
    599633        ostringstream out;
    600         out << setprecision(3);
     634        out << setprecision(2);
    601635        out << d.time.JavaDate() << '\n';
    602636        out << col0 << '\t' << (cal?"yes":"no") << '\n';
     
    605639        out << col3 << '\t' << stat.avg << '\n';
    606640        out << col4 << '\t' << stat.max << '\n';
     641        out << kHtmlWhite << '\t' << power_tot << "W [" << power_apd << "mW]\n";
    607642        ofstream(fPath+"/current.txt") << out.str();
    608643    }
     
    689724        // FIXME: Add statistics for all kind of rates
    690725
    691         WriteBinary("ftmcontrol-triggerrate-hist",
     726        WriteBinary(d, "ftmcontrol-triggerrate-hist",
    692727                    fFtmControlTriggerRateHist, 100);
    693         WriteBinary("ftmcontrol-boardrates",
     728        WriteBinary(d, "ftmcontrol-boardrates",
    694729                    vector<float>(brates, brates+40), 10);
    695         WriteBinary("ftmcontrol-patchrates",
     730        WriteBinary(d, "ftmcontrol-patchrates",
    696731                    vector<float>(prates, prates+160), 10);
    697732
     
    731766        vector<uint16_t> vec(ptr, ptr+160);
    732767
    733         WriteBinary("ftmcontrol-thresholds", vec, 1000);
     768        WriteBinary(d, "ftmcontrol-thresholds", vec, 1000);
    734769
    735770        const Statistics stat(vec);
     
    768803        switch (d.qos)
    769804        {
    770         case 0:  WriteBinary("fadcontrol-eventdata", max, 2,   -1); break;
    771         case 1:  WriteBinary("fadcontrol-eventdata", max, 2,    0); break;
    772         default: WriteBinary("fadcontrol-eventdata", max, 0.25, 0); break;
     805        case 0:  WriteBinary(d, "fadcontrol-eventdata", max, 2,   -1); break;
     806        case 1:  WriteBinary(d, "fadcontrol-eventdata", max, 2,    0); break;
     807        default: WriteBinary(d, "fadcontrol-eventdata", max, 0.25, 0); break;
    773808        }
    774809    }
     
    827862        ofstream(fPath+"/fsc.txt") << out.str();
    828863
    829         WriteBinary("fsccontrol-temperature-hist",
     864        WriteBinary(d, "fsccontrol-temperature-hist",
    830865                    fFscControlTemperatureHist, 30);
    831866    }
     
    853888    void HandleRateScanData(const DimData &d)
    854889    {
    855         if (!CheckDataSize(d, "RateScan:Data", 24+200*40))
     890        if (!CheckDataSize(d, "RateScan:Data", 824))
    856891            return;
    857892
     
    866901        fRateScanDataHist.push_back(rate);
    867902
    868         WriteBinary("ratescan-hist", fRateScanDataHist, 10, -1);
     903        WriteBinary(d, "ratescan-hist", fRateScanDataHist, 10, -2);
    869904    }
    870905
     
    930965        Out() << state.time().GetAsStr("%H:%M:%S.%f").substr(0, 12) << " - ";
    931966        Out() << kBold << state.name() << ": ";
     967        if (rc.index==-3)
     968        {
     969            Out() << kReset << "Offline" << endl;
     970            return;
     971        }
    932972        if (rc.index==-2)
    933         {
    934             Out() << kReset << "Offline" << endl;
    935             return;
    936         }
    937         Out() << rc.name << "[" << rc.index << "]";
     973            Out() << state.state();
     974        else
     975            Out() << rc.name << "[" << rc.index << "]";
    938976        Out() << kReset << " - " << kBlue << rc.comment << endl;
    939977    }
     
    9631001    string GetStateHtml(const DimState &state, int green) const
    9641002    {
     1003        if (!state.online())
     1004            return kHtmlWhite+"\t&mdash;\n";
     1005
     1006        if (&state==&fDimControl)
     1007        {
     1008            ostringstream out;
     1009            out << kHtmlGreen << '\t';
     1010            return kHtmlGreen+'\t'+(state.state()==-3?"Idle":state.msg)+'\n';
     1011        }
     1012
    9651013        const State rc = GetState(state);
    9661014
    967         if (rc.index==-2 && state.state()>-2)
     1015        // Sate not found in list, server online (-3: offline; -2: not found)
     1016        if (rc.index==-2)
    9681017        {
    9691018            ostringstream out;
    970             out << kWhite << '\t' << state.state() << '\n';
     1019            out << kHtmlWhite << '\t' << state.state() << '\n';
    9711020            return out.str();
    9721021        }
     
    9771026
    9781027        if (rc.index<1)
    979             return kHtmlWhite + "\t---\n";
     1028            return kHtmlWhite + "\t&mdash;\n";
    9801029
    9811030
     
    10021051
    10031052        ostringstream out;
    1004         out << now.JavaDate() << '\n';
     1053        out << now.JavaDate() << '\t' << fDimControl.online() << '\n';
    10051054        out << setprecision(3);
    10061055
     
    10091058        {
    10101059            string col = kHtmlBlue;
    1011             if (fMcpConfigurationState!= 5 &&
    1012                 fMcpConfigurationState!=11 &&
    1013                 fMcpConfigurationState!=12) // 9 e.g. Configuring3
     1060            if (fMcpConfigurationState!= 5 &&  // Idle
     1061                fMcpConfigurationState!=11 &&  // Trigger On
     1062                fMcpConfigurationState!=12)    // Taking Data
    10141063                col = kHtmlYellow;
    10151064            else
     
    10171066                    col = kHtmlGreen;
    10181067
    1019             out << col << '\t' << fMcpConfigurationName;
    1020 
    1021             if (fMcpConfigurationMaxEvents>0 || fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12)
    1022                 out << " [";
    1023             if (fMcpConfigurationMaxEvents>0)
     1068            out << col << '\t';
     1069
     1070            if (fDimRateControl.state()==5/*kStateSettingGlobalThreshold*/)
     1071                out << "Rate control in progress";
     1072            else
    10241073            {
    1025                 if (fFadControlNumEvents>0 && fMcpConfigurationState==12)
    1026                     out << fMcpConfigurationMaxEvents-fFadControlNumEvents;
    1027                 else
    1028                     out << fMcpConfigurationMaxEvents;
     1074                if (fMcpConfigurationState!=5 &&
     1075                    fMcpConfigurationState!=11 &&
     1076                    fMcpConfigurationState!=12)
     1077                    out << "Configuring ";
     1078                out << fMcpConfigurationName;
    10291079            }
    1030             if (fMcpConfigurationMaxEvents>0 && (fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12))
    1031                 out << '/';
    1032             if (fMcpConfigurationMaxTime>0)
     1080
     1081            if (fDimMcp.state()>5 && fDimRateControl.state()!=5)
    10331082            {
    1034                 if (fMcpConfigurationState==12)
     1083                if (fMcpConfigurationMaxEvents>0 || fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12)
     1084                    out << " [";
     1085                if (fMcpConfigurationMaxEvents>0)
    10351086                {
    1036 
    1037                     const uint32_t dt = (Time()-fMcpConfigurationRunStart).total_seconds();
    1038                     if (dt>fMcpConfigurationMaxTime)
    1039                         out << "---";
     1087                    if (fFadControlNumEvents>0 && fMcpConfigurationState==12)
     1088                        out << fMcpConfigurationMaxEvents-fFadControlNumEvents;
    10401089                    else
    1041                         out << fMcpConfigurationMaxTime-dt << 's';
     1090                        out << fMcpConfigurationMaxEvents;
     1091                }
     1092                if (fMcpConfigurationMaxEvents>0 && (fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12))
     1093                    out << '/';
     1094                if (fMcpConfigurationMaxTime>0)
     1095                {
     1096                    if (fMcpConfigurationState==12)
     1097                    {
     1098
     1099                        const uint32_t dt = (Time()-fMcpConfigurationRunStart).total_seconds();
     1100                        if (dt>fMcpConfigurationMaxTime)
     1101                            out << "---";
     1102                        else
     1103                            out << fMcpConfigurationMaxTime-dt << 's';
     1104                    }
     1105                    else
     1106                        out << fMcpConfigurationMaxTime << 's';
    10421107                }
    10431108                else
    1044                     out << fMcpConfigurationMaxTime << 's';
     1109                {
     1110                    if (fMcpConfigurationState==12)
     1111                    {
     1112                        ostringstream d;
     1113                        d << Time()-fMcpConfigurationRunStart;
     1114                        out << d.str().substr(3, 5);
     1115                    }
     1116                }
     1117
     1118                if (fMcpConfigurationMaxEvents>0 || fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12)
     1119                    out << ']';
    10451120            }
    1046             else
    1047             {
    1048                 if (fMcpConfigurationState==12)
    1049                 {
    1050                     ostringstream d;
    1051                     d << Time()-fMcpConfigurationRunStart;
    1052                     out << d.str().substr(3, 5);
    1053                 }
    1054             }
    1055 
    1056             if (fMcpConfigurationMaxEvents>0 || fMcpConfigurationMaxTime>0 || fMcpConfigurationState==12)
    1057                 out << ']';
    10581121        }
    10591122        else
     
    10701133            if (rc.index==5) // Armed
    10711134                col = kHtmlWhite;
     1135            if (rc.index==7) // Tracking
     1136            {
     1137                if (fDriveControlTrackingDev>60)   // ~1.5mm
     1138                    col = kHtmlYellow;
     1139                if (fDriveControlTrackingDev>100)  // ~1/4 of a pixel ~ 2.5mm
     1140                    col = kHtmlRed;
     1141            }
    10721142            out << col << '\t';
    1073             out << rc.name << '\t';
     1143
     1144            //out << rc.name << '\t';
    10741145            out << fDriveControlPointingZd  << '\t';
    10751146            out << fDriveControlPointingAz  << '\t';
    10761147            if (fDimDriveControl.state()==7)
    10771148            {
     1149                out << fDriveControlSourceName  << '\t';
    10781150                out << setprecision(2);
    1079                 out << fDriveControlTrackingDev << '\t';
     1151                out << fDriveControlTrackingDev << '\n';
    10801152                out << setprecision(3);
    1081                 out << fDriveControlSourceName  << '\n';
    10821153            }
    10831154            else
     
    11171188            out << col << '\t';
    11181189            out << fMagicWeatherHist[kHum].back()   << '\t';
     1190            out << setprecision(2);
    11191191            out << fMagicWeatherHist[kGusts].back() << '\n';
     1192            out << setprecision(3);
    11201193        }
    11211194        else
     
    11231196
    11241197        // --------------- FtmControl -------------
    1125         if (fDimFtmControl.state()>=FTM::kIdle)
     1198        if (fDimFtmControl.state()==FTM::kTriggerOn)
    11261199        {
    11271200            string col = kHtmlGreen;
     
    11421215            fDimBiasControl.state()==BIAS::kVoltageOff)
    11431216        {
     1217            const bool off = fDimBiasControl.state()==BIAS::kVoltageOff;
     1218            const bool oc  = fDimBiasControl.state()==BIAS::kOverCurrent;
     1219
    11441220            string col = fBiasControlVoltageMed>3?kHtmlGreen:kHtmlWhite;
    11451221            if (fBiasControlCurrentMax>65)
     
    11701246            else
    11711247            {
     1248                out << setprecision(2);
    11721249                out << col << '\t';
    1173                 out << fBiasControlCurrentMed << '\t';
    1174                 if (cal)
    1175                     out << fBiasControlCurrentMax;
     1250                out << (off ? 0 : fBiasControlCurrentMed) << '\t';
     1251                if (oc)
     1252                    out << "(OC) ";
    11761253                else
    1177                     out << "&mdash; ";
     1254                {
     1255                    if (cal)
     1256                        out << (off ? 0 : fBiasControlCurrentMax);
     1257                    else
     1258                        out << "&mdash; ";
     1259                }
    11781260                out << '\t';
     1261                out << setprecision(3);
    11791262            }
    1180             out << fBiasControlVoltageMed << '\n';
     1263            out << (off ? 0 : fBiasControlVoltageMed) << '\n';
    11811264        }
    11821265        else
     
    11911274
    11921275        out.str("");
    1193         out << now.JavaDate() << '\n';
     1276        out << now.JavaDate() << '\t' << fDimControl.online() << '\n';
    11941277
    11951278        if (fDim.state()==0)
     
    12001283
    12011284            out << GetStateHtml(fDimMcp,          4);
    1202             out << kHtmlWhite << '\t' << (fDimControl.state()>-2?fDimControl.msg:"---") << "\n";
     1285            out << GetStateHtml(fDimControl,      0);
    12031286            out << GetStateHtml(fDimDataLogger,   1);
    12041287            out << GetStateHtml(fDimDriveControl, 2);
Note: See TracChangeset for help on using the changeset viewer.