From 4cb6aa2ec955854f760f85095a9b26d7ac9ae0fe Mon Sep 17 00:00:00 2001 From: nemu Date: Wed, 25 Mar 2009 08:08:48 +0000 Subject: [PATCH] initial skeleton of musrt0, not functional yet --- src/Makefile.musrt0 | 102 ++++++++++++ src/classes/Makefile.PMusr | 5 + src/classes/PMusrT0.cpp | 139 ++++++++++++++++ src/include/PMusrT0.h | 65 ++++++++ src/include/PMusrT0LinkDef.h | 41 +++++ src/musrt0.cpp | 314 +++++++++++++++++++++++++++++++++++ 6 files changed, 666 insertions(+) create mode 100644 src/Makefile.musrt0 create mode 100644 src/classes/PMusrT0.cpp create mode 100644 src/include/PMusrT0.h create mode 100644 src/include/PMusrT0LinkDef.h create mode 100644 src/musrt0.cpp diff --git a/src/Makefile.musrt0 b/src/Makefile.musrt0 new file mode 100644 index 00000000..43da007b --- /dev/null +++ b/src/Makefile.musrt0 @@ -0,0 +1,102 @@ +#--------------------------------------------------- +# Makefile.musrt0 +# +# Author: Andreas Suter +# e-mail: andreas.suter@psi.ch +# +# $Id$ +#--------------------------------------------------- + +#--------------------------------------------------- +# get compilation and library flags from root-config + +ROOTCFLAGS = $(shell $(ROOTSYS)/bin/root-config --cflags) +ROOTLIBS = $(shell $(ROOTSYS)/bin/root-config --libs) +ROOTGLIBS = $(shell $(ROOTSYS)/bin/root-config --glibs) + +#--------------------------------------------------- +# depending on the architecture, choose the compiler, +# linker, and the flags to use +# + +OSTYPE = linux + +ifeq ($(OSTYPE),linux) +OS = LINUX +endif +ifeq ($(OSTYPE),linux-gnu) +OS = LINUX +endif +ifeq ($(OSTYPE),darwin) +OS = DARWIN +endif + +# -- Linux +ifeq ($(OS),LINUX) +CXX = g++ +CXXFLAGS = -g -Wall -fPIC +PMUSRPATH = ./include +MNPATH = $(ROOTSYS)/include +#GSLPATH = /usr/include/gsl +INCLUDES = -I $(PMUSRPATH) -I $(MNPATH) +LD = g++ +LDFLAGS = -g +endif + +# -- Darwin +ifeq ($(OS),DARWIN) +CXX = g++ +CXXFLAGS = -g -Wall -fPIC +INCLUDES = -I../include +LD = g++ +LDFLAGS = -g +endif + +# the output from the root-config script: +CXXFLAGS += $(ROOTCFLAGS) +LDFLAGS += + +# the ROOT libraries (G = graphic) +LIBS = $(ROOTLIBS) -lXMLParser +GLIBS = $(ROOTGLIBS) -lXMLParser + +# PSI libs +PSILIBS = -lTLemRunHeader -lPMusr +# Minuit2 lib +MNLIB = -L$(ROOTSYS)/lib -lMinuit2 +# MathMore lib +MMLIB = -L$(ROOTSYS)/lib -lMathMore + +INSTALLPATH = $(HOME)/analysis/bin + +EXEC = musrt0 + +# some definitions: headers, sources, objects,... +OBJS = +OBJS += $(EXEC).o + +# make the executable: +# +all: $(EXEC) + +$(EXEC): $(OBJS) + @echo "---> Building $(EXEC) ..." + /bin/rm -f $(SHLIB) + $(LD) $(OBJS) -o $(EXEC) $(GLIBS) $(PSILIBS) $(MNLIB) $(MMLIB) + @echo "done" + +# clean up: remove all object file (and core files) +# semicolon needed to tell make there is no source +# for this target! +# +clean:; @rm -f $(OBJS) + @echo "---> removing $(OBJS)" + +# +$(OBJS): %.o: %.cpp + $(CXX) $(INCLUDES) $(CXXFLAGS) -c $< + +install: all + @echo "copy $(EXEC) to $(INSTALLPATH)" + cp -p $(EXEC) $(INSTALLPATH) + diff --git a/src/classes/Makefile.PMusr b/src/classes/Makefile.PMusr index 75f00df7..b1e576a0 100644 --- a/src/classes/Makefile.PMusr +++ b/src/classes/Makefile.PMusr @@ -101,6 +101,7 @@ OBJS += PFitter.o OBJS += PMusrCanvas.o PMusrCanvasDict.o OBJS += PUserFcnBase.o PUserFcnBaseDict.o OBJS += PFourier.o +OBJS += PMusrT0.o PMusrT0Dict.o EXTOBJS = EXTOBJS += MuSR_td_PSI_bin.o @@ -139,6 +140,10 @@ PMusrCanvasDict.cpp: ../include/PMusrCanvas.h ../include/PMusrCanvasLinkDef.h @echo "Generating dictionary $@..." rootcint -v -f $@ -c -p $^ +PMusrT0Dict.cpp: ../include/PMusrT0.h ../include/PMusrT0LinkDef.h + @echo "Generating dictionary $@..." + rootcint -v -f $@ -c -p $^ + PUserFcnBaseDict.cpp: ../include/PUserFcnBase.h ../include/PUserFcnBaseLinkDef.h @echo "Generating dictionary $@..." rootcint -v -f $@ -c -p $^ diff --git a/src/classes/PMusrT0.cpp b/src/classes/PMusrT0.cpp new file mode 100644 index 00000000..b42a535b --- /dev/null +++ b/src/classes/PMusrT0.cpp @@ -0,0 +1,139 @@ +/*************************************************************************** + + PMusrT0.cpp + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + + $Id$ + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2009 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +using namespace std; + +#include +#include +#include +#include + +#include "PMusrT0.h" + +ClassImpQ(PMusrT0) + +//-------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------- +/** + * + */ +PMusrT0::PMusrT0() +{ +} + +//-------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------- +/** + * + * \param rawRunData + * \param histoNo + */ +PMusrT0::PMusrT0(PRawRunData *rawRunData, unsigned int histoNo) +{ +} + +//-------------------------------------------------------------------------- +// Destructor +//-------------------------------------------------------------------------- +/** + * + */ +PMusrT0::~PMusrT0() +{ +} + +//-------------------------------------------------------------------------- +// Done (SIGNAL) +//-------------------------------------------------------------------------- +/** + *

