• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

onlinemonitor/faspmonitor/TFaspProc.cxx (r4864/r3724)

Go to the documentation of this file.
00001 #include "TFaspProc.h"
00002 
00003 #include "TClass.h"
00004 #include "TROOT.h"
00005 #include "TSystem.h"
00006 #include "TGo4MbsEvent.h"
00007 #include "TGo4MbsSubEvent.h"
00008 #include "TGo4UserException.h"
00009 #include "TGo4Log.h"
00010 
00011 #include "TGo4Analysis.h"
00012 
00013 #include "base/commons.h"
00014 
00015 #include "TFaspEvent.h"
00016 #include "TGo4Picture.h"
00017 
00018 TFaspProc::TFaspProc () :
00019    TCBMBeamtimeProc()
00020 {
00021 }
00022 
00023 TFaspProc::TFaspProc (const char* name) :
00024               TCBMBeamtimeProc (name)
00025 {
00026    TGo4Log::Info("TFaspProc: Create instance %s", GetName());
00027 
00029    fPar = (TFaspParam *) MakeParameter ("FaspPar", "TFaspParam", "set_FaspPar.C");
00030 
00031    fOutEvent = 0;
00032    
00033    fLastSync = 0;
00034    fLastSyncTm = 0;
00035    fLastAdcTm = 0;
00036 
00037    fSyncDiff = MakeTH1('I', "FASP/FASP_SyncDiff", "Number difference between two consequent syncs", 100, 0, 100, "id");
00038    fSignalTmDiff = MakeTH1('I', "FASP/FASP_SignalTmDiff", "Time difference between SYNC and signal", 100000, -0.1, 0.1, "sec");
00039    fSignalTmDiffFine = MakeTH1('I', "FASP/FASP_SignalTmDiffFine", "Time difference between SYNC and signal", 40, -1000, 1000, "ns");
00040    fSyncTmDiff = MakeTH1('I', "FASP/FASP_SyncTimeDiff", "Time difference between two consequent syncs", 10000, 0, 1.0, "sec");
00041 
00042    for (int n=0;n<Fasp_NumChannels;n++)
00043       hADCs[n] = MakeTH1('I', Form("FASP/FASP_Channel%d", n), Form("FASP ADC channel %d", n), 1024, 0, 1024, "adc");
00044 
00045    fTmCond = MakeWinCond("FASP/FaspTimeWindow", -300, -100., fSignalTmDiffFine->GetName());
00046 
00047    ExecuteScript("set_FaspCond.C");
00048 }
00049 
00050 
00051 TFaspProc::~TFaspProc ()
00052 {
00053 }
00054 
00055 void TFaspProc::InitEvent (TGo4EventElement* outevnt)
00056 {
00061    if (fOutEvent == 0)
00062    {
00063       TCBMBeamtimeEvent* btevent = dynamic_cast <TCBMBeamtimeEvent*> (outevnt);
00064       if (btevent)
00065          fOutEvent = dynamic_cast <TFaspEvent*> (btevent->GetSubEvent("FASP"));
00066       else
00067          fOutEvent = dynamic_cast <TFaspEvent*> (outevnt);
00068 
00069       if (fOutEvent==0) {
00070          printf("STOPPING HERE\n");
00071          GO4_STOP_ANALYSIS_MESSAGE ("**** TFaspProc: Fatal error: output event is not a TFaspEvent!!! STOP GO4");
00072       }
00073    }
00074 }
00075 
00076 void TFaspProc::ProcessSubevent (TGo4MbsSubEvent* psubevt)
00077 {
00078 #if __GO4BUILDVERSION__ > 40500
00079    Bool_t oldevent = IsKeepInputEvent();
00080    SetKeepInputEvent(kFALSE);   
00081    if(oldevent) return;         
00082 #endif
00083 
00084    if (psubevt->GetProcid() != roc::proc_FASP) return;
00085 
00086    fOutEvent->SetValid(kFALSE);
00087 
00088    uint8_t* pdata = (uint8_t*) psubevt->GetDataField();
00089   //  Int_t byte_len = psubevt->GetByteLen();   // work only with go4 4.5.3 and higher
00090    Int_t byte_len = (psubevt->GetDlen()-2)*sizeof(Short_t);
00091    
00092    const int blocksize = 44;
00093    
00094    if (byte_len % blocksize != 0) {
00095       fprintf(stderr,"Wrong size of raw data in FASP subevent\n");
00096       fOutEvent->SetValid(kFALSE);
00097       return;
00098    }
00099 
00100    bool first_block = true;
00101 
00102    unsigned adcs[Fasp_NumChannels];
00103    unsigned sync_num, adc_tm, sync_tm;
00104    
00105    // process all blocks, which are in raw data
00106    while (byte_len > 0) {
00107 
00108       for (int n=0;n<Fasp_NumChannels;n++) {
00109          adcs[n] = pdata[1] + pdata[0]*4;
00110          hADCs[n]->Fill(adcs[n]);
00111          if (fPar->printEvent) printf("ADC%02d = %02x %02x  ", n, pdata[0], pdata[1]);
00112          pdata+=2;
00113       }
00114 
00115       sync_num = pdata[2] * 0x10000 + pdata[3] * 0x100 + pdata[4];
00116       if (fPar->printEvent) printf("SYNC = 0x%06x", sync_num);
00117       pdata+=6;
00118 
00119       adc_tm = pdata[2] + pdata[1] * 0x100 + pdata[0] * 0x10000;
00120       if (fPar->printEvent) printf(" AdcTm = %02x %02x %02x", pdata[0], pdata[1],pdata[2]);
00121       pdata+=3;
00122 
00123       sync_tm = pdata[2] + pdata[1] * 0x100 + pdata[0] * 0x10000;
00124       if (fPar->printEvent) printf(" SyncTm = %02x %02x %02x\n", pdata[0], pdata[1],pdata[2]);
00125       pdata+=3;
00126 
00127       UInt_t tm_diff = (adc_tm - sync_tm) & 0xffffff;
00128       double signal_sec = (tm_diff > 0x800000) ? -5e-8 * (0x1000000 - tm_diff) : 5e-8 * tm_diff;
00129 
00130       fSignalTmDiff->Fill(signal_sec);
00131       fSignalTmDiffFine->Fill(signal_sec * 1e9);
00132 
00133       if (fLastSync && (fLastSync != sync_num)) {
00134          tm_diff = (sync_tm - fLastSyncTm) & 0xffffff;
00135          // here we expects only positive values
00136          double tm_sec = tm_diff * 5e-8;
00137 
00138          fSyncDiff->Fill(sync_num - fLastSync);
00139 
00140          if (sync_num == fLastSync + 1)
00141             fSyncTmDiff->Fill(tm_sec);
00142       }
00143 
00144 
00145       fLastSync = sync_num;
00146       fLastSyncTm = sync_tm;
00147       fLastAdcTm = adc_tm;
00148 
00149       byte_len -= blocksize;
00150 
00151       bool take_data = first_block;
00152       if (fTmCond->IsEnabled())
00153          take_data = fTmCond->Test(signal_sec);
00154 
00155       if (take_data) {
00156          for (int n=0;n<Fasp_NumChannels;n++)
00157             fOutEvent->fAdcs[n] = adcs[n]; // ?? do we need to swap
00158          fOutEvent->fSyncNumber = sync_num;
00159          fOutEvent->fAdcTm = adc_tm;
00160          fOutEvent->fSyncTm = sync_tm;
00161 
00162          fOutEvent->SetValid(kTRUE);
00163       }
00164 
00165       first_block = false;
00166    }
00167 }

Generated on Tue Dec 10 2013 04:52:23 for ROCsoft by  doxygen 1.7.1