Subversion Repositories f9daq

Rev

Rev 167 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include "../include/sipmscan.h"
  2. #include "../include/workstation.h"
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. // Layout hints
  8. TGLayoutHints *f0centerX = new TGLayoutHints(kLHintsCenterX,2,2,2,2);
  9. TGLayoutHints *f0leftX = new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2);
  10. TGLayoutHints *f0leftXnoleft = new TGLayoutHints(kLHintsLeft | kLHintsTop,0,2,2,2);
  11. TGLayoutHints *f0leftXnopad = new TGLayoutHints(kLHintsLeft | kLHintsTop,0,0,0,0);
  12. TGLayoutHints *f0leftXpad = new TGLayoutHints(kLHintsLeft | kLHintsTop,12,12,2,2);
  13. TGLayoutHints *f0rightX = new TGLayoutHints(kLHintsRight | kLHintsTop,2,2,2,2);
  14. TGLayoutHints *f0rightXpad = new TGLayoutHints(kLHintsRight | kLHintsTop,12,12,2,2);
  15. TGLayoutHints *f0centerY = new TGLayoutHints(kLHintsCenterY,2,2,2,2);
  16. TGLayoutHints *f0center2d = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,2,2,2,2);
  17. TGLayoutHints *f1expandX = new TGLayoutHints(kLHintsExpandX,2,2,2,2);
  18. TGLayoutHints *f1expand2d = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,2,2,2,2);
  19. TGLayoutHints *f1expandXpad = new TGLayoutHints(kLHintsExpandX,12,12,2,2);
  20.  
  21. // Edit file window ---------------------------------------------------
  22.  
  23. // Open a new tab for editing datafile headers
  24. void TGAppMainFrame::HeaderEditTab(TGTab *mainTab, bool create, int *tabid)
  25. {
  26.    unsigned int nrfiles;
  27.    ULong_t rcolor, bcolor;
  28.    gClient->GetColorByName("red", rcolor);
  29.    gClient->GetColorByName("black", bcolor);
  30.  
  31.    if(create)
  32.    {
  33.       TGCompositeFrame *fH1, *fV1;
  34.       TGHorizontalFrame *fTitle;
  35.       TGGroupFrame *fG1;
  36.       TGLabel *lab;
  37.    
  38.       int startTab = mainTab->GetCurrent();
  39.       int newTab = mainTab->GetNumberOfTabs();
  40.       if(DBGSIG > 1) printf("HeaderEditTab(): Current tab = %d, Nr. of tabs = %d\n", startTab, newTab );
  41.  
  42.       double numform[6];
  43.      
  44.       int subgroup[2];
  45.       subgroup[0] = mainTab->GetWidth()-10;
  46.       subgroup[1] = mainTab->GetHeight()-10;
  47.    
  48.       TGCompositeFrame *fT1;
  49.       fT1 = fTab->AddTab("File header editor");
  50.  
  51.       // Title label
  52.       fTitle = new TGHorizontalFrame(fT1, 100, 25, kFixedHeight | kSunkenFrame);
  53.       TGTitleLabel(fT1, fTitle, "File header editor", (Pixel_t)FORECOLOR, (Pixel_t)BACKCOLOR, FONT);
  54.       fT1->AddFrame(fTitle, new TGLayoutHints(kLHintsExpandX | kLHintsTop));
  55.    
  56.       // List view of files that we will edit
  57.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TGListBox *editList -> List box for editing files\n");
  58.       editList = new TGListBox(fT1,1);
  59.       editList->GetVScrollbar();
  60.       editList->Resize(300, (3*subgroup[1]/7)-10 );
  61.       fT1->AddFrame(editList, f1expandXpad);
  62.  
  63.       editList->SetMultipleSelections((multiSelect->widgetChBox[0]->IsOn()));
  64.    
  65.       // Copy the file list from the analysis tab for clearer view
  66.       nrfiles = fileList->GetNumberOfEntries();
  67.       printf("Nr. files = %d\n", nrfiles);
  68.       for(int i = 0; i < nrfiles; i++)
  69.          editList->AddEntry(fileList->GetEntry(i)->GetTitle(), i);
  70.  
  71.       fH1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kHorizontalFrame);
  72.       fV1 = new TGCompositeFrame(fH1, subgroup[0]/2, subgroup[1], kVerticalFrame);
  73.       // Time stamp display
  74.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *timeEditDisplay -> Display text Entry (time stamp)\n");
  75.       timeEditDisplay = new TSubStructure();
  76.       if(timeEditDisplay->TGLabelTEntry(fV1, subgroup[0]/2-4, 30, "Time of measurement:", "", "oneline"))
  77.          fV1->AddFrame(timeEditDisplay->outsidebox, f0leftXpad);
  78.       timeEditDisplay->widgetTE->SetState(kFALSE);
  79.  
  80.       // Bias voltage edit
  81.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *biasEdit -> Number entry for bias voltage edit\n");
  82.       biasEdit = new TSubStructure();
  83.       for(int i = 0; i < 6; i++) numform[i] = 0;
  84.       numform[0] = 7; numform[1] = 2;
  85.       if(biasEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Bias voltage edit:", 0, 0.00, numform, "left"))
  86.          fV1->AddFrame(biasEdit->outsidebox, f0leftXpad);
  87.  
  88.       // Position edits
  89.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *xPosEdit, *yPosEdit, *zPosEdit -> Number entries for position edit\n");
  90.       xPosEdit = new TSubStructure();
  91.       for(int i = 0; i < 6; i++) numform[i] = 0;
  92.       numform[0] = 9; numform[3] = 2; numform[4] = -100; numform[5] = 215000;
  93.       if(xPosEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "X position edit:", 0, 0, numform, "left"))
  94.          fV1->AddFrame(xPosEdit->outsidebox, f0leftXpad);
  95.  
  96.       yPosEdit = new TSubStructure();
  97.       if(yPosEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Y position edit:", 0, 0, numform, "left"))
  98.          fV1->AddFrame(yPosEdit->outsidebox, f0leftXpad);
  99.  
  100.       zPosEdit = new TSubStructure();
  101.       numform[5] = 375000;
  102.       if(zPosEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Z position edit:", 0, 0, numform, "left"))
  103.          fV1->AddFrame(zPosEdit->outsidebox, f0leftXpad);
  104.  
  105.       // Temperature edit
  106.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *tempEdit -> Number entry for temperature edit\n");
  107.       tempEdit = new TSubStructure();
  108.       for(int i = 0; i < 6; i++) numform[i] = 0;
  109.       numform[0] = 6; numform[1] = 1;
  110.       if(tempEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Temperature edit:", 0, 0.0, numform, "left"))
  111.          fV1->AddFrame(tempEdit->outsidebox, f0leftXpad);
  112.  
  113.       // Angle edit
  114.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *angleEdit -> Number entry for angle edit\n");
  115.       angleEdit = new TSubStructure();
  116.       for(int i = 0; i < 6; i++) numform[i] = 0;
  117.       numform[0] = 7; numform[1] = 2;
  118.       if(angleEdit->TGCheckNEntry(fV1, subgroup[0]/2, 30, "Incidence angle edit:", 0, 0.00, numform, "left"))
  119.          fV1->AddFrame(angleEdit->outsidebox, f0leftXpad);
  120.  
  121.       // Laser settings edit
  122.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *laserEdit -> Display text Entry for laser edit\n");
  123.       laserEdit = new TSubStructure();
  124.       if(laserEdit->TGCheckTEntry(fV1, subgroup[0]/2, 30, "Laser settings edit:", 0, "", "oneline"))
  125.          fV1->AddFrame(laserEdit->outsidebox, f0leftXpad);
  126.  
  127.       // Edit and close buttons
  128.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *editHead -> 2 buttons for either editing the head or closing the tab\n");
  129.       editHead = new TSubStructure();
  130.       const char *selnames[512] = {"Edit header","Close"};
  131.       if(editHead->TGMultiButton(fV1, subgroup[0]/2, 30, 2, selnames, "center"))
  132.          fV1->AddFrame(editHead->outsidebox, f0leftXpad);
  133.       fH1->AddFrame(fV1, f0leftXnopad);
  134.  
  135.       fV1 = new TGCompositeFrame(fH1, subgroup[0]/2, subgroup[1], kVerticalFrame);
  136.       // Multiple file select
  137.       if(DBGSIG > 1) printf("HeaderEditTab(): Creating TSubStructure *editMulti -> 1 Check button to set multi select or not\n");
  138.       editMulti = new TSubStructure();
  139.       int *checksel;
  140.       checksel = new int;
  141.       *checksel = multiSelect->widgetChBox[0]->IsDown();
  142.       selnames[0] = "Select multiple files";
  143.       if(editMulti->TGCheckList(fV1, subgroup[0]/2, 30, 1, selnames, checksel, "vertical", "center"))
  144.          fV1->AddFrame(editMulti->outsidebox, f0centerX);
  145.  
  146.       // Warning information
  147.       fG1 = new TGGroupFrame(fV1, "Warnings");
  148.       lab = new TGLabel(fG1, "Note: Tick checkbox in front of each header information you wish to change\n(to avoid any unwanted changes, they are unticked by default).");
  149.       fG1->AddFrame(lab, f0leftXpad);
  150.       lab = new TGLabel(fG1, "Note: When selecting files in the list, the entry fields will update accordingly\nwith information from the selected file (only for those where check\nboxes are not turned on).");
  151.       fG1->AddFrame(lab, f0leftXpad);
  152.       lab = new TGLabel(fG1, "Warning: Using button \"Edit header\" will edit headers in all files currently\nselected in the above selection list.");
  153.       lab->SetTextColor(rcolor);
  154.       fG1->AddFrame(lab, f0leftXpad);
  155.       if((editMulti->widgetChBox[0]->IsOn()))
  156.       {
  157.          selectWarn = new TGLabel(fG1, "Warning: Multiple files selected!");
  158.          selectWarn->SetTextColor(rcolor);
  159.          fG1->AddFrame(selectWarn, f0leftXpad);
  160.       }
  161.       else
  162.       {
  163.          selectWarn = new TGLabel(fG1, "Note: Single file selected.      ");
  164.          selectWarn->SetTextColor(bcolor);
  165.          fG1->AddFrame(selectWarn, f0leftXpad);
  166.       }
  167.       fV1->AddFrame(fG1, f0centerX);
  168.       fH1->AddFrame(fV1, f0centerX);
  169.  
  170.       // Actions for header editor
  171.       editList->Connect("Selected(Int_t)", "TGAppMainFrame", this, "ShowHeaderEdit(Int_t)");
  172.       biasEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=1)");
  173.       xPosEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=2)");
  174.       yPosEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=3)");
  175.       zPosEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=4)");
  176.       tempEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=5)");
  177.       angleEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=6)");
  178.       laserEdit->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "EditTickToggle(=7)");
  179.       editMulti->widgetChBox[0]->Connect("Clicked()", "TGAppMainFrame", this, "SetWarnings()");
  180.       editHead->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "StartHeaderEdit()");
  181.       char cTemp[512];
  182.       sprintf(cTemp, "CloseEditTab(=%d)", newTab*100+startTab);
  183.       editHead->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, cTemp);
  184.  
  185.       fT1->AddFrame(fH1, f1expand2d);
  186.       fMain->MapSubwindows();
  187.       fMain->MapWindow();
  188.       fMain->Layout();
  189.  
  190.       // Initialize the values
  191.       for(int i = 0; i < 8; i++)
  192.          EditTickToggle(i);
  193.  
  194.       // Switch to new tab
  195.       fTab->SetTab(newTab);
  196.  
  197.       if(DBGSIG > 1)
  198.       {
  199.          printf("HeaderEditTab(): New tab objects (Edit Header)\n");
  200.          gObjectTable->Print();
  201.       }
  202.    }
  203.    else
  204.    {
  205.       if(multiSelect->widgetChBox[0]->IsDown())
  206.          editMulti->widgetChBox[0]->SetState(kButtonDown);
  207.       else
  208.          editMulti->widgetChBox[0]->SetState(kButtonUp);
  209.  
  210.       editList->SetMultipleSelections((editMulti->widgetChBox[0]->IsDown()));
  211.  
  212.       // Recopy the file list from the analysis tab
  213.       nrfiles = fileList->GetNumberOfEntries();
  214.       printf("Nr. files = %d\n", nrfiles);
  215.       for(int i = 0; i < nrfiles; i++)
  216.          editList->AddEntry(fileList->GetEntry(i)->GetTitle(), i);
  217.  
  218.       SetWarnings();
  219.  
  220.       // Switch to new tab
  221.       fTab->SetTab(*tabid);
  222.    }
  223. }
  224.  
  225. // Change the warning when selecting multiple files
  226. void TGAppMainFrame::SetWarnings()
  227. {
  228.    ULong_t rcolor, bcolor;
  229.    gClient->GetColorByName("red", rcolor);
  230.    gClient->GetColorByName("black", bcolor);
  231.  
  232.    editList->SetMultipleSelections((editMulti->widgetChBox[0]->IsDown()));
  233.  
  234.    // Set the warnings
  235.    if(editMulti->widgetChBox[0]->IsDown())
  236.    {
  237.       selectWarn->SetText("Warning: Multiple files selected!");
  238.       selectWarn->SetTextColor(rcolor);
  239.       selectWarn->SetWrapLength(-1);
  240.    }
  241.    else
  242.    {
  243.       selectWarn->SetText("Note: Single file selected.      ");
  244.       selectWarn->SetTextColor(bcolor);
  245.       selectWarn->SetWrapLength(-1);
  246.    }
  247. }
  248.  
  249. // Actions for editing the header
  250. void TGAppMainFrame::EditTickToggle(int type)
  251. {
  252.    // Toggle the edit possibility for header entries
  253.  
  254.    // Bias voltage
  255.    if(type == 1)
  256.    {
  257.       if(biasEdit->widgetChBox[0]->IsDown()) biasEdit->widgetNE[0]->SetState(kTRUE);
  258.       else biasEdit->widgetNE[0]->SetState(kFALSE);
  259.    }
  260.    // X position
  261.    else if(type == 2)
  262.    {
  263.       if(xPosEdit->widgetChBox[0]->IsDown()) xPosEdit->widgetNE[0]->SetState(kTRUE);
  264.       else xPosEdit->widgetNE[0]->SetState(kFALSE);
  265.    }
  266.    // Y position
  267.    else if(type == 3)
  268.    {
  269.       if(yPosEdit->widgetChBox[0]->IsDown()) yPosEdit->widgetNE[0]->SetState(kTRUE);
  270.       else yPosEdit->widgetNE[0]->SetState(kFALSE);
  271.    }
  272.    // Z position
  273.    else if(type == 4)
  274.    {
  275.       if(zPosEdit->widgetChBox[0]->IsDown()) zPosEdit->widgetNE[0]->SetState(kTRUE);
  276.       else zPosEdit->widgetNE[0]->SetState(kFALSE);
  277.    }
  278.    // Temperature
  279.    else if(type == 5)
  280.    {
  281.       if(tempEdit->widgetChBox[0]->IsDown()) tempEdit->widgetNE[0]->SetState(kTRUE);
  282.       else tempEdit->widgetNE[0]->SetState(kFALSE);
  283.    }
  284.    // Angle
  285.    else if(type == 6)
  286.    {
  287.       if(angleEdit->widgetChBox[0]->IsDown()) angleEdit->widgetNE[0]->SetState(kTRUE);
  288.       else angleEdit->widgetNE[0]->SetState(kFALSE);
  289.    }
  290.    // Laser info
  291.    else if(type == 7)
  292.    {
  293.       if(laserEdit->widgetChBox[0]->IsDown()) laserEdit->widgetTE->SetState(kTRUE);
  294.       else laserEdit->widgetTE->SetState(kFALSE);
  295.    }
  296. }
  297.  
  298. void TGAppMainFrame::StartHeaderEdit()
  299. {
  300.    unsigned int nrfiles = editList->GetNumberOfEntries();
  301.    TList *files;
  302.    // Changelist: Bias, X, Y, Z Positions, Temperature, Angle, Laser info
  303.    bool changelist[] = { biasEdit->widgetChBox[0]->IsDown(), xPosEdit->widgetChBox[0]->IsDown(), yPosEdit->widgetChBox[0]->IsDown(), zPosEdit->widgetChBox[0]->IsDown(), tempEdit->widgetChBox[0]->IsDown(), angleEdit->widgetChBox[0]->IsDown(), laserEdit->widgetChBox[0]->IsDown() };
  304.  
  305.    if( nrfiles > 0 )
  306.    {
  307.       // check the selected file/files and return its name/their names
  308.       files = new TList();
  309.       editList->GetSelectedEntries(files);
  310.       if(files)
  311.       {
  312.          for(int i = 0; i < (int)nrfiles; i++)
  313.          {
  314.             if(files->At(i))
  315.             {
  316.                if(DBGSIG)
  317.                   printf("StartHeaderEdit(): Filename: %s\n", files->At(i)->GetTitle());
  318.  
  319.                HeaderChange( (char*)(files->At(i)->GetTitle()), changelist );
  320.             }
  321.          }
  322.       }
  323.    }
  324. }
  325.  
  326. void TGAppMainFrame::ShowHeaderEdit(int id)
  327. {
  328.    char cTemp[512];
  329.  
  330.    // Preparing input file
  331.    inroot = TFile::Open(editList->GetEntry(id)->GetTitle(), "READ");
  332.  
  333.    // Header tree
  334.    TTree *header_data;
  335.    inroot->GetObject("header_data", header_data);
  336.  
  337.    // Display branches from header in the entry fields
  338.    header_data->SetBranchAddress("timestamp", &evtheader.timestamp);
  339.    header_data->GetEntry(0);
  340.    header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt);
  341.    header_data->GetEntry(0);
  342.    header_data->SetBranchAddress("xpos", &evtheader.xpos);
  343.    header_data->GetEntry(0);
  344.    header_data->SetBranchAddress("ypos", &evtheader.ypos);
  345.    header_data->GetEntry(0);
  346.    header_data->SetBranchAddress("zpos", &evtheader.zpos);
  347.    header_data->GetEntry(0);
  348.    header_data->SetBranchAddress("temperature", &evtheader.temperature);
  349.    header_data->GetEntry(0);
  350.    if( header_data->FindBranch("angle") )
  351.    {
  352.       header_data->SetBranchAddress("angle", &evtheader.angle);
  353.       header_data->GetEntry(0);
  354.    }
  355.    header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo);
  356.    header_data->GetEntry(0);
  357.  
  358.    GetTime(evtheader.timestamp, cTemp);
  359.  
  360.    timeEditDisplay->widgetTE->SetText(cTemp);
  361.    if(!biasEdit->widgetChBox[0]->IsDown())
  362.       biasEdit->widgetNE[0]->SetNumber(evtheader.biasvolt);
  363.    if(!xPosEdit->widgetChBox[0]->IsDown())
  364.       xPosEdit->widgetNE[0]->SetNumber(evtheader.xpos);
  365.    if(!yPosEdit->widgetChBox[0]->IsDown())
  366.       yPosEdit->widgetNE[0]->SetNumber(evtheader.ypos);
  367.    if(!zPosEdit->widgetChBox[0]->IsDown())
  368.       zPosEdit->widgetNE[0]->SetNumber(evtheader.zpos);
  369.    if(!tempEdit->widgetChBox[0]->IsDown())
  370.       tempEdit->widgetNE[0]->SetNumber(evtheader.temperature);
  371.    if(!angleEdit->widgetChBox[0]->IsDown())
  372.    {
  373.       if( header_data->FindBranch("angle") )
  374.          tempEdit->widgetNE[0]->SetNumber(evtheader.angle);
  375.       else
  376.          tempEdit->widgetNE[0]->SetNumber(0.);
  377.    }
  378.    if(!laserEdit->widgetChBox[0]->IsDown())
  379.       laserEdit->widgetTE->SetText(evtheader.laserinfo);
  380.  
  381.    delete header_data;
  382.    delete inroot;
  383. }
  384.  
  385. void TGAppMainFrame::HeaderChange(char *histfile, bool *changetype)
  386. {
  387.    int scopeTemp;
  388.  
  389.    if(DBGSIG)
  390.       printf("HeaderChange(): Selected file: %s\n", histfile);
  391.  
  392.    // Preparing input file and the temporary output file
  393.    inroot = TFile::Open(histfile, "READ");
  394.  
  395.    scopeTemp = inroot->GetListOfKeys()->Contains("scope_data");
  396.  
  397.    char outname[256];
  398.    sprintf(outname, "%s/results/temp.root", rootdir);
  399.    outroot = TFile::Open(outname, "RECREATE");
  400.  
  401.    // Tree structure of input file and output file
  402.    TTree *header_data, *meas_data, *scope_data;
  403.  
  404.    printf("%d\n", inroot->GetListOfKeys()->Contains("header_data"));
  405.    printf("%d\n", inroot->GetListOfKeys()->Contains("meas_data"));
  406.    printf("%d\n", scopeTemp);
  407.  
  408.    TTree *new_meas_data, *new_scope_data;
  409.    inroot->GetObject("header_data", header_data);
  410.    inroot->GetObject("meas_data", meas_data);
  411.    new_meas_data = meas_data->CloneTree();
  412.    //TTree *new_scope_data;
  413.    if(scopeTemp)
  414.    {
  415.       inroot->GetObject("scope_data", scope_data);
  416.       new_scope_data = scope_data->CloneTree();
  417.    }
  418.    else
  419.       printf("No scope_data header found.\n");
  420.  
  421.    // Save branches from the old header to temporary variables
  422.    header_data->SetBranchAddress("nrch", &evtheader.nrch);
  423.    header_data->GetEntry(0);
  424.    header_data->SetBranchAddress("timestamp", &evtheader.timestamp);
  425.    header_data->GetEntry(0);
  426.    header_data->SetBranchAddress("biasvolt", &evtheader.biasvolt);
  427.    header_data->GetEntry(0);
  428.    header_data->SetBranchAddress("xpos", &evtheader.xpos);
  429.    header_data->GetEntry(0);
  430.    header_data->SetBranchAddress("ypos", &evtheader.ypos);
  431.    header_data->GetEntry(0);
  432.    header_data->SetBranchAddress("zpos", &evtheader.zpos);
  433.    header_data->GetEntry(0);
  434.    header_data->SetBranchAddress("temperature", &evtheader.temperature);
  435.    header_data->GetEntry(0);
  436.    if( header_data->FindBranch("angle") )
  437.    {
  438.       header_data->SetBranchAddress("angle", &evtheader.angle);
  439.       header_data->GetEntry(0);
  440.    }
  441.    header_data->SetBranchAddress("laserinfo", &evtheader.laserinfo);
  442.    header_data->GetEntry(0);
  443.  
  444.    int itemp[5] = {0,0,0,0,0};
  445.    double dtemp[3] = {0.,0.,0.};
  446.    char ctemp[256];
  447.  
  448.    itemp[0] = evtheader.nrch;
  449.    itemp[1] = evtheader.timestamp;
  450.    itemp[2] = evtheader.xpos;
  451.    itemp[3] = evtheader.ypos;
  452.    itemp[4] = evtheader.zpos;
  453.    dtemp[0] = evtheader.biasvolt;
  454.    dtemp[1] = evtheader.temperature;
  455.    if( header_data->FindBranch("angle") )
  456.       dtemp[2] = evtheader.angle;
  457.    else
  458.       dtemp[2] = 0.;
  459.    sprintf(ctemp, "%s", evtheader.laserinfo);
  460.  
  461.    delete header_data;
  462.    delete meas_data;
  463.    if(scopeTemp)
  464.       delete scope_data;
  465.    delete inroot;
  466.  
  467. //printf("HeaderChange(): 6\n");
  468.    // Prepare branches for the new header
  469.    TTree *new_header_data = new TTree("header_data", "Header information for the measurement.");
  470.    new_header_data->Branch("nrch", &evtheader.nrch, "nrch/I");
  471.    new_header_data->Branch("timestamp", &evtheader.timestamp, "timestamp/I");
  472.    new_header_data->Branch("biasvolt", &evtheader.biasvolt, "biasvolt/D");
  473.    new_header_data->Branch("xpos", &evtheader.xpos, "xpos/I");
  474.    new_header_data->Branch("ypos", &evtheader.ypos, "ypos/I");
  475.    new_header_data->Branch("zpos", &evtheader.zpos, "zpos/I");
  476.    new_header_data->Branch("temperature", &evtheader.temperature, "temperature/D");
  477.    new_header_data->Branch("angle", &evtheader.angle, "temperature/D");
  478.    new_header_data->Branch("laserinfo", &evtheader.laserinfo, "laserinfo/C");
  479.  
  480. //printf("HeaderChange(): 7\n");
  481.    // Save new values (and old ones where we don't want to edit anything)
  482.    evtheader.nrch = itemp[0];
  483.    evtheader.timestamp = itemp[1];
  484.    // Bias voltage
  485.    if(changetype[0])
  486.       evtheader.biasvolt = (double)biasEdit->widgetNE[0]->GetNumber();
  487.    else
  488.       evtheader.biasvolt = dtemp[0];
  489.    // X pos
  490.    if(changetype[1])
  491.       evtheader.xpos = (int)xPosEdit->widgetNE[0]->GetNumber();
  492.    else
  493.       evtheader.xpos = itemp[2];
  494.    // Y pos
  495.    if(changetype[2])
  496.       evtheader.ypos = (int)yPosEdit->widgetNE[0]->GetNumber();
  497.    else
  498.       evtheader.ypos = itemp[3];
  499.    // Z pos
  500.    if(changetype[3])
  501.       evtheader.zpos = (int)zPosEdit->widgetNE[0]->GetNumber();
  502.    else
  503.       evtheader.zpos = itemp[4];
  504.    // Temperature
  505.    if(changetype[4])
  506.       evtheader.temperature = (double)tempEdit->widgetNE[0]->GetNumber();
  507.    else
  508.       evtheader.temperature = dtemp[1];
  509.    // Angle
  510.    if(changetype[5])
  511.       evtheader.angle = (double)angleEdit->widgetNE[0]->GetNumber();
  512.    else
  513.       evtheader.angle = dtemp[2];
  514.    // Laser info
  515.    if(changetype[6])
  516.       sprintf(evtheader.laserinfo, "%s", laserEdit->widgetTE->GetText());
  517.    else
  518.       sprintf(evtheader.laserinfo, "%s", ctemp);
  519.  
  520. //printf("HeaderChange(): 8\n");
  521.    new_header_data->Fill();
  522.  
  523.    // Write down the temporary output file
  524.    new_header_data->Write();
  525.    new_meas_data->Write();
  526.    if(scopeTemp)
  527.       new_scope_data->Write();
  528.  
  529. //printf("HeaderChange(): 9\n");
  530.    delete new_header_data;
  531.    delete new_meas_data;
  532.    if(scopeTemp)
  533.       delete new_scope_data;
  534.    delete outroot;
  535.  
  536.    // Replace the original file with temporary output file (and delete temporary file)
  537.    sprintf(outname, "cp -f %s/results/temp.root %s", rootdir, histfile);
  538.    system(outname);
  539.    sprintf(outname, "rm -f %s/results/temp.root", rootdir);
  540.    system(outname);
  541.  
  542.    printf("Edited header in file: %s\n", histfile);
  543. }
  544.  
  545. void TGAppMainFrame::CloseEditTab(int tabval)
  546. {
  547.    int curtab = (int)TMath::Floor(tabval/100.);
  548.    int oldtab = tabval - curtab*100;
  549.  
  550.    if(DBGSIG > 1) printf("CloseEditTab(): New tab = %d, old tab = %d\n", curtab, oldtab);
  551.  
  552.    fTab->RemoveTab(curtab);
  553.  
  554.    delete editList;
  555.    delete timeEditDisplay;
  556.    delete biasEdit;
  557.    delete xPosEdit;
  558.    delete yPosEdit;
  559.    delete zPosEdit;
  560.    delete tempEdit;
  561.    delete angleEdit;
  562.    delete laserEdit;
  563.    delete editHead;
  564.    delete selectWarn;
  565.  
  566.    for(int i = 0; i < fTab->GetNumberOfTabs(); i++)
  567.       if(DBGSIG > 1) printf("CloseEditTab(): Name of tab (%d) = %s\n", i, fTab->GetTabTab(i)->GetString() );
  568.  
  569.    fTab->SetTab(oldtab);
  570. }
  571.  
  572. // Edit file window ---------------------------------------------------
  573.  
  574. // Temporary analysis window ------------------------------------------
  575.  
  576. // Open a new tab for editing datafile headers
  577. void TGAppMainFrame::TempAnalysisTab(TGTab *mainTab, bool create, int *tabid, int analtype)
  578. {
  579.    if(create)
  580.    {
  581.       TGCompositeFrame *fH1, *fV1;
  582.       TGHorizontalFrame *fTitle;
  583.       TGGroupFrame *fG1;
  584.       TGLabel *lab;
  585.    
  586.       int startTab = mainTab->GetCurrent();
  587.       int newTab = mainTab->GetNumberOfTabs();
  588.       if(DBGSIG > 1) printf("TempAnalysisTab(): Current tab = %d, Nr. of tabs = %d\n", startTab, newTab );
  589.  
  590.       double numform[6];
  591.       double numform2[6];
  592.      
  593.       int subgroup[2];
  594.       subgroup[0] = mainTab->GetWidth()-10;
  595.       subgroup[1] = mainTab->GetHeight()-10;
  596.  
  597.       TGCompositeFrame *fT1;
  598.       fT1 = fTab->AddTab("Analysis edit");
  599.  
  600.       // Title label
  601.       fTitle = new TGHorizontalFrame(fT1, 100, 25, kFixedHeight | kSunkenFrame);
  602.       TGTitleLabel(fT1, fTitle, "Analysis edit", (Pixel_t)FORECOLOR, (Pixel_t)BACKCOLOR, FONT);
  603.       fT1->AddFrame(fTitle, new TGLayoutHints(kLHintsExpandX | kLHintsTop));
  604.  
  605.       fV1 = new TGCompositeFrame(fT1, subgroup[0], subgroup[1], kVerticalFrame);
  606.       // Temporary analysis canvas
  607.       if( (analTab->GetCurrent() == 3) || ((analTab->GetCurrent() == 0) && (intSpect->widgetChBox[0]->IsDown() || intSpect->widgetChBox[1]->IsDown())) )
  608.       {
  609.          tempAnalysisCanvas = new TRootEmbeddedCanvas("tempAnalysisCanvas",fV1,subgroup[1],5*subgroup[1]/6);
  610.          fV1->AddFrame(tempAnalysisCanvas, f0centerX);
  611.       }
  612.       else
  613.       {
  614.          tempAnalysisCanvas = new TRootEmbeddedCanvas("tempAnalysisCanvas",fV1,3*subgroup[0]/4,3*subgroup[1]/4);
  615.          fV1->AddFrame(tempAnalysisCanvas, f1expandXpad);
  616.       }
  617.       tempAnalysisCanvas->GetCanvas()->SetGrid();
  618.  
  619.       // Specific options for plotting (analtype: 0 = Normal integration, 1 = Edge scans, 2 = Relative PDE, 3 = Breakdown voltage, 4 = Surface scan, 5 = Timing,...)
  620.       // Normal integration
  621.       if(analtype == 0)
  622.       {
  623.       }
  624.       // Edge scans
  625.       else if(analtype == 1)
  626.       {
  627.       }
  628.       // Relative PDE
  629.       else if(analtype == 2)
  630.       {
  631.          // Running average offset
  632.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *runningOff -> Set running average offset.\n");
  633.          runningOff = new TSubStructure();
  634.          for(int i = 0; i < 6; i++) numform[i] = 0;
  635.          numform[0] = 5; numform[2] = 2;
  636.          if(runningOff->TGLabelNEntry(fV1, subgroup[0]/2-24, 30, "Running average offset:", 0, numform, "center"))
  637.             fV1->AddFrame(runningOff->outsidebox, f1expandXpad);
  638.  
  639.          // Running average setting for plot
  640.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *runningAver -> Produce running average of a graph.\n");
  641.          runningAver = new TSubStructure();
  642.          for(int i = 0; i < 6; i++) numform[i] = 0;
  643.          numform[0] = 5; numform[2] = 2;
  644.          if(runningAver->TGLabelNEntry(fV1, subgroup[0]/2-24, 30, "Running average type (0 to disable):", 0, numform, "center"))
  645.             fV1->AddFrame(runningAver->outsidebox, f1expandXpad);
  646.  
  647.          // Putting a second y-axis to the plot for mean number of photons histogram
  648.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *secondAxis -> Create second y-axis for mean number of photons.\n");
  649.          secondAxis = new TSubStructure();
  650.          for(int i = 0; i < 6; i++) numform[i] = 0;
  651.          numform[0] = 5; numform[1] = 1; numform[2] = 2;
  652.          if(secondAxis->TGLabelNEntry(fV1, subgroup[0]/2-24, 30, "Scale second axis:", 0, numform, "center"))
  653.             fV1->AddFrame(secondAxis->outsidebox, f1expandXpad);
  654.  
  655.          runningAver->widgetNE[0]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ApplyRunningAver()");
  656.          runningOff->widgetNE[0]->Connect("ValueSet(Long_t)", "TGAppMainFrame", this, "ApplyRunningAver()");
  657.  
  658.          ToolTipSetRelativePDE();
  659.       }
  660.       // Breakdown voltage
  661.       else if(analtype == 3)
  662.       {
  663.       }
  664.       // Surface scan
  665.       else if(analtype == 4)
  666.       {
  667.          fH1 = new TGCompositeFrame(fV1, subgroup[0], subgroup[1], kHorizontalFrame);
  668.  
  669.          // Values to create a crop of the graph
  670.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *xCrop -> Set how many X parts of the surface scan to crop.\n");
  671.          xCrop = new TSubStructure();
  672.          for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  673.          if(posUnitsPlot->widgetCB->GetSelected() == 0) { numform[0] = 8; numform[2] = 2; numform2[0] = 8; numform2[2] = 2; }
  674.          else if(posUnitsPlot->widgetCB->GetSelected() == 1) { numform[0] = 8; numform[1] = 2; numform[2] = 2; numform2[0] = 8; numform2[1] = 2; numform2[2] = 2; }
  675.          if(xCrop->TGLabelDoubleNEntry(fH1, subgroup[0]/4-50, 30, "X axis crop values:", 0, numform, 0, numform2, "center"))
  676.             fH1->AddFrame(xCrop->outsidebox, f1expandXpad);
  677.  
  678.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *yCrop -> Set how many Y parts of the surface scan to crop.\n");
  679.          yCrop = new TSubStructure();
  680.          for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  681.          if(posUnitsPlot->widgetCB->GetSelected() == 0) { numform[0] = 8; numform[2] = 2; numform2[0] = 8; numform2[2] = 2; }
  682.          else if(posUnitsPlot->widgetCB->GetSelected() == 1) { numform[0] = 8; numform[1] = 2; numform[2] = 2; numform2[0] = 8; numform2[1] = 2; numform2[2] = 2; }
  683.          if(yCrop->TGLabelDoubleNEntry(fH1, subgroup[0]/4-50, 30, "Y axis crop values:", 0, numform, 0, numform2, "center"))
  684.             fH1->AddFrame(yCrop->outsidebox, f1expandXpad);
  685.  
  686.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *interpolSize -> Set the interpolation step size of the 2D graph.\n");
  687.          interpolSize = new TSubStructure();
  688.          for(int i = 0; i < 6; i++) { numform[i] = 0; numform2[i] = 0; }
  689.          if(posUnitsPlot->widgetCB->GetSelected() == 0) { numform[0] = 8; numform[2] = 2; numform2[0] = 8; numform2[2] = 2; }
  690.          else if(posUnitsPlot->widgetCB->GetSelected() == 1) { numform[0] = 8; numform[1] = 2; numform[2] = 2; numform2[0] = 8; numform2[1] = 2; numform2[2] = 2; }
  691.          if(interpolSize->TGLabelDoubleNEntry(fH1, subgroup[0]/4+20, 30, "Interpol. step size:", 500, numform, 500, numform2, "center"))
  692.             fH1->AddFrame(interpolSize->outsidebox, f1expandXpad);
  693.  
  694.          if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *updateCrop -> 2 buttons for either updating the crop or making an integral\n");
  695.          updateCrop = new TSubStructure();
  696.          const char *selnames[512] = {"Update","Integrate surface scan"};
  697.          if(updateCrop->TGMultiButton(fH1, subgroup[0]/4-50, 30, 2, selnames, "center"))
  698.             fH1->AddFrame(updateCrop->outsidebox, f1expandXpad);
  699.  
  700.          fV1->AddFrame(fH1, f1expandXpad);
  701.  
  702.          updateCrop->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "UpdateIntegrateSurface(=0)");
  703.          updateCrop->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, "UpdateIntegrateSurface(=1)");
  704.  
  705.          ToolTipSetSurfaceScan();
  706.       }
  707.  
  708.       // Export and close buttons
  709.       if(DBGSIG > 1) printf("TempAnalysisTab(): Creating TSubStructure *exportExitAnalysis -> 2 buttons for either exporting the plot or closing the tab\n");
  710.       exportExitAnalysis = new TSubStructure();
  711.       const char *selnames[512] = {"Export","Close"};
  712.       if(exportExitAnalysis->TGMultiButton(fV1, subgroup[0]/2, 30, 2, selnames, "center"))
  713.          fV1->AddFrame(exportExitAnalysis->outsidebox, f1expandXpad);
  714.  
  715.       // Actions for header editor
  716.       char cTemp[512];
  717.       exportExitAnalysis->widgetTB[0]->Connect("Clicked()", "TGAppMainFrame", this, "ExportTempAnalysisPlot()");
  718.       sprintf(cTemp, "CloseTempAnalysisTab(=%d)", newTab*100+startTab);
  719.       exportExitAnalysis->widgetTB[1]->Connect("Clicked()", "TGAppMainFrame", this, cTemp);
  720.  
  721.       fT1->AddFrame(fV1, f1expand2d);
  722.  
  723.       fMain->MapSubwindows();
  724.       fMain->MapWindow();
  725.       fMain->Layout();
  726.  
  727.       ToolTipSetTempAnalysis();
  728.  
  729.       // Set tab ID
  730.       *tabid = newTab;
  731.  
  732.       if(DBGSIG > 1)
  733.       {
  734.          printf("TempAnalysisTab(): New tab objects (Temporary Analysis Header)\n");
  735.          gObjectTable->Print();
  736.       }
  737.    }
  738.    else
  739.    {
  740.       // Switch to new tab
  741.       fTab->SetTab(*tabid);
  742.    }
  743. }
  744.  
  745. void TGAppMainFrame::CloseTempAnalysisTab(int tabval)
  746. {
  747.    int curtab = (int)TMath::Floor(tabval/100.);
  748.    int oldtab = tabval - curtab*100;
  749.  
  750.    if(DBGSIG > 1) printf("CloseTempAnalysisTab(): New tab = %d, old tab = %d\n", curtab, oldtab);
  751.  
  752.    fTab->RemoveTab(curtab);
  753.  
  754.    delete tempAnalysisCanvas;
  755.    delete exportExitAnalysis;
  756.  
  757.    for(int i = 0; i < fTab->GetNumberOfTabs(); i++)
  758.       if(DBGSIG > 1) printf("CloseTempAnalysisTab(): Name of tab (%d) = %s\n", i, fTab->GetTabTab(i)->GetString() );
  759.  
  760.    fTab->SetTab(oldtab);
  761. }
  762.  
  763. void TGAppMainFrame::ApplyRunningAver()
  764. {
  765.    TCanvas *gCanvas = tempAnalysisCanvas->GetCanvas();
  766.    TList *funcList = (TList*)gCanvas->GetListOfPrimitives();
  767.    unsigned int nrfunc = funcList->GetSize();
  768.    TGraph *baseGr;
  769.    char funcname[512];
  770.    int runav = runningAver->widgetNE[0]->GetNumber();
  771.    int offx = runningOff->widgetNE[0]->GetNumber();
  772.  
  773.    if(runav == 0)       // If running average is disabled, don't update the plot
  774.       return;
  775.  
  776.    for(int i = 0; i < nrfunc; i++)
  777.    {
  778.       sprintf(funcname, "%s", funcList->At(i)->GetName());
  779.       if(DBGSIG) printf("ApplyRunningAver(): Function is: %s\n", funcname);
  780.  
  781.       if(strcmp(funcname,"runaver") == 0)
  782.       {
  783.          gCanvas->GetPrimitive(funcname)->Delete();
  784.          gCanvas->Modified();
  785.          gCanvas->Update();
  786.       }
  787.       else if(strcmp(funcname,"pde") == 0)
  788.       {
  789.          baseGr = (TGraph*)gCanvas->GetPrimitive(funcname);
  790.          int nrpoints = baseGr->GetN();
  791.          TGraph *runaver = new TGraph((int)(nrpoints-2*offx)/runav);
  792.          runaver->SetName("runaver");
  793.          runaver->SetFillColor(1);
  794.          runaver->SetLineColor(kBlack);
  795.          runaver->SetLineWidth(2);
  796.          runaver->SetMarkerColor(kBlack);
  797.          int nr = 0, j = 0;
  798.          double averx = 0, avery = 0;
  799.          double *xval, *yval;
  800.          xval = new double[runav];
  801.          yval = new double[runav];
  802.          while(1)
  803.          {
  804.             if((nr == (int)nrpoints/runav) || (runav*nr+j+offx > nrpoints-offx)) break;
  805.             baseGr->GetPoint(runav*nr+j+offx,xval[j],yval[j]);
  806.             if(DBGSIG) printf("ApplyRunningAver(): j = %d: X = %lf, Y = %lf\n", j, xval[j], yval[j]);
  807.             averx += xval[j];
  808.             avery += yval[j];
  809.             j++;
  810.             if((j == runav) && (runav*nr+j+offx <= nrpoints-offx))
  811.             {
  812.                runaver->SetPoint(nr,averx/runav,avery/runav);
  813.                if(DBGSIG) printf("ApplyRunningAver(): \t%d: averX = %lf, averY = %lf\n", nr, averx/runav, avery/runav);
  814.                nr++;
  815.                averx = 0;
  816.                avery = 0;
  817.                j = 0;
  818.             }
  819.          }
  820.          gCanvas->cd();
  821.          runaver->Draw("l same");
  822.          gCanvas->Modified();
  823.          gCanvas->Update();
  824.          delete[] xval;
  825.          delete[] yval;
  826.       }
  827.    }
  828. }
  829.  
  830. void TGAppMainFrame::UpdateIntegrateSurface(int val)
  831. {
  832.    TCanvas *gCanvas = tempAnalysisCanvas->GetCanvas();
  833.    TList *funcList = (TList*)gCanvas->GetListOfPrimitives();
  834.    unsigned int nrfunc = funcList->GetSize();
  835.    TGraph2D *baseGr;
  836.    char funcname[512];
  837.  
  838.    double integralValue;
  839.    int pointCount;
  840.    double xStepsize, yStepsize;
  841.    int xInterpol, yInterpol;
  842.  
  843.    for(int i = 0; i < nrfunc; i++)
  844.    {
  845.       sprintf(funcname, "%s", funcList->At(i)->GetName());
  846.       if(DBGSIG) printf("UpdateIntegrateSurface(): Function is: %s\n", funcname);
  847.  
  848.       if(strcmp(funcname,"surfscan") == 0)
  849.       {
  850.          baseGr = (TGraph2D*)gCanvas->GetPrimitive(funcname);
  851.  
  852.          // Just set the initial things for the surface scan
  853.          if(val == -1)
  854.          {
  855.             xCrop->widgetNE[0]->SetNumber(baseGr->GetXaxis()->GetXmin());
  856.             xCrop->widgetNE[1]->SetNumber(baseGr->GetXaxis()->GetXmax());
  857.             yCrop->widgetNE[0]->SetNumber(baseGr->GetYaxis()->GetXmin());
  858.             yCrop->widgetNE[1]->SetNumber(baseGr->GetYaxis()->GetXmax());
  859.  
  860.             xCrop->widgetNE[0]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetXaxis()->GetXmin(), baseGr->GetXaxis()->GetXmax());
  861.             xCrop->widgetNE[1]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetXaxis()->GetXmin(), baseGr->GetXaxis()->GetXmax());
  862.             yCrop->widgetNE[0]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetYaxis()->GetXmin(), baseGr->GetYaxis()->GetXmax());
  863.             yCrop->widgetNE[1]->SetLimits(TGNumberFormat::kNELLimitMinMax, baseGr->GetYaxis()->GetXmin(), baseGr->GetYaxis()->GetXmax());
  864.          }
  865.          // Update the cropping
  866.          else if(val == 0)
  867.          {
  868.             baseGr->GetXaxis()->SetRange(xCrop->widgetNE[0]->GetNumber(), xCrop->widgetNE[1]->GetNumber());
  869.             baseGr->GetXaxis()->SetRangeUser(xCrop->widgetNE[0]->GetNumber(), xCrop->widgetNE[1]->GetNumber());
  870.             baseGr->GetYaxis()->SetRange(yCrop->widgetNE[0]->GetNumber(), yCrop->widgetNE[1]->GetNumber());
  871.             baseGr->GetYaxis()->SetRangeUser(yCrop->widgetNE[0]->GetNumber(), yCrop->widgetNE[1]->GetNumber());
  872.  
  873.             gCanvas->Modified();
  874.             gCanvas->Update();
  875.          }
  876.          // Make an integral over all histogram values in range
  877.          else if(val == 1)
  878.          {
  879.             integralValue = 0;
  880.             pointCount = 0;
  881.  
  882.             xStepsize = interpolSize->widgetNE[0]->GetNumber();
  883.             yStepsize = interpolSize->widgetNE[1]->GetNumber();
  884.             xInterpol = (int)((xCrop->widgetNE[1]->GetNumber() - xCrop->widgetNE[0]->GetNumber())/xStepsize);
  885.             yInterpol = (int)((yCrop->widgetNE[1]->GetNumber() - yCrop->widgetNE[0]->GetNumber())/yStepsize);
  886.  
  887.             for(int j = 0; j < xInterpol; j++)
  888.             {
  889.                for(int k = 0; k < yInterpol; k++)
  890.                {
  891.                   if((xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2. <= xCrop->widgetNE[1]->GetNumber()) && (yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2. <= yCrop->widgetNE[1]->GetNumber()))
  892.                   {
  893.                      if(DBGSIG) cout << "Interpolation at (" << xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2. << "," << yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2. << ") is " << baseGr->Interpolate(xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2., yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2.) << endl;
  894.                      integralValue += baseGr->Interpolate(xCrop->widgetNE[0]->GetNumber()+j*xStepsize+xStepsize/2., yCrop->widgetNE[0]->GetNumber()+k*yStepsize+yStepsize/2.);
  895.                      pointCount++;
  896.                   }
  897.                }
  898.             }
  899.  
  900.             cout << "Total integral value (" << pointCount << " points) = " << integralValue << endl << "Total normated integral value = " << (double)integralValue/pointCount << endl;
  901.  
  902.          }
  903.       }
  904.    }
  905. }
  906.  
  907. void TGAppMainFrame::ExportTempAnalysisPlot()
  908. {
  909.    TCanvas *gCanvas = tempAnalysisCanvas->GetCanvas();
  910.  
  911.    TGFileInfo file_info;
  912.    const char *filetypes[] = {"PDF","*.pdf","Encapsulated PostScript (.eps)","*.eps", "JPG/JPEG", "*.jpg", "PNG", "*.png",0,0};
  913.    char *cTemp;
  914.    file_info.fFileTypes = filetypes;
  915.    cTemp = new char[1024];
  916. //   sprintf(cTemp, "%s/results", rootdir);
  917. //   file_info.fIniDir = StrDup(cTemp);
  918.    file_info.fIniDir = StrDup(currentAnalDir);
  919.    new TGFileDialog(gClient->GetDefaultRoot(), fMain, kFDSave, &file_info);
  920.    delete[] cTemp;
  921.  
  922.    if(file_info.fFilename != NULL)
  923.       gCanvas->SaveAs(file_info.fFilename);
  924. }
  925.  
  926. // Temporary analysis window ------------------------------------------
  927.