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

BDEarliest.cxx

Go to the documentation of this file.
00001 #include "BDEarliest.h"
00002 #include "BDDevices.h"
00003 
00004 #include <TString.h>            // for Form
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; // skip bogus data
00063 
00064         double vme = swic.VmeSeconds() + swic.VmeNanoseconds()/1.0e9;
00065 
00066         if (vme < 1.0) continue; // skip bogus timestamps
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; // skip bogus timestamps
00074         }
00075 
00076         // Get here, then vme timestamp is non-bogus 
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& /*rbmhb*/,
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 }

Generated on Mon Feb 15 11:06:23 2010 for loon by  doxygen 1.3.9.1