BRAT 2.4.5
Class index
Full class index
brahmlib
BRAHMS
ROOT page
//____________________________________________________________________
// 
// Slewing calibration module for the Beam-Beam counters
// * reference tube:    
//      Left  37 by default
//      Right 31 by default

// select hits in reference tubes according to 
//   | (adc - ped) - adc MIP) | < fAdcSel * adc MIP
// 
// Fill histograms (TDC*TDCGain)i - (TDC*TDCGain)ref vs Adc i for hits i such
// that adc/adcMIP > threshold
//
// Project to profile and fit with function 
//        slewDt + slewK/sqrt(adc/ag0) + slewP/(adc/ag0)
 
//____________________________________________________________________
//
// $Id: BrBbSlewingCalModule.cxx,v 1.7 2002/03/21 15:02:16 ouerdane Exp $
// $Author: ouerdane $
// $Date: 2002/03/21 15:02:16 $
// $Copyright: (C) 2001 BRAHMS Collaboration <brahmlib@rhic.bnl.gov>
//
#ifndef BRAT_BrBbSlewingCalModule
#include "BrBbSlewingCalModule.h"
#endif
#ifndef ROOT_TDirectory
#include "TDirectory.h"
#endif
#ifndef WIN32
#include <iostream>
#include <iomanip>
#include <fstream>
#else
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#endif
#ifndef BRAT_BrDataTable
#include "BrDataTable.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef BRAT_BrBbDig
#include "BrBbDig.h"
#endif
#ifndef BRAT_BrRunInfoManager
#include "BrRunInfoManager.h"
#endif
#ifndef ROOT_TH2
#include "TH2.h"
#endif
#ifndef ROOT_TFile
#include "TFile.h"
#endif
#ifndef BRAT_BrBbRdo
#include "BrBbRdo.h"
#endif
#ifndef BRAT_BrUnits
#include "BrUnits.h"
#endif
#ifndef ROOT_TProfile
#include "TProfile.h"
#endif
#ifndef ROOT_TF1
#include "TF1.h"
#endif
#ifndef ROOT_TMath
#include "TMath.h"
#endif

//____________________________________________________________________
ClassImp(BrBbSlewingCalModule);

//____________________________________________________________________
 BrBbSlewingCalModule::BrBbSlewingCalModule()
  : BrBbCalModule()
{
  // Default constructor. DO NOT USE
  SetState(kSetup);
  SetDefaultParameters();
}

//____________________________________________________________________
 BrBbSlewingCalModule::BrBbSlewingCalModule(const Char_t* name, 
					   const Char_t* title)
  : BrBbCalModule(name, title)
{
  // Named Constructor
  SetState(kSetup);
  SetDefaultParameters();
}

//____________________________________________________________________
 void BrBbSlewingCalModule::SetDefaultParameters()
{
  SetMinTdc();          // default is  10 ch 
  SetMaxTdc();          // default is  3500 ch
  SetAdcSel();          // default is  0.1*adcGain0
  SetEnergyThreshold(); // default is  0.8 
  SetMaxBigTEnergy();   // default is  6
  SetMaxSmallTEnergy(); // default is  3.5 
  SetNtuple();          // default is false
  SetDtimeCut();        // default is 0.7 ns 
}

