|
//____________________________________________________________________ // // 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>
|