#include "workstation.h"
 
#include "daq.h"
 
#include "root_include.h"
 
#include "windowed_test.h"
 
 
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <unistd.h>
 
 
 
#include "daqscope.h"
 
 
 
//---------------------------------------------------------------
 
// Subwindow layout class
 
 
 
class TGMdiSubwindow
 
{
 
RQ_OBJECT("TGMdiSubwindow")
 
 
 
protected:
 
   TGMdiFrame       *fMdiFrame;
 
 
 
public:
 
   TGMdiSubwindow(TGMdiMainFrame *main, int w, int h);
 
 
 
   TGMdiFrame *GetMdiFrame() const { return fMdiFrame; }
 
   virtual Bool_t CloseWindow();
 
};
 
 
 
//---------------------------------------------------------------
 
// Main window class
 
 
 
class TGAppMainFrame
 
{
 
RQ_OBJECT("TGAppMainFrame")
 
 
 
protected:
 
   TGMainFrame     *fMain;
 
   TGMdiMainFrame  *fMainFrame;
 
   TGMdiMenuBar    *fMenuBar;
 
   TGLayoutHints   *fMenuBarItemLayout;
 
   TGPopupMenu     *fMenuFile, *fMenuAnalysis, *fMenuTools, *fMenuWindow, *fMenuHelp;
 
   TGPopupMenu     *fMenuHisttype;
 
   TGMdiSubwindow  *settingsPane, *mainSubwindow, *histogramPane, *histogramPaneFile, *histogramPaneCtr, *fieldpointPane, *headerPane;
 
 
 
   void InitMenu();
 
   void MeasurementLayout();
 
   void OpenWindow(int winid);
 
   void CloseWindow();
 
   Bool_t About();
 
public:
 
   TGAppMainFrame(const TGWindow *p, int w, int h);
 
 
 
   void HandleMenu(Int_t id);
 
 
 
   void EnableVoltScan();
 
   void EnableSurfScan();
 
   void EnableZaxisScan();
 
   void VoltageLimit();
 
   void ChannelLimit();
 
   void CleanPlotToggle();
 
   void ConnectToScope();
 
 
 
   void SetVoltOut();
 
   void GetVoltOut();
 
   void ResetVoltOut();
 
   void SetPosition();
 
   void GetPosition();
 
   void HomePosition();
 
 
 
   void InitializeScope();
 
   void StartScopeAcq();
 
   void CustomScopeCommand();
 
   void SelectedMeasType(int mtype);
 
 
 
   void SaveFile();
 
   void StartAcq();
 
 
 
   void SelectDirectory();
 
   void ListMultiSelect();
 
   void ListSelectAll();
 
   void FileListNavigation(int pn);
 
   void HeaderEdit();
 
 
 
   void DisplayHistogram(char *histfile, int histtype);
 
   void SetHistRange();
 
   void ChangeHisttype(int type);
 
   void ChangeChannel();
 
   void HistogramExport();
 
   void MakeSurfPlot(TList *files);
 
   void MakeBreakdownPlot(int nrp, double *volt, double *volterr, double *psep1, double *pseperr1, double *psep2, double *pseperr2, double *psep3, double *pseperr3, char *plotfile, int separations);
 
 
 
   void FitSpectrum(TList *files, int q);
 
   void EdgeDetection(TGraph *pdf, TGraph *cdf, char *outname, TCanvas *g1dCanvas, double pdfmax, int direction);
 
   void IntegSpectrum(TList *files, int direction);
 
   void PhotonMu(TList *files);
 
 
 
   void UpdateTempPlot();
 
   void TempEndToggle();
 
   void ExportTempPlot();
 
   void GetTempFile(int set);
 
 
 
   void EditTickToggle(int set);
 
   void headerchange(char *histfile, bool *changetype);
 
   void headeredit();
 
 
 
   void RunMeas(void *ptr, int runCase, int zaxisscan, int &scanon);
 
};
 
 
 
const char *histExt = ".root";
 
const char *histExtAll = "*.root";
 
daq *gDaq;
 
daqscope *gScopeDaq;
 
//int debugSig = 0;
 
int retTemp;
 
int gStop=0;
 
unsigned int gBuf[BSIZE];
 
int logchange = 0;
 
double tdctimeconversion = 45.0909;
 
double lenconversion = 0.3595;
 
int oscOn;
 
const char *allMeasNames[11] = {"Amplitude","Area","Delay","Fall","Frequency","Maximum","Mean","Minimum","Peak-to-peak","Peak width","Rise"};
 
 
 
// ROOT file variable structure -----------
 
struct EventHeader {
 
  int nrch;
 
  int timestamp;
 
  double biasvolt;
 
  int xpos;
 
  int ypos;
 
  int zpos;
 
  double temperature;
 
  double angle;
 
  char laserinfo[256];
 
} evtheader;
 
 
 
struct EventData {
 
  int adcdata[8];
 
  int tdcdata[8];
 
} evtdata;
 
 
 
struct EventMeas {
 
  double measdata;
 
} evtmeas;
 
 
 
TFile *inroot;
 
TFile *outroot;
 
 
 
// Test graphs for scope measurements
 
TCanvas *wCanvas;
 
TGraph *testgraph;
 
 
 
//---------------------------------------------------------------
 
// Global variables
 
 
 
TGCheckButton *voltscanOn;
 
TGCheckButton *surfscanOn;
 
TGCheckButton *zscanOn;
 
TGTextEntry   *oscIP;
 
TGTextButton  *oscConnect;
 
TGCheckButton *histogramOn;
 
TGNumberEntry *vHardlimit;
 
TGNumberEntry *NCH;
 
TGTextEntry   *laserInfo;
 
TGNumberEntry *chtemp;
 
TGNumberEntry *incangle;
 
TGCheckButton *cleanOn;
 
 
 
TGTab         *setTab;
 
TGComboBox    *vOutCh;
 
TGNumberEntry *vOut;
 
TGCheckButton *vOutOnOff;
 
TGTextButton  *vOutSet;
 
TGTextButton  *vOutGet;
 
TGTextButton  *vOutReset;
 
TGNumberEntry *vOutStart;
 
TGNumberEntry *vOutStop;
 
TGNumberEntry *vOutStep;
 
TGNumberEntry *xPos;
 
TGNumberEntry *yPos;
 
TGNumberEntry *zPos;
 
TGTextButton  *positionSet;
 
TGTextButton  *positionGet;
 
TGTextButton  *positionHome;
 
TGNumberEntry *xPosMin;
 
TGNumberEntry *xPosMax;
 
TGNumberEntry *xPosStep;
 
TGNumberEntry *yPosMin;
 
TGNumberEntry *yPosMax;
 
TGNumberEntry *yPosStep;
 
TGNumberEntry *zPosMin;
 
TGNumberEntry *zPosMax;
 
TGNumberEntry *zPosStep;
 
TGNumberEntry *evtNum;
 
TGTextEntry   *timeStamp;
 
TGTextEntry   *fileName;
 
TGTextButton  *saveFile;
 
TGTextButton  *measStart;
 
TGLabel       *busyLabel;
 
TGHProgressBar *curProgress;
 
 
 
TRootEmbeddedCanvas *histCanvas;
 
 
 
TGTextButton  *selectDir;
 
TGListBox     *fileList;
 
TGCheckButton *multiSelect;
 
TGCheckButton *multiSelectAll;
 
TGTextButton  *prevFile;
 
TGTextButton  *nextFile;
 
TGTextButton  *editHeader;
 
 
 
TGTextEntry *disptime;
 
TGNumberEntry *dispbias;
 
TGTextEntry *disppos;
 
TGNumberEntry *disptemp;
 
TGNumberEntry *dispangle;
 
TGTextEntry *displaser;
 
 
 
TGNumberEntry *adcMinRange;
 
TGNumberEntry *adcMaxRange;
 
TGNumberEntry *tdcMinwindow;
 
TGNumberEntry *tdcMaxwindow;
 
TGNumberEntry *yMinRange;
 
TGNumberEntry *yMaxRange;
 
TGNumberEntry *selectCh;
 
TGTextButton  *changeADC;
 
TGTextButton  *changeTDC;
 
TGTextButton  *changeADCTDC;
 
TGTextButton  *change2Dsurf;
 
TGCheckButton *logscale;
 
TGTextButton  *exportHist;
 
TGNumberEntry *fitSigma;
 
TGNumberEntry *fitTresh;
 
TGNumberEntry *fitInter;
 
TGNumberEntry *accError;
 
TGNumberEntry *minPeak;
 
TGNumberEntry *pedesLow;
 
TGCheckButton *exfitplots;
 
 
 
TGCheckButton *sCH[8];
 
TGComboBox    *sMeasType;
 
TGCheckButton *sCamaclink;
 
TGTextEntry   *scopeCommand;
 
TGTextEntry   *scopeReturn;
 
TGTextButton  *sendScopeCustom;
 
TGComboBox    *sMeasgroup;
 
TGTextButton  *scopeInit;
 
 
 
TRootEmbeddedCanvas *displayCanvas;
 
TGComboBox    *tempCh;
 
TGComboBox    *tempDay[2];
 
TGComboBox    *tempMonth[2];
 
TGComboBox    *tempYear[2];
 
TGComboBox    *tempHour[2];
 
TGComboBox    *tempMinute[2];
 
TGComboBox    *tempSecond[2];
 
TGTextButton  *tempFile[2];
 
TGCheckButton *tempEndOn;
 
TGTextButton  *updateTemp;
 
TGTextButton  *exportTemp;
 
//TGTextButton  *closeTemp;
 
 
 
TGCheckButton *biasedittick;
 
TGNumberEntry *biasedit;
 
TGCheckButton *posedittick;
 
TGNumberEntry *posedit[3];
 
TGCheckButton *tempedittick;
 
TGNumberEntry *tempedit;
 
TGCheckButton *angleedittick;
 
TGNumberEntry *angleedit;
 
TGCheckButton *laseredittick;
 
TGTextEntry   *laseredit;
 
TGTextButton  *editHead;
 
 
 
Bool_t firstrun = kTRUE;
 
Bool_t started;
 
Bool_t cleanPlots = kTRUE;
 
 
 
// Layout hints definitions
 
TGLayoutHints *f0 = new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2);
 
TGLayoutHints *f0centerx = new TGLayoutHints(kLHintsCenterX,2,2,2,2);
 
TGLayoutHints *f0centery = new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,2,2);
 
TGLayoutHints *f0center2d = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,2,2,2,2);
 
TGLayoutHints *f0right = new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2);
 
TGLayoutHints *f1 = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,2,2,2,2);
 
TGLayoutHints *f2 = new TGLayoutHints(kLHintsExpandX,2,2,2,2);
 
TGLayoutHints *f3 = new TGLayoutHints(kLHintsCenterY,2,2,20,2);
 
TGLayoutHints *f3notop = new TGLayoutHints(kLHintsCenterY,4,4,2,30);
 
 
 
// Separate functions -----------------------------------------
 
void GetTime(int intime, char *outtime)
 
{
 
   time_t rawtime;
 
   struct tm * timeinfo;
 
   if(intime < 0)
 
   else
 
      rawtime = (time_t)intime;
 
   if(len) outtime[len-1] = 0;
 
}
 
 
 
int MyTimer()
 
{
 
   char cmd[100];
 
   GetTime(-1, cmd);
 
   if (timeStamp) timeStamp->SetText(cmd);
 
   return 0;
 
}
 
 
 
int GetChannel()
 
{
 
   int selectedOutput;
 
   if(vOutCh->GetSelected() < 8) selectedOutput = (vOutCh->GetSelected())+1;
 
   else if( (vOutCh->GetSelected() >= 8) && (vOutCh->GetSelected() < 16) ) selectedOutput = (vOutCh->GetSelected())+93;
 
   else selectedOutput = 1;
 
 
 
   return selectedOutput;
 
}
 
 
 
void remove_ext(char *inname, char *outname)
 
{
 
  char ctemp[256];
 
  for(int i 
= 0; i 
< (int)strlen(inname
); i
++)  
  {
 
    if( (inname
[i
] == '.') && (i 
> (int)(strlen(inname
)-6)) )  
    {
 
      ctemp[i] = '\0';
 
      break;
 
    }
 
    else
 
      ctemp[i] = inname[i];
 
  }
 
 
 
  if(debug)
 
    printf("Outfile (remove_ext): %s\n", outname
);  
}
 
 
 
void remove_from_last(char *inname, char search, char *outname)
 
{
 
   char ctemp[256];
 
   int searchpos = -1;
 
   for(int i 
= (int)strlen(inname
); i 
>= 0; i
--)  
   {
 
      if(inname[i] == search)
 
      {
 
         searchpos = i;
 
         break;
 
      }
 
   }
 
 
 
   for(int i = 0; i < searchpos; i++)
 
      ctemp[i] = inname[i];
 
 
 
   ctemp[searchpos] = '\0';
 
 
 
   if(debug)
 
      printf("Outfile (remove_from_last): %s\n", outname
);  
}
 
 
 
void SeqNumber(int innum, int maxnum, char *outstr)
 
{
 
   int zeronum = 5;
 
 
 
   // Check how many zeroes we need to add to get sequential numbers
 
   if( (maxnum > 0) && (maxnum < 1000) )
 
      zeronum = 2;
 
   else if( (maxnum >= 1000) && (maxnum < 10000) )
 
      zeronum = 3;
 
   else if( (maxnum >= 10000) && (maxnum < 100000) )
 
      zeronum = 4;
 
   else if( (maxnum >= 100000) && (maxnum < 1000000) )
 
      zeronum = 5;
 
 
 
   // Make the sequence number depending on the number of zeroes
 
   if(zeronum == 2)
 
   {
 
      if(innum < 10)
 
      else if( (innum >= 10) && (innum < 100) )
 
      else if( (innum >= 100) && (innum < 1000) )
 
   }
 
   else if(zeronum == 3)
 
   {
 
      if(innum < 10)
 
      else if( (innum >= 10) && (innum < 100) )
 
      else if( (innum >= 100) && (innum < 1000) )
 
      else if( (innum >= 1000) && (innum < 10000) )
 
   }
 
   else if(zeronum == 4)
 
   {
 
      if(innum < 10)
 
      else if( (innum >= 10) && (innum < 100) )
 
      else if( (innum >= 100) && (innum < 1000) )
 
      else if( (innum >= 1000) && (innum < 10000) )
 
      else if( (innum >= 10000) && (innum < 100000) )
 
   }
 
   else if(zeronum == 5)
 
   {
 
      if(innum < 10)
 
      else if( (innum >= 10) && (innum < 100) )
 
      else if( (innum >= 100) && (innum < 1000) )
 
      else if( (innum >= 1000) && (innum < 10000) )
 
      else if( (innum >= 10000) && (innum < 100000) )
 
      else if( (innum >= 100000) && (innum < 1000000) )
 
   }
 
}
 
 
 
// Peak detection function
 
int npeaks;
 
double FindPeaks(double *x, double *par)
 
{
 
   double result = 0;
 
   for(int i = 0; i < npeaks; i++)
 
   {
 
      double norm = par[3*i];
 
      double mean = par[3*i+1];
 
      double sigma = par[3*i+2];
 
      result += norm*TMath::Gaus(x[0], mean, sigma);
 
   }
 
   return result;
 
}
 
 
 
// Temperature sensor functions -----------------------------
 
const char* dbname = "mysql://f9lab08.ijs.si/f9phdet";
 
const char* tblname = "fprtd122";
 
const char* username = "f9daq";
 
const char* userpass = "f9lab";
 
 
 
// Get the temperature from MYSQL database
 
double GetTemperature(int ch, const char *s)
 
{
 
   int bin=5+7*4-ch*4;
 
   char hex[16];
 
   strncpy(hex
, (const char *) &s
[bin
], 4);  
   hex[4]=0;
 
   int ix;
 
   //printf("0x%s\t",hex);
 
   return (ix/65535.)*1050.-200.;
 
}
 
 
 
// Transform local time to timestamp
 
int GetTimeStamp(int *intime)
 
{
 
   time_t rawtime;
 
   struct tm * timeinfo;
 
 
 
   printf("%d.%d.%d, %d:%d:%d\n", intime
[0], intime
[1], intime
[2], intime
[3], intime
[4], intime
[5]);  
 
 
   timeinfo->tm_mday = intime[0];
 
   timeinfo->tm_mon = intime[1] - 1;
 
   timeinfo->tm_year = intime[2] - 1900;
 
   timeinfo->tm_hour = intime[3];
 
   timeinfo->tm_min = intime[4];
 
   timeinfo->tm_sec = intime[5];
 
   
 
}
 
 
 
// Get data from MYSQL database
 
void fieldpoint(int *timerange, int selch)
 
{
 
   char humantime[256];
 
 
 
   // Display selected timestamps
 
   GetTime(timerange[0], humantime);
 
   printf("Minimum time set to: %s (%d)\n", humantime
, timerange
[0]);  
   if(timerange[1] != -1)
 
   {
 
      GetTime(timerange[1], humantime);
 
      printf("Maximum time set to: %s (%d)\n", humantime
, timerange
[1]);  
   }
 
   printf("Selected fieldpoint channel: %d\n", selch
);  
 
 
   // Database settings
 
   TSQLServer *db = TSQLServer::Connect(dbname, username, userpass);
 
   printf("Server info: %s\n", db
->ServerInfo
());  
   TSQLRow *row;
 
   TSQLResult *res;
 
 
 
   // list databases available on server
 
   printf("\nList all databases on server %s\n", db
->GetHost
());  
   res = db->GetDataBases();
 
   while ((row = res->Next())) {
 
      printf("%s\n", row
->GetField
(0));  
      delete row;
 
   }
 
   delete res;
 
 
 
   // list tables in database "test" (the permission tables)
 
   printf("\nList all tables in database \"f9phdet\" on server %s\n", db
->GetHost
());  
   res = db->GetTables("f9phdet");
 
   while ((row = res->Next())) {
 
      printf("%s\n", row
->GetField
(0));  
      delete row;
 
   }
 
   delete res;
 
   
 
   // list columns in table "runcatalog" in database "mysql"
 
   printf("\nList all columns in table \"f9phdet\" in database \"f9rtd122\" on server %s\n", db
->GetHost
());  
   res = db->GetColumns("f9phdet", "fprtd122");
 
   while ((row = res->Next())) {
 
      printf("%s\n", row
->GetField
(0));  
      delete row;
 
   }
 
   delete res;
 
 
 
   // query database and print results
 
   char sql[1000] = "SELECT status,data,timestamp FROM fprtd122 WHERE status='A272727272727272748' AND substring(data,1,4)='A00C' ";
 
   if(timerange[1] == -1)
 
      sprintf(sql
,"%s AND timestamp>='%d'", sql
, timerange
[0]);  
   else
 
      sprintf(sql
,"%s AND timestamp>='%d' AND timestamp<='%d'", sql
, timerange
[0], timerange
[1]);  
   
 
   res = db->Query(sql);
 
 
 
   int nrows = res->GetRowCount();
 
   printf("\nGot %d rows in result\n", nrows
);  
   
 
   // Printing and plotting
 
   char timeval[256];
 
   TGraph *gr;
 
   gr = new TGraph(nrows);
 
   gr->SetLineColor(kRed);
 
   gr->SetLineWidth(1);
 
   gr->SetMarkerColor(kRed);
 
   gr->SetMarkerStyle(20);
 
   gr->SetTitle("Temperature sensor;Time;Temperature (deg.)");
 
 
 
   FILE *fp;
 
   fp 
= fopen("./fieldpoint/dataout_fieldpoint.txt", "w"); 
 
 
   if(debug)
 
      printf("Time\tTemperature\n");  
   for (int i = 0; i < nrows; i++) {
 
      row = res->Next();
 
 
 
      GetTime
((int)atof(row
->GetField
(2)), timeval
); 
      double x 
= atof(row
->GetField
(2));  
      double y = GetTemperature(selch,row->GetField(1));
 
      gr->SetPoint(i,x,y);
 
 
 
 
 
      if(debug)
 
      
 
      delete row;
 
   }
 
 
 
 
 
   delete res;
 
   delete db;
 
 
 
   TCanvas *gCanvas = displayCanvas->GetCanvas();
 
   gCanvas->SetGrid();
 
   gr->GetXaxis()->SetTimeDisplay(1);
 
   gr->GetXaxis()->SetTimeFormat("%d.%m.%H:%M");
 
   gr->GetXaxis()->SetLabelSize(0.027);
 
   gr->GetXaxis()->SetTitleSize(0.038);
 
   gr->GetYaxis()->SetLabelSize(0.027);
 
   gr->GetYaxis()->SetTitleSize(0.038);
 
   gr->GetXaxis()->SetNdivisions(515,kTRUE);
 
   gr->Draw("AL");
 
 
 
   gCanvas->Modified();
 
   gCanvas->Update();
 
}
 
 
 
// Update the temperature plot
 
void TGAppMainFrame::UpdateTempPlot()
 
{
 
   int stime[6];
 
   int etime[6];
 
 
 
   int timestamp[2];
 
 
 
   time_t rtime;
 
   int curyear;
 
   curyear 
= (int)(localtime(&rtime
))->tm_year
+1900; 
 
 
   int leapy = 0;
 
 
 
   // Getting the start time
 
   stime[0] = (int)(tempDay[0]->GetSelected())+1;
 
   stime[2] = curyear - (int)(tempYear[0]->GetSelected());
 
   printf("%d, %d, %d\n", stime
[2], curyear
, (int)(tempYear
[0]->GetSelected
()));  
   stime[3] = (int)(tempHour[0]->GetSelected());
 
   stime[4] = (int)(tempMinute[0]->GetSelected());
 
   stime[5] = (int)(tempSecond[0]->GetSelected());
 
 
 
   switch( tempMonth[0]->GetSelected() )
 
   {
 
      case 0:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 1:
 
         if( stime[2]%4 == 0)
 
            leapy = 1;
 
 
 
         if( (leapy == 1) && (stime[0] > 29) )
 
         {
 
            stime[0] = 29;
 
            tempDay[0]->Select(28);
 
         }
 
         else if( (leapy == 0) && (stime[0] > 28) )
 
         {
 
            stime[0] = 28;
 
            tempDay[0]->Select(27);
 
         }
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 2:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 3:
 
         if(stime[0] > 30)
 
         {
 
            stime[0] = 30;
 
            tempDay[0]->Select(29);
 
         }
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 4:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 5:
 
         if(stime[0] > 30)
 
         {
 
            stime[0] = 30;
 
            tempDay[0]->Select(29);
 
         }
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 6:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 7:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 8:
 
         if(stime[0] > 30)
 
         {
 
            stime[0] = 30;
 
            tempDay[0]->Select(29);
 
         }
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 9:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 10:
 
         if(stime[0] > 30)
 
         {
 
            stime[0] = 30;
 
            tempDay[0]->Select(29);
 
         }
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      case 11:
 
         stime[1] = (int)(tempMonth[0]->GetSelected())+1;
 
         break;
 
      default:
 
         break;
 
   }
 
 
 
   timestamp[0] = GetTimeStamp(stime);
 
   printf("Start time: %d\n", timestamp
[0]);  
 
 
   // Getting the end time
 
   etime[0] = (int)(tempDay[1]->GetSelected())+1;
 
   etime[2] = curyear - (int)(tempYear[1]->GetSelected());
 
   etime[3] = (int)(tempHour[1]->GetSelected());
 
   etime[4] = (int)(tempMinute[1]->GetSelected());
 
   etime[5] = (int)(tempSecond[1]->GetSelected());
 
 
 
   switch( tempMonth[1]->GetSelected() )
 
   {
 
      case 0:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 1:
 
         if( etime[2]%4 == 0)
 
            leapy = 1;
 
 
 
         if( (leapy == 1) && (etime[0] > 29) )
 
         {
 
            etime[0] = 29;
 
            tempDay[1]->Select(28);
 
         }
 
         else if( (leapy == 0) && (etime[0] > 28) )
 
         {
 
            etime[0] = 28;
 
            tempDay[1]->Select(27);
 
         }
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 2:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 3:
 
         if(etime[0] > 30)
 
         {
 
            etime[0] = 30;
 
            tempDay[1]->Select(29);
 
         }
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 4:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 5:
 
         if(etime[0] > 30)
 
         {
 
            etime[0] = 30;
 
            tempDay[1]->Select(29);
 
         }
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 6:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 7:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 8:
 
         if(etime[0] > 30)
 
         {
 
            etime[0] = 30;
 
            tempDay[1]->Select(29);
 
         }
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 9:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 10:
 
         if(etime[0] > 30)
 
         {
 
            etime[0] = 30;
 
            tempDay[1]->Select(29);
 
         }
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      case 11:
 
         etime[1] = (int)(tempMonth[1]->GetSelected())+1;
 
         break;
 
      default:
 
         break;
 
   }
 
 
 
   if( tempEndOn->IsDown() )
 
      timestamp[1] = -1;
 
   else
 
      timestamp[1] = GetTimeStamp(etime);
 
   printf("End time: %d\n", timestamp
[1]);  
 
 
   fieldpoint(timestamp, tempCh->GetSelected());
 
}
 
 
 
// Export the temperature plot to pdf
 
void TGAppMainFrame::ExportTempPlot()
 
{
 
   TCanvas *gCanvas = displayCanvas->GetCanvas();
 
   gCanvas->Modified();
 
   gCanvas->Update();
 
   gCanvas->SaveAs("./fieldpoint/plotout_fieldpoint.pdf");
 
}
 
 
 
// Get time information from a saved file
 
void TGAppMainFrame::GetTempFile(int set)
 
{
 
   TGFileInfo file_info;
 
   const char *filetypes[] = {"Histograms",histExtAll,0,0};
 
   file_info.fFileTypes = filetypes;
 
   file_info.fIniDir = StrDup("./results");
 
   file_info.fMultipleSelection = kFALSE;
 
   new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDOpen, &file_info);
 
   int i = 0;
 
 
 
   TTree *header_data;
 
   struct tm * timeinfo;
 
 
 
   int curyear;
 
 
 
   TList *files = file_info.fFileNamesList;
 
   TString fname;
 
   // If multiple files were selected, only use the first one
 
   if(files)
 
   {
 
      printf("Using only the first selected file.\n");  
 
 
      TSystemFile *file;
 
      TIter next(files);
 
      while(i == 0)
 
      {
 
         file=(TSystemFile*)next();
 
         fname = file->GetName();
 
         i++;
 
      }
 
   }
 
   // If only one file was selected, use it
 
   else
 
      fname = file_info.fFilename;
 
 
 
   if((int)fname.Length() > 0)
 
   {
 
      inroot = new TFile(fname, "READ");
 
      
 
      inroot->GetObject("header_data", header_data);
 
      
 
      // Reading the timestamp information
 
      header_data->SetBranchAddress("timestamp", &evtheader.timestamp);
 
      header_data->GetEntry(0);
 
      
 
      rtime = (time_t)evtheader.timestamp;
 
//   printf("Time: %d.%d.%d, %d:%d:%d\n", timeinfo->tm_mday, timeinfo->tm_mon+1, timeinfo->tm_year+1900, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
 
 
 
      tempDay[set]->Select(timeinfo->tm_mday - 1);
 
      tempMonth[set]->Select(timeinfo->tm_mon);
 
      tempYear[set]->Select(curyear - (timeinfo->tm_year+1900));
 
      tempHour[set]->Select(timeinfo->tm_hour);
 
      tempMinute[set]->Select(timeinfo->tm_min);
 
      tempSecond[set]->Select(timeinfo->tm_sec);
 
 
 
      inroot->Close();
 
   }
 
   else
 
      printf("No file selected.\n");  
   
 
   delete inroot;
 
}
 
 
 
// Toggle the endtime settings for temperature sensor
 
void TGAppMainFrame::TempEndToggle()
 
