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

BeamMonDbuModule.cxx

Go to the documentation of this file.
00001 #include "BeamMonDbuModule.h"
00002 #include "BMFileSummaryFiller.h"
00003 #include "BMSpillFiller.h"
00004 
00005 #include <BeamDataUtil/BDSwicCalibrator.h>
00006 #include <BeamDataUtil/BDDevices.h>
00007 #include <BeamDataUtil/BDUniquify.h>
00008 
00009 #include <BeamDataUtil/BDEarliest.h>
00010 #include <BeamDataUtil/BDHornCurrent.h>
00011 #include <BeamDataUtil/BDTarget.h>
00012 #include <BeamDataUtil/BDHadMuMon.h>
00013 
00014 #include <RawData/RawRecord.h>
00015 #include <RawData/RawBeamMonHeaderBlock.h>
00016 #include <RawData/RawBeamMonBlock.h>
00017 
00018 
00019 #include <JobControl/JobCModuleRegistry.h>
00020 #include <JobControl/JobCResult.h>
00021 #include <MessageService/MsgService.h>
00022 
00023 #include <DataUtil/GetRawBlock.h>
00024 using namespace DataUtil;
00025 
00026 CVSID("$Id: BeamMonDbuModule.cxx,v 1.14 2005/11/07 21:38:22 bv Exp $");
00027 JOBMODULE(BeamMonDbuModule,
00028           "BeamMonDbu", "Update the database with Beam Monitoring info.");
00029 
00030 BeamMonDbuModule::BeamMonDbuModule()
00031     : JobCModule()
00032     , fPipe()
00033     , fFileSummaryFiller(0)
00034     , fSpillFiller(0)
00035 {
00036     this->FillPipeline();
00037 }
00038 BeamMonDbuModule::~BeamMonDbuModule()
00039 {
00040     MSG("BD",Msg::kInfo) << " BeamMonDbuModule destructor\n";
00041     this->Reap();
00042 }
00043 
00044 void BeamMonDbuModule::Reap()
00045 {
00046     if (fSpillFiller) 
00047         delete fSpillFiller; 
00048     fSpillFiller = 0;
00049 
00050     if (fFileSummaryFiller)
00051         delete fFileSummaryFiller; 
00052     fFileSummaryFiller = 0;
00053 
00054     for (int ind=0; ind<4; ++ind) {
00055         if (fHadMu[ind]) delete fHadMu[ind];
00056         fHadMu[ind] = 0;
00057     }
00058 }
00059 
00060 void BeamMonDbuModule::FillPipeline()
00061 {
00062     BDPipeline::ProcessPipeline& pipeline = fPipe.GetProcessPipeline();
00063 
00064     const char* toroids[] = { "E:TOR101", "E:TR101D", "E:TORTGT", "E:TRTGTD", 0 };
00065     for (int ind=0; toroids[ind]; ++ind) {
00066         fProtonIntensity[ind] = new BDScalar();
00067         fProtonIntensity[ind]->SetDevice(toroids[ind]);
00068         pipeline.push_back(fProtonIntensity[ind]);
00069     }
00070     pipeline.push_back(fEarliest = new BDEarliest);
00071     pipeline.push_back(fHornCurrent = new BDHornCurrent);
00072     pipeline.push_back(fTarget = new BDTarget);
00073 
00074     for (int ind=0; ind<4; ++ind) {
00075         fHadMu[ind] = new BDHadMuMon;
00076     }
00077 
00078     fFileSummaryFiller = new BMFileSummaryFiller(*fProtonIntensity[3]);
00079     fSpillFiller = new BMSpillFiller(*fEarliest,fProtonIntensity,
00080                                      *fHornCurrent,*fTarget,fHadMu);
00081 }
00082 
00083 
00084 JobCResult BeamMonDbuModule::Ana(const MomNavigator *mom)
00085 {
00086     static BDUniquify uniqifier;
00087     vector<BDUniquify::BlockPair> blocks = uniqifier.GetUniqueBlocks(*mom);
00088 
00089     size_t nblocks = blocks.size();
00090 
00091     if (nblocks == 0) {
00092         MSG("BD",Msg::kWarning)
00093             << "No good beam monitoring data in MOM\n";
00094         return JobCResult::kFailed;
00095     }
00096 
00097     for (size_t iblock=0; iblock<nblocks; ++iblock) {
00098         const RawBeamMonHeaderBlock& rbmhb = *blocks[iblock].first;
00099         const RawBeamMonBlock& rbmb = *blocks[iblock].second;
00100 
00101         this->Process(rbmhb,rbmb);
00102     }
00103     return JobCResult::kAOK;
00104 
00105 }
00106 void BeamMonDbuModule::Process(const RawBeamMonHeaderBlock& rbmhb,
00107                                const RawBeamMonBlock& rbmb)
00108 {
00109     vector<string> hadmu_name = BDDevices::HadMuMonitors();
00110     for (int ind=0; ind<4; ++ind) {
00111         const RawBeamData* d = rbmb[hadmu_name[ind].c_str()];
00112         if (!d) {
00113             MSG("BD",Msg::kDebug)
00114                 << "No device data for " << hadmu_name[ind] << ", skipping\n";
00115             continue;
00116         }
00117         fHadMu[ind]->SetData(*d);
00118     }
00119 
00120     BDSwicCalibrator::Get().Calibrate(rbmhb,rbmb);
00121 
00122     const int trigger_event = 0xa9; // FIXME: needs to be a configurable param.
00123     if (rbmb.TclkTriggerEvent() != trigger_event) {
00124         MSG("BD",Msg::kWarning)
00125             << "Wrong trigger event: " << rbmb.TclkTriggerEvent()
00126             << " != " << trigger_event << endl;
00127         return;
00128     }
00129 
00130     // Alert each table of new data
00131     fPipe.SetSpill(rbmhb,rbmb);
00132 
00133 
00134     fFileSummaryFiller->Timestamp(rbmhb.GetTimeStamp());
00135     fFileSummaryFiller->SetTclkTrigger(rbmb.TclkTriggerEvent(),
00136                                        rbmb.TclkTriggerDelay());
00137 
00138     fSpillFiller->Spill(rbmhb,rbmb);
00139 
00140 }
00141 
00142 void BeamMonDbuModule::BeginFile()
00143 {
00144     const char* file = this->GetCurrentFile();
00145     MSG("BD",Msg::kDebug) << "BeginFile: " << file << endl;
00146     fFileSummaryFiller->NewFile(file);
00147 }
00148 
00149 void BeamMonDbuModule::EndFile()
00150 {
00151     MSG("BD",Msg::kDebug) << "EndFile\n";
00152     fFileSummaryFiller->Commit();
00153 }
00154     
00155 void BeamMonDbuModule::EndJob()
00156 {
00157     MSG("BD",Msg::kDebug) << "EndJob\n";
00158     this->Reap();
00159 }
00160     

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