00001 #include "BDTestDataModule.h"
00002 #include "BDTestData.h"
00003
00004 #include <BeamDataUtil/BDUniquify.h>
00005 #include <RawData/RawBeamMonBlock.h>
00006 #include <RawData/RawBeamMonHeaderBlock.h>
00007
00008 #include <MinosObjectMap/MomNavigator.h>
00009
00010 #include <MessageService/MsgService.h>
00011 CVSID("$Id: BDTestDataModule.cxx,v 1.1 2005/12/15 22:06:32 bv Exp $");
00012
00013 #include <JobControl/JobCModuleRegistry.h>
00014 JOBMODULE(BDTestDataModule, "BDTestData", "Fill the bdtest tree");
00015
00016 #include <TFile.h>
00017 #include <TTree.h>
00018 #include <TString.h>
00019 #include <TSystem.h>
00020
00021 #include <string>
00022 using namespace std;
00023
00024 class BDTestDataModuleImp {
00025 TFile* outfile;
00026 TTree* outtree;
00027 BDTestData* bdtd;
00028 string output_file;
00029 public:
00030
00031 BDTestDataModuleImp(string output)
00032 : outfile(0)
00033 , outtree(0)
00034 , bdtd(0)
00035 , output_file(output)
00036 {
00037 cerr << "Starting output file: " << output_file << endl;
00038 outfile = new TFile(output_file.c_str(),"RECREATE");
00039 outtree = new TTree("bdtest", "Beam Monitoring Data");
00040 bdtd = new BDTestData;
00041 outtree->Branch("pot","BDTestData",&bdtd);
00042 cerr << "Bdtd at " << (void*)bdtd << endl;
00043 }
00044 ~BDTestDataModuleImp() {
00045 cerr << "~BDTestDataModuleImp() \n";
00046 outfile->cd();
00047 outtree->Write();
00048 outfile->Close();
00049 delete outfile;
00050
00051 delete bdtd;
00052 outfile = 0;
00053 outtree = 0;
00054 bdtd = 0;
00055 cerr << output_file << " written\n";
00056 }
00057
00058 void Fill(const RawBeamMonBlock& block, const RawBeamMonHeaderBlock& head)
00059 {
00060 if (fill_bdtest(*bdtd,block,head))
00061 outtree->Fill();
00062 }
00063 };
00064
00065 BDTestDataModule::BDTestDataModule()
00066 {
00067 fImp = 0;
00068 }
00069 BDTestDataModule::~BDTestDataModule()
00070 {
00071 if (fImp) delete fImp;
00072 }
00073
00074 void BDTestDataModule::BeginFile()
00075 {
00076 if (fImp) {
00077 cerr << "BDTestDataModule::BeginFile: deleting non-zero fImp\n";
00078 delete fImp; fImp = 0;
00079 }
00080
00081 const char* output_dir = gSystem->Getenv("BEAM_DATA_TESTDATA_DIR");
00082 if (!output_dir || output_dir[0] == '\0') output_dir = ".";
00083 TString file = output_dir;
00084 file += "/";
00085
00086 const char* input_file = this->GetCurrentFile();
00087 const char* base_name = gSystem->BaseName(input_file);
00088
00089 file += base_name;
00090 file.Remove(file.Index(".mbeam.root"));
00091 file += ".bdtd.root";
00092 fImp = new BDTestDataModuleImp(file.Data());
00093 }
00094
00095 void BDTestDataModule::EndFile()
00096 {
00097 cerr << "BDTestDataModule::EndFile with fImp at " << (void*)fImp << endl;
00098 if (fImp) delete fImp;
00099 fImp = 0;
00100 }
00101
00102 JobCResult BDTestDataModule::Reco(MomNavigator* mom)
00103 {
00104 if (!fImp) {
00105 cerr << "Error: BDTestDataModule::Reco called w/out an implementation\n";
00106 return JobCResult::kError;
00107 }
00108
00109 static BDUniquify uniqifier;
00110 vector<BDUniquify::BlockPair> blocks = uniqifier.GetUniqueBlocks(*mom);
00111 size_t nblocks = blocks.size();
00112
00113 if (nblocks == 0) {
00114 MSG("BD",Msg::kWarning)
00115 << "No good beam monitoring data in MOM\n";
00116 return JobCResult::kFailed;
00117 }
00118 for (size_t iblock=0; iblock<nblocks; ++iblock) {
00119 const RawBeamMonHeaderBlock& rbmhb = *blocks[iblock].first;
00120 const RawBeamMonBlock& rbmb = *blocks[iblock].second;
00121
00122 fImp->Fill(rbmb,rbmhb);
00123 }
00124 return JobCResult::kAOK;
00125
00126 }