added skeleton for some additional PLOT block commands. No functionality yet.

This commit is contained in:
nemu 2009-05-28 08:49:42 +00:00
parent 80d0579ec6
commit f287ef666c
7 changed files with 198 additions and 63 deletions

View File

@ -120,5 +120,5 @@ $(OBJS): %.o: %.cpp
$(CXX) $(INCLUDES) $(CXXFLAGS) -c $<
install: all
cp -p $(EXEC) $(INSTALLPATH)
cp -p musrfit_startup.xml $(INSTALLPATH)
cp -fp $(EXEC) $(INSTALLPATH)
cp -fp musrfit_startup.xml $(INSTALLPATH)

View File

@ -796,9 +796,9 @@ int PMsrHandler::WriteMsrLogFile(const bool messages)
} else if (sstr.BeginsWith("range")) {
fout << "range ";
fout.precision(2);
fout << fPlots[plotNo].fTmin << " " << fPlots[plotNo].fTmax;
if (fPlots[plotNo].fYmin != -999.0) {
fout << " " << fPlots[plotNo].fYmin << " " << fPlots[plotNo].fYmax;
fout << fPlots[plotNo].fTmin[0] << " " << fPlots[plotNo].fTmax[0];
if (fPlots[plotNo].fYmin.size() > 0) {
fout << " " << fPlots[plotNo].fYmin[0] << " " << fPlots[plotNo].fYmax[0];
}
fout << endl;
} else {
@ -2234,10 +2234,10 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
// initialize param structure
param.fPlotType = -1;
param.fTmin = -999.0;
param.fTmax = -999.0;
param.fYmin = -999.0;
param.fYmax = -999.0;
param.fUseFitRanges = false; // i.e. if not overwritten use the range info of the plot block
param.fLogX = false; // i.e. if not overwritten use linear x-axis
param.fLogY = false; // i.e. if not overwritten use linear y-axis
param.fViewPacking = -1; // i.e. if not overwritten use the packing of the run blocks
// find next plot if any is present
iter2 = iter1;
@ -2272,9 +2272,7 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
delete tokens;
tokens = 0;
}
}
if (iter1->fLine.Contains("runs")) { // handle plot runs
} else if (iter1->fLine.Contains("runs", TString::kIgnoreCase)) { // handle plot runs
TComplex run;
switch (param.fPlotType) {
case -1:
@ -2353,9 +2351,13 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
error = true;
break;
}
}
} else if (iter1->fLine.Contains("range ", TString::kIgnoreCase)) { // handle plot range
// remove previous entries
param.fTmin.clear();
param.fTmax.clear();
param.fYmin.clear();
param.fYmax.clear();
if (iter1->fLine.Contains("range")) { // handle plot range
tokens = iter1->fLine.Tokenize(" \t");
if (!tokens) {
cout << endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
@ -2370,7 +2372,7 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
ostr = dynamic_cast<TObjString*>(tokens->At(1));
str = ostr->GetString();
if (str.IsFloat())
param.fTmin = (double)str.Atof();
param.fTmin.push_back((double)str.Atof());
else
error = true;
@ -2378,7 +2380,7 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
ostr = dynamic_cast<TObjString*>(tokens->At(2));
str = ostr->GetString();
if (str.IsFloat())
param.fTmax = (double)str.Atof();
param.fTmax.push_back((double)str.Atof());
else
error = true;
@ -2388,7 +2390,7 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
ostr = dynamic_cast<TObjString*>(tokens->At(3));
str = ostr->GetString();
if (str.IsFloat())
param.fYmin = (double)str.Atof();
param.fYmin.push_back((double)str.Atof());
else
error = true;
@ -2396,7 +2398,7 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
ostr = dynamic_cast<TObjString*>(tokens->At(4));
str = ostr->GetString();
if (str.IsFloat())
param.fYmax = (double)str.Atof();
param.fYmax.push_back((double)str.Atof());
else
error = true;
}
@ -2406,6 +2408,117 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
delete tokens;
tokens = 0;
}
} else if (iter1->fLine.Contains("sub_ranges", TString::kIgnoreCase)) {
// remove previous entries
param.fTmin.clear();
param.fTmax.clear();
param.fYmin.clear();
param.fYmax.clear();
tokens = iter1->fLine.Tokenize(" \t");
if (!tokens) {
cout << endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
cout << endl << endl;
return false;
}
if ((tokens->GetEntries() != (int)(2*param.fRuns.size() + 1)) && (tokens->GetEntries() != (int)(2*param.fRuns.size() + 3))) {
error = true;
} else {
// get all the times
for (unsigned int i=0; i<param.fRuns.size(); i++) {
// handle t_min
ostr = dynamic_cast<TObjString*>(tokens->At(2*i+1));
str = ostr->GetString();
if (str.IsFloat())
param.fTmin.push_back((double)str.Atof());
else
error = true;
// handle t_max
ostr = dynamic_cast<TObjString*>(tokens->At(2*i+2));
str = ostr->GetString();
if (str.IsFloat())
param.fTmax.push_back((double)str.Atof());
else
error = true;
}
// get y-range if present
if (tokens->GetEntries() == (int)(2*param.fRuns.size() + 3)) {
// handle y_min
ostr = dynamic_cast<TObjString*>(tokens->At(2*param.fRuns.size()+1));
str = ostr->GetString();
if (str.IsFloat())
param.fYmin.push_back((double)str.Atof());
else
error = true;
// handle y_max
ostr = dynamic_cast<TObjString*>(tokens->At(2*param.fRuns.size()+2));
str = ostr->GetString();
if (str.IsFloat())
param.fYmax.push_back((double)str.Atof());
else
error = true;
}
}
// clean up
if (tokens) {
delete tokens;
tokens = 0;
}
cout << endl << ">> PMsrHandler::HandlePlotEntry(): will eventually handle sub_ranges ..." << endl;
cout << endl << ">> time ranges: ";
for (unsigned int i=0; i<param.fTmin.size(); i++) {
cout << param.fTmin[i] << ", " << param.fTmax[i] << " / ";
}
if (param.fYmin.size() > 0) {
cout << endl << " >> y-range: " << param.fYmin[0] << ", " << param.fYmax[0];
}
cout << endl;
} else if (iter1->fLine.Contains("use_fit_ranges", TString::kIgnoreCase)) {
param.fUseFitRanges = true;
cout << endl << ">> PMsrHandler::HandlePlotEntry(): will eventually use fit ranges for plotting ..." << endl;
} else if (iter1->fLine.Contains("logx", TString::kIgnoreCase)) {
param.fLogX = true;
cout << endl << ">> PMsrHandler::HandlePlotEntry(): will eventually plot log x-axis ..." << endl;
} else if (iter1->fLine.Contains("logy", TString::kIgnoreCase)) {
param.fLogY = true;
cout << endl << ">> PMsrHandler::HandlePlotEntry(): will eventually plot log y-axis ..." << endl;
} else if (iter1->fLine.Contains("view_packing", TString::kIgnoreCase)) {
tokens = iter1->fLine.Tokenize(" \t");
if (!tokens) {
cout << endl << ">> PMsrHandler::HandlePlotEntry: **SEVERE ERROR** Couldn't tokenize PLOT in line " << iter1->fLineNo;
cout << endl << endl;
return false;
}
if (tokens->GetEntries() != 2) {
error = true;
} else {
ostr = dynamic_cast<TObjString*>(tokens->At(1));
str = ostr->GetString();
if (str.IsDigit()) {
int val = str.Atoi();
if (val > 0)
param.fViewPacking = val;
else
error = true;
} else {
error = true;
}
}
cout << endl << ">> PMsrHandler::HandlePlotEntry(): will eventually handle view_packing = " << param.fViewPacking << endl;
// clean up
if (tokens) {
delete tokens;
tokens = 0;
}
} else {
error = true;
}
++iter1;
@ -2413,23 +2526,28 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
}
// analyze if the plot block is valid
double keep;
if (!error) {
if (param.fRuns.empty()) { // there was no run tag
error = true;
} else { // everything ok
if ((param.fTmin != -999.0) || (param.fTmax != -999.0)) { // if range is given, check that it is ordered properly
if (param.fTmin > param.fTmax) {
double keep = param.fTmin;
param.fTmin = param.fTmax;
param.fTmax = keep;
if ((param.fTmin.size() > 0) || (param.fTmax.size() > 0)) { // if range is given, check that it is ordered properly
for (unsigned int i=0; i<param.fTmin.size(); i++) {
if (param.fTmin[i] > param.fTmax[i]) {
keep = param.fTmin[i];
param.fTmin[i] = param.fTmax[i];
param.fTmax[i] = keep;
}
}
}
if ((param.fYmin != -999.0) || (param.fYmax != -999.0)) { // if range is given, check that it is ordered properly
if (param.fYmin > param.fYmax) {
double keep = param.fYmin;
param.fYmin = param.fYmax;
param.fYmax = keep;
if ((param.fYmin.size() > 0) || (param.fYmax.size() > 0)) { // if range is given, check that it is ordered properly
for (unsigned int i=0; i<param.fYmin.size(); i++) {
if (param.fYmin[i] > param.fYmax[i]) {
keep = param.fYmin[i];
param.fYmin[i] = param.fYmax[i];
param.fYmax[i] = keep;
}
}
}
@ -2445,6 +2563,10 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
cout << endl << "PLOT <plot_type>";
cout << endl << "runs <run_list>";
cout << endl << "[range tmin tmax [ymin ymax]]";
cout << endl << "[sub_ranges tmin1 tmax1 tmin2 tmax2 ... tminN tmaxN [ymin ymax]";
cout << endl << "[logx | logy]";
cout << endl << "[use_fit_ranges]";
cout << endl << "[view_packing n]";
cout << endl;
cout << endl << "where <plot_type> is: 0=single histo asym,";
cout << endl << " 2=forward-backward asym,";
@ -2457,6 +2579,11 @@ bool PMsrHandler::HandlePlotEntry(PMsrLines &lines)
cout << endl << " imaginary one is 1=real part or 2=imag part, e.g.";
cout << endl << " runs 1,1 1,2";
cout << endl << "range is optional";
cout << endl << "sub_ranges (if present) will plot the N given runs each on its own sub-range";
cout << endl << "logx, logy (if present) will present the x-, y-axis in log-scale";
cout << endl << "use_fit_ranges (if present) will plot each run on its fit-range";
cout << endl << "view_packing n (if present) will bin all data by n (> 0) rather than the binning of the fit";
cout << endl;
}
param.fRuns.clear();

View File

@ -2202,15 +2202,17 @@ void PMusrCanvas::PlotData()
if (fPlotType != MSR_PLOT_NON_MUSR) {
if (fData.size() > 0) {
fData[0].data->Draw("pe");
// set time range
Double_t xmin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin;
Double_t xmax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax;
fData[0].data->GetXaxis()->SetRangeUser(xmin, xmax);
// check if it is necessary to set the y-axis range
Double_t ymin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmin;
Double_t ymax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmax;
if ((ymin != -999.0) && (ymax != -999.0)) {
fData[0].data->GetYaxis()->SetRangeUser(ymin, ymax);
// set time range if present
if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() > 0) {
Double_t xmin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[0];
Double_t xmax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[0];
fData[0].data->GetXaxis()->SetRangeUser(xmin, xmax);
// check if it is necessary to set the y-axis range
if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmin.size() > 0) {
Double_t ymin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmin[0];
Double_t ymax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmax[0];
fData[0].data->GetYaxis()->SetRangeUser(ymin, ymax);
}
}
// set x-axis label
fData[0].data->GetXaxis()->SetTitle("time (#mus)");
@ -2276,16 +2278,18 @@ void PMusrCanvas::PlotData()
fMultiGraphData->Draw("a");
// set x-range
Double_t xmin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin;
Double_t xmax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax;
fMultiGraphData->GetXaxis()->SetRangeUser(xmin, xmax);
// check if it is necessary to set the y-axis range
Double_t ymin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmin;
Double_t ymax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmax;
if ((ymin != -999.0) && (ymax != -999.0)) {
fMultiGraphData->GetYaxis()->SetRangeUser(ymin, ymax);
} else {
fMultiGraphData->GetYaxis()->UnZoom();
if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin.size() > 0) {
Double_t xmin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmin[0];
Double_t xmax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fTmax[0];
fMultiGraphData->GetXaxis()->SetRangeUser(xmin, xmax);
// check if it is necessary to set the y-axis range
if (fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmin.size() > 0) {
Double_t ymin = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmin[0];
Double_t ymax = fMsrHandler->GetMsrPlotList()->at(fPlotNumber).fYmax[0];
fMultiGraphData->GetYaxis()->SetRangeUser(ymin, ymax);
} else {
fMultiGraphData->GetYaxis()->UnZoom();
}
}
// set x-, y-axis label only if there is just one data set

View File

@ -338,7 +338,7 @@ PRunData* PRunListCollection::GetAsymmetry(unsigned int index, EDataSwitch tag)
PRunData *data = 0;
switch (tag) {
case kIndex:
case kIndex: // called from musrfit when dumping the data
if ((index < 0) || (index > fRunAsymmetryList.size())) {
cout << endl << "PRunListCollection::GetAsymmetry: index = " << index << " out of bounds";
return 0;
@ -347,7 +347,7 @@ PRunData* PRunListCollection::GetAsymmetry(unsigned int index, EDataSwitch tag)
fRunAsymmetryList[index]->CalcTheory();
data = fRunAsymmetryList[index]->GetData();
break;
case kRunNo:
case kRunNo: // called from PMusrCanvas
for (unsigned int i=0; i<fRunAsymmetryList.size(); i++) {
if (fRunAsymmetryList[i]->GetRunNo() == index) {
data = fRunAsymmetryList[i]->GetData();

View File

@ -317,15 +317,15 @@ bool PRunNonMusr::PrepareViewData()
if (fRunNo == plotBlock.fRuns[j].Re()-1) { // run found
if (first) {
first = false;
xMin = plotBlock.fTmin;
xMax = plotBlock.fTmax;
xMin = plotBlock.fTmin[0];
xMax = plotBlock.fTmax[0];
xAbsMin = xMin;
xAbsMax = xMax;
// cout << endl << ">> first: xMin=" << xMin << ", xMax=" << xMax << endl;
} else {
if (fabs(xMax-xMin) > fabs(plotBlock.fTmax-plotBlock.fTmin)) {
xMin = plotBlock.fTmin;
xMax = plotBlock.fTmax;
if (fabs(xMax-xMin) > fabs(plotBlock.fTmax[0]-plotBlock.fTmin[0])) {
xMin = plotBlock.fTmin[0];
xMax = plotBlock.fTmax[0];
}
if (xMin < xAbsMin)
xAbsMin = xMin;

View File

@ -301,11 +301,15 @@ typedef struct {
*/
typedef struct {
int fPlotType; ///< plot type
bool fUseFitRanges; ///< yes -> use the fit ranges to plot the data, no (default) -> use range information if present
bool fLogX; ///< yes -> x-axis in log-scale, no (default) -> x-axis in lin-scale
bool fLogY; ///< yes -> y-axis in log-scale, no (default) -> y-axis in lin-scale
int fViewPacking; ///< -1 -> use the run packing to generate the view, otherwise is fViewPacking for the binning of ALL runs.
PComplexVector fRuns; ///< list of runs to be plotted
double fTmin; ///< time minimum
double fTmax; ///< time maximum
double fYmin; ///< asymmetry/counts minimum
double fYmax; ///< asymmetry/counts maximum
PDoubleVector fTmin; ///< time minimum
PDoubleVector fTmax; ///< time maximum
PDoubleVector fYmin; ///< asymmetry/counts minimum
PDoubleVector fYmax; ///< asymmetry/counts maximum
} PMsrPlotStructure;
//-------------------------------------------------------------

View File

@ -42,11 +42,11 @@ void skewedGaussian()
char fln[256];
const Double_t w = 1.0; // weight of the skewed Gaussian
const Double_t B0 = 30.0; // skewed Gaussian B0 (G)
const Double_t sm = 2.0; // skewed Gaussian sigma- (G)
const Double_t sp = 2.0; // skewed Gaussian sigma+ (G)
const Double_t B0 = 1000.0; // skewed Gaussian B0 (G)
const Double_t sm = 5.0; // skewed Gaussian sigma- (G)
const Double_t sp = 5.0; // skewed Gaussian sigma+ (G)
const Double_t B0ext = 30.0; // external field Gaussian B0 (G)
const Double_t B0ext = 1000.0; // external field Gaussian B0 (G)
const Double_t sext = 10; // external field Gaussian sigma (G)
sprintf(fln, "skewedGauss-B%0.2lf-sm%0.2lf-sp%0.2lf-w%0.1lf-Bext%0.2lf-sext%0.2lf.dat",
@ -54,7 +54,7 @@ void skewedGaussian()
const Int_t noOfPoints = 8000;
const Double_t res = 0.1;
const Double_t res = 0.25;
fp = fopen(fln, "w");