From 33222b675cb33b9a88e5152b37d502fd8e2276e2 Mon Sep 17 00:00:00 2001 From: nemu Date: Wed, 7 Oct 2009 12:26:41 +0000 Subject: [PATCH] started with the encapsulation of the data structure which should reduce the number of crashes and help to reduce memory leaks --- src/classes/Makefile.am | 1 + src/classes/PFourier.cpp | 2 +- src/classes/PMsr2Data.cpp | 28 +-- src/classes/PMsrHandler.cpp | 33 ++- src/classes/PMusrCanvas.cpp | 98 ++++---- src/classes/PMusrT0.cpp | 10 +- src/classes/PRunAsymmetry.cpp | 228 +++++++++--------- src/classes/PRunBase.cpp | 9 +- src/classes/PRunDataHandler.cpp | 372 +++++++++++------------------ src/classes/PRunListCollection.cpp | 22 +- src/classes/PRunNonMusr.cpp | 72 +++--- src/classes/PRunSingleHisto.cpp | 184 +++++++------- src/classes/PTheory.cpp | 13 +- src/include/PMusr.h | 183 ++++++++++---- src/include/PRunBase.h | 2 +- src/include/PRunDataHandler.h | 4 +- src/musrfit.cpp | 33 +-- src/musrt0.cpp | 2 +- src/musrview.cpp | 10 +- 19 files changed, 657 insertions(+), 649 deletions(-) diff --git a/src/classes/Makefile.am b/src/classes/Makefile.am index f32f9740..79f4dac9 100644 --- a/src/classes/Makefile.am +++ b/src/classes/Makefile.am @@ -44,6 +44,7 @@ cpp_sources = \ PMsr2Data.cpp \ PMsrHandler.cpp \ PMusrCanvas.cpp \ + PMusr.cpp \ PMusrT0.cpp \ PRunAsymmetry.cpp \ PRunBase.cpp \ diff --git a/src/classes/PFourier.cpp b/src/classes/PFourier.cpp index ed08d229..0e58f04d 100644 --- a/src/classes/PFourier.cpp +++ b/src/classes/PFourier.cpp @@ -37,7 +37,7 @@ using namespace std; #include "TH1F.h" #include "TF1.h" -#include "TFile.h" +//#include "TFile.h" #include "PMusr.h" #include "PFourier.h" diff --git a/src/classes/PMsr2Data.cpp b/src/classes/PMsr2Data.cpp index c327876c..7372aa03 100644 --- a/src/classes/PMsr2Data.cpp +++ b/src/classes/PMsr2Data.cpp @@ -414,51 +414,51 @@ void PMsr2Data::WriteOutput(const string &outfile, bool db, bool withHeader) con PMsrRunList *msrRunList(fMsrHandler->GetMsrRunList()); PRawRunData *rawRunData(fDataHandler->GetRunData((*msrRunList)[0].fRunName[0])); - switch (rawRunData->fTemp.size()) { + switch (rawRunData->GetNoOfTemperatures()) { case 1: dataParamNames.push_back("dataT"); dataParamLabels.push_back("T (K)"); - dataParam.push_back(rawRunData->fTemp[0].first); - dataParamErr.push_back(rawRunData->fTemp[0].second); + dataParam.push_back(rawRunData->GetTemperature(0)); + dataParamErr.push_back(rawRunData->GetTempError(0)); break; default: ostringstream oss; - for (unsigned int i(0); ifTemp.size(); i++) { + for (unsigned int i(0); iGetNoOfTemperatures(); i++) { oss << "dataT" << i; dataParamNames.push_back(oss.str()); oss.str(""); oss << "T" << i << " (K)"; dataParamLabels.push_back(oss.str()); oss.str(""); - dataParam.push_back(rawRunData->fTemp[i].first); - dataParamErr.push_back(rawRunData->fTemp[i].second); + dataParam.push_back(rawRunData->GetTemperature(i)); + dataParamErr.push_back(rawRunData->GetTempError(i)); } break; } double value; - value = rawRunData->fField; - if (value != -9.9e99) { + value = rawRunData->GetField(); + if (value != PMUSR_UNDEFINED) { dataParamNames.push_back("dataB"); dataParamLabels.push_back("mu0 H (G)"); dataParam.push_back(value); } - value = rawRunData->fEnergy; - if (value != -999.0) { + value = rawRunData->GetEnergy(); + if (value != PMUSR_UNDEFINED) { dataParamNames.push_back("dataE"); dataParamLabels.push_back("Implantation Energy (keV)"); dataParam.push_back(value); } - value = rawRunData->fTransport; - if (value != -999.0) { + value = rawRunData->GetTransport(); + if (value != PMUSR_UNDEFINED) { dataParamNames.push_back("dataTr"); dataParamLabels.push_back("Transport (kV)"); dataParam.push_back(value); } - vector ra(rawRunData->fRingAnode); + PDoubleVector ra(rawRunData->GetRingAnode()); if (ra.size() > 1) { dataParamNames.push_back("dataRALRAR"); dataParamLabels.push_back("RAL-RAR (kV)"); @@ -473,7 +473,7 @@ void PMsr2Data::WriteOutput(const string &outfile, bool db, bool withHeader) con } // get the independent variable values from the runlist file if needed - vector indVarValues; + PDoubleVector indVarValues; if (fRunListFile) { string line; diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index 5d3e2725..4fe455fc 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -326,8 +326,8 @@ int PMsrHandler::WriteMsrLogFile(const bool messages) int plotNo = -1; string line; TString str, sstr; - TObjArray *tokens; - TObjString *ostr; + TObjArray *tokens = 0; + TObjString *ostr = 0; bool found = false; bool statisticBlockFound = false; bool partialStatisticBlockFound = true; @@ -468,6 +468,8 @@ int PMsrHandler::WriteMsrLogFile(const bool messages) } else { // not a parameter, hence just copy it fout << str.Data() << endl; } + // clean up tokens + delete tokens; } break; case MSR_TAG_THEORY: @@ -1177,8 +1179,8 @@ bool PMsrHandler::HandleFitParameterEntry(PMsrLines &lines) PMsrLines::iterator iter; - TObjArray *tokens; - TObjString *ostr; + TObjArray *tokens = 0; + TObjString *ostr = 0; TString str; // fill param structure @@ -1420,8 +1422,8 @@ bool PMsrHandler::HandleRunEntry(PMsrLines &lines) bool error = false; TString str; - TObjString *ostr; - TObjArray *tokens; + TObjArray *tokens = 0; + TObjString *ostr = 0; // init some stuff param.fXYDataIndex[0] = -1; @@ -2068,8 +2070,8 @@ bool PMsrHandler::HandleFourierEntry(PMsrLines &lines) PMsrLines::iterator iter; - TObjArray *tokens; - TObjString *ostr; + TObjArray *tokens = 0; + TObjString *ostr = 0; TString str; int ival; @@ -2247,6 +2249,13 @@ bool PMsrHandler::HandleFourierEntry(PMsrLines &lines) } } + // clean up + if (tokens) { + delete tokens; + tokens = 0; + } + + ++iter; } @@ -2291,9 +2300,9 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines) PMsrLines::iterator iter1; PMsrLines::iterator iter2; - TObjArray *tokens; - TObjArray *tokens2; - TObjString *ostr; + TObjArray *tokens = 0; + TObjArray *tokens2 = 0; + TObjString *ostr = 0; TString str; TString str2; diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index 29faf392..fc6c0136 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -1397,35 +1397,35 @@ void PMusrCanvas::HandleDataSet(unsigned int plotNo, unsigned int runNo, PRunDat name += (int)runNo; name += "_"; name += fPlotNumber; - start = data->fDataTimeStart - data->fDataTimeStep/2.0; - end = start + data->fValue.size()*data->fDataTimeStep; - size = data->fValue.size(); + start = data->GetDataTimeStart() - data->GetDataTimeStep()/2.0; + end = start + data->GetValue()->size()*data->GetDataTimeStep(); + size = data->GetValue()->size(); -//cout << endl << ">> PMusrCanvas::HandleDataSet(): data->fDataTimeStart = " << data->fDataTimeStart << ", data->fDataTimeStep = " << data->fDataTimeStep << endl; +//cout << endl << ">> PMusrCanvas::HandleDataSet(): data->GetDataTimeStart = " << data->GetDataTimeStart << ", data->GetDataTimeStep() = " << data->GetDataTimeStep() << endl; // check if 'use_fit_range' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fUseFitRanges) { start = fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0]; // needed to estimate size end = fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[1]; // needed to estimate size - size = (int) ((end - start) / data->fDataTimeStep) + 1; - start = data->fDataTimeStart + - (int)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->fDataTimeStart)/data->fDataTimeStep) * data->fDataTimeStep - - data->fDataTimeStep/2.0; // closesd start value compatible with the user given - end = start + size * data->fDataTimeStep; // closesd end value compatible with the user given + size = (int) ((end - start) / data->GetDataTimeStep()) + 1; + start = data->GetDataTimeStart() + + (int)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->GetDataTimeStart())/data->GetDataTimeStep()) * data->GetDataTimeStep() - + data->GetDataTimeStep()/2.0; // closesd start value compatible with the user given + end = start + size * data->GetDataTimeStep(); // closesd end value compatible with the user given } // check if 'sub_ranges' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() > 1) { start = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo]; // needed to estimate size end = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo]; // needed to estimate size - size = (int) ((end - start) / data->fDataTimeStep) + 1; - start = data->fDataTimeStart + - (int)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->fDataTimeStart)/data->fDataTimeStep) * data->fDataTimeStep - - data->fDataTimeStep/2.0; // closesd start value compatible with the user given - end = start + size * data->fDataTimeStep; // closesd end value compatible with the user given + size = (int) ((end - start) / data->GetDataTimeStep()) + 1; + start = data->GetDataTimeStart() + + (int)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->GetDataTimeStart())/data->GetDataTimeStep()) * data->GetDataTimeStep() - + data->GetDataTimeStep()/2.0; // closesd start value compatible with the user given + end = start + size * data->GetDataTimeStep(); // closesd end value compatible with the user given } -//cout << endl << ">> PMusrCanvas::HandleDataSet(): start = " << start << ", end = " << end << ", size = " << size << ", data->fDataTimeStep = " << data->fDataTimeStep << endl; +//cout << endl << ">> PMusrCanvas::HandleDataSet(): start = " << start << ", end = " << end << ", size = " << size << ", data->GetDataTimeStep() = " << data->GetDataTimeStep() << endl; // invoke histo dataHisto = new TH1F(name, name, size, start, end); @@ -1433,24 +1433,24 @@ void PMusrCanvas::HandleDataSet(unsigned int plotNo, unsigned int runNo, PRunDat // fill histogram // 1st calculate the bin-range according to the plot options UInt_t startBin = 0; - UInt_t endBin = data->fValue.size(); + UInt_t endBin = data->GetValue()->size(); // check if 'use_fit_range' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fUseFitRanges) { - startBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->fDataTimeStart)/data->fDataTimeStep); - endBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[1] - data->fDataTimeStart)/data->fDataTimeStep); + startBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->GetDataTimeStart())/data->GetDataTimeStep()); + endBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[1] - data->GetDataTimeStart())/data->GetDataTimeStep()); } // check if 'sub_ranges' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() > 1) { - startBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->fDataTimeStart)/data->fDataTimeStep); - endBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo] - data->fDataTimeStart)/data->fDataTimeStep); + startBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->GetDataTimeStart())/data->GetDataTimeStep()); + endBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo] - data->GetDataTimeStart())/data->GetDataTimeStep()); } //cout << endl << ">> PMusrCanvas::HandleDataSet(): data: startBin = " << startBin << ", endBin = " << endBin << endl; for (UInt_t i=startBin; iSetBinContent(i-startBin+1, data->fValue[i]); - dataHisto->SetBinError(i-startBin+1, data->fError[i]); + dataHisto->SetBinContent(i-startBin+1, data->GetValue()->at(i)); + dataHisto->SetBinError(i-startBin+1, data->GetError()->at(i)); } // set marker and line color @@ -1479,56 +1479,56 @@ void PMusrCanvas::HandleDataSet(unsigned int plotNo, unsigned int runNo, PRunDat name += (int)runNo; name += "_"; name += fPlotNumber; - start = data->fTheoryTimeStart - data->fTheoryTimeStep/2.0; - end = start + data->fTheory.size()*data->fTheoryTimeStep; - size = data->fTheory.size(); + start = data->GetTheoryTimeStart() - data->GetTheoryTimeStep()/2.0; + end = start + data->GetTheory()->size()*data->GetTheoryTimeStep(); + size = data->GetTheory()->size(); // check if 'use_fit_range' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fUseFitRanges) { start = fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0]; // needed to estimate size end = fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[1]; // needed to estimate size - size = (int) ((end - start) / data->fTheoryTimeStep) + 1; - start = data->fTheoryTimeStart + - (int)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->fTheoryTimeStart)/data->fTheoryTimeStep) * data->fTheoryTimeStep - - data->fTheoryTimeStep/2.0; // closesd start value compatible with the user given - end = start + size * data->fTheoryTimeStep; // closesd end value compatible with the user given + size = (int) ((end - start) / data->GetTheoryTimeStep()) + 1; + start = data->GetTheoryTimeStart() + + (int)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->GetTheoryTimeStart())/data->GetTheoryTimeStep()) * data->GetTheoryTimeStep() - + data->GetTheoryTimeStep()/2.0; // closesd start value compatible with the user given + end = start + size * data->GetTheoryTimeStep(); // closesd end value compatible with the user given } // check if 'sub_ranges' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() > 1) { start = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo]; // needed to estimate size end = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo]; // needed to estimate size - size = (int) ((end - start) / data->fTheoryTimeStep) + 1; - start = data->fTheoryTimeStart + - (int)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->fTheoryTimeStart)/data->fTheoryTimeStep) * data->fTheoryTimeStep - - data->fTheoryTimeStep/2.0; // closesd start value compatible with the user given - end = start + size * data->fTheoryTimeStep; // closesd end value compatible with the user given + size = (int) ((end - start) / data->GetTheoryTimeStep()) + 1; + start = data->GetTheoryTimeStart() + + (int)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] - data->GetTheoryTimeStart())/data->GetTheoryTimeStep()) * data->GetTheoryTimeStep() - + data->GetTheoryTimeStep()/2.0; // closesd start value compatible with the user given + end = start + size * data->GetTheoryTimeStep(); // closesd end value compatible with the user given } -//cout << endl << ">> PMusrCanvas::HandleDataSet(): start = " << start << ", end = " << end << ", size = " << size << ", data->fTheoryTimeStep = " << data->fTheoryTimeStep << endl; +//cout << endl << ">> PMusrCanvas::HandleDataSet(): start = " << start << ", end = " << end << ", size = " << size << ", data->GetTheoryTimeStep() = " << data->GetTheoryTimeStep() << endl; // invoke histo theoHisto = new TH1F(name, name, size, start, end); // fill histogram startBin = 0; - endBin = data->fTheory.size(); + endBin = data->GetTheory()->size(); // check if 'use_fit_range' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fUseFitRanges) { - startBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->fDataTimeStart)/data->fTheoryTimeStep); - endBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[1] - data->fDataTimeStart)/data->fTheoryTimeStep); + startBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[0] - data->GetDataTimeStart())/data->GetTheoryTimeStep()); + endBin = (UInt_t)((fMsrHandler->GetMsrRunList()->at(runNo).fFitRange[1] - data->GetDataTimeStart())/data->GetTheoryTimeStep()); } //cout << endl << ">> PMusrCanvas::HandleDataSet(): theory: startBin = " << startBin << ", endBin = " << endBin << endl; // check if 'sub_ranges' plotting is whished if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() > 1) { - startBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] -data->fDataTimeStart)/data->fTheoryTimeStep); - endBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo] -data->fDataTimeStart)/data->fTheoryTimeStep); + startBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[runNo] -data->GetDataTimeStart())/data->GetTheoryTimeStep()); + endBin = (UInt_t)((fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[runNo] -data->GetDataTimeStart())/data->GetTheoryTimeStep()); } for (UInt_t i=startBin; iSetBinContent(i-startBin+1, data->fTheory[i]); + theoHisto->SetBinContent(i-startBin+1, data->GetTheory()->at(i)); } //cout << endl << ">> PMusrCanvas::HandleDataSet(): after fill theory histo" << endl; @@ -1572,12 +1572,12 @@ void PMusrCanvas::HandleNonMusrDataSet(unsigned int plotNo, unsigned int runNo, // dataHisto ------------------------------------------------------------- // invoke graph - dataHisto = new TGraphErrors(data->fX.size()); + dataHisto = new TGraphErrors(data->GetX()->size()); // fill graph - for (unsigned int i=0; ifX.size(); i++) { - dataHisto->SetPoint(i, data->fX[i], data->fValue[i]); - dataHisto->SetPointError(i, 0.0, data->fError[i]); + for (unsigned int i=0; iGetX()->size(); i++) { + dataHisto->SetPoint(i, data->GetX()->at(i), data->GetValue()->at(i)); + dataHisto->SetPointError(i, 0.0, data->GetError()->at(i)); } // set marker and line color @@ -1603,11 +1603,11 @@ void PMusrCanvas::HandleNonMusrDataSet(unsigned int plotNo, unsigned int runNo, // theoHisto ------------------------------------------------------------- // invoke graph - theoHisto = new TGraphErrors(data->fXTheory.size()); + theoHisto = new TGraphErrors(data->GetXTheory()->size()); // fill graph - for (unsigned int i=0; ifXTheory.size(); i++) { - theoHisto->SetPoint(i, data->fXTheory[i], data->fTheory[i]); + for (unsigned int i=0; iGetXTheory()->size(); i++) { + theoHisto->SetPoint(i, data->GetXTheory()->at(i), data->GetTheory()->at(i)); theoHisto->SetPointError(i, 0.0, 0.0); } diff --git a/src/classes/PMusrT0.cpp b/src/classes/PMusrT0.cpp index 07cb186c..f698bd46 100644 --- a/src/classes/PMusrT0.cpp +++ b/src/classes/PMusrT0.cpp @@ -87,19 +87,19 @@ PMusrT0::PMusrT0() PMusrT0::PMusrT0(PRawRunData *rawRunData, int runNo, int histoNo, int detectorTag, int addRunNo) : fRunNo(runNo), fDetectorTag(detectorTag), fAddRunNo(addRunNo) { -cout << endl << "run Name = " << rawRunData->fRunName.Data() << ", runNo = " << fRunNo << ", histoNo = " << histoNo << endl; +cout << endl << "run Name = " << rawRunData->GetRunName()->Data() << ", runNo = " << fRunNo << ", histoNo = " << histoNo << endl; fStatus = 0; // default is quit locally fAddRunOffset = 0; - TString str = rawRunData->fRunName + TString(" : "); + TString str = *rawRunData->GetRunName() + TString(" : "); str += histoNo; // feed necessary objects // feed raw data histo - Int_t noOfBins = rawRunData->fDataBin[histoNo-1].size(); + Int_t noOfBins = rawRunData->GetDataBin(histoNo-1)->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); @@ -107,8 +107,8 @@ cout << endl << "run Name = " << rawRunData->fRunName.Data() << ", runNo = " << fHisto->SetMarkerSize(0.5); fHisto->SetMarkerColor(TColor::GetColor(0,0,0)); // black - for (unsigned int i=0; ifDataBin[histoNo-1].size(); i++) { - fHisto->SetBinContent(i+1, rawRunData->fDataBin[histoNo-1][i]); + for (unsigned int i=0; iGetDataBin(histoNo-1)->size(); i++) { + fHisto->SetBinContent(i+1, rawRunData->GetDataBin(histoNo-1)->at(i)); } // generate canvas etc diff --git a/src/classes/PRunAsymmetry.cpp b/src/classes/PRunAsymmetry.cpp index c61ba39d..c121a55d 100644 --- a/src/classes/PRunAsymmetry.cpp +++ b/src/classes/PRunAsymmetry.cpp @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -110,7 +110,7 @@ PRunAsymmetry::PRunAsymmetry(PMsrHandler *msrInfo, PRunDataHandler *rawData, uns else fAlphaBetaTag = 4; -//cout << endl << ">> PRunAsymmetry::PRunAsymmetry(): fAlphaBetaTag = " << fAlphaBetaTag; +//cout << endl << ">> PRunAsymmetry::PRunAsymmetry(): fAlphaBetaTag = " << fAlphaBetaTag << endl; // calculate fData if (!PrepareData()) @@ -154,8 +154,8 @@ double PRunAsymmetry::CalcChiSquare(const std::vector& par) // calculate chisq double time; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); if ((time>=fFitStartTime) && (time<=fFitStopTime)) { switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 @@ -181,8 +181,8 @@ double PRunAsymmetry::CalcChiSquare(const std::vector& par) break; } //if (i==0) cout << endl << "A(0) = " << asymFcnValue; - diff = fData.fValue[i] - asymFcnValue; - chisq += diff*diff / (fData.fError[i]*fData.fError[i]); + diff = fData.GetValue()->at(i) - asymFcnValue; + chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); } } @@ -230,8 +230,8 @@ void PRunAsymmetry::CalcTheory() double asymFcnValue = 0.0; double a, b, f; double time; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); switch (fAlphaBetaTag) { case 1: // alpha == 1, beta == 1 asymFcnValue = fTheory->Func(time, par, fFuncValues); @@ -256,7 +256,7 @@ void PRunAsymmetry::CalcTheory() asymFcnValue = 0.0; break; } - fData.fTheory.push_back(asymFcnValue); + fData.AppendTheoryValue(asymFcnValue); } // clean up @@ -276,7 +276,7 @@ void PRunAsymmetry::CalcTheory() */ bool PRunAsymmetry::PrepareData() { -//cout << endl << "in PRunAsymmetry::PrepareData(): will feed fData"; +//cout << endl << "in PRunAsymmetry::PrepareData(): will feed fData" << endl; // get forward/backward histo from PRunDataHandler object ------------------------ // get the correct run @@ -287,41 +287,41 @@ bool PRunAsymmetry::PrepareData() } // keep the time resolution in (us) - fTimeResolution = runData->fTimeResolution/1.0e3; + fTimeResolution = runData->GetTimeResolution()/1.0e3; // keep start/stop time for fit fFitStartTime = fRunInfo->fFitRange[0]; fFitStopTime = fRunInfo->fFitRange[1]; -//cout << endl << "start/stop (fit): " << fFitStartTime << ", " << fFitStopTime; +//cout << endl << "start/stop (fit): " << fFitStartTime << ", " << fFitStopTime << endl; // check if the t0's are given in the msr-file if (fRunInfo->fT0.size() == 0) { // t0's are NOT in the msr-file // check if the t0's are in the data file - if (runData->fT0s.size() != 0) { // t0's in the run data + if (runData->GetT0s().size() != 0) { // t0's in the run data // keep the proper t0's. For asymmetry runs, forward/backward are holding the histo no // fForwardHistoNo starts with 1 not with 0 etc. ;-) - fT0s.push_back(runData->fT0s[fRunInfo->fForwardHistoNo-1]); // forward t0 - fT0s.push_back(runData->fT0s[fRunInfo->fBackwardHistoNo-1]); // backward t0 + fT0s.push_back(runData->GetT0(fRunInfo->fForwardHistoNo-1)); // forward t0 + fT0s.push_back(runData->GetT0(fRunInfo->fBackwardHistoNo-1)); // backward t0 } else { // t0's are neither in the run data nor in the msr-file -> not acceptable! cout << endl << "PRunAsymmetry::PrepareData(): NO t0's found, neither in the run data nor in the msr-file!"; return false; } } else { // t0's in the msr-file // check if t0's are given in the data file - if (runData->fT0s.size() != 0) { + if (runData->GetT0s().size() != 0) { // compare t0's of the msr-file with the one in the data file - if (fabs(fRunInfo->fT0[0]-runData->fT0s[fRunInfo->fForwardHistoNo-1])>5.0) { // given in bins!! + if (fabs(fRunInfo->fT0[0]-runData->GetT0(fRunInfo->fForwardHistoNo-1))>5.0) { // given in bins!! cout << endl << "PRunAsymmetry::PrepareData(): **WARNING**: forward histo"; cout << endl << " t0 from the msr-file is " << fRunInfo->fT0[0]; - cout << endl << " t0 from the data file is " << runData->fT0s[fRunInfo->fForwardHistoNo-1]; + cout << endl << " t0 from the data file is " << runData->GetT0(fRunInfo->fForwardHistoNo-1); cout << endl << " This is quite a deviation! Is this done intentionally??"; cout << endl; } - if (fabs(fRunInfo->fT0[1]-runData->fT0s[fRunInfo->fBackwardHistoNo-1])>5.0) { // given in bins!! + if (fabs(fRunInfo->fT0[1]-runData->GetT0(fRunInfo->fBackwardHistoNo-1))>5.0) { // given in bins!! cout << endl << "PRunAsymmetry::PrepareData(): **WARNING**: backward histo"; cout << endl << " t0 from the msr-file is " << fRunInfo->fT0[1]; - cout << endl << " t0 from the data file is " << runData->fT0s[fRunInfo->fBackwardHistoNo-1]; + cout << endl << " t0 from the data file is " << runData->GetT0(fRunInfo->fBackwardHistoNo-1); cout << endl << " This is quite a deviation! Is this done intentionally??"; cout << endl; } @@ -335,21 +335,21 @@ bool PRunAsymmetry::PrepareData() histoNo[0] = fRunInfo->fForwardHistoNo-1; histoNo[1] = fRunInfo->fBackwardHistoNo-1; // first check if forward/backward given in the msr-file are valid - if ((runData->fDataBin.size() < histoNo[0]+1) || (histoNo[0] < 0) || - (runData->fDataBin.size() < histoNo[1]+1) || (histoNo[1] < 0)) { + if ((runData->GetNoOfHistos() < histoNo[0]+1) || (histoNo[0] < 0) || + (runData->GetNoOfHistos() < histoNo[1]+1) || (histoNo[1] < 0)) { cout << endl << "PRunAsymmetry::PrepareData(): **PANIC ERROR**:"; cout << endl << " forward/backward histo no found = " << histoNo[0]+1; - cout << ", " << histoNo[1]+1 << ", but there are only " << runData->fDataBin.size() << " histo sets!?!?"; + cout << ", " << histoNo[1]+1 << ", but there are only " << runData->GetNoOfHistos() << " histo sets!?!?"; cout << endl << " Will quit :-("; cout << endl; return false; } // get raw forward/backward histo data - for (unsigned int i=0; ifDataBin[histoNo[0]].size(); i++) { - fForward.push_back(runData->fDataBin[histoNo[0]][i]); - fBackward.push_back(runData->fDataBin[histoNo[1]][i]); - } + fForward.resize(runData->GetDataBin(histoNo[0])->size()); + fBackward.resize(runData->GetDataBin(histoNo[0])->size()); + fForward = *runData->GetDataBin(histoNo[0]); + fBackward = *runData->GetDataBin(histoNo[1]); // check if addrun's are present, and if yes add data // check if there are runs to be added to the current one @@ -368,11 +368,11 @@ bool PRunAsymmetry::PrepareData() // check if the t0's are given in the msr-file if (i >= fRunInfo->fT0.size()) { // t0's are NOT in the msr-file // check if the t0's are in the data file - if (addRunData->fT0s.size() != 0) { // t0's in the run data + if (addRunData->GetT0s().size() != 0) { // t0's in the run data // keep the proper t0's. For asymmetry runs, forward/backward are holding the histo no // fForwardHistoNo starts with 1 not with 0 etc. ;-) - t0Add[0] = addRunData->fT0s[fRunInfo->fForwardHistoNo-1]; // forward t0 - t0Add[1] = addRunData->fT0s[fRunInfo->fBackwardHistoNo-1]; // backward t0 + t0Add[0] = addRunData->GetT0(fRunInfo->fForwardHistoNo-1); // forward t0 + t0Add[1] = addRunData->GetT0(fRunInfo->fBackwardHistoNo-1); // backward t0 } else { // t0's are neither in the run data nor in the msr-file -> not acceptable! cout << endl << "PRunAsymmetry::PrepareData(): NO t0's found, neither in the addrun (" << fRunInfo->fRunName[i].Data() << ") data nor in the msr-file!"; return false; @@ -391,20 +391,20 @@ bool PRunAsymmetry::PrepareData() t0Add[0] = fRunInfo->fT0[0]; t0Add[1] = fRunInfo->fT0[1]; } - if (addRunData->fT0s.size() != 0) { + if (addRunData->GetT0s().size() != 0) { // compare t0's of the msr-file with the one in the data file - if (fabs(t0Add[0]-addRunData->fT0s[fRunInfo->fForwardHistoNo-1])>5.0) { // given in bins!! + if (fabs(t0Add[0]-addRunData->GetT0(fRunInfo->fForwardHistoNo-1))>5.0) { // given in bins!! cout << endl << "PRunAsymmetry::PrepareData(): **WARNING**: forward histo"; cout << endl << " t0 from the msr-file is " << fRunInfo->fT0[2*i]; - cout << endl << " t0 from the data file is " << addRunData->fT0s[fRunInfo->fForwardHistoNo-1]; + cout << endl << " t0 from the data file is " << addRunData->GetT0(fRunInfo->fForwardHistoNo-1); cout << endl << " This is quite a deviation! Is this done intentionally??"; cout << endl << " addrun: " << fRunInfo->fRunName[i].Data(); cout << endl; } - if (fabs(t0Add[1]-addRunData->fT0s[fRunInfo->fBackwardHistoNo-1])>5.0) { // given in bins!! + if (fabs(t0Add[1]-addRunData->GetT0(fRunInfo->fBackwardHistoNo-1))>5.0) { // given in bins!! cout << endl << "PRunAsymmetry::PrepareData(): **WARNING**: backward histo"; cout << endl << " t0 from the msr-file is " << fRunInfo->fT0[2*i+1]; - cout << endl << " t0 from the data file is " << addRunData->fT0s[fRunInfo->fBackwardHistoNo-1]; + cout << endl << " t0 from the data file is " << addRunData->GetT0(fRunInfo->fBackwardHistoNo-1); cout << endl << " This is quite a deviation! Is this done intentionally??"; cout << endl << " addrun: " << fRunInfo->fRunName[i].Data(); cout << endl; @@ -413,18 +413,20 @@ bool PRunAsymmetry::PrepareData() } // add forward run - for (unsigned int j=0; jfDataBin[histoNo[0]].size(); j++) { - // make sure that the index stays in the proper range - if ((j-t0Add[0]+fT0s[0] >= 0) && (j-t0Add[0]+fT0s[0] < addRunData->fDataBin[histoNo[0]].size())) { - fForward[j] += addRunData->fDataBin[histoNo[0]][j-t0Add[0]+fT0s[0]]; + UInt_t addRunSize = addRunData->GetDataBin(histoNo[0])->size(); + for (unsigned int j=0; jGetDataBin(histoNo[0])->size(); j++) { + // make sure that the index stays in the proper range + if ((j-t0Add[0]+fT0s[0] >= 0) && (j-t0Add[0]+fT0s[0] < addRunSize)) { + fForward[j] += addRunData->GetDataBin(histoNo[0])->at(j-t0Add[0]+fT0s[0]); } } // add backward run - for (unsigned int j=0; jfDataBin[histoNo[1]].size(); j++) { + addRunSize = addRunData->GetDataBin(histoNo[1])->size(); + for (unsigned int j=0; jGetDataBin(histoNo[1])->size(); j++) { // make sure that the index stays in the proper range - if ((j-t0Add[1]+fT0s[1] >= 0) && (j-t0Add[1]+fT0s[1] < addRunData->fDataBin[histoNo[1]].size())) { - fBackward[j] += addRunData->fDataBin[histoNo[1]][j-t0Add[1]+fT0s[1]]; + if ((j-t0Add[1]+fT0s[1] >= 0) && (j-t0Add[1]+fT0s[1] < addRunSize)) { + fBackward[j] += addRunData->GetDataBin(histoNo[1])->at(j-t0Add[1]+fT0s[1]); } } } @@ -619,17 +621,17 @@ bool PRunAsymmetry::PrepareFitData(PRawRunData* runData, unsigned int histoNo[2] start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (int)runData->fDataBin[histoNo[i]].size())) { + if ((start[i] < 0) || (start[i] > (int)runData->GetDataBin(histoNo[i])->size())) { cout << endl << "PRunAsymmetry::PrepareFitData(): **ERROR** start data bin doesn't make any sense!"; return false; } // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (int)runData->fDataBin[histoNo[i]].size())) { + if ((end[i] < 0) || (end[i] > (int)runData->GetDataBin(histoNo[i])->size())) { cout << endl << "PRunAsymmetry::PrepareFitData(): **ERROR** end data bin doesn't make any sense!"; return false; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (int)runData->fDataBin[histoNo[i]].size())) { + if ((t0[i] < 0) || (t0[i] > (int)runData->GetDataBin(histoNo[i])->size())) { cout << endl << "PRunAsymmetry::PrepareFitData(): **ERROR** t0 data bin doesn't make any sense!"; return false; } @@ -643,18 +645,18 @@ bool PRunAsymmetry::PrepareFitData(PRawRunData* runData, unsigned int histoNo[2] // forward for (int i=start[0]; ifPacking == 1) { - forwardPacked.fValue.push_back(fForward[i]); - forwardPacked.fError.push_back(fForwardErr[i]); + forwardPacked.AppendValue(fForward[i]); + forwardPacked.AppendErrorValue(fForwardErr[i]); } else { // packed data, i.e. fRunInfo->fPacking > 1 if (((i-start[0]) % fRunInfo->fPacking == 0) && (i != start[0])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin value /= fRunInfo->fPacking; - forwardPacked.fValue.push_back(value); + forwardPacked.AppendValue(value); if (value == 0.0) - forwardPacked.fError.push_back(1.0); + forwardPacked.AppendErrorValue(1.0); else - forwardPacked.fError.push_back(TMath::Sqrt(error)/fRunInfo->fPacking); + forwardPacked.AppendErrorValue(TMath::Sqrt(error)/fRunInfo->fPacking); value = 0.0; error = 0.0; } @@ -665,18 +667,18 @@ bool PRunAsymmetry::PrepareFitData(PRawRunData* runData, unsigned int histoNo[2] // backward for (int i=start[1]; ifPacking == 1) { - backwardPacked.fValue.push_back(fBackward[i]); - backwardPacked.fError.push_back(fBackwardErr[i]); + backwardPacked.AppendValue(fBackward[i]); + backwardPacked.AppendErrorValue(fBackwardErr[i]); } else { // packed data, i.e. fRunInfo->fPacking > 1 if (((i-start[1]) % fRunInfo->fPacking == 0) && (i != start[1])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin value /= fRunInfo->fPacking; - backwardPacked.fValue.push_back(value); + backwardPacked.AppendValue(value); if (value == 0.0) - backwardPacked.fError.push_back(1.0); + backwardPacked.AppendErrorValue(1.0); else - backwardPacked.fError.push_back(TMath::Sqrt(error)/fRunInfo->fPacking); + backwardPacked.AppendErrorValue(TMath::Sqrt(error)/fRunInfo->fPacking); value = 0.0; error = 0.0; } @@ -686,10 +688,10 @@ bool PRunAsymmetry::PrepareFitData(PRawRunData* runData, unsigned int histoNo[2] } // check if packed forward and backward hist have the same size, otherwise take the minimum size - unsigned int noOfBins = forwardPacked.fValue.size(); - if (forwardPacked.fValue.size() != backwardPacked.fValue.size()) { - if (forwardPacked.fValue.size() > backwardPacked.fValue.size()) - noOfBins = backwardPacked.fValue.size(); + unsigned int noOfBins = forwardPacked.GetValue()->size(); + if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { + if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) + noOfBins = backwardPacked.GetValue()->size(); } // form asymmetry including error propagation @@ -697,42 +699,38 @@ bool PRunAsymmetry::PrepareFitData(PRawRunData* runData, unsigned int histoNo[2] double f, b, ef, eb; // fill data time start, and step // data start at data_start-t0 shifted by (pack-1)/2 - fData.fDataTimeStart = fTimeResolution*((double)start[0]-t0[0]+(double)(fRunInfo->fPacking-1)/2.0); - fData.fDataTimeStep = fTimeResolution*(double)fRunInfo->fPacking; + fData.SetDataTimeStart(fTimeResolution*((double)start[0]-t0[0]+(double)(fRunInfo->fPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*(double)fRunInfo->fPacking); for (unsigned int i=0; iat(i); + b = backwardPacked.GetValue()->at(i); + ef = forwardPacked.GetError()->at(i); + eb = backwardPacked.GetError()->at(i); // check that there are indeed bins if (f+b != 0.0) asym = (f-b) / (f+b); else asym = 0.0; - fData.fValue.push_back(asym); + fData.AppendValue(asym); // calculate the error if (f+b != 0.0) error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); else error = 1.0; - fData.fError.push_back(error); + fData.AppendErrorValue(error); } // count the number of bins to be fitted double time; fNoOfFitBins=0; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i * fData.GetDataTimeStep(); if ((time >= fFitStartTime) && (time <= fFitStopTime)) fNoOfFitBins++; } // clean up - forwardPacked.fValue.clear(); - forwardPacked.fError.clear(); - backwardPacked.fValue.clear(); - backwardPacked.fError.clear(); fForward.clear(); fForwardErr.clear(); fBackward.clear(); @@ -782,8 +780,8 @@ cout << endl; */ // make sure that there are equal number of rebinned bins in forward and backward - unsigned int noOfBins0 = (runData->fDataBin[histoNo[0]].size()-start[0])/packing; - unsigned int noOfBins1 = (runData->fDataBin[histoNo[1]].size()-start[1])/packing; + unsigned int noOfBins0 = (runData->GetDataBin(histoNo[0])->size()-start[0])/packing; + unsigned int noOfBins1 = (runData->GetDataBin(histoNo[1])->size()-start[1])/packing; if (noOfBins0 > noOfBins1) noOfBins0 = noOfBins1; end[0] = start[0] + noOfBins0 * packing; @@ -798,17 +796,17 @@ cout << endl; start[i] = keep; } // 2nd check if start is within proper bounds - if ((start[i] < 0) || (start[i] > (int)runData->fDataBin[histoNo[i]].size())) { + if ((start[i] < 0) || (start[i] > (int)runData->GetDataBin(histoNo[i])->size())) { cout << endl << "PRunAsymmetry::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; return false; } // 3rd check if end is within proper bounds - if ((end[i] < 0) || (end[i] > (int)runData->fDataBin[histoNo[i]].size())) { + if ((end[i] < 0) || (end[i] > (int)runData->GetDataBin(histoNo[i])->size())) { cout << endl << "PRunAsymmetry::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; return false; } // 4th check if t0 is within proper bounds - if ((t0[i] < 0) || (t0[i] > (int)runData->fDataBin[histoNo[i]].size())) { + if ((t0[i] < 0) || (t0[i] > (int)runData->GetDataBin(histoNo[i])->size())) { cout << endl << "PRunAsymmetry::PrepareViewData(): **ERROR** t0 data bin doesn't make any sense!"; return false; } @@ -822,18 +820,18 @@ cout << endl; // forward for (int i=start[0]; i 1 if (((i-start[0]) % packing == 0) && (i != start[0])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin value /= packing; - forwardPacked.fValue.push_back(value); + forwardPacked.AppendValue(value); if (value == 0.0) - forwardPacked.fError.push_back(1.0); + forwardPacked.AppendErrorValue(1.0); else - forwardPacked.fError.push_back(TMath::Sqrt(error)/packing); + forwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); value = 0.0; error = 0.0; } @@ -844,18 +842,18 @@ cout << endl; // backward for (int i=start[1]; i 1 if (((i-start[1]) % packing == 0) && (i != start[1])) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per bin value /= packing; - backwardPacked.fValue.push_back(value); + backwardPacked.AppendValue(value); if (value == 0.0) - backwardPacked.fError.push_back(1.0); + backwardPacked.AppendErrorValue(1.0); else - backwardPacked.fError.push_back(TMath::Sqrt(error)/packing); + backwardPacked.AppendErrorValue(TMath::Sqrt(error)/packing); value = 0.0; error = 0.0; } @@ -865,10 +863,10 @@ cout << endl; } // check if packed forward and backward hist have the same size, otherwise take the minimum size - unsigned int noOfBins = forwardPacked.fValue.size(); - if (forwardPacked.fValue.size() != backwardPacked.fValue.size()) { - if (forwardPacked.fValue.size() > backwardPacked.fValue.size()) - noOfBins = backwardPacked.fValue.size(); + unsigned int noOfBins = forwardPacked.GetValue()->size(); + if (forwardPacked.GetValue()->size() != backwardPacked.GetValue()->size()) { + if (forwardPacked.GetValue()->size() > backwardPacked.GetValue()->size()) + noOfBins = backwardPacked.GetValue()->size(); } // form asymmetry including error propagation @@ -876,11 +874,11 @@ cout << endl; double f, b, ef, eb, alpha = 1.0, beta = 1.0; // fill data time start, and step // data start at data_start-t0 - fData.fDataTimeStart = fTimeResolution*((double)start[0]-t0[0]+(double)(packing-1)/2.0); - fData.fDataTimeStep = fTimeResolution*(double)packing; + fData.SetDataTimeStart(fTimeResolution*((double)start[0]-t0[0]+(double)(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*(double)packing); /* -cout << endl << ">> start time = " << fData.fDataTimeStart << ", step = " << fData.fDataTimeStep; +cout << endl << ">> start time = " << fData.GetDataTimeStart() << ", step = " << fData.GetDataTimeStep(); cout << endl << "--------------------------------" << endl; */ @@ -907,40 +905,36 @@ cout << endl << "--------------------------------" << endl; } //cout << endl << ">> alpha = " << alpha << ", beta = " << beta; - for (unsigned int i=0; isize(); i++) { // to make the formulae more readable - f = forwardPacked.fValue[i]; - b = backwardPacked.fValue[i]; - ef = forwardPacked.fError[i]; - eb = backwardPacked.fError[i]; + f = forwardPacked.GetValue()->at(i); + b = backwardPacked.GetValue()->at(i); + ef = forwardPacked.GetError()->at(i); + eb = backwardPacked.GetError()->at(i); // check that there are indeed bins if (f+b != 0.0) asym = (alpha*f-b) / (alpha*beta*f+b); else asym = 0.0; - fData.fValue.push_back(asym); + fData.AppendValue(asym); // calculate the error if (f+b != 0.0) error = 2.0/((f+b)*(f+b))*TMath::Sqrt(b*b*ef*ef+eb*eb*f*f); else error = 1.0; - fData.fError.push_back(error); + fData.AppendErrorValue(error); } // count the number of bins to be fitted double time; fNoOfFitBins=0; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i * fData.GetDataTimeStep(); if ((time >= fFitStartTime) && (time <= fFitStopTime)) fNoOfFitBins++; } // clean up - forwardPacked.fValue.clear(); - forwardPacked.fError.clear(); - backwardPacked.fValue.clear(); - backwardPacked.fError.clear(); fForward.clear(); fForwardErr.clear(); fBackward.clear(); @@ -953,22 +947,22 @@ cout << endl << "--------------------------------" << endl; } // calculate theory - unsigned int size = runData->fDataBin[histoNo[0]].size(); + unsigned int size = runData->GetDataBin(histoNo[0])->size(); double factor = 1.0; - if (fData.fValue.size() * 10 > runData->fDataBin[histoNo[0]].size()) { - size = fData.fValue.size() * 10; - factor = (double)runData->fDataBin[histoNo[0]].size() / (double)size; + if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo[0])->size()) { + size = fData.GetValue()->size() * 10; + factor = (double)runData->GetDataBin(histoNo[0])->size() / (double)size; } -//cout << endl << ">> runData->fDataBin[histoNo[0]].size() = " << runData->fDataBin[histoNo[0]].size() << ", fData.fValue.size() * 10 = " << fData.fValue.size() * 10 << ", size = " << size << ", factor = " << factor << endl; - fData.fTheoryTimeStart = fData.fDataTimeStart; - fData.fTheoryTimeStep = fTimeResolution*factor; +//cout << endl << ">> runData->fDataBin[histoNo[0]].size() = " << runData->fDataBin[histoNo[0]].size() << ", fData.GetValue()->size() * 10 = " << fData.GetValue()->size() * 10 << ", size = " << size << ", factor = " << factor << endl; + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(fTimeResolution*factor); for (unsigned int i=0; iFunc(time, par, fFuncValues); if (fabs(value) > 10.0) { // dirty hack needs to be fixed!! value = 0.0; } - fData.fTheory.push_back(value); + fData.AppendTheoryValue(value); } // clean up diff --git a/src/classes/PRunBase.cpp b/src/classes/PRunBase.cpp index 97a5d98f..0fd9a3e3 100644 --- a/src/classes/PRunBase.cpp +++ b/src/classes/PRunBase.cpp @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -36,7 +36,7 @@ #include #include #include -#include +//#include #include #include "TLemRunHeader.h" @@ -126,10 +126,6 @@ PRunBase::~PRunBase() { fParamNo.clear(); - fData.fValue.clear(); - fData.fError.clear(); - fData.fTheory.clear(); - fT0s.clear(); fFuncValues.clear(); @@ -144,7 +140,6 @@ PRunBase::~PRunBase() */ void PRunBase::CleanUp() { -//cout << endl << "PRunBase::CleanUp() ..." << endl; if (fTheory) { delete fTheory; fTheory = 0; diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index fdc3e079..166a962c 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -92,11 +92,6 @@ PRunDataHandler::PRunDataHandler(PMsrHandler *msrInfo, const PStringVector dataP */ PRunDataHandler::~PRunDataHandler() { - for (UInt_t i=0; iCompareTo(runName)) // run found break; } @@ -193,7 +188,7 @@ Bool_t PRunDataHandler::ReadFile() Bool_t PRunDataHandler::FileAlreadyRead(TString runName) { for (UInt_t i=0; iCompareTo(runName)) { // run alread read return true; } } @@ -393,27 +388,26 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) // get run title TObjString ostr = runHeader->GetRunTitle(); - runData.fRunTitle = ostr.GetString(); + runData.SetRunTitle(ostr.GetString()); // get temperature - runData.fTemp.resize(1); - runData.fTemp[0].first = runHeader->GetSampleTemperature(); - runData.fTemp[0].second = runHeader->GetSampleTemperatureError(); + runData.ClearTemperature(); + runData.SetTemperature(0, runHeader->GetSampleTemperature(), runHeader->GetSampleTemperatureError()); // get field - runData.fField = runHeader->GetSampleBField(); + runData.SetField(runHeader->GetSampleBField()); // get implantation energy - runData.fEnergy = runHeader->GetImpEnergy(); + runData.SetEnergy(runHeader->GetImpEnergy()); // get moderator HV - runData.fTransport = runHeader->GetModeratorHV(); + runData.SetTransport(runHeader->GetModeratorHV()); // get setup - runData.fSetup = runHeader->GetLemSetup().GetString(); + runData.SetSetup(runHeader->GetLemSetup().GetString()); // get time resolution - runData.fTimeResolution = runHeader->GetTimeResolution(); + runData.SetTimeResolution(runHeader->GetTimeResolution()); // get number of histogramms Int_t noOfHistos = runHeader->GetNHist(); @@ -424,7 +418,7 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) if (t0[0] != -1) { // ugly, but at the moment there is no other way // copy t0's so they are not lost for (Int_t i=0; i(summIter.Next())); TObjArray *oa(0); TObjString *objTok(0); - while(os != 0){ + while (os != 0) { s = os->GetString(); // will put four parallel if's since it may be that more than one RA-values are on one line - if(s.Contains("RA-L")){ - if(runData.fRingAnode.empty() || runData.fRingAnode.size() == 2) - runData.fRingAnode.resize(2); + if (s.Contains("RA-L")) { oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); - while (objTok != 0){ - if(!objTok->GetString().CompareTo("RA-L")){ + while (objTok != 0) { + if (!objTok->GetString().CompareTo("RA-L")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if(objTok != 0 && !objTok->GetString().CompareTo("=")){ + if (objTok != 0 && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value - runData.fRingAnode[0] = objTok->GetString().Atof(); // fill RA-R value into the runData structure + runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure break; } } @@ -464,18 +456,16 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) } } - if(s.Contains("RA-R")){ - if(runData.fRingAnode.empty() || runData.fRingAnode.size() == 2) - runData.fRingAnode.resize(2); + if (s.Contains("RA-R")) { oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); while (objTok != 0){ - if(!objTok->GetString().CompareTo("RA-R")){ + if (!objTok->GetString().CompareTo("RA-R")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if(objTok != 0 && !objTok->GetString().CompareTo("=")){ + if (objTok != 0 && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value - runData.fRingAnode[1] = objTok->GetString().Atof(); // fill RA-R value into the runData structure + runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure break; } } @@ -483,18 +473,16 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) } } - if(s.Contains("RA-T")){ - if(runData.fRingAnode.empty() || runData.fRingAnode.size() == 2) - runData.fRingAnode.resize(4); + if (s.Contains("RA-T")) { oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); while (objTok != 0){ - if(!objTok->GetString().CompareTo("RA-T")){ + if (!objTok->GetString().CompareTo("RA-T")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if(objTok != 0 && !objTok->GetString().CompareTo("=")){ + if (objTok != 0 && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value - runData.fRingAnode[2] = objTok->GetString().Atof(); // fill RA-T value into the runData structure + runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure break; } } @@ -502,18 +490,16 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) } } - if(s.Contains("RA-B")){ - if(runData.fRingAnode.empty() || runData.fRingAnode.size() == 2) - runData.fRingAnode.resize(4); + if (s.Contains("RA-B")) { oa = s.Tokenize(" "); TObjArrayIter lineIter(oa); objTok = dynamic_cast(lineIter.Next()); while (objTok != 0){ - if(!objTok->GetString().CompareTo("RA-B")){ + if (!objTok->GetString().CompareTo("RA-B")) { objTok = dynamic_cast(lineIter.Next()); // "=" - if(objTok != 0 && !objTok->GetString().CompareTo("=")){ + if (objTok != 0 && !objTok->GetString().CompareTo("=")) { objTok = dynamic_cast(lineIter.Next()); // HV value - runData.fRingAnode[3] = objTok->GetString().Atof(); // fill RA-B value into the runData structure + runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure break; } } @@ -547,7 +533,7 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) for (Int_t j=1; jGetNbinsX(); j++) histoData.push_back(histo->GetBinContent(j)); // store them in runData vector - runData.fDataBin.push_back(histoData); + runData.AppendDataBin(histoData); // clear histoData for the next histo histoData.clear(); } @@ -563,7 +549,7 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) for (Int_t j=1; jGetNbinsX(); j++) histoData.push_back(histo->GetBinContent(j)); // store them in runData vector - runData.fDataBin.push_back(histoData); + runData.AppendDataBin(histoData); // clear histoData for the next histo histoData.clear(); } @@ -572,18 +558,11 @@ Bool_t PRunDataHandler::ReadRootFile(Bool_t notPostPileup) f.Close(); // keep run name - runData.fRunName = fRunName; + runData.SetRunName(fRunName); // add run to the run list fData.push_back(runData); - // clean up - for (UInt_t i=0; i 0) line.Resize(idx); dval = ToDouble(line, ok); - if (ok){ - runData.fTemp.resize(1); - runData.fTemp[0].first = dval; - runData.fTemp[0].second = 0.0; + if (ok) { + runData.SetTemperature(0, dval, 0.0); } idx = linecp.Index("+/-"); // get the error linecp.Replace(0, idx+3, 0, 0); StripWhitespace(linecp); dval = ToDouble(linecp, ok); - if (ok && !runData.fTemp.empty()){ - runData.fTemp[0].second = dval; + if (ok) { + runData.SetTempError(0, dval); } } else if (line.Contains("Temp(meas2):")) { linecp = line; @@ -718,17 +684,15 @@ Bool_t PRunDataHandler::ReadWkmFile() if (idx > 0) line.Resize(idx); dval = ToDouble(line, ok); - if (ok){ - runData.fTemp.resize(2); - runData.fTemp[1].first = dval; - runData.fTemp[1].second = 0.0; + if (ok) { + runData.SetTemperature(1, dval, 0.0); } idx = linecp.Index("+/-"); // get the error linecp.Replace(0, idx+3, 0, 0); StripWhitespace(linecp); dval = ToDouble(linecp, ok); - if (ok && runData.fTemp.size() > 1){ - runData.fTemp[1].second = dval; + if (ok) { + runData.SetTempError(1, dval); } } else if (line.Contains("Groups")) { idx = line.Index(":"); @@ -750,7 +714,7 @@ Bool_t PRunDataHandler::ReadWkmFile() StripWhitespace(line); dval = ToDouble(line, ok); if (ok) - runData.fTimeResolution = dval * 1000.0; + runData.SetTimeResolution(dval * 1000.0); } } @@ -758,11 +722,11 @@ Bool_t PRunDataHandler::ReadWkmFile() f.getline(instr, sizeof(instr)); } while (headerInfo && !f.eof()); - if ((groups == 0) || (channels == 0) || runData.fTimeResolution == 0.0) { + if ((groups == 0) || (channels == 0) || runData.GetTimeResolution() == 0.0) { cerr << endl << "PRunDataHandler::ReadWkmFile(): **ERROR** essential header informations are missing!"; cerr << endl << " >> groups = " << groups; cerr << endl << " >> channels = " << channels; - cerr << endl << " >> time resolution = " << runData.fTimeResolution; + cerr << endl << " >> time resolution = " << runData.GetTimeResolution(); cerr << endl; f.close(); return false; @@ -777,7 +741,7 @@ Bool_t PRunDataHandler::ReadWkmFile() do { // check if empty line, i.e. new group if (IsWhitespace(instr)) { - runData.fDataBin.push_back(histoData); + runData.AppendDataBin(histoData); histoData.clear(); group_counter++; } else { @@ -792,10 +756,6 @@ Bool_t PRunDataHandler::ReadWkmFile() if (!tokens) { // no tokens found cerr << endl << "PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; - // clean up - for (UInt_t i=0; iGetEntries(); i++) { @@ -807,9 +767,6 @@ Bool_t PRunDataHandler::ReadWkmFile() } else { cerr << endl << "PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; // clean up - for (UInt_t i=0; iGetEntries(); i++) { @@ -847,9 +800,6 @@ Bool_t PRunDataHandler::ReadWkmFile() } else { cerr << endl << "PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; // clean up - for (UInt_t i=0; i 0) { - runData.fDataBin.push_back(histoData); + runData.AppendDataBin(histoData); histoData.clear(); } @@ -871,40 +821,27 @@ Bool_t PRunDataHandler::ReadWkmFile() f.close(); // check if all groups are found - if ((Int_t) runData.fDataBin.size() != groups) { + if ((Int_t) runData.GetNoOfHistos() != groups) { cerr << endl << "PRunDataHandler::ReadWkmFile(): **ERROR**"; - cerr << endl << " expected " << groups << " histos, but found " << runData.fDataBin.size(); - // clean up - for (UInt_t i=0; isize() != channels) { cerr << endl << "PRunDataHandler::ReadWkmFile(): **ERROR**"; - cerr << endl << " expected " << channels << " bins in histo " << i << ", but found " << runData.fDataBin[i].size(); - // clean up - for (UInt_t j=0; jsize(); return false; } } // keep run name - runData.fRunName = fRunName; + runData.SetRunName(fRunName); // add run to the run list fData.push_back(runData); - // clean up - for (UInt_t i=0; i 1 && tempDevVec.size() > 1 && tempVec[0] && tempVec[1]) { - runData.fTemp.resize(2); + if ((tempVec.size() > 1) && (tempDevVec.size() > 1) && tempVec[0] && tempVec[1]) { // take only the first two values for now... //maybe that's not enough - e.g. in older GPD data I saw the "correct values in the second and third entry..." - for (UInt_t i(0); i<2; i++){ - runData.fTemp[i].first = tempVec[i]; - runData.fTemp[i].second = tempDevVec[i]; + for (UInt_t i(0); i<2; i++) { + runData.SetTemperature(i, tempVec[i], tempDevVec[i]); } tempVec.clear(); tempDevVec.clear(); } else { status = sscanf(psiBin.get_temp().c_str(), "%lfK", &dval); if (status == 1) - runData.fTemp.resize(1); - runData.fTemp[0].first = dval; - runData.fTemp[0].second = 0.0; + runData.SetTemperature(0, dval, 0.0); } // get time resolution (ns) - runData.fTimeResolution = psiBin.get_binWidth_ns(); + runData.SetTimeResolution(psiBin.get_binWidth_ns()); // get t0's ivec = psiBin.get_t0_vector(); if (ivec.empty()) { @@ -1007,7 +939,7 @@ Bool_t PRunDataHandler::ReadPsiBinFile() return false; } for (UInt_t i=0; i ns + runData.SetTimeResolution((Double_t)fsTimeResolution / 1.0e6); // fs -> ns // read histograms pair valPair; @@ -1178,7 +1101,7 @@ Bool_t PRunDataHandler::ReadMudFile() cerr << endl << "**WARNING** Couldn't get t0 of histo " << i << " of run " << fRunName.Data(); cerr << endl; } - runData.fT0s.push_back((Int_t)val); + runData.AppendT0((Int_t)val); // get bkg bins success = MUD_getHistBkgd1( fh, i, &val ); @@ -1199,9 +1122,7 @@ Bool_t PRunDataHandler::ReadMudFile() valPair.second = (Int_t)val; if ((valPair.first != -1) && (valPair.second != -1)) { // bkg bin1 && bkg bin2 found - runData.fBkgBin.push_back(valPair); - } else { - runData.fBkgBin.clear(); + runData.AppendBkgBin(valPair); } // get good data bins @@ -1223,9 +1144,7 @@ Bool_t PRunDataHandler::ReadMudFile() valPair.second = (Int_t)val; if ((valPair.first != -1) && (valPair.second != -1)) { // good bin1 && good bin2 found - runData.fGoodDataBin.push_back(valPair); - } else { - runData.fGoodDataBin.clear(); + runData.AppendGoodDataBin(valPair); } // get number of bins @@ -1261,7 +1180,7 @@ Bool_t PRunDataHandler::ReadMudFile() for (UInt_t j=0; jGetEntries(); i++) { ostr = dynamic_cast(tokens->At(i)); - runData.fDataNonMusr.fDataTags.push_back(ostr->GetString()); + runData.fDataNonMusr.AppendDataTag(ostr->GetString()); } // clean up tokens @@ -1725,7 +1633,7 @@ Bool_t PRunDataHandler::ReadDBFile() switch (dbTag) { case 0: // TITLE - runData.fRunTitle = workStr; + runData.SetRunTitle(workStr); break; case 1: // ABSTRACT // nothing to be done for now @@ -1734,7 +1642,7 @@ Bool_t PRunDataHandler::ReadDBFile() // nothing to be done for now break; case 3: // LABEL - runData.fDataNonMusr.fLabels.push_back(workStr); + runData.fDataNonMusr.AppendLabel(workStr); break; case 4: // DATA // filter out potential start data tag @@ -1763,9 +1671,9 @@ Bool_t PRunDataHandler::ReadDBFile() // prepare data vector for use PDoubleVector dummy; - for (UInt_t i=0; isize(); i++) { + runData.fDataNonMusr.AppendData(dummy); + runData.fDataNonMusr.AppendErrData(dummy); } firstData = false; @@ -1776,7 +1684,7 @@ Bool_t PRunDataHandler::ReadDBFile() const Char_t *str = workStr.Data(); if (isdigit(str[0])) { // run line TString run("run"); - idx = GetDataTagIndex(run, runData.fDataNonMusr.fDataTags); + idx = GetDataTagIndex(run, runData.fDataNonMusr.GetDataTags()); if (idx == -1) { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; cerr << endl << ">> " << workStr.Data(); @@ -1796,8 +1704,8 @@ Bool_t PRunDataHandler::ReadDBFile() return false; } val = tstr.Atof(); - runData.fDataNonMusr.fData[idx].push_back(val); - runData.fDataNonMusr.fErrData[idx].push_back(1.0); + runData.fDataNonMusr.AppendSubData(idx, val); + runData.fDataNonMusr.AppendSubErrData(idx, 1.0); } else { // tag = data line // remove all possible spaces workStr.ReplaceAll(" ", ""); @@ -1812,7 +1720,7 @@ Bool_t PRunDataHandler::ReadDBFile() } ostr = dynamic_cast(tokens->At(0)); tstr = ostr->GetString(); - idx = GetDataTagIndex(tstr, runData.fDataNonMusr.fDataTags); + idx = GetDataTagIndex(tstr, runData.fDataNonMusr.GetDataTags()); if (idx == -1) { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; cerr << endl << ">> " << workStr.Data(); @@ -1834,8 +1742,8 @@ Bool_t PRunDataHandler::ReadDBFile() return false; } val = tstr.Atof(); - runData.fDataNonMusr.fData[idx].push_back(val); - runData.fDataNonMusr.fErrData[idx].push_back(1.0); + runData.fDataNonMusr.AppendSubData(idx, val); + runData.fDataNonMusr.AppendSubErrData(idx, 1.0); break; case 4: // tag = val,err,, case 5: // tag = val,err1,err2, @@ -1851,7 +1759,7 @@ Bool_t PRunDataHandler::ReadDBFile() return false; } val = tstr.Atof(); - runData.fDataNonMusr.fData[idx].push_back(val); + runData.fDataNonMusr.AppendSubData(idx, val); // handle err1 (err2 will be ignored for the time being) ostr = dynamic_cast(tokens->At(2)); tstr = ostr->GetString(); @@ -1864,7 +1772,7 @@ Bool_t PRunDataHandler::ReadDBFile() return false; } val = tstr.Atof(); - runData.fDataNonMusr.fErrData[idx].push_back(val); + runData.fDataNonMusr.AppendSubErrData(idx, val); break; default: cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; @@ -1879,11 +1787,11 @@ Bool_t PRunDataHandler::ReadDBFile() } else { // handle row formated data // split string in tokens tokens = workStr.Tokenize(","); // line has structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle - if (tokens->GetEntries() != (Int_t)(3*runData.fDataNonMusr.fDataTags.size()+1)) { + if (tokens->GetEntries() != (Int_t)(3*runData.fDataNonMusr.GetDataTags()->size()+1)) { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; cerr << endl << ">> " << workStr.Data(); cerr << endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; - cerr << endl << ">> found = " << tokens->GetEntries() << " tokens, however expected " << 3*runData.fDataNonMusr.fDataTags.size()+1; + cerr << endl << ">> found = " << tokens->GetEntries() << " tokens, however expected " << 3*runData.fDataNonMusr.GetDataTags()->size()+1; cerr << endl << ">> Perhaps there are commas without space inbetween, like 12.3,, 3.2,..."; delete tokens; return false; @@ -1902,15 +1810,15 @@ Bool_t PRunDataHandler::ReadDBFile() delete tokens; return false; } - runData.fDataNonMusr.fData[j].push_back(tstr.Atof()); + runData.fDataNonMusr.AppendSubData(j, tstr.Atof()); // handle 1st error if present (2nd will be ignored for now) ostr = dynamic_cast(tokens->At(i+1)); tstr = ostr->GetString(); if (tstr.IsWhitespace()) { - runData.fDataNonMusr.fErrData[j].push_back(1.0); + runData.fDataNonMusr.AppendSubErrData(j, 1.0); } else if (tstr.IsFloat()) { - runData.fDataNonMusr.fErrData[j].push_back(tstr.Atof()); + runData.fDataNonMusr.AppendSubErrData(j, tstr.Atof()); } else { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; cerr << endl << ">> " << workStr.Data(); @@ -1931,10 +1839,10 @@ Bool_t PRunDataHandler::ReadDBFile() f.close(); // check that the number of labels == the number of data tags - if (runData.fDataNonMusr.fLabels.size() != runData.fDataNonMusr.fDataTags.size()) { + if (runData.fDataNonMusr.GetLabels()->size() != runData.fDataNonMusr.GetDataTags()->size()) { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR**"; - cerr << endl << ">> number of LABELS found = " << runData.fDataNonMusr.fLabels.size(); - cerr << endl << ">> number of Data tags found = " << runData.fDataNonMusr.fDataTags.size(); + cerr << endl << ">> number of LABELS found = " << runData.fDataNonMusr.GetLabels()->size(); + cerr << endl << ">> number of Data tags found = " << runData.fDataNonMusr.GetDataTags()->size(); cerr << endl << ">> They have to be equal!!"; if (tokens) { delete tokens; @@ -1944,19 +1852,19 @@ Bool_t PRunDataHandler::ReadDBFile() } // check if all vectors have the same size - for (UInt_t i=1; isize(); i++) { + if (runData.fDataNonMusr.GetData()->at(i).size() != runData.fDataNonMusr.GetData()->at(i-1).size()) { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo; - cerr << endl << ">> label: " << runData.fDataNonMusr.fDataTags[i-1].Data() << ", number data elements = " << runData.fDataNonMusr.fData[i-1].size(); - cerr << endl << ">> label: " << runData.fDataNonMusr.fDataTags[i].Data() << ", number data elements = " << runData.fDataNonMusr.fData[i].size(); + cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i-1).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i-1).size(); + cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i).size(); cerr << endl << ">> They have to be equal!!"; success = false; break; } - if (runData.fDataNonMusr.fErrData[i].size() != runData.fDataNonMusr.fErrData[i-1].size()) { + if (runData.fDataNonMusr.GetErrData()->at(i).size() != runData.fDataNonMusr.GetErrData()->at(i-1).size()) { cerr << endl << "PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo; - cerr << endl << ">> label: " << runData.fDataNonMusr.fDataTags[i-1].Data() << ", number data elements = " << runData.fDataNonMusr.fData[i-1].size(); - cerr << endl << ">> label: " << runData.fDataNonMusr.fDataTags[i].Data() << ", number error data elements = " << runData.fDataNonMusr.fErrData[i].size(); + cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i-1).Data() << ", number data elements = " << runData.fDataNonMusr.GetData()->at(i-1).size(); + cerr << endl << ">> label: " << runData.fDataNonMusr.GetDataTags()->at(i).Data() << ", number error data elements = " << runData.fDataNonMusr.GetErrData()->at(i).size(); cerr << endl << ">> They have to be equal!!"; success = false; break; @@ -1970,7 +1878,7 @@ Bool_t PRunDataHandler::ReadDBFile() } // keep run name - runData.fRunName = fRunName; + runData.SetRunName(fRunName); fData.push_back(runData); @@ -2181,13 +2089,13 @@ Int_t PRunDataHandler::ToInt(TString &str, Bool_t &ok) * * return: if found returns the data tag index (from the dataTags vector), otherwise -1 */ -Int_t PRunDataHandler::GetDataTagIndex(TString &str, PStringVector &dataTags) +Int_t PRunDataHandler::GetDataTagIndex(TString &str, const PStringVector* dataTags) { Int_t result = -1; // check all the other possible data tags - for (UInt_t i=0; isize(); i++) { + if (!dataTags->at(i).CompareTo(str, TString::kIgnoreCase)) { result = i; break; } diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 8afed8fa..5c084a37 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -441,9 +441,9 @@ PRunData* PRunListCollection::GetNonMusr(unsigned int index, EDataSwitch tag) * * \param runName */ -vector< pair > PRunListCollection::GetTemp(const TString &runName) const +PDoublePairVector PRunListCollection::GetTemp(const TString &runName) const { - return fData->GetRunData(runName)->fTemp; + return fData->GetRunData(runName)->GetTemperature(); } //-------------------------------------------------------------------------- @@ -456,7 +456,7 @@ vector< pair > PRunListCollection::GetTemp(const TString &runNam */ double PRunListCollection::GetField(const TString &runName) const { - return fData->GetRunData(runName)->fField; + return fData->GetRunData(runName)->GetField(); } //-------------------------------------------------------------------------- @@ -469,7 +469,7 @@ double PRunListCollection::GetField(const TString &runName) const */ double PRunListCollection::GetEnergy(const TString &runName) const { - return fData->GetRunData(runName)->fEnergy; + return fData->GetRunData(runName)->GetEnergy(); } //-------------------------------------------------------------------------- @@ -482,7 +482,7 @@ double PRunListCollection::GetEnergy(const TString &runName) const */ const char* PRunListCollection::GetSetup(const TString &runName) const { - return fData->GetRunData(runName)->fSetup.Data(); + return fData->GetRunData(runName)->GetSetup()->Data(); } //-------------------------------------------------------------------------- @@ -504,13 +504,13 @@ const char* PRunListCollection::GetXAxisTitle(const TString &runName, const unsi const char *result = 0; - if (runData->fDataNonMusr.fFromAscii) { - result = runData->fDataNonMusr.fLabels[0].Data(); + if (runData->fDataNonMusr.FromAscii()) { + result = runData->fDataNonMusr.GetLabels()->at(0).Data(); } else { for (unsigned int i=0; iGetRunNo() == idx) { int index = fRunNonMusrList[i]->GetXIndex(); - result = runData->fDataNonMusr.fLabels[index].Data(); + result = runData->fDataNonMusr.GetLabels()->at(index).Data(); break; } } @@ -537,13 +537,13 @@ const char* PRunListCollection::GetYAxisTitle(const TString &runName, const unsi const char *result = 0; - if (runData->fDataNonMusr.fFromAscii) { - result = runData->fDataNonMusr.fLabels[1].Data(); + if (runData->fDataNonMusr.FromAscii()) { + result = runData->fDataNonMusr.GetLabels()->at(1).Data(); } else { for (unsigned int i=0; iGetRunNo() == idx) { int index = fRunNonMusrList[i]->GetYIndex(); - result = runData->fDataNonMusr.fLabels[index].Data(); + result = runData->fDataNonMusr.GetLabels()->at(index).Data(); break; } } diff --git a/src/classes/PRunNonMusr.cpp b/src/classes/PRunNonMusr.cpp index 20586967..8ace6646 100644 --- a/src/classes/PRunNonMusr.cpp +++ b/src/classes/PRunNonMusr.cpp @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -105,11 +105,11 @@ double PRunNonMusr::CalcChiSquare(const std::vector& par) // calculate chi square double x; - for (unsigned int i=0; isize(); i++) { + x = fData.GetX()->at(i); if ((x>=fFitStartTime) && (x<=fFitStopTime)) { - diff = fData.fValue[i] - fTheory->Func(x, par, fFuncValues); - chisq += diff*diff / (fData.fError[i]*fData.fError[i]); + diff = fData.GetValue()->at(i) - fTheory->Func(x, par, fFuncValues); + chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); } } @@ -195,24 +195,24 @@ bool PRunNonMusr::PrepareFitData() double value = 0.0; double err = 0.0; // cout << endl << ">> fRawRunData->fDataNonMusr.fData[" << xIndex << "].size()=" << fRawRunData->fDataNonMusr.fData[xIndex].size(); - for (unsigned int i=0; ifDataNonMusr.fData[xIndex].size(); i++) { + for (unsigned int i=0; ifDataNonMusr.GetData()->at(xIndex).size(); i++) { // cout << endl << ">> i=" << i << ", packing=" << fRunInfo->fPacking; if (fRunInfo->fPacking == 1) { - fData.fX.push_back(fRawRunData->fDataNonMusr.fData[xIndex][i]); - fData.fValue.push_back(fRawRunData->fDataNonMusr.fData[yIndex][i]); - fData.fError.push_back(fRawRunData->fDataNonMusr.fErrData[yIndex][i]); + fData.AppendXValue(fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i)); + fData.AppendValue(fRawRunData->fDataNonMusr.GetData()->at(yIndex).at(i)); + fData.AppendErrorValue(fRawRunData->fDataNonMusr.GetErrData()->at(yIndex).at(i)); } else { // packed data, i.e. fRunInfo->fPacking > 1 if ((i % fRunInfo->fPacking == 0) && (i != 0)) { // fill data // cout << endl << "-> i=" << i; - fData.fX.push_back(fRawRunData->fDataNonMusr.fData[xIndex][i]-(fRawRunData->fDataNonMusr.fData[xIndex][i]-fRawRunData->fDataNonMusr.fData[xIndex][i-fRunInfo->fPacking])/2.0); - fData.fValue.push_back(value); - fData.fError.push_back(TMath::Sqrt(err)); + fData.AppendXValue(fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i)-(fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i)-fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i-fRunInfo->fPacking))/2.0); + fData.AppendValue(value); + fData.AppendErrorValue(TMath::Sqrt(err)); value = 0.0; err = 0.0; } // sum raw data values - value += fRawRunData->fDataNonMusr.fData[yIndex][i]; - err += fRawRunData->fDataNonMusr.fErrData[yIndex][i]*fRawRunData->fDataNonMusr.fErrData[yIndex][i]; + value += fRawRunData->fDataNonMusr.GetData()->at(yIndex).at(i); + err += fRawRunData->fDataNonMusr.GetErrData()->at(yIndex).at(i)*fRawRunData->fDataNonMusr.GetErrData()->at(yIndex).at(i); } } // cout << endl << ">> fData.fValue.size()=" << fData.fValue.size(); @@ -220,8 +220,8 @@ bool PRunNonMusr::PrepareFitData() // count the number of bins to be fitted fNoOfFitBins=0; double x; - for (unsigned int i=0; isize(); i++) { + x = fData.GetX()->at(i); if ((x >= fFitStartTime) && (x <= fFitStopTime)) fNoOfFitBins++; } @@ -253,30 +253,30 @@ bool PRunNonMusr::PrepareViewData() double value = 0.0; double err = 0.0; // cout << endl << ">> fRawRunData->fDataNonMusr.fData[" << xIndex << "].size()=" << fRawRunData->fDataNonMusr.fData[xIndex].size(); - for (unsigned int i=0; ifDataNonMusr.fData[xIndex].size(); i++) { + for (unsigned int i=0; ifDataNonMusr.GetData()->at(xIndex).size(); i++) { // cout << endl << ">> i=" << i << ", packing=" << fRunInfo->fPacking; if (fRunInfo->fPacking == 1) { - fData.fX.push_back(fRawRunData->fDataNonMusr.fData[xIndex][i]); - fData.fValue.push_back(fRawRunData->fDataNonMusr.fData[yIndex][i]); - fData.fError.push_back(fRawRunData->fDataNonMusr.fErrData[yIndex][i]); + fData.AppendXValue(fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i)); + fData.AppendValue(fRawRunData->fDataNonMusr.GetData()->at(yIndex).at(i)); + fData.AppendErrorValue(fRawRunData->fDataNonMusr.GetErrData()->at(yIndex).at(i)); } else { // packed data, i.e. fRunInfo->fPacking > 1 if ((i % fRunInfo->fPacking == 0) && (i != 0)) { // fill data // cout << endl << "-> i=" << i; - fData.fX.push_back(fRawRunData->fDataNonMusr.fData[xIndex][i]-(fRawRunData->fDataNonMusr.fData[xIndex][i]-fRawRunData->fDataNonMusr.fData[xIndex][i-fRunInfo->fPacking])/2.0); - fData.fValue.push_back(value); - fData.fError.push_back(TMath::Sqrt(err)); + fData.AppendXValue(fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i)-(fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i)-fRawRunData->fDataNonMusr.GetData()->at(xIndex).at(i-fRunInfo->fPacking))/2.0); + fData.AppendValue(value); + fData.AppendErrorValue(TMath::Sqrt(err)); value = 0.0; err = 0.0; } // sum raw data values - value += fRawRunData->fDataNonMusr.fData[yIndex][i]; - err += fRawRunData->fDataNonMusr.fErrData[yIndex][i]*fRawRunData->fDataNonMusr.fErrData[yIndex][i]; + value += fRawRunData->fDataNonMusr.GetData()->at(yIndex).at(i); + err += fRawRunData->fDataNonMusr.GetErrData()->at(yIndex).at(i)*fRawRunData->fDataNonMusr.GetErrData()->at(yIndex).at(i); } } // cout << endl << ">> fData.fValue.size()=" << fData.fValue.size(); // count the number of bins to be fitted - fNoOfFitBins = fData.fValue.size(); + fNoOfFitBins = fData.GetValue()->size(); // cout << endl << ">> fNoOfFitBins=" << fNoOfFitBins; // fill theory histo @@ -341,17 +341,17 @@ bool PRunNonMusr::PrepareViewData() // typically take 1000 points to calculate the theory, except if there are more data points, than take that number double xStep; - if (fData.fX.size() > 1000.0) - xStep = (xMax-xMin)/fData.fX.size(); + if (fData.GetX()->size() > 1000.0) + xStep = (xMax-xMin)/fData.GetX()->size(); else xStep = (xMax-xMin)/1000.0; double xx = xAbsMin; do { // fill x-vector - fData.fXTheory.push_back(xx); + fData.AppendXTheoryValue(xx); // fill y-vector - fData.fTheory.push_back(fTheory->Func(xx, par, fFuncValues)); + fData.AppendTheoryValue(fTheory->Func(xx, par, fFuncValues)); // calculate next xx xx += xStep; } while (xx < xAbsMax); @@ -375,7 +375,7 @@ unsigned int PRunNonMusr::GetXIndex() bool found = false; //cout << endl << ">> PRunNonMusr::GetXIndex: fRawRunData->fDataNonMusr.fFromAscii = " << fRawRunData->fDataNonMusr.fFromAscii; - if (fRawRunData->fDataNonMusr.fFromAscii) { // ascii-file format + if (fRawRunData->fDataNonMusr.FromAscii()) { // ascii-file format //cout << endl << ">> PRunNonMusr::GetXIndex: ascii-file format"; index = 0; found = true; @@ -387,8 +387,8 @@ unsigned int PRunNonMusr::GetXIndex() found = true; } else { // xy-data data tags which needs to be converted to an index //cout << endl << ">> fDataTags.size()=" << fRawRunData->fDataNonMusr.fDataTags.size(); - for (unsigned int i=0; ifDataNonMusr.fDataTags.size(); i++) { - if (fRawRunData->fDataNonMusr.fDataTags[i].CompareTo(fRunInfo->fXYDataLabel[0]) == 0) { + for (unsigned int i=0; ifDataNonMusr.GetDataTags()->size(); i++) { + if (fRawRunData->fDataNonMusr.GetDataTags()->at(i).CompareTo(fRunInfo->fXYDataLabel[0]) == 0) { //cout << endl << ">> i=" << i << ", fRawRunData->fDataNonMusr.fDataTags[i]=" << fRawRunData->fDataNonMusr.fDataTags[i].Data(); //cout << endl << ">> fRunInfo->fXYDataLabel[0]=" << fRunInfo->fXYDataLabel[0].Data(); index = i; @@ -421,7 +421,7 @@ unsigned int PRunNonMusr::GetYIndex() bool found = false; // cout << endl << ">> PRunNonMusr::GetYIndex:"; - if (fRawRunData->fDataNonMusr.fFromAscii) { // ascii-file format + if (fRawRunData->fDataNonMusr.FromAscii()) { // ascii-file format index = 1; found = true; } else { // db-file format @@ -429,8 +429,8 @@ unsigned int PRunNonMusr::GetYIndex() index = fRunInfo->fXYDataIndex[1]-1; // since xy-data start with 1 ... found = true; } else { // xy-data data tags which needs to be converted to an index - for (unsigned int i=0; ifDataNonMusr.fDataTags.size(); i++) { - if (fRawRunData->fDataNonMusr.fDataTags[i].CompareTo(fRunInfo->fXYDataLabel[1]) == 0) { + for (unsigned int i=0; ifDataNonMusr.GetDataTags()->size(); i++) { + if (fRawRunData->fDataNonMusr.GetDataTags()->at(i).CompareTo(fRunInfo->fXYDataLabel[1]) == 0) { // cout << endl << ">> i=" << i << ", fRawRunData->fDataNonMusr.fDataTags[i]=" << fRawRunData->fDataNonMusr.fDataTags[i].Data(); // cout << endl << ">> fRunInfo->fXYDataLabel[1]=" << fRunInfo->fXYDataLabel[1].Data(); index = i; diff --git a/src/classes/PRunSingleHisto.cpp b/src/classes/PRunSingleHisto.cpp index b2b619f2..b0cabed7 100644 --- a/src/classes/PRunSingleHisto.cpp +++ b/src/classes/PRunSingleHisto.cpp @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -137,12 +137,12 @@ double PRunSingleHisto::CalcChiSquare(const std::vector& par) // calculate chi square double time; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); if ((time>=fFitStartTime) && (time<=fFitStopTime)) { - diff = fData.fValue[i] - + diff = fData.GetValue()->at(i) - (N0*TMath::Exp(-time/tau)*(1.0+fTheory->Func(time, par, fFuncValues))+bkg); - chisq += diff*diff / (fData.fError[i]*fData.fError[i]); + chisq += diff*diff / (fData.GetError()->at(i)*fData.GetError()->at(i)); } } @@ -150,7 +150,7 @@ double PRunSingleHisto::CalcChiSquare(const std::vector& par) static int firstTime = 0; if (firstTime < 4) { firstTime++; -cout << endl << "size=" << fData.fValue.size() << ", fDataTimeStart=" << fData.fDataTimeStart << ", fDataTimeStep=" << fData.fDataTimeStep << ", fFitStartTime=" << fFitStartTime << ", fFitStopTime=" << fFitStopTime; +cout << endl << "size=" << fData.GetValue()->size() << ", fDataTimeStart=" << fData.GetDataTimeStart() << ", fDataTimeStep=" << fData.GetDataTimeStep() << ", fFitStartTime=" << fFitStartTime << ", fFitStopTime=" << fFitStopTime; cout << endl << "chisq=" << chisq*fRunInfo->fPacking; cout << endl << "----"; } @@ -212,14 +212,14 @@ double PRunSingleHisto::CalcMaxLikelihood(const std::vector& par) double theo; double data; double time; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); if ((time>=fFitStartTime) && (time<=fFitStopTime)) { // calculate theory for the given parameter set theo = N0*TMath::Exp(-time/tau)*(1+fTheory->Func(time, par, fFuncValues))+bkg; // check if data value is not too small - if (fData.fValue[i] > 1.0e-9) - data = fData.fValue[i]; + if (fData.GetValue()->at(i) > 1.0e-9) + data = fData.GetValue()->at(i); else data = 1.0e-9; // add maximum log likelihood contribution of bin i @@ -282,13 +282,13 @@ void PRunSingleHisto::CalcTheory() } // calculate theory - unsigned int size = fData.fValue.size(); - double start = fData.fDataTimeStart; - double resolution = fData.fDataTimeStep; + unsigned int size = fData.GetValue()->size(); + double start = fData.GetDataTimeStart(); + double resolution = fData.GetDataTimeStep(); double time; for (unsigned int i=0; iFunc(time, par, fFuncValues))+bkg); + fData.AppendTheoryValue(N0*TMath::Exp(-time/tau)*(1+fTheory->Func(time, par, fFuncValues))+bkg); } // clean up @@ -318,9 +318,9 @@ bool PRunSingleHisto::PrepareData() unsigned int histoNo; histoNo = fRunInfo->fForwardHistoNo-1; - if ((runData->fDataBin.size() < histoNo) || (histoNo < 0)) { + if ((runData->GetNoOfHistos() < histoNo) || (histoNo < 0)) { cout << endl << "PRunSingleHisto::PrepareData(): **PANIC ERROR**:"; - cout << endl << " histoNo found = " << histoNo << ", but there are only " << runData->fDataBin.size() << " runs!?!?"; + cout << endl << " histoNo found = " << histoNo << ", but there are only " << runData->GetNoOfHistos() << " runs!?!?"; cout << endl << " Will quite :-("; cout << endl; return false; @@ -329,10 +329,10 @@ bool PRunSingleHisto::PrepareData() // check if the t0's are given in the msr-file if (fRunInfo->fT0.size() == 0) { // t0's are NOT in the msr-file // check if the t0's are in the data file - if (runData->fT0s.size() != 0) { // t0's in the run data + if (runData->GetT0s().size() != 0) { // t0's in the run data // keep the proper t0's. For single histo runs, forward is holding the histo no // fForwardHistoNo starts with 1 not with 0 ;-) - fT0s.push_back(runData->fT0s[fRunInfo->fForwardHistoNo-1]); + fT0s.push_back(runData->GetT0(fRunInfo->fForwardHistoNo-1)); } else { // t0's are neither in the run data nor in the msr-file -> not acceptable! cout << endl << "PRunSingleHisto::PrepareData(): **ERROR** NO t0's found, neither in the run data nor in the msr-file!"; cout << endl << " run: " << fRunInfo->fRunName[0].Data(); @@ -340,12 +340,12 @@ bool PRunSingleHisto::PrepareData() } } else { // t0's in the msr-file // check if t0's are given in the data file - if (runData->fT0s.size() != 0) { + if (runData->GetT0s().size() != 0) { // compare t0's of the msr-file with the one in the data file - if (fabs(fRunInfo->fT0[0]-runData->fT0s[fRunInfo->fForwardHistoNo-1])>5.0) { // given in bins!! + if (fabs(fRunInfo->fT0[0]-runData->GetT0(fRunInfo->fForwardHistoNo-1))>5.0) { // given in bins!! cout << endl << "PRunSingleHisto::PrepareData(): **WARNING**:"; cout << endl << " t0 from the msr-file is " << fRunInfo->fT0[0]; - cout << endl << " t0 from the data file is " << runData->fT0s[fRunInfo->fForwardHistoNo-1]; + cout << endl << " t0 from the data file is " << runData->GetT0(fRunInfo->fForwardHistoNo-1); cout << endl << " This is quite a deviation! Is this done intentionally??"; cout << endl; } @@ -355,7 +355,7 @@ bool PRunSingleHisto::PrepareData() // check if t0 is within proper bounds int t0 = fT0s[0]; - if ((t0 < 0) || (t0 > (int)runData->fDataBin[histoNo].size())) { + if ((t0 < 0) || (t0 > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareData(): **ERROR** t0 data bin doesn't make any sense!"; return false; } @@ -377,10 +377,10 @@ bool PRunSingleHisto::PrepareData() // check if the t0's are given in the msr-file if (i >= fRunInfo->fT0.size()) { // t0's are NOT in the msr-file // check if the t0's are in the data file - if (addRunData->fT0s.size() != 0) { // t0's in the run data + if (addRunData->GetT0s().size() != 0) { // t0's in the run data // keep the proper t0's. For single histo runs, forward is holding the histo no // fForwardHistoNo starts with 1 not with 0 ;-) - t0Add = addRunData->fT0s[fRunInfo->fForwardHistoNo-1]; + t0Add = addRunData->GetT0(fRunInfo->fForwardHistoNo-1); } else { // t0's are neither in the run data nor in the msr-file -> not acceptable! cout << endl << "PRunSingleHisto::PrepareData(): **ERROR** NO t0's found, neither in the addrun data nor in the msr-file!"; cout << endl << " addrun: " << fRunInfo->fRunName[i].Data(); @@ -388,12 +388,12 @@ bool PRunSingleHisto::PrepareData() } } else { // t0's in the msr-file // check if t0's are given in the data file - if (addRunData->fT0s.size() != 0) { + if (addRunData->GetT0s().size() != 0) { // compare t0's of the msr-file with the one in the data file - if (fabs(fRunInfo->fT0[i]-addRunData->fT0s[fRunInfo->fForwardHistoNo-1])>5.0) { // given in bins!! + if (fabs(fRunInfo->fT0[i]-addRunData->GetT0(fRunInfo->fForwardHistoNo-1))>5.0) { // given in bins!! cout << endl << "PRunSingleHisto::PrepareData(): **WARNING**:"; cout << endl << " t0 from the msr-file is " << fRunInfo->fT0[i]; - cout << endl << " t0 from the data file is " << addRunData->fT0s[fRunInfo->fForwardHistoNo-1]; + cout << endl << " t0 from the data file is " << addRunData->GetT0(fRunInfo->fForwardHistoNo-1); cout << endl << " This is quite a deviation! Is this done intentionally??"; cout << endl << " addrun: " << fRunInfo->fRunName[i].Data(); cout << endl; @@ -412,17 +412,17 @@ bool PRunSingleHisto::PrepareData() } // add run - for (unsigned int j=0; jfDataBin[histoNo].size(); j++) { + for (unsigned int j=0; jGetDataBin(histoNo)->size(); j++) { // make sure that the index stays in the proper range - if ((j-t0Add+t0 >= 0) && (j-t0Add+t0 < addRunData->fDataBin[histoNo].size())) { - runData->fDataBin[histoNo][j] += addRunData->fDataBin[histoNo][j-t0Add+t0]; + if ((j-t0Add+t0 >= 0) && (j-t0Add+t0 < addRunData->GetDataBin(histoNo)->size())) { + runData->AddDataBin(histoNo, j, addRunData->GetDataBin(histoNo)->at(j-t0Add+t0)); } } } } // keep the time resolution in (us) - fTimeResolution = runData->fTimeResolution/1.0e3; + fTimeResolution = runData->GetTimeResolution()/1.0e3; if (fHandleTag == kFit) success = PrepareFitData(runData, histoNo); @@ -466,12 +466,12 @@ bool PRunSingleHisto::PrepareFitData(PRawRunData* runData, const unsigned int hi start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (int)runData->fDataBin[histoNo].size())) { + if ((start < 0) || (start > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareFitData(): **ERROR** start data bin doesn't make any sense!"; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (int)runData->fDataBin[histoNo].size())) { + if ((end < 0) || (end > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareFitData(): **ERROR** end data bin doesn't make any sense!"; return false; } @@ -497,42 +497,42 @@ bool PRunSingleHisto::PrepareFitData(PRawRunData* runData, const unsigned int hi double normalizer = 1.0; // data start at data_start-t0 // time shifted so that packing is included correctly, i.e. t0 == t0 after packing - fData.fDataTimeStart = fTimeResolution*((double)start-(double)t0+(double)(fRunInfo->fPacking-1)/2.0); - fData.fDataTimeStep = fTimeResolution*fRunInfo->fPacking; + fData.SetDataTimeStart(fTimeResolution*((double)start-(double)t0+(double)(fRunInfo->fPacking-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*fRunInfo->fPacking); for (int i=start; ifPacking == 1) { - value = runData->fDataBin[histoNo][i]; + value = runData->GetDataBin(histoNo)->at(i); normalizer = fRunInfo->fPacking * (fTimeResolution * 1e3); // fTimeResolution us->ns value /= normalizer; - fData.fValue.push_back(value); + fData.AppendValue(value); if (value == 0.0) - fData.fError.push_back(1.0); + fData.AppendErrorValue(1.0); else - fData.fError.push_back(TMath::Sqrt(value)); + fData.AppendErrorValue(TMath::Sqrt(value)); } else { // packed data, i.e. fRunInfo->fPacking > 1 if (((i-start) % fRunInfo->fPacking == 0) && (i != start)) { // fill data // in order that after rebinning the fit does not need to be redone (important for plots) // the value is normalize to per 1 nsec normalizer = fRunInfo->fPacking * (fTimeResolution * 1e3); // fTimeResolution us->ns value /= normalizer; - fData.fValue.push_back(value); + fData.AppendValue(value); if (value == 0.0) - fData.fError.push_back(1.0); + fData.AppendErrorValue(1.0); else - fData.fError.push_back(TMath::Sqrt(value/normalizer)); + fData.AppendErrorValue(TMath::Sqrt(value/normalizer)); // reset values value = 0.0; } - value += runData->fDataBin[histoNo][i]; + value += runData->GetDataBin(histoNo)->at(i); } } // count the number of bins to be fitted fNoOfFitBins=0; double time; -//cout << endl << ">> size=" << fData.fValue.size() << ", fDataTimeStart=" << fData.fDataTimeStart << ", fDataTimeStep=" << fData.fDataTimeStep << ", fFitStartTime=" << fFitStartTime << ", fFitStopTime=" << fFitStopTime; - for (unsigned int i=0; i> size=" << fData.GetValue()->size() << ", fDataTimeStart=" << fData.GetDataTimeStart() << ", fDataTimeStep=" << fData.GetDataTimeStep() << ", fFitStartTime=" << fFitStartTime << ", fFitStopTime=" << fFitStopTime; + for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); if ((time >= fFitStartTime) && (time <= fFitStopTime)) fNoOfFitBins++; } @@ -559,7 +559,7 @@ bool PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const unsigned in // start = the first bin which is a multiple of packing backward from first good data bin int start = fRunInfo->fDataRange[0] - (fRunInfo->fDataRange[0]/packing)*packing; // end = last bin starting from start which is a multipl of packing and still within the data - int end = start + ((runData->fDataBin[histoNo].size()-start)/packing)*packing; + int end = start + ((runData->GetDataBin(histoNo)->size()-start)/packing)*packing; // check if start, end, and t0 make any sense // 1st check if start and end are in proper order if (end < start) { // need to swap them @@ -568,12 +568,12 @@ bool PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const unsigned in start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (int)runData->fDataBin[histoNo].size())) { + if ((start < 0) || (start > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareRawViewData(): **ERROR** start data bin doesn't make any sense!"; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (int)runData->fDataBin[histoNo].size())) { + if ((end < 0) || (end > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareRawViewData(): **ERROR** end data bin doesn't make any sense!"; return false; } @@ -583,13 +583,13 @@ bool PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const unsigned in double value = 0.0; // data start at data_start-t0 // time shifted so that packing is included correctly, i.e. t0 == t0 after packing - fData.fDataTimeStart = fTimeResolution*((double)start-(double)t0+(double)(packing-1)/2.0); - fData.fDataTimeStep = fTimeResolution*packing; + fData.SetDataTimeStart(fTimeResolution*((double)start-(double)t0+(double)(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*packing); /* cout << endl << ">> time resolution = " << fTimeResolution; cout << endl << ">> start = " << start << ", t0 = " << t0 << ", packing = " << packing; -cout << endl << ">> data start time = " << fData.fDataTimeStart; +cout << endl << ">> data start time = " << fData.GetDataTimeStart(); */ double normalizer = 1.0; @@ -599,23 +599,23 @@ cout << endl << ">> data start time = " << fData.fDataTimeStart; // the value is normalize to per 1 nsec normalizer = packing * (fTimeResolution * 1e3); // fTimeResolution us->ns value /= normalizer; - fData.fValue.push_back(value); + fData.AppendValue(value); if (value == 0.0) - fData.fError.push_back(1.0); + fData.AppendErrorValue(1.0); else - fData.fError.push_back(TMath::Sqrt(value/normalizer)); + fData.AppendErrorValue(TMath::Sqrt(value/normalizer)); // reset values value = 0.0; } - value += runData->fDataBin[histoNo][i]; + value += runData->GetDataBin(histoNo)->at(i); } // count the number of bins fNoOfFitBins=0; double time; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); if ((time >= fFitStartTime) && (time <= fFitStopTime)) fNoOfFitBins++; } @@ -666,23 +666,23 @@ cout << endl << ">> data start time = " << fData.fDataTimeStart; } // calculate theory - unsigned int size = runData->fDataBin[histoNo].size(); + unsigned int size = runData->GetDataBin(histoNo)->size(); double factor = 1.0; - if (fData.fValue.size() * 10 > runData->fDataBin[histoNo].size()) { - size = fData.fValue.size() * 10; - factor = (double)runData->fDataBin[histoNo].size() / (double)size; + if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo)->size()) { + size = fData.GetValue()->size() * 10; + factor = (double)runData->GetDataBin(histoNo)->size() / (double)size; } -//cout << endl << ">> runData->fDataBin[histoNo].size() = " << runData->fDataBin[histoNo].size() << ", fData.fValue.size() * 10 = " << fData.fValue.size() * 10 << ", size = " << size << ", factor = " << factor << endl; +//cout << endl << ">> runData->GetDataBin(histoNo).size() = " << runData->GetDataBin(histoNo)->size() << ", fData.GetValue()->size() * 10 = " << fData.GetValue()->size() * 10 << ", size = " << size << ", factor = " << factor << endl; double theoryValue; - fData.fTheoryTimeStart = fData.fDataTimeStart; - fData.fTheoryTimeStep = fTimeResolution*factor; + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(fTimeResolution*factor); for (unsigned int i=0; iFunc(time, par, fFuncValues); if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! theoryValue = 0.0; } - fData.fTheory.push_back(N0*TMath::Exp(-time/tau)*(1+theoryValue)+bkg); + fData.AppendTheoryValue(N0*TMath::Exp(-time/tau)*(1+theoryValue)+bkg); } // clean up @@ -721,7 +721,7 @@ bool PRunSingleHisto::PrepareViewData(PRawRunData* runData, const unsigned int h // start = the first bin which is a multiple of packing backward from first good data bin int start = fRunInfo->fDataRange[0] - (fRunInfo->fDataRange[0]/packing)*packing; // end = last bin starting from start which is a multiple of packing and still within the data - int end = start + ((runData->fDataBin[histoNo].size()-start)/packing)*packing; + int end = start + ((runData->GetDataBin(histoNo)->size()-start)/packing)*packing; // check if start, end, and t0 make any sense // 1st check if start and end are in proper order @@ -731,12 +731,12 @@ bool PRunSingleHisto::PrepareViewData(PRawRunData* runData, const unsigned int h start = keep; } // 2nd check if start is within proper bounds - if ((start < 0) || (start > (int)runData->fDataBin[histoNo].size())) { + if ((start < 0) || (start > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareViewData(): **ERROR** start data bin doesn't make any sense!"; return false; } // 3rd check if end is within proper bounds - if ((end < 0) || (end > (int)runData->fDataBin[histoNo].size())) { + if ((end < 0) || (end > (int)runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::PrepareViewData(): **ERROR** end data bin doesn't make any sense!"; return false; } @@ -788,11 +788,11 @@ bool PRunSingleHisto::PrepareViewData(PRawRunData* runData, const unsigned int h double time; // data start at data_start-t0 shifted by (pack-1)/2 - fData.fDataTimeStart = fTimeResolution*((double)start-(double)t0+(double)(packing-1)/2.0); - fData.fDataTimeStep = fTimeResolution*packing; + fData.SetDataTimeStart(fTimeResolution*((double)start-(double)t0+(double)(packing-1)/2.0)); + fData.SetDataTimeStep(fTimeResolution*packing); /* -cout << endl << ">> start time = " << fData.fDataTimeStart << ", step = " << fData.fDataTimeStep; +cout << endl << ">> start time = " << fData.GetDataTimeStart() << ", step = " << fData.GetDataTimeStep(); cout << endl << ">> start = " << start << ", end = " << end; cout << endl << "--------------------------------" << endl; */ @@ -806,19 +806,19 @@ cout << endl << "--------------------------------" << endl; value /= normalizer; time = (((double)i-(double)(packing-1)/2.0)-t0)*fTimeResolution; expval = TMath::Exp(+time/tau)/N0; - fData.fValue.push_back(-1.0+expval*(value-bkg)); + fData.AppendValue(-1.0+expval*(value-bkg)); //cout << endl << ">> i=" << i << ",t0=" << t0 << ",time=" << time << ",expval=" << expval << ",value=" << value << ",bkg=" << bkg << ",expval*(value-bkg)-1=" << expval*(value-bkg)-1.0; - fData.fError.push_back(expval*TMath::Sqrt(value/normalizer)); + fData.AppendErrorValue(expval*TMath::Sqrt(value/normalizer)); //cout << endl << ">> " << time << ", " << expval << ", " << -1.0+expval*(value-bkg) << ", " << expval*TMath::Sqrt(value/packing); value = 0.0; } - value += runData->fDataBin[histoNo][i]; + value += runData->GetDataBin(histoNo)->at(i); } // count the number of bins to be fitted fNoOfFitBins=0; - for (unsigned int i=0; isize(); i++) { + time = fData.GetDataTimeStart() + (double)i*fData.GetDataTimeStep(); if ((time >= fFitStartTime) && (time <= fFitStopTime)) fNoOfFitBins++; } @@ -830,23 +830,23 @@ cout << endl << "--------------------------------" << endl; // calculate theory double theoryValue; - unsigned int size = runData->fDataBin[histoNo].size(); + unsigned int size = runData->GetDataBin(histoNo)->size(); double factor = 1.0; - if (fData.fValue.size() * 10 > runData->fDataBin[histoNo].size()) { - size = fData.fValue.size() * 10; - factor = (double)runData->fDataBin[histoNo].size() / (double)size; + if (fData.GetValue()->size() * 10 > runData->GetDataBin(histoNo)->size()) { + size = fData.GetValue()->size() * 10; + factor = (double)runData->GetDataBin(histoNo)->size() / (double)size; } -//cout << endl << ">> runData->fDataBin[histoNo].size() = " << runData->fDataBin[histoNo].size() << ", fData.fValue.size() * 10 = " << fData.fValue.size() * 10 << ", size = " << size << ", factor = " << factor << endl; - fData.fTheoryTimeStart = fData.fDataTimeStart; - fData.fTheoryTimeStep = fTimeResolution*factor; +//cout << endl << ">> runData->GetDataBin(histoNo).size() = " << runData->GetDataBin(histoNo).size() << ", fData.GetValue()->size() * 10 = " << fData.GetValue()->size() * 10 << ", size = " << size << ", factor = " << factor << endl; + fData.SetTheoryTimeStart(fData.GetDataTimeStart()); + fData.SetTheoryTimeStep(fTimeResolution*factor); //cout << endl << ">> size=" << size << ", startTime=" << startTime << ", fTimeResolution=" << fTimeResolution; for (unsigned int i=0; iFunc(time, par, fFuncValues); if (fabs(theoryValue) > 10.0) { // dirty hack needs to be fixed!! theoryValue = 0.0; } - fData.fTheory.push_back(theoryValue); + fData.AppendTheoryValue(theoryValue); } // clean up @@ -899,17 +899,17 @@ bool PRunSingleHisto::EstimateBkg(unsigned int histoNo) PRawRunData* runData = fRawData->GetRunData(fRunInfo->fRunName[0]); // check if start is within histogram bounds - if ((start < 0) || (start >= runData->fDataBin[histoNo].size())) { + if ((start < 0) || (start >= runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::EstimatBkg(): background bin values out of bound!"; - cout << endl << " histo lengths = " << runData->fDataBin[histoNo].size(); + cout << endl << " histo lengths = " << runData->GetDataBin(histoNo)->size(); cout << endl << " background start = " << start; return false; } // check if end is within histogram bounds - if ((end < 0) || (end >= runData->fDataBin[histoNo].size())) { + if ((end < 0) || (end >= runData->GetDataBin(histoNo)->size())) { cout << endl << "PRunSingleHisto::EstimatBkg(): background bin values out of bound!"; - cout << endl << " histo lengths = " << runData->fDataBin[histoNo].size(); + cout << endl << " histo lengths = " << runData->GetDataBin(histoNo)->size(); cout << endl << " background end = " << end; return false; } @@ -920,7 +920,7 @@ bool PRunSingleHisto::EstimateBkg(unsigned int histoNo) // forward //cout << endl << ">> bkg start=" << start << ", end=" << end; for (unsigned int i=start; ifDataBin[histoNo][i]; + bkg += runData->GetDataBin(histoNo)->at(i); bkg /= static_cast(end - start + 1); fBackground = bkg / (fTimeResolution * 1e3); // keep background (per 1 nsec) for chisq, max.log.likelihood, fTimeResolution us->ns diff --git a/src/classes/PTheory.cpp b/src/classes/PTheory.cpp index 980d5007..9a179356 100644 --- a/src/classes/PTheory.cpp +++ b/src/classes/PTheory.cpp @@ -725,7 +725,7 @@ void PTheory::MakeCleanAndTidyTheoryBlock(PMsrLines *fullTheoryBlock) TString str, tidy; char substr[256]; TObjArray *tokens = 0; - TObjString *ostr; + TObjString *ostr = 0; int idx = THEORY_UNDEFINED; for (unsigned int i=1; isize(); i++) { @@ -791,13 +791,14 @@ void PTheory::MakeCleanAndTidyTheoryBlock(PMsrLines *fullTheoryBlock) } // write tidy string back into theory block (*fullTheoryBlock)[i].fLine = tidy; + + // clean up + if (tokens) { + delete tokens; + tokens = 0; + } } - // clean up - if (tokens) { - delete tokens; - tokens = 0; - } } //-------------------------------------------------------------------------- diff --git a/src/include/PMusr.h b/src/include/PMusr.h index c2d252a0..b34a429d 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -62,6 +62,9 @@ using namespace std; // used to filter post pileup correct data histos from root files #define POST_PILEUP_HISTO_OFFSET 20 +// defines a value for 'undefined values' +#define PMUSR_UNDEFINED -9.9e99 + //------------------------------------------------------------- // msr block header tags #define MSR_TAG_TITLE 0 @@ -123,7 +126,13 @@ typedef vector PIntVector; /** *

