00001 #ifndef St_trigDetSumsC_h
00002 #define St_trigDetSumsC_h
00003
00004 #include "TChair.h"
00005 #include <math.h>
00006 #include "tables/St_trigDetSums_Table.h"
00007 #include "StDetectorDbClock.h"
00008
00009 class St_trigDetSumsC : public TChair {
00010 public:
00011 St_trigDetSumsC(St_trigDetSums *table) : TChair(table) {SafeDelete(fgInstance); fgInstance = this; fMargin = 0;}
00012 virtual ~St_trigDetSumsC() {fgInstance = 0;}
00013 static St_trigDetSumsC* instance() {return fgInstance;}
00014 trigDetSums_st *Struct(Int_t i = 0) {return ((St_trigDetSums*) Table())->GetTable()+i;}
00015 UInt_t getNumRows() {return GetNRows();}
00016 UInt_t runNumber(Int_t i = 0) {return Struct(i)->runNumber;}
00017 UInt_t timeOffset(Int_t i = 0) {return Struct(i)->timeOffset;}
00018 Double_t ctbWest(Int_t i = 0) {return validity(Struct(i)->ctbWest);}
00019 Double_t ctbEast(Int_t i = 0) {return validity(Struct(i)->ctbEast);}
00020 Double_t ctbTOFp(Int_t i = 0) {return validity(Struct(i)->ctbTOFp);}
00021 Double_t tofp(Int_t i = 0) {return validity(Struct(i)->tofp);}
00022 Double_t zdcWest(Int_t i = 0) {return validity(Struct(i)->zdcWest);}
00023 Double_t zdcEast(Int_t i = 0) {return validity(Struct(i)->zdcEast);}
00024 Double_t zdcX(Int_t i = 0) {return validity(Struct(i)->zdcX);}
00025 Double_t mult(Int_t i = 0) {return validity(Struct(i)->mult);}
00026 Double_t L0(Int_t i = 0) {return validity(Struct(i)->L0);}
00027 Double_t bbcX(Int_t i = 0) {return validity(Struct(i)->bbcX);}
00028 Double_t bbcXctbTOFp(Int_t i = 0) {return validity(Struct(i)->bbcXctbTOFp);}
00029 Double_t bbcWest(Int_t i = 0) {return validity(Struct(i)->bbcWest);}
00030 Double_t bbcEast(Int_t i = 0) {return validity(Struct(i)->bbcEast);}
00031 Double_t bbcYellowBkg(Int_t i = 0) {return validity(Struct(i)->bbcYellowBkg);}
00032 Double_t bbcBlueBkg(Int_t i = 0) {return validity(Struct(i)->bbcBlueBkg);}
00033 Double_t pvpdWest(Int_t i = 0) {return validity(Struct(i)->pvpdWest);}
00034 Double_t pvpdEast(Int_t i = 0) {return validity(Struct(i)->pvpdEast);}
00035 Double_t zdcCoin(Int_t i = 0) {return Nc(zdcX(i),zdcEast(i),zdcWest(i));}
00036 Double_t bbcCoin(Int_t i = 0) {return Nc(bbcX(i),bbcEast(i),bbcWest(i));}
00037 static St_trigDetSums* fgTableCopy;
00038 void validityMargin(Double_t margin=0) {fMargin = margin;}
00039
00040
00041
00042 static Double_t Nc(Double_t New, Double_t Ne, Double_t Nw, Int_t n_bunches=111) {
00043
00044
00045 Double_t Nbc = StDetectorDbClock::instance()->CurrentFrequency() * ((Double_t) n_bunches) / 120.;
00046 return -Nbc * TMath::Log(1. - ((New - (Ne*Nw/Nbc)) / (Nbc+New-Ne-Nw)));
00047 }
00048
00049 protected:
00050 private:
00051 static St_trigDetSumsC* fgInstance;
00052 Double_t fMargin;
00053
00054
00055
00056
00057
00058 Double_t validity(double& newval) {
00059
00060 if (!fgTableCopy)
00061 fgTableCopy = new St_trigDetSums(*((St_trigDetSums*) Table()));
00062
00063
00064 double& oldval = *((double*) (((char*) (fgTableCopy->GetTable())) +
00065 (((char*) &newval) - ((char*) Struct(0)))));
00066
00067
00068
00069
00070 double CORRUPT = 1e9;
00071 if (newval > CORRUPT || newval < 0)
00072 return (oldval > CORRUPT || oldval < 0 ? -1 : oldval);
00073
00074 if (fMargin == 0) return newval;
00075
00076
00077 if ((oldval < 100) ||
00078 ((newval/oldval) < (2.0-fMargin)) ||
00079 (fabs(fmod((newval/oldval)+0.5,1.0)-0.5) > fMargin))
00080 oldval = newval;
00081
00082 return oldval;
00083 }
00084
00085 ClassDefChair(St_trigDetSums, trigDetSums_st )
00086 ClassDef(St_trigDetSumsC,2)
00087 };
00088 #endif