{
 
   if( tempEndOn->IsDown() )
 
   {
 
      tempDay[1]->SetEnabled(kFALSE);
 
      tempMonth[1]->SetEnabled(kFALSE);
 
      tempYear[1]->SetEnabled(kFALSE);
 
      tempHour[1]->SetEnabled(kFALSE);
 
      tempMinute[1]->SetEnabled(kFALSE);
 
      tempSecond[1]->SetEnabled(kFALSE);
 
      tempFile[1]->SetEnabled(kFALSE);
 
   }
 
   else
 
   {
 
      tempDay[1]->SetEnabled(kTRUE);
 
      tempMonth[1]->SetEnabled(kTRUE);
 
      tempYear[1]->SetEnabled(kTRUE);
 
      tempHour[1]->SetEnabled(kTRUE);
 
      tempMinute[1]->SetEnabled(kTRUE);
 
      tempSecond[1]->SetEnabled(kTRUE);
 
      tempFile[1]->SetEnabled(kTRUE);
 
   }
 
}
 
 
 
// --------------------------------------------------------------
 
 
 
// Header editor functions --------------------------------------
 
 
 
// Toggle the edit possibility for header entries
 
void TGAppMainFrame::EditTickToggle(int set)
 
{
 
   if(set == 1)
 
   {
 
      if(biasedittick->IsDown()) biasedit->SetState(kTRUE);
 
      else biasedit->SetState(kFALSE);
 
   }
 
   else if(set == 2)
 
   {
 
      if(posedittick->IsDown())
 
      {
 
         posedit[0]->SetState(kTRUE);
 
         posedit[1]->SetState(kTRUE);
 
         posedit[2]->SetState(kTRUE);
 
      }
 
      else
 
      {
 
         posedit[0]->SetState(kFALSE);
 
         posedit[1]->SetState(kFALSE);
 
         posedit[2]->SetState(kFALSE);
 
      }
 
   }
 
   else if(set == 3)
 
   {
 
      if(tempedittick->IsDown()) tempedit->SetState(kTRUE);
 
      else tempedit->SetState(kFALSE);
 
   }
 
   else if(set == 4)
 
   {
 
      if(angleedittick->IsDown()) angleedit->SetState(kTRUE);
 
      else angleedit->SetState(kFALSE);
 
   }
 
   else if(set == 5)
 
   {
 
      if(laseredittick->IsDown()) laseredit->SetState(kTRUE);
 
      else laseredit->SetState(kFALSE);
 
   }
 
}
 
 
 
// Run the editing of file headers
 
void TGAppMainFrame::headerchange(char *histfile, bool *changetype)
 
{
 
   if(debug)
 
      printf("Selected file: %s\n", histfile
);  
 
 
   // Preparing input file and the temporary output file
 
   inroot = new TFile(histfile, "READ");
 
 
 
   char outname[256];
 
   sprintf(outname
, "%s/results/temp.root", rootdir
);  
   outroot = new TFile(outname, "RECREATE");
 
 
 
   // Tree structure of input file
 
   TTree *header_data, *meas_data, *scope_data;
 
 
 
   inroot->GetObject("header_data", header_data);
 
   inroot->GetObject("meas_data", meas_data);
 
   inroot->GetObject("scope_data", scope_data);
 
 
 
   // Tree structure of output file
 
   TTree *new_meas_data = meas_data->CloneTree();
 
   TTree *new_scope_data = scope_data->CloneTree();
 
 
 
   // Save branches from the old header to temporary variables
 
   header_data->SetBranchAddress("nrch", &evtheader.nrch);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("timestamp", &evtheader.timestamp);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("xpos", &evtheader.xpos);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("ypos", &evtheader.ypos);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("zpos", &evtheader.zpos);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("temperature", &evtheader.temperature);
 
   header_data->GetEntry(0);
 
   if( header_data->FindBranch("angle") )
 
   {
 
      header_data->SetBranchAddress("angle", &evtheader.angle);
 
      header_data->GetEntry(0);
 
   }
 
   header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo);
 
   header_data->GetEntry(0);
 
 
 
   int itemp[5] = {0,0,0,0,0};
 
   double dtemp[3] = {0.,0.,0.};
 
   char ctemp[256];
 
 
 
   itemp[0] = evtheader.nrch;
 
   itemp[1] = evtheader.timestamp;
 
   itemp[2] = evtheader.xpos;
 
   itemp[3] = evtheader.ypos;
 
   itemp[4] = evtheader.zpos;
 
   dtemp[0] = evtheader.biasvolt;
 
   dtemp[1] = evtheader.temperature;
 
   if( header_data->FindBranch("angle") )
 
      dtemp[2] = evtheader.angle;
 
   else
 
      dtemp[2] = 0.;
 
   sprintf(ctemp
, "%s", evtheader.
laserinfo);  
 
 
   delete header_data;
 
   delete meas_data;
 
   delete scope_data;
 
   inroot->Close();
 
   delete inroot;
 
  
 
   // Prepare branches for the new header
 
   TTree *new_header_data = new TTree("header_data", "Header information for the measurement.");
 
   new_header_data->Branch("nrch", &evtheader.nrch, "nrch/I");
 
   new_header_data->Branch("timestamp", &evtheader.timestamp, "timestamp/I");
 
   new_header_data->Branch("biasvolt", &evtheader.biasvolt, "biasvolt/D");
 
   new_header_data->Branch("xpos", &evtheader.xpos, "xpos/I");
 
   new_header_data->Branch("ypos", &evtheader.ypos, "ypos/I");
 
   new_header_data->Branch("zpos", &evtheader.zpos, "zpos/I");
 
   new_header_data->Branch("temperature", &evtheader.temperature, "temperature/D");
 
   new_header_data->Branch("angle", &evtheader.angle, "temperature/D");
 
   new_header_data->Branch("laserinfo", &evtheader.laserinfo, "laserinfo/C");
 
 
 
   // Save new values (and old ones where we don't want to edit anything)
 
   evtheader.nrch = itemp[0];
 
   evtheader.timestamp = itemp[1];
 
   if(changetype[0])
 
      evtheader.biasvolt = (double)biasedit->GetNumber();
 
   else
 
      evtheader.biasvolt = dtemp[0];
 
   if(changetype[1])
 
   {
 
      evtheader.xpos = (int)posedit[0]->GetNumber();
 
      evtheader.ypos = (int)posedit[1]->GetNumber();
 
      evtheader.zpos = (int)posedit[2]->GetNumber();
 
   }
 
   else
 
   {
 
      evtheader.xpos = itemp[2];
 
      evtheader.ypos = itemp[3];
 
      evtheader.zpos = itemp[4];
 
   }
 
   if(changetype[2])
 
      evtheader.temperature = (double)tempedit->GetNumber();
 
   else
 
      evtheader.temperature = dtemp[1];
 
   if(changetype[3])
 
      evtheader.angle = (double)angleedit->GetNumber();
 
   else
 
      evtheader.angle = dtemp[2];
 
   if(changetype[4])
 
      sprintf(evtheader.
laserinfo, "%s", laseredit
->GetText
());  
   else
 
      sprintf(evtheader.
laserinfo, "%s", ctemp
);  
 
 
   new_header_data->Fill();
 
 
 
   // Write down the temporary output file
 
   new_header_data->Write();
 
   new_meas_data->Write();
 
   new_scope_data->Write();
 
 
 
   delete new_header_data;
 
   delete new_meas_data;
 
   delete new_scope_data;
 
   outroot->Close();
 
   delete outroot;
 
 
 
   // Replace the original file with temporary output file (and delete temporary file)
 
   sprintf(outname
, "cp -f %s/results/temp.root %s", rootdir
, histfile
);  
   sprintf(outname
, "rm -f %s/results/temp.root", rootdir
);  
 
 
   printf("Edited header in file: %s\n", histfile
);  
}
 
 
 
// Setup the editing of file headers
 
void TGAppMainFrame::headeredit()
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   TList *files;
 
   // Changelist: Bias, Position, Temperature, Angle, Laser info
 
   bool changelist[] = { biasedittick->IsDown(), posedittick->IsDown(), tempedittick->IsDown(), angleedittick->IsDown(), laseredittick->IsDown() };
 
 
 
   if( nrfiles > 0 )
 
   {
 
      // check the selected file/files and return its name/their names
 
      files = new TList();
 
      fileList->GetSelectedEntries(files);
 
      if(files)
 
      {
 
         for(int i = 0; i < (int)nrfiles; i++)
 
         {
 
            if(files->At(i))
 
            {
 
               if(debug)
 
                  printf("Filename: %s\n", files
->At
(i
)->GetTitle
());  
 
 
               headerchange( (char*)(files->At(i)->GetTitle()), changelist );
 
            }
 
         }
 
      }
 
   }
 
}
 
 
 
// --------------------------------------------------------------
 
 
 
// Class related functions --------------------------------------
 
 
 
// Apply the upper voltage limit from settings pane to main window
 
void TGAppMainFrame::VoltageLimit()
 
{
 
   vOut->SetLimitValues(0, vHardlimit->GetNumber() );
 
}
 
 
 
// Apply the upper channel limit from settings pane to histogram settings
 
void TGAppMainFrame::ChannelLimit()
 
{
 
   selectCh->SetLimitValues(0, (NCH->GetNumber()-1) );
 
}
 
 
 
// Enable or disable voltage scan controls
 
void TGAppMainFrame::EnableVoltScan()
 
{
 
   if(voltscanOn->IsOn())
 
   {
 
      vOutStart->SetState(kTRUE);
 
      vOutStop->SetState(kTRUE);
 
      vOutStep->SetState(kTRUE);
 
   }
 
   else
 
   {
 
      vOutStart->SetState(kFALSE);
 
      vOutStop->SetState(kFALSE);
 
      vOutStep->SetState(kFALSE);
 
   }
 
}
 
 
 
// Enable or disable surface scan controls
 
void TGAppMainFrame::EnableSurfScan()
 
{
 
   if(surfscanOn->IsOn())
 
   {
 
      xPosMin->SetState(kTRUE);
 
      xPosMax->SetState(kTRUE);
 
      xPosStep->SetState(kTRUE);
 
      yPosMin->SetState(kTRUE);
 
      yPosMax->SetState(kTRUE);
 
      yPosStep->SetState(kTRUE);
 
   }
 
   else
 
   {
 
      xPosMin->SetState(kFALSE);
 
      xPosMax->SetState(kFALSE);
 
      xPosStep->SetState(kFALSE);
 
      yPosMin->SetState(kFALSE);
 
      yPosMax->SetState(kFALSE);
 
      yPosStep->SetState(kFALSE);
 
   }
 
}
 
 
 
// Enable or disable Z axis scan controls
 
void TGAppMainFrame::EnableZaxisScan()
 
{
 
   if(zscanOn->IsOn())
 
   {
 
      zPosMin->SetState(kTRUE);
 
      zPosMax->SetState(kTRUE);
 
      zPosStep->SetState(kTRUE);
 
   }
 
   else
 
   {
 
      zPosMin->SetState(kFALSE);
 
      zPosMax->SetState(kFALSE);
 
      zPosStep->SetState(kFALSE);
 
   }
 
}
 
 
 
// Toggle clean plots on/off
 
void TGAppMainFrame::CleanPlotToggle()
 
{
 
   cleanPlots = cleanOn->IsDown();
 
}
 
 
 
// Connect to oscilloscope
 
void TGAppMainFrame::ConnectToScope()
 
{
 
   int scopeState = -1;
 
   char *IPaddr = (char*)oscIP->GetText();
 
   int IPcorr = 0;
 
 
 
   if(oscOn == 0)
 
   {
 
      // Check if the IP address has the required three .
 
      for(int i 
= 0; i 
< (int)strlen(IPaddr
); i
++)  
         if(IPaddr[i] == '.')
 
            IPcorr++;
 
    
 
      if( (IPaddr != NULL) && (IPcorr == 3) )
 
      {
 
#if WORKSTAT == 'I' || WORKSTAT == 'S'
 
         printf("Connecting to oscilloscope.\n");  
         retTemp = gScopeDaq->connect(IPaddr);
 
         scopeState = 1; // For testing instead of making a real connection
 
#else
 
         scopeState = 1;
 
         retTemp = 0;
 
#endif
 
      }
 
      else
 
      {
 
         scopeState = -1;
 
         printf("Please enter a valid scope IP address.\n");  
      }
 
   }
 
   else if(oscOn > 0)
 
   {
 
#if WORKSTAT == 'I' || WORKSTAT == 'S'
 
         printf("Disconnecting from oscilloscope.\n");  
         retTemp = gScopeDaq->disconnect(IPaddr);
 
         scopeState = -1; // For testing instead of making a real disconnection
 
#else
 
         scopeState = -1;
 
         retTemp = 0;
 
#endif
 
   }
 
 
 
   if(retTemp == 0)
 
   {
 
      if(scopeState >= 0)
 
      {
 
         oscIP->SetEnabled(kFALSE);
 
         oscConnect->SetText("Disconnect");
 
         oscConnect->SetTextJustify(36);
 
         oscConnect->SetWrapLength(-1);
 
         oscConnect->Resize(60,22);
 
 
 
         for(int i = 0; i < 8; i++)
 
         {
 
            sCH[i]->SetState(kButtonUp);
 
            sCH[i]->SetEnabled(kFALSE);
 
         }
 
         sMeasType->SetEnabled(kTRUE);
 
         sCamaclink->SetState(kButtonUp);
 
         sCamaclink->SetEnabled(kFALSE);
 
         scopeCommand->SetEnabled(kTRUE);
 
         sendScopeCustom->SetEnabled(kTRUE);
 
         sMeasgroup->SetEnabled(kFALSE);
 
         scopeInit->SetEnabled(kFALSE);
 
       
 
         oscOn = 1;
 
      }
 
      else
 
      {
 
         oscIP->SetEnabled(kTRUE);
 
         oscConnect->SetText("Connect");
 
         oscConnect->SetTextJustify(36);
 
         oscConnect->SetWrapLength(-1);
 
         oscConnect->Resize(60,22);
 
    
 
         for(int i = 0; i < 8; i++)
 
         {
 
            sCH[i]->SetState(kButtonUp);
 
            sCH[i]->SetEnabled(kFALSE);
 
         }
 
         sMeasType->Select(0);
 
         sMeasType->SetEnabled(kFALSE);
 
         sCamaclink->SetState(kButtonUp);
 
         sCamaclink->SetEnabled(kFALSE);
 
         scopeCommand->SetEnabled(kFALSE);
 
         sendScopeCustom->SetEnabled(kFALSE);
 
         sMeasgroup->SetEnabled(kFALSE);
 
         scopeInit->SetEnabled(kFALSE);
 
    
 
         oscOn = 0;
 
      }
 
   }
 
   else
 
      printf("Error! Connecting/disconnecting failed.\n");  
}
 
 
 
// Set the output voltage
 
void TGAppMainFrame::SetVoltOut()
 
{
 
   char cmd[256];
 
   int outOn;
 
   float outputVoltage;
 
 
 
   outputVoltage = vOut->GetNumber();
 
 
 
   if(vOutOnOff->IsOn()) outOn = 1;
 
   else outOn = 0;
 
  
 
   sprintf(cmd
, "%s/mpod/mpod_voltage.sh -o %d -v %f -s %d", rootdir
, GetChannel
(), outputVoltage
, outOn
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
}
 
 
 
// Get the output voltage
 
void TGAppMainFrame::GetVoltOut()
 
{
 
   char cmd[256];
 
 
 
   sprintf(cmd
, "%s/mpod/mpod_voltage.sh -o %d -g > %s/curvolt.txt", rootdir
, GetChannel
(), rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
#if WORKSTAT == 'I'
 
   FILE* fvolt;
 
   double dtemp;
 
   char ctemp[24];
 
   sprintf(cmd
, "%s/curvolt.txt", rootdir
);  
   
 
   if(fvolt != NULL)
 
   {
 
      sprintf(cmd
, "WIENER-CRATE-MIB::outputVoltage.u%d = Opaque: Float: %s V\n", GetChannel
()-1, "%lf" );  
      retTemp 
= fscanf(fvolt
, cmd
, &dtemp
); 
      vOut->SetNumber(dtemp);
 
      sprintf(cmd
, "WIENER-CRATE-MIB::outputSwitch.u%d = INTEGER: %s\n", GetChannel
()-1, "%s" );  
      retTemp 
= fscanf(fvolt
, cmd
, ctemp
); 
      if( strcmp(ctemp
, "On(1)") == 0 )  
         vOutOnOff->SetState(kButtonDown);
 
      else if( strcmp(ctemp
, "Off(0)") == 0 )  
         vOutOnOff->SetState(kButtonUp);
 
   }
 
 
 
#endif
 
}
 
 
 
// Reset the output voltage
 
void TGAppMainFrame::ResetVoltOut()
 
{
 
   char cmd[256];
 
 
 
   vOut->SetNumber(0.000);
 
   vOutOnOff->SetState(kButtonUp);
 
 
 
   sprintf(cmd
, "%s/mpod/mpod_voltage.sh -r %d", rootdir
, GetChannel
());  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
}
 
 
 
// Get the current table position
 
void TGAppMainFrame::GetPosition()
 
{
 
   char cmd[256];
 
  
 
   
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -p > %s/curpos.txt", rootdir
, rootdir
);  // X-axis  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
   
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 2 -p >> %s/curpos.txt", rootdir
, rootdir
); // Y-axis  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
   
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 3 -p >> %s/curpos.txt", rootdir
, rootdir
); // Z-axis  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
#if WORKSTAT == 'I'
 
   FILE* fpos;
 
   int itemp;
 
   sprintf(cmd
, "%s/curpos.txt", rootdir
);  
   
 
   if(fpos != NULL)
 
   {
 
      retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
      xPos->SetNumber(itemp);
 
      retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
      yPos->SetNumber(itemp);
 
      retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
      zPos->SetNumber(itemp);
 
   }
 
 
 
#endif
 
}
 
 
 
// Set the current table position
 
void TGAppMainFrame::SetPosition()
 
{
 
   char cmd[256];
 
   int positX, positY, positZ;
 
  
 
   positX = xPos->GetNumber();
 
   positY = yPos->GetNumber();
 
   positZ = zPos->GetNumber();
 
  
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -v %d -s la && %s/MIKRO/mikro_ctrl -n 1 -c m", rootdir
, positX
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 2 -v %d -s la && %s/MIKRO/mikro_ctrl -n 2 -c m", rootdir
, positY
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
  
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 3 -v %d -s la && %s/MIKRO/mikro_ctrl -n 3 -c m", rootdir
, positZ
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
}
 
 
 
// Set the current table position to a predetermined HOME position
 
void TGAppMainFrame::HomePosition()
 
{
 
   char cmd[256];
 
 
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -h", rootdir
);   // X-axis  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 2 -h", rootdir
);   // Y-axis  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
   sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 3 -h", rootdir
);   // Z-axis  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
}
 
 
 
// Initialize the currently connected scope for measurements
 
void TGAppMainFrame::InitializeScope()
 
{
 
   int iTemp;
 
   int chTemp[8];
 
   for(int i = 0; i < 8; i++) chTemp[i] = -1;
 
   gScopeDaq->scopeUseType = sMeasType->GetSelected();
 
 
 
   // Check what channels are selected
 
   iTemp = 0;
 
   for(int i = 0; i < 8; i++)
 
   {
 
      if(sCH[i]->IsDown())
 
      {
 
         chTemp[iTemp] = i;
 
         iTemp++;
 
      }
 
   }
 
   if(iTemp == 0)
 
   {
 
      // If no channel is selected, we select the first one
 
      chTemp[0] = 0;
 
      iTemp++;
 
      sCH[0]->SetState(kButtonDown);
 
   }
 
   // If measurement is used, only use the first selected channel
 
   if(gScopeDaq->scopeUseType == 2)
 
   {
 
      for(int i = 1; i < iTemp; i++)
 
         sCH[chTemp[i]]->SetState(kButtonUp);
 
      iTemp = 1;
 
   }
 
 
 
   gScopeDaq->scopeChanNr = iTemp;
 
   for(int i = 0; i < 8; i++) gScopeDaq->scopeChans[i] = chTemp[i];
 
 
 
   // Check which measurement is selected
 
   gScopeDaq->scopeMeasSel = sMeasgroup->GetSelected();
 
 
 
   gScopeDaq->init();
 
}
 
 
 
// Run a scope measurement
 
void TGAppMainFrame::StartScopeAcq()
 
{
 
   // Lock the scope front panel
 
   gScopeDaq->lockunlock(true);
 
 
 
   retTemp = gScopeDaq->event();
 
 
 
   if(gScopeDaq->scopeUseType == 1)
 
   {
 
      char len[16];
 
      int sval;
 
      short *spoints;
 
 
 
      if(retTemp == 0)
 
      {
 
         // Read the number of y bytes at beginning of CURVE binary data
 
         memcpy(len
, &gScopeDaq
->eventbuf
[1],1);  
         len[1] = 0;
 
//         printf("Number of y bytes = %d\n", sval);
 
 
 
         // Read the data
 
         spoints = (short *)(&gScopeDaq->eventbuf[2+sval]);
 
       
 
         // Read the number of data points
 
         memcpy(len
, &gScopeDaq
->eventbuf
[2],sval
);  
         len[sval] = 0;
 
//         printf("Number of data points = %d\n", sval/2);
 
 
 
         double *grafx, *grafy;
 
         grafx = new double[sval/2];
 
         grafy = new double[sval/2];
 
         // Parse data and graph it
 
         for(int i = 0; i < sval/2; i++)
 
         {
 
            grafx[i] = i*gScopeDaq->tektime*10./(sval/2.);
 
            grafy[i] = ((double)spoints[i]*5.*gScopeDaq->tekvolt/32767.) - (gScopeDaq->choffset*gScopeDaq->tekvolt);
 
         }
 
       
 
         wCanvas->cd();
 
         testgraph = new TGraph(sval/2, grafx, grafy);
 
         testgraph->GetXaxis()->SetTitle("Time [s]");
 
         testgraph->GetXaxis()->SetRangeUser(grafx[0], grafx[(sval/2)-1]);
 
         testgraph->GetYaxis()->SetTitle("Voltage [V]");
 
         testgraph->Draw("AL");
 
         wCanvas->Modified();
 
         wCanvas->Update();
 
       
 
         delete[] grafx;
 
         delete[] grafy;
 
      }
 
   }
 
   else if(gScopeDaq->scopeUseType == 2)
 
   {
 
      if(retTemp == 0)
 
      {
 
         if(gScopeDaq->measubuf < 1.e-4)
 
            printf("Measurement: %le\n", gScopeDaq
->measubuf
);  
         else
 
            printf("Measurement: %lf\n", gScopeDaq
->measubuf
);  
      }
 
   }
 
 
 
   // Unlock the scope front panel
 
   gScopeDaq->lockunlock(false);
 
}
 
 
 
// Send a custom command to the scope
 
void TGAppMainFrame::CustomScopeCommand()
 
{
 
   char *cmd = (char*)scopeCommand->GetText();
 
   char ret[100000];
 
   {
 
      printf("Sending command: %s\n", cmd
);  
#if WORKSTAT == 'I' || WORKSTAT == 'S'
 
      gScopeDaq->customCommand(cmd, false, ret);
 
#endif
 
   }
 
   else
 
   {
 
      printf("Sending query: %s\n", cmd
);  
#if WORKSTAT == 'I' || WORKSTAT == 'S'
 
      gScopeDaq->customCommand(cmd, true, ret);
 
#endif
 
   }
 
 
 
#if WORKSTAT == 'I' || WORKSTAT == 'S'
 
   scopeReturn->SetText(ret);
 
#endif
 
 
 
#if WORKSTAT == 'O'
 
   sprintf(ret
, "Program running in offline mode. Use I or S when configuring...");  
   scopeReturn->SetText(ret);
 
#endif
 
}
 
 
 
// When we select the measurement type, change other scope settings accordingly
 
void TGAppMainFrame::SelectedMeasType(int mtype)
 
{
 
   // No waveform analysis
 
   if(mtype == 0)
 
   {
 
      for(int i = 0; i < 8; i++)
 
      {
 
         sCH[i]->SetState(kButtonUp);
 
         sCH[i]->SetEnabled(kFALSE);
 
      }
 
      sMeasType->SetEnabled(kTRUE);
 
      sCamaclink->SetState(kButtonUp);
 
      sCamaclink->SetEnabled(kFALSE);
 
      scopeCommand->SetEnabled(kTRUE);
 
      sendScopeCustom->SetEnabled(kTRUE);
 
      sMeasgroup->SetEnabled(kFALSE);
 
      scopeInit->SetEnabled(kFALSE);
 
    
 
      oscOn = 1;
 
   }
 
   // Complete waveform acquisition
 
   else if(mtype == 1)
 
   {
 
      for(int i = 0; i < 8; i++)
 
         sCH[i]->SetEnabled(kTRUE);
 
      sMeasType->SetEnabled(kTRUE);
 
      sCamaclink->SetState(kButtonDown);
 
      sCamaclink->SetEnabled(kTRUE);
 
      scopeCommand->SetEnabled(kTRUE);
 
      sendScopeCustom->SetEnabled(kTRUE);
 
      sMeasgroup->SetEnabled(kFALSE);
 
      scopeInit->SetEnabled(kTRUE);
 
    
 
      oscOn = 2;
 
   }
 
   // Waveform measurements
 
   else if(mtype == 2)
 
   {
 
      for(int i = 0; i < 8; i++)
 
         sCH[i]->SetEnabled(kTRUE);
 
      sMeasType->SetEnabled(kTRUE);
 
      sCamaclink->SetState(kButtonUp);
 
      sCamaclink->SetEnabled(kTRUE);
 
      scopeCommand->SetEnabled(kTRUE);
 
      sendScopeCustom->SetEnabled(kTRUE);
 
      sMeasgroup->SetEnabled(kTRUE);
 
      scopeInit->SetEnabled(kTRUE);
 
    
 
      oscOn = 3;
 
   }
 
}
 
 
 
// Make breakdown voltage plot
 
void TGAppMainFrame::MakeBreakdownPlot(int nrp, double *volt, double *volterr, double *psep1, double *pseperr1, double *psep2, double *pseperr2, double *psep3, double *pseperr3, char *plotfile, int separations)
 
