/*************************************************************************** PMusrT0.cpp Author: Andreas Suter e-mail: andreas.suter@psi.ch ***************************************************************************/ /*************************************************************************** * Copyright (C) 2007-2016 by Andreas Suter * * andreas.suter@psi.ch * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include using namespace std; #include #include #include #include #include "PMusrT0.h" #define DETECTOR_TAG_FORWARD 0 #define DETECTOR_TAG_BACKWARD 1 //-------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------- /** *

Constructor. */ PMusrT0Data::PMusrT0Data() { InitData(); } //-------------------------------------------------------------------------- // Destructor //-------------------------------------------------------------------------- /** *

Destructor. */ PMusrT0Data::~PMusrT0Data() { fRawRunData.clear(); fHistoNo.clear(); fT0.clear(); for (UInt_t i=0; iInitialize the necessary variables. */ void PMusrT0Data::InitData() { fSingleHisto = true; fRunNo = -1; fAddRunIdx = -1; fHistoNoIdx = -1; fDetectorTag = -1; fCmdTag = -1; fRawRunData.clear(); fHistoNo.clear(); fT0.clear(); for (UInt_t i=0; iReturns the raw run data set with index idx. * * return: * - raw run data set * - 0 pointer, if idx is out of range * * \param idx index of the raw run data */ PRawRunData* PMusrT0Data::GetRawRunData(Int_t idx) { if ((idx < 0) || (idx >= static_cast(fRawRunData.size()))) return 0; return fRawRunData[idx]; } //-------------------------------------------------------------------------- // GetHistoNo //-------------------------------------------------------------------------- /** *

Get histogram number of a run. * * return: * - histogram number * - -1 if index is out of range * * \param idx index of the run (msr-file). */ Int_t PMusrT0Data::GetHistoNo(UInt_t idx) { if (idx >= fHistoNo.size()) return -1; return fHistoNo[idx]; } //-------------------------------------------------------------------------- // GetT0Bin //-------------------------------------------------------------------------- /** *

Get t0 (in bin) of a run. * * return: * - t0 bin * - -1 if index is out of range * * \param idx index of the run (msr-file). */ Int_t PMusrT0Data::GetT0Bin(UInt_t idx) { if (idx >= fT0.size()) return -1; return fT0[idx]; } //-------------------------------------------------------------------------- // GetAddT0BinSize //-------------------------------------------------------------------------- /** *

Get addt0 size of a run, i.e. the number of addt0's for a given msr-file run. * * return: * - number of addt0's * - -1 if index is out of range * * \param idx index of the run (msr-file). */ UInt_t PMusrT0Data::GetAddT0BinSize(UInt_t idx) { if (idx >= fAddT0.size()) return 0; return fAddT0[idx].size(); } //-------------------------------------------------------------------------- // GetAddT0Bin //-------------------------------------------------------------------------- /** *

Get addt0 (in bin) of a run. * * return: * - addt0 bin * - -1 if index is out of range * * \param addRunIdx index of the addrun * \param idx index of the run (msr-file). */ Int_t PMusrT0Data::GetAddT0Bin(UInt_t addRunIdx, UInt_t idx) { if (addRunIdx >= fAddT0.size()) return -1; if (idx >= fAddT0[addRunIdx].size()) return -1; return fAddT0[addRunIdx][idx]; } //-------------------------------------------------------------------------- // SetT0Bin //-------------------------------------------------------------------------- /** *

Set t0 value. * * \param val t0 value to be set * \param idx index at which t0 shall be set. */ void PMusrT0Data::SetT0Bin(UInt_t val, UInt_t idx) { if (idx >= fT0.size()) fT0.resize(idx+1); fT0[idx] = val; } //-------------------------------------------------------------------------- // SetAddT0Bin //-------------------------------------------------------------------------- /** *

Set addt0 value. * * \param val t0 value to be set * \param addRunIdx addt0 index (for each addrun, there has to be an addt0) * \param idx index at which t0 shall be set. */ void PMusrT0Data::SetAddT0Bin(UInt_t val, UInt_t addRunIdx, UInt_t idx) { if (addRunIdx >= fAddT0.size()) fAddT0.resize(addRunIdx+1); if (idx >= fAddT0[addRunIdx].size()) fAddT0[addRunIdx].resize(idx+1); fAddT0[addRunIdx][idx] = val; } //-------------------------------------------------------------------------- ClassImpQ(PMusrT0) //-------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------- /** *

Constructor. */ PMusrT0::PMusrT0() { fTimeout = 0; fTimeoutTimer = 0; fValid = false; fStatus = 0; // default is quit locally fMainCanvas = 0; fHisto = 0; fData = 0; fBkg = 0; fToDoInfo = 0; fDataAndBkgEnabled = false; fT0Enabled = false; fShowT0DataChannel = false; fDataRange[0] = 0; fDataRange[1] = 0; fBkgRange[0] = 0; fBkgRange[1] = 0; fT0Line = 0; fT0DataLine = 0; fFirstBkgLine = 0; fLastBkgLine = 0; fFirstDataLine = 0; fLastDataLine = 0; } //-------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------- /** *

Constructor * * \param data raw run data set */ PMusrT0::PMusrT0(PMusrT0Data &data) : fMusrT0Data(data) { fTimeout = 0; fTimeoutTimer = 0; fValid = true; fStatus = 0; // default is quit locally fMainCanvas = 0; fHisto = 0; fData = 0; fBkg = 0; fToDoInfo = 0; fDataAndBkgEnabled = false; fT0Enabled = false; fShowT0DataChannel = false; fDataRange[0] = 0; fDataRange[1] = 0; fBkgRange[0] = 0; fBkgRange[1] = 0; fT0Line = 0; fT0DataLine = 0; fFirstBkgLine = 0; fLastBkgLine = 0; fFirstDataLine = 0; fLastDataLine = 0; // feed necessary objects TString str; if ((fMusrT0Data.GetCmdTag() == PMUSRT0_GET_T0) || (fMusrT0Data.GetCmdTag() == PMUSRT0_GET_T0_DATA_AND_BKG_RANGE)) { str = *fMusrT0Data.GetRawRunData(fMusrT0Data.GetAddRunIdx())->GetRunName() + TString(" : "); str += fMusrT0Data.GetHistoNo(fMusrT0Data.GetHistoNoIdx()); if (fMusrT0Data.GetDetectorTag() == PMUSRT0_FORWARD) str += " (f)"; else str += " (b)"; str += ", msr runNo = "; str += fMusrT0Data.GetRunNo()+1; // feed raw data histo PRawRunData *rawRunData = fMusrT0Data.GetRawRunData(fMusrT0Data.GetAddRunIdx()); if (rawRunData == 0) { fValid = false; return; } Int_t histoNo = fMusrT0Data.GetHistoNo(fMusrT0Data.GetHistoNoIdx()); if (!rawRunData->IsPresent(histoNo)) { cerr << endl << ">> PMusrT0::PMusrT0: **ERROR** found histogram number " << histoNo+1 << " which is NOT present in the data file."; cerr << endl << ">> Please try to fix this first ..." << endl; fValid = false; return; } Int_t noOfBins = rawRunData->GetDataBin(histoNo)->size(); Double_t start = -0.5; Double_t end = noOfBins - 0.5; // -0.5 is correct since the data start at 0.0 fHisto = new TH1F("fHisto", str.Data(), noOfBins, start, end); fHisto->SetMarkerStyle(21); fHisto->SetMarkerSize(0.5); fHisto->SetMarkerColor(TColor::GetColor(0,0,0)); // black Double_t maxVal = 0.0; fT0Estimated = 0; for (UInt_t i=0; iGetDataBin(histoNo)->size(); i++) { fHisto->SetBinContent(i+1, rawRunData->GetDataBin(histoNo)->at(i)); if (rawRunData->GetDataBin(histoNo)->at(i) > maxVal) { maxVal = rawRunData->GetDataBin(histoNo)->at(i); fT0Estimated = i; } } } else { str = *fMusrT0Data.GetRawRunData(0)->GetRunName() + TString(" : "); if (fMusrT0Data.GetDetectorTag() == PMUSRT0_FORWARD) str += " forward grouped and runs added"; else str += " backward grouped and runs added"; str += ", msr runNo = "; str += fMusrT0Data.GetRunNo()+1; // feed raw data histo PRawRunData *rawRunData = fMusrT0Data.GetRawRunData(0); if (rawRunData == 0) { fValid = false; return; } // get run and first histo of grouping and feed it into fHisto Int_t histoNo = fMusrT0Data.GetHistoNo(0); Int_t noOfBins = rawRunData->GetDataBin(histoNo)->size(); Double_t start = -0.5; Double_t end = noOfBins - 0.5; // -0.5 is correct since the data start at 0.0 fHisto = new TH1F("fHisto", str.Data(), noOfBins, start, end); fHisto->SetMarkerStyle(21); fHisto->SetMarkerSize(0.5); fHisto->SetMarkerColor(TColor::GetColor(0,0,0)); // black // sum up all necessary histograms by taking care of the proper t0's Int_t t00; Int_t t0; Double_t dval; // check if asymmetry fit UInt_t factor=1; if (!fMusrT0Data.IsSingleHisto()) factor=2; if (fMusrT0Data.GetDetectorTag() == PMUSRT0_FORWARD) t00 = fMusrT0Data.GetT0Bin(0); else t00 = fMusrT0Data.GetT0Bin(1); // check if there are addruns and grouping if ((fMusrT0Data.GetRawRunDataSize() > 1) && (fMusrT0Data.GetHistoNoSize() > 1)) { // addruns and grouping present for (Int_t i=0; i 0) && (i+t0-t00 < static_cast(rawRunData->GetDataBin(histoNo)->size()))) dval += rawRunData->GetDataBin(histoNo)->at(i+t0-t00); for (UInt_t j=1; j 0) && (i+t0-t00 < static_cast(rawRunData->GetDataBin(histoNo)->size()))) dval += rawRunData->GetDataBin(histoNo)->at(i+t0-t00); } } // set bin value of fHisto fHisto->SetBinContent(i+1, dval); } } else if (fMusrT0Data.GetRawRunDataSize() > 1) { // only addruns present for (Int_t i=0; i 0) && (i+t0-t00 < static_cast(rawRunData->GetDataBin(histoNo)->size()))) dval += rawRunData->GetDataBin(histoNo)->at(i+t0-t00); for (UInt_t j=1; j 0) && (i+t0-t00 < static_cast(rawRunData->GetDataBin(histoNo)->size()))) dval += rawRunData->GetDataBin(histoNo)->at(i+t0-t00); } // set bin value of fHisto fHisto->SetBinContent(i+1, dval); } } else if (fMusrT0Data.GetHistoNoSize() > 1) { // only grouping persent for (Int_t i=0; i 0) && (i+t0-t00 < static_cast(rawRunData->GetDataBin(histoNo)->size()))) dval += rawRunData->GetDataBin(histoNo)->at(i+t0-t00); } // set bin value of fHisto fHisto->SetBinContent(i+1, dval); } } } // generate canvas etc fMainCanvas = new TCanvas("fMainCanvas", str); fMainCanvas->SetFillColor(TColor::GetColor(255,255,255)); fMainCanvas->Show(); fMainCanvas->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", "PMusrT0", this, "HandleCmdKey(Int_t,Int_t,Int_t,TObject*)"); fMainCanvas->Connect("Closed()", "PMusrT0", this, "Quit()"); if (fMusrT0Data.GetCmdTag() != PMUSRT0_GET_T0) fDataAndBkgEnabled = true; else fDataAndBkgEnabled = false; if (fMusrT0Data.GetCmdTag() != PMUSRT0_GET_DATA_AND_BKG_RANGE) fT0Enabled = true; else fT0Enabled = false; // do not show root statistics block fHisto->SetStats(kFALSE); // draw histos etc fHisto->Draw("p0 9 hist"); if (fMusrT0Data.GetCmdTag() == PMUSRT0_GET_T0) { str = "please set t0 bin only."; fToDoInfo = new TLatex(); fToDoInfo->SetTextFont(51); fToDoInfo->SetTextSize(0.030); fToDoInfo->SetLineWidth(2); fToDoInfo->SetNDC(kTRUE); fToDoInfo->DrawLatex(0.1, 0.91, str.Data()); } if (fMusrT0Data.GetCmdTag() == PMUSRT0_GET_DATA_AND_BKG_RANGE) { str = "please set data and bkg range."; fToDoInfo = new TLatex(); fToDoInfo->SetTextFont(51); fToDoInfo->SetTextSize(0.030); fToDoInfo->SetLineWidth(2); fToDoInfo->SetNDC(kTRUE); fToDoInfo->DrawLatex(0.1, 0.91, str.Data()); } } //-------------------------------------------------------------------------- // Destructor //-------------------------------------------------------------------------- /** *

Destructor. */ PMusrT0::~PMusrT0() { if (fTimeoutTimer) { delete fTimeoutTimer; fTimeoutTimer = 0; } if (fHisto) { delete fHisto; fHisto = 0; } if (fData) { delete fData; fData = 0; } if (fBkg) { delete fBkg; fBkg = 0; } if (fToDoInfo) { delete fToDoInfo; fToDoInfo = 0; } if (fT0Line) { delete fT0Line; fT0Line = 0; } if (fT0DataLine) { delete fT0DataLine; fT0DataLine = 0; } if (fFirstBkgLine) { delete fFirstBkgLine; fFirstBkgLine = 0; } if (fLastBkgLine) { delete fLastBkgLine; fLastBkgLine = 0; } if (fFirstDataLine) { delete fFirstDataLine; fFirstDataLine = 0; } if (fLastDataLine) { delete fLastDataLine; fLastDataLine = 0; } if (fMainCanvas && (fStatus != 2)) { delete fMainCanvas; fMainCanvas = 0; } } //-------------------------------------------------------------------------- // Done (SIGNAL) //-------------------------------------------------------------------------- /** *

Signal emitted if the user wants to terminate the application. */ void PMusrT0::Done(Int_t status) { Emit("Done(Int_t)", status); } //-------------------------------------------------------------------------- // HandleCmdKey (SLOT) //-------------------------------------------------------------------------- /** *

Filters keyboard and mouse events, and if they are a command key (see below) carries out the * necessary actions. *

Currently implemented command keys: * - 'q' close the currently shown canvas * - 'Q' quite the application * - 'u' unzoom to the original range * - 'z' zoom to the region aroung t0 * - 's' show/hide (toggle) the t0 of the data file (if present) * - 'T' set t0 channel to the estimated t0 * - 't' set t0 channel to the current cursor position * - 'b' set first background channel * - 'B' set last background channel * - 'd' set first good bin channel * - 'D' set last good bin channel * * \param event event type * \param x keyboard event: character key; mouse event: x-position * \param y mouse event: y-position * \param selected not used */ void PMusrT0::HandleCmdKey(Int_t event, Int_t x, Int_t y, TObject *selected) { if (event != kKeyPress) { fPx = x; fPy = y; return; } // handle keys and popup menu entries if (x == 'q') { // quit fStatus = 0; // will quit locally Done(0); } else if (x == 'Q') { // terminate musrt0 fStatus = 1; // will quit globally Done(0); } else if (x == 'u') { // unzoom to the original range UnZoom(); } else if (x == 'z') { // zoom to the region around t0, and the estimated t0 ZoomT0(); } else if (x == 's') { // show the t0 of the data file (if present) fShowT0DataChannel = !fShowT0DataChannel; if (fShowT0DataChannel) ShowDataFileT0Channel(); else HideDataFileT0Channel(); } else if (x == 'T') { // set estimated t0 channel SetEstimatedT0Channel(); } else if (x == 't') { // set t0 channel SetT0Channel(); } else if (x == 'b') { // set first background channel SetBkgFirstChannel(); } else if (x == 'B') { // set last background channel SetBkgLastChannel(); } else if (x == 'd') { // set first data channel SetDataFirstChannel(); } else if (x == 'D') { // set last data channel SetDataLastChannel(); } } //-------------------------------------------------------------------------- // Quit (public) //-------------------------------------------------------------------------- /** *

Slot called when the canvas is closed via the close icon (cross top right corner). * It is emitting a global quit singal. */ void PMusrT0::Quit() { fStatus = 2; // will quit globally Done(0); } //-------------------------------------------------------------------------- // SetTimeout (public) //-------------------------------------------------------------------------- /** *

* * \param timeout after which the done signal shall be emitted. Given in seconds */ void PMusrT0::SetTimeout(Int_t timeout) { fTimeout = timeout; if (fTimeout <= 0) return; if (fTimeoutTimer) { delete fTimeoutTimer; fTimeoutTimer = 0; } fTimeoutTimer = new TTimer(); fTimeoutTimer->Connect("Timeout()", "PMusrT0", this, "Quit()"); fTimeoutTimer->Start(1000*fTimeout, kTRUE); } //-------------------------------------------------------------------------- // SetMsrHandler //-------------------------------------------------------------------------- /** *

Set the msr-file handler * * \param msrHandler msr-file handler pointer */ void PMusrT0::SetMsrHandler(PMsrHandler *msrHandler) { fMsrHandler = msrHandler; } //-------------------------------------------------------------------------- // InitT0 //-------------------------------------------------------------------------- /** *

Initialize t0 data. */ void PMusrT0::InitT0() { // t0 line Double_t t0Bin = 0; Int_t histoIdx = fMusrT0Data.GetHistoNoIdx(); Int_t addRunIdx = fMusrT0Data.GetAddRunIdx(); UInt_t factor=1; if (!fMusrT0Data.IsSingleHisto()) factor=2; switch (fMusrT0Data.GetDetectorTag() ) { case PMUSRT0_FORWARD: if (addRunIdx == 0) t0Bin = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetT0Bin(factor*histoIdx); else if (addRunIdx > 0) t0Bin = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetAddT0Bin(addRunIdx-1, factor*histoIdx); break; case PMUSRT0_BACKWARD: if (addRunIdx == 0) t0Bin = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetT0Bin(factor*histoIdx+1); else if (addRunIdx > 0) t0Bin = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetAddT0Bin(addRunIdx-1, factor*histoIdx+1); break; default: // not clear yet what to be done break; } Double_t max = fHisto->GetMaximum(); fT0Line = new TLine((Double_t)t0Bin, 0.0, (Double_t)t0Bin, max); fT0Line->SetLineStyle(1); // solid fT0Line->SetLineColor(TColor::GetColor(0,255,0)); // green fT0Line->SetLineWidth(2); fT0Line->Draw(); } //-------------------------------------------------------------------------- // InitDataAndBkg //-------------------------------------------------------------------------- /** *

Initialize data and background ranges. */ void PMusrT0::InitDataAndBkg() { // feed data range histo switch (fMusrT0Data.GetDetectorTag()) { case PMUSRT0_FORWARD: fDataRange[0] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetDataRange(0); fDataRange[1] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetDataRange(1); break; case PMUSRT0_BACKWARD: fDataRange[0] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetDataRange(2); fDataRange[1] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetDataRange(3); break; default: // not clear yet what to be done break; } Int_t noOfBins = fDataRange[1]-fDataRange[0]+1; Double_t start = fDataRange[0] - 0.5; Double_t end = fDataRange[1] + 0.5; fData = new TH1F("fData", "fData", noOfBins, start, end); fData->SetMarkerStyle(21); fData->SetMarkerSize(0.5); fData->SetMarkerColor(TColor::GetColor(0,0,255)); // blue for (Int_t i=0; iSetBinContent(i+1, fHisto->GetBinContent(fDataRange[0]+i+1)); } fData->Draw("p0 9 hist same"); // feed background histo switch (fMusrT0Data.GetDetectorTag()) { case PMUSRT0_FORWARD: fBkgRange[0] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetBkgRange(0); fBkgRange[1] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetBkgRange(1); break; case PMUSRT0_BACKWARD: fBkgRange[0] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetBkgRange(2); fBkgRange[1] = fMsrHandler->GetMsrRunList()->at(fMusrT0Data.GetRunNo()).GetBkgRange(3); break; default: // not clear yet what to be done break; } noOfBins = fBkgRange[1]-fBkgRange[0]+1; start = fBkgRange[0] - 0.5; end = fBkgRange[1] + 0.5; fBkg = new TH1F("fBkg", "fBkg", noOfBins, start, end); fBkg->SetMarkerStyle(21); fBkg->SetMarkerSize(0.5); fBkg->SetMarkerColor(TColor::GetColor(255,0,0)); // red for (Int_t i=0; iSetBinContent(i+1, fHisto->GetBinContent(fBkgRange[0]+i+1)); } fBkg->Draw("p0 9 hist same"); // add lines Double_t max = fHisto->GetMaximum(); // data lines fFirstDataLine = new TLine((Double_t)fDataRange[0], 0.0, (Double_t)fDataRange[0], max); fFirstDataLine->SetLineStyle(3); // doted fFirstDataLine->SetLineColor(TColor::GetColor(0,0,255)); // blue fFirstDataLine->SetLineWidth(2); fFirstDataLine->Draw(); fLastDataLine = new TLine((Double_t)fDataRange[1], 0.0, (Double_t)fDataRange[1], max); fLastDataLine->SetLineStyle(3); // doted fLastDataLine->SetLineColor(TColor::GetColor(0,0,255)); // blue fLastDataLine->SetLineWidth(2); fLastDataLine->Draw(); // bkg lines fFirstBkgLine = new TLine((Double_t)fBkgRange[0], 0.0, (Double_t)fBkgRange[0], max); fFirstBkgLine->SetLineStyle(6); // _..._... fFirstBkgLine->SetLineColor(TColor::GetColor(255,0,0)); // red fFirstBkgLine->SetLineWidth(2); fFirstBkgLine->Draw(); fLastBkgLine = new TLine((Double_t)fBkgRange[1], 0.0, (Double_t)fBkgRange[1], max); fLastBkgLine->SetLineStyle(6); // _..._... fLastBkgLine->SetLineColor(TColor::GetColor(255,0,0)); // red fLastBkgLine->SetLineWidth(2); fLastBkgLine->Draw(); fMainCanvas->Update(); } //-------------------------------------------------------------------------- // ShowDataFileT0Channel //-------------------------------------------------------------------------- /** *

Show the t0 channel from the data file (if present). */ void PMusrT0::ShowDataFileT0Channel() { // t0 line Int_t t0Bin = fMusrT0Data.GetT0BinData(); Double_t max = fHisto->GetMaximum(); if (!fT0DataLine) { fT0DataLine = new TLine((Double_t)t0Bin, 0.0, (Double_t)t0Bin, max); fT0DataLine->SetLineStyle(1); // solid fT0DataLine->SetLineColor(kOrange-3); fT0DataLine->SetLineWidth(2); fT0DataLine->Draw(); } fMainCanvas->Update(); } //-------------------------------------------------------------------------- // HideDataFileT0Channel //-------------------------------------------------------------------------- /** *

Hide the t0 channel from the data file (if currently displayed). */ void PMusrT0::HideDataFileT0Channel() { if (fT0DataLine) { delete fT0DataLine; fT0DataLine = 0; } fMainCanvas->Update(); } //-------------------------------------------------------------------------- // SetT0Channel //-------------------------------------------------------------------------- /** *

Set the t0 channel to the current cursor position and keep the x-position as new t0 bin. */ void PMusrT0::SetT0Channel() { if (!fT0Enabled) return; Double_t x=0, y=0; fMainCanvas->AbsPixeltoXY(fPx,fPy,x,y); // get binx to set t0 corresponding to fPx Int_t binx = fHisto->GetXaxis()->FindFixBin(x) - 1; cout << endl << ">> PMusrT0::SetT0Channel(): t0 = " << binx << endl; // set t0 bin in msr-Handler UInt_t idx; if (fMusrT0Data.IsSingleHisto()) { idx = fMusrT0Data.GetHistoNoIdx(); if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx += 1; } else { idx = 2*fMusrT0Data.GetHistoNoIdx(); if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx += 1; } if (fMusrT0Data.GetAddRunIdx() == 0) fMsrHandler->SetMsrT0Entry(fMusrT0Data.GetRunNo(), idx, binx); else if (fMusrT0Data.GetAddRunIdx() > 0) fMsrHandler->SetMsrAddT0Entry(fMusrT0Data.GetRunNo(), fMusrT0Data.GetAddRunIdx()-1, idx, binx); // shift line to the proper position fT0Line->SetX1(x); fT0Line->SetX2(x); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // SetEstimatedT0Channel //-------------------------------------------------------------------------- /** *

Set the estimated t0 channel to the current cursor position and keep the x-position as new t0 bin. */ void PMusrT0::SetEstimatedT0Channel() { if (!fT0Enabled) return; // set t0 bin in msr-Handler UInt_t idx; if (fMusrT0Data.IsSingleHisto()) { idx = fMusrT0Data.GetHistoNoIdx(); if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx += 1; } else { idx = 2*fMusrT0Data.GetHistoNoIdx(); if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx += 1; } if (fMusrT0Data.GetAddRunIdx() == 0) fMsrHandler->SetMsrT0Entry(fMusrT0Data.GetRunNo(), idx, fT0Estimated); else if (fMusrT0Data.GetAddRunIdx() > 0) fMsrHandler->SetMsrAddT0Entry(fMusrT0Data.GetRunNo(), fMusrT0Data.GetAddRunIdx()-1, idx, fT0Estimated); Double_t x = fHisto->GetXaxis()->GetBinCenter(fT0Estimated)+1.0; // +1.0 needed since the first bin == 1 not 0. cout << endl << ">> PMusrT0::SetEstimatedT0Channel(): estimated t0 = " << fT0Estimated << endl; // shift line to the proper position fT0Line->SetX1(x); fT0Line->SetX2(x); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // SetDataFirstChannel //-------------------------------------------------------------------------- /** *

Set the first good data channel to the current cursor position and keep the x-position as new first good data bin. */ void PMusrT0::SetDataFirstChannel() { if (!fDataAndBkgEnabled) return; Double_t x=0, y=0; fMainCanvas->AbsPixeltoXY(fPx,fPy,x,y); // get binx to set the data first channel corresponding to fPx fDataRange[0] = fHisto->GetXaxis()->FindFixBin(x) - 1; cout << endl << ">> PMusrT0::SetDataFirstChannel(): fDataRange[0] = " << fDataRange[0] << endl; // set the data first bin in msr-Handler UInt_t idx = 0; if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx = 2; fMsrHandler->SetMsrDataRangeEntry(fMusrT0Data.GetRunNo(), idx, fDataRange[0]); // shift line to the proper position fFirstDataLine->SetX1(x); fFirstDataLine->SetX2(x); // recreate data histo delete fData; fData = 0; // refill data histo Int_t noOfBins = fDataRange[1]-fDataRange[0]+1; Double_t start = fDataRange[0] - 0.5; Double_t end = fDataRange[1] + 0.5; fData = new TH1F("fData", "fData", noOfBins, start, end); fData->SetMarkerStyle(21); fData->SetMarkerSize(0.5); fData->SetMarkerColor(TColor::GetColor(0,0,255)); // blue for (Int_t i=0; iSetBinContent(i+1, fHisto->GetBinContent(fDataRange[0]+i+1)); } fData->Draw("p0 9 hist same"); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // SetDataLastChannel //-------------------------------------------------------------------------- /** *

Set the last good data channel to the current cursor position and keep the x-position as new last good data bin. */ void PMusrT0::SetDataLastChannel() { if (!fDataAndBkgEnabled) return; Double_t x=0, y=0; fMainCanvas->AbsPixeltoXY(fPx,fPy,x,y); // get binx to set the data last channel corresponding to fPx fDataRange[1] = fHisto->GetXaxis()->FindFixBin(x) - 1; cout << endl << ">> PMusrT0::SetDataLastChannel(): fDataRange[1] = " << fDataRange[1] << endl; // set the data first bin in msr-Handler UInt_t idx = 1; if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx = 3; fMsrHandler->SetMsrDataRangeEntry(fMusrT0Data.GetRunNo(), idx, fDataRange[1]); // shift line to the proper position fLastDataLine->SetX1(x); fLastDataLine->SetX2(x); // recreate data histo delete fData; fData = 0; // refill data histo Int_t noOfBins = fDataRange[1]-fDataRange[0]+1; Double_t start = fDataRange[0] - 0.5; Double_t end = fDataRange[1] + 0.5; fData = new TH1F("fData", "fData", noOfBins, start, end); fData->SetMarkerStyle(21); fData->SetMarkerSize(0.5); fData->SetMarkerColor(TColor::GetColor(0,0,255)); // blue for (Int_t i=0; iSetBinContent(i+1, fHisto->GetBinContent(fDataRange[0]+i+1)); } fData->Draw("p0 9 hist same"); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // SetBkgFirstChannel //-------------------------------------------------------------------------- /** *

Set the first background channel to the current cursor position and keep the x-position as new first background bin. */ void PMusrT0::SetBkgFirstChannel() { if (!fDataAndBkgEnabled) return; Double_t x=0, y=0; fMainCanvas->AbsPixeltoXY(fPx,fPy,x,y); // get binx to set the background first channel corresponding to fPx fBkgRange[0] = fHisto->GetXaxis()->FindFixBin(x) - 1; cout << endl << ">> PMusrT0::SetBkgFirstChannel(): fBkgRange[0] = " << fBkgRange[0] << endl; // set the background first bin in msr-Handler UInt_t idx = 0; if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx = 2; fMsrHandler->SetMsrBkgRangeEntry(fMusrT0Data.GetRunNo(), idx, fBkgRange[0]); // shift line to the proper position fFirstBkgLine->SetX1(x); fFirstBkgLine->SetX2(x); // recreate data histo delete fBkg; fBkg = 0; // refill data histo Int_t noOfBins = fBkgRange[1]-fBkgRange[0]+1; Double_t start = fBkgRange[0] - 0.5; Double_t end = fBkgRange[1] + 0.5; fBkg = new TH1F("fBkg", "fBkg", noOfBins, start, end); fBkg->SetMarkerStyle(21); fBkg->SetMarkerSize(0.5); fBkg->SetMarkerColor(TColor::GetColor(255,0,0)); // red for (Int_t i=0; iSetBinContent(i+1, fHisto->GetBinContent(fBkgRange[0]+i+1)); } fBkg->Draw("p0 9 hist same"); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // SetBkgLastChannel //-------------------------------------------------------------------------- /** *

Set the last background channel to the current cursor position and keep the x-position as new last background bin. */ void PMusrT0::SetBkgLastChannel() { if (!fDataAndBkgEnabled) return; Double_t x=0, y=0; fMainCanvas->AbsPixeltoXY(fPx,fPy,x,y); // get binx to set the background last channel corresponding to fPx fBkgRange[1] = fHisto->GetXaxis()->FindFixBin(x) - 1; cout << endl << ">> PMusrT0::SetBkgLastChannel(): fBkgRange[1] = " << fBkgRange[1] << endl; // set the background first bin in msr-Handler UInt_t idx = 1; if (fMusrT0Data.GetDetectorTag() == PMUSRT0_BACKWARD) idx = 3; fMsrHandler->SetMsrBkgRangeEntry(fMusrT0Data.GetRunNo(), idx, fBkgRange[1]); // shift line to the proper position fLastBkgLine->SetX1(x); fLastBkgLine->SetX2(x); // recreate data histo delete fBkg; fBkg = 0; // refill data histo Int_t noOfBins = fBkgRange[1]-fBkgRange[0]+1; Double_t start = fBkgRange[0] - 0.5; Double_t end = fBkgRange[1] + 0.5; fBkg = new TH1F("fBkg", "fBkg", noOfBins, start, end); fBkg->SetMarkerStyle(21); fBkg->SetMarkerSize(0.5); fBkg->SetMarkerColor(TColor::GetColor(255,0,0)); // red for (Int_t i=0; iSetBinContent(i+1, fHisto->GetBinContent(fBkgRange[0]+i+1)); } fBkg->Draw("p0 9 hist same"); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // UnZoom //-------------------------------------------------------------------------- /** *

Unzoom the current histogram */ void PMusrT0::UnZoom() { fHisto->GetXaxis()->UnZoom(); fHisto->GetYaxis()->UnZoom(); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // ZoomT0 //-------------------------------------------------------------------------- /** *

Zoom into the histogram region of the t0, and/or estimated t0 range. */ void PMusrT0::ZoomT0() { if (!fT0Enabled) return; const Int_t range = 75; // get current t0 position Double_t t0x = fT0Line->GetX1(); Int_t t0 = fHisto->GetXaxis()->FindBin(t0x)-1; Int_t min = t0 - range; Int_t max = t0 + range; // check if t0 is defined at all if (t0 <= 0) { min = fT0Estimated - range; max = fT0Estimated + range; } if (fT0Estimated < min) { min = fT0Estimated - range; } if (fT0Estimated > max) { max = fT0Estimated + range; } fHisto->GetXaxis()->SetRangeUser(min, max); fMainCanvas->Modified(); // needed that Update is actually working fMainCanvas->Update(); } //-------------------------------------------------------------------------- // END //--------------------------------------------------------------------------