*/ -typedef vector< pair > PIntPairVector; +typedef pair PIntPair; + +//------------------------------------------------------------- +/** + *

+ */ +typedef vector PIntPairVector; //------------------------------------------------------------- /** @@ -157,54 +166,146 @@ enum EPMusrHandleTag { kEmpty, kFit, kView }; //------------------------------------------------------------- /** - *

Predominantly used in PRunBase. + *

Holds the data which will be fitted, i.e. packed, background corrected, ... */ -typedef struct { - // data related info - Double_t fDataTimeStart; - Double_t fDataTimeStep; - PDoubleVector fX; // only used for non-muSR - PDoubleVector fValue; - PDoubleVector fError; - // theory related info - Double_t fTheoryTimeStart; - Double_t fTheoryTimeStep; - PDoubleVector fXTheory; // only used for non-muSR - PDoubleVector fTheory; -} PRunData; +class PRunData { + public: + PRunData(); + virtual ~PRunData(); + + virtual Double_t GetDataTimeStart() { return fDataTimeStart; } + virtual Double_t GetDataTimeStep() { return fDataTimeStep; } + virtual Double_t GetTheoryTimeStart() { return fTheoryTimeStart; } + virtual Double_t GetTheoryTimeStep() { return fTheoryTimeStep; } + + virtual const PDoubleVector* GetX() { return &fX; } + virtual const PDoubleVector* GetValue() { return &fValue; } + virtual const PDoubleVector* GetError() { return &fError; } + virtual const PDoubleVector* GetXTheory() { return &fXTheory; } + virtual const PDoubleVector* GetTheory() { return &fTheory; } + + virtual void SetDataTimeStart(Double_t dval) { fDataTimeStart = dval; } + virtual void SetDataTimeStep(Double_t dval) { fDataTimeStep = dval; } + virtual void SetTheoryTimeStart(Double_t dval) { fTheoryTimeStart = dval; } + virtual void SetTheoryTimeStep(Double_t dval) { fTheoryTimeStep = dval; } + + virtual void AppendXValue(Double_t dval) { fX.push_back(dval); } + virtual void AppendValue(Double_t dval) { fValue.push_back(dval); } + virtual void AppendErrorValue(Double_t dval) { fError.push_back(dval); } + virtual void AppendXTheoryValue(Double_t dval) { fXTheory.push_back(dval); } + virtual void AppendTheoryValue(Double_t dval) { fTheory.push_back(dval); } + + private: + // data related info + Double_t fDataTimeStart; + Double_t fDataTimeStep; + PDoubleVector fX; // only used for non-muSR + PDoubleVector fValue; + PDoubleVector fError; + // theory related info + Double_t fTheoryTimeStart; + Double_t fTheoryTimeStep; + PDoubleVector fXTheory; // only used for non-muSR + PDoubleVector fTheory; + }; //------------------------------------------------------------- /** - *

+ *

Non-Musr raw data. */ -typedef struct { - Bool_t fFromAscii; ///< if true: data file was an ascii input file, otherwise it is a db input file - PStringVector fLabels; ///< vector of all labels (used for x-, y-axis title in view) - PStringVector fDataTags; ///< vector of all data tags - vector fData; ///< vector of all data - vector fErrData; ///< vector of all data errors -} PNonMusrRawRunData; +class PNonMusrRawRunData { + public: + PNonMusrRawRunData(); + virtual ~PNonMusrRawRunData(); + + virtual Bool_t FromAscii() { return fFromAscii; } + virtual const PStringVector* GetLabels() { return &fLabels; } + virtual const PStringVector* GetDataTags() { return &fDataTags; } + virtual const vector* GetData() { return &fData; } + virtual const vector* GetErrData() { return &fErrData; } + + virtual void SetFromAscii(const Bool_t bval) { fFromAscii = bval; } + virtual void AppendLabel(const TString str) { fLabels.push_back(str); } + virtual void SetLabel(const UInt_t idx, const TString str); + virtual void AppendDataTag(const TString str) { fDataTags.push_back(str); } + virtual void AppendData(const PDoubleVector &data) { fData.push_back(data); } + virtual void AppendErrData(const PDoubleVector &data) { fErrData.push_back(data); } + virtual void AppendSubData(const UInt_t idx, const Double_t dval); + virtual void AppendSubErrData(const UInt_t idx, const Double_t dval); + + private: + Bool_t fFromAscii; ///< if true: data file was an ascii input file, otherwise it is a db input file + PStringVector fLabels; ///< vector of all labels (used for x-, y-axis title in view) + PStringVector fDataTags; ///< vector of all data tags + vector fData; ///< vector of all data + vector fErrData; ///< vector of all data errors +}; //------------------------------------------------------------- /** - *

+ *

Histogram raw muSR data. */ -typedef struct { - TString fRunName; ///< name of the run - TString fRunTitle; ///< run title - TString fSetup; ///< description of the setup of this run - Double_t fField; ///< magnetic field value - PDoublePairVector fTemp; ///< measured temperatures and standard deviations during the run - Double_t fEnergy; ///< implantation energy of the muon - Double_t fTransport; ///< LEM transport settings (Moderator HV) - PDoubleVector fRingAnode; ///< LEM ring anode HVs (L,R[,T,B]) - Double_t fTimeResolution; ///< time resolution of the run - PIntVector fT0s; ///< vector of t0's of a run - PIntPairVector fBkgBin; ///< background bins (first/last) - PIntPairVector fGoodDataBin; ///< data bins (first/last) - vector fDataBin; ///< vector of all histos of a run - PNonMusrRawRunData fDataNonMusr; ///< keeps all ascii- or db-file info in case of nonMusr fit -} PRawRunData; +class PRawRunData { + public: + PRawRunData(); + virtual ~PRawRunData(); + + virtual const TString* GetRunName() { return &fRunName; } + virtual const TString* GetRunTitle() { return &fRunTitle; } + virtual const TString* GetSetup() { return &fSetup; } + virtual const Double_t GetField() { return fField; } + virtual const UInt_t GetNoOfTemperatures() { return fTemp.size(); } + virtual const PDoublePairVector GetTemperature() { return fTemp; } + virtual const Double_t GetTemperature(const UInt_t idx); + virtual const Double_t GetTempError(const UInt_t idx); + virtual const Double_t GetEnergy() { return fEnergy; } + virtual const Double_t GetTransport() { return fTransport; } + virtual const PDoubleVector GetRingAnode() { return fRingAnode; } + virtual const Double_t GetRingAnode(const UInt_t idx); + virtual const Double_t GetTimeResolution() { return fTimeResolution; } + virtual const PIntVector GetT0s() { return fT0s; } + virtual const Int_t GetT0(const UInt_t idx); + virtual const PIntPair GetBkgBin(const UInt_t idx); + virtual const PIntPair GetGoodDataBin(const UInt_t idx); + virtual const UInt_t GetNoOfHistos() { return fDataBin.size(); } + virtual const PDoubleVector* GetDataBin(const UInt_t idx); + virtual const PNonMusrRawRunData* GetDataNonMusr() { return &fDataNonMusr; } + + virtual void SetRunName(const TString &str) { fRunName = str; } + virtual void SetRunTitle(const TString str) { fRunTitle = str; } + virtual void SetSetup(const TString str) { fSetup = str; } + virtual void SetField(const Double_t dval) { fField = dval; } + virtual void ClearTemperature() { fTemp.clear(); } + virtual void SetTemperature(const UInt_t idx, const Double_t temp, const Double_t errTemp); + virtual void SetTempError(const UInt_t idx, const Double_t errTemp); + virtual void SetEnergy(const Double_t dval) { fEnergy = dval; } + virtual void SetTransport(const Double_t dval) { fTransport = dval; } + virtual void SetRingAnode(const UInt_t idx, const Double_t dval); + virtual void SetTimeResolution(const Double_t dval) { fTimeResolution = dval; } + virtual void AppendT0(const Int_t ival) { fT0s.push_back(ival); } + virtual void AppendBkgBin(PIntPair pair) { fBkgBin.push_back(pair); } + virtual void AppendGoodDataBin(PIntPair pair) { fGoodDataBin.push_back(pair); } + virtual void AppendDataBin(PDoubleVector data) { fDataBin.push_back(data); } + virtual void SetDataBin(const UInt_t histoNo, const UInt_t bin, const Double_t dval); + virtual void AddDataBin(const UInt_t histoNo, const UInt_t bin, const Double_t dval); + + PNonMusrRawRunData fDataNonMusr; ///< keeps all ascii- or db-file info in case of nonMusr fit + + private: + TString fRunName; ///< name of the run + TString fRunTitle; ///< run title + TString fSetup; ///< description of the setup of this run + Double_t fField; ///< magnetic field value + PDoublePairVector fTemp; ///< measured temperatures and standard deviations during the run + Double_t fEnergy; ///< implantation energy of the muon + Double_t fTransport; ///< LEM transport settings (Moderator HV) + PDoubleVector fRingAnode; ///< LEM ring anode HVs (L,R[,T,B]) + Double_t fTimeResolution; ///< time resolution of the run + PIntVector fT0s; ///< vector of t0's of a run + PIntPairVector fBkgBin; ///< background bins (first/last) + PIntPairVector fGoodDataBin; ///< data bins (first/last) + vector fDataBin; ///< vector of all histos of a run +}; //------------------------------------------------------------- /** diff --git a/src/include/PRunBase.h b/src/include/PRunBase.h index ae8963d8..12ed936f 100644 --- a/src/include/PRunBase.h +++ b/src/include/PRunBase.h @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * diff --git a/src/include/PRunDataHandler.h b/src/include/PRunDataHandler.h index 98f68cc9..4e5f68f3 100644 --- a/src/include/PRunDataHandler.h +++ b/src/include/PRunDataHandler.h @@ -11,7 +11,7 @@ /*************************************************************************** * Copyright (C) 2007 by Andreas Suter * - * andreas.suter@psi.c * + * 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 * @@ -74,7 +74,7 @@ class PRunDataHandler virtual Bool_t IsWhitespace(const char *str); virtual Double_t ToDouble(TString &str, Bool_t &ok); virtual Int_t ToInt(TString &str, Bool_t &ok); - virtual Int_t GetDataTagIndex(TString &str, PStringVector &fLabels); + virtual Int_t GetDataTagIndex(TString &str, const PStringVector* fLabels); }; #endif // _PRUNDATAHANDLER_H_ diff --git a/src/musrfit.cpp b/src/musrfit.cpp index 1530a2e1..3e14e4fd 100644 --- a/src/musrfit.cpp +++ b/src/musrfit.cpp @@ -110,12 +110,12 @@ void musrfit_write_ascii(TString fln, PRunData *data, int runCounter) } // dump data - f << "% number of data values = " << data->fValue.size() << endl; + f << "% number of data values = " << data->GetValue()->size() << endl; f << "% time (us), value, error, theory" << endl; double time; - for (unsigned int i=0; ifValue.size(); i++) { - time = data->fDataTimeStart + (double)i*data->fDataTimeStep; - f << time << ", " << data->fValue[i] << ", " << data->fError[i] << ", " << data->fTheory[i] << endl; + for (unsigned int i=0; iGetValue()->size(); i++) { + time = data->GetDataTimeStart() + (double)i*data->GetDataTimeStep(); + f << time << ", " << data->GetValue()->at(i) << ", " << data->GetError()->at(i) << ", " << data->GetTheory()->at(i) << endl; } // close file @@ -213,17 +213,17 @@ void musrfit_write_root(TFile &f, TString fln, PRunData *data, int runCounter) TCanvas *c = new TCanvas(name, title.Data(), 10, 10, 800, 600); // create histos - Double_t diff = data->fDataTimeStep; + Double_t diff = data->GetDataTimeStep(); Double_t start = -diff/2.0; - Double_t end = data->fDataTimeStep*data->fValue.size(); - TH1F *hdata = new TH1F("hdata", "run data", data->fValue.size(), start, end); - TH1F *htheo = new TH1F("htheo", "run theory", data->fValue.size(), start, end); + Double_t end = data->GetDataTimeStep()*data->GetValue()->size(); + TH1F *hdata = new TH1F("hdata", "run data", data->GetValue()->size(), start, end); + TH1F *htheo = new TH1F("htheo", "run theory", data->GetValue()->size(), start, end); // fill data - for (unsigned int i=0; ifValue.size(); i++) { - hdata->SetBinContent(i+1, data->fValue[i]); - hdata->SetBinError(i+1, data->fError[i]); - htheo->SetBinContent(i+1, data->fTheory[i]); + for (unsigned int i=0; iGetValue()->size(); i++) { + hdata->SetBinContent(i+1, data->GetValue()->at(i)); + hdata->SetBinError(i+1, data->GetError()->at(i)); + htheo->SetBinContent(i+1, data->GetTheory()->at(i)); } hdata->SetMarkerStyle(20); @@ -319,6 +319,8 @@ void musrfit_dump_root(char *fileName, PRunListCollection *runList) } } } + + f.Close("R"); } //-------------------------------------------------------------------------- @@ -400,7 +402,6 @@ int main(int argc, char *argv[]) } } - // read startup file char startup_path_name[128]; TSAXParser *saxParser = new TSAXParser(); @@ -457,14 +458,14 @@ int main(int argc, char *argv[]) if (title_from_data_file) { PMsrRunList *rl = msrHandler->GetMsrRunList(); PRawRunData *rrd = dataHandler->GetRunData(rl->at(0).fRunName[0]); - if (rrd->fRunTitle.Length() > 0) - msrHandler->SetMsrTitle(rrd->fRunTitle); + if (rrd->GetRunTitle()->Length() > 0) + msrHandler->SetMsrTitle(*rrd->GetRunTitle()); } // generate the necessary fit histogramms for the fit PRunListCollection *runListCollection = 0; if (success) { - // feed all the necessary histogramms for the fit + // feed all the necessary histogramms for the fit runListCollection = new PRunListCollection(msrHandler, dataHandler); for (unsigned int i=0; i < msrHandler->GetMsrRunList()->size(); i++) { success = runListCollection->Add(i, kFit); diff --git a/src/musrt0.cpp b/src/musrt0.cpp index da894421..b33f642a 100644 --- a/src/musrt0.cpp +++ b/src/musrt0.cpp @@ -82,7 +82,7 @@ bool musrt0_item(TApplication &app, PMsrHandler *msrHandler, PRawRunData *rawRun if (musrT0 == 0) { cout << endl << "**ERROR** Couldn't invoke musrT0 ..."; - cout << endl << " run name " << rawRunData->fRunName.Data(); + cout << endl << " run name " << rawRunData->GetRunName()->Data(); cout << endl << " histo No " << histoNo; cout << endl; return false; diff --git a/src/musrview.cpp b/src/musrview.cpp index e2bc85fa..7a703d3d 100644 --- a/src/musrview.cpp +++ b/src/musrview.cpp @@ -152,17 +152,15 @@ int main(int argc, char *argv[]) if (status) { // error cout << endl << "**WARNING** reading/parsing musrfit_startup.xml failed."; cout << endl; -/* // clean up - if (saxParser) { - delete saxParser; - saxParser = 0; - } if (startupHandler) { delete startupHandler; startupHandler = 0; } -*/ + if (saxParser) { + delete saxParser; + saxParser = 0; + } } startupHandler->CheckLists();