{
 
   double fparam[2], fparamerr[2], meanval;
 
   TLatex *latex;
 
   char ctemp[256];
 
   int sortindex[nrp];
 
 
 
   TCanvas *canvas;
 
 
 
   if(separations == 1)
 
   {
 
      canvas = new TCanvas("canv","canv",900,400);
 
   }
 
   else if(separations == 2)
 
   {
 
      canvas = new TCanvas("canv","canv",900,800);
 
      canvas->Divide(1,2);
 
   }
 
   else
 
   {
 
      canvas = new TCanvas("canv","canv",900,1200);
 
      canvas->Divide(1,3);
 
   }
 
 
 
   // First graph is plotted always
 
   TGraphErrors *gr1 = new TGraphErrors(nrp, volt, psep1, volterr, pseperr1);
 
  
 
   if(!cleanPlots)
 
      gr1->SetTitle("1st - 2nd peak separation");
 
   else
 
      gr1->SetTitle();
 
   gr1->SetLineColor(kBlue);
 
   gr1->SetMarkerColor(kBlue);
 
   gr1->SetMarkerStyle(20);
 
   gr1->SetMarkerSize(0.4);
 
 
 
   // Plotting the first breakdown voltage plot
 
   canvas->cd(1);
 
   gPad->SetGridx(1);
 
   gPad->SetGridy(1);
 
 
 
   gr1->Draw("AP");
 
   gr1->GetXaxis()->SetTitle("Bias voltage (V)");
 
   gr1->GetYaxis()->SetTitle("Peak separation");
 
   gr1->GetYaxis()->CenterTitle();
 
   gr1->Fit("pol1","Q");
 
  
 
   TF1 *fit1 = gr1->GetFunction("pol1");
 
   fparam[0] = fit1->GetParameter(0);
 
   fparamerr[0] = fit1->GetParError(0); 
 
   fparam[1] = fit1->GetParameter(1);
 
   fparamerr[1] = fit1->GetParError(1);
 
 
 
   TMath::Sort(nrp, psep1, sortindex, kFALSE);
 
 
 
   meanval = -fparam[0]/fparam[1];
 
   if(!cleanPlots)
 
   {
 
      sprintf(ctemp
, "#splitline{#Delta_{p}(U) = (%.2lf #pm %.2lf)#timesU + (%.2lf #pm %.3lf)}{U_{0} = %.2lf #pm %.3lf}", fparam
[0], fparamerr
[0], fparam
[1], fparamerr
[1], meanval
, meanval
*(TMath
::Abs(fparamerr
[0]/fparam
[0]) + TMath
::Abs(fparamerr
[1]/fparam
[1])) );  
      latex = new TLatex();
 
      latex->SetTextSize(0.039);
 
      latex->DrawLatex(volt[0], 0.97*psep1[sortindex[nrp-1]], ctemp);
 
   }
 
   else
 
      printf("#Delta_p(U) = (%.2lf #pm %.2lf)*U + (%.2lf #pm %.3lf)\nU_0 = %.2lf #pm %.3lf", fparam
[0], fparamerr
[0], fparam
[1], fparamerr
[1], meanval
, meanval
*(TMath
::Abs(fparamerr
[0]/fparam
[0]) + TMath
::Abs(fparamerr
[1]/fparam
[1])) );  
 
 
   // Second graph
 
   if(separations > 1)
 
   {
 
      TGraphErrors *gr2 = new TGraphErrors(nrp, volt, psep2, volterr, pseperr2);
 
     
 
      if(!cleanPlots)
 
         gr2->SetTitle("2nd - 3rd peak separation");
 
      else
 
         gr2->SetTitle();
 
      gr2->SetLineColor(kMagenta);
 
      gr2->SetMarkerColor(kMagenta);
 
      gr2->SetMarkerStyle(21);
 
      gr2->SetMarkerSize(0.4);
 
    
 
      // Plotting the second breakdown voltage plot
 
      canvas->cd(2);
 
      gPad->SetGridx(1);
 
      gPad->SetGridy(1);
 
    
 
      gr2->Draw("AP");
 
      gr2->GetXaxis()->SetTitle("Bias voltage (V)");
 
      gr2->GetYaxis()->SetTitle("Peak separation");
 
      gr2->GetYaxis()->CenterTitle();
 
      gr2->Fit("pol1","Q");
 
     
 
      TF1 *fit2 = gr2->GetFunction("pol1");
 
      fparam[0] = fit2->GetParameter(0);
 
      fparamerr[0] = fit2->GetParError(0); 
 
      fparam[1] = fit2->GetParameter(1);
 
      fparamerr[1] = fit2->GetParError(1);
 
    
 
      meanval = -fparam[0]/fparam[1];
 
      if(!cleanPlots)
 
      {
 
         sprintf(ctemp
, "#splitline{#Delta_{p}(U) = (%.2lf #pm %.2lf)#timesU + (%.2lf #pm %.3lf)}{U_{0} = %.2lf #pm %.3lf}", fparam
[0], fparamerr
[0], fparam
[1], fparamerr
[1], meanval
, meanval
*(TMath
::Abs(fparamerr
[0]/fparam
[0]) + TMath
::Abs(fparamerr
[1]/fparam
[1])) );  
         latex = new TLatex();
 
         latex->SetTextSize(0.039);
 
         latex->DrawLatex(volt[0], 0.97*psep2[sortindex[nrp-1]], ctemp);
 
      }
 
      else
 
         printf("#Delta_p(U) = (%.2lf #pm %.2lf)*U + (%.2lf #pm %.3lf)\nU_0 = %.2lf #pm %.3lf", fparam
[0], fparamerr
[0], fparam
[1], fparamerr
[1], meanval
, meanval
*(TMath
::Abs(fparamerr
[0]/fparam
[0]) + TMath
::Abs(fparamerr
[1]/fparam
[1])) );  
   }
 
 
 
   // Third graph
 
   if(separations > 2)
 
   {
 
      TGraphErrors *gr3 = new TGraphErrors(nrp, volt, psep3, volterr, pseperr3);
 
     
 
      if(!cleanPlots)
 
         gr3->SetTitle("3rd - 4th peak separation");
 
      else
 
         gr3->SetTitle();
 
      gr3->SetLineColor(kGreen);
 
      gr3->SetMarkerColor(kGreen);
 
      gr3->SetMarkerStyle(22);
 
      gr3->SetMarkerSize(0.4);
 
    
 
      // Plotting the third breakdown voltage plot
 
      canvas->cd(3);
 
      gPad->SetGridx(1);
 
      gPad->SetGridy(1);
 
    
 
      gr3->Draw("AP");
 
      gr3->GetXaxis()->SetTitle("Bias voltage (V)");
 
      gr3->GetYaxis()->SetTitle("Peak separation");
 
      gr3->GetYaxis()->CenterTitle();
 
      gr3->Fit("pol1","Q");
 
     
 
      TF1 *fit3 = gr3->GetFunction("pol1");
 
      fparam[0] = fit3->GetParameter(0);
 
      fparamerr[0] = fit3->GetParError(0); 
 
      fparam[1] = fit3->GetParameter(1);
 
      fparamerr[1] = fit3->GetParError(1);
 
    
 
      meanval = -fparam[0]/fparam[1];
 
      if(!cleanPlots)
 
      {
 
         sprintf(ctemp
, "#splitline{#Delta_{p}(U) = (%.2lf #pm %.2lf)#timesU + (%.2lf #pm %.3lf)}{U_{0} = %.2lf #pm %.3lf}", fparam
[0], fparamerr
[0], fparam
[1], fparamerr
[1], meanval
, meanval
*(TMath
::Abs(fparamerr
[0]/fparam
[0]) + TMath
::Abs(fparamerr
[1]/fparam
[1])) );  
         latex = new TLatex();
 
         latex->SetTextSize(0.039);
 
         latex->DrawLatex(volt[0], 0.97*psep3[sortindex[nrp-1]], ctemp);
 
      }
 
      else
 
         printf("#Delta_p(U) = (%.2lf #pm %.2lf)*U + (%.2lf #pm %.3lf)\nU_0 = %.2lf #pm %.3lf", fparam
[0], fparamerr
[0], fparam
[1], fparamerr
[1], meanval
, meanval
*(TMath
::Abs(fparamerr
[0]/fparam
[0]) + TMath
::Abs(fparamerr
[1]/fparam
[1])) );  
   }
 
 
 
   // Saving the produced plot
 
   canvas->SaveAs(plotfile);
 
}
 
 
 
// Fit the ADC spectrum peaks and make a breakdown voltage plot
 
void TGAppMainFrame::FitSpectrum(TList *files, int q)
 
{
 
   TCanvas *gCanvas = histCanvas->GetCanvas();
 
   gCanvas->cd();
 
   TH1F *histtemp;
 
   TSpectrum *spec;
 
   TH1 *histback;
 
   TH1F *h2;
 
   float *xpeaks;
 
   TF1 *fit;
 
   TF1 *fittingfunc;
 
   double *fparam;
 
   double *fparamerr;
 
   double meanparam[20], meanparamerr[20];
 
   int sortindex[20];
 
   char exportname[256];
 
   char paramname[256];
 
   char ctemp[256];
 
 
 
   FILE *fp;
 
   remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp);
 
   sprintf(paramname
, "%s_fitresult.txt", ctemp
);  
   fp 
= fopen(paramname
, "w"); 
 
 
   int peaklimit = minPeak->GetNumber()+1; // +1 to account for the pedestal peak
 
   printf("The minimum peak limit is set to: %d\n", peaklimit
);  
   int p = 0;
 
   double dtemp;
 
   double volt[files->GetSize()], volterr[files->GetSize()], sep[3][files->GetSize()], seperr[3][files->GetSize()]; 
 
   int first = 1;
 
 
 
   // Initialize all values
 
   for(int m = 0; m < files->GetSize(); m++)
 
   {
 
      volt[m] = 0; volterr[m] = 0;
 
      for(int i = 0; i < 3; i++)
 
      { sep[i][m] = 0; seperr[i][m] = 0; }
 
      if(m < 20) { meanparam[m] = 0; meanparamerr[m] = 0; }
 
   }
 
 
 
   for(int m = 0; m < files->GetSize(); m++)
 
   {
 
      DisplayHistogram( (char*)(files->At(m)->GetTitle()), 0);
 
      dtemp = evtheader.biasvolt;
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
 
 
      histtemp = (TH1F*)gCanvas->GetPrimitive(histname);
 
      npeaks = 20;
 
      double par[3000];
 
      spec = new TSpectrum(npeaks);
 
      // Find spectrum background
 
      histback = spec->Background(histtemp, (int)fitInter->GetNumber(), "same");
 
      // Clone histogram and subtract background from it
 
      h2 = (TH1F*)histtemp->Clone("h2");
 
      h2->Add(histback, -1);
 
      // Search for the peaks
 
      int found = spec->Search(h2, fitSigma->GetNumber(), "goff", fitTresh->GetNumber() );
 
      printf("Found %d candidates to fit.\n",found
);  
      npeaks = found;
 
    
 
      xpeaks = spec->GetPositionX();
 
      for(int i = 0; i < found; i++)
 
      {
 
         float xp = xpeaks[i];
 
         int bin = h2->GetXaxis()->FindBin(xp);
 
         float yp = h2->GetBinContent(bin);
 
         par[3*i] = yp;
 
         par[3*i+1] = xp;
 
         par[3*i+2] = (double)fitSigma->GetNumber();
 
      }
 
    
 
      // Fit the histogram
 
      fit = new TF1("fit", FindPeaks, 0, 400, 3*npeaks);
 
      TVirtualFitter::Fitter(histtemp, 3*npeaks);
 
      fit->SetParameters(par);
 
      fit->SetNpx(300);
 
      h2->Fit("fit","Q");  // for quiet mode, add Q
 
      fittingfunc = h2->GetFunction("fit");
 
      fparam = fittingfunc->GetParameters();
 
      fparamerr = fittingfunc->GetParErrors();
 
    
 
      // Gather the parameters (mean peak value for now)
 
      int j = 1;
 
      int nrfit = 0;
 
      bool errors = false;
 
      while(1)
 
      {
 
         if( (fparam[j] < 1.E-30) || (fparamerr[j] < 1.E-10) )
 
            break;
 
         else
 
         {
 
            if(fparam[j] > pedesLow->GetNumber())
 
            {
 
               meanparam[nrfit] = fparam[j];
 
               meanparamerr[nrfit] = fparamerr[j];
 
               nrfit++;
 
            }
 
         }
 
    
 
         j+=3;
 
      }
 
      printf("%d peaks fitted.\n",nrfit
);  
 
 
      if(nrfit >= peaklimit)
 
      {
 
         TMath::Sort(nrfit, meanparam, sortindex, kFALSE);
 
 
 
         // Write out parameters to a file
 
//         fp = fopen(paramname, "a");
 
     
 
         // Only save the ones that do not have a too large error on peak separation for the first three peaks
 
//         if( ((TMath::Abs(meanparamerr[sortindex[2]]) + TMath::Abs(meanparamerr[sortindex[1]]))/(meanparam[sortindex[2]] - meanparam[sortindex[1]]) < accError->GetNumber()) && ((TMath::Abs(meanparamerr[sortindex[3]]) + TMath::Abs(meanparamerr[sortindex[2]]))/(meanparam[sortindex[3]] - meanparam[sortindex[2]]) < accError->GetNumber()) && ((TMath::Abs(meanparamerr[sortindex[4]]) + TMath::Abs(meanparamerr[sortindex[3]]))/(meanparam[sortindex[4]] - meanparam[sortindex[3]]) < accError->GetNumber()) )
 
//         if( (seperr[0][0]/sep[0][0] < accError->GetNumber()) && (seperr[1][0]/sep[1][0] < accError->GetNumber()) && (seperr[2][0]/sep[2][0] < accError->GetNumber()) )
 
//         {
 
//            fprintf(fp, "%le\t%d\t", dtemp, nrfit);
 
 
 
//            for(int i = 0; i < nrfit; i++)
 
//            {
 
//               if(debug)
 
//                  printf("Peak %d (%lfV): %lf\t%lf\n", i+1, dtemp, meanparam[sortindex[i]], meanparamerr[sortindex[i]]);
 
//               fprintf(fp, "%le\t%le\t", meanparam[sortindex[i]], meanparamerr[sortindex[i]]);
 
//            }
 
//            printf("\n");
 
//            fprintf(fp, "\n");
 
//         }
 
 
 
//         fclose(fp);
 
    
 
         h2->SetStats(0);
 
         
 
         gCanvas->Modified();
 
         gCanvas->Update();
 
    
 
         // Save each fitting plot
 
         if(exfitplots->IsDown())
 
         {
 
            remove_ext((char*)files->At(m)->GetTitle(), ctemp);
 
            sprintf(exportname
, "%s_fit.pdf", ctemp
);  
            gCanvas->SaveAs(exportname);
 
         }
 
     
 
         volt[p] = dtemp;
 
         volterr[p] = 1.e-4;
 
 
 
         if(nrfit == 3)
 
         {
 
            sep[0][p] = meanparam[sortindex[2]] - meanparam[sortindex[1]];
 
            seperr[0][p] = TMath::Abs(meanparamerr[sortindex[2]]) + TMath::Abs(meanparamerr[sortindex[1]]);
 
 
 
            errors = (seperr[0][p]/sep[0][p] < accError->GetNumber());
 
 
 
            if(debug)
 
               printf("p=%d:\t%lf\t%lf\t%lf\n", p
, volt
[p
], sep
[0][p
], seperr
[0][p
]);  
         }
 
         else if(nrfit == 4)
 
         {
 
            sep[0][p] = meanparam[sortindex[2]] - meanparam[sortindex[1]];
 
            sep[1][p] = meanparam[sortindex[3]] - meanparam[sortindex[2]];
 
            seperr[0][p] = TMath::Abs(meanparamerr[sortindex[2]]) + TMath::Abs(meanparamerr[sortindex[1]]);
 
            seperr[1][p] = TMath::Abs(meanparamerr[sortindex[3]]) + TMath::Abs(meanparamerr[sortindex[2]]);
 
 
 
            errors = ((seperr[0][p]/sep[0][p] < accError->GetNumber()) && (seperr[1][p]/sep[1][p] < accError->GetNumber()));
 
 
 
            if(debug)
 
               printf("p=%d:\t%lf\t%lf\t%lf\t%lf\t%lf\n", p
, volt
[p
], sep
[0][p
], seperr
[0][p
], sep
[1][p
], seperr
[1][p
]);  
         }
 
         else if(nrfit > 4)
 
         {
 
            sep[0][p] = meanparam[sortindex[2]] - meanparam[sortindex[1]];
 
            sep[1][p] = meanparam[sortindex[3]] - meanparam[sortindex[2]];
 
            sep[2][p] = meanparam[sortindex[4]] - meanparam[sortindex[3]];
 
            seperr[0][p] = TMath::Abs(meanparamerr[sortindex[2]]) + TMath::Abs(meanparamerr[sortindex[1]]);
 
            seperr[1][p] = TMath::Abs(meanparamerr[sortindex[3]]) + TMath::Abs(meanparamerr[sortindex[2]]);
 
            seperr[2][p] = TMath::Abs(meanparamerr[sortindex[4]]) + TMath::Abs(meanparamerr[sortindex[3]]);
 
 
 
            errors = ((seperr[0][p]/sep[0][p] < accError->GetNumber()) && (seperr[1][p]/sep[1][p] < accError->GetNumber()) && (seperr[2][p]/sep[2][p] < accError->GetNumber()));
 
 
 
            if(debug)
 
               printf("p=%d:\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", p
, volt
[p
], sep
[0][p
], seperr
[0][p
], sep
[1][p
], seperr
[1][p
], sep
[2][p
], seperr
[2][p
]);  
         }
 
 
 
         // Write out parameters to a file
 
         fp 
= fopen(paramname
, "a"); 
 
 
         // Accept only the points with a small enough error
 
         if( errors )
 
         {
 
            if(first == 1)
 
            {
 
               fprintf(fp
, "%le\t%d\t", dtemp
, nrfit
);  
 
 
               for(int i = 0; i < nrfit; i++)
 
               {
 
                  if(debug)
 
                     printf("Peak %d (%lfV): %lf\t%lf\n", i
+1, dtemp
, meanparam
[sortindex
[i
]], meanparamerr
[sortindex
[i
]]);  
                  fprintf(fp
, "%le\t%le\t", meanparam
[sortindex
[i
]], meanparamerr
[sortindex
[i
]]);  
               }
 
               first = 0;
 
            }
 
 
 
            p++;
 
         }
 
         else
 
         {
 
            if(nrfit == 3)
 
               printf("Point (at %.2lfV) rejected due to too large errors: %lf\n", volt
[p
], seperr
[0][p
]/sep
[0][p
]);  
            else if(nrfit == 4)
 
               printf("Point (at %.2lfV) rejected due to too large errors: %lf, %lf\n", volt
[p
], seperr
[0][p
]/sep
[0][p
], seperr
[1][p
]/sep
[1][p
]);  
            else if(nrfit > 4)
 
               printf("Point (at %.2lfV) rejected due to too large errors: %lf, %lf, %lf\n", volt
[p
], seperr
[0][p
]/sep
[0][p
], seperr
[1][p
]/sep
[1][p
], seperr
[2][p
]/sep
[2][p
]);  
         }
 
 
 
      }
 
 
 
      if(q == 1) break;
 
 
 
      first = 1;
 
   }
 
 
 
   // Plot & fit breakdown voltage plots
 
   if(q > 1)
 
   {
 
      remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp);
 
      sprintf(paramname
, "%s_breakdown.pdf", ctemp
);  
      MakeBreakdownPlot(p, volt, volterr, sep[0], seperr[0], sep[1], seperr[1], sep[2], seperr[2], paramname, peaklimit-2);
 
   }
 
}
 
 
 
// Plotting of PDF and CDF functions for the edge (with the added fit)
 
void TGAppMainFrame::EdgeDetection(TGraph *pdf, TGraph *cdf, char *outname, TCanvas *g1dCanvas, double pdfmax, int direction)
 
{
 
//   double x, y;
 
 
 
   pdf->Fit("gaus","Q");
 
   pdf->GetFunction("gaus")->SetNpx(400);
 
/*
 
   for(int i = 0; i < nrpoints; i++)
 
   {
 
      pdf->GetPoint(i, x, y);
 
      pdf->SetPoint(i, x, (y/pdfmax) );
 
   }
 
*/
 
   gStyle->SetOptFit(1);
 
 
 
   cdf->Draw("AL");
 
   gPad->Update();
 
   pdf->Draw("LP");
 
 
 
   g1dCanvas->Modified();
 
   g1dCanvas->Update();
 
 
 
   TPaveStats *stats = (TPaveStats*)pdf->FindObject("stats");
 
   if(!cleanPlots)
 
   {
 
//      stats->SetX1NDC(0.14); stats->SetX2NDC(0.28);
 
//      stats->SetY1NDC(0.83); stats->SetY2NDC(0.96);
 
      stats->SetX1NDC(0.86); stats->SetX2NDC(1.0);
 
      stats->SetY1NDC(0.87); stats->SetY2NDC(1.0);
 
   }
 
   else
 
   {
 
      stats->SetX1NDC(1.1); stats->SetX2NDC(1.3);
 
      stats->SetY1NDC(1.1); stats->SetY2NDC(1.3);
 
   }
 
 
 
   g1dCanvas->SetGridx(1);
 
   g1dCanvas->SetGridy(1);
 
   if(direction == 1)
 
      cdf->GetXaxis()->SetTitle("X [#mum]");
 
   else if(direction == 2)
 
      cdf->GetXaxis()->SetTitle("Y [#mum]");
 
   cdf->GetXaxis()->CenterTitle(kTRUE);
 
   cdf->GetXaxis()->SetLabelSize(0.022);
 
   cdf->GetYaxis()->SetTitle("Normalized ADC integral");
 
//   cdf->GetYaxis()->SetTitle("Normalized ADC integral (CDF)");
 
//   cdf->GetYaxis()->SetTitleColor(kBlue);
 
   cdf->GetYaxis()->CenterTitle(kTRUE);
 
   cdf->GetYaxis()->SetLabelSize(0.022);
 
   cdf->GetYaxis()->SetRangeUser(0,1);
 
   cdf->GetYaxis()->SetTitleSize(0.030);
 
//   cdf->GetYaxis()->SetLabelColor(kBlue);
 
   if(!cleanPlots)
 
      cdf->SetTitle("SiPM edge detection");
 
   else
 
      cdf->SetTitle();
 
   cdf->SetLineColor(kBlue);
 
   pdf->SetLineWidth(2);
 
   cdf->SetLineWidth(2);
 
 
 
/*   TGaxis *axis = new TGaxis(gPad->GetUxmax(), 0, gPad->GetUxmax(), 1, 0, pdfmax, 510, "+L");
 
   axis->Draw();
 
   axis->SetTitle("Normalized ADC integral (PDF)");
 
   axis->SetTitleSize(0.035);
 
   axis->CenterTitle();
 
   axis->SetTitleColor(kBlack);
 
   axis->SetTitleFont(42);
 
   axis->SetLabelSize(0.022);
 
   axis->SetLabelColor(kBlack);*/
 
 
 
   g1dCanvas->Modified();
 
   g1dCanvas->Update();
 
 
 
   g1dCanvas->SaveAs(outname);
 
}
 
 
 
// Integrate the spectrum
 
void TGAppMainFrame::IntegSpectrum(TList *files, int direction)
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   char ctemp[256];
 
   int j, k = 0, m = 0, n = 0;
 
 
 
   TCanvas *gCanvas = new TCanvas("canv","canv",900,900);
 
   TCanvas *g1dCanvas = new TCanvas("canv1d","canv1d",1200,900);
 
   TTree *header_data, *meas_data;
 
   double *integralCount, *integralAcc;
 
   integralCount = new double[nrfiles];
 
   integralAcc = new double[nrfiles];
 
//   double xsurfmin, ysurfmin, zsurfmin;
 
   double *surfx, *surfy, *surfz;
 
   surfx = new double[nrfiles];
 
   surfy = new double[nrfiles];
 
   surfz = new double[nrfiles];
 
   for(int i = 0; i < (int)nrfiles; i++) {integralCount[i] = 0; integralAcc[i] = 0; }
 
 
 
   TGraph *gScan[2];    // graphs for PDF and CDF functions
 
   double pdfmax = -1;
 
   TGraph2D *gScan2D;
 
   gScan2D = new TGraph2D();
 
   int nrentries;
 
   double minInteg, maxInteg;
 
 
 
   char exportname[256];
 
 
 
   if(files->GetSize() > 0)
 
   {
 
      for(int i = 0; i < (int)files->GetSize(); i++)
 
      {
 
         n++;
 
         if(files->At(i))
 
         {
 
            sprintf(ctemp
, "%s", files
->At
(i
)->GetTitle
());  
            inroot = new TFile(ctemp, "READ");
 
          
 
            inroot->GetObject("header_data", header_data);
 
            inroot->GetObject("meas_data", meas_data);
 
          
 
            // Reading the header
 
            header_data->SetBranchAddress("xpos", &evtheader.xpos);
 
            header_data->GetEntry(0);
 
            header_data->SetBranchAddress("ypos", &evtheader.ypos);
 
            header_data->GetEntry(0);
 
            header_data->SetBranchAddress("zpos", &evtheader.zpos);
 
            header_data->GetEntry(0);
 
    
 
            char rdc[256];
 
            j = selectCh->GetNumber();
 
            double rangetdc[2];
 
            rangetdc[0] = tdcMinwindow->GetNumber();
 
            rangetdc[1] = tdcMaxwindow->GetNumber();
 
    
 
            k = 0;
 
            m = 0;
 
          
 
            // Reading the data
 
            for(int e = 0; e < meas_data->GetEntries(); e++)
 
            {
 
               meas_data->SetBranchAddress(rdc, &evtdata.adcdata[j]);
 
               meas_data->GetEntry(e);
 
          
 
               meas_data->SetBranchAddress(rdc, &evtdata.tdcdata[j]);
 
               meas_data->GetEntry(e);
 
    
 
               // If our data point is inside the TDC window
 
               if( ((double)evtdata.tdcdata[j]/tdctimeconversion >= rangetdc[0]) && ((double)evtdata.tdcdata[j]/tdctimeconversion <= rangetdc[1]) )
 
               {
 
                  k++;
 
                  m += evtdata.adcdata[j];
 
               }
 
            }
 
 
 
/*          if(n == 1)  // these values can be used to set 0 value at first X, Y and Z positions
 
            {
 
               xsurfmin = evtheader.xpos;
 
               ysurfmin = evtheader.ypos;
 
               zsurfmin = evtheader.zpos;
 
            }
 
            surfx[i] = (double)(evtheader.xpos-xsurfmin)*lenconversion;
 
            surfy[i] = (double)(evtheader.ypos-ysurfmin)*lenconversion;
 
            surfz[i] = (double)(evtheader.zpos-zsurfmin)*lenconversion;*/
 
            surfx[i] = (double)(evtheader.xpos*lenconversion);
 
            surfy[i] = (double)(evtheader.ypos*lenconversion);
 
            surfz[i] = (double)(evtheader.zpos*lenconversion);
 
 
 
/*            surfx[i] = evtheader.xpos;
 
            surfy[i] = evtheader.ypos;
 
            surfz[i] = evtheader.zpos;
 
*/
 
            integralCount[i] += ((double)m)/((double)k);
 
            
 
            inroot->Close();
 
            delete inroot;
 
         }
 
      }
 
 
 
      nrentries = n;
 
      printf("%d files were selected.\n", nrentries
);  
 
 
      double curzval = surfz[0];
 
      j = 0;
 
      int acc = 0;
 
      int zb;
 
      for(int i = 0; i <= nrentries; i++)
 
      {  
 
         if(acc == nrentries)
 
         {
 
            minInteg = TMath::MinElement(j, integralAcc);
 
 
 
            for(int za = 0; za < j; za++)
 
               integralAcc[za] = integralAcc[za] - minInteg;
 
 
 
            maxInteg = TMath::MaxElement(j, integralAcc);
 
 
 
            for(int za = 0; za < j; za++)
 
            {
 
               zb = i-j+za;
 
               integralCount[zb] = integralAcc[za]/maxInteg;
 
               if(debug)
 
                  printf("Integral check 2 (i=%d,j=%d,za=%d,z=%.2lf,zb=%d): %lf\t%lf\n", i
, j
, za
, surfz
[i
-j
], zb
, integralCount
[zb
], integralAcc
[za
]/maxInteg
);  
            }
 
 
 
            // Plotting of PDF and CDF functions for the edge (with the added fit)
 
            gScan[1] = new TGraph();
 
            for(int za = 0; za < j; za++)
 
            {
 
               zb = i-j+za;
 
               if(direction == 1)
 
                  gScan[1]->SetPoint(za, (double)surfx[zb], (double)integralAcc[za]/maxInteg);
 
               else if(direction == 2)
 
                  gScan[1]->SetPoint(za, (double)surfy[zb], (double)integralAcc[za]/maxInteg);
 
 
 
               if( ((integralAcc[za+1]-integralAcc[za])/maxInteg > pdfmax) && (za < j-1) )
 
                  pdfmax = (integralAcc[za+1]-integralAcc[za])/maxInteg;
 
            }
 
 
 
            pdfmax = (TMath::Ceil(pdfmax*10))/10.;
 
     
 
            gScan[0] = new TGraph();
 
            for(int za = j-1; za >= 0; za--)
 
            {
 
               zb = (i-1)-(j-1)+za;
 
               if((integralAcc[za]-integralAcc[za-1])/(maxInteg) < 0)
 
               {
 
                  if(direction == 1)
 
                     gScan[0]->SetPoint(za, (double)surfx[zb], 0);
 
                  else if(direction == 2)
 
                     gScan[0]->SetPoint(za, (double)surfy[zb], 0);
 
               }
 
               else
 
               {
 
                  if(direction == 1)
 
                     gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg));
 
                  else if(direction == 2)
 
                     gScan[0]->SetPoint(za, (double)surfy[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg));
 
//               gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(pdfmax*maxInteg));
 
               }
 
            }
 
     
 
            remove_from_last((char*)files->At(i-1)->GetTitle(), '_', ctemp);
 
            sprintf(exportname
, "%s_edge.pdf", ctemp
);  
            EdgeDetection(gScan[0], gScan[1], exportname, g1dCanvas, pdfmax, direction);
 
     
 
//            delete gScan[0];
 
//            delete gScan[1];
 
 
 
            i--;
 
            pdfmax = 0;
 
            break;
 
         }       
 
         else
 
         {
 
            if(surfz[i] == curzval)
 
            {
 
               integralAcc[j] = integralCount[i];
 
               if(debug)
 
                  printf("Integral check 1 (i=%d,j=%d,z=%.2lf): %lf\t%lf\n", i
, j
, surfz
[i
], integralCount
[i
], integralAcc
[j
]);  
               j++;
 
               acc++;
 
            }
 
            else
 
            {
 
               minInteg = TMath::MinElement(j, integralAcc);
 
           
 
               for(int za = 0; za < j; za++)
 
                  integralAcc[za] = integralAcc[za] - minInteg;
 
           
 
               maxInteg = TMath::MaxElement(j, integralAcc);
 
           
 
               for(int za = 0; za < j; za++)
 
               {
 
                  zb = i-j+za;
 
                  integralCount[zb] = integralAcc[za]/maxInteg;
 
                  if(debug)
 
                     printf("Integral check 2 (i=%d,j=%d,za=%d,z=%.2lf,zb=%d): %lf\t%lf\n", i
, j
, za
, surfz
[i
-j
], zb
, integralCount
[zb
], integralAcc
[za
]/maxInteg
);  
               }
 
               
 
               curzval = surfz[i];
 
               i--;
 
 
 
               // Plotting of PDF and CDF functions for the edge (with the added fit)
 
               gScan[1] = new TGraph();
 
               for(int za = 0; za < j; za++)
 
               {
 
                  zb = i-(j-1)+za;
 
                  if(direction == 1)
 
                     gScan[1]->SetPoint(za, (double)surfx[zb], (double)integralAcc[za]/maxInteg);
 
                  else if(direction == 2)
 
                     gScan[1]->SetPoint(za, (double)surfy[zb], (double)integralAcc[za]/maxInteg);
 
 
 
                  if( ((integralAcc[za+1]-integralAcc[za])/maxInteg > pdfmax) && (za < j-1) )
 
                     pdfmax = (integralAcc[za+1]-integralAcc[za])/maxInteg;
 
               }
 
 
 
               pdfmax = (TMath::Ceil(pdfmax*10))/10.;
 
 
 
               gScan[0] = new TGraph();
 
               for(int za = j-1; za >= 0; za--)
 
               {
 
                  zb = i-(j-1)+za;
 
                  if((integralAcc[za]-integralAcc[za-1])/(maxInteg) < 0)
 
                  {
 
                     if(direction == 1)
 
                        gScan[0]->SetPoint(za, (double)surfx[zb], 0);
 
                     else if(direction == 2)
 
                        gScan[0]->SetPoint(za, (double)surfy[zb], 0);
 
                  }
 
                  else
 
                  {
 
                     if(direction == 1)
 
                        gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg));
 
                     else if(direction == 2)
 
                        gScan[0]->SetPoint(za, (double)surfy[zb], (integralAcc[za]-integralAcc[za-1])/(maxInteg));
 
//                  gScan[0]->SetPoint(za, (double)surfx[zb], (integralAcc[za]-integralAcc[za-1])/(pdfmax*maxInteg));
 
                  }
 
               }
 
 
 
               remove_from_last((char*)files->At(i)->GetTitle(), '_', ctemp);
 
               sprintf(exportname
, "%s_edge.pdf", ctemp
);  
               EdgeDetection(gScan[0], gScan[1], exportname, g1dCanvas, pdfmax, direction);
 
     
 
               delete gScan[0];
 
               delete gScan[1];
 
 
 
               j = 0;
 
               pdfmax = 0;
 
            }
 
         }
 
      }
 
 
 
