Changeset 14161


Ignore:
Timestamp:
06/12/12 23:41:39 (13 years ago)
Author:
tbretz
Message:
Added the possibility to start no dim-server; added some checks for the existance and accessibility of the given path; some small updates and improvements to the error handling; added zero-event check
File:
1 edited

Legend:

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

    r14145 r14161  
    99#include "Database.h"
    1010#endif
     11
     12#include <sys/stat.h> //for file stats
    1113
    1214#include "Dim.h"
     
    358360class StateMachineSmartFACT : public StateMachineDim
    359361{
     362public:
     363    static bool fIsServer;
     364
    360365private:
    361366    enum states_t
     
    391396    deque<string> fMcpConfigurationHist;
    392397
     398    bool fLastRunFinishedWithZeroEvents;
     399
    393400    enum weather_t { kWeatherBegin=0, kTemp = kWeatherBegin, kDew, kHum, kPress, kWind, kGusts, kDir, kWeatherEnd = kDir+1 };
    394401    deque<float> fMagicWeatherHist[kWeatherEnd];
     
    427434
    428435    deque<float> fFtmControlTriggerRateHist;
    429     uint32_t     fFtmControlNewRunStarted;
    430     uint32_t     fFtmControlTriggerRateTooLow;
     436     int32_t     fFtmControlTriggerRateTooLow;
    431437
    432438    float fFtmPatchThresholdMed;
     
    748754            out << "</#><br/>";
    749755            fMcpConfigurationHist.push_back(out.str());
     756
     757            fLastRunFinishedWithZeroEvents = fFadControlNumEvents==0;
    750758        }
    751759
     
    12841292        }
    12851293
    1286         const double crate = d.Get<float>(20);    // Camera rate
     1294        const float *crate = d.Ptr<float>(20); // Camera rate
    12871295
    12881296        // New run started
    1289         if (crate<0)
    1290         {
    1291             fFtmControlNewRunStarted     = 0;
    1292             fFtmControlTriggerRateTooLow = 0;
     1297        if (*crate<0)
     1298        {
     1299            fFtmControlTriggerRateTooLow = -1;
    12931300            return GetCurrentState();
    12941301        }
     
    12981305        // by the MCP. Hence, we get a warning. So we have to require
    12991306        // two consecutive low rates.
    1300         if (crate<0.1)
     1307        if (*crate<0.1)
    13011308            fFtmControlTriggerRateTooLow++;
    13021309        else
    13031310            fFtmControlTriggerRateTooLow=0;
    13041311
    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
     1312        const float *brates = crate + 1; // Board rate
     1313        const float *prates = brates+40; // Patch rate
    13091314
    13101315        // Store a history of the last 60 entries
    1311         fFtmControlTriggerRateHist.push_back(crate);
    1312         if (fFtmControlTriggerRateHist.size()>60)
     1316        fFtmControlTriggerRateHist.push_back(*crate);
     1317        if (fFtmControlTriggerRateHist.size()>300)
    13131318            fFtmControlTriggerRateHist.pop_front();
    13141319
     
    13251330        out << setprecision(3);
    13261331        out << d.GetJavaDate() << '\n';
    1327         out << HTML::kWhite << '\t' << crate << '\n';
     1332        out << HTML::kWhite << '\t' << *crate << '\n';
    13281333
    13291334        ofstream(fPath+"/trigger.data") << out.str();
    13301335
    1331         const Statistics bstat(vector<float>(brates, brates+40));
     1336        const Statistics bstat(vector<float>(brates, brates+ 40));
    13321337        const Statistics pstat(vector<float>(prates, prates+160));
    13331338
     
    15721577        const float *ptr = d.Ptr<float>(4);
    15731578
    1574         double avg =   0;
     1579        double avg =0;
    15751580        int num = 0;
    15761581
    15771582        for (const float *t=ptr; t<ptr+4; t++)
    1578             if (*t>0)
     1583            if (*t>0 && *t<=100)
    15791584            {
    15801585                avg += *t;
     
    15821587            }
    15831588
    1584         fFscControlHumidityAvg = avg/num;
     1589        fFscControlHumidityAvg = num>0 ? avg/num : 0;
    15851590
    15861591        return GetCurrentState();
     
    20442049
    20452050        newerr |= SetError(bias_on && fFeedbackCalibration.size()>0 && fBiasControlCurrentMed>80,
    2046                            "Median current exceeds 80&micro;A/pix");
     2051                           "Median current exceeds 80&micro;A/pix exceeds 80&micro;A/pix");
    20472052        newerr |= SetError(bias_on && fFeedbackCalibration.size()>0 && fBiasControlCurrentMax>100,
    20482053                           "Maximum current exceeds 100&micro;A/pix");
     
    20592064                           "Sensor temperature exceeds outside temperature by more than 8&deg;C");
    20602065
    2061         newerr |= SetError(fFtmControlNewRunStarted>0 && fFtmControlTriggerRateTooLow>1 && fDimMcp.state()==MCP::State::kTakingData,
     2066        newerr |= SetError(fFtmControlTriggerRateTooLow>2 && fDimMcp.state()==MCP::State::kTakingData,
    20622067                           "Trigger rate below 100mHz during data taking");
    20632068
     
    20722077                           fFeedbackCalibration.size()==0,
    20732078                           "Bias voltage switched on, but bias crate not calibrated");
     2079
     2080        newerr |= SetError(fLastRunFinishedWithZeroEvents,
     2081                           "Last run finshed, but contained zero events.");
     2082
     2083        fLastRunFinishedWithZeroEvents = false;
    20742084
    20752085        // FTM in Connected instead of Idle --> power cyclen
     
    23432353        {
    23442354            string col = HTML::kGreen;
    2345             if (fFtmControlTriggerRateHist.size()>0 && fFtmControlNewRunStarted>0)
     2355            if (fFtmControlTriggerRateHist.size()>0)
    23462356            {
    23472357                if (fFtmControlTriggerRateHist.back()<15)
     
    24742484
    24752485public:
    2476     StateMachineSmartFACT(ostream &out=cout) : StateMachineDim(out, "SMART_FACT"),
     2486    StateMachineSmartFACT(ostream &out=cout) : StateMachineDim(out, fIsServer?"SMART_FACT":""),
    24772487        fLastAstroCalc(boost::date_time::neg_infin),
    24782488        fPath("www/smartfact/data"),
     
    24812491        fMcpConfigurationMaxTime(0),
    24822492        fMcpConfigurationMaxEvents(0),
     2493        fLastRunFinishedWithZeroEvents(false),
    24832494        fTngWeatherDustTime(Time::none),
    24842495        fBiasControlVoltageMed(0),
     
    26142625        fDatabase = conf.Get<string>("source-database");
    26152626
     2627        struct stat st;
     2628        if (stat(fPath.c_str(), &st))
     2629        {
     2630            Error(fPath+" does not exist!");
     2631            return 2;
     2632        }
     2633
     2634        if ((st.st_mode&S_IFDIR)==0)
     2635        {
     2636            Error(fPath+" not a directory!");
     2637            return 3;
     2638        }
     2639
     2640        if ((st.st_mode&S_IWUSR)==0)
     2641        {
     2642            Error(fPath+" has no write permission!");
     2643            return 4;
     2644        }
     2645
     2646        if ((st.st_mode&S_IXUSR)==0)
     2647        {
     2648            Error(fPath+" has no execute permission!");
     2649            return 5;
     2650        }
     2651
    26162652        ostringstream out;
    26172653        out << Time().JavaDate() << '\n';
    26182654
    2619         ofstream(fPath+"/errorhist.data") << out.str();
    2620         ofstream(fPath+"/error.data")     << out.str();
     2655        ofstream(fPath+"/errorhist.data")    << out.str();
     2656        ofstream(fPath+"/error.data")        << out.str();
    26212657
    26222658        return -1;
    26232659    }
    26242660};
     2661
     2662bool StateMachineSmartFACT::fIsServer = false;
    26252663
    26262664// ------------------------------------------------------------------------
     
    26312669int RunShell(Configuration &conf)
    26322670{
     2671    StateMachineSmartFACT::fIsServer = !conf.Get<bool>("client");
    26332672    return Main::execute<T, StateMachineSmartFACT>(conf);
    26342673}
     
    26412680        ("path",            var<string>("www/smartfact/data"), "Output path for the data-files")
    26422681        ("source-database", var<string>(), "Database link as in\n\tuser:password@server[:port]/database.")
     2682        ("client",          po_bool(false), "For a standalone client choose this option.")
    26432683        ;
    26442684
Note: See TracChangeset for help on using the changeset viewer.