Changeset 16381


Ignore:
Timestamp:
05/28/13 13:48:41 (11 years ago)
Author:
tbretz
Message:
There is no need to copy shared_ptrs when the pointer is kept valid outside of the scope of the function; updated applyCalib to support also step removal; replaced post by emplace where applicable; removed the obsolete DisconnectSlot; reset data-taking status (fRunInProgress) when the current run is closed manually; to improve the performance of calibApply one would need to buffer the dim service updates in its own queue
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/EventBuilderWrapper.h

    r16108 r16381  
    332332            return;
    333333
     334        fRunInProgress = -1;
     335
    334336        if (addr==tcp::endpoint())
    335337        {
    336             DisconnectSlot(i);
     338            // In this order
     339            g_port[i].sockDef = 0;
     340
     341            fDimIncomplete.setQuality(0);
     342            fDimIncomplete.Update(uint64_t(0));
    337343            return;
    338344        }
     
    351357    }
    352358
    353     void DisconnectSlot(unsigned int i)
    354     {
    355         if (i>39)
    356             return;
    357 
    358         g_port[i].sockDef = 0;
    359         // In this order
    360 
    361         fDimIncomplete.setQuality(0);
    362         fDimIncomplete.Update(uint64_t(0));
    363     }
    364359    void IgnoreSlot(unsigned int i)
    365360    {
     
    448443    }
    449444
    450     virtual int CloseOpenFiles() { CloseRunFile(); return 0; }
     445    virtual int CloseOpenFiles() { CloseRunFile(); fRunInProgress = -1; return 0; }
    451446
    452447
     
    478473    }
    479474
    480     bool runOpen(const shared_ptr<EVT_CTRL2> &evt)
    481     {
    482         const uint32_t night = evt->runCtrl->night;
    483         const uint32_t runid = evt->runNum>0 ? evt->runNum : time(NULL);
     475    bool runOpen(const EVT_CTRL2 &evt)
     476    {
     477        const uint32_t night = evt.runCtrl->night;
     478        const uint32_t runid = evt.runNum>0 ? evt.runNum : time(NULL);
    484479
    485480        // If there is still an open file: close it
     
    489484        // Keep a copy of the currently valid drs calibration
    490485        // and associate it to the run control structure
    491         evt->runCtrl->calib = shared_ptr<DrsCalibration>(new DrsCalibration(DataCalib::GetCalibration()));
     486        evt.runCtrl->calib = shared_ptr<DrsCalibration>(new DrsCalibration(DataCalib::GetCalibration()));
    492487
    493488        // FIMXE: Check if file already exists...
     
    509504            // Try to open the file
    510505            FAD::RunDescription desc;
    511             desc.name = evt->runCtrl->runType;
    512 
    513             if (!file->Open(*evt, desc))
     506            desc.name = evt.runCtrl->runType;
     507
     508            if (!file->Open(evt, desc))
    514509                return false;
    515510        }
     
    532527        fNumEvts[kTriggerId] = 0;
    533528        fNumEvts[kCurrent]   = 0;
    534         fDimQueue3.post(make_pair(Time(), fNumEvts));
     529        fDimQueue3.emplace(Time(), fNumEvts);
    535530
    536531        fDimWriteStats.FileOpened(file->GetFileName());
     
    543538    }
    544539
    545     bool runWrite(const shared_ptr<EVT_CTRL2> &e)
    546     {
    547         const EVENT &evt = *e->fEvent;
     540    bool runWrite(const EVT_CTRL2 &e)
     541    {
     542        const EVENT &evt = *e.fEvent;
    548543        if (!fFile->WriteEvt(evt))
    549544            return false;
     
    558553        if (newt>oldt+boost::posix_time::seconds(1))
    559554        {
    560             fDimQueue3.post(make_pair(Time(), fNumEvts));
     555            fDimQueue3.emplace(Time(), fNumEvts);
    561556            oldt = newt;
    562557        }
     
    594589
    595590        // Time for update events before time for update runs
    596         fDimQueue3.post(make_pair(Time(), fNumEvts));
     591        fDimQueue3.emplace(Time(), fNumEvts);
    597592        UpdateRuns();
    598593
     
    609604    }
    610605
    611     bool eventCheck(const shared_ptr<EVT_CTRL2> &evt)
    612     {
    613         const PEVNT_HEADER *fadhd = evt->FADhead.get();
    614         const EVENT *event = evt->fEvent;
     606    bool eventCheck(const EVT_CTRL2 &evt)
     607    {
     608        const EVENT *event = evt.fEvent;
    615609
    616610        const array<uint16_t,2> roi = {{ event->Roi, event->RoiTM }};
     
    618612        if (roi!=fVecRoi)
    619613        {
    620             fDimQueue4.post(make_pair(Time(), roi));
     614            fDimQueue4.emplace(Time(), roi);
    621615            fVecRoi = roi;
    622616        }
    623617
    624         const FAD::EventHeader *beg = reinterpret_cast<const FAD::EventHeader*>(fadhd);
    625         const FAD::EventHeader *end = reinterpret_cast<const FAD::EventHeader*>(fadhd)+40;
     618        const FAD::EventHeader *beg = reinterpret_cast<const FAD::EventHeader*>(evt.FADhead);
     619        const FAD::EventHeader *end = reinterpret_cast<const FAD::EventHeader*>(evt.FADhead)+40;
    626620
    627621        // FIMXE: Compare with target configuration
     
    696690    }
    697691
     692    map<float,array<float, 1440*4>> evtList;
     693
    698694    void applyCalib(const shared_ptr<EVT_CTRL2> &evt)
    699695    {
    700         const PEVNT_HEADER *fadhd = evt->FADhead.get();
    701         const EVENT *event = evt->fEvent;
     696        const EVENT   *event = evt->fEvent;
     697        const int16_t *start = event->StartPix;
     698
     699        // Get the reference to the run associated information
     700        RUN_CTRL2 &run = *evt->runCtrl;
    702701
    703702        // Currently we send any event no matter what its trigger id is...
    704703        // To be changed.
    705704        static Time oldt(boost::date_time::neg_infin);
     705
     706        static uint64_t cnt = 0;
     707
     708        // In case of a need of more performance this cold be split to several threads
    706709        Time newt;
    707 
    708         static int skip = 0;
    709 
    710         // FIXME: Only send events if the have newer run-numbers
    711         if (newt<oldt+boost::posix_time::milliseconds(skip>0 ? 100 : 1000))
    712             return;
    713         oldt = newt;
    714 
    715         // Workaround to find a valid header.....
    716         const FAD::EventHeader *beg = reinterpret_cast<const FAD::EventHeader*>(fadhd);
    717         const FAD::EventHeader *end = reinterpret_cast<const FAD::EventHeader*>(fadhd)+40;
    718 
    719         // FIMXE: Compare with target configuration
    720         const FAD::EventHeader *ptr=beg;
    721         for (; ptr!=end; ptr++)
    722         {
    723             if (ptr->fStartDelimiter!=0)
    724                 break;
    725         }
    726         if (ptr==end)
    727             return;
    728 
    729 
    730         vector<char> data(sizeof(EVENT)+event->Roi*sizeof(float)*(1440+160));
    731         memcpy(data.data(), event, sizeof(EVENT));
    732 
    733         float *vec = reinterpret_cast<float*>(data.data()+sizeof(EVENT));
    734 
    735         evt->runCtrl->calib->Apply(vec, event->Adc_Data, event->StartPix, event->Roi);
    736         DrsCalibrate::RemoveSpikes(vec, event->Roi);
    737 
    738         vector<float> data2(1440*4); // Mean, RMS, Max, Pos
    739         const double max = DrsCalibrate::GetPixelStats(data2.data(), vec, event->Roi);
    740 
    741         // Maximum above roughly 5pe
    742         if (ptr->IsTriggerPhys() && max<100 && skip<10)
    743         {
    744             skip++;
    745             return;
    746         }
    747 
    748         skip = 0;
    749 
    750         fDimRawData.setQuality(ptr->fTriggerType);
    751         fDimRawData.Update(data);
    752 
    753         fDimEventData.setQuality(ptr->fTriggerType);
    754         fDimEventData.Update(data2);
    755 
    756     }
    757 
    758     /*
    759     void SendFeedbackData(PEVNT_HEADER *fadhd, EVENT *event)
    760     {
    761         if (!DataCalib::IsValid())
    762             return;
    763 
    764         // Workaround to find a valid header.....
    765         const FAD::EventHeader *beg = reinterpret_cast<FAD::EventHeader*>(fadhd);
    766         const FAD::EventHeader *end = reinterpret_cast<FAD::EventHeader*>(fadhd)+40;
    767 
    768         // FIMXE: Compare with target configuration
    769 
    770         const FAD::EventHeader *ptr=beg;
    771         for (; ptr<end; ptr++)
    772         {
    773             if (ptr->fStartDelimiter!=0)
    774                 break;
    775         }
    776 
    777         if (ptr==end)
    778             return;
    779 
    780         if (!ptr->HasTriggerLPext() && !ptr->HasTriggerLPint())
    781             return;
    782 
    783         vector<float> data(event->Roi*1440);
    784         DataCalib::Apply(data.data(), event->Adc_Data, event->StartPix, event->Roi);
    785 
    786         DrsCalibrate::RemoveSpikes(data.data(), event->Roi);
    787 
    788         vector<float> data2(1440); // Mean, RMS, Max, Pos, first, last
    789         DrsCalibrate::GetPixelMax(data2.data(), data.data(), event->Roi, 0, event->Roi-1);
    790 
    791         fDimFeedbackData.Update(data2);
    792     }
    793     */
    794 
    795     bool IsRunWaiting()// const
     710        if (newt>=oldt+boost::posix_time::milliseconds(100))
     711        {
     712            // Keep the last update time
     713            oldt = newt;
     714
     715            // ------------------- Copy event data to new memory --------------------
     716            // (to make it thread safe; a static buffer might improve memory handling)
     717            const uint16_t roi = event->Roi;
     718
     719            // ------------------- Apply full DRS calibration ------------------------
     720            // (Is that necessray, or would a simple offset correct do well already?)
     721
     722            // There seems to be a problem using std::array... maybe the size is too big?
     723            // array<float, (1440+160)*1024> vec2;
     724            vector<float> vec((1440+160)*roi);
     725            run.calib->Apply(vec.data(), event->Adc_Data, start, roi);
     726
     727            // ------------------- Appy DRS-step correction --------------------------
     728            for (auto it=run.prevStart.begin(); it!=run.prevStart.end(); it++)
     729            {
     730                DrsCalibrate::CorrectStep(vec.data(), 1440, roi, it->data(), start, roi+10);
     731                DrsCalibrate::CorrectStep(vec.data(), 1440, roi, it->data(), start, 3);
     732            }
     733
     734            // ------------------------- Remove spikes --------------------------------
     735            DrsCalibrate::RemoveSpikes3(vec.data(), roi);
     736
     737            // -------------- Update raw data dim sevice (VERY SLOW) -----------------
     738            const Time tm = evt->time;
     739            if (++cnt%50==0)              // Once every 5s
     740            {
     741                //array<char,sizeof(EVENT)+(1440+160)*1024*sizeof(float)> data1;
     742                vector<char> data1(sizeof(EVENT)+vec.size()*sizeof(float));
     743                memcpy(data1.data(), event, sizeof(EVENT));
     744                memcpy(data1.data()+sizeof(EVENT), vec.data(), vec.size()*sizeof(float));
     745
     746                // This needs to be decoupled for optimum performance!
     747                // Make a queue which does not overfill by maintaining queue size!
     748                fDimRawData.setQuality(evt->trgTyp);
     749                fDimRawData.setData(data1.data(), sizeof(EVENT)+vec.size()*sizeof(float));
     750                fDimRawData.Update(tm);
     751            }
     752
     753            // ------------------------- Basic statistics -----------------------------
     754            DrsCalibrate::SlidingAverage(vec.data(), roi, 10);
     755
     756            array<float, 1440*4> stats; // Mean, RMS, Max, Pos
     757            const double max = DrsCalibrate::GetPixelStats(stats.data(), vec.data(), roi);
     758
     759            // ------------------ Update dim service (statistics) ---------------------
     760            if (evt->trgTyp==0)
     761                evtList[max] = stats;
     762
     763            if (cnt%50==0)
     764            {
     765                if (!evtList.empty())
     766                    stats = evtList.rbegin()->second;
     767
     768                // This needs to be decoupled for optimum performance!
     769                // Make a queue which does not overfill by maintaining queue size!
     770                fDimEventData.setQuality(evtList.empty() ? evt->trgTyp : 0);
     771                fDimEventData.setData(stats.data(), 1440*4*sizeof(float));
     772                fDimEventData.Update(tm);
     773
     774                evtList.clear();
     775            }
     776
     777            // === SendFeedbackData(PEVNT_HEADER *fadhd, EVENT *event)
     778            //
     779            //    if (!ptr->HasTriggerLPext() && !ptr->HasTriggerLPint())
     780            //        return;
     781            //
     782            //    vector<float> data2(1440); // Mean, RMS, Max, Pos, first, last
     783            //    DrsCalibrate::GetPixelMax(data2.data(), data.data(), event->Roi, 0, event->Roi-1);
     784            //
     785            //    fDimFeedbackData.Update(data2);
     786        }
     787
     788        // Keep the start cells of the last five events for further corrections
     789        // As a performance improvement we could also just store the
     790        // pointers to the last five events...
     791        // What if a new run is started? Do we mind?
     792        run.prevStart.emplace_front();
     793        memcpy(run.prevStart.front().data(), start, 1440*sizeof(int16_t));
     794        if (run.prevStart.size()>5)
     795            run.prevStart.pop_back();
     796    }
     797
     798    bool IsRunWaiting()
    796799    {
    797800        const lock_guard<mutex> lock(mtx_newrun);
     
    803806        return fRunNumber;
    804807    }
    805 
    806     /*
    807     bool IsRunFileOpen()
    808     {
    809         return fLastOpened==fRunNumber-1;
    810     }*/
    811808
    812809    bool IncreaseRunNumber(uint32_t run)
     
    953950    void factStat(const GUI_STAT &stat)
    954951    {
    955         fDimQueue1.post(make_pair(Time(), stat));
     952        fDimQueue1.emplace(Time(), stat);
    956953    }
    957954
     
    12121209        fNumConnected = con;
    12131210
    1214         fDimQueue2.post(make_tuple(Time(), changed, h));
     1211        fDimQueue2.emplace(Time(), changed, h);
    12151212    }
    12161213};
     
    12191216
    12201217// ----------- Event builder callbacks implementation ---------------
    1221 bool runOpen(const shared_ptr<EVT_CTRL2> &evt)
     1218bool runOpen(const EVT_CTRL2 &evt)
    12221219{
    12231220    return EventBuilderWrapper::This->runOpen(evt);
    12241221}
    12251222
    1226 bool runWrite(const shared_ptr<EVT_CTRL2> &evt)
     1223bool runWrite(const EVT_CTRL2 &evt)
    12271224{
    12281225    return EventBuilderWrapper::This->runWrite(evt);
     
    12341231}
    12351232
    1236 bool eventCheck(const shared_ptr<EVT_CTRL2> &evt)
     1233bool eventCheck(const EVT_CTRL2 &evt)
    12371234{
    12381235    return EventBuilderWrapper::This->eventCheck(evt);
Note: See TracChangeset for help on using the changeset viewer.