//      delete g1dCanvas;
 
    
 
      double range[4];
 
      if(direction == 1)
 
      {
 
         range[0] = TMath::MinElement(nrentries, surfx);
 
         range[1] = TMath::MaxElement(nrentries, surfx);
 
      }
 
      else if(direction == 2)
 
      {
 
         range[0] = TMath::MinElement(nrentries, surfy);
 
         range[1] = TMath::MaxElement(nrentries, surfy);
 
      }
 
      else
 
      {
 
         range[0] = TMath::MinElement(nrentries, surfx);
 
         range[1] = TMath::MaxElement(nrentries, surfx);
 
      }
 
      range[2] = TMath::MinElement(nrentries, surfz);
 
      range[3] = TMath::MaxElement(nrentries, surfz);
 
    
 
      // Plotting of 2D edge plot
 
      for(int i = 0; i < nrentries; i++)
 
      {
 
         if(direction == 1)
 
         {
 
            if(debug)
 
               printf("%.2lf\t%.2lf\t%lf\n", surfx
[i
], surfz
[i
], integralCount
[i
]);  
            gScan2D->SetPoint(i, surfx[i], surfz[i], integralCount[i]);
 
         }
 
         else if(direction == 2)
 
         {
 
            if(debug)
 
               printf("%.2lf\t%.2lf\t%lf\n", surfy
[i
], surfz
[i
], integralCount
[i
]);  
            gScan2D->SetPoint(i, surfy[i], surfz[i], integralCount[i]);
 
         }
 
      }
 
 
 
      gCanvas->cd();
 
      gStyle->SetPalette(1);
 
      gScan2D->Draw("COLZ");
 
     
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
     
 
      if(direction == 1)
 
         gScan2D->GetXaxis()->SetTitle("X [#mum]");
 
      else if(direction == 2)
 
         gScan2D->GetXaxis()->SetTitle("Y [#mum]");
 
      gScan2D->GetXaxis()->CenterTitle(kTRUE);
 
      gScan2D->GetXaxis()->SetLabelSize(0.022);
 
      gScan2D->GetXaxis()->SetRangeUser(range[0], range[1]);
 
      gScan2D->GetXaxis()->SetNoExponent();
 
      gScan2D->GetYaxis()->SetTitle("Z [#mum]");
 
      gScan2D->GetYaxis()->SetTitleOffset(1.3);
 
      gScan2D->GetYaxis()->CenterTitle(kTRUE);
 
      gScan2D->GetYaxis()->SetLabelSize(0.022);
 
      gScan2D->GetYaxis()->SetRangeUser(range[2], range[3]);
 
      TGaxis *yax = (TGaxis*)gScan2D->GetYaxis();
 
      yax->SetMaxDigits(4);
 
      if(!cleanPlots)
 
         gScan2D->SetTitle("Laser focal point");
 
      else
 
         gScan2D->SetTitle();
 
  
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
 
 
      remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp);
 
      remove_from_last(exportname, '_', ctemp);
 
      if(direction == 1)
 
         sprintf(exportname
, "%s_xdir_focalpoint.pdf", ctemp
);  
      else if(direction == 2)
 
         sprintf(exportname
, "%s_ydir_focalpoint.pdf", ctemp
);  
      gCanvas->SaveAs(exportname);
 
   }
 
}
 
 
 
// Integrate the spectrum
 
void TGAppMainFrame::PhotonMu(TList *files)
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   char ctemp[256];
 
   int j, k = 0, m = 0, n = 0, k2 = 0, m2 = 0;
 
 
 
   TCanvas *gCanvas;
 
   TTree *header_data, *meas_data;
 
   double *integralCount, *integralPedestal;
 
   integralCount = new double[nrfiles];
 
   integralPedestal = new double[nrfiles];
 
   double *angle;
 
   double *pdeval;
 
   double *muval;
 
   angle = new double[nrfiles];
 
   pdeval = new double[nrfiles];
 
   muval = new double[nrfiles];
 
   for(int i = 0; i < (int)nrfiles; i++) {integralCount[i] = 0; integralPedestal[i] = 0; }
 
 
 
//   TGraph *gScan[2];  // graph for angle dependence
 
   int nrentries;
 
 
 
   TSpectrum *spec;
 
   TH1F *histtemp;
 
   TH1 *histback;
 
   TH1F *h2;
 
   float *xpeaks;
 
   TF1 *fit;
 
   TF1 *fittingfunc;
 
   double *fparam;
 
   double meanparam;
 
   int adcpedestal[2];
 
   double paramsigma = 0;
 
 
 
   if(files->GetSize() > 0)
 
   {
 
      for(int i = 0; i < (int)files->GetSize(); i++)
 
      {
 
         n++;
 
         if(files->At(i))
 
         {
 
            // Find the pedestal peak and the first minimum after pedestal ----------------
 
            DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0);
 
            histCanvas->GetCanvas()->Modified();
 
            histCanvas->GetCanvas()->Update();
 
       
 
            histtemp = (TH1F*)histCanvas->GetCanvas()->GetPrimitive(histname);
 
            npeaks = 1;
 
            double par[300];
 
            spec = new TSpectrum(npeaks);
 
            // Find spectrum background
 
            histback = spec->Background(histtemp, (int)fitInter->GetNumber(), "same");
 
            // Clone histogram and subtract background from it
 
            h2 = (TH1F*)histtemp->Clone("h2");
 
            h2->Add(histback, -1);
 
            // Search for the peaks
 
            int found = spec->Search(h2, fitSigma->GetNumber(), "goff", fitTresh->GetNumber() );
 
            printf("Found %d candidates to fit.\n",found
);  
            npeaks = found;
 
    
 
            xpeaks = spec->GetPositionX();
 
            for(j = 0; j < found; j++)
 
            {
 
               float xp = xpeaks[j];
 
               int bin = h2->GetXaxis()->FindBin(xp);
 
               float yp = h2->GetBinContent(bin);
 
               par[3*j] = yp;
 
               par[3*j+1] = xp;
 
               par[3*j+2] = (double)fitSigma->GetNumber();
 
            }
 
          
 
            // Fit the histogram
 
            fit = new TF1("fit", FindPeaks, 0, 400, 3*npeaks);
 
            TVirtualFitter::Fitter(histtemp, 3*npeaks);
 
            fit->SetParameters(par);
 
            fit->SetNpx(300);
 
            h2->Fit("fit","Q");  // for quiet mode, add Q
 
            fittingfunc = h2->GetFunction("fit");
 
            fparam = fittingfunc->GetParameters();
 
          
 
            // Gather the parameters (mean peak value for now)
 
            j = 1;
 
 
 
            meanparam = fparam[j];
 
            paramsigma = fparam[j+1];
 
 
 
/*            while(1)
 
            {
 
               if( (fparam[j] < 1.E-30) || (fparamerr[j] < 1.E-10) )
 
                  break;
 
               else
 
               {
 
                  if(fparam[j] > 0)
 
                  {
 
                     meanparam = fparam[j];
 
                     meanparamerr = fparamerr[j];
 
                     paramsigma = fparam[j+1];
 
                     nrfit++;
 
                  }
 
               }
 
          
 
               j+=3;
 
            }
 
*/       
 
            histCanvas->GetCanvas()->Modified();
 
            histCanvas->GetCanvas()->Update();
 
       
 
            j = 0;
 
            adcpedestal[0] = 0;
 
            adcpedestal[1] = -1;
 
            while(1)
 
            {
 
               int bin = histtemp->GetXaxis()->FindBin((int)(j+meanparam+paramsigma));
 
       
 
               int yp = histtemp->GetBinContent(bin);
 
               if(adcpedestal[1] == -1)
 
               {
 
                  adcpedestal[0] = j+meanparam+paramsigma;
 
                  adcpedestal[1] = yp;
 
               }
 
               else
 
               {
 
                  if(adcpedestal[1] >= yp)
 
                  {
 
                     adcpedestal[0] = j+meanparam+paramsigma;
 
                     adcpedestal[1] = yp;
 
                  }
 
                  else
 
                     break;
 
               }
 
       
 
               j++;
 
               if(j > 50) break;
 
            }
 
       
 
            cout << "Pedestal ends with ADC value: " << adcpedestal[0] << endl;
 
 
 
            // ----------------------------------------------------------------------------
 
 
 
            sprintf(ctemp
, "%s", files
->At
(i
)->GetTitle
());  
            inroot = new TFile(ctemp, "READ");
 
          
 
            inroot->GetObject("header_data", header_data);
 
            inroot->GetObject("meas_data", meas_data);
 
          
 
            // Reading the header
 
            if( header_data->FindBranch("angle") )
 
            {
 
               header_data->SetBranchAddress("angle", &evtheader.angle);
 
               header_data->GetEntry(0);
 
            }
 
            else
 
            {
 
               printf("Error! Selected file has no angle header value. Please edit header to add the angle header value.\n");  
               break;
 
            }
 
    
 
            char rdc[256];
 
            j = selectCh->GetNumber();
 
            double rangetdc[2];
 
            rangetdc[0] = tdcMinwindow->GetNumber();
 
            rangetdc[1] = tdcMaxwindow->GetNumber();
 
    
 
            k = 0;
 
            k2 = 0;
 
            m = 0;
 
            m2 = 0;
 
          
 
            // Reading the data
 
            for(int e = 0; e < meas_data->GetEntries(); e++)
 
            {
 
               meas_data->SetBranchAddress(rdc, &evtdata.adcdata[j]);
 
               meas_data->GetEntry(e);
 
          
 
               meas_data->SetBranchAddress(rdc, &evtdata.tdcdata[j]);
 
               meas_data->GetEntry(e);
 
    
 
               // If our data point is inside the TDC window
 
               if( ((double)evtdata.tdcdata[j]/tdctimeconversion >= rangetdc[0]) && ((double)evtdata.tdcdata[j]/tdctimeconversion <= rangetdc[1]) )
 
               {
 
                  // Gather only the integral of the pedestal
 
                  if((double)evtdata.adcdata[j] < (double)adcpedestal[0]+0.5 )
 
                  {
 
                     k2++;
 
                     m2 += evtdata.adcdata[j];
 
                  }
 
 
 
                  // Gather the complete integral
 
                  k++;
 
                  m += evtdata.adcdata[j];
 
               }
 
            }
 
 
 
            angle[i] = (double)(evtheader.angle);  // angle in radians
 
 
 
//            integralCount[i] += ((double)m)/((double)k);
 
            integralCount[i] += (double)m;
 
            cout << "Integral (" << k << " evts) = " << integralCount[i] << endl;
 
 
 
            integralPedestal[i] += (double)m2;
 
            cout << "Integral (" << k2 << " evts) = " << integralPedestal[i] << endl;
 
 
 
            muval[i] = -TMath::Log((double)k2/(double)k);
 
 
 
            pdeval[i] = muval[i]/(muval[0]*TMath::Cos(angle[i]*TMath::ACos(-1.)/180.));
 
            
 
            inroot->Close();
 
            delete inroot;
 
         }
 
      }
 
 
 
      nrentries = n;
 
      printf("%d files were selected.\n", nrentries
);  
 
 
      cout << "angle\tmu\trelative PDE\n" << endl;
 
      for(int i = 0; i < (int)files->GetSize(); i++)
 
      {
 
            // Relative PDE calculation
 
            cout << angle[i] << "\t" << muval[i] << "\t" << pdeval[i] << endl;
 
      }
 
 
 
      // Plot mu and PDE angle dependance plots
 
      gCanvas = new TCanvas("canv","canv",1200,900);
 
      gCanvas->SetGrid();
 
 
 
      TGraph *pde = new TGraph(nrentries, angle, pdeval);
 
      pde->SetMarkerStyle(21);
 
      pde->SetMarkerSize(1.0);
 
      pde->SetMarkerColor(2);
 
      pde->SetLineWidth(2);
 
      pde->SetLineColor(2);
 
      pde->GetXaxis()->SetLabelSize(0.030);
 
      pde->GetXaxis()->CenterTitle();
 
      pde->GetXaxis()->SetRange(-5,90);
 
      pde->GetXaxis()->SetRangeUser(-5,90);
 
      pde->GetYaxis()->SetTitleOffset(1.2);
 
      pde->GetYaxis()->SetLabelSize(0.030);
 
      pde->GetYaxis()->CenterTitle();
 
      pde->GetYaxis()->SetRangeUser(0.3, 1.18);
 
      pde->Draw("ALP");
 
 
 
      pde->SetTitle(";Incidence angle (#circ);Relative PDE(#theta) / #mu(#theta)");
 
 
 
      TGraph *mugr = new TGraph(nrentries, angle, muval);
 
      mugr->SetMarkerStyle(20);
 
      mugr->SetMarkerSize(1.0);
 
      mugr->SetMarkerColor(4);
 
      mugr->SetLineWidth(2);
 
      mugr->SetLineColor(4);
 
      mugr->Draw("SAME;LP");
 
 
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
   }
 
}
 
 
 
void TGAppMainFrame::RunMeas(void *ptr, int runCase, int zaxisscan, int &scanon)
 
{
 
   printf("Start of Run, run case %d\n", runCase
);  
   float progVal;
 
 
 
   char ctemp[256];
 
   char ctemp2[256];
 
   char fname[256];
 
   int itemp = 0;
 
 
 
   remove_ext((char*)fileName->GetText(), ctemp);
 
//   printf("Save name: %s\nNo extension: %s\n", fileName->GetText(), ctemp);
 
 
 
   // Open file for writing
 
/*   if(runCase == 0)
 
   {
 
      sprintf(fname, "rm %s_%s", ctemp, histExtAll);
 
      retTemp = system(fname);
 
   }*/  // deleting might not be necesary due to RECREATE in root file open
 
 
 
   if( voltscanOn->IsOn() || surfscanOn->IsOn() )
 
   {
 
      if(zaxisscan == 0)
 
      {
 
         if( (voltscanOn->IsOn()) && (vOutStep->GetNumber() > 0.) )
 
            SeqNumber(runCase, (int)((vOutStop->GetNumber())-(vOutStart->GetNumber()))/(vOutStep->GetNumber()), ctemp2);
 
         else if( surfscanOn->IsOn() )
 
         {
 
            if( xPosStep->GetNumber() == 0 )
 
               itemp = 1;
 
            else
 
               itemp = (int)((xPosMax->GetNumber())-(xPosMin->GetNumber()))/(xPosStep->GetNumber());
 
 
 
            if( yPosStep->GetNumber() == 0 )
 
               itemp *= 1;
 
            else
 
               itemp *= (int)((yPosMax->GetNumber())-(yPosMin->GetNumber()))/(yPosStep->GetNumber());
 
            SeqNumber(runCase, itemp, ctemp2);
 
         }
 
         sprintf(fname
, "%s_%s%s", ctemp
, ctemp2
, histExt
);  
      }
 
      else if(zaxisscan == 1)
 
      {
 
         SeqNumber((int)zPos->GetNumber(), (int)zPosMax->GetNumber(), ctemp2);
 
 
 
         if( (voltscanOn->IsOn()) && (vOutStep->GetNumber() > 0.) )
 
         {
 
            sprintf(fname
, "%s_z%s_", ctemp
, ctemp2
);  
            SeqNumber(runCase, (int)((vOutStop->GetNumber())-(vOutStart->GetNumber()))/(vOutStep->GetNumber())+1, ctemp2);
 
         }
 
         else if( surfscanOn->IsOn() )
 
         {
 
            sprintf(fname
, "%s_z%s_", ctemp
, ctemp2
);  
 
 
            if( xPosStep->GetNumber() == 0 )
 
               itemp = 1;
 
            else
 
               itemp = (int)((xPosMax->GetNumber())-(xPosMin->GetNumber()))/(xPosStep->GetNumber())+1;
 
 
 
            if( yPosStep->GetNumber() == 0 )
 
               itemp *= 1;
 
            else
 
               itemp *= (int)((yPosMax->GetNumber())-(yPosMin->GetNumber()))/(yPosStep->GetNumber())+1;
 
            SeqNumber(runCase, itemp, ctemp2);
 
         }
 
         else
 
            sprintf(fname
, "%s_z%s%s", ctemp
, ctemp2
, histExt
);  
 
 
/*         if(runCase < 10)
 
            sprintf(fname, "%s_z%d_0000%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt);
 
         else if( (runCase >= 10) && (runCase < 100) )
 
            sprintf(fname, "%s_z%d_000%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt);
 
         else if( (runCase >= 100) && (runCase < 1000) )
 
            sprintf(fname, "%s_z%d_00%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt);
 
         else if( (runCase >= 1000) && (runCase < 10000) )
 
            sprintf(fname, "%s_z%d_0%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt);
 
         else if( (runCase >= 10000) && (runCase < 100000) )
 
            sprintf(fname, "%s_z%d_0%d%s", ctemp, (int)zPos->GetNumber(), runCase, histExt);
 
*/      }
 
   }
 
   else if( !voltscanOn->IsOn() && !surfscanOn->IsOn() )
 
      sprintf(fname
, "%s%s", ctemp
, histExt
);  
//   printf("Rootfile: %s\n", fname);
 
 
 
   // Check if set voltage is below the hard limit
 
   if( vOut->GetNumber() > vHardlimit->GetNumber() )
 
   {
 
      printf("Voltage hard limit triggered (%lf > %lf)!\n", vOut
->GetNumber
(), vHardlimit
->GetNumber
() );  
      vOut->SetNumber( vHardlimit->GetNumber() );
 
   }
 
 
 
   outroot = new TFile(fname, "RECREATE");
 
 
 
   TTree *header_data = new TTree("header_data", "Header information for the measurement.");
 
   TTree *meas_data = new TTree("meas_data", "Saved ADC and TDC measurement data.");
 
   TTree *scope_data = new TTree("scope_data", "Saved scope measurement data.");
 
 
 
   // Branches for the header
 
   header_data->Branch("nrch", &evtheader.nrch, "nrch/I");
 
   header_data->Branch("timestamp", &evtheader.timestamp, "timestamp/I");
 
   header_data->Branch("biasvolt", &evtheader.biasvolt, "biasvolt/D");
 
   header_data->Branch("xpos", &evtheader.xpos, "xpos/I");
 
   header_data->Branch("ypos", &evtheader.ypos, "ypos/I");
 
   header_data->Branch("zpos", &evtheader.zpos, "zpos/I");
 
   header_data->Branch("temperature", &evtheader.temperature, "temperature/D");
 
   header_data->Branch("laserinfo", &evtheader.laserinfo, "laserinfo/C");
 
 
 
   evtheader.nrch = (int)NCH->GetNumber()*2;
 
   evtheader.
timestamp = (int)time(NULL
); 
   evtheader.biasvolt = (double)vOut->GetNumber();
 
   evtheader.xpos = (int)xPos->GetNumber();
 
   evtheader.ypos = (int)yPos->GetNumber();
 
   evtheader.zpos = (int)zPos->GetNumber();
 
   evtheader.temperature = (double)chtemp->GetNumber();
 
   evtheader.angle = (double)incangle->GetNumber();
 
   sprintf(evtheader.
laserinfo, "%s", laserInfo
->GetText
());  
 
 
   char histtime[256];
 
   GetTime(evtheader.timestamp, histtime);
 
 
 
   printf("Save file header information:\n");  
   printf("- Number of channels: %d\n", evtheader.
nrch);  
   printf("- Timestamp: %d (%s)\n", evtheader.
timestamp, histtime
);  
   printf("- Bias voltage: %lf\n", evtheader.
biasvolt);  
   printf("- Table position (X,Y,Z): %d, %d, %d\n", evtheader.
xpos, evtheader.
ypos, evtheader.
zpos);  
   printf("- Temperature: %lf\n", evtheader.
temperature);  
   printf("- Laser and filter settings: %s\n", evtheader.
laserinfo);  
 
 
   header_data->Fill();
 
 
 
   // Branches for ADC and TDC data
 
   for(int i = 0; i < evtheader.nrch/2; i++)
 
   {
 
      meas_data->Branch(ctemp, &evtdata.adcdata[i], fname);
 
 
 
      meas_data->Branch(ctemp, &evtdata.tdcdata[i], fname);
 
   }
 
 
 
   // Initialize the scope before measurement
 
   if( sCamaclink->IsDown() )
 
      InitializeScope();
 
 
 
   // Branch for scope measurement data
 
   if(gScopeDaq->scopeUseType == 2) // only if we select waveform measurement
 
   {
 
      if(gScopeDaq->scopeMeasSel == 0)
 
         scope_data->Branch("amp", &evtmeas.measdata, "amp/D");
 
      else if(gScopeDaq->scopeMeasSel == 1)
 
         scope_data->Branch("area", &evtmeas.measdata, "area/D");
 
      else if(gScopeDaq->scopeMeasSel == 2)
 
         scope_data->Branch("delay", &evtmeas.measdata, "delay/D");
 
      else if(gScopeDaq->scopeMeasSel == 3)
 
         scope_data->Branch("fall", &evtmeas.measdata, "fall/D");
 
      else if(gScopeDaq->scopeMeasSel == 4)
 
         scope_data->Branch("freq", &evtmeas.measdata, "freq/D");
 
      else if(gScopeDaq->scopeMeasSel == 5)
 
         scope_data->Branch("max", &evtmeas.measdata, "max/D");
 
      else if(gScopeDaq->scopeMeasSel == 6)
 
         scope_data->Branch("mean", &evtmeas.measdata, "mean/D");
 
      else if(gScopeDaq->scopeMeasSel == 7)
 
         scope_data->Branch("min", &evtmeas.measdata, "min/D");
 
      else if(gScopeDaq->scopeMeasSel == 8)
 
         scope_data->Branch("pk2p", &evtmeas.measdata, "pk2p/D");
 
      else if(gScopeDaq->scopeMeasSel == 9)
 
         scope_data->Branch("pwidth", &evtmeas.measdata, "pwidth/D");
 
      else if(gScopeDaq->scopeMeasSel == 10)
 
         scope_data->Branch("rise", &evtmeas.measdata, "rise/D");
 
   }
 
 
 
   int neve  = (int) evtNum->GetNumber();
 
   int allEvt, zProg;
 
   zProg = 1;
 
 
 
#if WORKSTAT == 'I'
 
#else
 
// ONLY FOR TESTING!
 
   TRandom *randNum = new TRandom();
 
   randNum->SetSeed(0);
 
// ONLY FOR TESTING!
 
#endif
 
 
 
   if (gDaq)
 
   {
 
      if(scanon == 0)
 
      {
 
         gDaq->init(evtheader.nrch);
 
         scanon = 1;
 
      }
 
      gDaq->fStop=0;
 
      // Start gathering
 
      gDaq->start();
 
 
 
      busyLabel->Enable();
 
 
 
      for (int n=0;n<neve && !gDaq->fStop ;/*n++*/)
 
      {
 
         int nb = gDaq->event(gBuf,BSIZE);
 
 
 
#if WORKSTAT == 'I'
 
#else
 
// ONLY FOR TESTING!
 
         for(int i=0; i < evtheader.nrch; i++)
 
         {
 
            if(i == 1)
 
               gBuf[i] = randNum->Gaus(1500,300);
 
            else if(i == 0)
 
               gBuf[i] = randNum->Poisson(2500);
 
         }
 
// ONLY FOR TESTING!
 
#endif
 
         if (nb<=0) n--;
 
 
 
         int nc=0;
 
 
 
         while ( (nb>0) && (n<neve) )
 
         {
 
            for(int i = 0; i < evtheader.nrch; i++)
 
            {
 
               unsigned short adc = gBuf[i+nc]&0xFFFF;
 
               if(i % 2 == 0)           // TDC
 
                  evtdata.tdcdata[i/2] = (int)adc;
 
               else if(i % 2 == 1)      // ADC
 
                  evtdata.adcdata[i/2] = (int)adc;
 
 
 
               // Start plotting the scope waveform
 
               if( (gScopeDaq->scopeUseType == 1) && (sCamaclink->IsDown()) )
 
                  StartScopeAcq();
 
            }
 
            meas_data->Fill();
 
 
 
            // Start making a scope measurement
 
            if( (gScopeDaq->scopeUseType == 2) && (sCamaclink->IsDown()) )
 
            {
 
               StartScopeAcq();
 
               evtmeas.measdata = gScopeDaq->measubuf;
 
            }
 
            scope_data->Fill();
 
            
 
            n++;
 
            nc += evtheader.nrch;
 
            nb -= evtheader.nrch;
 
         }
 
 
 
         MyTimer();
 
         allEvt = n;
 
         if (gSystem
->ProcessEvents
()) printf("Run Interrupted\n");  
 
 
         if( (started) && (n == (neve*zProg)/10) )
 
         {
 
            progVal = (float)zProg*10;
 
            curProgress->SetPosition(progVal);
 
            zProg++;
 
         }
 
      }
 
 
 
      printf("Number of gathered events: %d\n", allEvt
);  
      measStart->SetText("Start acquisition");
 
      started = kFALSE;
 
 
 
      gDaq->stop();
 
   }
 
 
 
   busyLabel->Disable();
 
   printf("End of Run neve=%d\n",neve
);  
 
 
   header_data->Write();
 
   meas_data->Write();
 
   scope_data->Write();
 
   delete header_data;
 
   delete meas_data;
 
   delete scope_data;
 
 
 
   outroot->Close();
 
}
 
 
 
