00001 #include "Bdnt.h"
00002
00003 #include <TFile.h>
00004 #include <TTree.h>
00005
00006 #include <Validity/VldContext.h>
00007 #include <RawData/RawRecord.h>
00008 #include <RawData/RawBeamMonHeader.h>
00009 #include <RawData/RawBeamMonBlock.h>
00010 #include <RawData/RawDataBlock.h>
00011 #include <RawData/RawBeamData.h>
00012 #include <RawData/RawBeamSwicData.h>
00013 #include <RawData/RawBeamPosData.h>
00014
00015 #include <cassert>
00016 #include <iostream>
00017 #include <vector>
00018 #include <string>
00019 #include <map>
00020
00021 using namespace std;
00022
00023 struct BdntImp {
00024 TFile* file;
00025 TTree* tree;
00026 typedef map<string,SwicBranch*> SwicMap;
00027 SwicMap swics;
00028 typedef map<string,BpmBranch*> BpmMap;
00029 BpmMap bpms;
00030 TriggerBranch *trig;
00031 string trigname;
00032
00033 bool Fill(const RawBeamMonBlock* rbmb);
00034 };
00035
00036 bool BdntImp::Fill(const RawBeamMonBlock* rbmb)
00037 {
00038 #if 0
00039 vector<string> namelist = rbmb->GetNames();
00040 for (size_t ind=0; ind<namelist.size(); ++ ind)
00041 cout << namelist[ind] << " ";
00042 cout << endl;
00043 #endif
00044
00045
00046 TriggerBranch* trig_br = trig;
00047 memset(trig_br,0,sizeof(TriggerBranch));
00048
00049 const int delay = rbmb->TclkTriggerDelay();
00050 if (delay < 1000)
00051 trig_br->in_spill = 1;
00052 else trig_br->in_spill = 0;
00053
00054 const RawBeamData* rbd = (*rbmb)[trigname];
00055 if (rbd) {
00056 trig_br->sec = rbd->GetSeconds();
00057 trig_br->msec = rbd->GetMsecs();
00058 trig_br->ts = (1.0*trig_br->sec) + (trig_br->msec/1000.0);
00059 if (rbd->GetDataLength())
00060 trig_br->timesince = rbd->GetData()[0];
00061 else
00062 cerr << "Empty data for tigger snc " << trigname << endl;
00063 }
00064 else {
00065
00066 }
00067
00068
00069 RawBeamSwicData swic;
00070 SwicMap::iterator sit, sdone = swics.end();
00071 for (sit=swics.begin(); sit != sdone; ++sit) {
00072 string swic_name = sit->first;
00073 SwicBranch* swic_br = sit->second;
00074
00075 memset(swic_br,0,sizeof(SwicBranch));
00076
00077 const RawBeamData* rbd = (*rbmb)[swic_name.c_str()];
00078 if (!rbd) {
00079
00080 return false;
00081 }
00082
00083 swic.SetData(*rbd);
00084 if (!swic.IsValid()) {
00085 cerr << "Not valid SWIC data for " << swic_name << endl;
00086 return false;
00087 }
00088
00089 int sec = rbd->GetSeconds();
00090 int msec = rbd->GetMsecs();
00091 double dst = (1.0*sec) + (msec/1000.0);
00092 swic_br->dae_sec = sec;
00093 swic_br->dae_msec = msec;
00094 swic_br->dae_ts = dst;
00095
00096 int vsec = swic.VmeSeconds();
00097 int vmsec = swic.VmeNanoseconds()/1000000;
00098 double vme = (1.0*vsec) + (vmsec/1000.0);
00099 swic_br->vme_sec = vsec;
00100 swic_br->vme_msec = vmsec;
00101 swic_br->vme_ts = vme;
00102 #if 0
00103 cout.precision(20);
00104 cout << "SWIC: " << swic_name
00105 << " VME@ " << vsec << "." << vmsec << " = " << vme << ", DAE@"
00106 << sec << "." << msec << " = " << dst << endl;
00107 cout << rbd->GetData()[205] << " "
00108 << rbd->GetData()[206] << " "
00109 << rbd->GetData()[207] << " "
00110 << rbd->GetData()[208] << endl;
00111 #endif
00112 }
00113
00114
00115 RawBeamPosData bpm;
00116 BpmMap::iterator pit, pdone = bpms.end();
00117 for (pit=bpms.begin(); pit != pdone; ++pit) {
00118 string bpm_name = pit->first;
00119 BpmBranch* bpm_br = pit->second;
00120
00121 memset(bpm_br,0,sizeof(BpmBranch));
00122
00123 const RawBeamData* rbd = (*rbmb)[bpm_name.c_str()];
00124 if (!rbd) {
00125
00126 return false;
00127 }
00128
00129 bpm.SetData(*rbd);
00130 if (!bpm.IsValid()) {
00131 cerr << "Not valid BPM data for " << bpm_name << endl;
00132 return false;
00133 }
00134
00135 int sec = rbd->GetSeconds();
00136 int msec = rbd->GetMsecs();
00137 double dst = (1.0*sec) + (msec/1000.0);
00138 bpm_br->dae_sec = sec;
00139 bpm_br->dae_msec = msec;
00140 bpm_br->dae_ts = dst;
00141
00142 int vsec = bpm.VmeSeconds();
00143 int vmsec = bpm.VmeNanoseconds()/1000000;
00144 double vme = (1.0*vsec) + (vmsec/1000.0);
00145 bpm_br->vme_sec = vsec;
00146 bpm_br->vme_msec = vmsec;
00147 bpm_br->vme_ts = vme;
00148
00149 #if 0
00150 cout.precision(20);
00151 cout << "BPM: " << bpm_name
00152 << " VME@ " << vsec << "." << vmsec << " = " << vme << ", DAE@"
00153 << sec << "." << msec << " = " << dst << endl;
00154 cout << rbd->GetData()[205] << " "
00155 << rbd->GetData()[206] << " "
00156 << rbd->GetData()[207] << " "
00157 << rbd->GetData()[208] << endl;
00158 #endif
00159 }
00160 return true;
00161 }
00162
00163
00164 Bdnt::Bdnt(const char* trig_name, const char* outfile) : fImp(new BdntImp)
00165 {
00166 fImp->trigname = trig_name;
00167 fImp->file = new TFile(outfile,"recreate");
00168 fImp->tree = new TTree("bd", Form("Beam Data with trigger %s",trig_name));
00169 fImp->trig = new TriggerBranch;
00170 fImp->tree->Branch("trig.","TriggerBranch",&fImp->trig);
00171 }
00172 static string swic_name2branch_name(string n)
00173 {
00174 string out = "";
00175 for (size_t ind=2; ind<6; ++ind) {
00176 out.push_back(tolower(n[ind]));
00177 }
00178 return out;
00179 }
00180 static string bpm_name2branch_name(string n)
00181 {
00182 string out = "";
00183 for (size_t ind=2; ind<5; ++ind) {
00184 out.push_back(tolower(n[ind]));
00185 }
00186 return out;
00187 }
00188
00189 void Bdnt::AddSwic(const char* swicname)
00190 {
00191 fImp->swics[swicname] = new SwicBranch;
00192 string branchname = swic_name2branch_name(swicname);
00193 branchname += ".";
00194 fImp->tree->Branch(branchname.c_str(),"SwicBranch",
00195 &(fImp->swics[swicname]));
00196 }
00197 void Bdnt::AddBpm(const char* bpmname)
00198 {
00199 fImp->bpms[bpmname] = new BpmBranch;
00200 string branchname = bpm_name2branch_name(bpmname);
00201 branchname += ".";
00202 fImp->tree->Branch(branchname.c_str(),"BpmBranch",
00203 &(fImp->bpms[bpmname]));
00204 }
00205
00206 void Bdnt::ProcessFile(const char* filename)
00207 {
00208 TFile file(filename,"READ");
00209 TTree* tree = (TTree*)(file.Get("BeamMon"));
00210 RawRecord* record = 0;
00211
00212
00213 for ( Int_t ient = 0; ient < tree -> GetEntries(); ient++ ) {
00214 tree -> SetBranchAddress("RawRecord",&record);
00215 tree->GetEntry(ient);
00216
00217 if (!ient) {
00218 const VldContext* vld = record->GetVldContext();
00219 cout << "Reading " << filename << ":\n"
00220 << *vld << endl;
00221 }
00222
00223 TIter itr = record->GetRawBlockIter();
00224 const RawDataBlock* rdb = 0;
00225
00226
00227 while ((rdb = dynamic_cast<RawDataBlock*>(itr()))) {
00228 if (! rdb->InheritsFrom("RawBeamMonBlock")) {
00229
00230 continue;
00231 }
00232 const RawBeamMonBlock* rbmb =
00233 dynamic_cast<const RawBeamMonBlock*>(rdb);
00234 assert(rbmb);
00235
00236 fImp->Fill(rbmb);
00237 fImp->tree->Fill();
00238 }
00239
00240 if (tree->GetEntries()-ient == 1) {
00241 const VldContext* vld = record->GetVldContext();
00242 cout << "finishing " << filename << ":\n"
00243 << *vld << endl;
00244 }
00245 delete record; record = 0;
00246 }
00247
00248 }
00249 TTree* Bdnt::GetTree() { return fImp->tree; }
00250
00251 void Bdnt::Write()
00252 {
00253 fImp->file->cd();
00254 fImp->tree->Write();
00255 fImp->file->Close();
00256 }
00257
00258
00259 ClassImp(TriggerBranch)
00260 ClassImp(SwicBranch)
00261 ClassImp(BpmBranch)