Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

BDSwicPeds.cxx

Go to the documentation of this file.
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 // e12 protons, anything more and there is beam
00014 const float maximum_toroid_intensity = 0.1; 
00015 // units?, anything more and there is beam
00016 const float maximum_bpm_intensity = 5.0;
00017 
00018 // Determine if DAE and VME times are consistent:
00019 // seconds, the worse case jitter in DAE timestamps
00020 const float dae_jitter = 0.300;
00021 // seconds, generous safety padding in addition to jitter
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(); // yes, EOT.
00038     fEndTS   = VldTimeStamp::GetBOT(); // yes, BOT
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     // First find empty spills by requiring the toroids
00077     // to be existing and quiet
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     // It's been found that some spills will have protons even with
00097     // quiet toroids!  So, require quiet BPMs as well.
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;     // Don't just bail in case a BPM is simply removed
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     // Go through SWIC devices and check if the VME and DAE times are
00113     // compatible.
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     // If we get here we are reasonably sure there are no protons in
00148     // the pipe.
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 }

Generated on Mon Nov 23 05:26:10 2009 for loon by  doxygen 1.3.9.1