// Start the acquisition
 
void TGAppMainFrame::StartAcq()
 
{
 
   // Variable that will initialize camac only once (for scans)
 
   int scanon = 0;
 
 
 
   // Determine the type of measurement to perform
 
   int vscan = 0, pscan = 0, zscan = 0;
 
   if(voltscanOn->IsOn()) vscan = 1;
 
   if(surfscanOn->IsOn()) pscan = 1;
 
   if(zscanOn->IsOn()) zscan = 1;
 
 
 
   char cmd[256];
 
   int i, j, k;
 
   float progVal;
 
   FILE *pfin;
 
 
 
   // Variables for voltage scan
 
   float currentVoltage, minVoltage, maxVoltage, stepVoltage;
 
   int repetition;
 
 
 
   // Variables for surface scan
 
   int minXpos, maxXpos, stepXpos;
 
   int minYpos, maxYpos, stepYpos;
 
   int minZpos, maxZpos, stepZpos;
 
   int repetX, repetY, repetZ;
 
 
 
   // Voltage scan
 
   if( (vscan == 1) && (pscan == 0) )
 
   {
 
      if(started)
 
      {
 
         printf("Stopping current voltage scan...\n");  
         gROOT->SetInterrupt();
 
         measStart->SetText("Start acquisition");
 
         started = kFALSE;
 
 
 
         pfin 
= fopen("finish_sig.txt","w"); 
         fprintf(pfin
, "%s: Voltage scan stopped.", timeStamp
->GetText
());  
      }
 
      else if(!started)
 
      {
 
         measStart->SetText("Stop acquisition");
 
         started = kTRUE;
 
 
 
         printf("Running a voltage scan...\n");  
      
 
         minVoltage = vOutStart->GetNumber();
 
         maxVoltage = vOutStop->GetNumber();
 
         stepVoltage = vOutStep->GetNumber();
 
    
 
         if(stepVoltage == 0.)
 
            repetition = 1;
 
         else
 
            repetition = ((maxVoltage - minVoltage)/stepVoltage)+1;
 
    
 
         for(i=0; i < repetition; i++)
 
         {
 
            progVal = (float)(100.00/repetition)*i;
 
            curProgress->SetPosition(progVal);
 
        
 
            currentVoltage = minVoltage + stepVoltage*i;
 
            sprintf(cmd
, "%s/mpod/mpod_voltage.sh -o %d -v %f -s 1", rootdir
, GetChannel
(), currentVoltage
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
        
 
            printf("Waiting for voltage change...\n");  
            sleep(3);
 
            vOut->SetNumber(currentVoltage);
 
        
 
            // Here comes function to start histogramming <<<<<<<<<<<<<<<<<<<<<<<<
 
            RunMeas((void*)0, i, 0, scanon);
 
         }
 
        
 
         // Set output back to off
 
         printf("Measurement finished, returning to starting voltage...\n");  
         sprintf(cmd
, "%s/mpod/mpod_voltage.sh -o %d -v %f -s 1", rootdir
, GetChannel
(), minVoltage
);  
         vOut->SetNumber(minVoltage);
 
#if WORKSTAT == 'I'
 
#else
 
#endif
 
        
 
         progVal = 100.00;
 
         curProgress->SetPosition(progVal);
 
 
 
         pfin 
= fopen("finish_sig.txt","w"); 
         fprintf(pfin
, "%s: Voltage scan finished.", timeStamp
->GetText
());  
      }
 
   }
 
   // Surface scan
 
   else if( (pscan == 1) && (vscan == 0) )
 
   {
 
      minXpos = xPosMin->GetNumber();
 
      maxXpos = xPosMax->GetNumber();
 
      stepXpos = xPosStep->GetNumber();
 
      minYpos = yPosMin->GetNumber();
 
      maxYpos = yPosMax->GetNumber();
 
      stepYpos = yPosStep->GetNumber();
 
      minZpos = zPosMin->GetNumber();
 
      maxZpos = zPosMax->GetNumber();
 
      stepZpos = zPosStep->GetNumber();
 
 
 
      if(zscan == 1)
 
      {
 
         if(stepZpos == 0.) repetZ = 1;
 
         else repetZ = ((maxZpos - minZpos)/stepZpos)+1;
 
      }
 
      else
 
      {
 
         minZpos = zPos->GetNumber();
 
         repetZ = 1;
 
      }
 
 
 
      if(stepXpos == 0.) repetX = 1;
 
      else repetX = ((maxXpos - minXpos)/stepXpos)+1;
 
      if(stepYpos == 0.) repetY = 1;
 
      else repetY = ((maxYpos - minYpos)/stepYpos)+1;
 
 
 
      for(k=0; k < repetZ; k++)
 
      {
 
         // Y-axis change
 
         sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 3 -v %d -s la && %s/MIKRO/mikro_ctrl -n 3 -c m", rootdir
, minZpos 
+ stepZpos
*k
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
         
 
         int iloop =0;
 
                do {
 
                        usleep(50);
 
                        sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 3 -p > %s/curpos.txt", rootdir
, rootdir
);  
 
 
                        FILE* fpos;
 
                        int itemp;
 
                        sprintf(cmd
, "%s/curpos.txt", rootdir
);  
 
 
                        if(fpos != NULL)
 
                        {
 
                                retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
                        }
 
 
 
                        printf(">>>>>>> Cur Z Pos = %d\n", itemp
);  
 
 
 
 
                        if( abs(itemp 
- (minZpos 
+ stepZpos
*k
)) < 3 ) break;  
 
 
                        iloop++;
 
                } while(iloop < 10000);
 
     
 
         printf("Next Z position...\n");  
         zPos->SetNumber(minZpos + stepZpos*k);
 
     
 
         for(j=0; j < repetY; j++)
 
         {
 
            // Y-axis change
 
            sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 2 -v %d -s la && %s/MIKRO/mikro_ctrl -n 2 -c m", rootdir
, minYpos 
+ stepYpos
*j
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
            
 
                        printf("Waiting for position change...\n");  
            //sleep(4);
 
            
 
            int iloop =0;
 
                        do {
 
                                usleep(50);
 
                                sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 2 -p > %s/curpos.txt", rootdir
, rootdir
);  
 
 
                                FILE* fpos;
 
                                int itemp;
 
                                sprintf(cmd
, "%s/curpos.txt", rootdir
);  
 
 
                                if(fpos != NULL)
 
                                {
 
                                        retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
                                }
 
 
 
                                printf(">>>>>>> Cur Y Pos = %d\n", itemp
);  
 
 
 
 
                                if( abs(itemp 
- (minYpos 
+ stepYpos
*j
)) < 3 ) break;  
 
 
                                iloop++;
 
                        } while(iloop < 10000);
 
            
 
            printf("Next Y position...\n");  
            yPos->SetNumber(minYpos + stepYpos*j);
 
     
 
            for(i=0; i < repetX; i++)
 
            {
 
               progVal = (float)(100.00/(repetX*repetY))*(j*repetX+i);
 
               curProgress->SetPosition(progVal);
 
               
 
                                int jloop =0;
 
                                do {
 
                                        usleep(100);
 
 
 
                                        // X-axis change
 
                                        sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -v %d -s la && %s/MIKRO/mikro_ctrl -n 1 -c m", rootdir
, minXpos 
+ stepXpos
*i
, rootdir
);  
                                #if WORKSTAT == 'I'
 
                                #else
 
                                #endif
 
 
 
                                        printf("Next X position...\n");  
 
 
                                        printf("Waiting for position change...\n");  
                                        // sleep(2);
 
 
 
                                        int iloop =0;
 
                                        do {
 
                                                usleep(100);
 
                                                sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -p > %s/curpos.txt", rootdir
, rootdir
);  
 
 
                                                FILE* fpos;
 
                                                int itemp;
 
                                                sprintf(cmd
, "%s/curpos.txt", rootdir
);  
 
 
                                                if(fpos != NULL)
 
                                                {
 
                                                        retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
                                                }
 
 
 
                                                printf(">>>>>>> Cur X Pos = %d\n", itemp
);  
 
 
 
 
                                                if( abs(itemp 
- ( minXpos 
+ stepXpos
*i
)) < 3 ) break;  
 
 
                                                iloop++;
 
                                        } while(iloop < 100);
 
                                        
 
                                        sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -p > %s/curpos.txt", rootdir
, rootdir
);  
 
 
                                        FILE* fpos;
 
                                        int itemp;
 
                                        sprintf(cmd
, "%s/curpos.txt", rootdir
);  
 
 
                                        if(fpos != NULL)
 
                                        {
 
                                                retTemp 
= fscanf(fpos
, "%d\n", &itemp
); 
                                        }
 
 
 
                                        
 
                                        if( abs(itemp 
- ( minXpos 
+ stepXpos
*i
)) < 3 ) break;  
 
 
                                        jloop++;
 
                                } while(jloop < 100);
 
               
 
               
 
               
 
               xPos->SetNumber(minXpos + stepXpos*i);
 
     
 
//               for (k=0;k<(NTDCCH+NADCCH);k++) gHisto1D[k]->Reset();
 
//               for (k=0;k<(NTDCCH+NADCCH)/2;k++) gHisto2D[k]->Reset();
 
     
 
               // Here comes function to start histogramming <<<<<<<<<<<<<<<<<<<<<<<<
 
               RunMeas((void*)0, (j*repetX + i), zscan , scanon);
 
     
 
            }
 
     
 
         }
 
      }
 
 
 
      printf("Measurement finished, returning to starting position...\n");  
      // X-axis return
 
      sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 1 -v %d -s la && %s/MIKRO/mikro_ctrl -n 1 -c m", rootdir
, minXpos
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
      // Y-axis return
 
      sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 2 -v %d -s la && %s/MIKRO/mikro_ctrl -n 2 -c m", rootdir
, minYpos
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
 
 
      // Z-axis return
 
      sprintf(cmd
, "sudo %s/MIKRO/mikro_ctrl -n 3 -v %d -s la && %s/MIKRO/mikro_ctrl -n 3 -c m", rootdir
, minZpos
, rootdir
);  
#if WORKSTAT == 'I'
 
#else
 
#endif
 
      xPos->SetNumber(minXpos);
 
      yPos->SetNumber(minYpos);
 
      zPos->SetNumber(minZpos);
 
 
 
      progVal = 100.00;
 
      curProgress->SetPosition(progVal);
 
 
 
      pfin 
= fopen("finish_sig.txt","w"); 
      fprintf(pfin
, "%s: Surface scan finished.", timeStamp
->GetText
());  
   }
 
   // Normal single measurement
 
   else if( (vscan == 0) && (pscan == 0) )
 
   {
 
      // Set the start button to stop and enable stopping of measurement
 
      if(started)
 
      {
 
         printf("Stopping current single scan...\n");  
         gROOT->SetInterrupt();
 
//         gDaq->fStop=1;
 
         measStart->SetText("Start acquisition");
 
         started = kFALSE;
 
      }
 
      else if(!started)
 
      {
 
         measStart->SetText("Stop acquisition");
 
         started = kTRUE;
 
 
 
         printf("Running a single scan...\n");  
         RunMeas((void*)0, 0, 0, scanon);
 
         printf("Measurement finished...\n");  
      }
 
   }
 
}
 
 
 
// File browser for opening histograms
 
void TGAppMainFrame::SelectDirectory()
 
{
 
   int i = fileList->GetNumberOfEntries();
 
 
 
   TGFileInfo file_info;
 
   const char *filetypes[] = {"Histograms",histExtAll,0,0};
 
   file_info.fFileTypes = filetypes;
 
   file_info.fIniDir = StrDup("./results");
 
   file_info.fMultipleSelection = kTRUE;
 
   new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDOpen, &file_info);
 
 
 
   TList *files = file_info.fFileNamesList;
 
   if(files)
 
   {
 
      TSystemFile *file;
 
      TString fname;
 
      TIter next(files);
 
      while(file=(TSystemFile*)next())
 
      {
 
         fname = file->GetName();
 
         fileList->AddEntry(fname.Data(), i);
 
         i++;
 
      }
 
   }
 
   fileList->Layout();
 
}
 
 
 
// File browser for selecting the save file
 
void TGAppMainFrame::SaveFile()
 
{
 
   TGFileInfo file_info;
 
   const char *filetypes[] = {"Histograms",histExtAll,0,0};
 
   file_info.fFileTypes = filetypes;
 
   file_info.fIniDir = StrDup("./results");
 
   new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDSave, &file_info);
 
 
 
   fileName->SetText(file_info.fFilename);
 
}
 
 
 
// Toggle multiple selection in filelist
 
void TGAppMainFrame::ListMultiSelect()
 
{
 
   fileList->SetMultipleSelections((multiSelect->IsOn()));
 
 
 
   if(multiSelectAll->IsDown())
 
      multiSelectAll->SetState(kButtonUp);
 
}
 
 
 
// Select all entries in filelist
 
void TGAppMainFrame::ListSelectAll()
 
{
 
   if(multiSelectAll->IsDown())
 
   {
 
      multiSelect->SetState(kButtonDown);
 
      fileList->SetMultipleSelections((multiSelect->IsOn()));
 
      for(int i = 0; i < fileList->GetNumberOfEntries(); i++) 
 
         fileList->Select(i,kTRUE);
 
   }
 
   else if(!multiSelectAll->IsDown())
 
   {
 
      multiSelect->SetState(kButtonUp);
 
      fileList->SetMultipleSelections((multiSelect->IsOn()));
 
      for(int i = 0; i < fileList->GetNumberOfEntries(); i++) 
 
         fileList->Select(i,kFALSE);
 
   }
 
}
 
 
 
// Navigation buttons for the filelist (<<, >>) and double click
 
void TGAppMainFrame::FileListNavigation(int pn)
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   int curSel;
 
   TList *files;
 
   if( nrfiles > 0 )
 
   {
 
      if(pn < -1)
 
      {
 
         if(multiSelect->IsOn())
 
         {
 
            // turn off multiple selection and select first file on list
 
            fileList->SetMultipleSelections(kFALSE);
 
            multiSelect->SetState(kButtonUp);
 
            multiSelectAll->SetState(kButtonUp);
 
 
 
            fileList->Select(0,kTRUE);
 
         }
 
         else
 
         {
 
            // if nothing is selected, curSel will be -1
 
            curSel = fileList->GetSelected();
 
            // go to next file on list
 
            if(pn == -3)
 
            {
 
               if( (curSel == (int)(nrfiles-1)) || (curSel == -1) )
 
                  fileList->Select(0);
 
               else
 
                  fileList->Select(curSel+1);
 
            }
 
            // go to previous file on list
 
            else if(pn == -2)
 
            {
 
               if( (curSel == 0) || (curSel == -1) )
 
                  fileList->Select(nrfiles-1);
 
               else
 
                  fileList->Select(curSel-1);
 
            }
 
         }
 
      }
 
 
 
      // check the newly selected file/files and return its name/their names
 
      files = new TList();
 
      fileList->GetSelectedEntries(files);
 
      if(files)
 
      {
 
         for(int i = 0; i < (int)nrfiles; i++)
 
         {
 
            if(files->At(i))
 
            {
 
               if(debug)
 
                  printf("Filename: %s\n", files
->At
(i
)->GetTitle
());  
               if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0);
 
               else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1);
 
               else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2);
 
            }
 
         }
 
      }
 
 
 
      // Still need to include drawing of histograms we move to!!!
 
   }
 
}
 
 
 
// Open the header edit window when pressing on editHeader button
 
void TGAppMainFrame::HeaderEdit()
 
{
 
   OpenWindow(2);
 
}
 
 
 
// Display the currently selected histogram in file list
 
void TGAppMainFrame::DisplayHistogram(char* histfile, int histtype)
 
{
 
   if(debug)
 
      printf("Selected file: %s\n", histfile
);  
 
 
   TCanvas *gCanvas = histCanvas->GetCanvas();
 
 
 
   inroot = new TFile(histfile, "READ");
 
 
 
   TTree *header_data, *meas_data;
 
   inroot->GetObject("header_data", header_data);
 
   inroot->GetObject("meas_data", meas_data);
 
 
 
   // Reading the header
 
   header_data->SetBranchAddress("nrch", &evtheader.nrch);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("timestamp", &evtheader.timestamp);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("xpos", &evtheader.xpos);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("ypos", &evtheader.ypos);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("zpos", &evtheader.zpos);
 
   header_data->GetEntry(0);
 
   header_data->SetBranchAddress("temperature", &evtheader.temperature);
 
   header_data->GetEntry(0);
 
   if( header_data->FindBranch("angle") )
 
   {
 
      header_data->SetBranchAddress("angle", &evtheader.angle);
 
      header_data->GetEntry(0);
 
   }
 
   header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo);
 
   header_data->GetEntry(0);
 
 
 
   char histtime[256];
 
   GetTime(evtheader.timestamp, histtime);
 
 
 
   // Displaying header information (debug and on the GUI)
 
   if(debug)
 
   {
 
      printf("Opened file header information:\n");  
      printf("- Number of channels: %d\n", evtheader.
nrch);  
      printf("- Timestamp: %d (%s)\n", evtheader.
timestamp, histtime
);  
      printf("- Bias voltage: %lf\n", evtheader.
biasvolt);  
      printf("- Table position (X,Y,Z): %d, %d, %d\n", evtheader.
xpos, evtheader.
ypos, evtheader.
zpos);  
      if(evtheader.temperature)
 
         printf("- Temperature: %lf\n", evtheader.
temperature);  
      if( header_data->FindBranch("angle") )
 
         printf("- Incidence angle: %lf\n", evtheader.
angle);  
      else
 
         printf("- Incidence angle: No angle information!\n");  
      printf("- Laser and filter settings: %s\n", evtheader.
laserinfo);  
   }
 
 
 
   char ctemp[512];
 
   disptime->SetText(histtime);
 
   dispbias->SetNumber(evtheader.biasvolt);
 
   sprintf(ctemp
, "%d, %d, %d", evtheader.
xpos, evtheader.
ypos, evtheader.
zpos);  
   disppos->SetText(ctemp);
 
   if(evtheader.temperature)
 
      disptemp->SetNumber(evtheader.temperature);
 
   else
 
      disptemp->SetNumber(0.0);
 
   if( header_data->FindBranch("angle") )
 
      dispangle->SetNumber(evtheader.angle);
 
   else
 
      dispangle->SetNumber(0.0);
 
   displaser->SetText(evtheader.laserinfo);
 
 
 
   int j;
 
   char rdc[256];
 
   char rdcsel[256];
 
 
 
   j = selectCh->GetNumber();
 
 
 
   printf("Found %d data points.\n", (int)meas_data
->GetEntries
());  
 
 
   gCanvas->cd();
 
   double range[4];
 
   range[0] = adcMinRange->GetNumber();
 
   range[1] = adcMaxRange->GetNumber();
 
   range[2] = tdcMinwindow->GetNumber();
 
   range[3] = tdcMaxwindow->GetNumber();
 
 
 
   if(histtype == 0)
 
   {
 
      if( range[0] == range[1] )
 
         sprintf(rdc
, "ADC%d>>%s", j
, histname
);  
      else
 
         sprintf(rdc
, "ADC%d>>%s(%d,%lf,%lf)", j
, histname
, (int)(range
[1]-range
[0]), range
[0]-0.5, range
[1]-0.5);  
 
 
      sprintf(rdcsel
, "(TDC%d>%lf)&&(TDC%d<%lf)", j
, range
[2]*tdctimeconversion
, j
, range
[3]*tdctimeconversion
);  
      meas_data->Draw(rdc, rdcsel);
 
 
 
      sprintf(rdc
, "ADC%d, Vbias=%.3lf, TDC=(%.2lf,%.2lf);ADC;", j
, evtheader.
biasvolt, range
[2], range
[3]);  
      TH1F *histtemp = (TH1F*)gCanvas->GetPrimitive(histname);
 
      if(!cleanPlots)
 
         histtemp->SetTitle(rdc);
 
      else
 
         histtemp->SetTitle(";ADC;");
 
      histtemp->GetXaxis()->SetLabelSize(0.025);
 
      histtemp->GetXaxis()->CenterTitle(kTRUE);
 
      histtemp->GetYaxis()->SetLabelSize(0.025);
 
      if(cleanPlots)
 
      {
 
         TGaxis *yax = (TGaxis*)histtemp->GetYaxis();
 
         yax->SetMaxDigits(4);
 
      }
 
 
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
 
 
      if( yMinRange->GetNumber() != yMaxRange->GetNumber() )
 
      {
 
         if( (logscale->IsDown()) && (yMinRange->GetNumber() <= 0) )
 
         {
 
            histtemp->GetYaxis()->SetRangeUser(0.5, yMaxRange->GetNumber());
 
            yMinRange->SetNumber(0.5);
 
            logchange = 1;
 
         }
 
         else
 
         {
 
            gCanvas->SetLogy(kFALSE);
 
            if(logchange == 1)
 
            {
 
               yMinRange->SetNumber(0.0);
 
               logchange = 0;
 
            }
 
            histtemp->GetYaxis()->SetRangeUser(yMinRange->GetNumber(), yMaxRange->GetNumber());
 
         }
 
      }
 
 
 
      TPaveStats *stats = (TPaveStats*)histtemp->FindObject("stats");
 
      if(!cleanPlots)
 
      {
 
         stats->SetX1NDC(0.84); stats->SetX2NDC(0.97);
 
         stats->SetY1NDC(0.87); stats->SetY2NDC(0.97);
 
      }
 
      else
 
      {
 
         stats->SetX1NDC(1.1); stats->SetX2NDC(1.3);
 
         stats->SetY1NDC(1.1); stats->SetY2NDC(1.3);
 
      }
 
   }
 
   else if(histtype == 1)
 
   {
 
      if( range[0] == range[1] )
 
         sprintf(rdc
, "(TDC%d/%lf)>>%s", j
, tdctimeconversion
, histname
);  
      else
 
         sprintf(rdc
, "(TDC%d/%lf)>>%s(%d,%lf,%lf)", j
, tdctimeconversion
, histname
, (int)((range
[3]-range
[2])*tdctimeconversion
), range
[2], range
[3]);  
      sprintf(rdcsel
, "(TDC%d>%lf)&&(TDC%d<%lf)", j
, range
[2]*tdctimeconversion
, j
, range
[3]*tdctimeconversion
);  
      meas_data->Draw(rdc, rdcsel);
 
 
 
      sprintf(rdc
, "TDC%d, Vbias=%.3lf, TDC=(%.2lf,%.2lf);Time (TDC channel) [ns];", j
, evtheader.
biasvolt, range
[2], range
[3]);  
      TH1F *histtemp = (TH1F*)gCanvas->GetPrimitive(histname);
 
      if(!cleanPlots)
 
         histtemp->SetTitle(rdc);
 
      else
 
         histtemp->SetTitle(";Time (TDC channel) [ns];");
 
      histtemp->GetXaxis()->SetLabelSize(0.025);
 
      histtemp->GetXaxis()->CenterTitle(kTRUE);
 
      histtemp->GetYaxis()->SetLabelSize(0.025);
 
      if(cleanPlots)
 
      {
 
         TGaxis *yax = (TGaxis*)histtemp->GetYaxis();
 
         yax->SetMaxDigits(4);
 
      }
 
 
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
 
 
      if( yMinRange->GetNumber() != yMaxRange->GetNumber() )
 
      {
 
         if( (logscale->IsDown()) && (yMinRange->GetNumber() <= 0) )
 
         {
 
            histtemp->GetYaxis()->SetRangeUser(0.5, yMaxRange->GetNumber());
 
            yMinRange->SetNumber(0.5);
 
            logchange = 1;
 
         }
 
         else
 
         {
 
            gCanvas->SetLogy(kFALSE);
 
            if(logchange == 1)
 
            {
 
               yMinRange->SetNumber(0.0);
 
               logchange = 0;
 
            }
 
            histtemp->GetYaxis()->SetRangeUser(yMinRange->GetNumber(), yMaxRange->GetNumber());
 
         }
 
      }
 
 
 
      TPaveStats *stats = (TPaveStats*)histtemp->FindObject("stats");
 
      if(!cleanPlots)
 
      {
 
         stats->SetX1NDC(0.84); stats->SetX2NDC(0.97);
 
         stats->SetY1NDC(0.87); stats->SetY2NDC(0.97);
 
      }
 
      else
 
      {
 
         stats->SetX1NDC(1.1); stats->SetX2NDC(1.3);
 
         stats->SetY1NDC(1.1); stats->SetY2NDC(1.3);
 
      }
 
   }
 
   else if(histtype == 2)
 
   {
 
      if( ((range[0] == range[1]) && (range[2] == range[3])) || (range[2] == range[3]) || (range[0] == range[1]) )
 
         sprintf(rdc
, "(TDC%d/%lf):ADC%d>>%s", j
, tdctimeconversion
, j
, histname
);  
      else
 
         sprintf(rdc
, "(TDC%d/%lf):ADC%d>>%s(%d,%lf,%lf,%d,%lf,%lf)", j
, tdctimeconversion
, j
, histname
, (int)(range
[1]-range
[0])/2, range
[0]-0.5, range
[1]-0.5, (int)((range
[3]-range
[2])*tdctimeconversion
)/2, range
[2], range
[3]);  
      meas_data->Draw(rdc,"","COLZ");
 
 
 
      sprintf(rdc
, "ADC/TDC%d, Vbias=%.3lf, TDC=(%.2lf,%.2lf);ADC;TDC", j
, evtheader.
biasvolt, range
[2], range
[3]);  
      TH2F *histtemp = (TH2F*)gCanvas->GetPrimitive(histname);
 
      if(!cleanPlots)
 
         histtemp->SetTitle(rdc);
 
      else
 
         histtemp->SetTitle(";ADC;Time (TDC channel) [ns]");
 
      histtemp->GetXaxis()->SetLabelSize(0.025);
 
      histtemp->GetXaxis()->CenterTitle(kTRUE);
 
      histtemp->GetYaxis()->SetLabelSize(0.025);
 
      histtemp->GetYaxis()->CenterTitle(kTRUE);
 
      histtemp->GetYaxis()->SetTitleOffset(1.35);
 
      if(cleanPlots)
 
      {
 
         TGaxis *yax = (TGaxis*)histtemp->GetYaxis();
 
         yax->SetMaxDigits(4);
 
      }
 
 
 
      gCanvas->Modified();
 
      gCanvas->Update();
 
 
 
      TPaveStats *stats = (TPaveStats*)histtemp->FindObject("stats");
 
//      stats->SetOptStat(0);
 
      stats->SetX1NDC(1.1); stats->SetX2NDC(1.3);
 
      stats->SetY1NDC(1.1); stats->SetY2NDC(1.3);
 
 
 
      TPaletteAxis *gpalette = (TPaletteAxis*)histtemp->GetListOfFunctions()->FindObject("palette");
 
      gpalette->SetLabelSize(0.022);
 
   }
 
 
 
   if(histtype < 2)
 
   {
 
      if( logscale->IsDown() )
 
         gCanvas->SetLogy(kTRUE);
 
      else if( !logscale->IsDown() )
 
         gCanvas->SetLogy(kFALSE);
 
   }
 
   else
 
      gCanvas->SetLogy(kFALSE);
 
 
 
   gCanvas->Modified();
 
   gCanvas->Update();
 
 
 
   // If you close the opened file, the data can't be accessed by other functions
 
}
 
 
 
