Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#include <TROOT.h>
#include <TLatex.h>
#include <TH1F.h>
#include <TH2D.h>
#include <TH3D.h>
#include <TGraph.h>
#include <TCanvas.h>
#include <TLegend.h>
#include <TStyle.h>
#include <TSystem.h>
#include <TFile.h>
#include <TTree.h>
#include <TDirectory.h>
#include <TPaveText.h>

#include "base.h"
#include "info.h"
#include "savetoroot.h"

int info(int runNumber, int save) {

  int HAPDnumber; //Number of HAPD: 0, 1, 2 or 3!

  char text[256];
  char pdfname[256];
  char buf[256];
  char path[128];
  int vrstaPisave = 82;

  const char * serialNumber;
  std::string serialNumberTemp;
  std::string HAPDserialNumber,FEBserialNumber;

  unsigned int id, len, cas;
  int vmon[24], vset[24];
  int imon[24];
  //int status[6];
  //int min_imon[6], max_imon[6], min_vmon[6], max_vmon[6], min_status[6], max_status[6];
  int min_chipBias = 0, max_chipBias = 0;
  int sizeOfTree;
  time_t itime;
  TDatime dh(1995,01,01,00,00,00); // to je za SetTimeOffset

  char * viri[6] = {"Guard", "Chip A", "Chip B", "Chip C", "Chip D", "HV"};

  TFile * data[3];
  TCanvas * c;
  TPad * pad1, * pad2, * pad3, * pad4, * pad5;
  TPaveText  * sn, * timeStamp, * imeMeritve, * zacetekMeritve;
  TGraph * gr[10];
  TLegend * leg[2];
  TTree * tree;

  /********** GLOBALNE **********/
  gStyle->SetOptStat(0);
  //gStyle->SetOptTitle(1);
  gStyle->SetTextFont(vrstaPisave);
  gStyle->SetTitleFont(vrstaPisave);
  gStyle->SetTitleFontSize(0.08);

  gStyle->SetPalette(55);

  //gROOT->SetBatch(kTRUE); //Does not show canvases

  sprintf(path,"../modules/%04d/%04d_1_Treshold_Waveform.root",runNumber,runNumber);
  data[0] = new TFile(path);
  if (!file_exists(path)){
    printf("File '%s' does not exist.\n",path);
    return -1;
  }
  serialNumber = getSN(runNumber);
  printf("base.c return: %s\n", serialNumber);
  serialNumberTemp = serialNumber;
 
  sprintf(path,"../modules/%04d/%04d_2_2DX.root",runNumber,runNumber);
  data[1] = new TFile(path);
  if (!file_exists(path)){
    printf("File '%s' does not exist.\n",path);
    return -1;
  }
  sprintf(path,"../modules/%04d/%04d_3_2DY.root",runNumber,runNumber);
  data[2] = new TFile(path);
  if (!file_exists(path)){
    printf("File '%s' does not exist.\n",path);
    return -1;
  }

  for(HAPDnumber=0;HAPDnumber<4;HAPDnumber++){
         
          SaveToRootInit();

   //std::cout << serialNumberTemp << std::endl;
    FEBserialNumber = serialNumberTemp.substr(0,serialNumberTemp.find(","));
    serialNumberTemp.erase(0,FEBserialNumber.length()+1);
    if(!FEBserialNumber.compare("noserial")) continue;
    HAPDserialNumber = FEBserialNumber.substr(0,FEBserialNumber.find("/"));
    FEBserialNumber.erase(0,FEBserialNumber.find("/")+1);
 
    printf("%s \t %s \n",FEBserialNumber.c_str(),HAPDserialNumber.c_str());

    sprintf(buf,"%04d_%s_Monitor",runNumber,HAPDserialNumber.c_str());
    c = new TCanvas(buf,buf,0,0,1500,1200);
    /******* PRVI PAD *******/
    sprintf(buf,"%04d_%s_Monitor_pad1",runNumber,HAPDserialNumber.c_str());
    pad1 = new TPad(buf,"SN",0,0.95,1,1,0,0);
      pad1->SetFillStyle(4000);
      pad1->Draw();
      sn = new TPaveText(0.2,0,0.8,1,"ndc");
        sn->SetBorderSize(0);
        sn->SetFillColor(4000);
        sn->SetTextSize(.8);
        sn->SetTextAlign(22);
        sn->SetTextFont(vrstaPisave);

    /******* DRUGI PAD *******/
    sprintf(buf,"%04d_%s_Monitor_pad2",runNumber,HAPDserialNumber.c_str());
    pad2 = new TPad(buf,"Date",0.05,0.9,0.95,0.95,0,0);
      pad2->SetFillStyle(4000);
      pad2->Draw();
      timeStamp = new TPaveText(0.2,0,0.8,1,"ndc");
        timeStamp->SetBorderSize(0);
        timeStamp->SetFillColor(4000);
        timeStamp->SetTextSize(.4);
        timeStamp->SetTextAlign(22);
        timeStamp->SetTextFont(vrstaPisave);

    /******* TRETJI PAD *******/
    sprintf(buf,"%04d_%s_Monitor_pad3",runNumber,HAPDserialNumber.c_str());
    pad3 = new TPad(buf,"Napetosti",0,0,1,0.9,0,0);
      pad3->SetFillStyle(4000);
      pad3->Draw();
      pad3->cd();
      pad3->Divide(0,3);

    for (int k=0;k<3;k++){
      pad3->cd(k+1);

      sprintf(buf,"%04d_%s_Monitor_pad4",runNumber,HAPDserialNumber.c_str());
      pad4 = new TPad(buf,"Naslov",0.05,0.9,0.95,1,0,0);
        pad4->SetFillStyle(4000);
        pad4->Draw();
        imeMeritve = new TPaveText(0,0,1,1,"ndc");
          imeMeritve->SetBorderSize(0);
          imeMeritve->SetFillColor(kSpring+1);
          imeMeritve->SetTextSize(.6);
          imeMeritve->SetTextAlign(22);
          imeMeritve->SetTextFont(vrstaPisave);

        zacetekMeritve = new TPaveText(0.8,0,1,1,"ndc");
          zacetekMeritve->SetBorderSize(0);
          zacetekMeritve->SetFillColor(kSpring+1);
          zacetekMeritve->SetTextSize(.4);
          zacetekMeritve->SetTextAlign(22);
          zacetekMeritve->SetTextFont(vrstaPisave);

      switch (k){
        case 0: sprintf(text, "Treshold and Waveform");break;
        case 1: sprintf(text, "2D in X");break;
        case 2: sprintf(text, "2D in Y");break;
      }
     
      pad4->cd();
        imeMeritve->AddText(text);
        imeMeritve->Draw();

      pad3->cd(k+1);

      sprintf(buf,"%04d_%s_Monitor_pad5",runNumber,HAPDserialNumber.c_str());
      pad5 = new TPad(buf,"Grafi",0,0,1,.9,0,0);
        pad5->SetFillStyle(4000);
        pad5->Draw();
        pad5->cd();
        pad5->Divide(4,0);

      tree = (TTree*) data[k]->Get("Monitor");
        tree->SetBranchAddress("id",&id);
        tree->SetBranchAddress("len",&len);
        tree->SetBranchAddress("time",&cas);
        tree->SetBranchAddress("imon",&imon);
        tree->SetBranchAddress("vmon",&vmon);
        tree->SetBranchAddress("vset",&vset);
        //tree->SetBranchAddress("status",&status);

      sizeOfTree = tree->GetEntries();

      gr[0] = new TGraph(sizeOfTree);
      gr[1] = new TGraph(sizeOfTree);
      gr[2] = new TGraph(sizeOfTree);
      gr[3] = new TGraph(sizeOfTree);
      gr[4] = new TGraph(sizeOfTree);
      gr[5] = new TGraph(sizeOfTree);
      gr[6] = new TGraph(sizeOfTree);
      gr[7] = new TGraph(sizeOfTree);
      gr[8] = new TGraph(sizeOfTree);
      gr[9] = new TGraph(sizeOfTree);

      for (int i=0;i<sizeOfTree;i++){
        tree->GetEntry(i);

        cas = cas-2208988800; //(2208988800)CVI zapiše čas v sekundah od 00:00:00 1.1.1900 naprej, UNIX čas je od 00:00:00 1.1.1970
        // cas-u morš še nekaj odštet, kr kasneje ko delaš TimeOffset, le ta vodi čas od 00:00:00 1.1.1995 naprej.
        gr[0]->SetPoint(i,cas-788918400,vmon[HAPDnumber*6+0]);
        gr[1]->SetPoint(i,cas-788918400,vmon[HAPDnumber*6+1]-vset[HAPDnumber*6+1]);
        gr[2]->SetPoint(i,cas-788918400,vmon[HAPDnumber*6+2]-vset[HAPDnumber*6+2]);
        gr[3]->SetPoint(i,cas-788918400,vmon[HAPDnumber*6+3]-vset[HAPDnumber*6+3]);
        gr[4]->SetPoint(i,cas-788918400,vmon[HAPDnumber*6+4]-vset[HAPDnumber*6+4]);
        gr[5]->SetPoint(i,cas-788918400,vmon[HAPDnumber*6+5]);
        gr[6]->SetPoint(i,cas-788918400,imon[HAPDnumber*6+1]/1000.);
        gr[7]->SetPoint(i,cas-788918400,imon[HAPDnumber*6+2]/1000.);
        gr[8]->SetPoint(i,cas-788918400,imon[HAPDnumber*6+3]/1000.);
        gr[9]->SetPoint(i,cas-788918400,imon[HAPDnumber*6+4]/1000.);
        if (!i){
          itime = cas;
          zacetekMeritve->AddText(ctime(&itime));
        } else if (k==2 && i==sizeOfTree-1){
          itime = cas;
          sprintf(buf,"End of measuring: %s",ctime(&itime));
          timeStamp->AddText(buf);
        }
       
        for (int j=1;j<5;j++){
          if (!i && j==1) {
            min_chipBias = max_chipBias = vmon[HAPDnumber*6+j]-vset[HAPDnumber*6+j];
          } else {
            if (min_chipBias > vmon[HAPDnumber*6+j]-vset[HAPDnumber*6+j]) min_chipBias = vmon[HAPDnumber*6+j]-vset[HAPDnumber*6+j];
            else if (max_chipBias < vmon[HAPDnumber*6+j]-vset[HAPDnumber*6+j]) max_chipBias = vmon[HAPDnumber*6+j]-vset[HAPDnumber*6+j];
          }
        }
      }

      leg[0] = new TLegend(0.55,0.1,.9,0.35);
      leg[1] = new TLegend(0.70,0.70,.9,0.9);
      leg[0]->SetFillColor(0);
      leg[1]->SetFillColor(0);
      for (int i=0;i<10;i++){
        gr[i]->GetYaxis()->CenterTitle();
        gr[i]->GetYaxis()->SetTitleFont(vrstaPisave);
        gr[i]->GetYaxis()->SetLabelFont(vrstaPisave);
        gr[i]->GetYaxis()->SetTitleOffset(1.6);


        gr[i]->GetXaxis()->SetTitleFont(vrstaPisave);
        gr[i]->GetXaxis()->SetLabelFont(vrstaPisave);
        //gr[i]->GetXaxis()->CenterTitle();
        gr[i]->GetXaxis()->SetTimeDisplay(1);
        gr[i]->GetXaxis()->SetTimeOffset(dh.Convert());
        gr[i]->GetXaxis()->SetTimeFormat("#splitline{%H:%M}{%d-%m}");
        gr[i]->GetXaxis()->SetLabelOffset(0.02);
        gr[i]->GetXaxis()->SetTitleOffset(1.5);


        if(!i){
          pad5->cd(1);
         
          sprintf(text, "Guard bias (RMS = %.0f mV);Time;Bias [mV]", gr[i]->GetRMS(2));
          gr[i]->SetTitle(text);
          gr[i]->GetYaxis()->SetRangeUser(170000,180000);

          gr[i]->Draw("AL");
         
          sprintf(text, "Guard_%s_T_%d", HAPDserialNumber.c_str(), k);
          SaveToRootAddGraph(gr[i], text);
        } else if (i<5 && i!=0){
          pad5->cd(2);
          sprintf(text, "%s (RMS = %.0f mV)", viri[i], gr[i]->GetRMS(2));
          leg[0]->AddEntry(gr[i],text,"L");


          //gr[i]->GetYaxis()->SetRangeUser(min_chipBias-50,max_chipBias+50);
          gr[i]->GetYaxis()->SetRangeUser(-1000,1000);

          gr[i]->SetTitle("Chip (vmon - vset) difference;Time;Bias difference [mV]");
          if (i==1) gr[i]->Draw("AL");

          gr[i]->SetLineColor(i);
          gr[i]->SetLineWidth(1);

          gr[i]->Draw("LSAME");
         
          sprintf(text, "BiasDifference_%s_CHIP_%d_T_%d", HAPDserialNumber.c_str(), i-1, k);
                  SaveToRootAddGraph(gr[i], text);
        } else if (i>5){
          pad5->cd(3);
          sprintf(text, "%s", viri[i-5]);
          leg[1]->AddEntry(gr[i],text,"L");

          gr[i]->GetYaxis()->SetRangeUser(-1,11);

          gr[i]->SetTitle("Chip leakage current;Time;Leakage current [mA]");
          if (i==6) gr[i]->Draw("AL");

          gr[i]->SetLineColor(i);
          gr[i]->SetLineWidth(1);

          gr[i]->Draw("LSAME");
         
          sprintf(text, "LeakageCurrent_%s_CHIP_%d_T_%d", HAPDserialNumber.c_str(), i-6, k);
                  SaveToRootAddGraph(gr[i], text);
        } else if (i==5){
          pad5->cd(4);
          sprintf(text, "HV (RMS = %.0f mV);Time;Bias [mV]", gr[i]->GetRMS(2));
          gr[i]->GetYaxis()->SetRangeUser(6900000,7100000);

          gr[i]->SetTitle(text);

          gr[i]->Draw("AL");
         
          sprintf(text, "HV_%s_T_%d", HAPDserialNumber.c_str(), k);
                  SaveToRootAddGraph(gr[i], text);
        }
      }

      pad5->cd(2);
        leg[0]->Draw();
      pad5->cd(3);
        leg[1]->Draw();
     
      pad4->cd();
        zacetekMeritve->Draw();
    }

    pad1->cd();
      sprintf(buf,"RUN#: %04d (pos %d)   FEB#: %s   HAPD#: %s",runNumber, HAPDnumber, FEBserialNumber.c_str(),HAPDserialNumber.c_str());
      sn->AddText(buf);
      sn->Draw();
   
    pad2->cd();
      timeStamp->Draw();

    c->Modified();
    c->Update();

    if (save) {
      switch (save) {
        case 1: sprintf(pdfname,"../modules/%04d/%04d_%s_0_Info.pdf",runNumber,runNumber,HAPDserialNumber.c_str());break;
        case 2: sprintf(pdfname,"../modules/%04d/%04d_%s.pdf(",runNumber,runNumber,HAPDserialNumber.c_str());break;
       
      }
      c->SaveAs(pdfname,"pdf");
    }
    sprintf(pdfname,"../modules/%04d/%04d_%s_out.root",runNumber,runNumber,HAPDserialNumber.c_str());
    SaveToRootWrite(pdfname, HAPDserialNumber.c_str());
  }
  for(int k=0;k<3;k++) delete data[k];

  return 0;
}