Example of Using Scaler Classes to Compute DAQ Deadtime

Robert Michaels, rom@jlab.org, Jefferson Lab Hall A, Aug 2001

This file:     hallaweb.jlab.org/equipment/daq/tscaldtime_main.html


The following example shows how to use the hana_scaler package to compute the DAQ deadtime from the triggers and accepted triggers in scaler data which exists in a CODA file.

//--------------------------------------------------------
//  tscaldtime_main.C
//
//  Read a CODA file and check the deadtime from scalers.
// 
//  R. Michaels, Aug 2001 
//--------------------------------------------------------

#include < iostream >
#include < string >
#include "THaScaler.h"
#include "THaCodaFile.h"

#ifndef __CINT__
#include "TROOT.h"
#include "TFile.h"
#include "TH1.h"
#include "TH2.h"
#include "TProfile.h"
#include "TNtuple.h"
#include "TRandom.h"
#endif


int main(int argc, char* argv[]) {

   int detailed_printout = 1; // set =1 (0) for printout(or not)
   int trig;
   THaScaler *scaler;
   scaler = new THaScaler;

   if (argc < 3) {
     cout << "Usage:  " << argv[0] << " file  bank" << endl;
     cout << "where file = CODA file to analyze " << endl;
     cout << "and bank = 'Right', 'Left'  (spectrometer)" << endl;
     return 1;
   }
   TString filename = argv[1];
   string bank = argv[2];   

   if (scaler->Init(bank.c_str()) == -1) {  
      cout << "Error initializing scaler " << endl;
      return 1;
   }

   cout << "Enter ps factors" << endl;
   cout << "(A value 'zero' means essentially infinite)" << endl;
   Int_t psf[20];  
   for (trig=1; trig < 13; trig++) psf[trig]=0;
   if (bank == "Right") {
      cout << "ps1: "; cin >> psf[1];
      cout << "ps2: "; cin >> psf[2];
   } else {
      cout << "ps3: "; cin >> psf[3];
      cout << "ps4: "; cin >> psf[4];
   }
   cout << "ps8: "; cin >> psf[8];
   for (trig=1; trig < 5; trig++) {
       if (psf[trig] == 0) psf[trig]=16777216;   //  2^24 is max
       psf[trig] = psf[trig]%16777216;
   }
   for (trig=5; trig < 9; trig++) {
       if (psf[trig] == 0) psf[trig]=65536;  //  2^16 is max
       psf[trig] = psf[trig]%65536;
   }
   for (trig=9; trig < 13; trig++) psf[trig]=1;  // cannot prescale

   Double_t tsum,ltime;
   int status = 1;
   
   while (status) {
     status = scaler->LoadDataCodaFile(filename);   // load data for 'filename'
     if (!status) goto quit;
     Double_t time = scaler->GetPulser("clock")/1024;

     if (detailed_printout) {
       cout << "\n\n------------  SCALER EVENT DATA ---------------\n" << endl;
       scaler->Print();     // raw diagnostic printout
       cout << "Time    " << time << "\n Counts :   " << endl;
       for (trig = 1; trig < 6; trig++ ) {
         cout << "Trigger " << trig << "   hel+  0  hel- " << scaler->GetTrig(1,trig) << "   " << scaler->GetTrig(trig) << "   " << scaler->GetTrig(-1,trig) << endl;
       }
       cout << "Rates (Hz) = " << endl;
       cout << "Bcm u3   hel+  0  hel- " << scaler->GetBcmRate(1,"bcm_u3") << "   " << scaler->GetBcmRate("bcm_u3") << "   " << scaler->GetBcmRate(-1,"bcm_u3") << endl;
       for (trig = 1; trig < 6; trig++ ) {
         cout << "Trigger " << trig << "   hel+  0  hel- " << scaler->GetTrigRate(1,trig) << "   " << scaler->GetTrigRate(trig) << "   " << scaler->GetTrigRate(-1,trig) << endl;
       }
     }

     tsum = 0;
     for (int i = 1; i <= 3; i++) {
       if (bank == "Right") {
          trig=i;
       } else {
          trig=i+2;
       }
       if (i==3) trig=8;
       tsum = tsum + scaler->GetTrigRate(0,trig)/psf[trig];
     }
     Double_t tsacc;
// Since the Norm scaler for helicity=0 is in slot 8 and 'ts-accept' in chan 12...
     tsacc = scaler->GetScalerRate(8,12);  // equivalent to next line (slot 8, chan 12)
     tsacc = scaler->GetNormRate(0,12);  // equivalent to next line (helicity 0, chan 12)
     tsacc = scaler->GetNormRate(0,"TS-accept");  // for helicity 0
     ltime = -1;
     if(tsum != 0) ltime = tsacc / tsum;
     cout << "Sum trig " << tsum << "  TS acc " 
          << tsacc << "   live time = " << ltime << endl;

              
   }  // <--- loop over scaler events in CODA file

quit:

   return 0;
}