// Create a 2D surface plot and plot it
 
void TGAppMainFrame::MakeSurfPlot(TList *files)
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   int j, k = 0, m = 0, n = 0;
 
   char ctemp[256];
 
   TCanvas *gCanvas = histCanvas->GetCanvas();
 
   TTree *header_data, *meas_data;
 
   double *integralCount;
 
   double *surfx, *surfy;
 
   double xsurfmin = 0, ysurfmin = 0;
 
   integralCount = new double[nrfiles];
 
   for(int i = 0; i < (int)nrfiles; i++) integralCount[i] = 0;
 
   surfx = new double[nrfiles];
 
   surfy = new double[nrfiles];
 
   int nrentries;
 
   TGraph2D *gScan2D;
 
   gScan2D = new TGraph2D();
 
 
 
/*   int zProg = 0;
 
   float progVal;
 
   curProgress->SetPosition(zProg);*/
 
 
 
   char exportname[256];
 
   
 
   if(multiSelect->IsOn())
 
   {
 
      printf("Creating a surface plot. Please wait...\n");  
      fileList->GetSelectedEntries(files);
 
      if(files)
 
      {
 
         busyLabel->Enable();
 
 
 
         for(int i = 0; i < (int)nrfiles; i++)
 
         {
 
            if(files->At(i))
 
            {
 
               n++;
 
//               printf("Filename: %s\n", files->At(i)->GetTitle());
 
             
 
               sprintf(ctemp
, "%s", files
->At
(i
)->GetTitle
());  
               inroot = new TFile(ctemp, "READ");
 
             
 
               inroot->GetObject("header_data", header_data);
 
               inroot->GetObject("meas_data", meas_data);
 
             
 
               // Reading the header
 
               header_data->SetBranchAddress("xpos", &evtheader.xpos);
 
               header_data->GetEntry(0);
 
               header_data->SetBranchAddress("ypos", &evtheader.ypos);
 
               header_data->GetEntry(0);
 
 
 
               char rdc[256];
 
               j = selectCh->GetNumber();
 
               double rangetdc[2];
 
               rangetdc[0] = tdcMinwindow->GetNumber();
 
               rangetdc[1] = tdcMaxwindow->GetNumber();
 
 
 
               k = 0;
 
               m = 0;
 
             
 
               // Reading the data
 
               for(int i = 0; i < meas_data->GetEntries(); i++)
 
               {
 
                  meas_data->SetBranchAddress(rdc, &evtdata.adcdata[j]);
 
                  meas_data->GetEntry(i);
 
             
 
                  meas_data->SetBranchAddress(rdc, &evtdata.tdcdata[j]);
 
                  meas_data->GetEntry(i);
 
 
 
                  // If our data point is inside the TDC window
 
                  if( ((double)evtdata.tdcdata[j]/tdctimeconversion >= rangetdc[0]) && ((double)evtdata.tdcdata[j]/tdctimeconversion <= rangetdc[1]) )
 
                  {
 
                     k++;
 
                     m += evtdata.adcdata[j];
 
                  }
 
               }
 
 
 
               integralCount[n-1] += ((double)m)/((double)k);
 
               if(n == 1)
 
               {
 
                  xsurfmin = evtheader.xpos;
 
                  ysurfmin = evtheader.ypos;
 
               }
 
               surfx[n-1] = (double)(evtheader.xpos-xsurfmin)*lenconversion;
 
               surfy[n-1] = (double)(evtheader.ypos-ysurfmin)*lenconversion;
 
 
 
/*             if( n == (((files->GetSize())*zProg)/20)+1 ) // divide by 20 because files->GetSize() gives a double value of the files selected
 
               {
 
                  progVal = (float)n;
 
                  curProgress->SetPosition(progVal);
 
                  zProg++;
 
                  printf("Progress = %lf\n", progVal);
 
               }*/
 
 
 
               inroot->Close();
 
               delete inroot;
 
            }
 
         }
 
 
 
         busyLabel->Disable();
 
 
 
         nrentries = n;
 
         printf("%d files were selected.\n", nrentries
);  
 
 
         for(int i = 0; i < nrentries; i++)
 
         {
 
//            printf("At position (%d,%d), the ADC integral is: %lf.\n", surfx[i], surfy[i], integralCount[i]);
 
            gScan2D->SetPoint(i, surfx[i], surfy[i], integralCount[i]);
 
         }
 
         gCanvas->cd();
 
         gScan2D->Draw("COLZ");
 
 
 
         gCanvas->Modified();
 
         gCanvas->Update();
 
 
 
         gScan2D->GetXaxis()->SetTitle("X [#mum]");
 
         gScan2D->GetXaxis()->CenterTitle(kTRUE);
 
         gScan2D->GetXaxis()->SetLabelSize(0.022);
 
         gScan2D->GetXaxis()->SetRangeUser(surfx[0], surfx[nrentries-1]);
 
//       j = 500+(int)((surfx[nrentries-1]-surfx[0])/(surfx[1]-surfx[0]));
 
//       if(j > 510) j = 510;
 
         gScan2D->GetXaxis()->SetNdivisions(510, kTRUE);
 
         gScan2D->GetYaxis()->SetTitle("Y [#mum]");
 
         gScan2D->GetYaxis()->SetTitleOffset(1.3);
 
         gScan2D->GetYaxis()->CenterTitle(kTRUE);
 
         gScan2D->GetYaxis()->SetLabelSize(0.022);
 
         gScan2D->GetYaxis()->SetRangeUser(surfy[0], surfy[nrentries-1]);
 
//       j = 500+(int)((surfy[nrentries-1]-surfy[0])/(surfy[(int)((surfx[nrentries-1]-surfx[0])/(surfx[1]-surfx[0])+1)]-surfy[0]));
 
//       if(j > 510) j = 510;
 
         gScan2D->GetYaxis()->SetNdivisions(510, kTRUE);
 
 
 
         TGaxis *yax = (TGaxis*)gScan2D->GetYaxis();
 
         yax->SetMaxDigits(4);
 
 
 
         if(!cleanPlots)
 
            gScan2D->SetTitle("Surface scan");
 
         else
 
            gScan2D->SetTitle();
 
 
 
//         TPaletteAxis *gpalette = (TPaletteAxis*)gScan2D->GetListOfFunctions()->FindObject("palette");
 
//         gpalette->SetLabelSize(0.022);
 
 
 
         gCanvas->Modified();
 
         gCanvas->Update();
 
 
 
         remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp);
 
         sprintf(exportname
, "%s_surfscan.pdf", ctemp
);  
         gCanvas->SaveAs(exportname);
 
      }
 
   }
 
   else
 
   {
 
      printf("To make a 2D surface scan plot, select multiple root files.\n");  
      change2Dsurf->SetDown(kFALSE);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF);
 
   }
 
 
 
   delete[] surfx;
 
   delete[] surfy;
 
   delete[] integralCount;
 
}
 
 
 
// Change histogram when changing the channel
 
void TGAppMainFrame::ChangeChannel()
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   TList *files;
 
 
 
   if( nrfiles > 0 )
 
   {
 
      // check the newly selected file/files and return its name/their names
 
      files = new TList();
 
      fileList->GetSelectedEntries(files);
 
      if(files)
 
      {
 
         for(int i = 0; i < (int)nrfiles; i++)
 
         {
 
            if(files->At(i))
 
            {
 
               if(debug)
 
                  printf("Filename: %s\n", files
->At
(i
)->GetTitle
());  
               if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0);
 
               else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1);
 
               else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2);
 
            }
 
         }
 
      }
 
   }
 
}
 
 
 
// Setting a predetermined X range
 
void TGAppMainFrame::SetHistRange()
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
 
 
   if(nrfiles > 0)
 
   {
 
      TList *files;
 
      files = new TList();
 
      fileList->GetSelectedEntries(files);
 
      if(files)
 
      {
 
         for(int i = 0; i < (int)nrfiles; i++)
 
         {
 
            if(files->At(i))
 
            {
 
               if(debug)
 
                  printf("Filename: %s\n", files
->At
(i
)->GetTitle
());  
               if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0);
 
               else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1);
 
               else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) )
 
                  DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2);
 
            }
 
         }
 
      }
 
   }
 
}
 
 
 
// Changing the histogram type to display
 
void TGAppMainFrame::ChangeHisttype(int type)
 
{
 
   TGTextButton *pressedB = new TGTextButton();
 
   int menuID = 0;
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
 
 
   // ADC histogram
 
   if(type == 0)
 
   {
 
      pressedB = changeADC;
 
      menuID = M_ANALYSIS_HISTTYPE_1DADC;
 
 
 
      changeTDC->SetDown(kFALSE);
 
      changeADCTDC->SetDown(kFALSE);
 
      change2Dsurf->SetDown(kFALSE);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF);
 
   }
 
   // TDC histogram
 
   else if(type == 1)
 
   {
 
      pressedB = changeTDC;
 
      menuID = M_ANALYSIS_HISTTYPE_1DTDC;
 
 
 
      changeADC->SetDown(kFALSE);
 
      changeADCTDC->SetDown(kFALSE);
 
      change2Dsurf->SetDown(kFALSE);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DADC);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF);
 
   }
 
   // ADC vs. TDC histogram
 
   else if(type == 2)
 
   {
 
      pressedB = changeADCTDC;
 
      menuID = M_ANALYSIS_HISTTYPE_2D;
 
 
 
      changeADC->SetDown(kFALSE);
 
      changeTDC->SetDown(kFALSE);
 
      change2Dsurf->SetDown(kFALSE);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DADC);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_SURF);
 
   }
 
   // Surface scan plot
 
   else if(type == 3)
 
   {
 
      pressedB = change2Dsurf;
 
      menuID = M_ANALYSIS_HISTTYPE_SURF;
 
 
 
      changeADC->SetDown(kFALSE);
 
      changeTDC->SetDown(kFALSE);
 
      changeADCTDC->SetDown(kFALSE);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DADC);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_1DTDC);
 
      fMenuHisttype->UnCheckEntry(M_ANALYSIS_HISTTYPE_2D);
 
   }
 
 
 
   if( fMenuHisttype->IsEntryChecked(menuID) )
 
   {
 
      pressedB->SetDown(kFALSE);
 
      fMenuHisttype->UnCheckEntry(menuID);
 
   }
 
   else if( !fMenuHisttype->IsEntryChecked(menuID) )
 
   {
 
      pressedB->SetDown(kTRUE);
 
      fMenuHisttype->CheckEntry(menuID);
 
   }
 
 
 
   if(nrfiles > 0)
 
   {
 
      // Still need to add the switch!!!
 
      TList *files;
 
      files = new TList();
 
      fileList->GetSelectedEntries(files);
 
 
 
      if(type < 3)
 
         DisplayHistogram( (char*)(files->At(0)->GetTitle()), type);
 
      else if(type == 3)
 
         MakeSurfPlot( files );
 
   }
 
}
 
 
 
// Changing the histogram type to display
 
void TGAppMainFrame::HistogramExport()
 
{
 
   unsigned int nrfiles = fileList->GetNumberOfEntries();
 
   TList *files;
 
   TCanvas *gCanvas = histCanvas->GetCanvas();
 
   
 
   char exportname[256];
 
   char ctemp[256];
 
 
 
   if(nrfiles > 0)
 
   {
 
      files = new TList();
 
      fileList->GetSelectedEntries(files);
 
      if(files)
 
      {
 
         if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_SURF) ) // for the surface scan, the plot from all selected files is already created
 
         {
 
            remove_from_last((char*)files->At(0)->GetTitle(), '_', ctemp);
 
            sprintf(exportname
, "%s_surfscan.pdf", ctemp
);  
            gCanvas->SaveAs(exportname);
 
         }
 
         else
 
         {
 
            for(int i = 0; i < (int)nrfiles; i++)
 
            {
 
               if(files->At(i))
 
               {
 
                  remove_ext((char*)files->At(i)->GetTitle(), ctemp);
 
     
 
                  if(debug)
 
                     printf("Filename: %s\n", files
->At
(i
)->GetTitle
());  
                  if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) )
 
                  {
 
                     sprintf(exportname
, "%s_adc%d.pdf", ctemp
, (int)selectCh
->GetNumber
());  
                     DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0);
 
                  }
 
                  else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DTDC) )
 
                  {
 
                     sprintf(exportname
, "%s_tdc%d.pdf", ctemp
, (int)selectCh
->GetNumber
());  
                     DisplayHistogram( (char*)(files->At(i)->GetTitle()), 1);
 
                  }
 
                  else if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_2D) )
 
                  {
 
                     sprintf(exportname
, "%s_adctdc%d.pdf", ctemp
, (int)selectCh
->GetNumber
());  
                     DisplayHistogram( (char*)(files->At(i)->GetTitle()), 2);
 
                  }
 
     
 
                  gCanvas->SaveAs(exportname);
 
               }
 
            }
 
         }
 
      }
 
   }
 
}
 
 
 
//---------------------------------------------------------------
 
// Main window constructor definition (& layout)
 
 
 
TGAppMainFrame::TGAppMainFrame(const TGWindow *p, int w, int h)
 
{
 
   gDaq = new daq();
 
   gScopeDaq = new daqscope();
 
 
 
   // Define the main window and menubar
 
   fMain = new TGMainFrame(p, w, h, kVerticalFrame);    // vertical frame split into menubar and main frame
 
   fMenuBar = new TGMdiMenuBar(fMain, 10, 10);          // just prepare menubar, draw it with InitMenu()
 
   fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
 
 
 
   // Define the main frame where opened subwindows will appear
 
   fMainFrame = new TGMdiMainFrame(fMain, fMenuBar, 300, 300);
 
   fMain->AddFrame(fMainFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
 
 
 
   // Initialize the menubar the initial measurement layout subwindows and display the main window
 
   InitMenu();
 
   MeasurementLayout();
 
   fMain->SetWindowName(WINDOW_NAME);
 
   fMain->MapSubwindows();
 
   fMain->MapWindow();
 
   fMain->Layout();
 
   GetPosition();
 
   GetVoltOut();
 
}
 
 
 
//---------------------------------------------------------------
 
// Event handler for menubar actions
 
 
 
void TGAppMainFrame::HandleMenu(Int_t id)
 
{
 
   TList *files;
 
 
 
   switch (id) {
 
      case M_FILE_NEW:
 
         // Clear any values and histogram
 
         break;
 
 
 
      case M_FILE_EXIT:
 
         CloseWindow();
 
         break;
 
 
 
      case M_ANALYSIS_HISTTYPE_1DADC:
 
         // Toggles the ADC button
 
         ChangeHisttype(0);
 
         break;
 
 
 
      case M_ANALYSIS_HISTTYPE_1DTDC:
 
         ChangeHisttype(1);
 
         break;
 
 
 
      case M_ANALYSIS_HISTTYPE_2D:
 
         ChangeHisttype(2);
 
         break;
 
 
 
      case M_ANALYSIS_HISTTYPE_SURF:
 
         ChangeHisttype(3);
 
         break;
 
 
 
      case M_ANALYSIS_FIT:
 
         // Fit spectrum
 
         files = new TList();
 
         fileList->GetSelectedEntries(files);
 
 
 
         if( fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC) && (files->GetSize() > 0) )
 
            FitSpectrum(files, 1);
 
         break;
 
 
 
      case M_ANALYSIS_FITSEL:
 
         // Fit all spectra
 
         files = new TList();
 
         fileList->GetSelectedEntries(files);
 
 
 
         if( (fMenuHisttype->IsEntryChecked(M_ANALYSIS_HISTTYPE_1DADC)) && (files->GetSize() > 1) )
 
            FitSpectrum(files, files->GetSize());
 
         break;
 
 
 
      case M_ANALYSIS_INTEGX:
 
         // Integrate the current spectra
 
         files = new TList();
 
         fileList->GetSelectedEntries(files);
 
 
 
         IntegSpectrum(files, 1);
 
         break;
 
 
 
      case M_ANALYSIS_INTEGY:
 
         // Integrate the current spectra
 
         files = new TList();
 
         fileList->GetSelectedEntries(files);
 
 
 
         IntegSpectrum(files, 2);
 
         break;
 
 
 
      case M_ANALYSIS_PHOTMU:
 
         // Integrate the current spectra and calculate mean of detected photons: mu = -log(Nped/Ntot)
 
         files = new TList();
 
         fileList->GetSelectedEntries(files);
 
 
 
         PhotonMu(files);
 
         break;
 
 
 
      case M_TOOLS_FIELDPOINT:
 
         OpenWindow(1);
 
         break;
 
 
 
      case M_WINDOW_HOR:
 
         fMainFrame->TileHorizontal();
 
         break;
 
 
 
      case M_WINDOW_VERT:
 
         fMainFrame->TileVertical();
 
         break;
 
 
 
      case M_HELP_ABOUT:
 
         About();
 
         break;
 
 
 
      default:
 
         fMainFrame->SetCurrent(id);
 
         break;
 
   }
 
}
 
 
 
//---------------------------------------------------------------
 
// Initialize the main window menu
 
 
 
void TGAppMainFrame::InitMenu()
 
{
 
   fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
 
 
 
   // Popup menu in menubar for File controls
 
   fMenuFile = new TGPopupMenu(gClient->GetRoot());     // adds a new popup menu to the menubar
 
   fMenuFile->AddEntry(new TGHotString("&New Measurement"), M_FILE_NEW);
 
   fMenuFile->AddSeparator();
 
   fMenuFile->AddEntry(new TGHotString("E&xit"), M_FILE_EXIT);
 
 
 
   // Popup menu in menubar for Analysis controls
 
   fMenuHisttype = new TGPopupMenu(gClient->GetRoot()); // adds a cascade menu that will be incorporated into analysis controls
 
   fMenuHisttype->AddEntry(new TGHotString("1D &ADC histogram"), M_ANALYSIS_HISTTYPE_1DADC);
 
   fMenuHisttype->AddEntry(new TGHotString("1D &TDC histogram"), M_ANALYSIS_HISTTYPE_1DTDC);
 
   fMenuHisttype->AddEntry(new TGHotString("&2D ADC vs. TDC histogram"), M_ANALYSIS_HISTTYPE_2D);
 
   fMenuHisttype->AddEntry(new TGHotString("2D &surface scan plot"), M_ANALYSIS_HISTTYPE_SURF);
 
 
 
   fMenuAnalysis = new TGPopupMenu(gClient->GetRoot()); // adds a new popup menu to the menubar
 
   fMenuAnalysis->AddPopup(new TGHotString("&Histogram type"), fMenuHisttype);
 
 
 
   fMenuAnalysis->AddEntry(new TGHotString("&Fit spectrum"), M_ANALYSIS_FIT);
 
   fMenuAnalysis->AddEntry(new TGHotString("Fit &all selected"), M_ANALYSIS_FITSEL);
 
   fMenuAnalysis->AddEntry(new TGHotString("Integrate spectrum (&X direction)"), M_ANALYSIS_INTEGX);
 
   fMenuAnalysis->AddEntry(new TGHotString("Integrate spectrum (&Y direction)"), M_ANALYSIS_INTEGY);
 
   fMenuAnalysis->AddEntry(new TGHotString("Relative &PDE"), M_ANALYSIS_PHOTMU);
 
 
 
   // Popup menu in menubar for External tools
 
   fMenuTools = new TGPopupMenu(gClient->GetRoot());    // adds a new popup menu to the menubar
 
   fMenuTools->AddEntry(new TGHotString("&Fieldpoint temperature sensor"), M_TOOLS_FIELDPOINT);
 
 
 
   // Popup menu in menubar for Window controls
 
   fMenuWindow = new TGPopupMenu(gClient->GetRoot());   // adds a new popup menu to the menubar
 
   fMenuWindow->AddEntry(new TGHotString("Tile &Horizontally"), M_WINDOW_HOR);
 
   fMenuWindow->AddEntry(new TGHotString("Tile &Vertically"), M_WINDOW_VERT);
 
   fMenuWindow->AddPopup(new TGHotString("&Windows"), fMainFrame->GetWinListMenu());
 
 
 
   // Popup menu in menubar for Help controls
 
   fMenuHelp = new TGPopupMenu(gClient->GetRoot());
 
   fMenuHelp->AddEntry(new TGHotString("&About"), M_HELP_ABOUT);
 
 
 
   // Connect all menu items with actions - handled by HandleMenu()
 
   fMenuFile->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
 
   fMenuAnalysis->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
 
   fMenuTools->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
 
   fMenuWindow->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
 
   fMenuHelp->Connect("Activated(Int_t)", "TGAppMainFrame", this, "HandleMenu(Int_t)");
 
 
 
   // Draw the created popup menus on the menubar
 
   fMenuBar->AddPopup(new TGHotString("&File"), fMenuFile, fMenuBarItemLayout);
 
   fMenuBar->AddPopup(new TGHotString("&Analysis"),fMenuAnalysis,fMenuBarItemLayout);
 
   fMenuBar->AddPopup(new TGHotString("&Tools"),fMenuTools,fMenuBarItemLayout);
 
   fMenuBar->AddPopup(new TGHotString("&Windows"),fMenuWindow,fMenuBarItemLayout);
 
   fMenuBar->AddPopup(new TGHotString("&Help"), fMenuHelp, fMenuBarItemLayout);
 
 
 
   // Disable fieldpoint if we are not connected to the IJS network
 
#if IJSNET == 0
 
   fMenuTools->DisableEntry(M_TOOLS_FIELDPOINT);
 
#endif
 
}
 
 
 
//---------------------------------------------------------------
 
// Set the measurement subwindow layout
 
 
 
void TGAppMainFrame::MeasurementLayout()
 
{
 
   TGMdiFrame *mdiFrame;
 
 
 
   // Generic horizontal and vertical frames
 
   TGHorizontalFrame *fH1, *fH2, *fH3;
 
   TGVerticalFrame *fV1;
 
   TGGroupFrame *fG1;
 
   TGLabel *lab;
 
   TGCompositeFrame *fT1;
 
 
 
   // Sizes of internal group and subwindow structures
 
   int subwin[2];
 
   int subgroup[2];
 
 
 
// Settings pane ---------------------------------------------------------------------------
 
   subwin[0] = (winWidth/6)-5; subwin[1] = 3*((winHeight/5)-5)-10;
 
   settingsPane = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]);
 
   mdiFrame = settingsPane->GetMdiFrame();
 
 
 
   // Check button to toggle voltage scan
 
   voltscanOn = new TGCheckButton(mdiFrame, "Voltage scan ON/OFF");
 
   voltscanOn->Resize(50,22);
 
   voltscanOn->SetState(kButtonUp);
 
   mdiFrame->AddFrame(voltscanOn, f0centerx);
 
 
 
   // Check button to toggle surface scan
 
   surfscanOn = new TGCheckButton(mdiFrame, "Surface scan ON/OFF");
 
   surfscanOn->Resize(50,22);
 
   surfscanOn->SetState(kButtonUp);
 
   mdiFrame->AddFrame(surfscanOn, f0centerx);
 
 
 
   // Check button to toggle Z direction scan
 
   zscanOn = new TGCheckButton(mdiFrame, "Z-axis scan ON/OFF");
 
   zscanOn->Resize(50,22);
 
   zscanOn->SetState(kButtonUp);
 
   mdiFrame->AddFrame(zscanOn, f0centerx);
 
 
 
   // Check button to toggle (open) the histogram window
 
//   histogramOn = new TGCheckButton(mdiFrame, "Histogram display ON/OFF");
 
//   histogramOn->Resize(50,22);
 
//   histogramOn->SetState(kButtonUp);
 
//   mdiFrame->AddFrame(histogramOn, f0centerx);
 
 
 
   subgroup[0] = subwin[0]-10;
 
   // Hard limit for maximum voltage we can set
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Voltage limit:");
 
   fH1->AddFrame(lab, f0center2d);
 
   vHardlimit = new TGNumberEntry(fH1, 70.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber);
 
   vHardlimit->Resize(80,22);
 
   fH1->AddFrame(vHardlimit, f0center2d);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   // Number of used channels
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Nr. of channels:");
 
   fH1->AddFrame(lab, f0center2d);
 
   NCH = new TGNumberEntry(fH1, 1, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1, 8);
 
   NCH->Resize(40,22);
 
   fH1->AddFrame(NCH, f0center2d);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   // Check button to toggle plots with additional information or clean plots
 
   cleanOn = new TGCheckButton(mdiFrame, "Clean plots ON/OFF");
 
   cleanOn->Resize(50,22);
 
   cleanOn->SetState(kButtonDown);
 
   cleanPlots = 1;
 
   mdiFrame->AddFrame(cleanOn, f0centerx);
 
 
 
   // Button and textbox to enter the oscilloscope IP address
 
   lab = new TGLabel(mdiFrame, "Scope IP:");
 
   mdiFrame->AddFrame(lab, f0);
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   oscIP = new TGTextEntry(fH1, "178.172.43.157");
 
   oscIP->Resize(110,22);
 
   fH1->AddFrame(oscIP, f0);
 
   oscConnect = new TGTextButton(fH1, "Connect");
 
   oscConnect->SetTextJustify(36);
 
   oscConnect->SetWrapLength(-1);
 
   oscConnect->Resize(60,22);
 
   fH1->AddFrame(oscConnect, f0);
 
   oscOn = 0;
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   // Laser settings (freq., tune, ND filter)
 
   lab = new TGLabel(mdiFrame, "Laser settings:");
 
   mdiFrame->AddFrame(lab, f0);
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   laserInfo = new TGTextEntry(fH1, "kHz, tune, ND");
 
   fH1->AddFrame(laserInfo, f2);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   // Chamber temperature (will only be manually set until we can get it directly from the chamber)
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Chamber temp.:");
 
   fH1->AddFrame(lab, f0center2d);
 
   chtemp = new TGNumberEntry(fH1, 25.0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -70., 150.);
 
   chtemp->Resize(60,22);
 
   fH1->AddFrame(chtemp, f0center2d);
 
   mdiFrame->AddFrame(fH1, f2);
 
   
 
   // Incidence angle (will only be manually set until we can make it motorized)
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Incid. angle:");
 
   fH1->AddFrame(lab, f0center2d);
 
   incangle = new TGNumberEntry(fH1, 0.0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -180., 180.);
 
   incangle->Resize(60,22);
 
   fH1->AddFrame(incangle, f0center2d);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   mdiFrame->SetMdiHints(kMdiMinimize);
 
   mdiFrame->SetWindowName("Settings pane");
 
   mdiFrame->MapSubwindows();
 
   mdiFrame->Layout();
 
   mdiFrame->Move(0,0);
 
// Settings pane ---------------------------------------------------------------------------
 
 
 