//____________________________________________________________________
 void BrBbSlewingCalModule::DefineHistograms()
{
  // Define histograms. They are:
  // <fill in here>

  if (GetState() != kInit) {
    Stop("DefineHistograms", "Must be called after Init"); 
    return;  
  }

  if (fLoadAscii || fCommitAscii) {
    if (Verbose() > 5)
      Warning("DefineHistograms", "No need to declare histos "
              "since we only load calibration from ascii file"); 
    return;  
  }

  
  TDirectory* saveDir = gDirectory;
  
  // list of histograms
  fHistDir = gDirectory->mkdir(Form("%s_Slewing",GetName())); 
  fHistDir->cd();
  
  // Make histograms here 
  fHistDir->mkdir("Tubes");
  
  // tube histos
  fHistDir->cd("Tubes");
  
  // big tubes
  fSlew = new TH2F* [fNoTubes];
  
  for (Int_t i = 0; i < fNoTubes; i++) {
    Int_t tube = i + 1;
    if (tube == fRef)
      continue;
    
    fSlew[i] = 
      new TH2F(Form("slew%02d_%02d", tube, fRef),
	       Form("%s: Slewing effect %d - %d", GetName(), 
		    tube, fRef), 100, 0, 10, 400, -10, 10);
  }
  
  fHistDir->mkdir("Fits");
  // ---------------------
  
  fHistDir->cd();
  
  if (fNtuple) 
    fBbSlewing = new TNtuple("bbSlew", "BB data for slewing",
			     "tube:refTube:adc:refAdc:time:refTime:"
			     "ag0:refAg0:fastTime:fastTube");
  
  // Summaries  
  fSumSlewDt = new TH1F("slewDt", Form("%s: Slewing Dt", GetName()),
			fNoTubes, 0.5, fNoTubes + 0.5);
  
  fSumSlewDt->SetMarkerStyle(22);
  fSumSlewDt->SetMarkerSize(1.1);
  fSumSlewDt->SetMarkerColor(2);
  
  fSumSlewK  = new TH1F("slewK", Form("%s: Slewing K", GetName()),
		 	fNoTubes, 0.5, fNoTubes + 0.5);
  
  fSumSlewK->SetMarkerStyle(22);
  fSumSlewK->SetMarkerSize(1.1);
  fSumSlewK->SetMarkerColor(2);
  
  fSumSlewP  = new TH1F("slewP", Form("%s: Slewing P", GetName()),
		 	fNoTubes, 0.5, fNoTubes + 0.5);
  
  fSumSlewP->SetMarkerStyle(22);
  fSumSlewP->SetMarkerSize(1.1);
  fSumSlewP->SetMarkerColor(2);
  
  gDirectory = saveDir;
}

//____________________________________________________________________
 void BrBbSlewingCalModule::Init()
{
  // Job-level initialisation
  SetState(kInit);

  // init base class (BrBbCalibration and BrDetectorParamsBB)
  BrBbCalModule::Init();
  BrCalibration::EAccessMode mode = BrCalibration::kRead;

  if (fLoadAscii) {
    mode = BrCalibration::kTransitional;
    fCalibration->Use("slewK", mode, fNoTubes);
    fCalibration->Use("slewP", mode, fNoTubes);
    fCalibration->Use("slewDt", mode, fNoTubes);
  }
  else {
    if (!fCalibration->GetAccessMode("pedestal")) {
      mode = BrCalibration::kRead;
      if (DebugLevel() > 3)
        Warning("Init", "Pedestals will be read from the SQL DB");
      fCalibration->Use("pedestal", mode, fNoTubes);
      fCalibration->Use("pedestalWidth", mode, fNoTubes);
    }
    
    if (!fCalibration->GetAccessMode("adcGain0")) {
      mode = BrCalibration::kRead;
      if (DebugLevel() > 3)
        Warning("Init", "ADC Gain 0 will be read from the SQL DB");
      fCalibration->Use("adcGain0", mode, fNoTubes);
    }
    
    if (!fCalibration->GetAccessMode("adcGap")) {
      mode = BrCalibration::kRead;
      if (DebugLevel() > 3)
        Warning("Init", "ADC Gap 0 will be read from the SQL DB");
      fCalibration->Use("adcGap", mode, fNoTubes);
    }
    
    if (!fCalibration->GetAccessMode("adcGapStart")) {
      mode = BrCalibration::kRead;
      if (DebugLevel() > 3)
        Warning("Init", "ADC Gap Start will be read from the SQL DB");
      fCalibration->Use("adcGapStart", mode, fNoTubes);
    }
    
    if (!fCalibration->GetAccessMode("tdcGain")) {
      mode = BrCalibration::kRead;
      if (DebugLevel() > 3)
        Warning("Init", "TDC Gains will be read from the SQL DB");
      fCalibration->Use("tdcGain", mode, fNoTubes);
    }

    if (!fCalibration->GetAccessMode("deltaTdc")) {
      mode = BrCalibration::kRead;
      if (DebugLevel() > 3)
        Warning("Init", "Delta TDC will be read from the SQL DB");
      fCalibration->Use("deltaTdc", mode, fNoTubes);
    }
    
    // if we want to save them (ascii or DB)
    if (fSaveAscii || fCommitAscii) {
      mode = BrCalibration::kWrite;
      fCalibration->Use("slewK", mode, fNoTubes);
      fCalibration->Use("slewP", mode, fNoTubes);
      fCalibration->Use("slewDt", mode, fNoTubes);
    }

    fValidTube = new Bool_t [fNoTubes];
    for (Int_t i = 1; i <= fNoTubes; i++)
      fValidTube[i-1] = kTRUE;
  }
}

