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

Bdnt.cxx

Go to the documentation of this file.
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     // fill trigger info 
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         //cerr << "No trigger snc device " << trigname << endl;
00066     }
00067 
00068     // fill swic info
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             //cerr << "No SWIC data for " << swic_name << endl;
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     // fill bpm info
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             //cerr << "No BPM data for " << bpm_name << endl;
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) { // keep Xs: Z:XXXXDS
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) { // keep Xs: R:XXXCOV
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         // loop over blocks in record
00227         while ((rdb = dynamic_cast<RawDataBlock*>(itr()))) {
00228             if (! rdb->InheritsFrom("RawBeamMonBlock")) {
00229                 //cerr << "Doesn't inherit from RawBeamMonBlock" << endl;
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)

Generated on Sat Nov 21 22:45:30 2009 for loon by  doxygen 1.3.9.1