// Main window -----------------------------------------------------------------------------
 
   subwin[0] = 3*((winWidth/6)-5); subwin[1] = 3*((winHeight/5)-5)-10;
 
   mainSubwindow = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]);
 
   mdiFrame = mainSubwindow->GetMdiFrame();
 
 
 
   // Voltage and position tab
 
   subgroup[0] = 2*subwin[0]/5-12;
 
   subgroup[1] = (subwin[1]+15)/2+5;
 
   setTab = new TGTab(mdiFrame, subgroup[0], subgroup[1]);
 
   
 
   fT1 = setTab->AddTab("Voltage + Position");
 
 
 
   fH1 = new TGHorizontalFrame(fT1, subwin[0], subgroup[1], kFixedHeight);
 
   // Left pane (Bias voltage controls)
 
   fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight);
 
   fG1 = new TGGroupFrame(fV1, "Bias voltage controls");
 
 
 
   // Output voltage supply channel
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Output channel:");
 
   fH2->AddFrame(lab, f0center2d);
 
   vOutCh = new TGComboBox(fH2, 200);
 
   vOutCh->AddEntry("1", 0);
 
   vOutCh->AddEntry("2", 1);
 
   vOutCh->AddEntry("3", 2);
 
   vOutCh->AddEntry("4", 3);
 
   vOutCh->AddEntry("5", 4);
 
   vOutCh->AddEntry("6", 5);
 
   vOutCh->AddEntry("7", 6);
 
   vOutCh->AddEntry("8", 7);
 
   vOutCh->AddEntry("101", 8);
 
   vOutCh->AddEntry("102", 9);
 
   vOutCh->AddEntry("103", 10);
 
   vOutCh->AddEntry("104", 11);
 
   vOutCh->AddEntry("105", 12);
 
   vOutCh->AddEntry("106", 13);
 
   vOutCh->AddEntry("107", 14);
 
   vOutCh->AddEntry("108", 15);
 
   vOutCh->Resize(50,22);
 
   vOutCh->Select(0);
 
   fH2->AddFrame(vOutCh, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Output voltage setting
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Output voltage:");
 
   fH2->AddFrame(lab, f0center2d);
 
   vOut = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, 0, vHardlimit->GetNumber());
 
   vOut->Resize(80,22);
 
   fH2->AddFrame(vOut, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   vOutOnOff = new TGCheckButton(fH2, "Output ON/OFF");
 
   vOutOnOff->Resize(subgroup[0]-10,22);
 
   vOutOnOff->SetState(kButtonUp);
 
   fH2->AddFrame(vOutOnOff, f0centerx);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Set, get and reset voltage buttons
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   fH3 = new TGHorizontalFrame(fH2, subgroup[0], 30);
 
   vOutSet = new TGTextButton(fH3, "Set");
 
   vOutSet->SetTextJustify(36);
 
   vOutSet->SetWrapLength(-1);
 
   vOutSet->Resize(60,22);
 
   fH3->AddFrame(vOutSet, f0);
 
   vOutGet = new TGTextButton(fH3, "Get");
 
   vOutGet->SetTextJustify(36);
 
   vOutGet->SetWrapLength(-1);
 
   vOutGet->Resize(60,22);
 
   fH3->AddFrame(vOutGet, f0);
 
   vOutReset = new TGTextButton(fH3, "Reset");
 
   vOutReset->SetTextJustify(36);
 
   vOutReset->SetWrapLength(-1);
 
   vOutReset->Resize(60,22);
 
   fH3->AddFrame(vOutReset, f0);
 
   fH2->AddFrame(fH3, f0centerx);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Voltage scan controls
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "V (min):");
 
   fH2->AddFrame(lab, f0center2d);
 
   vOutStart = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber);
 
   vOutStart->Resize(80,22);
 
   fH2->AddFrame(vOutStart, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "V (max):");
 
   fH2->AddFrame(lab, f0center2d);
 
   vOutStop = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber);
 
   vOutStop->Resize(80,22);
 
   fH2->AddFrame(vOutStop, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "V (step):");
 
   fH2->AddFrame(lab, f0center2d);
 
   vOutStep = new TGNumberEntry(fH2, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber);
 
   vOutStep->Resize(80,22);
 
   fH2->AddFrame(vOutStep, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fV1->AddFrame(fG1, f1);
 
   // Left pane (Bias voltage controls)
 
   fH1->AddFrame(fV1, f0);
 
   
 
   // Right pane (Table position controls)
 
   subgroup[0] = 3*subwin[0]/5-12;
 
   fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1], kFixedWidth | kFixedHeight);
 
   fG1 = new TGGroupFrame(fV1, "Table position controls");
 
 
 
   // X, Y and Z positions
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "X:");
 
   fH2->AddFrame(lab, f0center2d);
 
   xPos = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000);
 
   xPos->Resize(80,22);
 
   fH2->AddFrame(xPos, f0center2d);
 
 
 
   lab = new TGLabel(fH2, "Z (min):");
 
   fH2->AddFrame(lab, f0center2d);
 
   zPosMin = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 375000);
 
   zPosMin->Resize(80,22);
 
   fH2->AddFrame(zPosMin, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Y:");
 
   fH2->AddFrame(lab, f0center2d);
 
   yPos = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000);
 
   yPos->Resize(80,22);
 
   fH2->AddFrame(yPos, f0center2d);
 
 
 
   lab = new TGLabel(fH2, "Z (max):");
 
   fH2->AddFrame(lab, f0center2d);
 
   zPosMax = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 375000);
 
   zPosMax->Resize(80,22);
 
   fH2->AddFrame(zPosMax, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0] ,30);
 
   lab = new TGLabel(fH2, "Z:");
 
   fH2->AddFrame(lab, f0center2d);
 
   zPos = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 375000);
 
   zPos->Resize(80,22);
 
   fH2->AddFrame(zPos, f0center2d);
 
 
 
   lab = new TGLabel(fH2, "Z (step):");
 
   fH2->AddFrame(lab, f0center2d);
 
   zPosStep = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
 
   zPosStep->Resize(80,22);
 
   fH2->AddFrame(zPosStep, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Set, Get and Home the table position
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   fH3 = new TGHorizontalFrame(fH2, subgroup[0], 30);
 
   positionSet = new TGTextButton(fH3, "Set");
 
   positionSet->SetTextJustify(36);
 
   positionSet->SetWrapLength(-1);
 
   positionSet->Resize(60,22);
 
   fH3->AddFrame(positionSet, f0);
 
   positionGet = new TGTextButton(fH3, "Get");
 
   positionGet->SetTextJustify(36);
 
   positionGet->SetWrapLength(-1);
 
   positionGet->Resize(60,22);
 
   fH3->AddFrame(positionGet, f0);
 
   positionHome = new TGTextButton(fH3, "Home");
 
   positionHome->SetTextJustify(36);
 
   positionHome->SetWrapLength(-1);
 
   positionHome->Resize(60,22);
 
   fH3->AddFrame(positionHome, f0);
 
   fH2->AddFrame(fH3, f0centerx);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Position scan controls
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "X (min):");
 
   fH2->AddFrame(lab, f0center2d);
 
   xPosMin = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000);
 
   xPosMin->Resize(80,22);
 
   fH2->AddFrame(xPosMin, f0center2d);
 
 
 
   lab = new TGLabel(fH2, "Y (min):");
 
   fH2->AddFrame(lab, f0center2d);
 
   yPosMin = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000);
 
   yPosMin->Resize(80,22);
 
   fH2->AddFrame(yPosMin, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "X (max):");
 
   fH2->AddFrame(lab, f0center2d);
 
   xPosMax = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000);
 
   xPosMax->Resize(80,22);
 
   fH2->AddFrame(xPosMax, f0center2d);
 
 
 
   lab = new TGLabel(fH2, "Y (max):");
 
   fH2->AddFrame(lab, f0center2d);
 
   yPosMax = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, -100, 215000);
 
   yPosMax->Resize(80,22);
 
   fH2->AddFrame(yPosMax, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "X (step):");
 
   fH2->AddFrame(lab, f0center2d);
 
   xPosStep = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
 
   xPosStep->Resize(80,22);
 
   fH2->AddFrame(xPosStep, f0center2d);
 
 
 
   lab = new TGLabel(fH2, "Y (step):");
 
   fH2->AddFrame(lab, f0center2d);
 
   yPosStep = new TGNumberEntry(fH2, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
 
   yPosStep->Resize(80,22);
 
   fH2->AddFrame(yPosStep, f0center2d);
 
   fG1->AddFrame(fH2, f2);
 
   
 
   fV1->AddFrame(fG1, f1);
 
   // Right pane (Table position controls)
 
   fH1->AddFrame(fV1, f0);
 
   fT1->AddFrame(fH1, f1);
 
 
 
   // Waveform tab
 
   fT1 = setTab->AddTab("Waveform analysis");
 
   fH1 = new TGHorizontalFrame(fT1, subwin[0], subgroup[1], kFixedHeight);
 
   subgroup[0] = 1*subwin[0]/2-12;
 
   fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1]/3, kFixedWidth);
 
 
 
   fG1 = new TGGroupFrame(fV1, "Acquisition channel");
 
 
 
   // Selection of channels
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 100);
 
   sCH[0] = new TGCheckButton(fH2, "CH1");
 
   sCH[0]->Resize(50,22);
 
   sCH[0]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[0], f0centerx);
 
   sCH[1] = new TGCheckButton(fH2, "CH2");
 
   sCH[1]->Resize(50,22);
 
   sCH[1]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[1], f0centerx);
 
   sCH[2] = new TGCheckButton(fH2, "CH3");
 
   sCH[2]->Resize(50,22);
 
   sCH[2]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[2], f0centerx);
 
   sCH[3] = new TGCheckButton(fH2, "CH4");
 
   sCH[3]->Resize(50,22);
 
   sCH[3]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[3], f0centerx);
 
   fG1->AddFrame(fH2, f0centerx);
 
 
 
   // Selection of MATH channels
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 100);
 
   sCH[4] = new TGCheckButton(fH2, "MATH1");
 
   sCH[4]->Resize(50,22);
 
   sCH[4]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[4], f0centerx);
 
   sCH[5] = new TGCheckButton(fH2, "MATH2");
 
   sCH[5]->Resize(50,22);
 
   sCH[5]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[5], f0centerx);
 
   sCH[6] = new TGCheckButton(fH2, "MATH3");
 
   sCH[6]->Resize(50,22);
 
   sCH[6]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[6], f0centerx);
 
   sCH[7] = new TGCheckButton(fH2, "MATH4");
 
   sCH[7]->Resize(50,22);
 
   sCH[7]->SetState(kButtonUp);
 
   fH2->AddFrame(sCH[7], f0centerx);
 
   fG1->AddFrame(fH2, f0centerx);
 
 
 
   fV1->AddFrame(fG1, f2);
 
 
 
   // Selection of measurement type
 
   fH2 = new TGHorizontalFrame(fV1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Scope use type:");
 
   fH2->AddFrame(lab, f0center2d);
 
   sMeasType = new TGComboBox(fH2, 200);
 
   sMeasType->AddEntry("No waveform analysis", 0);
 
   sMeasType->AddEntry("Waveform acquisition", 1);
 
   sMeasType->AddEntry("Measurement", 2);
 
   sMeasType->Resize(150,22);
 
   sMeasType->Select(0);
 
   fH2->AddFrame(sMeasType, f0center2d);
 
   fV1->AddFrame(fH2, f2);
 
 
 
   // Link waveform analysis to CAMAC acquisition
 
   sCamaclink = new TGCheckButton(fV1, "Link waveform to CAMAC acquisition");
 
   sCamaclink->Resize(200,22);
 
   sCamaclink->SetState(kButtonUp);
 
   fV1->AddFrame(sCamaclink, f0centerx);
 
 
 
   // Custom command interface for the scope
 
   lab = new TGLabel(fV1, "Custom scope command:");
 
   fV1->AddFrame(lab, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,10,2) );
 
   fH2 = new TGHorizontalFrame(fV1, subgroup[0], 30);
 
   scopeCommand = new TGTextEntry(fH2, "");
 
   scopeCommand->Resize(subgroup[0]-45,22);
 
   fH2->AddFrame(scopeCommand, f2);
 
   sendScopeCustom = new TGTextButton(fH2, "Send");
 
   sendScopeCustom->SetTextJustify(36);
 
   sendScopeCustom->SetWrapLength(-1);
 
   sendScopeCustom->Resize(80,22);
 
   fH2->AddFrame(sendScopeCustom, f0centery);
 
   fV1->AddFrame(fH2, f0);
 
 
 
   // Return value for custom scope command
 
   lab = new TGLabel(fV1, "Return:");
 
   fV1->AddFrame(lab, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,10,2) );
 
   scopeReturn = new TGTextEntry(fV1, "");
 
   scopeReturn->Resize(subgroup[0],22);
 
   fV1->AddFrame(scopeReturn, f2);
 
 
 
   fH1->AddFrame(fV1, f0);
 
 
 
   // Wave measurement type
 
   fV1 = new TGVerticalFrame(fH1, subgroup[0], subgroup[1]/3, kFixedWidth);
 
   fH2 = new TGHorizontalFrame(fV1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Meas. type:");
 
   fH2->AddFrame(lab, f0center2d);
 
   sMeasgroup = new TGComboBox(fH2, 200);
 
   for(int i = 0; i < 11; i++)
 
      sMeasgroup->AddEntry(allMeasNames[i], i);
 
   sMeasgroup->Resize(150,22);
 
   sMeasgroup->Select(4);
 
   fH2->AddFrame(sMeasgroup, f0center2d);
 
   fV1->AddFrame(fH2, f2);
 
 
 
   // Initialize current acquisition settings
 
   scopeInit = new TGTextButton(fV1, "Initialize scope");
 
   scopeInit->SetTextJustify(36);
 
   scopeInit->SetWrapLength(-1);
 
   scopeInit->Resize(80,22);
 
   fV1->AddFrame(scopeInit, f0centerx);
 
 
 
   fH1->AddFrame(fV1, f0);
 
   fT1->AddFrame(fH1, f1);
 
 
 
   mdiFrame->AddFrame(setTab, f0);
 
 
 
   // Bottom pane (File controls)
 
   subgroup[0] = subwin[0]-20;
 
   subgroup[1] = subwin[1]/3-30; //2*(3*((winWidth/6)-5))/5+10;
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], subgroup[1] /*1*(3*((winWidth/6)-5))/5+15*/ , kFixedWidth | kFixedHeight);
 
   fG1 = new TGGroupFrame(fH1, "Event/Data file controls");
 
 
 
   // Number of events
 
   fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Number of events:");
 
   fH2->AddFrame(lab, f0centery);
 
   evtNum = new TGNumberEntry(fH2, 10000, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
 
   evtNum->Resize(80,22);
 
   fH2->AddFrame(evtNum, f0centery);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Time stamp display
 
   fH2 = new TGHorizontalFrame(fG1,600,200);
 
   lab = new TGLabel(fH2, "Time stamp:");
 
   fH2->AddFrame(lab, f0centery);
 
   timeStamp = new TGTextEntry(fH2, "");
 
   timeStamp->Resize(440,22);
 
   timeStamp->SetState(kFALSE); // time stamp is read-only
 
   fH2->AddFrame(timeStamp, f0centery);
 
   fG1->AddFrame(fH2, f2);
 
 
 
   // Save to file
 
   fH2 = new TGHorizontalFrame(fG1,600,200);
 
   lab = new TGLabel(fH2, "Save to file:");
 
   fH2->AddFrame(lab, f0centery);
 
   char *cTemp;
 
   cTemp = new char[256];
 
   sprintf(cTemp
, "./results/test%s", histExt
);  
   fileName = new TGTextEntry(fH2, cTemp);
 
   delete[] cTemp;
 
   fileName->Resize(400,22);
 
   fileName->SetState(kFALSE);
 
   fH2->AddFrame(fileName, f0centery);
 
   saveFile = new TGTextButton(fH2, "...");
 
   saveFile->SetTextJustify(36);
 
   saveFile->SetWrapLength(-1);
 
   saveFile->Resize(80,22);
 
   fH2->AddFrame(saveFile, f0centery);
 
//   mdiFrame->AddFrame(fH2, f0);
 
   fG1->AddFrame(fH2, f2);
 
   fH1->AddFrame(fG1, f1);
 
   // Bottom pane (File controls)
 
   mdiFrame->AddFrame(fH1, f0);
 
 
 
   subgroup[0] = subwin[0]-70;
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   fH2 = new TGHorizontalFrame(fH1, 3*subgroup[0]/4, 30, kFixedWidth);
 
   measStart = new TGTextButton(fH2, "Start acquisition");
 
   measStart->SetTextJustify(36);
 
   measStart->SetWrapLength(-1);
 
   measStart->Resize(80,22);
 
   fH2->AddFrame(measStart, f0center2d);
 
 
 
   ULong_t fcolor;
 
   gClient->GetColorByName("red", fcolor);
 
 
 
   busyLabel = new TGLabel(fH2, "Busy"); //, fTextGC->GetGC(), labelfont, kChildFrame);
 
   busyLabel->SetTextJustify(36);
 
   busyLabel->Resize(80,22);
 
   busyLabel->Disable();
 
   busyLabel->SetTextColor(fcolor);
 
   fH2->AddFrame(busyLabel, f0center2d);
 
 
 
   curProgress = new TGHProgressBar(fH2, TGProgressBar::kStandard, 150);
 
   curProgress->ShowPosition();
 
   curProgress->SetRange(0,100);
 
   curProgress->SetBarColor("green");
 
   fH2->AddFrame(curProgress, f0center2d);
 
   fH1->AddFrame(fH2, f0centerx);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   mdiFrame->SetMdiHints(kMdiMinimize | kMdiMaximize);
 
   mdiFrame->SetWindowName("Main measurement window");
 
   mdiFrame->MapSubwindows();
 
   mdiFrame->Layout();
 
   mdiFrame->Move((winWidth/6),0);
 
// Main window -----------------------------------------------------------------------------
 
 
 
// Histogram pane --------------------------------------------------------------------------
 
   subwin[0] = 2*((winWidth/6)-5); subwin[1] = (int)(2.5*((winHeight/5)-5))-5;
 
   histogramPane = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]);
 
   mdiFrame = histogramPane->GetMdiFrame();
 
 
 
   histCanvas = new TRootEmbeddedCanvas("histCanvas",mdiFrame,900,900);
 
   mdiFrame->AddFrame(histCanvas, f1);
 
   TCanvas *gCanvas = histCanvas->GetCanvas();
 
   gCanvas->SetGridx();
 
   gCanvas->SetGridy();
 
 
 
   mdiFrame->SetMdiHints(kMdiMinimize | kMdiMaximize);
 
   mdiFrame->SetWindowName("Histogram");
 
   mdiFrame->MapSubwindows();
 
   mdiFrame->Layout();
 
   mdiFrame->Move(4*((winWidth/6)-5)+10,0);
 
// Histogram pane --------------------------------------------------------------------------
 
 
 
// Histogram file selection pane -----------------------------------------------------------
 
   subwin[0] = 4*((winWidth/6)-5); subwin[1] = 2*((winHeight/5)-5)+15;
 
   histogramPaneFile = new TGMdiSubwindow(fMainFrame, subwin[0]+5, subwin[1]);
 
   mdiFrame = histogramPaneFile->GetMdiFrame();
 
 
 
   // Open browser for file selection 
 
   subgroup[0] = subwin[0]-10;
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "File selection:");
 
   fH1->AddFrame(lab, f0centery);
 
 
 
   selectDir = new TGTextButton(fH1, "...");
 
   selectDir->SetTextJustify(36);
 
   selectDir->SetWrapLength(-1);
 
   selectDir->Resize(80,22);
 
   fH1->AddFrame(selectDir, f0centery);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   // List view of the opened files
 
   fileList = new TGListBox(mdiFrame,1);
 
   fileList->GetVScrollbar();
 
   fileList->Resize(300, (3*subwin[1]/7)-10 );
 
   mdiFrame->AddFrame(fileList, f2);
 
 
 
   // Multiple file selection toggle, previous/next controls, clear list and edit header
 
   fH1 = new TGHorizontalFrame(mdiFrame, subgroup[0], 30);
 
   multiSelect = new TGCheckButton(fH1, "Multiple file select");
 
   multiSelect->Resize(50,22);
 
   multiSelect->SetState(kButtonUp);
 
   fH1->AddFrame(multiSelect, f0);
 
 
 
   multiSelectAll = new TGCheckButton(fH1, "Select all listed files");
 
   multiSelectAll->Resize(50,22);
 
   multiSelectAll->SetState(kButtonUp);
 
   fH1->AddFrame(multiSelectAll, f0);
 
 
 
   TGTextButton *clearList = new TGTextButton(fH1, "Clear list");
 
   clearList->SetTextJustify(36);
 
   clearList->SetWrapLength(-1);
 
   clearList->Resize(80,22);
 
   fH1->AddFrame(clearList, f0right);
 
 
 
   TGTextButton *editHeader = new TGTextButton(fH1, "Edit header");
 
   editHeader->SetTextJustify(36);
 
   editHeader->SetWrapLength(-1);
 
   editHeader->Resize(80,22);
 
   fH1->AddFrame(editHeader, f0right);
 
 
 
   nextFile = new TGTextButton(fH1, ">>");
 
   nextFile->SetTextJustify(36);
 
   nextFile->SetWrapLength(-1);
 
   nextFile->Resize(80,22);
 
   fH1->AddFrame(nextFile, f0right);
 
 
 
   prevFile = new TGTextButton(fH1, "<<");
 
   prevFile->SetTextJustify(36);
 
   prevFile->SetWrapLength(-1);
 
   prevFile->Resize(80,22);
 
   fH1->AddFrame(prevFile, f0right);
 
   mdiFrame->AddFrame(fH1, f2);
 
 
 
   // Header information of opened file
 
   fG1 = new TGGroupFrame(mdiFrame, "Opened file header information");
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Time:");
 
   fH1->AddFrame(lab, f0centery);
 
   disptime = new TGTextEntry(fH1, "");
 
   disptime->Resize(440,22);
 
   disptime->SetState(kFALSE);
 
   fH1->AddFrame(disptime, f0centery);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Bias voltage:");
 
   fH1->AddFrame(lab, f0centery);
 
   dispbias = new TGNumberEntry(fH1, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEAAnyNumber);
 
   dispbias->Resize(80,22);
 
   dispbias->SetState(kFALSE);
 
   fH1->AddFrame(dispbias, f0centery);
 
 
 
   lab = new TGLabel(fH1, "Position:");
 
   fH1->AddFrame(lab, f0centery);
 
   disppos = new TGTextEntry(fH1, "");
 
   disppos->Resize(200,22);
 
   disppos->SetState(kFALSE);
 
   fH1->AddFrame(disppos, f0centery);
 
 
 
   lab = new TGLabel(fH1, "Temperature:");
 
   fH1->AddFrame(lab, f0centery);
 
   disptemp = new TGNumberEntry(fH1, 0.0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber);
 
   disptemp->Resize(80,22);
 
   disptemp->SetState(kFALSE);
 
   fH1->AddFrame(disptemp, f0centery);
 
 
 
   lab = new TGLabel(fH1, "Angle:");
 
   fH1->AddFrame(lab, f0centery);
 
   dispangle = new TGNumberEntry(fH1, 0.0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber);
 
   dispangle->Resize(80,22);
 
   dispangle->SetState(kFALSE);
 
   fH1->AddFrame(dispangle, f0centery);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Laser settings:");
 
   fH1->AddFrame(lab, f0centery);
 
   displaser = new TGTextEntry(fH1, "");
 
   displaser->Resize(440,22);
 
   displaser->SetState(kFALSE);
 
   fH1->AddFrame(displaser, f0centery);
 
   fG1->AddFrame(fH1, f2);
 
   mdiFrame->AddFrame(fG1, f2);
 
 
 
   mdiFrame->SetMdiHints(kMdiMinimize);
 
   mdiFrame->SetWindowName("Histogram file selection");
 
   mdiFrame->MapSubwindows();
 
   mdiFrame->Layout();
 
   mdiFrame->Move(0,3*((winHeight/5)-5)-5);
 
// Histogram file selection pane -----------------------------------------------------------
 
 
 