//____________________________________________________________________
 void BrBbSlewingCalModule::Begin()
{
  // Run-level initialisation
  SetState(kBegin);
  
  // if loading cal from ascii file
  if (fLoadAscii) {
    ReadAscii();
    return;
  }

  // if reading calibration parameters from ascii file to commit them,
  // don't need to check if histos are booked
  if (fCommitAscii)
    return;
  
  if (!HistBooked()) {
    Abort("Begin", "Histograms must be booked for the"
	  " calibration to work");
    return;
    
  }
  
  if (!fCalibration->RevisionExists("*")) {
    Abort("Begin", "A calibration revision is missing, aborting...", GetName());
    return;
  }
  

  for (Int_t i = 1; i <= fNoTubes; i++) {
    fCalibration->SetSlewK(i, BrBbCalibration::kCalException);
    fCalibration->SetSlewDt(i, BrBbCalibration::kCalException);
    fCalibration->SetSlewP(i, BrBbCalibration::kCalException);

    Float_t ped = fCalibration->GetPedestal(i);
    Float_t ag0 = fCalibration->GetAdcGain0(i);
    Float_t tdg = fCalibration->GetTdcGain(i);
    Float_t gap = fCalibration->GetAdcGap(i);
    Float_t gps = fCalibration->GetAdcGapStart(i);
    Float_t del = fCalibration->GetDeltaTdc(i);
    // if bad cal
    if (!IsValid(ped) || !IsValid(ag0) || !IsValid(tdg) ||
	!IsValid(gap) || !IsValid(gps) || !IsValid(del)) {
      fValidTube[i - 1] = kFALSE;
      if (Verbose() > 2)
	cout << GetName() << " Tube " << i << " won't be used (bad calibrations) " << endl;
      continue;
    }
  }
}

//____________________________________________________________________
 void BrBbSlewingCalModule::Event(BrEventNode* inNode, BrEventNode* outNode)
{

  // select hits in reference tubes according to 
  //   | (adc - ped) - adc MIP) | < 0.1 * adc MIP
  // 
  // Fill histograms (TDC*TDCGain)i - (TDC*TDCGain)ref for hits i such
  // that adc/adcMIP > threshold

  SetState(kEvent);

  if (fLoadAscii || fCommitAscii)
    return;
  
  BrDataTable* hits = 
    (BrDataTable*)inNode->GetDataTable(fDigName);
  
  if (!hits) {
    Warning("Event", "No data table for %s", GetName());
    return;
  }
  
  if (!hits->GetEntries()) {
    Warning("Event", "No hits in datatable for %s", GetName());
    return;
  }
  
  BrBbDig* hRef = FindReference(hits); // reference tube
  
  if (hRef)     
    Process(hits, hRef);
}

