/// Class to hold TPC MM status for /// a particular time. The class /// holds information to indicate whether: /// Low Voltages are on /// FEMs are Powered /// MM HV > 245V /// DCC Power on /// Cathode HV 24950 to 25050 V /// Blair Jamieson (C) 2010 #include #include #include "IOARuntimeParameters.hxx" #include "ITPCMMStatus.hxx" ///------------------------------------------------------------------------ /// Initialize TPC MM status object using unix time /// If it is intended to use this class to read many /// sequential values, set ancache to some value large /// enough to reduce the number of sql queries ITPCMMStatus::ITPCMMStatus( long autime, long atstart, long atend ){ fTime = autime; // time of current values fDebug = false; fTimeStamp = 0x0; fStartTime = atstart; fEndTime = atend; Init(); } ///------------------------------------------------------------------------ /// Initialize TPC MM status object using year, month(0-11), /// day(1-31),... ITPCMMStatus::ITPCMMStatus( int ayear, int amonth, int aday, int ahour, int amin, int asec, long atstart, long atend){ fTimeStamp=0x0; fDebug = false; SetTimeNoRead(ayear, amonth, aday, ahour, amin, asec); fStartTime = atstart; fEndTime = atend; Init(); } ///------------------------------------------------------------------------ /// Initialize MM status properties object /// Sets offsets, makes histogram, reads values void ITPCMMStatus::Init(){ // setup timestamps of MMHV channel swaps in beam run 31 fTimeSwap1 = 1269254703; fTimeSwap2 = 1269468318; // Read special parameter settings SetupCheck(); // Setup field name strings to read SetupFieldNames(); // Now read system properties fLV0_vec.clear(); Read(); } ///------------------------------------------------------------------------ /// Read in the oaRunParameters settings for what to check void ITPCMMStatus::SetupCheck(){ char aname[256]; for (int ifem=0; ifem<6; ifem++){ sprintf(aname,"oaSlowControlDatabase.toolTPCStatus.enableCheckFEM%d",ifem); fFEMCheck[ifem] = (bool) COMET::IOARuntimeParameters::Get().GetParameterI(aname); if (fFEMCheck[ifem]==false){ std::cout<<"WARN: Not checking FEM"<"< Record for "< fLV0_idx+1 ){ start_time = (long) fLV0_vec[ fLV0_idx ].first; end_time = (long) fLV0_vec[ fLV0_idx+1 ].first; } return; } ///------------------------------------------------------------------------ /// Get unix time long ITPCMMStatus::GetUnixTime( int ayear, int amonth, int aday, int ahour, int amin, int asec){ tm mt; // use time structure from time.h // to build unix time from year,month, etc. mt.tm_year = ayear - 1900; mt.tm_mon = amonth-1; mt.tm_mday = aday; mt.tm_hour = ahour; mt.tm_min = amin; mt.tm_sec = asec; mt.tm_isdst = -1; return (long)mktime(&mt); } ///------------------------------------------------------------------------ /// Set the time for this object void ITPCMMStatus::SetTimeNoRead( int ayear, int amonth, int aday, int ahour, int amin, int asec){ fTime = GetUnixTime(ayear, amonth, aday, ahour, amin, asec ); //std::cout<<"SetTimeNoRead "<2){ int adt = int(fLV1_vec[1].first - fLV1_vec[0].first); if ( adt < adeltat && adt>0 ) nread = (fEndTime - astart)/adt + 5; else nread = (fEndTime-astart)/adeltat +5; if ( nread > 10000 ) nread = 10000; } fLV1_vec.clear(); fLV1_vec = ISlowControlDatabase::Get().QueryGetFieldNoCache(astart, "tpc_lv_ps_tlv1", fLV1_names, nread); return; } ///------------------------------------------------------------------------ /// Read another chunk of data from slow control database void ITPCMMStatus::ReadSlowDB_FEM_V(int adeltat){ /// read next nread entries long astart = fTime - 600; int nread = 500; if (fFEM_V_vec[0].size()>2){ int adt = int(fFEM_V_vec[0][1].first - fFEM_V_vec[0][0].first); if ( adt < adeltat && adt>0 ) nread = (fEndTime - astart)/adt + 5; else nread = (fEndTime-astart)/adeltat +5; if ( nread > 10000 ) nread = 10000; } for ( int i=0; i<6; i++ ){ if ( fFEMCheck[i] == false ) continue; fFEM_V_vec[i].clear(); fFEM_V_vec[i] = ISlowControlDatabase::Get().QueryGetFieldNoCache(astart, fFEM_V_tabnames[i].c_str(), fFEM_V_names[i], nread); } return; } ///------------------------------------------------------------------------ /// Read another chunk of data from slow control database void ITPCMMStatus::ReadSlowDB_MM_HV(int adeltat){ /// read next nread entries long astart = fTime - 600; int nread = 500; if (fMM_HV_vec.size()>2){ int adt = int(fMM_HV_vec[1].first - fMM_HV_vec[0].first); if ( adt < adeltat && adt>0 ) nread = (fEndTime - astart)/adt + 5; else nread = (fEndTime-astart)/adeltat +5; if ( nread > 10000 ) nread = 10000; } fMM_HV_vec.clear(); fMM_HV_vec = ISlowControlDatabase::Get().QueryGetFieldNoCache( astart, "tpciseghv02_sensevoltage", fMM_HV_names, nread); return; } ///------------------------------------------------------------------------ /// Read another chunk of data from slow control database void ITPCMMStatus::ReadSlowDB_DCC_V(int adeltat){ /// read next nread entries long astart = fTime - 300; int nread = 500; if (fDCC_V_vec[0].size()>2){ int adt = int(fDCC_V_vec[0][1].first - fDCC_V_vec[0][0].first); if ( adt < adeltat && adt>0 ) nread = (fEndTime - astart)/adt + 5; else nread = (fEndTime-astart)/adeltat +5; if ( nread > 10000 ) nread = 10000; } for ( int i=0; i<3; i++ ) fDCC_V_vec[i].clear(); for ( int i=0; i<3; i++ ){ fDCC_V_vec[i] = ISlowControlDatabase::Get().QueryGetFieldNoCache( astart, fDCC_V_tabnames[i].c_str(), fDCC_V_names[i], nread); } return; } ///------------------------------------------------------------------------ /// Read another chunk of data from slow control database void ITPCMMStatus::ReadSlowDB_Cath_V(int adeltat){ /// read next nread entries long astart = fTime - 300; int nread = 500; if (fCath_V_vec.size()>2){ int adt = int(fCath_V_vec[1].first - fCath_V_vec[0].first); if ( adt < adeltat && adt>0 ) nread = (fEndTime - astart)/adt + 5; else nread = (fEndTime-astart)/adeltat +5; if ( nread > 10000 ) nread = 10000; } fCath_V_vec.clear(); fCath_V_vec = ISlowControlDatabase::Get().QueryGetFieldNoCache(astart, "ccbertan_cchv", fCath_V_names, nread); return; } ///------------------------------------------------------------------------ /// Get index into each of the vectors of database query /// results for the current time void ITPCMMStatus::UpdateVectorTimeIdx(int adeltat){ // std::cout<<"UpdateVectorTimeIdx for time "<0 ){ for (unsigned int i=0; i= long( (fLV0_vec[i].first) ) && fTime < long( (fLV0_vec[i+1].first) ) ) { fLV0_idx = i; fLV0_isok = true; } if ( fTime+adeltat >= long( (fLV0_vec[i].first) ) && fTime+adeltat < long( (fLV0_vec[i+1].first) ) ) { fLV0_next_idx = i; fLV0_next_isok = true; break; } } } // Find index for current and next time for LV1 fLV1_isok = false; fLV1_next_isok = false; if ( fLV1_vec.size() > 0 ){ for (unsigned int i=0; i= long(fLV1_vec[i].first) && fTime < long(fLV1_vec[i+1].first) ) { fLV1_idx = i; fLV1_isok = true; } if ( fTime+adeltat >= long(fLV1_vec[i].first) && fTime+adeltat < long(fLV1_vec[i+1].first) ) { fLV1_next_idx = i; fLV1_next_isok = true; break; } } } // Find index for current and next time for FEM_V for (int iep=0; iep<6; iep++){ if ( fFEMCheck[iep] == false ) continue; fFEM_V_isok[iep] = false; fFEM_V_next_isok[iep] = false; if ( (fFEM_V_vec[iep]).size() == 0 ) continue; for (unsigned int i=0; i< (fFEM_V_vec[iep]).size()-1; i++){ //std::cout<<"iep="<= long( ( (fFEM_V_vec[iep])[i] ).first ) && fTime < long( ( (fFEM_V_vec[iep])[i+1] ).first ) ) { fFEM_V_idx[iep] = i; fFEM_V_isok[iep] = true; } if ( fTime+adeltat >= long( ( (fFEM_V_vec[iep])[i] ).first ) && fTime+adeltat < long( ( (fFEM_V_vec[iep])[i+1] ).first ) ) { fFEM_V_next_idx[iep] = i; fFEM_V_next_isok[iep] = true; break; } } } // Find index for current and next time for MM_HV fMM_HV_isok = false; fMM_HV_next_isok = false; for (unsigned int i=0; i= long( (fMM_HV_vec[i]).first) && fTime < long( (fMM_HV_vec[i+1]).first) ) { fMM_HV_idx = i; fMM_HV_isok = true; } if ( fTime+adeltat >= long( (fMM_HV_vec[i]).first) && fTime+adeltat < long( (fMM_HV_vec[i+1]).first) ) { fMM_HV_next_idx = i; fMM_HV_next_isok = true; break; } } // Find index for current and next time for DCC_V for (int itpc=0; itpc<3; itpc++){ fDCC_V_isok[itpc] = false; fDCC_V_next_isok[itpc] = false; for (unsigned int i=0; i<(fDCC_V_vec[itpc]).size()-1; i++){ if ( fTime >= long( ( (fDCC_V_vec[itpc])[i].first) ) && fTime < long( ( (fDCC_V_vec[itpc][i+1].first) ) ) ) { fDCC_V_idx[itpc] = i; fDCC_V_isok[itpc] = true; } if ( fTime+adeltat >= long( ( (fDCC_V_vec[itpc])[i].first) ) && fTime+adeltat < long( ( (fDCC_V_vec[itpc][i+1].first) ) ) ) { fDCC_V_next_idx[itpc] = i; fDCC_V_next_isok[itpc] = true; break; } } } // Find index for current and next time for Cath_V fCath_V_isok = false; fCath_V_next_isok = false; for (unsigned int i=0; i= long( (fCath_V_vec[i]).first) && fTime < long( (fCath_V_vec[i+1]).first) ) { fCath_V_idx = i; fCath_V_isok = true; } if ( fTime+adeltat >= long( (fCath_V_vec[i]).first) && fTime+adeltat < long( (fCath_V_vec[i+1]).first) ) { fCath_V_next_idx = i; fCath_V_next_isok = true; break; } } return; } ///------------------------------------------------------------------------ /// Check if we need to read another chunk of slow control /// information from the database void ITPCMMStatus::CheckReadDB(int adeltat){ // buffer of number of readings to end of vector // needed to allow check of next unsigned int NtoEndBuf = 2; if ( fLV0_vec.size() <= NtoEndBuf || fTime+adeltat > fLV0_vec[ fLV0_vec.size()-NtoEndBuf ].first ){ //std::cout<<" About to ReadSlowDB_LV0"< fLV1_vec[ fLV1_vec.size()-NtoEndBuf ].first ){ // std::cout<<" About to ReadSlowDB_LV1"< fFEM_V_vec[ifem][ fFEM_V_vec[ifem].size()-NtoEndBuf ].first ) //std::cout<<" About to ReadSlowDB_FEM_V"< fMM_HV_vec[ fMM_HV_vec.size()-NtoEndBuf ].first ){ //std::cout<<" About to ReadSlowDB_MM_HV"< fDCC_V_vec[0][ fDCC_V_vec[0].size()-NtoEndBuf ].first || fDCC_V_vec[1].size() <= NtoEndBuf || fTime+adeltat > fDCC_V_vec[1][ fDCC_V_vec[1].size()-NtoEndBuf ].first || fDCC_V_vec[NtoEndBuf].size() <= NtoEndBuf || fTime+adeltat > fDCC_V_vec[2][ fDCC_V_vec[2].size()-NtoEndBuf ].first ){ //std::cout<<" About to ReadSlowDB_DCC_V"< fCath_V_vec[ fCath_V_vec.size()-NtoEndBuf ].first ){ //std::cout<<" About to ReadSlowDB_Cath_V"<SetTime( fTime ); // Read system properties // if they are not available, set to -1 for no reading for (int itpc=0; itpc<3; itpc++){ fCath_V[itpc] = -1.0; fCath_V_next[itpc] = -1.0; for (int irp=0; irp<2; irp++){ for (int imm=0; imm<12; imm++){ fLV_I[itpc][irp][imm] = -1.0; fFEM_V[itpc][irp][imm] = -1.0; fMM_HV[itpc][irp][imm] = -1.0; fDCC_V[itpc][irp][imm] = -1.0; fLV_I_next[itpc][irp][imm] = -1.0; fFEM_V_next[itpc][irp][imm] = -1.0; fMM_HV_next[itpc][irp][imm] = -1.0; fDCC_V_next[itpc][irp][imm] = -1.0; } } } // Check if we need to read another chunk of // slow control information from database CheckReadDB( adeltat ); // Get index into each of the vectors of database query // results for the current time UpdateVectorTimeIdx( adeltat ); // Hard coded mapping of LV cable to channel from Denis Calvet: // // TPC N°3 Readout plane 0 (End_Plate_4) : LV Crate #0 U0 and U1 // TPC N°2 Readout plane 0 (End_Plate_2) : LV Crate #0 U4 and U5 // TPC N°2 Readout plane 1 (End_Plate_3) : LV Crate #0 U6 and U7 // // TPC N°3 Readout plane 1 (End_Plate_5) : LV Crate #1 U2 and U3 // TPC N°1 Readout plane 0 (End_Plate_0) : LV Crate #1 U4 and U5 // TPC N°1 Readout plane 1 (End_Plate_1) : LV Crate #1 U6 and U7 // TPC3 RP0 if ( fLV0_isok == true && fLV0_next_isok == true ){ fLV_I[2][0][0] = fLV0_vec[ fLV0_idx ].second[0]; fLV_I_next[2][0][0] = fLV0_vec[ fLV0_next_idx ].second[0]; for (int imm=1; imm<6; imm++){ fLV_I[2][0][imm] = fLV_I[2][0][0]; fLV_I_next[2][0][imm] = fLV_I_next[2][0][0]; } fLV_I[2][0][6] = fLV0_vec[ fLV0_idx ].second[1]; fLV_I_next[2][0][6] = fLV0_vec[ fLV0_next_idx ].second[1]; for (int imm=7; imm<12; imm++){ fLV_I[2][0][imm] = fLV_I[2][0][6]; fLV_I_next[2][0][imm] = fLV_I_next[2][0][6]; } // TPC2 RP0 fLV_I[1][0][0] = fLV0_vec[ fLV0_idx ].second[2]; fLV_I_next[1][0][0] = fLV0_vec[ fLV0_next_idx ].second[2]; for (int imm=1; imm<6; imm++){ fLV_I[1][0][imm] = fLV_I[1][0][0]; fLV_I_next[1][0][imm] = fLV_I_next[1][0][0]; } fLV_I[1][0][6] = fLV0_vec[ fLV0_idx ].second[3]; fLV_I_next[1][0][6] = fLV0_vec[ fLV0_next_idx ].second[3]; for (int imm=7; imm<12; imm++){ fLV_I[1][0][imm] = fLV_I[1][0][6]; fLV_I_next[1][0][imm] = fLV_I_next[1][0][6]; } // TPC2 RP1 fLV_I[1][1][0] = fLV0_vec[ fLV0_idx ].second[4]; fLV_I_next[1][1][0] = fLV0_vec[ fLV0_next_idx ].second[4]; for (int imm=1; imm<6; imm++){ fLV_I[1][1][imm] = fLV_I[1][1][0]; fLV_I_next[1][1][imm] = fLV_I_next[1][1][0]; } fLV_I[1][1][6] = fLV0_vec[ fLV0_idx ].second[5]; fLV_I_next[1][1][6] = fLV0_vec[ fLV0_next_idx ].second[5]; for (int imm=7; imm<12; imm++){ fLV_I[1][1][imm] = fLV_I[1][1][6]; fLV_I_next[1][1][imm] = fLV_I_next[1][1][6]; } } if ( fLV1_isok == true && fLV1_next_isok == true ){ // TPC3 RP1 fLV_I[2][1][0] = fLV1_vec[ fLV1_idx ].second[0]; fLV_I_next[2][1][0] = fLV1_vec[ fLV1_next_idx ].second[0]; for (int imm=1; imm<6; imm++){ fLV_I[2][1][imm] = fLV_I[2][1][0]; fLV_I_next[2][1][imm] = fLV_I_next[2][1][0]; } fLV_I[2][1][6] = fLV1_vec[ fLV1_idx ].second[1]; fLV_I_next[2][1][6] = fLV1_vec[ fLV1_next_idx ].second[1]; for (int imm=7; imm<12; imm++){ fLV_I[2][1][imm] = fLV_I[2][1][6]; fLV_I_next[2][1][imm] = fLV_I_next[2][1][6]; } // TPC1 RP0 fLV_I[0][0][0] = fLV1_vec[ fLV1_idx ].second[2]; fLV_I_next[0][0][0] = fLV1_vec[ fLV1_next_idx ].second[2]; for (int imm=1; imm<6; imm++){ fLV_I[0][0][imm] = fLV_I[0][0][0]; fLV_I_next[0][0][imm] = fLV_I_next[0][0][0]; } fLV_I[0][0][6] = fLV1_vec[ fLV1_idx ].second[3]; fLV_I_next[0][0][6] = fLV1_vec[ fLV1_next_idx ].second[3]; for (int imm=7; imm<12; imm++){ fLV_I[0][0][imm] = fLV_I[0][0][6]; fLV_I_next[0][0][imm] = fLV_I_next[0][0][6]; } // TPC1 RP1 fLV_I[0][1][0] = fLV1_vec[ fLV1_idx ].second[4]; fLV_I_next[0][1][0] = fLV1_vec[ fLV1_next_idx ].second[4]; for (int imm=1; imm<6; imm++){ fLV_I[0][1][imm] = fLV_I[0][1][0]; fLV_I_next[0][1][imm] = fLV_I_next[0][1][0]; } fLV_I[0][1][6] = fLV1_vec[ fLV1_idx ].second[5]; fLV_I_next[0][1][6] = fLV1_vec[ fLV1_next_idx ].second[5]; for (int imm=7; imm<12; imm++){ fLV_I[0][1][imm] = fLV_I[0][1][6]; fLV_I_next[0][1][imm] = fLV_I_next[0][1][6]; } } // Next read FEM Power for (int iep=0; iep<6; iep++){ if ( fFEMCheck[iep] == false ) continue; if ( fFEM_V_isok[iep] == true && fFEM_V_next_isok[iep] == true ){ int irp = iep%2; int itpc = iep/2; for (int imm=0; imm<12; imm++){ fFEM_V[itpc][irp][imm] = fFEM_V_vec[iep][ fFEM_V_idx[iep] ].second[ imm ]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,atabname,avarname); fFEM_V_next[itpc][irp][imm] = fFEM_V_vec[iep][ fFEM_V_next_idx[iep] ].second[ imm ]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,atabname,avarname); } } } // Next read MM HV settings if ( fMM_HV_isok == true && fMM_HV_next_isok == true ){ int afieldidx = 0; for (int itpc=0; itpc<3; itpc++){ for (int irp=0; irp<2; irp++){ for (int imm=0; imm<12; imm++){ fMM_HV[itpc][irp][imm] = fMM_HV_vec[ fMM_HV_idx ].second[ afieldidx ]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,"tpciseghv02_sensevoltage",avarname); fMM_HV_next[itpc][irp][imm] = fMM_HV_vec[ fMM_HV_next_idx ].second[ afieldidx ]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,"tpciseghv02_sensevoltage",avarname); if ( itpc==2 && irp == 0 && imm == 1 && fTime >= fTimeSwap1 && fTime < fTimeSwap2 ){ // use alternate channel fMM_HV[itpc][irp][imm] = fMM_HV_vec[ fMM_HV_idx ].second[ fMM_HV_names.size()-1 ]; fMM_HV_next[itpc][irp][imm] = fMM_HV_vec[ fMM_HV_next_idx ].second[ fMM_HV_names.size()-1 ]; } afieldidx ++; } } } } // Next read DCC power settings // there are 18 DCCs each raeding 4 MMs for (int idcc=0; idcc<18; idcc++){ int itpc; if (idcc<6) itpc = 1; else if (idcc<12) itpc=2; else itpc=0; int irp = (idcc%6)/3; int immoffs = ((idcc%6)%3)*2; int ioutvolt = (idcc%6) +1; if ( fDCC_V_isok[itpc] == true && fDCC_V_next_isok[itpc] == true ){ fDCC_V[itpc][irp][immoffs] = fDCC_V_vec[itpc][ fDCC_V_idx[itpc] ].second[ ioutvolt-1 ]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,atabname,avarname); fDCC_V[itpc][irp][immoffs+1] = fDCC_V[itpc][irp][immoffs]; fDCC_V[itpc][irp][immoffs+6] = fDCC_V[itpc][irp][immoffs]; fDCC_V[itpc][irp][immoffs+7] = fDCC_V[itpc][irp][immoffs]; // fDCC_V_next[itpc][irp][immoffs] = fDCC_V_vec[itpc][ fDCC_V_next_idx[itpc] ].second[ ioutvolt-1 ]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,atabname,avarname); fDCC_V_next[itpc][irp][immoffs+1] = fDCC_V_next[itpc][irp][immoffs]; fDCC_V_next[itpc][irp][immoffs+6] = fDCC_V_next[itpc][irp][immoffs]; fDCC_V_next[itpc][irp][immoffs+7] = fDCC_V_next[itpc][irp][immoffs]; } } // Finally get cathode HV if ( fCath_V_isok == true && fCath_V_next_isok == true ){ for (int itpc=0; itpc<3; itpc++){ fCath_V[itpc] = fCath_V_vec[ fCath_V_idx ].second[itpc]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,"ccbertan_cchv","tpc1_ccu_v__cchv"); fCath_V_next[itpc] = fCath_V_vec[ fCath_V_next_idx ].second[itpc]; //(float)ISlowControlDatabase::Get().QueryShowField(fTime,"ccbertan_cchv","tpc1_ccu_v__cchv"); } } // update status values UpdateStatus(); if (fDebug){ // Time check: long db_time = (long)ISlowControlDatabase::Get().QueryShowField(fTime,"tpc_lv_ps_tlv0","_i_time"); std::cout << ""< fEnd){ amult = 1; fTime = fTime + adeltat; } else { if ( fEnd+1 <= fTime ){ // handle case where no readings for a while amult*=2; fTime += amult; } else { amult = 1; fTime = fEnd+1; } } Read( adeltat ); return 1; } ///------------------------------------------------------------------------ /// Update status variables based on the latest readings void ITPCMMStatus::UpdateStatus(){ // hard coded values for now fStatus = 0; // check if bad db read? if ( fLV0_isok == false || fLV0_next_isok == false || fLV1_isok == false || fLV1_next_isok == false || fMM_HV_isok == false || fMM_HV_next_isok == false || fDCC_V_isok[0] == false || fDCC_V_next_isok[0] == false || fDCC_V_isok[1] == false || fDCC_V_next_isok[1] == false || fDCC_V_isok[2] == false || fDCC_V_next_isok[2] == false || fCath_V_isok == false || fCath_V_next_isok == false ) { //fStatus=32; fStatus=0; for (int itpc=0; itpc<3; itpc++){ fTPCStatus[itpc] = 0; for (int irp=0; irp<2; irp++){ for (int imm=0; imm<12; imm++){ // fMMStatus[itpc][irp][imm] = 32; fMMStatus[itpc][irp][imm] = 0; fMMStatus[itpc][irp][imm] += (1<<((itpc+1)*8+5)); // 6th status flag } } fTPCStatus[itpc] += (1<<((itpc+1)*8+5)); // 6th status flag fStatus += fTPCStatus[itpc]; } if ( fLV0_isok == false ) { std::cout<<"fLV0_isok==false, vecsize="<