From fdfad94b945d72ae0eb7ea19d3e7cc66df9c2ac9 Mon Sep 17 00:00:00 2001 From: Samir Amar-Youcef Date: Tue, 31 Mar 2015 14:41:07 +0200 Subject: [PATCH] add normalmode analysis --- normalmode/analysis_gui/ANA/Makefile | 16 + normalmode/analysis_gui/ANA/Mi26Ana | Bin 0 -> 88034 bytes normalmode/analysis_gui/ANA/Mi26Ana.cpp | 722 +++++++++++++++++++++++ normalmode/analysis_gui/ANA/Mi26Ana.h | 99 ++++ normalmode/analysis_gui/ANA/help.h | 92 +++ normalmode/analysis_gui/ANA/main.cpp | 33 ++ normalmode/analysis_gui/GUI/Makefile | 240 ++++++++ normalmode/analysis_gui/GUI/main.cpp | 22 + normalmode/analysis_gui/GUI/nmode.cpp | 541 +++++++++++++++++ normalmode/analysis_gui/GUI/nmode.h | 42 ++ normalmode/analysis_gui/GUI/nmode.ui | 389 ++++++++++++ normalmode/analysis_gui/GUI/runana.sh | 10 + normalmode/analysis_gui/GUI/rununpack.sh | 13 + normalmode/analysis_gui/readme.txt | 9 + normalmode/unpacker/unpack.C | 26 +- 15 files changed, 2243 insertions(+), 11 deletions(-) create mode 100644 normalmode/analysis_gui/ANA/Makefile create mode 100755 normalmode/analysis_gui/ANA/Mi26Ana create mode 100644 normalmode/analysis_gui/ANA/Mi26Ana.cpp create mode 100644 normalmode/analysis_gui/ANA/Mi26Ana.h create mode 100644 normalmode/analysis_gui/ANA/help.h create mode 100644 normalmode/analysis_gui/ANA/main.cpp create mode 100644 normalmode/analysis_gui/GUI/Makefile create mode 100644 normalmode/analysis_gui/GUI/main.cpp create mode 100644 normalmode/analysis_gui/GUI/nmode.cpp create mode 100644 normalmode/analysis_gui/GUI/nmode.h create mode 100644 normalmode/analysis_gui/GUI/nmode.ui create mode 100755 normalmode/analysis_gui/GUI/runana.sh create mode 100755 normalmode/analysis_gui/GUI/rununpack.sh create mode 100644 normalmode/analysis_gui/readme.txt diff --git a/normalmode/analysis_gui/ANA/Makefile b/normalmode/analysis_gui/ANA/Makefile new file mode 100644 index 0000000..0b7bb4f --- /dev/null +++ b/normalmode/analysis_gui/ANA/Makefile @@ -0,0 +1,16 @@ +CC=g++ +CFLAGS=-c -g -Wall -std=c++11 `root-config --cflags` +LDFLAGS=`root-config --glibs` +CLDFLAGS = -std=c++11 `root-config --cflags --glibs` -lboost_system -lboost_filesystem +SOURCES= main.cpp Mi26Ana.cpp Mi26Ana.h help.h +OBJECTS=$(subst .cc,.o,$(SOURCES)) +EXECUTABLE=Mi26Ana + +all: $(SOURCES) $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(CLDFLAGS) $(OBJECTS) -o $@ + + +clean: + rm -f $(OBJS) diff --git a/normalmode/analysis_gui/ANA/Mi26Ana b/normalmode/analysis_gui/ANA/Mi26Ana new file mode 100755 index 0000000000000000000000000000000000000000..a2b291c3e6e861f538391c462b3dc110990a6dc4 GIT binary patch literal 88034 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Ð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 literal 0 HcmV?d00001 diff --git a/normalmode/analysis_gui/ANA/Mi26Ana.cpp b/normalmode/analysis_gui/ANA/Mi26Ana.cpp new file mode 100644 index 0000000..894a06e --- /dev/null +++ b/normalmode/analysis_gui/ANA/Mi26Ana.cpp @@ -0,0 +1,722 @@ +#include "Mi26Ana.h" +#include "help.h" +#include +#include +#include + + +//#################################################################### + +Mi26Ana::Mi26Ana() { // ok + + + fInputRootFile = ""; + fInputPxFile = ""; + fNPx = 0; + fMap = 0; +} + +//#################################################################### + +Mi26Ana::Mi26Ana( TString inFile, TString pxFile, int NPx, int Map ) { // ok + + fInputRootFile = inFile; + fInputPxFile = pxFile; + fNPx = NPx; + fMap = Map; +} + +//#################################################################### + +Mi26Ana::~Mi26Ana() { + + delete[] fNPxFound_arr; +} + +//#################################################################### + +void Mi26Ana::Exec(int Mode) { +// Open Root-File + fFile = new TFile(fInputRootFile); + cout<<"--------------------------------"<Get(Form("sensor%i",sensorNr)); + + if( !fSensor[0] ) { cout<<"Cannot read file!"<GetEntries(); + + fSensor[sensorNr]->SetBranchAddress ("event" , &fEvent ); + fSensor[sensorNr]->SetBranchAddress ("framenr" , &fFramenr ); + fSensor[sensorNr]->SetBranchAddress ("sensorid" , &fSensorid ); + fSensor[sensorNr]->SetBranchAddress ("status" , &fStatus ); + fSensor[sensorNr]->SetBranchAddress ("datalengthcount" , &fDatalengthcount ); + fSensor[sensorNr]->SetBranchAddress ("datalength" , &fDatalength ); + fSensor[sensorNr]->SetBranchAddress ("timestamp" , &fTimestamp ); + fSensor[sensorNr]->SetBranchAddress ("debug" , &fDebug ); + fSensor[sensorNr]->SetBranchAddress ("states" , &fStates ); + fSensor[sensorNr]->SetBranchAddress ("row" , fRow ); + fSensor[sensorNr]->SetBranchAddress ("column" , fColumn ); + fSensor[sensorNr]->SetBranchAddress ("nextn" , fNextn ); + fSensor[sensorNr]->SetBranchAddress ("overflow" , fOverflow ); + fSensor[sensorNr]->SetBranchAddress ("clusters" , &fClusters ); + fSensor[sensorNr]->SetBranchAddress ("pixelsPerCluster" , fPixelsPerCluster ); + fSensor[sensorNr]->SetBranchAddress ("statesPerCluster" , fStatesPerCluster ); + fSensor[sensorNr]->SetBranchAddress ("row_cg" , fRow_cg ); + fSensor[sensorNr]->SetBranchAddress ("column_cg" , fColumn_cg ); + fSensor[sensorNr]->SetBranchAddress ("shapecode" , fShapeCode ); + fSensor[sensorNr]->SetBranchAddress ("dx" , fDx ); + fSensor[sensorNr]->SetBranchAddress ("dy" , fDy ); + + printf("Sensor No. %3i --> %10i Entries\n", sensorNr, fNentries[sensorNr] ); + fSensorspresent++; + } + else + { + break; + } + } + fSensorspresent=1; + cout<<"--------------------------------"< "<< fSensorspresent <<" sensors found!"<Divide(fSensorspresent,1); + + for(Int_t sensor=0;sensorGetEntry(i); + + for(UInt_t j=0; jFill(pixmulti[i]); + } + + cm1->cd(1+sensor); + plot[sensor]->Draw(); + plot[sensor]->SetLineColor(2); + plot[sensor]->GetXaxis()->SetTitle("Pixel Multiplicity"); + plot[sensor]->GetYaxis()->SetTitle("Number of Pixels"); + plot[sensor]->GetXaxis()->CenterTitle(); + plot[sensor]->GetYaxis()->CenterTitle(); + gPad->SetLogy(); + } +} + +//#################################################################### + +void Mi26Ana::pixelocc3() { + + TH2F* plot[fSensorspresent]; + TCanvas* cm1 = new TCanvas("pixmulit3","pixmulit3",50,100,700,400); + cm1->Divide(fSensorspresent,1); + + for(Int_t sensor=0;sensorGetEntry(i); + + for(UInt_t j=0; jFill(fColumn[j]+k, fRow[j]); + } + } + } + + cm1->cd(1+sensor); + plot[sensor]->Draw("colz"); + plot[sensor]->GetXaxis()->SetTitle("Column#"); + plot[sensor]->GetYaxis()->SetTitle("Row#"); + plot[sensor]->GetXaxis()->CenterTitle(); + plot[sensor]->GetYaxis()->CenterTitle(); + } + +} + +//#################################################################### + +void Mi26Ana::pixeloccHT() { + + TH1F* plot[fSensorspresent]; + TCanvas* cm1 = new TCanvas("hitmulitTime","hitmulitTime",50,100,700,400); + cm1->Divide(fSensorspresent,1); + + int bins = fNentries[0]/8681; + int sum; + + + for(Int_t sensor=0;sensorGetEntry(i); + sum+=fClusters; + if( i%8681==0 && i!=0 ) + { + cout<Fill(115.2/1000000*i-1., sum ); + sum=0; + } + } + + cm1->cd(1+sensor); + plot[sensor]->SetStats(false); + plot[sensor]->SetLineColor(kRed); + plot[sensor]->SetMarkerStyle(20); + plot[sensor]->SetMarkerSize (0.5); + plot[sensor]->Draw(); + plot[sensor]->GetXaxis()->SetTitle("Time [sec.]"); +// plot[sensor]->GetXaxis()->SetTitleColor(4); +// plot[sensor]->GetXaxis()->SetTitleOffset(0.5); + plot[sensor]->GetYaxis()->SetTitle("Hits per sec."); +// plot[sensor]->GetYaxis()->SetTitleColor(4); + plot[sensor]->GetYaxis()->SetTitleOffset(1.5); + plot[sensor]->GetXaxis()->CenterTitle(); + plot[sensor]->GetYaxis()->CenterTitle(); +// plot[sensor]->SetAxisRange(0., bins,"X"); + } +} + +//#################################################################### + +void Mi26Ana::pixeloccH3() { + + TH2F* plot[fSensorspresent]; + TCanvas* cm1 = new TCanvas("hitmulit3","hitmulit3",50,100,700,400); + cm1->Divide(fSensorspresent,1); + + for(Int_t sensor=0;sensorGetEntry(i); + + for(UInt_t j=0; jFill(fColumn_cg[j], fRow_cg[j]); + } + } + + cm1->cd(1+sensor); + plot[sensor]->Draw("colz"); + plot[sensor]->GetXaxis()->SetTitle("Column#"); + plot[sensor]->GetYaxis()->SetTitle("Row#"); + plot[sensor]->GetXaxis()->CenterTitle(); + plot[sensor]->GetYaxis()->CenterTitle(); + } +} + +//#################################################################### +//#################################################################### +//#################################################################### + +void Mi26Ana::Map() { + + cout<<"Note: Only one hard-coded Sensor processed!"<Branch("event" , &event , "event/i" , BUFSIZE); + Sensor[i]->Branch("framenr" , &framenr , "framenr/i" , BUFSIZE); + Sensor[i]->Branch("sensorid" , &sensorid , "sensorid/s" , BUFSIZE); + Sensor[i]->Branch("status" , &status , "status/i" , BUFSIZE); + Sensor[i]->Branch("datalength" , &datalength , "datalength/s" , BUFSIZE); + Sensor[i]->Branch("datalengthcount" , &datalengthcount , "datalengthcount/s" , BUFSIZE); + Sensor[i]->Branch("states" , &states , "states/i" , BUFSIZE); + Sensor[i]->Branch("clusters" , &clusters , "clusters/i" , BUFSIZE); + Sensor[i]->Branch("timestamp" , ×tamp , "timestamp/l" , BUFSIZE); + Sensor[i]->Branch("debug" , &debug , "debug/l" , BUFSIZE); + Sensor[i]->Branch("row" , row , "row [states]/i" , BUFSIZE); + Sensor[i]->Branch("column" , column , "column [states]/i" , BUFSIZE); + Sensor[i]->Branch("nextn" , nextn , "nextn [states]/i" , BUFSIZE); + Sensor[i]->Branch("overflow" , overflow , "overflow [states]/i" , BUFSIZE); + Sensor[i]->Branch("pixelsPerCluster" , pixelsPerCluster , "pixelsPerCluster [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("statesPerCluster" , statesPerCluster , "statesPerCluster [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("row_cg" , row_cg , "row_cg [clusters]/F" , BUFSIZE); + Sensor[i]->Branch("column_cg" , column_cg , "column_cg [clusters]/F" , BUFSIZE); + Sensor[i]->Branch("shapecode" , shapecode , "shapecode [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("dx" , dx , "dx [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("dy" , dy , "dy [clusters]/i" , BUFSIZE); + } + +// Loop + for(Int_t sensor=0;sensor<1;sensor++) +// for(Int_t sensor=0;sensorGetEntry(i); + + for(UInt_t j=0; jGetEntry(i); + + event = fEvent; + framenr = fFramenr; + sensorid = fSensorid; + status = fStatus; + timestamp = fTimestamp; + clusters = 0; + + for(UInt_t j=0; jFill(); +//------- + progress = (Int_t)((i*100)/(fNentries[sensor]-1)*10); + if(progress!=progress_tmp) { print_progress( ((i*100.)/(fNentries[sensor]-1)) ); progress_tmp=progress;} +//------- + } +//---------------------- + count =0; + countF=0; + for(UInt_t k=0; kWrite("",TObject::kOverwrite); + printf(" ->%3i\n", i); + } + + OutputFile->Save(); + OutputFile->Close(); + +//---------------------------------------- + char Commando[512]; + strcpy (Commando, "mv " ); + strcat (Commando, Filename ); + strcat (Commando, " " ); + strcat (Commando, fInputRootFile ); + system (Commando); +//---------------------------------------- + + delete[] hitmulti; + +} + +//#################################################################### + +void Mi26Ana::MostNoisy() { + + cout<<"Note: Only one hard-coded Sensor processed!"<Branch("event" , &event , "event/i" , BUFSIZE); + Sensor[i]->Branch("framenr" , &framenr , "framenr/i" , BUFSIZE); + Sensor[i]->Branch("sensorid" , &sensorid , "sensorid/s" , BUFSIZE); + Sensor[i]->Branch("status" , &status , "status/i" , BUFSIZE); + Sensor[i]->Branch("datalength" , &datalength , "datalength/s" , BUFSIZE); + Sensor[i]->Branch("datalengthcount" , &datalengthcount , "datalengthcount/s" , BUFSIZE); + Sensor[i]->Branch("states" , &states , "states/i" , BUFSIZE); + Sensor[i]->Branch("clusters" , &clusters , "clusters/i" , BUFSIZE); + Sensor[i]->Branch("timestamp" , ×tamp , "timestamp/l" , BUFSIZE); + Sensor[i]->Branch("debug" , &debug , "debug/l" , BUFSIZE); + Sensor[i]->Branch("row" , row , "row [states]/i" , BUFSIZE); + Sensor[i]->Branch("column" , column , "column [states]/i" , BUFSIZE); + Sensor[i]->Branch("nextn" , nextn , "nextn [states]/i" , BUFSIZE); + Sensor[i]->Branch("overflow" , overflow , "overflow [states]/i" , BUFSIZE); + Sensor[i]->Branch("pixelsPerCluster" , pixelsPerCluster , "pixelsPerCluster [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("statesPerCluster" , statesPerCluster , "statesPerCluster [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("row_cg" , row_cg , "row_cg [clusters]/F" , BUFSIZE); + Sensor[i]->Branch("column_cg" , column_cg , "column_cg [clusters]/F" , BUFSIZE); + Sensor[i]->Branch("shapecode" , shapecode , "shapecode [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("dx" , dx , "dx [clusters]/i" , BUFSIZE); + Sensor[i]->Branch("dy" , dy , "dy [clusters]/i" , BUFSIZE); + } + +// Loop + for(Int_t sensor=0;sensor<1;sensor++) +// for(Int_t sensor=0;sensorGetEntry(i); + + for(UInt_t j=0; jGetEntry(i); + + event = fEvent; + framenr = fFramenr; + sensorid = fSensorid; + status = fStatus; + timestamp = fTimestamp; + clusters = 0; + + for(UInt_t j=0; jFill(); +//------- + progress = (Int_t)((i*100)/(fNentries[sensor]-1)*10); + if(progress!=progress_tmp) { print_progress( ((i*100.)/(fNentries[sensor]-1)) ); progress_tmp=progress;} +//------- + } +//---------------------- + count =0; + countF=0; + for(UInt_t k=0; kWrite("",TObject::kOverwrite); + printf(" ->%3i\n", i); + } + + OutputFile->Save(); + OutputFile->Close(); + +//---------------------------------------- + char Commando[512]; + strcpy (Commando, "mv " ); + strcat (Commando, Filename ); + strcat (Commando, " " ); + strcat (Commando, fInputRootFile ); + system (Commando); +//---------------------------------------- + delete[] hitmulti; + delete[] noisyPixels; + +} + +//#################################################################### + +int Mi26Ana::readPxFile() { + + ifstream myfile( fInputPxFile, std::ifstream::in ); + + if(!myfile.good()) + { + fNPxFound_arr = new int[1]; + return 0; + } + + myfile >> fNPxFound; + + fNPxFound_arr = new int[fNPxFound]; + + int count=0; + int pix; + + while( myfile.good() ) + { + myfile >> pix; + if( count +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "TCanvas.h" +#include "TRootCanvas.h" +#include +#include +#include +#include "TH1.h" +#include "TF1.h" +#include "TSystem.h" +#include +#include "TROOT.h" +#include "TMath.h" +// #include "TSystem.h" + +using namespace std; + +class Mi26Ana { + +private: +// TTrees + TFile* fFile; + TTree* fSensor [MAXSENSORS]; + UInt_t fNentries [MAXSENSORS]; + UInt_t fSensorspresent; + + UInt_t fEvent; + UInt_t fFramenr; + UShort_t fSensorid; + UInt_t fStatus; + UShort_t fDatalengthcount; + UShort_t fDatalength; + ULong64_t fTimestamp; + ULong64_t fDebug; + UInt_t fStates; + UInt_t fRow [MAXSTATES]; + UInt_t fColumn [MAXSTATES]; + UInt_t fNextn [MAXSTATES]; + UInt_t fOverflow [MAXSTATES]; + UInt_t fClusters; + UInt_t fPixelsPerCluster [MAXSTATES]; + UInt_t fStatesPerCluster [MAXSTATES]; + Float_t fRow_cg [MAXSTATES]; + Float_t fColumn_cg [MAXSTATES]; + UInt_t fShapeCode [MAXSTATES]; + UInt_t fDx [MAXSTATES]; + UInt_t fDy [MAXSTATES]; + +private: + void remove (); + void pixelocc2 (); + void pixelocc3 (); + void pixeloccHT (); + void pixeloccH3 (); + void empty1 (); + void empty2 (); + + void Map (); + void MostNoisy (); + int readPxFile (); + + TString fInputRootFile; + TString fInputPxFile; + int fMap; + int fNPx; + int fNPxFound; + int* fNPxFound_arr; + +public: + Mi26Ana(); + Mi26Ana( TString, TString, int, int ); + ~Mi26Ana(); + + void Exec (int); + + void setInFile (TString name) { fInputRootFile= name; } + void setPxFile (TString name) { fInputPxFile = name; } + void setNPx (int val) { fNPx = val; } + void setMap (int val) { fMap = val; } +}; + +#endif // Mi26Ana_H + \ No newline at end of file diff --git a/normalmode/analysis_gui/ANA/help.h b/normalmode/analysis_gui/ANA/help.h new file mode 100644 index 0000000..5ee6558 --- /dev/null +++ b/normalmode/analysis_gui/ANA/help.h @@ -0,0 +1,92 @@ +#ifndef HELP_H +#define HELP_H + +#include +#include +#include +#include +#include +#include +#include +#include "TStopwatch.h" + +//#################################################################### + +Int_t print_progress(Float_t ProgressInPercent) { + + Int_t nCharacter = printf("\r ["); + Int_t iBlock; + + for( iBlock=0; iBlockReset(); + + const char* InFile; + const char* PxFile; + int Mode; + int NPx; // Pixelnummer + int Map; + + stringstream strValue; + + if (argc>1) InFile = argv[1]; + if (argc>2) PxFile = argv[2]; + if (argc>3) strValue<> Mode; strValue.clear(); + if (argc>4) strValue<> NPx; strValue.clear(); + if (argc>5) strValue<> Map; strValue.clear(); + + TApplication theApp("Analysis", &argc, argv); + + Mi26Ana* ana = new Mi26Ana(); + ana->setInFile (InFile); + ana->setPxFile (PxFile); + ana->setNPx (NPx); + ana->setMap (Map); + ana->Exec (Mode); + delete ana; + theApp.Run(); +} \ No newline at end of file diff --git a/normalmode/analysis_gui/GUI/Makefile b/normalmode/analysis_gui/GUI/Makefile new file mode 100644 index 0000000..ec9a2dd --- /dev/null +++ b/normalmode/analysis_gui/GUI/Makefile @@ -0,0 +1,240 @@ +############################################################################# +# Makefile for building: nmode +# Generated by qmake (2.01a) (Qt 4.8.5) on: Wed Mar 25 16:26:40 2015 +# Project: nmode.pro +# Template: app +# Command: /usr/bin/qmake -o Makefile nmode.pro +############################################################################# + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +DEFINES = -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED +CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) +CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) +INCPATH = -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I$(ROOTSYS)/include -I. -I. +LINK = g++ +LFLAGS = -Wl,-O1 +LIBS = $(SUBLIBS) -L/usr/lib64 -L$(ROOTSYS)/lib -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lGui -lRGL -lQtGui -L/usr/lib64 -L/usr/X11R6/lib -lQtCore -lpthread +AR = ar cqs +RANLIB = +QMAKE = /usr/bin/qmake +TAR = tar -cf +COMPRESS = gzip -9f +COPY = cp -f +SED = sed +COPY_FILE = $(COPY) +COPY_DIR = $(COPY) -r +STRIP = strip +INSTALL_FILE = install -m 644 -p +INSTALL_DIR = $(COPY_DIR) +INSTALL_PROGRAM = install -m 755 -p +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = main.cpp \ + nmode.cpp moc_nmode.cpp +OBJECTS = main.o \ + nmode.o \ + moc_nmode.o +DIST = /usr/share/qt4/mkspecs/common/unix.conf \ + /usr/share/qt4/mkspecs/common/linux.conf \ + /usr/share/qt4/mkspecs/common/gcc-base.conf \ + /usr/share/qt4/mkspecs/common/gcc-base-unix.conf \ + /usr/share/qt4/mkspecs/common/g++-base.conf \ + /usr/share/qt4/mkspecs/common/g++-unix.conf \ + /usr/share/qt4/mkspecs/qconfig.pri \ + /usr/share/qt4/mkspecs/modules/qt_phonon.pri \ + /usr/share/qt4/mkspecs/modules/qt_webkit.pri \ + /usr/share/qt4/mkspecs/features/qt_functions.prf \ + /usr/share/qt4/mkspecs/features/qt_config.prf \ + /usr/share/qt4/mkspecs/features/exclusive_builds.prf \ + /usr/share/qt4/mkspecs/features/default_pre.prf \ + /usr/share/qt4/mkspecs/features/release.prf \ + /usr/share/qt4/mkspecs/features/default_post.prf \ + /usr/share/qt4/mkspecs/features/shared.prf \ + /usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \ + /usr/share/qt4/mkspecs/features/warn_on.prf \ + /usr/share/qt4/mkspecs/features/qt.prf \ + /usr/share/qt4/mkspecs/features/unix/thread.prf \ + /usr/share/qt4/mkspecs/features/moc.prf \ + /usr/share/qt4/mkspecs/features/resources.prf \ + /usr/share/qt4/mkspecs/features/uic.prf \ + /usr/share/qt4/mkspecs/features/yacc.prf \ + /usr/share/qt4/mkspecs/features/lex.prf \ + /usr/share/qt4/mkspecs/features/include_source_dir.prf \ + nmode.pro +QMAKE_TARGET = nmode +DESTDIR = +TARGET = nmode + +first: all +####### Implicit rules + +.SUFFIXES: .o .c .cpp .cc .cxx .C + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.cc.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.cxx.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.C.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.c.o: + $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" + +####### Build rules + +all: Makefile $(TARGET) + +$(TARGET): ui_nmode.h $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: nmode.pro /usr/share/qt4/mkspecs/default/qmake.conf /usr/share/qt4/mkspecs/common/unix.conf \ + /usr/share/qt4/mkspecs/common/linux.conf \ + /usr/share/qt4/mkspecs/common/gcc-base.conf \ + /usr/share/qt4/mkspecs/common/gcc-base-unix.conf \ + /usr/share/qt4/mkspecs/common/g++-base.conf \ + /usr/share/qt4/mkspecs/common/g++-unix.conf \ + /usr/share/qt4/mkspecs/qconfig.pri \ + /usr/share/qt4/mkspecs/modules/qt_phonon.pri \ + /usr/share/qt4/mkspecs/modules/qt_webkit.pri \ + /usr/share/qt4/mkspecs/features/qt_functions.prf \ + /usr/share/qt4/mkspecs/features/qt_config.prf \ + /usr/share/qt4/mkspecs/features/exclusive_builds.prf \ + /usr/share/qt4/mkspecs/features/default_pre.prf \ + /usr/share/qt4/mkspecs/features/release.prf \ + /usr/share/qt4/mkspecs/features/default_post.prf \ + /usr/share/qt4/mkspecs/features/shared.prf \ + /usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \ + /usr/share/qt4/mkspecs/features/warn_on.prf \ + /usr/share/qt4/mkspecs/features/qt.prf \ + /usr/share/qt4/mkspecs/features/unix/thread.prf \ + /usr/share/qt4/mkspecs/features/moc.prf \ + /usr/share/qt4/mkspecs/features/resources.prf \ + /usr/share/qt4/mkspecs/features/uic.prf \ + /usr/share/qt4/mkspecs/features/yacc.prf \ + /usr/share/qt4/mkspecs/features/lex.prf \ + /usr/share/qt4/mkspecs/features/include_source_dir.prf \ + /usr/lib64/libQtGui.prl \ + /usr/lib64/libQtCore.prl + $(QMAKE) -o Makefile nmode.pro +/usr/share/qt4/mkspecs/common/unix.conf: +/usr/share/qt4/mkspecs/common/linux.conf: +/usr/share/qt4/mkspecs/common/gcc-base.conf: +/usr/share/qt4/mkspecs/common/gcc-base-unix.conf: +/usr/share/qt4/mkspecs/common/g++-base.conf: +/usr/share/qt4/mkspecs/common/g++-unix.conf: +/usr/share/qt4/mkspecs/qconfig.pri: +/usr/share/qt4/mkspecs/modules/qt_phonon.pri: +/usr/share/qt4/mkspecs/modules/qt_webkit.pri: +/usr/share/qt4/mkspecs/features/qt_functions.prf: +/usr/share/qt4/mkspecs/features/qt_config.prf: +/usr/share/qt4/mkspecs/features/exclusive_builds.prf: +/usr/share/qt4/mkspecs/features/default_pre.prf: +/usr/share/qt4/mkspecs/features/release.prf: +/usr/share/qt4/mkspecs/features/default_post.prf: +/usr/share/qt4/mkspecs/features/shared.prf: +/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf: +/usr/share/qt4/mkspecs/features/warn_on.prf: +/usr/share/qt4/mkspecs/features/qt.prf: +/usr/share/qt4/mkspecs/features/unix/thread.prf: +/usr/share/qt4/mkspecs/features/moc.prf: +/usr/share/qt4/mkspecs/features/resources.prf: +/usr/share/qt4/mkspecs/features/uic.prf: +/usr/share/qt4/mkspecs/features/yacc.prf: +/usr/share/qt4/mkspecs/features/lex.prf: +/usr/share/qt4/mkspecs/features/include_source_dir.prf: +/usr/lib64/libQtGui.prl: +/usr/lib64/libQtCore.prl: +qmake: FORCE + @$(QMAKE) -o Makefile nmode.pro + +dist: + @$(CHK_DIR_EXISTS) .tmp/nmode1.0.0 || $(MKDIR) .tmp/nmode1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/nmode1.0.0/ && $(COPY_FILE) --parents nmode.h .tmp/nmode1.0.0/ && $(COPY_FILE) --parents main.cpp nmode.cpp .tmp/nmode1.0.0/ && $(COPY_FILE) --parents nmode.ui .tmp/nmode1.0.0/ && (cd `dirname .tmp/nmode1.0.0` && $(TAR) nmode1.0.0.tar nmode1.0.0 && $(COMPRESS) nmode1.0.0.tar) && $(MOVE) `dirname .tmp/nmode1.0.0`/nmode1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/nmode1.0.0 + + +clean:compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +####### Sub-libraries + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) Makefile + + +check: first + +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all + +compiler_moc_header_make_all: moc_nmode.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_nmode.cpp +moc_nmode.cpp: ui_nmode.h \ + nmode.h + /usr/bin/moc $(DEFINES) $(INCPATH) nmode.h -o moc_nmode.cpp + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_image_collection_make_all: qmake_image_collection.cpp +compiler_image_collection_clean: + -$(DEL_FILE) qmake_image_collection.cpp +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_nmode.h +compiler_uic_clean: + -$(DEL_FILE) ui_nmode.h +ui_nmode.h: nmode.ui + /usr/bin/uic nmode.ui -o ui_nmode.h + +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_header_clean compiler_uic_clean + +####### Compile + +main.o: main.cpp nmode.h \ + ui_nmode.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp + +nmode.o: nmode.cpp nmode.h \ + ui_nmode.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o nmode.o nmode.cpp + +moc_nmode.o: moc_nmode.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_nmode.o moc_nmode.cpp + +####### Install + +install: FORCE + +uninstall: FORCE + +FORCE: + diff --git a/normalmode/analysis_gui/GUI/main.cpp b/normalmode/analysis_gui/GUI/main.cpp new file mode 100644 index 0000000..98b00f9 --- /dev/null +++ b/normalmode/analysis_gui/GUI/main.cpp @@ -0,0 +1,22 @@ +// --- main.cpp - start --- + +#include "nmode.h" +#include +#include + +int main( int argc, char* argv[] ) +{ + TApplication* gMyRootApp = new TApplication("My ROOT Application", &argc, argv); + gMyRootApp->SetReturnFromRun(true); +// gMyRootApp->Run(kTRUE); + + QApplication a(argc, argv); + nmode w; + w.show(); + + w.setWindowTitle(QString::fromUtf8("ANA GUI")); +// QObject::connect( qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()) ); + return a.exec(); +} + +// --- main.cpp - end --- diff --git a/normalmode/analysis_gui/GUI/nmode.cpp b/normalmode/analysis_gui/GUI/nmode.cpp new file mode 100644 index 0000000..2624993 --- /dev/null +++ b/normalmode/analysis_gui/GUI/nmode.cpp @@ -0,0 +1,541 @@ +// --- nmode.cpp - start --- +#include "nmode.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "TCanvas.h" +#include "TRootCanvas.h" +#include +#include +#include +#include "TH1.h" +#include "TF1.h" +#include "TSystem.h" +#include +#include "TROOT.h" +// #include "TSystem.h" + + + +using namespace std; + +//#################################################################### + +nmode::nmode(QMainWindow *parent) : QMainWindow(parent) { + + setupUi(this); +// Init inputs + initGUI(); + childcount=0; +// TApplication* gMyRootApp = new TApplication("My ROOT Application", &argc, argv); +// gMyRootApp->SetReturnFromRun(true); + + connect(lineDir ,SIGNAL( textChanged(QString) ) ,this ,SLOT( clickDir() ) ); + connect(lineFile ,SIGNAL( textChanged(QString) ) ,this ,SLOT( clickFile() ) ); + connect(pushSave ,SIGNAL( clicked() ) ,this ,SLOT( Save() ) ); + connect(pushClose ,SIGNAL( clicked() ) ,this ,SLOT( Close() ) ); + connect(pushFindNew ,SIGNAL( clicked() ) ,this ,SLOT( Newest() ) ); + connect(pushUnpack ,SIGNAL( clicked() ) ,this ,SLOT( Unpack() ) ); + connect(pushOpenBrowser ,SIGNAL( clicked() ) ,this ,SLOT( OpenBrowser() ) ); + + QSignalMapper *signalMapper = new QSignalMapper(this); + QSignalMapper *signalMapper2 = new QSignalMapper(this); + + signalMapper ->setMapping( pushRemove , 0); + signalMapper ->setMapping( pushOcc2 , 1); + signalMapper ->setMapping( pushOcc3 , 2); + signalMapper ->setMapping( pushOccHT , 3); + signalMapper ->setMapping( pushOccH3 , 4); + signalMapper ->setMapping( pushEmpty1 , 5); + signalMapper2 ->setMapping( pushFindBack , -1); + signalMapper2 ->setMapping( pushFindForth , 1); + + connect(pushRemove ,SIGNAL( clicked(bool) ) ,signalMapper, SLOT( map() ) ); + connect(pushOcc2 ,SIGNAL( clicked(bool) ) ,signalMapper, SLOT( map() ) ); + connect(pushOcc3 ,SIGNAL( clicked(bool) ) ,signalMapper, SLOT( map() ) ); + connect(pushOccHT ,SIGNAL( clicked(bool) ) ,signalMapper, SLOT( map() ) ); + connect(pushOccH3 ,SIGNAL( clicked(bool) ) ,signalMapper, SLOT( map() ) ); + connect(pushEmpty1 ,SIGNAL( clicked(bool) ) ,signalMapper, SLOT( map() ) ); + connect(pushFindBack ,SIGNAL( clicked(bool) ) ,signalMapper2, SLOT( map() ) ); + connect(pushFindForth ,SIGNAL( clicked(bool) ) ,signalMapper2, SLOT( map() ) ); + + connect(signalMapper ,SIGNAL( mapped(int) ) ,this ,SLOT( RunAna (int) ) ); + connect(signalMapper2 ,SIGNAL( mapped(int) ) ,this ,SLOT( NextFile (int) ) ); + +// checkRandPix +// checkBank1 +// checkBank2 +// checkBank3 +// checkBank4 +// spinRandPix + +} + +//#################################################################### + +nmode::~nmode() { + + Save(); + Close(); +} + +//#################################################################### + +void nmode::initGUI() { + + ifstream myfile ( "nmode.ini"); + string line; + int para; + + if (myfile.is_open()) + { + getline( myfile, line ); + lineDir -> insert( QString::fromStdString(line) ); + getline( myfile, line ); + lineFile -> insert( QString::fromStdString(line) ); + + myfile >> para; + radioHld -> setChecked(true); + if( para ) { radioRoot -> setChecked(true); } + myfile >> para; + radioMost -> setChecked(true); + if( para ) { radioExist -> setChecked(true); } + myfile >> para; + spinPix -> setValue( para ); + } + +} + +//#################################################################### + +void nmode::clickDir() { + lineDir->setStyleSheet("QLineEdit { color:black; }"); +} + +//#################################################################### + +void nmode::clickFile() { + lineFile->setStyleSheet("QLineEdit { color:black; }"); +} + +//#################################################################### + +void nmode::Save() { + + checkDir(); +// checkFile(); + + fstream myfile; + myfile.open( "nmode.ini" , ios::out ); + myfile << ( lineDir -> text()).toStdString() < text()).toStdString() < isChecked() <<" "; + myfile << radioExist -> isChecked() <<" "; + myfile << spinPix -> value() <<" "; + myfile <close(); + } + + childcount=0; + +} + +//#################################################################### + +void nmode::Newest() { + + if(checkDir()) + { + QString text = lineDir-> text(); + QByteArray bytes = text.toAscii(); + char *Dir = bytes.data(); + + time_t timecurr = 0; + time_t timenew = 0; + char Filecurr [256]; + char Filenew [256] = ""; + + char Ending [4]; + if( radioRoot -> isChecked() ) { strcpy (Ending, "root"); } + else { strcpy (Ending, "hld"); } + + uint Endinglength = strlen(Ending); + + DIR* dpdf; + struct dirent* epdf; + struct stat s; + uint namelength; + bool Endingcorr; + + dpdf = opendir(Dir); +// init File_new +// strcpy (File_new, ""); + + if (dpdf != NULL) + { + while ( (epdf = readdir(dpdf)) != NULL ) + { + if( (string) epdf->d_name != "." && (string) epdf->d_name != ".." ) + { + strcpy (Filecurr, Dir); + strcat (Filecurr, epdf->d_name); + + stat (Filecurr, &s); + timecurr = s.st_mtime; + namelength = strlen(Filecurr); + + Endingcorr = true; + + if(namelength>Endinglength) + { + for(uint i=0; id_name); + timenew = timecurr; + } + } + } + } + } + + if( strlen(Filenew)!=0 ) + { + lineFile -> clear(); + lineFile -> insert( QString(Filenew) ); + } + else + { + lineFile->setStyleSheet("QLineEdit { color:red; }"); + } + + } +} + +//#################################################################### + +void nmode::Unpack() { + + checkDir(); + + QString text; + QByteArray bytes; + char *Dir; + char *File; + + text = lineDir ->text(); + bytes = text.toAscii(); + Dir = bytes.data(); + + text = lineFile ->text(); + bytes = text.toAscii(); + File = bytes.data(); + + string command = ""; + command += "xterm -hold -geometry 105x15+10+10 -e ./rununpack.sh "; + command += Dir; + command += " "; + command += File; + + const char *ptr = command.c_str() ; + + child[childcount] = new QProcess(); +// connect(child[childcount], SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(isFinished( int, QProcess::ExitStatus ))); + child[childcount]->start(ptr); + childcount++; + +} + +//#################################################################### + +void nmode::OpenBrowser() { + + QString text; + QByteArray bytes; + char *Dir; + char *File; + char Filein [256] = ""; + + text = lineDir ->text(); + bytes = text.toAscii(); + Dir = bytes.data(); + + text = lineFile ->text(); + bytes = text.toAscii(); + File = bytes.data(); + + strcpy (Filein, Dir); + strcat (Filein, File); + + string command = ""; + command += "xterm -geometry 130x10+10+10 -e root -l "; + command += Filein; + + const char *ptr = command.c_str() ; + + child[childcount] = new QProcess(); +// connect(child[childcount], SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(isFinished( int, QProcess::ExitStatus ))); + child[childcount]->start(ptr); + childcount++; + +} + +//#################################################################### + +void nmode::NextFile(int sign) { + + if(checkDir()) + { + QString text; + QByteArray bytes; + char *Dir; + char *File; + + text = lineDir ->text(); + bytes = text.toAscii(); + Dir = bytes.data(); + + text = lineFile ->text(); + bytes = text.toAscii(); + File = bytes.data(); + + time_t timeref = 0; + time_t timecurr = 0; + time_t timenew = 2000000000; + if(sign==-1) {timenew = -2000000000;} + + char Fileref [256]; + char Filecurr [256]; + char Filenew [256] = ""; + + strcpy (Fileref, Dir); + strcat (Fileref, File); + + struct stat buff; + if( stat (Fileref, &buff) == 0 ) { lineFile->setStyleSheet("QLineEdit { color:black; }"); timeref = buff.st_mtime; } + else { lineFile->setStyleSheet("QLineEdit { color:red; }"); timeref = timenew; sign=-1*sign; timenew= -1*timenew; } + + text = lineDir ->text(); + bytes = text.toAscii(); + Dir = bytes.data(); + + text = lineFile ->text(); + bytes = text.toAscii(); + File = bytes.data(); + + char Ending [4]; + if( radioRoot -> isChecked() ) { strcpy (Ending, "root"); } + else { strcpy (Ending, "hld"); } + + uint Endinglength = strlen(Ending); + + DIR* dpdf; + struct dirent* epdf; + struct stat s; + uint namelength; + bool Endingcorr; + + dpdf = opendir(Dir); +// init File_new +// strcpy (File_new, ""); + + if (dpdf != NULL) + { + while ( (epdf = readdir(dpdf)) != NULL ) + { + if( (string) epdf->d_name != "." && (string) epdf->d_name != ".." ) + { + strcpy (Filecurr, Dir); + strcat (Filecurr, epdf->d_name); + + stat (Filecurr, &s); + timecurr = s.st_mtime; + namelength = strlen(Filecurr); + Endingcorr = true; + + if(namelength>Endinglength) + { + for(uint i=0; isign*timeref ) + { +// cout<sign*timecurr) + { + strcpy (Filenew, epdf->d_name); + timenew = timecurr; + } + } + } + } + } + } + + if ( strlen(Filenew)!=0 ) + { + lineFile -> clear(); + lineFile -> insert( QString(Filenew) ); + } +// else +// { +// pushFindBack ->setStyleSheet("* { background-color: red }"); +// pushFindForth ->setStyleSheet("* { background-color: red }"); +// pushFindBack ->setStyleSheet("* { background-color: lightGray }"); +// pushFindForth ->setStyleSheet("* { background-color: lightGray }"); +// } + } +} + +//#################################################################### + +void nmode::RunAna(int method) { + + checkDir(); + + string dirPath = ( lineDir -> text() ).toStdString(); + string filePath = ( lineFile-> text() ).toStdString(); + +// xterm -geometry 65x10+10+10 -e root -l "runreadgui.C+(\""3"\",\"/local/samir/test.root\","0","what","what","0")" + + std::stringstream strstr1; + strstr1.str(""); + strstr1 << method; + + std::stringstream strstr2; + strstr2.str(""); + strstr2 << spinPix->value(); + + std::stringstream strstr3; + strstr3.str(""); + strstr3 << radioExist->isChecked(); + +// string command = "xterm -hold -geometry 75x10+10+10 -e ./runana.sh "; + string command = "xterm -geometry 75x10+10+10 -e ./runana.sh "; + command += " "; + command += dirPath + filePath; + command += " "; + command += strstr1.str(); // method nr + command += " "; + command += strstr2.str(); // nr pixels + command += " "; + command += strstr3.str(); // most noisy or exist. Map + + const char *ptr = command.c_str() ; +// cout<start(ptr); + childcount++; + +} + +//#################################################################### +//#################################################################### + +bool nmode:: checkDir() { + + QString text = lineDir ->text(); + QByteArray bytes = text.toAscii(); + char *Dir = bytes.data(); + +// Add '/' at the end of Dir + if( Dir[strlen(Dir)-1] != '/' ) + { + strcat(Dir, "/" ); + lineDir -> clear(); + lineDir -> insert( QString(Dir) ); + } + +// Check whether Dir exists + DIR* dpdf = opendir(Dir); + + if (dpdf != NULL) { lineDir->setStyleSheet("QLineEdit { color:black; }"); return true; } + else { lineDir->setStyleSheet("QLineEdit { color:red; }"); return false; } +} + +//#################################################################### + +bool nmode:: checkFile() { + + if(checkDir()) + { + QString text; + QByteArray bytes; + char *Dir; + char *File; + + text = lineDir ->text(); + bytes = text.toAscii(); + Dir = bytes.data(); + + text = lineFile ->text(); + bytes = text.toAscii(); + File = bytes.data(); + + char Filecurr [256]; + strcpy (Filecurr, Dir); + strcat (Filecurr, File); + + struct stat buffer; + + if( stat (Filecurr, &buffer) == 0) { lineFile->setStyleSheet("QLineEdit { color:black; }"); return true; } + else { lineFile->setStyleSheet("QLineEdit { color:red; }"); return false; } + } + + return 0; +} + +//#################################################################### + +void nmode::Error() { + + QMessageBox* box = new QMessageBox(); + box->setWindowTitle(QString("Error")); +// box->setText(QString("Current Text:\""+text+"\"")); + box->setText(QString("Directory not found!")); + box->show(); +} + +//#################################################################### +// --- nmode.cpp - end --- diff --git a/normalmode/analysis_gui/GUI/nmode.h b/normalmode/analysis_gui/GUI/nmode.h new file mode 100644 index 0000000..7aca500 --- /dev/null +++ b/normalmode/analysis_gui/GUI/nmode.h @@ -0,0 +1,42 @@ +// --- nmode.h - start --- + +#ifndef NMODE_H +#define NMODE_H + +#include "ui_nmode.h" +#include "TCanvas.h" +#include + +class nmode : public QMainWindow, public Ui::MainWindow { + + Q_OBJECT + +public: + nmode(QMainWindow *parent=0); + ~nmode(); + +public slots: + void Error (); + void Unpack (); + void OpenBrowser(); + void Save (); + void Newest (); + void Close (); + void clickDir (); + void clickFile (); + void RunAna (int); + void NextFile (int); + +private: + void initGUI(); + bool checkDir(); + bool checkFile(); + + QProcess* child[1000]; + int childcount; +}; + +#endif // NMODE_H + +// --- nmode.h - end --- + diff --git a/normalmode/analysis_gui/GUI/nmode.ui b/normalmode/analysis_gui/GUI/nmode.ui new file mode 100644 index 0000000..3c8009f --- /dev/null +++ b/normalmode/analysis_gui/GUI/nmode.ui @@ -0,0 +1,389 @@ + + + MainWindow + + + + 0 + 0 + 495 + 296 + + + + MainWindow + + + + + + 59 + 12 + 391 + 26 + + + + + + + 59 + 42 + 391 + 26 + + + + + + + 19 + 18 + 41 + 16 + + + + DIR + + + + + + 19 + 48 + 41 + 16 + + + + FILE + + + + + + 97 + 148 + 101 + 131 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 3 + 54 + 95 + 26 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 165888 + + + + + + 4 + 82 + 101 + 21 + + + + + 8 + + + + Most noisy + + + + + + 4 + 102 + 101 + 21 + + + + + 8 + + + + Exist. Map + + + + + + 3 + 2 + 95 + 51 + + + + remove/map + Noisy Pixels + + + + + + + 200 + 150 + 95 + 51 + + + + Pixel Occ. + 2D + + + + + + 200 + 210 + 95 + 51 + + + + Pixel Occ. + 3D + + + + + + 300 + 210 + 95 + 51 + + + + Hit Occ. + 3D + + + + + + 60 + 84 + 95 + 51 + + + + Save + + + + + + 400 + 150 + 95 + 51 + + + + Open + Browser + + + + + + 160 + 84 + 95 + 51 + + + + Close + windows + + + + + + 313 + 74 + 135 + 61 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 6 + 51 + 21 + + + + Qt::RightToLeft + + + hld + + + + + + 62 + 6 + 51 + 21 + + + + root + + + + + + 27 + 26 + 81 + 31 + + + + Find Newest + + + + + + 3 + 26 + 21 + 31 + + + + < + + + + + + 111 + 26 + 21 + 31 + + + + > + + + + + + + 0 + 150 + 95 + 51 + + + + Unpack + + + + + + 400 + 210 + 95 + 51 + + + + Empty 1 + + + + + + 300 + 150 + 95 + 51 + + + + Hit Occ. + vs. Time + + + + + + + 0 + 0 + 495 + 20 + + + + + + + lineDir + lineFile + pushSave + pushClose + radioHld + radioRoot + pushFindBack + pushFindNew + pushFindForth + pushUnpack + pushRemove + spinPix + radioMost + radioExist + pushOcc2 + pushOccHT + pushOpenBrowser + pushOcc3 + pushOccH3 + pushEmpty1 + + + + diff --git a/normalmode/analysis_gui/GUI/runana.sh b/normalmode/analysis_gui/GUI/runana.sh new file mode 100755 index 0000000..a15e415 --- /dev/null +++ b/normalmode/analysis_gui/GUI/runana.sh @@ -0,0 +1,10 @@ +pxlmap=`pwd`/map.ini + +# echo " $1" +# echo " $2" +# echo " $3" +# echo " $4" +# echo " $pxlmap" + +time ./../ANA/Mi26Ana $1 $pxlmap $2 $3 $4 +echo "Finished!" \ No newline at end of file diff --git a/normalmode/analysis_gui/GUI/rununpack.sh b/normalmode/analysis_gui/GUI/rununpack.sh new file mode 100755 index 0000000..7f7ced4 --- /dev/null +++ b/normalmode/analysis_gui/GUI/rununpack.sh @@ -0,0 +1,13 @@ +echo "Input-Dir : $1" +echo "Input-File: $2" +./../../../normalmode/unpacker/Mi26NM $1 $2 +echo "Finished!" + + + +# --> Unpacker from folder: cpp_standalone + +# echo "Input: $1" +# # echo "Output: $4" +# . ../../cpp_standalone/unpackerB $1 +# echo "Finished!" diff --git a/normalmode/analysis_gui/readme.txt b/normalmode/analysis_gui/readme.txt new file mode 100644 index 0000000..6c005ce --- /dev/null +++ b/normalmode/analysis_gui/readme.txt @@ -0,0 +1,9 @@ + +1. Compile the code + - ANA + - GUI + - Unpacker (note: there are 2 different unpacker available) + +2. Un-/comment the part in GUI/run.sh according to which unpacker you choose + +3. To run the analysis GUI, you have to make ROOT available in the console first \ No newline at end of file diff --git a/normalmode/unpacker/unpack.C b/normalmode/unpacker/unpack.C index 624c1f5..936c74d 100755 --- a/normalmode/unpacker/unpack.C +++ b/normalmode/unpacker/unpack.C @@ -34,7 +34,7 @@ unpacker::~unpacker() { delete[] fFileLength; delete[] fInn; delete[] fRawData; -#if SAVE > 0 + cout<<"-------------"<%3i\n", i); } } - fOutputFile->Write(); +// fOutputFile->Write(); fOutputFile->Save(); fOutputFile->Close(); @@ -56,7 +56,6 @@ unpacker::~unpacker() { TFile::Open(fOutFileName); // gROOT->ProcessLine("new TBrowser;"); // gSystem->Exec(". ./runread.sh&"); -#endif } // cout<<"--------------------------------"< Wrong number of sensors (%3u --> %3u )! Frame number %10u skipped! File Number: %10u\n", fNrSensors, nrSensors, eventnrcount, fCurrFile); + printf("\r Data inconsistent: Wrong number of sensors (%2u-->%2u)! Frame number %8u skipped! File Number: %3u\n", fNrSensors, nrSensors, eventnrcount, fCurrFile); } else { @@ -185,7 +184,6 @@ bool unpacker::checkFiles(TString Dir, TString File) { fEvents = 0; ULong_t End; - // Check naming of 'Dir' and 'File' if( dir[strlen(dir)-1] != '/' ) { @@ -195,13 +193,20 @@ bool unpacker::checkFiles(TString Dir, TString File) { len = strlen(file); - for(uint i=0;i<4;i++) + if(len>4) { - if( file [len-4+i] != ending[i] ) + for(uint i=0;i<4;i++) { - has_ending = false; + if( file [len-4+i] != ending[i] ) + { + has_ending = false; + } } } + else + { + has_ending = false; + } for(uint i=0;i 0 fOutputFile = new TFile (fOutFileName,"RECREATE"); -#endif + for(Int_t i=0; i