//____________________________________________________________________
 void BrBbSlewingCalModule::Process(BrDataTable* hits, BrBbDig* ref)
{
  // private method
  
  // ----------------------------------------------------
  // fill profiles with time diff hit - ref vs energy
  // for hits above threshold
  // ----------------------------------------------------
  
  
  // check the fastest hit
  Float_t tfast = 99999;
  Float_t fast  = 0;
  
  for(Int_t i = 0; i < fNoTubes; i++) {
    BrBbDig* hit = (BrBbDig*)hits->At(i);
    Int_t   tube = hit->GetTubeNo();

    // get calibration
    Float_t ped  = fCalibration->GetPedestal(tube);
    Float_t ag0  = fCalibration->GetAdcGain0(tube);
    Float_t tdg  = fCalibration->GetTdcGain(tube);
    Float_t gap  = fCalibration->GetAdcGap(tube);
    Float_t gps  = fCalibration->GetAdcGapStart(tube);
    
    // apply needed calibration
    Float_t adc  = hit->GetAdc() - ped;
    Float_t tdc  = hit->GetTdc();
    if (tube >= fBigT && adc > gps)
      adc -= gap;
    
    if (adc/ag0 < fEnergyThreshold || tdc < fMinTdc || tdc > fMaxTdc)
      continue;
    
    tdc *= tdg;
    
    // check the fastest hit
    if (tdc < tfast) {
      tfast = tdc;
      fast  = tube;
    }
  }
  
  // ------------------------------------------
  
  // fill profiles
  
  for(Int_t i = 0; i < fNoTubes; i++) {
    BrBbDig* hit = (BrBbDig*)hits->At(i);
    Int_t  tube = hit->GetTubeNo();

    if (!fValidTube[tube - 1]) 
      continue;

    if (tube == ref->GetTubeNo())
      continue;
    
    // get calibration

    Float_t ped  = fCalibration->GetPedestal(tube);
    Float_t ag0  = fCalibration->GetAdcGain0(tube);
    Float_t tdg  = fCalibration->GetTdcGain(tube);
    Float_t gap  = fCalibration->GetAdcGap(tube);
    Float_t gps  = fCalibration->GetAdcGapStart(tube);
    Float_t del  = fCalibration->GetDeltaTdc(tube);

    // if bad cal
    if (!IsValid(ped) || !IsValid(ag0) || !IsValid(tdg) ||
	!IsValid(gap) || !IsValid(gps))
      continue;
    
    // apply needed calibration
    Float_t adc  = hit->GetAdc() - ped;
    Float_t tdc  = hit->GetTdc();
    if (tube >= fBigT && adc > gps)
      adc -= gap;
    
    if (adc/ag0 < fEnergyThreshold || tdc < fMinTdc || tdc > fMaxTdc)
      continue;

    
    Float_t refTime = ref->GetTdc()*fCalibration->GetTdcGain(fRef);
    Float_t time    = tdc*fCalibration->GetTdcGain(tube);
    Float_t dt      = time - refTime - del;
    if (TMath::Abs(dt) > fDtimeCut)
      continue;
    
    fSlew[tube - 1]->Fill(adc/ag0, dt);
    
    Float_t rag0 = fCalibration->GetAdcGain0(fRef);
    Float_t radc = ref->GetAdc();
    if (fNtuple)
      fBbSlewing->Fill(tube, fRef, adc, radc, time, refTime, ag0, 
		       rag0, tfast, fast);
  }
  
}

//____________________________________________________________________
 BrBbDig* BrBbSlewingCalModule::FindReference(BrDataTable* hits)
{
  // private method

  // -----------------------------
  // pick up the reference tube hit
  // -----------------------------

  BrBbDig* ref = 0;
  
  for(Int_t i = 0; i < fNoTubes; i++) {
    BrBbDig* hit = (BrBbDig*)hits->At(i);
    Int_t tube = hit->GetTubeNo();
    
    if (tube != fRef)
      continue;
    
    // get calibration
    Float_t ped = fCalibration->GetPedestal(tube);
    Float_t ag0 = fCalibration->GetAdcGain0(tube);
    Float_t tdg = fCalibration->GetTdcGain(tube);
    
    if (!IsValid(ped) || !IsValid(ag0)) {
      Abort("FindReference", "Bad calibration for reference tube %d", fRef);
      return 0;
    }
    
    Float_t adc = hit->GetAdc() - ped;
    Float_t tdc = hit->GetTdc();
    if (TMath::Abs(adc - ag0) < fAdcSel*ag0 && tdc < fMaxTdc && tdc > fMinTdc)
      ref = hit;
  }
  
  return ref;
}

  
//____________________________________________________________________
 void BrBbSlewingCalModule::End()
{
  // Run-level finalisation
  SetState(kEnd);
}