// Histogram controls pane -----------------------------------------------------------------
 
   subwin[0] = 2*((winWidth/6)-5); subwin[1] = (int)(2.5*((winHeight/5)-5))+10;
 
   histogramPaneCtr = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]);
 
   mdiFrame = histogramPaneCtr->GetMdiFrame();
 
 
 
   // Control for histogram X range
 
   subgroup[0] = subwin[0]-6;
 
   fG1 = new TGGroupFrame(mdiFrame, "Histogram display");
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "ADC range (min, max):");
 
   fH1->AddFrame(lab, f0centery);
 
   adcMinRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber);
 
   adcMinRange->Resize(80,22);
 
   fH1->AddFrame(adcMinRange, f0centery);
 
   adcMaxRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber);
 
   adcMaxRange->Resize(80,22);
 
   fH1->AddFrame(adcMaxRange, f0centery);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   // TDC window for getting data
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "TDC range (min, max):");
 
   fH1->AddFrame(lab, f0centery);
 
   tdcMinwindow = new TGNumberEntry(fH1, 0.0, 6, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEAAnyNumber);
 
   tdcMinwindow->Resize(80,22);
 
   fH1->AddFrame(tdcMinwindow, f0centery);
 
   tdcMaxwindow = new TGNumberEntry(fH1, 221.8, 6, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEAAnyNumber);
 
   tdcMaxwindow->Resize(80,22);
 
   fH1->AddFrame(tdcMaxwindow, f0centery);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   // Y axis range settings
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Y range (min, max):");
 
   fH1->AddFrame(lab, f0centery);
 
   yMinRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber);
 
   yMinRange->Resize(80,22);
 
   fH1->AddFrame(yMinRange, f0centery);
 
   yMaxRange = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber);
 
   yMaxRange->Resize(80,22);
 
   fH1->AddFrame(yMaxRange, f0centery);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   // Select the channel to display
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   lab = new TGLabel(fH1, "Display channel:");
 
   fH1->AddFrame(lab, f0centery);
 
   selectCh = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 0, (NCH->GetNumber())-1);
 
   selectCh->Resize(40,22);
 
   fH1->AddFrame(selectCh, f0centery);
 
 
 
   changeADC = new TGTextButton(fH1, "ADC");
 
   changeADC->AllowStayDown(kTRUE);
 
   changeADC->SetDown(kTRUE);
 
   fMenuHisttype->CheckEntry(M_ANALYSIS_HISTTYPE_1DADC);
 
   changeADC->SetTextJustify(36);
 
   changeADC->SetWrapLength(-1);
 
   changeADC->Resize(60,22);
 
   fH1->AddFrame(changeADC, f0centery);
 
 
 
   changeTDC = new TGTextButton(fH1, "TDC");
 
   changeTDC->AllowStayDown(kTRUE);
 
   changeTDC->SetTextJustify(36);
 
   changeTDC->SetWrapLength(-1);
 
   changeTDC->Resize(60,22);
 
   fH1->AddFrame(changeTDC, f0centery);
 
 
 
   changeADCTDC = new TGTextButton(fH1, "ADC/TDC");
 
   changeADCTDC->AllowStayDown(kTRUE);
 
   changeADCTDC->SetTextJustify(36);
 
   changeADCTDC->SetWrapLength(-1);
 
   changeADCTDC->Resize(60,22);
 
   fH1->AddFrame(changeADCTDC, f0centery);
 
   
 
   change2Dsurf = new TGTextButton(fH1, "Surf 2D");
 
   change2Dsurf->AllowStayDown(kTRUE);
 
   change2Dsurf->SetTextJustify(36);
 
   change2Dsurf->SetWrapLength(-1);
 
   change2Dsurf->Resize(60,22);
 
   fH1->AddFrame(change2Dsurf, f0);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   logscale = new TGCheckButton(fG1, "Logarithmic scale ON/OFF");
 
   logscale->Resize(50,22);
 
   logscale->SetState(kButtonUp);
 
   fG1->AddFrame(logscale, f0centerx);
 
 
 
   // Export the selected files
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 100);
 
   fH2 = new TGHorizontalFrame(fH1, subgroup[0], 100);
 
   lab = new TGLabel(fH2, "Export selected histograms:");
 
   fH2->AddFrame(lab, f0centery);
 
 
 
   exportHist = new TGTextButton(fH2, "Export");
 
   exportHist->SetTextJustify(36);
 
   exportHist->SetWrapLength(-1);
 
   exportHist->Resize(80,22);
 
   fH2->AddFrame(exportHist, f0centery);
 
   fH1->AddFrame(fH2, f0centerx);
 
   fG1->AddFrame(fH1, f2);
 
   mdiFrame->AddFrame(fG1, f2);
 
 
 
   // Fitting controls for ADC spectrum
 
   fG1 = new TGGroupFrame(mdiFrame, "Fit Settings");
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   fH2 = new TGHorizontalFrame(fH1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Peak sigma:");
 
   fH2->AddFrame(lab, f0centery);
 
   fitSigma = new TGNumberEntry(fH2, 1.2, 3, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEANonNegative);
 
   fitSigma->Resize(60,22);
 
   fH2->AddFrame(fitSigma, f0centery);
 
 
 
   lab = new TGLabel(fH2, " Signal/Noise treshold:");
 
   fH2->AddFrame(lab, f0centery);
 
   fitTresh = new TGNumberEntry(fH2, 5.0E-3, 3, 999, TGNumberFormat::kNESReal, TGNumberFormat::kNEANonNegative);
 
   fitTresh->Resize(60,22);
 
   fH2->AddFrame(fitTresh, f0centery);
 
   fH1->AddFrame(fH2, f0centerx);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   fH2 = new TGHorizontalFrame(fH1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Background interpolation:");
 
   fH2->AddFrame(lab, f0centery);
 
   fitInter = new TGNumberEntry(fH2, 7, 3, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative);
 
   fitInter->Resize(60,22);
 
   fH2->AddFrame(fitInter, f0centery);
 
   fH1->AddFrame(fH2, f0centerx);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   fH2 = new TGHorizontalFrame(fH1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Peak fit max. acceptable error:");
 
   fH2->AddFrame(lab, f0centery);
 
   accError = new TGNumberEntry(fH2, 0.15, 3, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEANonNegative);
 
   accError->Resize(60,22);
 
   fH2->AddFrame(accError, f0centery);
 
   fH1->AddFrame(fH2, f0centerx);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
   fH2 = new TGHorizontalFrame(fH1, subgroup[0], 30);
 
   lab = new TGLabel(fH2, "Peak min. limit:");
 
   fH2->AddFrame(lab, f0centery);
 
   minPeak = new TGNumberEntry(fH2, 4, 3, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 2, 20);
 
   minPeak->Resize(50,22);
 
   fH2->AddFrame(minPeak, f0centery);
 
 
 
   lab = new TGLabel(fH2, " Pedestal lower limit:");
 
   fH2->AddFrame(lab, f0centery);
 
   pedesLow = new TGNumberEntry(fH2, 0.00, 3, 999, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEANonNegative);
 
   pedesLow->Resize(60,22);
 
   fH2->AddFrame(pedesLow, f0centery);
 
   fH1->AddFrame(fH2, f0centerx);
 
   fG1->AddFrame(fH1, f2);
 
 
 
   exfitplots = new TGCheckButton(fG1, "Export fitting plots ON/OFF");
 
   exfitplots->Resize(50,22);
 
   exfitplots->SetState(kButtonUp);
 
   fG1->AddFrame(exfitplots, f0centerx);
 
   mdiFrame->AddFrame(fG1, f2);
 
 
 
   mdiFrame->SetMdiHints(kMdiMinimize);
 
   mdiFrame->SetWindowName("Histogram controls");
 
   mdiFrame->MapSubwindows();
 
   mdiFrame->Layout();
 
   mdiFrame->Move(4*((winWidth/6)-5)+10,(int)(2.5*((winHeight/5)-5)));
 
// Histogram controls pane -----------------------------------------------------------------
 
 
 
   // Action connections
 
   voltscanOn->Connect("Clicked()", "TGAppMainFrame", this, "EnableVoltScan()");
 
   surfscanOn->Connect("Clicked()", "TGAppMainFrame", this, "EnableSurfScan()");
 
   zscanOn->Connect("Clicked()", "TGAppMainFrame", this, "EnableZaxisScan()");
 
//   histogramOn->Connect("Clicked()", "TGAppMainFrame", this, "HistogramToggle()");
 
   vHardlimit->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "VoltageLimit()");
 
   (vHardlimit->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "VoltageLimit()");
 
   NCH->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ChannelLimit()");
 
   (NCH->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "ChannelLimit()");
 
   cleanOn->Connect("Clicked()", "TGAppMainFrame", this, "CleanPlotToggle()");
 
   oscConnect->Connect("Clicked()", "TGAppMainFrame", this, "ConnectToScope()");
 
   vOutSet->Connect("Clicked()", "TGAppMainFrame", this, "SetVoltOut()");
 
   vOutGet->Connect("Clicked()", "TGAppMainFrame", this, "GetVoltOut()");
 
   vOutReset->Connect("Clicked()", "TGAppMainFrame", this, "ResetVoltOut()");
 
   positionSet->Connect("Clicked()", "TGAppMainFrame", this, "SetPosition()");
 
   positionGet->Connect("Clicked()", "TGAppMainFrame", this, "GetPosition()");
 
   positionHome->Connect("Clicked()", "TGAppMainFrame", this, "HomePosition()");
 
   saveFile->Connect("Clicked()", "TGAppMainFrame", this, "SaveFile()");
 
   measStart->Connect("Clicked()", "TGAppMainFrame", this, "StartAcq()");
 
   selectDir->Connect("Clicked()", "TGAppMainFrame", this, "SelectDirectory()");
 
   multiSelect->Connect("Clicked()", "TGAppMainFrame", this, "ListMultiSelect()");
 
   multiSelectAll->Connect("Clicked()", "TGAppMainFrame", this, "ListSelectAll()");
 
   editHeader->Connect("Clicked()", "TGAppMainFrame", this, "HeaderEdit()");
 
   prevFile->Connect("Clicked()", "TGAppMainFrame", this, "FileListNavigation(=-2)");
 
   nextFile->Connect("Clicked()", "TGAppMainFrame", this, "FileListNavigation(=-3)");
 
   fileList->Connect("DoubleClicked(Int_t)", "TGAppMainFrame", this, "FileListNavigation(Int_t)");
 
   clearList->Connect("Clicked()", "TGListBox", fileList, "RemoveAll()");
 
 
 
   adcMinRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()");
 
   (adcMinRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()");
 
   adcMaxRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()");
 
   (adcMaxRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()");
 
   yMinRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()");
 
   (yMinRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()");
 
   yMaxRange->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()");
 
   (yMaxRange->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()");
 
   tdcMinwindow->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()");
 
   (tdcMinwindow->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()");
 
   tdcMaxwindow->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "SetHistRange()");
 
   (tdcMaxwindow->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "SetHistRange()");
 
   changeADC->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=0)");
 
   changeTDC->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=1)");
 
   changeADCTDC->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=2)");
 
   change2Dsurf->Connect("Clicked()", "TGAppMainFrame", this, "ChangeHisttype(=3)");
 
   selectCh->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ChangeChannel()");
 
   (selectCh->GetNumberEntry())->Connect("ReturnPressed()", "TGAppMainFrame", this, "ChangeChannel()");
 
   logscale->Connect("Clicked()", "TGAppMainFrame", this, "SetHistRange()");
 
   exportHist->Connect("Clicked()", "TGAppMainFrame", this, "HistogramExport()");
 
 
 
   scopeInit->Connect("Clicked()", "TGAppMainFrame", this, "InitializeScope()");
 
   sendScopeCustom->Connect("Clicked()", "TGAppMainFrame", this, "CustomScopeCommand()");
 
   sMeasType->Connect("Selected(Int_t)", "TGAppMainFrame", this, "SelectedMeasType(Int_t)");
 
 
 
   started = kFALSE;
 
 
 
   for(int i = 0; i < 8; i++) sCH[i]->SetEnabled(kFALSE);
 
   sMeasType->SetEnabled(kFALSE);
 
   sCamaclink->SetEnabled(kFALSE);
 
   scopeCommand->SetEnabled(kFALSE);
 
   sendScopeCustom->SetEnabled(kFALSE);
 
   sMeasgroup->SetEnabled(kFALSE);
 
   scopeInit->SetEnabled(kFALSE);
 
 
 
   EnableVoltScan();
 
   EnableSurfScan();
 
   EnableZaxisScan();
 
 
 
   // Testing canvas for scope waveforms
 
   wCanvas = new TCanvas("wCanvas", "Waveform canvas", 600, 300);
 
}
 
 
 
//---------------------------------------------------------------
 
// Opening a new subwindow 
 
 
 
void TGAppMainFrame::OpenWindow(int winid)
 
{
 
   /* WinID:
 
    * - 1 = fieldpoint temperature sensor
 
    * - 2 = file header editor
 
   */   
 
 
 
   TGMdiFrame *mdiFrame;
 
 
 
   // Generic horizontal and vertical frames
 
   TGHorizontalFrame *fH1, *fH2;
 
   TGGroupFrame *fG1;
 
   TGLabel *lab;
 
 
 
   int subwin[2];
 
   int subgroup[2];
 
 
 
   char ctemp[256];
 
 
 
// Fieldpoint pane -------------------------------------------------------------------------
 
   if(winid == 1)
 
   {
 
      time_t rtime;
 
      int yearrange[2];
 
 
 
      subwin[0] = 3*((winWidth/4)-5); subwin[1] = (int)(2*((winHeight/3)-5))+10;
 
      fieldpointPane = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]);
 
      mdiFrame = fieldpointPane->GetMdiFrame();
 
    
 
      subgroup[0] = subwin[0]-10;
 
      subgroup[1] = 7*subwin[1]/12;
 
 
 
      // Display canvas for temperature sensor
 
      displayCanvas = new TRootEmbeddedCanvas("displayCanvas",mdiFrame,subgroup[0],subgroup[1]);
 
      mdiFrame->AddFrame(displayCanvas, f0centerx);
 
      TCanvas *gCanvas = displayCanvas->GetCanvas();
 
      gCanvas->SetGridx();
 
      gCanvas->SetGridy();
 
 
 
      fG1 = new TGGroupFrame(mdiFrame, "Temperature sensor settings");
 
      // Channel selector
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      lab = new TGLabel(fH1, "Fieldpoint channel:");
 
      fH1->AddFrame(lab, f0centery);
 
      tempCh = new TGComboBox(fH1, 200);
 
      tempCh->AddEntry("0", 0);
 
      tempCh->AddEntry("1", 1);
 
      tempCh->AddEntry("2", 2);
 
      tempCh->AddEntry("3", 3);
 
      tempCh->AddEntry("4", 4);
 
      tempCh->AddEntry("5", 5);
 
      tempCh->AddEntry("6", 6);
 
      tempCh->AddEntry("7", 7);
 
      tempCh->Resize(50,22);
 
      tempCh->Select(1);
 
      fH1->AddFrame(tempCh, f0centery);
 
      fG1->AddFrame(fH1, f2);
 
 
 
      // Start and stop time ------------------------
 
 
 
      lab = new TGLabel(fG1, "Start time:");
 
      fG1->AddFrame(lab, f0);
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      // Start day
 
      lab = new TGLabel(fH1, "\tDay: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempDay[0] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 31; i++)
 
      {
 
         tempDay[0]->AddEntry(ctemp, i);
 
      }
 
      tempDay[0]->Resize(50,22);
 
      tempDay
[0]->Select
((int)(localtime(&rtime
))->tm_mday
-1); 
      fH1->AddFrame(tempDay[0], f0centery);
 
 
 
      // Start month
 
      lab = new TGLabel(fH1, " Month: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempMonth[0] = new TGComboBox(fH1, 200);
 
      tempMonth[0]->AddEntry("January", 0);
 
      tempMonth[0]->AddEntry("February", 1);
 
      tempMonth[0]->AddEntry("March", 2);
 
      tempMonth[0]->AddEntry("April", 3);
 
      tempMonth[0]->AddEntry("May", 4);
 
      tempMonth[0]->AddEntry("June", 5);
 
      tempMonth[0]->AddEntry("July", 6);
 
      tempMonth[0]->AddEntry("August", 7);
 
      tempMonth[0]->AddEntry("September", 8);
 
      tempMonth[0]->AddEntry("October", 9);
 
      tempMonth[0]->AddEntry("November", 10);
 
      tempMonth[0]->AddEntry("December", 11);
 
      tempMonth[0]->Resize(80,22);
 
      tempMonth
[0]->Select
((int)(localtime(&rtime
))->tm_mon
); 
      fH1->AddFrame(tempMonth[0], f0centery);
 
 
 
      // Start year
 
      yearrange[0] = 2010;
 
      yearrange
[1] = (int)(localtime(&rtime
))->tm_year
+1900; 
 
 
      lab = new TGLabel(fH1, " Year: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempYear[0] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < (yearrange[1]-yearrange[0])+1; i++)
 
      {
 
         sprintf(ctemp
, "%d", yearrange
[1]-i
);  
         tempYear[0]->AddEntry(ctemp, i);
 
      }
 
      tempYear[0]->Resize(60,22);
 
      tempYear[0]->Select(0);
 
      fH1->AddFrame(tempYear[0], f0centery);
 
 
 
      // Start hour
 
      lab = new TGLabel(fH1, " Hour: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempHour[0] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 24; i++)
 
      {
 
         if(i < 10)
 
         else
 
         tempHour[0]->AddEntry(ctemp, i);
 
      }
 
      tempHour[0]->Resize(50,22);
 
      tempHour[0]->Select(7);
 
      fH1->AddFrame(tempHour[0], f0centery);
 
 
 
      // Start minute
 
      lab = new TGLabel(fH1, " Minute: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempMinute[0] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 60; i++)
 
      {
 
         if(i < 10)
 
         else
 
         tempMinute[0]->AddEntry(ctemp, i);
 
      }
 
      tempMinute[0]->Resize(50,22);
 
      tempMinute[0]->Select(0);
 
      fH1->AddFrame(tempMinute[0], f0centery);
 
 
 
      // Start second
 
      lab = new TGLabel(fH1, " Second: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempSecond[0] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 60; i++)
 
      {
 
         if(i < 10)
 
         else
 
         tempSecond[0]->AddEntry(ctemp, i);
 
      }
 
      tempSecond[0]->Resize(50,22);
 
      tempSecond[0]->Select(0);
 
      fH1->AddFrame(tempSecond[0], f0centery);
 
 
 
      // Get start time from file
 
      lab = new TGLabel(fH1, " ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempFile[0] = new TGTextButton(fH1, "Get from file...");
 
      tempFile[0]->SetTextJustify(36);
 
      tempFile[0]->SetWrapLength(-1);
 
      tempFile[0]->Resize(100,22);
 
      fH1->AddFrame(tempFile[0], f0centery);
 
 
 
      fG1->AddFrame(fH1, f2);
 
 
 
      // Use the end time or not
 
      tempEndOn = new TGCheckButton(fG1, "Draw to last time point (ON/OFF)");
 
      tempEndOn->Resize(100,22);
 
      tempEndOn->SetState(kButtonUp);
 
      fG1->AddFrame(tempEndOn, f0);
 
 
 
      lab = new TGLabel(fG1, "End time:");
 
      fG1->AddFrame(lab, f0);
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      // End day
 
      lab = new TGLabel(fH1, "\tDay: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempDay[1] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 31; i++)
 
      {
 
         tempDay[1]->AddEntry(ctemp, i);
 
      }
 
      tempDay[1]->Resize(50,22);
 
      tempDay
[1]->Select
((int)(localtime(&rtime
))->tm_mday
-1); 
      fH1->AddFrame(tempDay[1], f0centery);
 
 
 
      // End month
 
      lab = new TGLabel(fH1, " Month: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempMonth[1] = new TGComboBox(fH1, 200);
 
      tempMonth[1]->AddEntry("January", 0);
 
      tempMonth[1]->AddEntry("February", 1);
 
      tempMonth[1]->AddEntry("March", 2);
 
      tempMonth[1]->AddEntry("April", 3);
 
      tempMonth[1]->AddEntry("May", 4);
 
      tempMonth[1]->AddEntry("June", 5);
 
      tempMonth[1]->AddEntry("July", 6);
 
      tempMonth[1]->AddEntry("August", 7);
 
      tempMonth[1]->AddEntry("September", 8);
 
      tempMonth[1]->AddEntry("October", 9);
 
      tempMonth[1]->AddEntry("November", 10);
 
      tempMonth[1]->AddEntry("December", 11);
 
      tempMonth[1]->Resize(80,22);
 
      tempMonth
[1]->Select
((int)(localtime(&rtime
))->tm_mon
); 
      fH1->AddFrame(tempMonth[1], f0centery);
 
 
 
      // End year
 
      yearrange[0] = 2010;
 
      yearrange
[1] = (int)(localtime(&rtime
))->tm_year
+1900; 
 
 
      lab = new TGLabel(fH1, " Year: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempYear[1] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < (yearrange[1]-yearrange[0])+1; i++)
 
      {
 
         sprintf(ctemp
, "%d", yearrange
[1]-i
);  
         tempYear[1]->AddEntry(ctemp, i);
 
      }
 
      tempYear[1]->Resize(60,22);
 
      tempYear[1]->Select(0);
 
      fH1->AddFrame(tempYear[1], f0centery);
 
 
 
      // End hour
 
      lab = new TGLabel(fH1, " Hour: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempHour[1] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 24; i++)
 
      {
 
         if(i < 10)
 
         else
 
         tempHour[1]->AddEntry(ctemp, i);
 
      }
 
      tempHour[1]->Resize(50,22);
 
      tempHour[1]->Select(18);
 
      fH1->AddFrame(tempHour[1], f0centery);
 
 
 
      // End minute
 
      lab = new TGLabel(fH1, " Minute: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempMinute[1] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 60; i++)
 
      {
 
         if(i < 10)
 
         else
 
         tempMinute[1]->AddEntry(ctemp, i);
 
      }
 
      tempMinute[1]->Resize(50,22);
 
      tempMinute[1]->Select(0);
 
      fH1->AddFrame(tempMinute[1], f0centery);
 
 
 
      // End second
 
      lab = new TGLabel(fH1, " Second: ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempSecond[1] = new TGComboBox(fH1, 200);
 
      for(int i = 0; i < 60; i++)
 
      {
 
         if(i < 10)
 
         else
 
         tempSecond[1]->AddEntry(ctemp, i);
 
      }
 
      tempSecond[1]->Resize(50,22);
 
      tempSecond[1]->Select(0);
 
      fH1->AddFrame(tempSecond[1], f0centery);
 
 
 
      // Get start time from file
 
      lab = new TGLabel(fH1, " ");
 
      fH1->AddFrame(lab, f0centery);
 
      tempFile[1] = new TGTextButton(fH1, "Get from file...");
 
      tempFile[1]->SetTextJustify(36);
 
      tempFile[1]->SetWrapLength(-1);
 
      tempFile[1]->Resize(100,22);
 
      fH1->AddFrame(tempFile[1], f0centery);
 
 
 
      fG1->AddFrame(fH1, f2);
 
      // Start and stop time ------------------------
 
      
 
      // Control buttons
 
      fH2 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      fH1 = new TGHorizontalFrame(fH2, subgroup[0], 30);
 
      updateTemp = new TGTextButton(fH1, "Update");
 
      updateTemp->SetTextJustify(36);
 
      updateTemp->SetWrapLength(-1);
 
      updateTemp->Resize(80,22);
 
      fH1->AddFrame(updateTemp, f0);
 
 
 
      exportTemp = new TGTextButton(fH1, "Export");
 
      exportTemp->SetTextJustify(36);
 
      exportTemp->SetWrapLength(-1);
 
      exportTemp->Resize(80,22);
 
      fH1->AddFrame(exportTemp, f0);
 
 
 
/*      closeTemp = new TGTextButton(fH1, "Close");
 
      closeTemp->SetTextJustify(36);
 
      closeTemp->SetWrapLength(-1);
 
      closeTemp->Resize(80,22);
 
      fH1->AddFrame(closeTemp, f0);*/
 
      fH2->AddFrame(fH1, f0centerx);
 
 
 
      fG1->AddFrame(fH2, f2);
 
      
 
      mdiFrame->AddFrame(fG1, f1);
 
    
 
      mdiFrame->SetMdiHints(kMdiMinimize | kMdiMaximize | kMdiClose);
 
      mdiFrame->SetWindowName("Fieldpoint FP RTD 122 temperature sensor");
 
      mdiFrame->MapSubwindows();
 
      mdiFrame->Layout();
 
      mdiFrame->Move(1*((winWidth/12)-5)+10,(int)(1*((winHeight/12)-5)));
 
 
 
      // Action connections
 
      updateTemp->Connect("Clicked()", "TGAppMainFrame", this, "UpdateTempPlot()");
 
      tempEndOn->Connect("Clicked()", "TGAppMainFrame", this, "TempEndToggle()");
 
      exportTemp->Connect("Clicked()", "TGAppMainFrame", this, "ExportTempPlot()");
 
      tempFile[0]->Connect("Clicked()", "TGAppMainFrame", this, "GetTempFile(=0)");
 
      tempFile[1]->Connect("Clicked()", "TGAppMainFrame", this, "GetTempFile(=1)");
 
//      closeTemp->Connect("Clicked()", "TGAppMainFrame", this, "UpdateTempPlot()");
 
   }
 
// Fieldpoint pane -------------------------------------------------------------------------
 
//
 
// Header editor pane ----------------------------------------------------------------------
 
   else if(winid == 2)
 
   {
 
      subwin[0] = 12*((winWidth/16)-5); subwin[1] = (int)(1*((winHeight/3)-10));
 
      headerPane = new TGMdiSubwindow(fMainFrame, subwin[0], subwin[1]);
 
      mdiFrame = headerPane->GetMdiFrame();
 
    
 
      subgroup[0] = subwin[0]-10;
 
      subgroup[1] = 7*subwin[1]/12;
 
 
 
      // Changing header info (no timestamp change possible)
 
      fG1 = new TGGroupFrame(mdiFrame, "Header edit information");
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      biasedittick = new TGCheckButton(fH1, "Bias voltage edit: ");
 
      biasedittick->Resize(80,22);
 
      biasedittick->SetState(kButtonUp);
 
      fH1->AddFrame(biasedittick, f0centerx);
 
      biasedit = new TGNumberEntry(fH1, 0.00, 4, 999, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEANonNegative);
 
      biasedit->Resize(80,22);
 
      biasedit->SetState(kFALSE);
 
      fH1->AddFrame(biasedit, f0centery);
 
      fG1->AddFrame(fH1, f0);
 
 
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      posedittick = new TGCheckButton(fH1, "Table position edit (X, Y, Z): ");
 
      posedittick->Resize(80,22);
 
      posedittick->SetState(kButtonUp);
 
      fH1->AddFrame(posedittick, f0centerx);
 
      for(int i = 0; i < 3; i++)
 
      {
 
         posedit[i] = new TGNumberEntry(fH1, 0, 6, 999, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAAnyNumber);
 
         posedit[i]->Resize(80,22);
 
         posedit[i]->SetState(kFALSE);
 
         fH1->AddFrame(posedit[i], f0centery);
 
      }
 
      fG1->AddFrame(fH1, f0);
 
 
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      tempedittick = new TGCheckButton(fH1, "Chamber temperature edit: ");
 
      tempedittick->Resize(80,22);
 
      tempedittick->SetState(kButtonUp);
 
      fH1->AddFrame(tempedittick, f0centerx);
 
      tempedit = new TGNumberEntry(fH1, 0.00, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber);
 
      tempedit->Resize(80,22);
 
      tempedit->SetState(kFALSE);
 
      fH1->AddFrame(tempedit, f0centery);
 
      fG1->AddFrame(fH1, f0);
 
 
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      angleedittick = new TGCheckButton(fH1, "Incidence angle edit: ");
 
      angleedittick->Resize(80,22);
 
      angleedittick->SetState(kButtonUp);
 
      fH1->AddFrame(angleedittick, f0centerx);
 
      angleedit = new TGNumberEntry(fH1, 0.00, 6, 999, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEAAnyNumber);
 
      angleedit->Resize(80,22);
 
      angleedit->SetState(kFALSE);
 
      fH1->AddFrame(angleedit, f0centery);
 
      fG1->AddFrame(fH1, f0);
 
 
 
      fH1 = new TGHorizontalFrame(fG1, subgroup[0], 30);
 
      laseredittick = new TGCheckButton(fH1, "Laser settings edit: ");
 
      laseredittick->Resize(80,22);
 
      laseredittick->SetState(kButtonUp);
 
      fH1->AddFrame(laseredittick, f0centerx);
 
      laseredit = new TGTextEntry(fH1, "");
 
      laseredit->Resize(440,22);
 
      laseredit->SetState(kFALSE);
 
      fH1->AddFrame(laseredit, f0centery);
 
      fG1->AddFrame(fH1, f0);
 
 
 
      ULong_t fcolor;
 
      gClient->GetColorByName("red", fcolor);
 
 
 
      lab = new TGLabel(fG1, "Note: Tick checkbox in front of each header information you wish to change (for security, they are unticked by default).");
 
      fG1->AddFrame(lab, f0centerx);
 
      lab = new TGLabel(fG1, "Warning: Using button \"Edit header\" will edit headers in all files currently selected in the Histogram file selection window.");
 
      lab->SetTextColor(fcolor);
 
      fG1->AddFrame(lab, f0centerx);
 
 
 
      mdiFrame->AddFrame(fG1, f2);
 
 
 
      editHead = new TGTextButton(mdiFrame, "Edit header");
 
      editHead->SetTextJustify(36);
 
      editHead->SetWrapLength(-1);
 
      editHead->Resize(80,22);
 
      mdiFrame->AddFrame(editHead, f0centerx);
 
    
 
      mdiFrame->SetMdiHints(kMdiMinimize | kMdiMaximize | kMdiClose);
 
      mdiFrame->SetWindowName("Edit datafile header");
 
      mdiFrame->MapSubwindows();
 
      mdiFrame->Layout();
 
      mdiFrame->Move(1*((winWidth/12)-5)-30,(int)(1*((winHeight/12)-5)));
 
 
 
      // Action connections
 
      biasedittick->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=1)");
 
      posedittick->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=2)");
 
      tempedittick->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=3)");
 
      angleedittick->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=4)");
 
      laseredittick->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=5)");
 
      editHead->Connect("Clicked()", "TGAppMainFrame", this, "headeredit()");
 
/*      updateTemp->Connect("Clicked()", "TGAppMainFrame", this, "UpdateTempPlot()");
 
      tempEndOn->Connect("Clicked()", "TGAppMainFrame", this, "TempEndToggle()");
 
      exportTemp->Connect("Clicked()", "TGAppMainFrame", this, "ExportTempPlot()");
 
      tempFile[0]->Connect("Clicked()", "TGAppMainFrame", this, "GetTempFile(=0)");
 
      tempFile[1]->Connect("Clicked()", "TGAppMainFrame", this, "GetTempFile(=1)");
 
*/   }
 
// Header editor pane ----------------------------------------------------------------------
 
//
 
   else
 
      printf("Window not implemented yet.\n");  
}
 
 
 
//---------------------------------------------------------------
 
// Closing the main application window and checking the about information
 
 
 
void TGAppMainFrame::CloseWindow()
 
{
 
   gApplication->Terminate(0);
 
}
 
 
 
Bool_t TGAppMainFrame::About()
 
{
 
   int ret = 0;
 
 
 
   new TGMsgBox(gClient->GetRoot(), fMain,
 
                fMain->GetWindowName(), "This is an application.",
 
                kMBIconQuestion, kMBClose, &ret);
 
 
 
   if(debug == 1)
 
      if(ret == kMBClose)
 
         printf("Closing the About window (%d).\n", ret
);  
 
 
   return kFALSE;
 
}
 
 
 
//---------------------------------------------------------------
 
// Subwindow constructor definition (& layout) and close subwindow action
 
 
 
TGMdiSubwindow::TGMdiSubwindow(TGMdiMainFrame *main, int w, int h)
 
{
 
   // Create a new subwindow
 
   fMdiFrame = new TGMdiFrame(main, w, h);
 
   fMdiFrame->Connect("CloseWindow()", "TGMdiSubwindow", this, "CloseWindow()");  // setting here to =0 -> will always ask before closing window
 
   fMdiFrame->DontCallClose();          // only let this window close if Yes is pressed when closing window
 
 
 
}
 
 
 
Bool_t TGMdiSubwindow::CloseWindow()
 
{
 
/*   int ret = 0;
 
 
 
   new TGMsgBox(gClient->GetRoot(), fMdiFrame,
 
             fMdiFrame->GetWindowName(), "Really want to close the window?",
 
             kMBIconExclamation, kMBYes | kMBNo, &ret);
 
   if (ret == kMBYes) return fMdiFrame->CloseWindow();
 
 
 
   return kFALSE;*/
 
   return fMdiFrame->CloseWindow();
 
}
 
 
 
//---------------------------------------------------------------
 
// Main function
 
 
 
void windowed_test()
 
{
 
   new TGAppMainFrame(gClient->GetRoot(), winWidth, winHeight);
 
}
 
 
 
//#ifdef STANDALONE
 
int main(int argc, char **argv)
 
{
 
   TApplication theApp("MdiTest", &argc, argv);
 
 
 
   windowed_test();
 
 
 
   theApp.Run();
 
 
 
   return 0;
 
}
 
//#endif