00001
00002
00003 #include "Knot.h"
00004 #include "AcnetDevice.h"
00005
00006 #include <TTree.h>
00007
00008 #include <map>
00009 #include <string>
00010 #include <iostream>
00011 using namespace std;
00012
00013 static string acnet2branchname(string n)
00014 {
00015 string out = "";
00016 for (size_t ind=0; ind<8 && ind<n.size(); ++ind) {
00017 if (n[ind] == ':') continue;
00018 out.push_back(tolower(n[ind]));
00019 }
00020 out += ".";
00021 return out;
00022 }
00023
00024 class KnotImp {
00025 public:
00026
00027 TTree& fTree;
00028 int fCurrentEntry;
00029 Knot::DeviceMap fDeviceMap;
00030
00031 KnotImp(TTree& tree) : fTree(tree), fCurrentEntry(-1) {}
00032 ~KnotImp() {
00033 Knot::DeviceMap::iterator it, done = fDeviceMap.end();
00034 for (it = fDeviceMap.begin(); it != done; ++it) {
00035 delete it->second;
00036 it->second = 0;
00037 }
00038 }
00039
00040 const AcnetDevice* GetDevice(const char* devname) {
00041 Knot::DeviceMap::iterator it = fDeviceMap.find(devname);
00042 if (it != fDeviceMap.end()) return it->second;
00043
00044 AcnetDevice* ad = new AcnetDevice(devname);
00045 fDeviceMap[devname] = ad;
00046
00047 string dns = acnet2branchname(devname);
00048
00049 fTree.SetBranchStatus(dns.c_str(),1);
00050 fTree.SetBranchAddress(dns.c_str(),&fDeviceMap[devname]);
00051 if (fCurrentEntry >= 0)
00052 this->GetEntry(fCurrentEntry);
00053 return ad;
00054 }
00055
00056 int GetEntry(int entry) {
00057 fCurrentEntry = entry;
00058 return fTree.GetEntry(entry);
00059 }
00060 };
00061
00062 Knot::Knot(TTree& tree) : fImp(new KnotImp(tree)) {}
00063 Knot::Knot() : fImp(0) {}
00064
00065 void Knot::SetTree(TTree& tree)
00066 {
00067 if (fImp) delete fImp; fImp = 0;
00068 fImp = new KnotImp(tree);
00069 }
00070
00071 int Knot::GetSize()
00072 {
00073 if (!fImp) return -1;
00074 return fImp->fTree.GetEntries();
00075 }
00076
00077 int Knot::GetEntry(int entry)
00078 {
00079 if (!fImp) return -1;
00080 return fImp->GetEntry(entry);
00081 }
00082
00083 int Knot::GetEntryNumber()
00084 {
00085 if (!fImp) return -1;
00086 return fImp->fCurrentEntry;
00087 }
00088 const AcnetDevice* Knot::GetDevice(const char* name)
00089 {
00090 if (!fImp) return 0;
00091 return fImp->GetDevice(name);
00092 }
00093
00094 const Knot::DeviceMap& Knot::GetDevices() const
00095 {
00096 return fImp->fDeviceMap;
00097 }