00001 #include <assert.h>
00002 #include "TMath.h"
00003 #include "TDatime.h"
00004 #include "TString.h"
00005 #include "Stiostream.h"
00006 #include "St_svtRDOstrippedC.h"
00007 ClassImp(St_svtRDOstrippedC);
00008 St_svtRDOstrippedC *St_svtRDOstrippedC::fgsvtRDOstrippedC = 0;
00009 struct RDO_t {
00010 const Char_t *name;
00011 Int_t ladNum, barNum;
00012 const Char_t *rdo;
00013 Int_t ndet1, ndet2;
00014 };
00015 static const Int_t NRDOS = 72;
00016 static const RDO_t RDOS[NRDOS] = {
00017 {"L01B1E", 1,1, "E1",1,2},{"L02B1E", 2,1, "E2",1,2},{"L03B1E", 3,1, "E4",1,2},{"L04B1E", 4,1, "E5",1,2},{"L05B1E", 5,1, "E7",1,2},
00018 {"L06B1E", 6,1, "E8",1,2},{"L07B1E", 7,1,"E10",1,2},{"L08B1E", 8,1,"E11",1,2},
00019
00020 {"L01B2E", 1,2, "E3",1,3},{"L02B2E", 2,2, "E3",1,3},
00021 {"L03B2E", 3,2, "E3",1,3},{"L04B2E", 4,2, "E6",1,3},{"L05B2E", 5,2, "E6",1,3},{"L06B2E", 6,2, "E6",1,3},{"L07B2E", 7,2, "E9",1,3},
00022 {"L08B2E", 8,2, "E9",1,3},{"L09B2E", 9,2, "E9",1,3},{"L10B2E",10,2,"E12",1,3},{"L11B2E",11,2,"E12",1,3},{"L12B2E",12,2,"E12",1,3},
00023
00024 {"L01B3E", 1,3, "E1",1,3},{"L02B3E", 2,3, "E1",1,4},{"L03B3E", 3,3, "E2",1,3},{"L04B3E", 4,3, "E2",1,4},{"L05B3E", 5,3, "E4",1,3},
00025 {"L06B3E", 6,3, "E4",1,4},{"L07B3E", 7,3, "E5",1,3},{"L08B3E", 8,3, "E5",1,4},{"L09B3E", 9,3, "E7",1,3},{"L10B3E",10,3, "E7",1,4},
00026 {"L11B3E",11,3, "E8",1,3},{"L12B3E",12,3, "E8",1,4},{"L13B3E",13,3,"E10",1,3},{"L14B3E",14,3,"E10",1,4},{"L15B3E",15,3,"E11",1,3},
00027 {"L16B3E",16,3,"E11",1,4},
00028
00029 {"L01B1W", 1,1, "W1",3,4},{"L02B1W", 2,1, "W2",3,4},{"L03B1W", 3,1, "W4",3,4},{"L04B1W", 4,1, "W5",3,4},{"L05B1W", 5,1, "W7",3,4},
00030 {"L06B1W", 6,1, "W8",3,4},{"L07B1W", 7,1,"W10",3,4},{"L08B1W", 8,1,"W11",3,4},
00031
00032 {"L01B2W", 1,2, "W3",4,6},{"L02B2W", 2,2, "W3",4,6},
00033 {"L03B2W", 3,2, "W3",4,6},{"L04B2W", 4,2, "W6",4,6},{"L05B2W", 5,2, "W6",4,6},{"L06B2W", 6,2, "W6",4,6},{"L07B2W", 7,2, "W9",4,6},
00034 {"L08B2W", 8,2, "W9",4,6},{"L09B2W", 9,2, "W9",4,6},{"L10B2W",10,2,"W12",4,6},{"L11B2W",11,2,"W12",4,6},{"L12B2W",12,2,"W12",4,6},
00035
00036 {"L01B3W", 1,3, "W1",4,7},{"L02B3W", 2,3, "W1",5,7},{"L03B3W", 3,3, "W2",4,7},{"L04B3W", 4,3, "W2",5,7},{"L05B3W", 5,3, "W4",4,7},
00037 {"L06B3W", 6,3, "W4",5,7},{"L07B3W", 7,3, "W5",4,7},{"L08B3W", 8,3, "W5",5,7},{"L09B3W", 9,3, "W7",4,7},{"L10B3W",10,3, "W7",5,7},
00038 {"L11B3W",11,3, "W8",4,7},{"L12B3W",12,3, "W8",5,7},{"L13B3W",13,3,"W10",4,7},{"L14B3W",14,3,"W10",5,7},{"L15B3W",15,3,"W11",4,7},
00039 {"L16B3W",16,3,"W11",5,7}
00040 };
00041 static const Int_t NB = 3;
00042 static const Int_t NL = 16;
00043 static const Int_t NWmax = 7;
00044 static svtRDOstripped_st *pointers[3][16][7];
00045 static svtRDOstripped_st *DataOld = 0;
00046 static Int_t _debug = 0;
00047
00048 St_svtRDOstrippedC::St_svtRDOstrippedC (St_svtRDOstripped *table) : TChair(table), fDate(0), fDelay(0), fSwitchedOff(0) {
00049 if (fgsvtRDOstrippedC) delete fgsvtRDOstrippedC; fgsvtRDOstrippedC = this;
00050 Init();
00051 }
00052
00053 void St_svtRDOstrippedC::Init() {
00054 memset (&pointers[0][0][0], 0, NB*NL*NWmax*sizeof(svtRDOstripped_st *));
00055 St_svtRDOstripped *Table = (St_svtRDOstripped *) GetThisTable();
00056 if (Table) {
00057 svtRDOstripped_st *Data = Table->GetTable();
00058 DataOld = Data;
00059 Int_t N = Table->GetNRows();
00060 TString rdo, RDO;
00061 Int_t i, j;
00062 for (j = 0; j < N; j++) {
00063 Int_t barrel = Data[j].barNum;
00064 Int_t ladder = Data[j].ladNum;
00065 Int_t NW = NWmax;
00066 if (barrel == 1) NW = 4;
00067 if (barrel == 2) NW = 6;
00068 rdo = Data[j].rdo;
00069 for (Int_t wafer = 1; wafer <= NW; wafer++) {
00070 Int_t k = -1;
00071 for (i = 0; i < NRDOS; i++) {
00072 RDO = RDOS[i].rdo;
00073 if (RDOS[i].barNum == barrel &&
00074 RDOS[i].ladNum == ladder &&
00075 rdo == RDO &&
00076 RDOS[i].ndet1 <= wafer && wafer <= RDOS[i].ndet2) {k = i; break;}
00077 }
00078 if (k >= 0)
00079 pointers[barrel-1][ladder-1][wafer-1] = Data + j;
00080 }
00081 }
00082 }
00083 }
00084
00085 svtRDOstripped_st *St_svtRDOstrippedC::pRDO(Int_t barrel, Int_t ladder, Int_t wafer) {
00086 svtRDOstripped_st *p = 0;
00087 if (! GetThisTable()) return p;
00088 if (((St_svtRDOstripped *)GetThisTable())->GetTable() != DataOld) Init();
00089 if (barrel >= 1 && barrel <= NB &&
00090 ladder >= 1 && ladder <= NL &&
00091 wafer >= 1 && wafer <= NWmax) p = pointers[barrel-1][ladder-1][wafer-1];
00092 return p;
00093 }
00094
00095 Int_t St_svtRDOstrippedC::svtRDOstrippedStatus(Int_t barrel, Int_t ladder, Int_t wafer) {
00096 svtRDOstripped_st *p = pRDO(barrel, ladder, wafer);
00097 Int_t iOK = 8;
00098 if (p) {
00099 iOK = 0;
00100 if (TMath::Abs(-1500 - p->hvVolt) > 2) iOK += 1;
00101 if (p->lvFault) iOK += 2;
00102 if (! iOK && fDate && fDelay) {
00103 if (_debug) {
00104 TDatime t; t.Set(fDate);
00105 cout << " fSwitchedOff " << fSwitchedOff
00106 << " fDelay " << fDelay << "\t"; t.Print();
00107 }
00108 Int_t utOff = 0;
00109 if (p->dateOff > 0) {
00110 TDatime tOff(p->dateOff,p->timeOff);
00111 if (_debug) {cout << " tOff "; tOff.Print();}
00112 utOff = tOff.Convert();
00113 }
00114 Int_t utOn = 0;
00115 if (p->date > 0) {
00116 TDatime tOn(p->date,p->time);
00117 utOn = tOn.Convert();
00118 if (_debug) {cout << " tOn "; tOn.Print();}
00119 }
00120 Int_t DifOffOn = utOn - utOff;
00121 if (DifOffOn > fSwitchedOff) {
00122 Int_t DifOn = fDate - utOn;
00123 if (_debug) {cout << "DiffOffOn " << DifOffOn << "\tDifOn " << DifOn << endl;}
00124 if (DifOn < fDelay) {
00125 iOK += 4;
00126 }
00127 }
00128 }
00129 }
00130 return iOK;
00131 }
00132
00133 void St_svtRDOstrippedC::PrintRDOmap() {
00134 Int_t status = -1;
00135 Int_t N = NRDOS/2;
00136 cout << "Half Ladder L/B RDO ndet1 ndet2 sta: 0 - o.k.; 1 - bad voltage; 2 - RDO fail; 4 - out of date; 8 - barrel, ladder, wafer is missing" << endl;
00137 St_svtRDOstrippedC *svtRDOS = St_svtRDOstrippedC::instance();
00138 for (Int_t i = 0; i < N; i++) {
00139 if (svtRDOS) status = svtRDOS->svtRDOstrippedStatus(RDOS[i].barNum,RDOS[i].ladNum,RDOS[i].ndet1);
00140 cout << Form("%11s %2i/%1i %3s %3i %3i %3i", RDOS[i].name, RDOS[i].ladNum, RDOS[i].barNum, RDOS[i].rdo, RDOS[i].ndet1,RDOS[i].ndet2,status);
00141 cout << Form("%11s %2i/%1i %3s %3i %3i %3i", RDOS[N+i].name, RDOS[N+i].ladNum, RDOS[N+i].barNum, RDOS[N+i].rdo, RDOS[N+i].ndet1, RDOS[i].ndet2,status)
00142 << endl;
00143 }
00144 }
00145