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;
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
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