//____________________________________________________________________
 void BrBbSlewingCalModule::Finish()
{
  // Job-level finalisation
  SetState(kFinish);
  
  if (fLoadAscii)
    return;

  if (fCommitAscii) {
    ReadAscii();
    return;
  }
  
  if (Verbose() > 1)
    cout << " *** " << GetName() 
	 << " Slewing correction: Delta t = dt + k / sqrt(dE) + p / dE ***" << endl
	 << " +------+--------------+--------------+--------------+ " << endl
	 << " | Tube |    Slew Dt   |    Slew K    |     SlewP    | " << endl
	 << " +------+--------------+--------------+--------------+ " << endl;
  
  TDirectory* saveDir = gDirectory;
  
  fHistDir->cd("Fits");
  
  TF1* fit = new TF1("slewing", "[0] + [1]/sqrt(x) + [2]/x", 0, 8); 

  // ref. tube cannot be slew-corrected now
  fCalibration->SetSlewK(fRef, 0);
  fCalibration->SetSlewP(fRef, 0);
  fCalibration->SetSlewDt(fRef, 0);
  
  fSumSlewDt->Fill(fRef, 0);
  fSumSlewP ->Fill(fRef, 0);
  fSumSlewK ->Fill(fRef, 0);

  // big tubes
  
  for (Int_t i = 0; i < fNoTubes; i++) {
    Int_t tube = i + 1;
    if (tube == fRef)
      continue;
    if (!fValidTube[tube-1]) {
      cout << " bad tube: " << tube << endl;
      continue;
    }
    
    TProfile* p = fSlew[i]->ProfileX(Form("Fit%02d_%02d", tube, fRef));
    
    Float_t maxEn = fMaxSmallTEnergy;
    if (tube >= fBigT)
      maxEn = fMaxBigTEnergy;

    // fit profile
    fit->SetParameters(0., 1., 1.);
    p->Fit("slewing", "Q0", "", fEnergyThreshold, maxEn);
    
    fCalibration->SetSlewK(tube, fit->GetParameter(1));
    fCalibration->SetSlewP(tube, fit->GetParameter(2));
    fCalibration->SetSlewDt(tube, fit->GetParameter(0));
    
    fSumSlewDt->Fill(tube,  fit->GetParameter(0));
    fSumSlewK->Fill(tube, fit->GetParameter(1));
    fSumSlewP->Fill(tube, fit->GetParameter(2));
    
    if (Verbose() > 1)
      cout << " | " << setw(4)  << tube 
	   << " | " << setw(12) << fit->GetParameter(0)
	   << " | " << setw(12) << fit->GetParameter(1)  
	   << " | " << setw(12) << fit->GetParameter(2)  
	   << " | " << endl;
  }
  
  if (Verbose() > 1)
    cout << " +------+--------------+--------------+-------------+ " << endl
 	 << " | " << setw(4)  << fRef 
	 << " | " << setw(12) << fCalibration->GetSlewDt(fRef)
	 << " | " << setw(12) << fCalibration->GetSlewK(fRef)  
	 << " | " << setw(12) << fCalibration->GetSlewP(fRef)  
	 << " | " << endl
	 << " +------+--------------+--------------+-------------+ " << endl;

  // save stuff to ascii file if required
  if (fSaveAscii)
    SaveAscii();

  gDirectory = saveDir;
}


//____________________________________________________________________
 void BrBbSlewingCalModule::SaveAscii()
{
    // save pedestal to ascii file
    
  BrRunInfoManager* runMan = BrRunInfoManager::Instance();
  Int_t* runs = runMan->GetRunNumbers();
  Int_t nrun  = runMan->GetNumberOfRuns();
  
  BrBbCalModule::SaveAscii();

  ofstream file(fCalibFile.Data(), ios::out);
  
  file << "****************************************** " << endl;
  file << "*  Calibration for BB counter " << GetName() << endl;
  file << "*    Slewing correction, reference tube: " << fRef << endl;
  file << "*    Used events from run(s) ";
  for (Int_t r = 0; r < nrun; r++) file << runs[r] << " ";
  file << endl;
  file << "****************************************** " <<endl;
  file << "*" << endl;    
  file << "* tube |    slewK   |   slewDt    |   slewP    " << endl;
  file << "* ---------------------------------------------" << endl << endl; 
  
  for (Int_t i = 0; i < fNoTubes; i++) {
    Int_t tube = i + 1;
    file << setw(5)  << tube  
	 << setw(13) << fCalibration->GetSlewK(tube) 
	 << setw(13) << fCalibration->GetSlewDt(tube) 
	 << setw(13) << fCalibration->GetSlewP(tube) 
	 << endl;
  }
  
  file << "* ------------------------------------" << endl << endl;
  
  cout << GetName() << " Slewing parameters saved to file " 
       << fCalibFile.Data() << endl << endl;
  
}

