(i) add PRINT_LEVEL to the command block (0='nothing' to
3='everything'). This allows to tune the Minuit2 output. (ii) added the possibilty to give the fit range in bins. For details see the docu.
This commit is contained in:
@ -58,6 +58,12 @@ PRunSingleHisto::PRunSingleHisto() : PRunBase()
|
||||
{
|
||||
fScaleN0AndBkg = true;
|
||||
fNoOfFitBins = 0;
|
||||
fBackground = 0;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
fGoodBins[0] = -1;
|
||||
fGoodBins[1] = -1;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
@ -76,6 +82,11 @@ PRunSingleHisto::PRunSingleHisto(PMsrHandler *msrInfo, PRunDataHandler *rawData,
|
||||
fScaleN0AndBkg = IsScaleN0AndBkg();
|
||||
fNoOfFitBins = 0;
|
||||
|
||||
// the 2 following variables are need in case fit range is given in bins, and since
|
||||
// the fit range can be changed in the command block, these variables need to be accessible
|
||||
fGoodBins[0] = -1;
|
||||
fGoodBins[1] = -1;
|
||||
|
||||
if (!PrepareData()) {
|
||||
cerr << endl << ">> PRunSingleHisto::PRunSingleHisto: **SEVERE ERROR**: Couldn't prepare data for fitting!";
|
||||
cerr << endl << ">> This is very bad :-(, will quit ...";
|
||||
@ -461,7 +472,97 @@ UInt_t PRunSingleHisto::GetNoOfFitBins()
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (private)
|
||||
// SetFitRangeBin (public)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Allows to change the fit range on the fly. Used in the COMMAND block.
|
||||
* The syntax of the string is: FIT_RANGE fgb[+n00] lgb[-n01] [fgb[+n10] lgb[-n11] ... fgb[+nN0] lgb[-nN1]].
|
||||
* If only one pair of fgb/lgb is given, it is used for all runs in the RUN block section.
|
||||
* If multiple fgb/lgb's are given, the number N has to be the number of RUN blocks in
|
||||
* the msr-file.
|
||||
*
|
||||
* <p>nXY are offsets which can be used to shift, limit the fit range.
|
||||
*
|
||||
* \param fitRange string containing the necessary information.
|
||||
*/
|
||||
void PRunSingleHisto::SetFitRangeBin(const TString fitRange)
|
||||
{
|
||||
TObjArray *tok = 0;
|
||||
TObjString *ostr = 0;
|
||||
TString str;
|
||||
Ssiz_t idx = -1;
|
||||
Int_t offset = 0;
|
||||
|
||||
tok = fitRange.Tokenize(" \t");
|
||||
|
||||
if (tok->GetEntries() == 3) { // structure FIT_RANGE fgb+n0 lgb-n1
|
||||
// handle fgb+n0 entry
|
||||
ostr = (TObjString*) tok->At(1);
|
||||
str = ostr->GetString();
|
||||
// check if there is an offset present
|
||||
idx = str.First("+");
|
||||
if (idx != -1) { // offset present
|
||||
str.Remove(0, idx+1);
|
||||
if (str.IsFloat()) // if str is a valid number, convert is to an integer
|
||||
offset = str.Atoi();
|
||||
}
|
||||
fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution;
|
||||
|
||||
// handle lgb-n1 entry
|
||||
ostr = (TObjString*) tok->At(2);
|
||||
str = ostr->GetString();
|
||||
// check if there is an offset present
|
||||
idx = str.First("-");
|
||||
if (idx != -1) { // offset present
|
||||
str.Remove(0, idx+1);
|
||||
if (str.IsFloat()) // if str is a valid number, convert is to an integer
|
||||
offset = str.Atoi();
|
||||
}
|
||||
fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution;
|
||||
} else if ((tok->GetEntries() > 3) && (tok->GetEntries() % 2 == 1)) { // structure FIT_RANGE fgb[+n00] lgb[-n01] [fgb[+n10] lgb[-n11] ... fgb[+nN0] lgb[-nN1]]
|
||||
Int_t pos = 2*(fRunNo+1)-1;
|
||||
|
||||
if (pos + 1 >= tok->GetEntries()) {
|
||||
cerr << endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'";
|
||||
cerr << endl << ">> will ignore it. Sorry ..." << endl;
|
||||
} else {
|
||||
// handle fgb+n0 entry
|
||||
ostr = (TObjString*) tok->At(pos);
|
||||
str = ostr->GetString();
|
||||
// check if there is an offset present
|
||||
idx = str.First("+");
|
||||
if (idx != -1) { // offset present
|
||||
str.Remove(0, idx+1);
|
||||
if (str.IsFloat()) // if str is a valid number, convert is to an integer
|
||||
offset = str.Atoi();
|
||||
}
|
||||
fFitStartTime = (fGoodBins[0] + offset - fT0s[0]) * fTimeResolution;
|
||||
|
||||
// handle lgb-n1 entry
|
||||
ostr = (TObjString*) tok->At(pos+1);
|
||||
str = ostr->GetString();
|
||||
// check if there is an offset present
|
||||
idx = str.First("-");
|
||||
if (idx != -1) { // offset present
|
||||
str.Remove(0, idx+1);
|
||||
if (str.IsFloat()) // if str is a valid number, convert is to an integer
|
||||
offset = str.Atoi();
|
||||
}
|
||||
fFitEndTime = (fGoodBins[1] - offset - fT0s[0]) * fTimeResolution;
|
||||
}
|
||||
} else { // error
|
||||
cerr << endl << ">> PRunSingleHisto::SetFitRangeBin(): **ERROR** invalid FIT_RANGE command found: '" << fitRange << "'";
|
||||
cerr << endl << ">> will ignore it. Sorry ..." << endl;
|
||||
}
|
||||
|
||||
// clean up
|
||||
if (tok) {
|
||||
delete tok;
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// CalcNoOfFitBins (protected)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Calculate the number of fitted bins for the current fit range.
|
||||
@ -483,7 +584,7 @@ void PRunSingleHisto::CalcNoOfFitBins()
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// PrepareData (private)
|
||||
// PrepareData (protected)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Prepare data for fitting or viewing. What is already processed at this stage:
|
||||
@ -653,7 +754,7 @@ Bool_t PRunSingleHisto::PrepareData()
|
||||
}
|
||||
}
|
||||
|
||||
// set forward/backward histo data of the first group
|
||||
// set forward histo data of the first group
|
||||
fForward.resize(forward[0].size());
|
||||
for (UInt_t i=0; i<fForward.size(); i++) {
|
||||
fForward[i] = forward[0][i];
|
||||
@ -690,7 +791,7 @@ Bool_t PRunSingleHisto::PrepareData()
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// PrepareFitData (private)
|
||||
// PrepareFitData (protected)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Take the pre-processed data (i.e. grouping and addrun are preformed) and form the histogram for fitting.
|
||||
@ -754,6 +855,20 @@ Bool_t PRunSingleHisto::PrepareFitData(PRawRunData* runData, const UInt_t histoN
|
||||
return false;
|
||||
}
|
||||
|
||||
// keep good bins for potential latter use
|
||||
fGoodBins[0] = start;
|
||||
fGoodBins[1] = end;
|
||||
|
||||
// if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now
|
||||
if (fRunInfo->IsFitRangeInBin()) {
|
||||
fFitStartTime = (fRunInfo->GetDataRange(0) + fRunInfo->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt
|
||||
fFitEndTime = (fRunInfo->GetDataRange(1) - fRunInfo->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt
|
||||
// write these times back into the data structure. This way it is available when writting the log-file
|
||||
fRunInfo->SetFitRange(fFitStartTime, 0);
|
||||
fRunInfo->SetFitRange(fFitEndTime, 1);
|
||||
cout << "debug> fit: " << fRunInfo->GetFitRange(0) << ", " << fRunInfo->GetFitRange(1) << end;
|
||||
}
|
||||
|
||||
// check how the background shall be handled
|
||||
if (fRunInfo->GetBkgFitParamNo() == -1) { // bkg shall **NOT** be fitted
|
||||
// subtract background from histogramms ------------------------------------------
|
||||
@ -820,7 +935,7 @@ Bool_t PRunSingleHisto::PrepareFitData(PRawRunData* runData, const UInt_t histoN
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// PrepareRawViewData (private)
|
||||
// PrepareRawViewData (protected)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Take the pre-processed data (i.e. grouping and addrun are preformed) and form the histogram for viewing
|
||||
@ -888,6 +1003,12 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi
|
||||
return false;
|
||||
}
|
||||
|
||||
// if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now
|
||||
if (fRunInfo->IsFitRangeInBin()) {
|
||||
fFitStartTime = (fRunInfo->GetDataRange(0) + fRunInfo->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt
|
||||
fFitEndTime = (fRunInfo->GetDataRange(1) - fRunInfo->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt
|
||||
}
|
||||
|
||||
// everything looks fine, hence fill data set
|
||||
Int_t t0 = (Int_t)fT0s[0];
|
||||
Double_t value = 0.0;
|
||||
@ -997,7 +1118,7 @@ Bool_t PRunSingleHisto::PrepareRawViewData(PRawRunData* runData, const UInt_t hi
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// PrepareViewData (private)
|
||||
// PrepareViewData (protected)
|
||||
//--------------------------------------------------------------------------
|
||||
/**
|
||||
* <p>Take the pre-processed data (i.e. grouping and addrun are preformed) and form the histogram for viewing
|
||||
@ -1085,6 +1206,12 @@ Bool_t PRunSingleHisto::PrepareViewData(PRawRunData* runData, const UInt_t histo
|
||||
return false;
|
||||
}
|
||||
|
||||
// if fit range is given in bins (and not time), the fit start/end time can be calculated at this point now
|
||||
if (fRunInfo->IsFitRangeInBin()) {
|
||||
fFitStartTime = (fRunInfo->GetDataRange(0) + fRunInfo->GetFitRangeOffset(0) - fT0s[0]) * fTimeResolution; // (fgb+n0-t0)*dt
|
||||
fFitEndTime = (fRunInfo->GetDataRange(1) - fRunInfo->GetFitRangeOffset(1) - fT0s[0]) * fTimeResolution; // (lgb-n1-t0)*dt
|
||||
}
|
||||
|
||||
// everything looks fine, hence fill data set
|
||||
|
||||
// feed the parameter vector
|
||||
|
Reference in New Issue
Block a user