00001 #include "BDEarliest.h"
00002 #include "BDDevices.h"
00003
00004 #include <TString.h>
00005
00006 #include <RawData/RawBeamMonHeaderBlock.h>
00007 #include <RawData/RawBeamMonBlock.h>
00008 #include <RawData/RawBeamData.h>
00009 #include <RawData/RawBeamSwicData.h>
00010
00011 #include <cmath>
00012 using namespace std;
00013
00014 #include "MessageService/MsgService.h"
00015 CVSID("$Id: BDEarliest.cxx,v 1.6 2005/11/07 23:59:31 bv Exp $");
00016
00017
00018 BDEarliest::BDEarliest()
00019 : fDae(0), fVme(0), fLastDae(0), fLastVme(0), fBefore(0), fAfter(0)
00020 {
00021 this->SetAllowedVmeDeviation();
00022 }
00023
00024 static double find_earliest(const RawBeamMonBlock& rbmb, const vector<string>& dev)
00025 {
00026 double earliest=-1;
00027 for (size_t ind=0; ind < dev.size(); ++ind) {
00028 const RawBeamData* rbd = rbmb[dev[ind]];
00029 if (!rbd) continue;
00030
00031 double dae = rbd->GetSeconds() + rbd->GetMsecs()/1.0e3;
00032 if (earliest < 0 || dae < earliest)
00033 earliest = dae;
00034 }
00035 return earliest;
00036 }
00037 void BDEarliest::CalculateEarliest(const RawBeamMonBlock& rbmb,
00038 double& dae_out, double& vme_out,
00039 float before, float after)
00040 {
00041
00042 double earliest_vme=-1, earliest_dae=-1;
00043
00044 RawBeamSwicData swic;
00045
00046 vector<string> swic_names = BDDevices::SwicDevices();
00047
00048 const float delay = rbmb.TclkTriggerDelay()/1000.0;
00049 MSG("BD",Msg::kVerbose)
00050 << "TCLK trigger delay is " << delay << endl;
00051
00052
00053 for (size_t ind=0; ind<swic_names.size(); ++ind) {
00054 const RawBeamData* rbd = rbmb[swic_names[ind]];
00055 if (!rbd) continue;
00056
00057 double dae = rbd->GetSeconds() + rbd->GetMsecs()/1.0e3 - delay;
00058
00059 if (earliest_dae < 0 || dae < earliest_dae)
00060 earliest_dae = dae;
00061
00062 if (!swic.SetData(*rbd)) continue;
00063
00064 double vme = swic.VmeSeconds() + swic.VmeNanoseconds()/1.0e9;
00065
00066 if (vme < 1.0) continue;
00067
00068 double diff = dae-vme;
00069
00070 if (diff < before || diff > after) {
00071 MSG("BD",Msg::kDebug)
00072 << swic_names[ind] << " has too large dae-vme=" << diff << endl;
00073 continue;
00074 }
00075
00076
00077
00078 if (earliest_vme < 0 || vme < earliest_vme) earliest_vme = vme;
00079 }
00080
00081 if (earliest_vme < 0) earliest_vme = 0.0;
00082 if (earliest_dae < 0) {
00083 double tmp = find_earliest(rbmb,BDDevices::Toroids());
00084 if (tmp>1 && tmp<earliest_dae) earliest_dae = tmp;
00085 }
00086 if (earliest_dae < 0) {
00087 double tmp = find_earliest(rbmb,BDDevices::BpmPositions());
00088 if (tmp>1 && tmp<earliest_dae) earliest_dae = tmp;
00089 }
00090 if (earliest_dae < 0)
00091 earliest_dae = 0;
00092
00093 dae_out = earliest_dae;
00094 vme_out = earliest_vme;
00095
00096 MSG("BD",Msg::kVerbose)
00097 << Form("dae = %16.3f, vme = %16.3f, diff = %.3f",
00098 earliest_dae, earliest_vme, earliest_dae - earliest_vme)
00099 << endl;
00100 }
00101
00102 void BDEarliest::SetSpill(const RawBeamMonHeaderBlock& ,
00103 const RawBeamMonBlock& rbmb)
00104 {
00105 fLastDae = fDae;
00106 fLastVme = fVme;
00107
00108 fDae = fVme = 0.0;
00109
00110 BDEarliest::CalculateEarliest(rbmb,fDae,fVme,fBefore,fAfter);
00111 }