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
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
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
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];
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 }