//____________________________________________________________________
 void BrBbSlewingCalModule::ReadAscii()
{
  BrBbCalModule::ReadAscii();

  ifstream file(fCalibFile.Data(), ios::in);

  if (!file) {
    Abort("ReadAscii", "File %s was not found", fCalibFile.Data());
    return;
  }

  Float_t sdt, sk, sp;
  Int_t tube;
  Char_t comment[256];
  
  file.getline(comment, 256);
  while(comment[0] == '*') {
    file.getline(comment, 256);
    if (DebugLevel() > 5)
      cout << comment << endl;
  } 
  
  for (Int_t i = 1; i <= fNoTubes; i++) {
    file >> tube >> sk >> sdt >> sp;
    if (DebugLevel() > 5) 
      cout << setw(4)  << tube 
	   << setw(12) << sk 
	   << setw(12) << sdt 
	   << setw(12) << sp << endl;
    
    fCalibration->SetSlewDt(tube, sdt);
    fCalibration->SetSlewK(tube, sk);
    fCalibration->SetSlewP(tube, sp);
  }
  
  fCalibration->SetComment("slewK", fComment.Data());
  fCalibration->SetComment("slewDt", fComment.Data());
  fCalibration->SetComment("slewP", fComment.Data());
}

//____________________________________________________________________
 void BrBbSlewingCalModule::Print(Option_t* option) const
{
  // Print module information
  // See BrModule::Print for options.
  // In addition this module defines the Option:
  // <fill in here>

  TString opt(option);
  opt.ToLower(); 
  
  BrModule::Print(option); 
  if (opt.Contains("d")) 
   cout << endl 
         << "  Original author: Djamel Ouerdane" << endl
         << "  Last Modifications: " << endl 
         << "    $Author: ouerdane $" << endl  
         << "    $Date: 2002/03/21 15:02:16 $"   << endl 
         << "    $Revision: 1.7 $ " << endl  
         << endl 
         << "-------------------------------------------------" << endl;
}

//____________________________________________________________________
//
// $Log: BrBbSlewingCalModule.cxx,v $
// Revision 1.7  2002/03/21 15:02:16  ouerdane
// added fComment member to base class module and method SetComment so that the user can set comments about the calibration at commit time
//
// Revision 1.6  2001/11/05 06:57:00  ouerdane
// corrected names for histograms
//
// Revision 1.5  2001/10/23 20:47:44  ouerdane
// Updated calibration modules for more efficiency, details are mainly technical
//
// Revision 1.4  2001/10/16 14:53:49  ouerdane
// added delta time calibration
//
// Revision 1.3  2001/10/15 03:24:28  ouerdane
// fixed small error in event method
//
// Revision 1.2  2001/10/15 00:35:08  ouerdane
// Updated all Beam-Beam counter calibration modules (like I did for the TOF
// some weeks ago):
//
// Common changes:
//  added methods Set[Save,Commit,Load]Ascii(Bool_t)
//  removed methods Set[ReadFrom,LoadFrom,SaveTo]File
//
// BrBbGainCalModule:
//  cleaned up a lot the code, added diagnostic histograms showing calibrated
//  ADC after the 1st MIP peak was found.
//  Still at a stage where the 1st MIP peak is the only one to be checked.
//  Later on, will add algorithm to find other peaks.
//
// Added BrBbSlewingCalModule in Makefile.am, etc
// The fit function introduced is dT = a + b/sqrt(dE) + c/dE (where dE = ADC/Gain0)
//
// Revision 1.1  2001/10/02 21:53:05  videbaek
// Added to source but not yet in Include...
//

This page automatically generated by script docBrat by Christian Holm

Copyright ; 2002 BRAHMS Collaboration <brahmlib@rcf.rhic.bnl.gov>
Last Update on by

Validate HTML
Validate CSS