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

beamtime/cosy-nov11/go4/TBeamMonitorProc.cxx (r4864/r3159)

Go to the documentation of this file.
00001 #include "TBeamMonitorProc.h"
00002 #include "TGo4Version.h"
00003 #if __GO4BUILDVERSION__ > 40502
00004 #include "go4iostream.h"
00005 #else
00006 #include "Riostream.h"
00007 #endif
00008 #include "TTimeStamp.h"
00009 #include "TSystem.h"
00010 #include "TROOT.h"
00011 #include "TGo4Log.h"
00012 
00013 #include "TGo4UserException.h"
00014 #include "TGo4MbsEvent.h"
00015 #include "roc/Message.h"
00016 #include "roc/Board.h"
00017 
00018 
00019 TBeamMonitorProc::TBeamMonitorProc(const char* name) :
00020    TCBMBeamtimeProc(name),
00021    fCrateInputEvent(0),
00022    fRocInputEvent(0),
00023    fEpicsInputEvent(0),
00024    fOutputEvent(0)
00025 {
00026    TGo4Log::Info("TBeamMonitorProc: Create instance %s", name);
00027    TString obname, obtitle;
00028 
00029    fPar = (TBeamMonitorParam*) MakeParameter("BeamMonitorPar", "TBeamMonitorParam");
00030 
00031    TString setupmacro = "set_BeamMonitorPar.C";
00032    if (!gSystem->AccessPathName(setupmacro.Data())) {
00033       TGo4Log::Info("Executing beam monitor condition setup script %s", setupmacro.Data());
00034       gROOT->ProcessLine(Form(".x %s", setupmacro.Data()));
00035 
00036    } else {
00037       TGo4Log::Info("NO beam monitor  setup script %s. Use previous values!", setupmacro.Data());
00038    }
00039 
00040    // fCh_Pb = MakeTH2('I', "BeamMonitor/Ch1_Pb", "Cherenkov - Pb", 512, 0., 4096., 512, 0., 4096., "Cherenkov1", "Pb");
00041 
00042    fPmtDiff = MakeTH1('I', "BeamMonitor/PmtDiff", "Time difference between TDC[5][2] and TDC[5][3]", 4096, -2048, +2048, "time");
00043 
00044    // following is for slow control display:
00045    //   fMotorPos = MakeTH2('I', Form("EPICS/MotorPosition"), Form("GEM Motor"),
00046    //         60, 0, 300, 60, 0, 300, "X (mm)", "Y (mm)");
00047    //   fRoluPos = MakeTH2('I', Form("EPICS/ROLUPosition"), Form("Rolu positions"),
00048    //         35, 0, 35, 35, 0, 35, "X (mm)", "Y (mm)");
00049 
00050    TGo4Log::Info("TBeamMonitorProc Histograms created");
00051 }
00052 
00053 
00054 TBeamMonitorProc::~TBeamMonitorProc()
00055 {
00056 }
00057 
00058 
00059 void TBeamMonitorProc::InitEvent(TGo4EventElement* outevnt)
00060 {
00061    // first assign input event:
00062    // since input event object is never discarded within processor lifetime,
00063    // we just search for subevent by name once to speed up processing
00064    if(fCrateInputEvent==0)
00065    {
00066       TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(GetInputEvent());
00067       if(btevent)
00068       {
00069          fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(btevent->GetSubEvent("MBSCRATE"));
00070          fRocInputEvent=dynamic_cast<TRocEvent*>(btevent->GetSubEvent("ROC"));
00071          fEpicsInputEvent=dynamic_cast<TEpicsEvent*>(btevent->GetSubEvent("EPICS"));
00072       }
00073       else
00074       {
00075          fCrateInputEvent=dynamic_cast<TMbsCrateEvent*>(GetInputEvent());
00076 
00077       }
00078       if(fCrateInputEvent==0) {
00079          GO4_STOP_ANALYSIS_MESSAGE("**** TBeamMonitorProc: Fatal error: no input event TMbsCrateEvent!!! STOP GO4");
00080       }
00081       if(fRocInputEvent==0) {
00082          GO4_STOP_ANALYSIS_MESSAGE("**** TBeamMonitorProc: Fatal error: no input event TRocEvent!!! STOP GO4");
00083       }
00084       if(fEpicsInputEvent==0) {
00085          Message(2,"**** TBeamMonitorProc: could not find TEpicsEvent!"); // but do not stop...
00086       }
00087 
00088    }
00089    // then assign output event
00090    // since output event object is never discarded within processor lifetime,
00091    // we just search for subevent by name once to speed up processing
00092    if(fOutputEvent==0)
00093    {
00094       TCBMBeamtimeEvent* btevent=dynamic_cast<TCBMBeamtimeEvent*>(outevnt);
00095       if(btevent)
00096       {
00097          fOutputEvent=dynamic_cast<TBeamMonitorEvent*>(btevent->GetSubEvent("BEAM"));
00098       }
00099       else
00100       {
00101          fOutputEvent= dynamic_cast<TBeamMonitorEvent*>(outevnt);
00102       }
00103       if(fOutputEvent==0) {
00104          GO4_STOP_ANALYSIS_MESSAGE("**** TBeamMonitorProc: Fatal error: output event is not a TBeamMonitorEvent!!! STOP GO4");
00105       }
00106    }
00107 }
00108 
00109 
00110 
00111 void TBeamMonitorProc::FinalizeEvent()
00112 {
00113    if(fCrateInputEvent && fCrateInputEvent->IsValid())
00114    {
00115       fPmtDiff->Fill(fCrateInputEvent->fMtdc[5].lead[2] - fCrateInputEvent->fMtdc[5].lead[3]);
00116 
00117       // fCh_Pb->Fill(fCrateInputEvent->fData1182[1][0], fCrateInputEvent->fData1182[1][5]);
00118 
00119       // fOutputEvent->fIsPion = fPionCond->Test(fCrateInputEvent->fData1182[1][0], fCrateInputEvent->fData1182[1][5]);
00120    }
00121 
00122    if( 0 && fEpicsInputEvent && fEpicsInputEvent->IsValid()) // check if new update has been done
00123    {
00124       // TODO: put reasonable display of interesting slow control variables here
00125 
00126 
00127 
00128       // the following is example from cosy december 2010 beamtime
00129       // note access to EPICS process variables by full name here
00130       /*     int motorx = fEpicsInputEvent->GetDouble("CBM:MOTOR:GETPOSX");
00131      int motory = fEpicsInputEvent->GetDouble("CBM:MOTOR:GETPOSY");
00132      int rolu_left = fEpicsInputEvent->GetDouble("CBM:rolu:step_to_mm_L");
00133      int rolu_right = fEpicsInputEvent->GetDouble("CBM:rolu:step_to_mm_R");
00134      int rolu_up = fEpicsInputEvent->GetDouble("CBM:rolu:step_to_mm_O");
00135      int rolu_down = fEpicsInputEvent->GetDouble("CBM:rolu:step_to_mm_U");
00136 
00137      fMotorPos->SetTitle(
00138            Form("Motor position, EPICS Time:%s -",
00139                  fEpicsInputEvent->GetUpdateTimeString()));
00140      fMotorPos->Fill(motorx, motory);
00141 
00142      fRoluPos->SetTitle(
00143            Form("ROLU positions, EPICS Time:%s -",
00144                  fEpicsInputEvent->GetUpdateTimeString()));
00145      Int_t roludim = 35;
00146      Int_t middle = roludim / 2;
00147      Int_t displaywidth = 6;
00148      for (int i = 0; i < 2 * displaywidth; ++i) {
00149         fRoluPos->Fill(middle - rolu_left, middle - displaywidth + i);
00150         fRoluPos->Fill(middle + rolu_right, middle - displaywidth + i);
00151         fRoluPos->Fill(middle - displaywidth + i, middle - rolu_down);
00152         fRoluPos->Fill(middle - displaywidth + i, rolu_up + middle);
00153      }
00154        */
00155 
00156    } // end EPICS block
00157 }

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