00001 #include "BDSwicPeds.h"
00002 #include "BDDevices.h"
00003
00004 #include <RawData/RawBeamMonBlock.h>
00005 #include <RawData/RawBeamMonHeaderBlock.h>
00006
00007 #include <MessageService/MsgService.h>
00008 CVSID("$Id: BDSwicPeds.cxx,v 1.10 2005/05/12 18:48:31 bv Exp $");
00009
00010
00011 using namespace std;
00012
00013
00014 const float maximum_toroid_intensity = 0.1;
00015
00016 const float maximum_bpm_intensity = 5.0;
00017
00018
00019
00020 const float dae_jitter = 0.300;
00021
00022 const float dae_vme_padding = 0.100;
00023
00024 BDSwicPeds::BDSwicPeds()
00025 {
00026 this->Clear();
00027 }
00028
00029 BDSwicPeds::BDSwicPeds(const SwicMap& map)
00030 : fSwicMap(map)
00031 {
00032 this->Clear();
00033 }
00034
00035 void BDSwicPeds::Clear()
00036 {
00037 fBeginTS = VldTimeStamp::GetEOT();
00038 fEndTS = VldTimeStamp::GetBOT();
00039
00040 size_t nswics = fSwicMap.size();
00041 if (!nswics) {
00042 vector<string> swics = BDDevices::SwicDevices();
00043 for (size_t ind=0; ind<swics.size(); ++ind) {
00044 MSG("BD",Msg::kDebug)
00045 << "BDSwicPeds::Clear: adding " << swics[ind] << endl;
00046 fSwicMap[swics[ind]] = new UtilRunningAverageVector(96);
00047 }
00048 return;
00049 }
00050 SwicMap::iterator it, done = fSwicMap.end();
00051 for (it=fSwicMap.begin(); it != done; ++it)
00052 it->second->Clear();
00053 }
00054
00055 BDSwicPeds::~BDSwicPeds()
00056 {
00057 SwicMap::iterator it, done = fSwicMap.end();
00058 for (it=fSwicMap.begin(); it != done; ++it)
00059 delete it->second;
00060 fSwicMap.clear();
00061 }
00062
00063 double total(const RawBeamData& rbd)
00064 {
00065 int siz = rbd.GetDataLength();
00066 if (!siz) return 0;
00067
00068 const double* data= rbd.GetData();
00069 double tot=0;
00070 for (int ind=0; ind<siz; ++ind) tot += data[ind];
00071 return tot;
00072 }
00073
00074 bool BDSwicPeds::IsPedSpill(const RawBeamMonBlock& rbmb)
00075 {
00076
00077
00078 const char* toroids[] = { "E:TR101D", "E:TOR101", "E:TRTGTD", "E:TORTGT", 0 };
00079 for (int ind=0; toroids[ind]; ++ind) {
00080 const RawBeamData *rbd = rbmb[toroids[ind]];
00081 if (!rbd) {
00082 MSG("BD",Msg::kDebug)
00083 << "SetSpill bailing because can't get toroid " << toroids[ind] << endl;
00084 return false;
00085 }
00086 double tot = total(*rbd);
00087 if (tot > maximum_toroid_intensity) {
00088 MSG("BD",Msg::kVerbose)
00089 << "SetSpill bailing because toroid " << toroids[ind]
00090 << " intensity too high: "
00091 << tot << " > " << maximum_toroid_intensity << endl;
00092 return false;
00093 }
00094 }
00095
00096
00097
00098 vector<string> bpm_intensity = BDDevices::BpmIntensities();
00099 for (size_t ind=0; ind<bpm_intensity.size(); ++ind) {
00100 const RawBeamData *rbd = rbmb[bpm_intensity[ind].c_str()];
00101 if (!rbd) continue;
00102 double tot = total(*rbd);
00103 if (tot > maximum_bpm_intensity) {
00104 MSG("BD",Msg::kDebug)
00105 << "SetSpill bailing because bpm " << bpm_intensity[ind]
00106 << " intensity too high: "
00107 << tot << " > " << maximum_bpm_intensity << endl;
00108 return false;
00109 }
00110 }
00111
00112
00113
00114 vector<string> swics = BDDevices::SwicDevices();
00115 RawBeamSwicData swic;
00116 double delay = rbmb.TclkTriggerDelay()/1.0e3;
00117 for (size_t ind=0; ind<swics.size(); ++ind) {
00118 const RawBeamData *rbd = rbmb[swics[ind].c_str()];
00119 if (!rbd) continue;
00120 swic.SetData(*rbd);
00121 double delta = rbd->GetSeconds() - swic.VmeSeconds() - delay;
00122 delta += rbd->GetMsecs()/1.0e3 - swic.VmeNanoseconds()/1.0e9;
00123
00124 if (delta < -dae_vme_padding || delta > dae_jitter+dae_vme_padding ) {
00125 MSG("BD",Msg::kWarning)
00126 << "SetSpill bailing, SWIC " << swics[ind]
00127 << " DAE-delay-VME time delta bad: "
00128 << delta << endl;
00129 return false;
00130 }
00131
00132 }
00133
00134 return true;
00135 }
00136
00137
00138 void BDSwicPeds::SetSpill(const RawBeamMonHeaderBlock& rbmhb,
00139 const RawBeamMonBlock& rbmb)
00140 {
00141 VldTimeStamp vts = rbmhb.GetTimeStamp();
00142 if (vts < fBeginTS) fBeginTS = vts;
00143 if (vts > fEndTS) fEndTS = vts;
00144
00145 if (!BDSwicPeds::IsPedSpill(rbmb)) return;
00146
00147
00148
00149 SwicMap::iterator it, done = fSwicMap.end();
00150 for (it=fSwicMap.begin(); it != done; ++it) {
00151 const RawBeamData* rbd = rbmb[it->first];
00152 if (!rbd) continue;
00153
00154 RawBeamSwicData rbsd(*rbd);
00155 vector<int> idata;
00156 rbsd.UnscaledWireData(idata);
00157 vector<double> ddata;
00158 for (size_t ind=0; ind<idata.size(); ++ind)
00159 ddata.push_back((double)idata[ind]);
00160 it->second->Add(ddata);
00161 }
00162 }
00163
00164 const UtilRunningAverageVector* BDSwicPeds::GetChannels(const char* name) const
00165 {
00166 SwicMap::const_iterator it = fSwicMap.find(name);
00167 if (it == fSwicMap.end()) return 0;
00168 return it->second;
00169 }
00170
00171 const BDSwicPeds::SwicMap& BDSwicPeds::GetAllChannels() const
00172 {
00173 return fSwicMap;
00174 }
00175 BDSwicPeds::SwicMap& BDSwicPeds::GetAllChannels()
00176 {
00177 return fSwicMap;
00178 }