From 4ad524216f8af0e67723db9af39e0ba9794f78dd Mon Sep 17 00:00:00 2001 From: Zaher Salman Date: Wed, 15 Aug 2018 20:35:06 +0200 Subject: [PATCH] Start branch to develop full featured beta-NMR support --- src/classes/PMsrHandler.cpp | 16 ++- src/classes/PMusrCanvas.cpp | 15 ++- src/classes/PRunListCollection.cpp | 156 +++++++++++++++++++++++++++++ src/include/PMusr.h | 3 + src/include/PRunListCollection.h | 18 ++-- 5 files changed, 200 insertions(+), 8 deletions(-) diff --git a/src/classes/PMsrHandler.cpp b/src/classes/PMsrHandler.cpp index a45d5832..c57cf12b 100644 --- a/src/classes/PMsrHandler.cpp +++ b/src/classes/PMsrHandler.cpp @@ -640,6 +640,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_FITTYPE_MU_MINUS: fout << std::left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << std::endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << std::left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << std::endl ; break; @@ -804,6 +807,9 @@ Int_t PMsrHandler::WriteMsrLogFile(const Bool_t messages) case MSR_FITTYPE_MU_MINUS: fout << std::left << "fittype" << MSR_FITTYPE_MU_MINUS << " (mu minus fit)" << std::endl ; break; + case MSR_FITTYPE_BNMR: + fout << left << "fittype" << MSR_FITTYPE_BNMR << " (beta-NMR fit)" << endl ; + break; case MSR_FITTYPE_NON_MUSR: fout << std::left << "fittype" << MSR_FITTYPE_NON_MUSR << " (non muSR fit)" << std::endl ; break; @@ -1716,6 +1722,9 @@ Int_t PMsrHandler::WriteMsrFile(const Char_t *filename, std::map> PMsrHandler::CheckHistoGrouping: **ERROR** # of forward histos != # of backward histos."; std::cerr << std::endl << ">> Run #" << i+1; diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index f683d229..a4b42f19 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -734,6 +734,18 @@ void PMusrCanvas::UpdateDataTheoryPad() // handle data HandleDataSet(i, runNo, data); break; + case MSR_FITTYPE_BNMR: + data = fRunList->GetAsymmetryBNMR(runNo, PRunListCollection::kRunNo); + if (!data) { // something wrong + fValid = false; + // error message + cerr << endl << ">> PMusrCanvas::UpdateDataTheoryPad(): **ERROR** couldn't obtain run no " << runNo << " for a beta-NMR asymmetry plot"; + cerr << endl; + return; + } + // handle data + HandleDataSet(i, runNo, data); + break; case MSR_FITTYPE_NON_MUSR: data = fRunList->GetNonMusr(runNo, PRunListCollection::kRunNo); if (!data) { // something wrong @@ -902,7 +914,8 @@ void PMusrCanvas::UpdateInfoPad() tstr += grouping; tstr += TString(","); } else if ((runs[runNo].GetFitType() == MSR_FITTYPE_ASYM) || - (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF)) { + (runs[runNo].GetFitType() == MSR_FITTYPE_ASYM_RRF) || + (runs[runNo].GetFitType() == MSR_FITTYPE_BNMR)) { tstr += TString("h:"); TString grouping; fMsrHandler->GetGroupingString(runNo, "forward", grouping); diff --git a/src/classes/PRunListCollection.cpp b/src/classes/PRunListCollection.cpp index 2a546ba3..7013ee94 100644 --- a/src/classes/PRunListCollection.cpp +++ b/src/classes/PRunListCollection.cpp @@ -76,6 +76,12 @@ PRunListCollection::~PRunListCollection() } fRunAsymmetryRRFList.clear(); + for (UInt_t i=0; iCleanUp(); + fRunAsymmetryBNMRList[i]->~PRunAsymmetryBNMR(); + } + fRunAsymmetryBNMRList.clear(); + for (UInt_t i=0; iCleanUp(); fRunMuMinusList[i]->~PRunMuMinus(); @@ -133,6 +139,11 @@ Bool_t PRunListCollection::Add(Int_t runNo, EPMusrHandleTag tag) if (!fRunAsymmetryRRFList[fRunAsymmetryRRFList.size()-1]->IsValid()) success = false; break; + case PRUN_ASYMMETRY_BNMR: + fRunAsymmetryBNMRList.push_back(new PRunAsymmetryBNMR(fMsrInfo, fData, runNo, tag)); + if (!fRunAsymmetryBNMRList[fRunAsymmetryBNMRList.size()-1]->IsValid()) + success = false; + break; case PRUN_MU_MINUS: fRunMuMinusList.push_back(new PRunMuMinus(fMsrInfo, fData, runNo, tag)); if (!fRunMuMinusList[fRunMuMinusList.size()-1]->IsValid()) @@ -175,6 +186,8 @@ void PRunListCollection::SetFitRange(const TString fitRange) fRunAsymmetryList[i]->SetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRangeBin(fitRange); + for (UInt_t i=0; iSetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRangeBin(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); + for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; iSetFitRange(fitRange); for (UInt_t i=0; i& p return chisq; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMRChisq (public) +//-------------------------------------------------------------------------- +/** + *

Calculates chi-square of all asymmetry BNMR runs of a msr-file. + * + * return: + * - chi-square of all asymmetry BNMR runs of the msr-file + * + * \param par fit parameter vector + */ +Double_t PRunListCollection::GetAsymmetryBNMRChisq(const std::vector& par) const +{ + Double_t chisq = 0.0; + + for (UInt_t i=0; iCalcChiSquare(par); + + return chisq; +} + //-------------------------------------------------------------------------- // GetMuMinusChisq (public) //-------------------------------------------------------------------------- @@ -380,6 +416,9 @@ Double_t PRunListCollection::GetSingleHistoChisqExpected(const std::vectorCalcChiSquareExpected(par); break; + case PRUN_ASYMMETRY_BNMR: + expectedChisq = fRunAsymmetryBNMRList[subIdx]->CalcChiSquareExpected(par); + break; case PRUN_MU_MINUS: expectedChisq = fRunMuMinusList[subIdx]->CalcChiSquareExpected(par); break; @@ -441,6 +480,9 @@ Double_t PRunListCollection::GetSingleRunChisq(const std::vector& par, case PRUN_ASYMMETRY_RRF: chisq = fRunAsymmetryRRFList[subIdx]->CalcChiSquare(par); break; + case PRUN_ASYMMETRY_BNMR: + chisq = fRunAsymmetryBNMRList[subIdx]->CalcChiSquare(par); + break; case PRUN_MU_MINUS: chisq = fRunMuMinusList[subIdx]->CalcChiSquare(par); break; @@ -540,6 +582,28 @@ Double_t PRunListCollection::GetAsymmetryRRFMaximumLikelihood(const std::vector< return mlh; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMRMaximumLikelihood (public) +//-------------------------------------------------------------------------- +/** + *

Since it is not clear yet how to handle asymmetry fits with max likelihood + * the chi square will be used! + * + * return: + * - chi-square of all asymmetry BNMR runs of the msr-file + * + * \param par fit parameter vector + */ +Double_t PRunListCollection::GetAsymmetryBNMRMaximumLikelihood(const std::vector& par) const +{ + Double_t mlh = 0.0; + + for (UInt_t i=0; iCalcChiSquare(par); + + return mlh; +} + //-------------------------------------------------------------------------- // GetMuMinusMaximumLikelihood (public) //-------------------------------------------------------------------------- @@ -721,6 +785,9 @@ UInt_t PRunListCollection::GetNoOfBinsFitted(const UInt_t idx) const case PRUN_ASYMMETRY_RRF: result = fRunAsymmetryRRFList[subIdx]->GetNoOfFitBins(); break; + case PRUN_ASYMMETRY_BNMR: + result = fRunAsymmetryBNMRList[subIdx]->GetNoOfFitBins(); + break; case PRUN_MU_MINUS: result = fRunMuMinusList[subIdx]->GetNoOfFitBins(); break; @@ -760,6 +827,9 @@ UInt_t PRunListCollection::GetTotalNoOfBinsFitted() const for (UInt_t i=0; iGetNoOfFitBins(); + for (UInt_t i=0; iGetNoOfFitBins(); + for (UInt_t i=0; iGetNoOfFitBins(); @@ -898,6 +968,49 @@ PRunData* PRunListCollection::GetAsymmetry(UInt_t index, EDataSwitch tag) return data; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMR (public) +//-------------------------------------------------------------------------- +/** + *

Get a processed asymmetry data set. + * + * return: + * - pointer to the run data set (processed data) if data set is found + * - null pointer otherwise + * + * \param index msr-file run index + * \param tag kIndex -> data at index, kRunNo -> data of given run no + */ +PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) +{ + PRunData *data = 0; + + switch (tag) { + case kIndex: // called from musrfit when dumping the data + if (index > fRunAsymmetryList.size()) { + cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + cerr << endl; + return 0; + } + + fRunAsymmetryList[index]->CalcTheory(); + data = fRunAsymmetryList[index]->GetData(); + break; + case kRunNo: // called from PMusrCanvas + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryList[i]->GetData(); + break; + } + } + break; + default: // error + break; + } + + return data; +} + //-------------------------------------------------------------------------- // GetAsymmetryRRF (public) //-------------------------------------------------------------------------- @@ -941,6 +1054,49 @@ PRunData* PRunListCollection::GetAsymmetryRRF(UInt_t index, EDataSwitch tag) return data; } +//-------------------------------------------------------------------------- +// GetAsymmetryBNMR (public) +//-------------------------------------------------------------------------- +/** + *

Get a processed asymmetry BNMR data set. + * + * return: + * - pointer to the run data set (processed data) if data set is found + * - null pointer otherwise + * + * \param index msr-file run index + * \param tag kIndex -> data at index, kRunNo -> data of given run no + */ +PRunData* PRunListCollection::GetAsymmetryBNMR(UInt_t index, EDataSwitch tag) +{ + PRunData *data = 0; + + switch (tag) { + case kIndex: // called from musrfit when dumping the data + if (index > fRunAsymmetryBNMRList.size()) { + cerr << endl << ">> PRunListCollection::GetAsymmetryBNMR(): **ERROR** index = " << index << " out of bounds"; + cerr << endl; + return 0; + } + + fRunAsymmetryBNMRList[index]->CalcTheory(); + data = fRunAsymmetryBNMRList[index]->GetData(); + break; + case kRunNo: // called from PMusrCanvas + for (UInt_t i=0; iGetRunNo() == index) { + data = fRunAsymmetryBNMRList[i]->GetData(); + break; + } + } + break; + default: // error + break; + } + + return data; +} + //-------------------------------------------------------------------------- // GetMuMinus (public) //-------------------------------------------------------------------------- diff --git a/src/include/PMusr.h b/src/include/PMusr.h index 44321518..0d9414ef 100644 --- a/src/include/PMusr.h +++ b/src/include/PMusr.h @@ -58,6 +58,7 @@ #define PRUN_ASYMMETRY 2 #define PRUN_ASYMMETRY_RRF 3 #define PRUN_MU_MINUS 4 +#define PRUN_ASYMMETRY_BNMR 5 #define PRUN_NON_MUSR 8 // muon life time in (us), see PRL99, 032001 (2007) @@ -100,6 +101,7 @@ #define MSR_FITTYPE_ASYM 2 #define MSR_FITTYPE_ASYM_RRF 3 #define MSR_FITTYPE_MU_MINUS 4 +#define MSR_FITTYPE_BNMR 5 #define MSR_FITTYPE_NON_MUSR 8 //------------------------------------------------------------- @@ -109,6 +111,7 @@ #define MSR_PLOT_ASYM 2 #define MSR_PLOT_ASYM_RRF 3 #define MSR_PLOT_MU_MINUS 4 +#define MSR_PLOT_BNMR 5 #define MSR_PLOT_NON_MUSR 8 //------------------------------------------------------------- diff --git a/src/include/PRunListCollection.h b/src/include/PRunListCollection.h index c6c8e89c..7d969e37 100644 --- a/src/include/PRunListCollection.h +++ b/src/include/PRunListCollection.h @@ -39,6 +39,7 @@ #include "PRunSingleHistoRRF.h" #include "PRunAsymmetry.h" #include "PRunAsymmetryRRF.h" +#include "PRunAsymmetryBNMR.h" #include "PRunMuMinus.h" #include "PRunNonMusr.h" @@ -62,6 +63,7 @@ class PRunListCollection virtual Double_t GetSingleHistoRRFChisq(const std::vector& par) const; virtual Double_t GetAsymmetryChisq(const std::vector& par) const; virtual Double_t GetAsymmetryRRFChisq(const std::vector& par) const; + virtual Double_t GetAsymmetryBNMRChisq(const std::vector& par) const; virtual Double_t GetMuMinusChisq(const std::vector& par) const; virtual Double_t GetNonMusrChisq(const std::vector& par) const; @@ -72,6 +74,7 @@ class PRunListCollection virtual Double_t GetSingleHistoRRFMaximumLikelihood(const std::vector& par) const; virtual Double_t GetAsymmetryMaximumLikelihood(const std::vector& par) const; virtual Double_t GetAsymmetryRRFMaximumLikelihood(const std::vector& par) const; + virtual Double_t GetAsymmetryBNMRMaximumLikelihood(const std::vector& par) const; virtual Double_t GetMuMinusMaximumLikelihood(const std::vector& par) const; virtual Double_t GetNonMusrMaximumLikelihood(const std::vector& par) const; @@ -85,6 +88,7 @@ class PRunListCollection virtual UInt_t GetNoOfSingleHistoRRF() const { return fRunSingleHistoRRFList.size(); } ///< returns the number of single histogram RRF data sets present in the msr-file virtual UInt_t GetNoOfAsymmetry() const { return fRunAsymmetryList.size(); } ///< returns the number of asymmetry data sets present in the msr-file virtual UInt_t GetNoOfAsymmetryRRF() const { return fRunAsymmetryRRFList.size(); } ///< returns the number of asymmetry RRF data sets present in the msr-file + virtual UInt_t GetNoOfAsymmetryBNMR() const { return fRunAsymmetryBNMRList.size(); } ///< returns the number of asymmetry BNMR data sets present in the msr-file virtual UInt_t GetNoOfMuMinus() const { return fRunMuMinusList.size(); } ///< returns the number of mu minus data sets present in the msr-file virtual UInt_t GetNoOfNonMusr() const { return fRunNonMusrList.size(); } ///< returns the number of non-muSR data sets present in the msr-file @@ -92,6 +96,7 @@ class PRunListCollection virtual PRunData* GetSingleHistoRRF(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetAsymmetry(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetAsymmetryRRF(UInt_t index, EDataSwitch tag=kIndex); + virtual PRunData* GetAsymmetryBNMR(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetMuMinus(UInt_t index, EDataSwitch tag=kIndex); virtual PRunData* GetNonMusr(UInt_t index, EDataSwitch tag=kIndex); @@ -106,12 +111,13 @@ class PRunListCollection PMsrHandler *fMsrInfo; ///< pointer to the msr-file handler PRunDataHandler *fData; ///< pointer to the run-data handler - std::vector fRunSingleHistoList; ///< stores all processed single histogram data - std::vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data - std::vector fRunAsymmetryList; ///< stores all processed asymmetry data - std::vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data - std::vector fRunMuMinusList; ///< stores all processed mu-minus data - std::vector fRunNonMusrList; ///< stores all processed non-muSR data + vector fRunSingleHistoList; ///< stores all processed single histogram data + vector fRunSingleHistoRRFList; ///< stores all processed single histogram RRF data + vector fRunAsymmetryList; ///< stores all processed asymmetry data + vector fRunAsymmetryRRFList; ///< stores all processed asymmetry RRF data + vector fRunAsymmetryBNMRList; ///< stores all processed asymmetry BNMR data + vector fRunMuMinusList; ///< stores all processed mu-minus data + vector fRunNonMusrList; ///< stores all processed non-muSR data }; #endif // _PRUNLISTCOLLECTION_H_