+ * + */ +void PMusrT0::Done(Int_t status) +{ + Emit("Done(Int_t)", status); +} + +//-------------------------------------------------------------------------- +// HandleCmdKey (SLOT) +//-------------------------------------------------------------------------- +/** + *

+ * + */ +void PMusrT0::HandleCmdKey(Int_t event, Int_t x, Int_t y, TObject *selected) +{ + if (event != kKeyPress) + return; + +// cout << ">this " << this << endl; +// cout << ">fMainCanvas " << fMainCanvas << endl; +// cout << ">selected " << selected << endl; +// +//cout << "x : " << (char)x << endl; +//cout << "px: " << (char)fMainCanvas->GetEventX() << endl; + + // handle keys and popup menu entries + if (x == 'q') { // quit + Done(0); + } else if (x == 'u') { // unzoom to the original range + cout << endl << "will unzoom ..." << endl; + } else if (x == 't') { // set t0 channel + cout << endl << "will set t0 channel ..." << endl; + } else if (x == 'b') { // set first background channel + cout << endl << "will set first background channel ..." << endl; + } else if (x == 'B') { // set last background channel + cout << endl << "will set last background channel ..." << endl; + } else if (x == 'd') { // set first data channel + cout << endl << "will set first data channel ..." << endl; + } else if (x == 'D') { // set last data channel + cout << endl << "will set last data channel ..." << endl; + } +} + +//-------------------------------------------------------------------------- +// HandleMenuPopup (SLOT) +//-------------------------------------------------------------------------- +/** + *

+ * + */ +void PMusrT0::HandleMenuPopup(Int_t id) +{ +} + +//-------------------------------------------------------------------------- +// END +//-------------------------------------------------------------------------- diff --git a/src/include/PMusrT0.h b/src/include/PMusrT0.h new file mode 100644 index 00000000..08e8efe9 --- /dev/null +++ b/src/include/PMusrT0.h @@ -0,0 +1,65 @@ +/*************************************************************************** + + PMusrT0.h + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + + $Id$ + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2009 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _PMUSRT0_H_ +#define _PMUSRT0_H_ + +#include +#include +#include +#include +#include +#include + +#include "PMusr.h" + +//-------------------------------------------------------------------------- +/** + *

The preprocessor tag __MAKECINT__ is used to hide away from rootcint + * the overly complex spirit header files. + */ +class PMusrT0 : public TObject, public TQObject +{ + public: + PMusrT0(); + PMusrT0(PRawRunData *rawRunData, unsigned int histoNo); + + virtual ~PMusrT0(); + + private: + virtual void Done(Int_t status=0); // *SIGNAL* + virtual void HandleCmdKey(Int_t event, Int_t x, Int_t y, TObject *selected); // SLOT + virtual void HandleMenuPopup(Int_t id); // SLOT + + ClassDef(PMusrT0, 1) +}; + +#endif // _PMUSRT0_H_ diff --git a/src/include/PMusrT0LinkDef.h b/src/include/PMusrT0LinkDef.h new file mode 100644 index 00000000..b9d8a144 --- /dev/null +++ b/src/include/PMusrT0LinkDef.h @@ -0,0 +1,41 @@ +/*************************************************************************** + + PMusrT0LinkDef.h + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + + $Id$ + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2007 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifdef __CINT__ + +#pragma link off all globals; +#pragma link off all classes; +#pragma link off all functions; + +#pragma link C++ class PMusrT0+; + +#endif + diff --git a/src/musrt0.cpp b/src/musrt0.cpp new file mode 100644 index 00000000..61588dc1 --- /dev/null +++ b/src/musrt0.cpp @@ -0,0 +1,314 @@ +/*************************************************************************** + + musrt0.cpp + + Author: Andreas Suter + e-mail: andreas.suter@psi.ch + + $Id$ + +***************************************************************************/ + +/*************************************************************************** + * Copyright (C) 2007 by Andreas Suter * + * andreas.suter@psi.ch * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include + +#include +using namespace std; + +#include +#include +#include + +#include "PMusr.h" +#include "PStartupHandler.h" +#include "PMsrHandler.h" +#include "PRunDataHandler.h" +#include "PMusrT0.h" + + +//-------------------------------------------------------------------------- +/** + *

+ * + */ +void musrt0_syntax() +{ + cout << endl << "usage: musrt0 | --version | --help"; + cout << endl << " : msr/mlog input file"; + cout << endl << " 'musrt0 ' will execute musrt0"; + cout << endl << " 'musrt0' or 'musrt0 --help' will show this help"; + cout << endl << " 'musrt0 --version' will print the musrt0 version"; + cout << endl << endl; +} + +//-------------------------------------------------------------------------- +int main(int argc, char *argv[]) +{ + bool show_syntax = false; + int status; + bool success = true; + + switch (argc) { + case 1: + show_syntax = true; + break; + case 2: + if (strstr(argv[1], "--version")) { + cout << endl << "musrt0 version: $Id$"; + cout << endl << endl; + return PMUSR_SUCCESS; + } else if (strstr(argv[1], "--help")) { + show_syntax = true; + } else { + // check if filename has extension msr or mlog + if (!strstr(argv[1], ".msr") && !strstr(argv[1], ".mlog")) { + cout << endl << "**ERROR** " << argv[1] << " is not a msr/mlog-file!" << endl; + show_syntax = true; + } + } + break; + default: + show_syntax = true; + } + + if (show_syntax) { + musrt0_syntax(); + return PMUSR_WRONG_STARTUP_SYNTAX; + } + + // get default path (for the moment only linux like) + char *pmusrpath; + char musrpath[128]; + pmusrpath = getenv("MUSRFITPATH"); + if (pmusrpath == 0) { // not set, will try default one + strcpy(musrpath, "/home/nemu/analysis/bin"); + cout << endl << "**WARNING** MUSRFITPATH environment variable not set will try " << musrpath << endl; + } else { + strncpy(musrpath, pmusrpath, sizeof(musrpath)); + } + + // read startup file + char startup_path_name[128]; + sprintf(startup_path_name, "%s/musrfit_startup.xml", musrpath); + TSAXParser *saxParser = new TSAXParser(); + PStartupHandler *startupHandler = new PStartupHandler(); + saxParser->ConnectToHandler("PStartupHandler", startupHandler); + status = saxParser->ParseFile(startup_path_name); + // check for parse errors + 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; + } +*/ + } + startupHandler->CheckLists(); + + // read msr-file + PMsrHandler *msrHandler = new PMsrHandler(argv[1]); + status = msrHandler->ReadMsrFile(); + if (status != PMUSR_SUCCESS) { + switch (status) { + case PMUSR_MSR_FILE_NOT_FOUND: + cout << endl << "**ERROR** couldn't find '" << argv[1] << "'" << endl << endl; + break; + case PMUSR_MSR_SYNTAX_ERROR: + cout << endl << "**SYNTAX ERROR** in file " << argv[1] << ", full stop here." << endl << endl; + break; + default: + cout << endl << "**UNKNOWN ERROR** when trying to read the msr-file" << endl << endl; + break; + } + return status; + } + + // check if the fittype is not NonMusr + PMsrRunList *runList = msrHandler->GetMsrRunList(); + for (unsigned int i=0; isize(); i++) { + if (runList->at(i).fFitType == MSR_FITTYPE_NON_MUSR) { + cout << endl << "**ERROR** t0 setting for NonMusr fittype doesn't make any sense, will quit ..." << endl; + success = false; + break; + } + } + + // read all the necessary runs (raw data) + PRunDataHandler *dataHandler; + if (success) { + if (startupHandler) + dataHandler = new PRunDataHandler(msrHandler, startupHandler->GetDataPathList()); + else + dataHandler = new PRunDataHandler(msrHandler); + + success = dataHandler->IsAllDataAvailable(); + if (!success) { + cout << endl << "**ERROR** Couldn't read all data files, will quit ..." << endl; + } + } + + + vector t0Vector; + if (success) { +/* + // generate Root application needed for PMusrCanvas + TApplication app("App", &argc, argv); +*/ + // generate vector of all necessary PMusrT0 objects + PMusrT0 *musrT0; + for (unsigned int i=0; isize(); i++) { + switch (runList->at(i).fFitType) { + case MSR_FITTYPE_SINGLE_HISTO: + for (unsigned int j=0; jat(i).fRunName.size(); j++) { // necessary in case of ADDRUN + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fForwardHistoNo); + t0Vector.push_back(musrT0); + } + break; + case MSR_FITTYPE_ASYM: + for (unsigned int j=0; jat(i).fRunName.size(); j++) { // necessary in case of ADDRUN + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fForwardHistoNo); + t0Vector.push_back(musrT0); + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fBackwardHistoNo); + t0Vector.push_back(musrT0); + } + break; + case MSR_FITTYPE_ASYM_RRF: + for (unsigned int j=0; jat(i).fRunName.size(); j++) { // necessary in case of ADDRUN + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fForwardHistoNo); + t0Vector.push_back(musrT0); + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fBackwardHistoNo); + t0Vector.push_back(musrT0); + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fRightHistoNo); + t0Vector.push_back(musrT0); + musrT0 = new PMusrT0(dataHandler->GetRunData(runList->at(i).fRunName[j]), runList->at(i).fLeftHistoNo); + t0Vector.push_back(musrT0); + } + break; + default: + break; + } + } + +/* + vector t0CanvasVector; + PMusrT0 *t0Canvas; + + bool ok = true; + for (unsigned int i=0; iGetMsrPlotList()->size(); i++) { + + if (startupHandler) + musrCanvas = new PMusrCanvas(i, msrHandler->GetMsrTitle()->Data(), + 10+i*100, 10+i*100, 800, 600, + startupHandler->GetFourierDefaults(), + startupHandler->GetMarkerList(), + startupHandler->GetColorList()); + else + musrCanvas = new PMusrCanvas(i, msrHandler->GetMsrTitle()->Data(), + 10+i*100, 10+i*100, 800, 600); + + if (!musrCanvas->IsValid()) { + cout << endl << "**SEVERE ERROR** Couldn't invoke all necessary objects, will quit."; + cout << endl; + ok = false; + break; + } + // connect signal/slot + TQObject::Connect("TCanvas", "Closed()", "PMusrCanvas", musrCanvas, "LastCanvasClosed()"); + + // ugly but rootcint cannot handle the spirit-parser framework + musrCanvas->SetMsrHandler(msrHandler); + musrCanvas->SetRunListCollection(runListCollection); + + if (!musrCanvas->IsValid()) { // something went wrong + ok = false; + break; + } + + musrCanvas->Connect("Done(Int_t)", "TApplication", &app, "Terminate(Int_t)"); + + // keep musrCanvas objects + canvasVector.push_back(musrCanvas); + } + + // check that everything is ok + if (ok) + app.Run(true); // true needed that Run will return after quit so that cleanup works + + // clean up +cout << endl << "clean up canvas vector ..."; + char canvasName[32]; + for (unsigned int i=0; i> canvasName=" << canvasName << ", canvasVector[" << i << "]=" << canvasVector[i]; + if (gROOT->GetListOfCanvases()->FindObject(canvasName) != 0) { +cout << endl << ">> canvasName=" << canvasName << ", found ..."; +cout << endl; + canvasVector[i]->~PMusrCanvas(); + } else { +cout << endl << ">> canvasName=" << canvasName << ", NOT found ..."; +cout << endl; + } + } + canvasVector.empty(); +*/ + } +cout << endl; + + // clean up + if (saxParser) { + delete saxParser; + saxParser = 0; + } + if (startupHandler) { + delete startupHandler; + startupHandler = 0; + } + if (msrHandler) { + delete msrHandler; + msrHandler = 0; + } + if (dataHandler) { + delete dataHandler; + dataHandler = 0; + } + if (t0Vector.size() > 0) { + for (unsigned int i=0; i