#define ClusterWithTrackAna_cxx
//#include "ClusterWithTrackAna_Inputs.h"
#include "ClusterWithTrackAna.h"
#include <TH2.h>
#include <TStyle.h>
#include <TLatex.h>
#include <TCanvas.h>
#include <iostream>
#include <fstream>

#include "../../Tools/Landau.C"

void addGraphics(TH1 *h, int iCol = 1, TString XTitle="", TString YTitle="")
{
  h->SetXTitle(XTitle);
  h->SetYTitle(YTitle);
  h->SetStats(kFALSE);
  h->SetLineColor(iCol);
  h->SetMarkerColor(iCol);
  h->SetMinimum(0.0);
  h->SetMaximum(1.2*h->GetMaximum());
  h->SetTitleSize(0.1);
  
  //h->SetLineColor(kBlack);
  h->SetMarkerSize(0.7);
  h->SetMarkerStyle(20);
  h->GetXaxis()->SetTitleOffset(1.0);  
  h->GetYaxis()->SetTitleOffset(1.2);
  h->GetXaxis()->SetTitleSize(0.045);  
  h->GetYaxis()->SetTitleSize(0.045);
  h->GetXaxis()->SetLabelSize(0.04);  
  h->GetYaxis()->SetLabelSize(0.04);  
  h->SetNdivisions(505,"X");
  h->SetNdivisions(505,"Y");
  h->SetLineWidth(2);
}

void addGraphics(TH2 *h, int iCol = 1, TString XTitle="", TString YTitle="")
{
  //float bw = h->GetBinWidth(1);
  h->SetXTitle(XTitle);
  h->SetYTitle(YTitle);
  h->SetStats(kFALSE);
  h->SetLineColor(iCol);
  h->SetMarkerColor(iCol);
  h->SetMinimum(0.0);
  h->SetMaximum(1.2*h->GetMaximum());
  h->SetTitleSize(0.1);
  
  //h->SetLineColor(kBlack);
  //h->SetMarkerSize(0.7);
  //h->SetMarkerStyle(20);
  h->GetXaxis()->SetTitleOffset(1.0);  
  h->GetYaxis()->SetTitleOffset(1.2);
  h->GetXaxis()->SetTitleSize(0.045);  
  h->GetYaxis()->SetTitleSize(0.045);
  h->GetXaxis()->SetLabelSize(0.04);  
  h->GetYaxis()->SetLabelSize(0.04);  
  h->SetNdivisions(505,"X");
  h->SetNdivisions(505,"Y");
  h->SetLineWidth(2);
}


void ClusterWithTrackAna::Loop()
{
//   In a ROOT session, you can do:
//      Root > .L ClusterWithTrackAna.C
//      Root > ClusterWithTrackAna t
//      Root > t.GetEntry(12); // Fill t data members with entry number 12
//      Root > t.Show();       // Show values of entry 12
//      Root > t.Show(16);     // Read and show values of entry 16
//      Root > t.Loop();       // Loop on all entries
//

//     This is the loop skeleton where:
//    jentry is the global entry number in the chain
//    ientry is the entry number in the current Tree
//  Note that the argument to GetEntry must be:
//    jentry for TChain::GetEntry
//    ientry for TTree::GetEntry and TBranch::GetEntry
//
//       To read only selected branches, Insert statements like:
// METHOD1:
//    fChain->SetBranchStatus("*",0);  // disable all branches
//    fChain->SetBranchStatus("branchname",1);  // activate branchname
// METHOD2: replace line
//    fChain->GetEntry(jentry);       //read all branches
//by  b_branchname->GetEntry(ientry); //read only this branch
   if (fChain == 0) return;

   Int_t nentries = fChain->GetEntriesFast();

   TString m_board2 = m_board;
   m_board2 = m_board2.ReplaceAll("_All","");
   m_board2 = m_board2.ReplaceAll("_Full","");
   m_board2 = m_board2.ReplaceAll("_v7","");
   TString f_out = m_fileOutdir + plotdir + "/AnalysisOutput_" + m_board2 + "_" + runplace + "_" + consR +"_"+m_runNumb+".root";
  // TString f_out = m_fileOutdir + plotdir + "/AnalysisOutput_" + m_board2 + "_" + m_bias + "_" + m_sector + ".root";
   if(m_angle != "0"){
     f_out			= m_fileOutdir + plotdir + "/AnalysisOutput_" + m_board2 + "_" + m_bias + "_" + m_sector + "_" + m_angle + ".root";
   }
   cout << "Will write out file: " << f_out << endl;
   


   fout = new TFile(f_out,"RECREATE");

   TH1F* h0 = new TH1F("h0","#DeltaX between strip hit and track projection (strips)",101,-50.5,50.5);
   TH1F* h1 = new TH1F("h1","#DeltaX",800,-2.0,2.0);
   TH2F* h1vsx = new TH2F("h1vsx","#DeltaX vs X",50,-5,5,100,-0.2,0.2);
   TH1F* h1mpa = new TH1F("h1mpa","#DeltaX",400,-20.0,20.0);
   TH1F* h1mbpa = new TH1F("h1mbpa","#DeltaX",400,-20.0,20.0);
   TH1F* h1fpa = new TH1F("h1fpa","#DeltaX",400,-20.0,20.0);
   TH1F* h1fbpa = new TH1F("h1fbpa","#DeltaX",400,-20.0,20.0);

   TH1F* h1mpa1 = new TH1F("h1mpa1","#DeltaX",800,-20.0,20.0);
   TH1F* h1mpa2 = new TH1F("h1mpa2","#DeltaX",800,-20.0,20.0);
   TH1F* h1mpa3 = new TH1F("h1mpa3","#DeltaX",800,-20.0,20.0);
   TH1F* h1mpa4 = new TH1F("h1mpa4","#DeltaX",800,-20.0,20.0);
   TH1F* h1mpa5 = new TH1F("h1mpa5","#DeltaX",800,-20.0,20.0);

   TH1F* h1mpaL = new TH1F("h1mpaL","Strip# of Missed Hit in Lower PA region",512,0,512);
   TH1F* h1mpaU = new TH1F("h1mpaU","Strip# of Missed Hit in Upper PA region",512,0,512);


   TH1F* h1s = new TH1F("h1s","Seed strip of cluster",512,0.0,512.0);
   TH1F* h1a = new TH1F("h1a","#DeltaX, 1 strip",800,-2.0,2.0);
   TH1F* h1b = new TH1F("h1b","#DeltaX, 2 strip",800,-2.0,2.0);
   TH1F* h1z = new TH1F("h1z","#DeltaX, low Charge",800,-2.0,2.0);
   TH1F* h1w = new TH1F("h1w","#DeltaX",20000,-100.0,100.0);
   TH1F* h1wY = new TH1F("h1wY","#DeltaX",20000,-100.0,100.0);
   TH2F* h2 = new TH2F("h2","X_{DUT} vs X_{trk}",100,-8.0,8.0,100,-8,8);
   TH2F* h3 = new TH2F("h3","Y_{trk} vs X_{trk}, with cluster",640,-8,8.0,640,-8,8);
   TH2F* h3a = new TH2F("h3a","Y_{trk} vs X_{trk} in fiducial",640,-8,8.0,640,-8,8);
   TH2F* h3b = new TH2F("h3b","Y_{trk} vs X_{trk}, with missed cluster",640,-8,8.0,640,-8,8);
   TH2F* h3c = new TH2F("h3c","Y_{trk} vs X_{trk}, with found cluster",640,-8,8.0,640,-8,8);
   TH1F* h4 = new TH1F("h4","Detector strip # of cluster with track",512,0.0,512);
   TH1F* h4a = new TH1F("h4a","Electonic Strip # of cluster with track",512,0.0,512);
   TH1F* h4b = new TH1F("h4b","Strip # of cluster with track",1024,0.0,1024);
   TH1F* h4c = new TH1F("h4c","Strip # of cluster with track",1024,0.0,1024);
   TH1F* h5 = new TH1F("h5","#theta_{X}",500,-5.0,5.0);
   TH1F* h6 = new TH1F("h6","#theta_{Y}",500,-5.0,5.0);
   TH1F* h5c = new TH1F("h5c","#theta_{X}",500,-5.0,5.0);
   TH1F* h6c = new TH1F("h6c","#theta_{Y}",500,-5.0,5.0);
   TH1F* h5a = new TH1F("h5a","X position of track",400,-10.0,10.0);
   TH1F* h6a = new TH1F("h6a","Y position of track",400,-10.0,10.0);
   TH1F* h5b = new TH1F("h5b","X position of matched cluster",400,-10.0,10.0);
   TH1F* h6b = new TH1F("h6b","Y position of matched cluster",400,-10.0,10.0);

   TProfile *h8 = new TProfile("h8","#DeltaX vs #theta_{trk}",100,-5,5,-1.0,1.0);
   TProfile *h9 = new TProfile("h9","#DeltaX vs Y_{trk} at DUT",1600,-8,8,-1.0,1.0);
   TProfile *h9a = new TProfile("h9a","#DeltaX vs X_{trk} at DUT",20,-5,5,-1.0,1.0);

   TProfile *h10a = new TProfile("h10a","<ADC> vs strip",512,0,512,0.0,1000.0);
   TProfile *h10b = new TProfile("h10b","<ADC> vs strip",512,0,512,0.0,1000.0);
   TProfile *h10c = new TProfile("h10c","<ADC> vs strip",512,0,512,0.0,1000.0);
   TProfile *h10d = new TProfile("h10d","<ADC> vs Y_{trk}",100,-8,8,0.0,1000.0);
   TProfile *h10e = new TProfile("h10e","<ADC> vs X_{trk}",100,-8,8,0.0,1000.0);
   TH1F* h11n = new TH1F("h11n","Strip # of matched cluster",512,0.0,512);
   TH1F* h11d = new TH1F("h11d","Strip # of track",512,0.0,512);
   h11n->Sumw2();
   h11d->Sumw2();
   
   TH1F* h12 = new TH1F("h12","Y position of matched cluster",400,-10.0,10.0); h12->Sumw2();
   TH1F* h12c = new TH1F("h12c","X position of matched cluster",400,-10.0,10.0);h12c->Sumw2();
   TH1F* h12a = new TH1F("h12a","Y position of track",1600,-10.0,10.0); h12a->Sumw2();
   TH1F* h12b = new TH1F("h12b","Y position of track",1600,-10.0,10.0); h12b->Sumw2();

   TH1F* h12dn = new TH1F("h12dn","X position of track",200,-10.0,10.0); h12dn->Sumw2();
   TH1F* h12en = new TH1F("h12en","X position of track",200,-10.0,10.0);h12en->Sumw2();
   TH1F* h12fn = new TH1F("h12fn","X position of track",200,-10.0,10.0);h12fn->Sumw2();
   TH1F* h12gn = new TH1F("h12gn","X position of track",200,-10.0,10.0);h12gn->Sumw2();
   TH1F* h12dd = new TH1F("h12dd","X position of track",200,-10.0,10.0);h12dd->Sumw2();
   TH1F* h12ed = new TH1F("h12ed","X position of track",200,-10.0,10.0);h12ed->Sumw2();
   TH1F* h12fd = new TH1F("h12fd","X position of track",200,-10.0,10.0);h12fd->Sumw2();
   TH1F* h12gd = new TH1F("h12gd","X position of track",200,-10.0,10.0);h12gd->Sumw2();

   TH1F* h12hn = new TH1F("h12hn","X position of track",50,-0.5,0.5);h12hn->Sumw2();
   TH1F* h12in = new TH1F("h12in","X position of track",50,-0.5,0.5);h12in->Sumw2();
   TH1F* h12jn = new TH1F("h12jn","X position of track",50,-0.5,0.5);h12jn->Sumw2();
   TH1F* h12kn = new TH1F("h12kn","X position of track",50,-0.5,0.5);h12kn->Sumw2();
   TH1F* h12hd = new TH1F("h12hd","X position of track",50,-0.5,0.5);h12hd->Sumw2();
   TH1F* h12id = new TH1F("h12id","X position of track",50,-0.5,0.5);h12id->Sumw2();
   TH1F* h12jd = new TH1F("h12jd","X position of track",50,-0.5,0.5);h12jd->Sumw2();
   TH1F* h12kd = new TH1F("h12kd","X position of track",50,-0.5,0.5);h12kd->Sumw2();

   TProfile *h12m = new TProfile("h12m","<ADC> vs interstrip pos",50,-0.5,0.5,0.0,1000.0);
   TProfile *h12n = new TProfile("h12n","<ClusterSize> vs interstrip pos",50,-0.5,0.5,0.0,1000.0);

   TH1F* h12on = new TH1F("h12on","dist of track to cutout",700,-2.0,5.0);h12on->Sumw2();
   TH1F* h12od = new TH1F("h12od","dist of track to cutout",700,-2.0,5.0);h12od->Sumw2();

   TH1F *h13mpa = new TH1F("h13mpa","#Clusters/Ev",10,-0.5,9.5);
   TH1F *h13mbpa = new TH1F("h13mbpa","#Clusters/Ev",10,-0.5,9.5);
   TH1F *h13fpa = new TH1F("h13fpa","#Clusters/Ev",10,-0.5,9.5);
   TH1F *h13fbpa = new TH1F("h13fbpa","#Clusters/Ev",10,-0.5,9.5);   

   TH1F* h14a = new TH1F("h14a","Nom Strip, no matched cluster",512,0.0,512);
   TH1F* h14b = new TH1F("h14b","Nom Strip, matched cluster",512,0.0,512);

   TH1F *h15a = new TH1F("h15a","Chisq of tracks with matched DUT hit",200,0.0,200.0);
   TH1F *h15b = new TH1F("h15b","TDC time with matched DUT hit",12,0.0,12.0);
   TH1F *h15c = new TH1F("h15c","Time Between Trigger and Track",5,0.0,5.0);
   TH1F *h15d = new TH1F("h15d","TDC time of all clusters",12,0.0,12.0);
   TH1F *h15e = new TH1F("h15e","TDC time of good clusters",12,0.0,12.0);

   TH1F *h16a = new TH1F("h16a","Chisq of tracks without matched DUT hit",200,0.0,200.0);
   TH1F *h16b = new TH1F("h16b","TDC time without matched DUT hit",12,0.0,12.0);
   TH1F *h16c = new TH1F("h16c","Time Between Trigger and Track",5,0.0,5.0);
   h15c->Sumw2();
   h16c->Sumw2();
   
   TH1F* h17 = new TH1F("h17","Q_{L} / (Q_{L}+Q_{R})",50,0.0,1.0);
   TH2F* h17a = new TH2F("h17a","Q_{L} / (Q_{L}+Q_{R}) vs Interstrip Pos",20,-0.5,0.5,120,-0.1,1.1);
   TProfile* h17b = new TProfile("h17b","Q_{R} / (Q_{L}+Q_{R}) vs Interstrip Pos",20,-0.5,0.5,-0.1,1.1);

   TH1F* hcmpa = new TH1F("hcmpa","Cluster charge",100,0.0,1000.0);
   TH1F* hcmbpa = new TH1F("hcmbpa","Cluster charge",100,0.0,1000.0);
   TH1F* hcfpa = new TH1F("hcfpa","Cluster charge",100,0.0,1000.0);
   TH1F* hcfbpa = new TH1F("hcfbpa","Cluster charge",100,0.0,1000.0);

   TH1F* h18a = new TH1F("h18a","Seed/Total charge",100,0.0,2.0);

   TH2F* h18b = new TH2F("h18b","#DeltaX vs Interstrip Pos (1 strip Clu)",100,-0.5,0.5,100,-0.2,0.2);
   TH2F* h18c = new TH2F("h18c","#DeltaX vs Interstrip Pos (2 strip Clu)",100,-0.5,0.5,100,-0.2,0.2);
   TH2F* h18d = new TH2F("h18d","Seed/Total charge vs Interstrip Pos",100,-0.5,0.5,100,0.0,1.1);

   TH1F* hcTrkXY[16];
   for(int i=0; i<4; i++){
     for(int j=0; j<4; j++){
       int iblock = 4*i+j; 
       TString hname = Form("hcTrkXY_%d",iblock+1);     
       TString htitle = Form("Cluster charge, block %d",iblock+1);     
       hcTrkXY[iblock]= new TH1F(hname,htitle,100,0.0,1000.0);
     }
   }
   
   TH1F *hlandau[512];
   for(int i=0; i<nChan; i++){
     hlandau[i] = new TH1F(Form("hlandau_%d",i),"Cluster charge",100,0.0,1000.0);
   }
   








   TH1F* hcAll = new TH1F("hcAll","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrk = new TH1F("hcTrk","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkCorr = new TH1F("hcTrkCorr","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkSeed = new TH1F("hcTrkSeed","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkSeed1 = new TH1F("hcTrkSeed1","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkSeed2 = new TH1F("hcTrkSeed2","Cluster charge",100,0.0,1000.0);
   //TH1F* hcTrkY1 = new TH1F("hcTrkY1","Cluster charge",100,0.0,1000.0);
   //TH1F* hcTrkY2 = new TH1F("hcTrkY2","Cluster charge",100,0.0,1000.0);
   //TH1F* hcTrkY3 = new TH1F("hcTrkY3","Cluster charge",100,0.0,1000.0);
   //TH1F* hcTrkY4 = new TH1F("hcTrkY4","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkNoTop = new TH1F("hcTrkNoTop","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkLowX = new TH1F("hcTrkLowX","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrkHighX = new TH1F("hcTrkHighX","Cluster charge",100,0.0,1000.0);
   TH1F* hcTrka = new TH1F("hcTrka","Cluster charge, limited region",100,0.0,1000.0);
   TH1F* hcTrk1 = new TH1F("hcTrk1","Cluster charge, Size = 1",100,0.0,1000.0);
   TH1F* hcTrk2 = new TH1F("hcTrk2","Cluster charge, Size = 2",100,0.0,1000.0);
   TProfile *h2p = new TProfile("h2p","Cluster Charge vs TDC time",12,0,12,100,1000);


   TH2F* h31a = new TH2F("h31a","Y_{trk} vs X_{trk}, with cluster",64,-8,8.0,64,-8,8);
   TH2F* h31b = new TH2F("h31b","Y_{trk} vs X_{trk}, with cluster, low ADC",64,-8,8.0,64,-8,8);
   TH1F* h32a = new TH1F("h32a","Strip # of cluster with track",512,0.0,512);
   TH1F* h32b = new TH1F("h32b","Strip # of cluster with track & low ADC",512,0.0,512);
   TH1F* h33a = new TH1F("h33a","Y position of matched cluster",200,-10.0,10.0);
   TH1F* h33b = new TH1F("h33b","X position of matched cluster",200,-10.0,10.0);
   TH1F* h34 = new TH1F("h34","Y position of matched cluster & low ADC",200,-10.0,10.0);

   TH1F *hnoise = new TH1F("hnoise","Noise in connected channels",100,-200,200);
   TH1F *hnoiseChan = new TH1F("hnoiseChan","Noise in connected channels",200,0,200);
   TH1F *hnoisePerChannel = new TH1F("hnoisePerChannel","Noise",512,0,512);

   TH1F* h35 = new TH1F("h35","No. clusters / event",50,0.0,50.0);
   
   TH1F *h41[10];
   TH1F *h42[10];
   TH1F *h43[10];
   TH1F *h44[10];
   for(int i=0; i<10; i++){
     h41[i] = new TH1F(Form("h41_%d",i),Form("ADC_{L}-ADC_{R}, Bin %d, Odd Ch",i),80,-400,400);
     h42[i] = new TH1F(Form("h42_%d",i),Form("ADC_{L}-ADC_{R}, Bin %d, Odd Ch",i),80,-400,400);
     h43[i] = new TH1F(Form("h43_%d",i),Form("ADC_{L}-ADC_{R}, Bin %d, Odd Ch",i),160,-400,400);
     h44[i] = new TH1F(Form("h44_%d",i),Form("ADC_{L}-ADC_{R}, Bin %d, Odd Ch",i),160,-400,400);
   }

   for(int i=0; i<nChan; i++){
     hnoisePerChannel->Fill(i+0.5,noise[i]);
   }
   


   //------------------------------------------------------------------------------------------------------
   
   //-----------------------------
   // Prepare DUT (Alignment, etc)
   //-----------------------------

   PrepareDUT();
   //return;
   float biasVal = atof(m_bias);
   cout << "chargeCorrSlopeOdd, chargeCorrSlopeEven = " << chargeCorrSlopeOdd << " " << chargeCorrSlopeEven << " " 
        << m_bias << " " << biasVal << endl;
   

   std::ofstream myfile;
   if(writeEventsWithMissinhHitsToFile){
     myfile.open("MissingDUTHits.dat");
   }

   int iChan = nChan;
   double nomStrip = 0, detStrip = 0;
   int nPrint = 0;
   double dxh[10];
   int njump = 10000;
   if(nentries > 100000) njump = 50000;
   Long64_t nbytes = 0, nb = 0;
   cout << "Begin loop over " << nentries << " events" << endl;
   for (Long64_t jentry=0; jentry<nentries;jentry++) {
      Long64_t ientry = LoadTree(jentry);
      if (ientry < 0) break;
      nb = fChain->GetEntry(jentry);   nbytes += nb;
      if(jentry%njump==0) cout << "====> At entry = " << jentry << endl;
      if(n_tp3_tracks != 1) continue;

      //==========================================
      // Example here of acccessing CMS strip data
      //==========================================
      if(fCMS){
        for(int k=0;k<iChan;k++){
          if(fCMS->cmsData[k]!=0) hnoise->Fill(fCMS->cmsData[k]);
        }      
      }

      h35->Fill(clusterNumberPerEvent);
      if(clusterNumberPerEvent>10) continue;
      
      
      // Loop over TPIX tracks in event
      for(int k=0; k<n_tp3_tracks; k++){
        if(dtime > trackTriggerTimeDiffCut) continue;
        double x_trk = vec_trk_tx->at(k)*z_DUT+vec_trk_x->at(k);
        double y_trk = vec_trk_ty->at(k)*z_DUT+vec_trk_y->at(k);
        
        transformTrackToDUTFrame(k, x_trk, y_trk, nomStrip, detStrip);

        //if(isInCutoutRegion(x_trk, y_trk)) continue;
        double distToCutout = DistToCutoutRegion(x_trk, y_trk);
        bool awayFromCutout = distToCutout > minDistFromHole;

        int closestStrip = nomStrip;
        double fracStrip = nomStrip - closestStrip - 0.5;

        double tx = 1000*vec_trk_tx->at(k);
        double ty = 1000*vec_trk_ty->at(k);

        h5->Fill(tx);
        h6->Fill(ty);

        // Test cuts here, e.g.  to reject regions
        //if(nomStrip<422 || nomStrip>442) continue;
        //if(y_trk>2.4) continue;
        //if(nomStrip<420 || nomStrip>445) continue;
        

        bool goodRegion = true;
        for(int id = 0; id<nDeadRegion; id++){
          if(x_trk>=deadRegionLo[id]  && x_trk<=deadRegionHi[id]) goodRegion = false;  
        }
        if(!goodRegion) continue;

        h5a->Fill(x_trk);
        h6a->Fill(y_trk);
        bool goodTrack = false;
        bool inFiducialX = false;
        bool inFiducialY = false;

        if(x_trk>xMin && x_trk<xMax) inFiducialX = true;          
        if(y_trk>yMin && y_trk<yMax) inFiducialY = true;          
        bool inFiducial = inFiducialX && inFiducialY;
        inFiducial = inFiducial && (x_trk<xLeftHole || x_trk>xRightHole);
        
        if(tx>txMin && tx<txMax && ty>tyMin && ty<tyMax) goodTrack = true;        
        bool goodTime =  (clustersTDC >= tdcLo && clustersTDC <= tdcHi);

        if(goodTrack && goodTime && inFiducial) h12od->Fill(distToCutout);

        if(goodTrack && goodTime && inFiducial && awayFromCutout) {
          h3a->Fill(x_trk,y_trk);
          h12a->Fill(y_trk);
          h12dd->Fill(x_trk);
          if(y_trk>yInt1[0]&&y_trk<yInt1[1]) h12ed->Fill(x_trk);
          if(y_trk>yInt2[0]&&y_trk<yInt2[1]) h12fd->Fill(x_trk);
          if(y_trk>yInt3[0]&&y_trk<yInt3[1]) h12gd->Fill(x_trk);
          h12hd->Fill(fracStrip);
          if(y_trk>yInt1[0]&&y_trk<yInt1[1] && x_trk>-3.5&&x_trk<2.5) h12id->Fill(fracStrip);
          if(y_trk>yInt2[0]&&y_trk<yInt2[1] && x_trk>-3.5&&x_trk<2.5) h12jd->Fill(fracStrip);
          if(y_trk>yInt3[0]&&y_trk<yInt3[1] && x_trk>-3.5&&x_trk<2.5) h12kd->Fill(fracStrip);
        }
        
        bool foundHit = false;
        bool foundHitNoFid = false;
        double x_trk0 = x_trk;
        for(int j=0; j<min(clusterNumberPerEvent,10); j++){
          dxh[j] = -999;
          if(clustersPosition[j] < 0.1) continue;
          if(polarity*clustersCharge[j] < 0.2*kClusterChargeMin) continue;
          double x_dut = getDUTHitPosition(j);
          x_trk = x_trk0;
       
          int iPeak = 1;
          if(clustersSeedPosition[j]%2==0) iPeak = 0;
          
          h1s->Fill(clustersSeedPosition[j]);
          if(clustersSeedPosition[j]<iLo-5 || clustersSeedPosition[j]>iHi+5) continue;

          double dx = x_dut - x_trk;
          dxh[j] = dx;

          if(inFiducial && goodTime && awayFromCutout) h12->Fill(y_trk); 
          if(goodTrack && inFiducial && fabs(dx)<dxWin && awayFromCutout) {
            h2p->Fill(clustersTDC+0.1,polarity*clustersCharge[j]);
            h15d->Fill(clustersTDC);          
            if(goodTime) h15e->Fill(clustersTDC);          
          }
          

          if(goodTrack && inFiducial && goodTime && fabs(dx)<dxWin){
            h3->Fill(x_trk,y_trk);
          }
          
          if(goodTrack && inFiducial && goodTime && fabs(dx)<dxWin) foundHitNoFid = true;


          if(goodTrack && inFiducial && goodTime && awayFromCutout) {
            hcAll->Fill(polarity*clustersCharge[j]);
            h2->Fill(x_trk, x_dut);
            h1->Fill(dx);
            if(clustersSize[j]==1) h1a->Fill(dx);
            if(clustersSize[j]==2) h1b->Fill(dx);
            h1w->Fill(dx);
            if(y_trk>2.5) h1wY->Fill(dx);
            if(polarity*clustersCharge[j] < 250) h1z->Fill(dx);
            h11d->Fill(detStrip);        
            
            if(fabs(dx)<dxWin) {
              int ichan = clustersSeedPosition[j];
              h4c->Fill(clustersSeedPosition[j]);
              if(ichan>=0 && ichan<=511){
                hlandau[ichan]->Fill(polarity*clustersCharge[j]);
              }
              
              hnoiseChan->Fill(noise[ichan]);
              h18a->Fill(clustersSeedCharge[j]/clustersCharge[j]);
              foundHit = true;
              if(clustersSize[j]==1) h18b->Fill(fracStrip,dx);
              if(clustersSize[j]==2) h18c->Fill(fracStrip,dx);
              h18d->Fill(fracStrip,clustersSeedCharge[j]/clustersCharge[j]);
              
              h12m->Fill(fracStrip,polarity*clustersCharge[j]);
              h12n->Fill(fracStrip,clustersSize[j]);
              h1vsx->Fill(x_trk,dx);
              if(y_trk>yMid&&y_trk<yMax) h10a->Fill(clustersPosition[j],polarity*clustersCharge[j]);
              if(y_trk>yMin&&y_trk<yMid) h10b->Fill(clustersPosition[j],polarity*clustersCharge[j]);
              if(y_trk>yHi2&&y_trk<yMax) h10c->Fill(clustersPosition[j],polarity*clustersCharge[j]);
              h10d->Fill(y_trk,polarity*clustersCharge[j]);
              h10e->Fill(x_trk,polarity*clustersCharge[j]);
              double chleft = polarity*clustersCharge1StripLeft[j];
              double chright = polarity*clustersCharge1StripRight[j];
              double rc = -999;
              if(detStrip <= clustersSeedPosition[j]) {
                if(chleft>0) rc = (chleft/(chleft+clustersSeedCharge[j]));              
              }else{ 
                if(chright>0) rc = (clustersSeedCharge[j]/(chright+clustersSeedCharge[j]));
              }
              if( rc>=0 ) {
                h17->Fill(rc);
                h17a->Fill(fracStrip,rc);
                h17b->Fill(fracStrip,rc);
              }
              h8->Fill(1000*vec_trk_tx->at(k),dx);    
              h9->Fill(y_trk,dx);
              h9a->Fill(x_trk,dx);
              h5b->Fill(x_trk);
              h6b->Fill(y_trk);
              h5c->Fill(tx);
              h6c->Fill(ty);

              h11n->Fill(detStrip);
              hcTrk->Fill(polarity*clustersCharge[j]);
              if(clustersSize[j]==1) hcTrkCorr->Fill(polarity*clustersCharge[j]);
              if(clustersSize[j]==2 && iPeak==1) hcTrkCorr->Fill(polarity*clustersCharge[j]*(1.0-chargeCorrSlopeOdd));
              if(clustersSize[j]==2 && iPeak==0) hcTrkCorr->Fill(polarity*clustersCharge[j]*(1.0-chargeCorrSlopeEven));
              hcTrkSeed->Fill(polarity*clustersSeedCharge[j]);
              if(clustersSize[j]==1) hcTrkSeed1->Fill(polarity*clustersSeedCharge[j]);
              if(clustersSize[j]==2) hcTrkSeed2->Fill(polarity*clustersSeedCharge[j]);
              if(y_trk - yMax < 5.0) hcTrkNoTop->Fill(polarity*clustersCharge[j]);
              if(x_trk < (xMin+xMax)/2.) hcTrkLowX->Fill(polarity*clustersCharge[j]);
              if(x_trk >= (xMin+xMax)/2.) hcTrkHighX->Fill(polarity*clustersCharge[j]);
              int ix = 4*(x_trk - xMin - 0.001) / (xMax-xMin);
              int iy = 4*(y_trk - yMin - 0.001) / (yMax-yMin);
              int ihist = 4*ix + iy;
              hcTrkXY[ihist]->Fill(polarity*clustersCharge[j]);              
              //if(y_trk>yMin && y_trk<=(yMin+0.25*yRange)) hcTrkY1->Fill(polarity*clustersCharge[j]);
              //if(y_trk>(yMin+0.25*yRange) && y_trk<(yMin+0.50*yRange)) hcTrkY2->Fill(polarity*clustersCharge[j]);
              //if(y_trk>(yMin+0.50*yRange) && y_trk<(yMin+0.75*yRange)) hcTrkY3->Fill(polarity*clustersCharge[j]);
              //if(y_trk>(yMin+0.75*yRange) && y_trk<(yMin+1.00*yRange)) hcTrkY4->Fill(polarity*clustersCharge[j]);
              //if(y_trk>yMin&&y_trk<yMid+1.0) hcTrkY2->Fill(polarity*clustersCharge[j]);

              if(clustersSize[j]==1) hcTrk1->Fill(polarity*clustersCharge[j]);
              if(clustersSize[j]==2) hcTrk2->Fill(polarity*clustersCharge[j]);
              if(clustersPosition[j]>170  && clustersPosition[j]<190) hcTrka->Fill(polarity*clustersCharge[j]);
              h31a->Fill(x_trk,y_trk);
              h32a->Fill(clustersPosition[j]);
              h33a->Fill(y_trk);
              h33b->Fill(x_trk);
              if(polarity*clustersCharge[j] < 250) {
                h31b->Fill(x_trk,y_trk);
                h32b->Fill(clustersPosition[j]);
                h34->Fill(y_trk);
              }
              double chr = clustersCharge1StripRight[j]*polarity;
              double chl = clustersCharge1StripLeft[j]*polarity;
              double chr2 = clustersCharge2StripRight[j]*polarity;
              double chl2 = clustersCharge2StripLeft[j]*polarity;
              double pch = polarity*clustersSeedCharge[j];
              int ic = pch/50.;
              if(ic>=0 && ic<10 && clustersSize[j]<=2 ){
                if(iPeak==1) h41[ic]->Fill(chl-chr);
                if(iPeak==0) h42[ic]->Fill(chl-chr);
                if(chr2!=0 and chl2!=0){
                  if(iPeak==1) h43[ic]->Fill(chl2-chr2);
                  if(iPeak==0) h44[ic]->Fill(chl2-chr2);
                }
                
              } 
            }

            double clstrip = getCorrChannel(clustersPosition[j]);
            h4->Fill(clstrip);
            h4b->Fill(clstrip + channelOffset);
            h4a->Fill(clustersPosition[j]);
            h0->Fill(detStrip - clstrip);
          }
        }

        if(inFiducial && goodTrack && goodTime && foundHitNoFid) {
          h12on->Fill(distToCutout);
        }
        
        if(inFiducial && goodTrack && goodTime && awayFromCutout) {
          h16c->Fill(dtime);
          if(foundHit) {
            h3c->Fill(x_trk,y_trk);
            for(int j=0; j<min(clusterNumberPerEvent,10); j++){
              hcfpa->Fill(polarity*clustersCharge[j]);
              if(polarity*clustersCharge[j]>120) h1fpa->Fill(dxh[j]);
            }        
            h15c->Fill(dtime);
            h15b->Fill(clustersTDC+0.1);
            h15a->Fill(vec_trk_chi2ndf->at(k));
            h12b->Fill(y_trk);
            h12dn->Fill(x_trk); 
            if(y_trk>yInt1[0]&&y_trk<yInt1[1]) h12en->Fill(x_trk);
            if(y_trk>yInt2[0]&&y_trk<yInt2[1]) h12fn->Fill(x_trk);
            if(y_trk>yInt3[0]&&y_trk<yInt3[1]) h12gn->Fill(x_trk);
            h12hn->Fill(fracStrip);
            if(y_trk>yInt1[0]&&y_trk<yInt1[1] && x_trk>-3.5&&x_trk<2.5) h12in->Fill(fracStrip);
            if(y_trk>yInt2[0]&&y_trk<yInt2[1] && x_trk>-3.5&&x_trk<2.5) h12jn->Fill(fracStrip);
            if(y_trk>yInt3[0]&&y_trk<yInt3[1] && x_trk>-3.5&&x_trk<2.5) h12kn->Fill(fracStrip);
            if(y_trk>yInt1[0] && y_trk < yInt2[1] && x_trk>-3.5&&x_trk<-2.0) {
              h14b->Fill(detStrip);
              h13fpa->Fill(clusterNumberPerEvent);
            }else if(y_trk>yInt3[0] && y_trk < yInt3[1]) {
              h13fbpa->Fill(clusterNumberPerEvent);
              for(int j=0; j<min(clusterNumberPerEvent,10); j++){
                h1fbpa->Fill(dxh[j]);
                hcfbpa->Fill(polarity*clustersCharge[j]);
              }
            }                
          }else{     
            h3b->Fill(x_trk,y_trk);          
            h13mpa->Fill(clusterNumberPerEvent);
            h16a->Fill(vec_trk_chi2ndf->at(k));
            h16b->Fill(clustersTDC+0.1);
            for(int j=0; j<min(clusterNumberPerEvent,10); j++){
              hcmpa->Fill(polarity*clustersCharge[j]);
              if(polarity*clustersCharge[j]>120) h1mpa->Fill(dxh[j]);
            }            
            nPrint++;
            if(y_trk>yInt1[0] && y_trk < yInt2[1]) {
              h14a->Fill(detStrip);
              if(writeEventsWithMissinhHitsToFile) 
                myfile << jentry << " " << detStrip << " " << x_trk << " " << y_trk << endl;              
              //if(nPrint < 100) cout << "Missed hit, event, #clu, nomStrip =  " << jentry << " " 
              //                      << clusterNumberPerEvent << " " << nomStrip << endl;
              for(int j=0; j<min(clusterNumberPerEvent,10); j++){
                if(x_trk>-3.5&&x_trk<-2.0) h1mpa1->Fill(dxh[j]);
                if(x_trk>-2.0&&x_trk<-1.0) h1mpa2->Fill(dxh[j]);
                if(x_trk>-1.0&&x_trk<0.0) h1mpa3->Fill(dxh[j]);
                if(x_trk>0.0&&x_trk<1.0)  h1mpa4->Fill(dxh[j]);
                if(x_trk>1.5&&x_trk<3.5)  h1mpa5->Fill(dxh[j]);
                if(y_trk<yInt1[1]) h1mpaL->Fill(clustersPosition[j]);                         
                if(y_trk>=yInt1[1]) h1mpaU->Fill(clustersPosition[j]);
              }
            }else if(y_trk>yInt3[0] && y_trk < yInt3[1]) {
              h13mbpa->Fill(clusterNumberPerEvent);
              for(int j=0; j<min(clusterNumberPerEvent,10); j++){              
                h1mbpa->Fill(dxh[j]);
                hcmbpa->Fill(polarity*clustersCharge[j]);
              }    
            }
          }
        } 
      }
   }
   if(writeEventsWithMissinhHitsToFile) myfile.close();

   int i1 = h1->FindBin(-0.3);
   int i2 = h1->FindBin(0.3);
   cout << "Number of track - DUT hit matchs: " << h1->Integral(i1,i2) << endl;
   cout << "Ry = " << Ry << endl;
   
   
   TString r1 = Form("%6.3f < Y < %6.3f mm",yInt1[0], yInt1[1]);
   TString r2 = Form("%6.3f < Y < %6.3f mm ",yInt2[0], yInt2[1]);
   TString r3 = Form("%6.3f < Y < %6.3f mm",yInt3[0], yInt3[1]);   


   TF1 *funchole = new TF1("funchole","[0]+[1]*x+[2]*x*x",-8.0,8.0);
   funchole->SetParameters(holeQuadPar[0],holeQuadPar[1],holeQuadPar[2]);
   funchole->SetLineColor(4);
   funchole->SetLineWidth(2);
   cout << "Hole Parameters: " << holeQuadPar[0] << " " << holeQuadPar[1] << " " << holeQuadPar[2] << endl;
   
   gStyle->SetOptStat(1000000001);
   gStyle->SetOptFit(0011);
   gStyle->SetStatH(0.05);
   gStyle->SetStatW(0.2);

   addGraphics(h3b, 1, "X_{trk} [mm]", "Y_{trk} [mm] ");
   h3b->GetXaxis()->SetRangeUser(-5,5);
   h3b->GetYaxis()->SetRangeUser(-5,5);

   TCanvas *c = new TCanvas("c","Residuals",1500,1000);
   c->Divide(4,3);
   c->cd(1)->SetLeftMargin(0.13);
   addGraphics(h2, 1, "X_{trk} [mm]", "X_{DUT} [mm]");
   double dM = yMax;
   if(xMax>dM) dM = xMax;
   h2->GetXaxis()->SetRangeUser(-1.0*dM-1,dM+1);
   h2->GetYaxis()->SetRangeUser(-1.0*dM-1,dM+1);
   h2->SetMinimum(1);
   h2->Draw();

   c->cd(2)->SetLeftMargin(0.13);;
   addGraphics(h1, 1, "#DeltaX [mm]", "");
   addGraphics(h1z, 2, "#DeltaX [mm]", "");
   addGraphics(h1a, 3, "#DeltaX [mm]", "");
   addGraphics(h1b, 6, "#DeltaX [mm]", "");
   h1->GetXaxis()->SetRangeUser(-0.3,0.3);
   if(m_board.Contains("A1")) h1->GetXaxis()->SetRangeUser(-1.5,1.5);
   h1->SetMaximum(1.2*h1->GetMaximum());
   h1->Draw();   
   //h1z->Draw("same");
   h1a->Draw("same");
   h1b->Draw("same");
   TLine *l1 = new TLine(-stripPitch/2.,0,-stripPitch/2.,0.5*h1->GetMaximum());
   TLine *l2 = new TLine(stripPitch/2,0,stripPitch/2,0.5*h1->GetMaximum());
   TLine *l1a = new TLine(-dxWin,0,-dxWin,0.5*h1->GetMaximum());
   TLine *l2a = new TLine(dxWin,0,dxWin,0.5*h1->GetMaximum());
   l1->SetLineColor(kRed); l2->SetLineColor(kRed);
   l1a->SetLineColor(kBlue); l2a->SetLineColor(kBlue); l1a->SetLineWidth(2); l2a->SetLineWidth(2);
   l1->Draw(); l2->Draw();
   //l1a->Draw(); l2a->Draw();

   TLegend* legend3 = new TLegend(0.15,0.70,0.40,0.89);
   legend3->SetFillStyle(0);
   legend3->SetBorderSize(0);
   legend3->SetFillStyle(0);
   legend3->SetTextSize(0.045);
   
   legend3->AddEntry(h1,"All","L"); 
   //legend3->AddEntry(h1z,"ADC < 250","L"); 
   legend3->AddEntry(h1a,"1-strip","L"); 
   legend3->AddEntry(h1b,"2-strip","L"); 
   legend3->Draw();
   
   c->cd(3)->SetLeftMargin(0.13);;
   addGraphics(h8, 1, "#theta_{X}^{trk} [mrad]", "#DeltaX [mm]");
   h8->GetXaxis()->SetRangeUser(txMin-0.1,txMax+0.1);   
   h8->GetYaxis()->SetRangeUser(-0.1,0.1);   
   h8->Draw();
   c->cd(4)->SetLeftMargin(0.13);;
   addGraphics(h9, 1, "Y^{trk} [mm]", "#DeltaX [mm]");
   h9->GetXaxis()->SetRangeUser(yMin-1,yMax+1);   
   h9->GetYaxis()->SetRangeUser(-0.1,0.1);   
   h9->Draw();
   c->cd(5)->SetLeftMargin(0.13);;
   addGraphics(h9a, 1, "X^{trk} [mm]", "#DeltaX [mm]");
   h9a->GetXaxis()->SetRangeUser(-4,4);   
   h9a->GetYaxis()->SetRangeUser(-0.1,0.1);   
   h9a->Draw();

   c->cd(6)->SetLeftMargin(0.13);;
   addGraphics(h3, 1, "X_{trk} [mm]", "Y_{trk} [mm]");
   h3->GetXaxis()->SetRangeUser(xMin-1,xMax+1);   
   h3->GetYaxis()->SetRangeUser(yMin-1,yMax+1);   
   h3->Draw();
   if(holeQuadPar[0]!=0) funchole->Draw("same");
   if(fabs(xLeftHole)<900 && fabs(xRightHole)<900){
     TBox *b1 = new TBox(xMin,yMin,xLeftHole,yMax);
     TBox *b2 = new TBox(xRightHole,yMin,xMax,yMax);
     b1->SetLineColor(kBlue); b1->SetLineWidth(2);b1->SetFillStyle(0);   
     b1->Draw();
     b2->SetLineColor(kBlue); b2->SetLineWidth(2);b2->SetFillStyle(0);   
     b2->Draw();
   }else{   
     TBox *b = new TBox(xMin,yMin,xMax,yMax);
     b->SetLineColor(kBlue); b->SetLineWidth(2);b->SetFillStyle(0);   
     b->Draw();
   }
   

   c->cd(7)->SetLeftMargin(0.13);;
   addGraphics(h5, 1, "#theta_{X}^{trk} [mrad]", "");
   h5->GetXaxis()->SetRangeUser(txMin-0.1,txMax+0.1);   
   h5->Draw();
   h5c->SetLineColor(2); h5c->Draw("same");
   TLine *l1b = new TLine(txMin,0,txMin,h5->GetMaximum());
   TLine *l2b = new TLine(txMax,0,txMax,h5->GetMaximum());
   l1b->SetLineColor(kBlue); l2b->SetLineColor(kBlue); l1b->SetLineWidth(2); l2b->SetLineWidth(2);
   l1b->Draw(); l2b->Draw();

   c->cd(8)->SetLeftMargin(0.13);
   addGraphics(h6, 1, "#theta_{Y}^{trk} [mrad]", "");
   h6->GetXaxis()->SetRangeUser(tyMin-0.1,tyMax+0.1);   
   h6->Draw();
   h6c->SetLineColor(2); h6c->Draw("same");
   TLine *l1c = new TLine(tyMin,0,tyMin,h6->GetMaximum());
   TLine *l2c = new TLine(tyMax,0,tyMax,h6->GetMaximum());
   l1c->SetLineColor(kBlue); l2c->SetLineColor(kBlue); l1c->SetLineWidth(2); l2c->SetLineWidth(2);   
   l1c->Draw(); l2c->Draw();
   
   c->cd(9)->SetLeftMargin(0.13);;
   addGraphics(h4, 1, "Strip # with cluster", "");
   addGraphics(h4a, 2, "Strip # with cluster", "");
   h4->GetXaxis()->SetRangeUser(max(iLo-60.0,1.0),min(iHi+60.0,512.0));
   h4a->GetXaxis()->SetRangeUser(max(iLo-60.0,1.0),min(iHi+60.0,512.0));
   double vmax = h4a->GetMaximum();
   //for(int ii=iLo; ii<=iHi;ii++){
   //  if(h4a->GetBinContent(ii)>vmax) vmax = h4a->GetBinContent(ii);
   //}
   h4->SetMaximum(1.25*vmax);
   TLine *l1d = new TLine(iLo,0,iLo,0.75*h4a->GetMaximum());
   TLine *l2d = new TLine(iHi,0,iHi,0.75*h4a->GetMaximum());
   l1d->SetLineColor(kBlue); l2d->SetLineColor(kBlue); l1d->SetLineWidth(2); l2d->SetLineWidth(2);   
   h4->Draw();
   h4a->Draw("same");
   l1d->Draw(); l2d->Draw();
   
   TLegend* legend4 = new TLegend(0.15,0.70,0.94,0.89);
   legend4->SetFillStyle(0);
   legend4->SetBorderSize(0);
   legend4->SetFillStyle(0);
   legend4->SetTextSize(0.045);
   
   legend4->AddEntry(h4,"Sensor strip ch #","L"); 
   legend4->AddEntry(h4a,"Electr. ch #","L");

   legend4->Draw();


   c->cd(10)->SetLeftMargin(0.13);;
   addGraphics(hcAll, 1, "Cluster charge [ADC]", "");
   addGraphics(hcTrk1, 3, "Cluster charge [ADC]", "");
   addGraphics(hcTrk2, 6, "Cluster charge [ADC]", "");
   hcAll->SetMaximum(1.25*hcAll->GetMaximum());
   hcAll->Draw();
   hcTrk->SetLineColor(kBlue); hcTrk->SetLineWidth(2);
   hcTrk->Draw("same"); 
   hcTrk1->Draw("same"); 
   hcTrk2->Draw("same"); 
 

    // Fitting S histo
    printf("Fitting...\n");

    // Setting fit range and start values
    Double_t fr[2];
    Double_t sv[4], pllo[4], plhi[4], fp[4], fpe[4];
    fr[0]=0.4*hcTrk->GetMean();
    fr[1]=3.0*hcTrk->GetMean();

    pllo[0]=0.; pllo[1]=100.0; pllo[2]=1.; pllo[3]=0.01;
    plhi[0]=50.; plhi[1]=350.0; plhi[2]=100000000.; plhi[3]=50.;
    sv[0]=30.; sv[1]=250.; sv[2]=500.; sv[3]=3.;

    Double_t chisqr;
    Int_t    ndf;
    TF1 *fitsnr = langaufit(hcTrk,fr,sv,pllo,plhi,fp,fpe,&chisqr,&ndf);

    Double_t SPeak, SFWHM;
    langaupro(fp,SPeak,SFWHM);

    printf("Fitting done\nPlotting results...\n");

    // Global style settings
    gStyle->SetOptStat(1111);
    gStyle->SetOptFit(111);
    gStyle->SetLabelSize(0.03,"x");
    gStyle->SetLabelSize(0.03,"y");

    fitsnr->SetLineColor(kRed);
    fitsnr->Draw();




   TLegend* legend2 = new TLegend(0.15,0.70,0.94,0.89);
   legend2->SetFillStyle(0);
   legend2->SetBorderSize(0);
   legend2->SetFillStyle(0);
   legend2->SetTextSize(0.045);
   
   legend2->AddEntry(hcAll,"All clusters, trk in Fid","L"); 
   legend2->AddEntry(hcTrk,"Clusters, |#DeltaX|<200 #mum, trk in Fid.","L");
   legend2->AddEntry(hcTrk1,"1-strip Clusters","L");
   legend2->AddEntry(hcTrk2,"2-strip Clusters","L");

   legend2->Draw();

   

   c->cd(11)->SetLeftMargin(0.13);;
   addGraphics(h10a, 1, "Strip #", "<ADC>");
   addGraphics(h10b, 2, "Strip #", "<ADC>");
   addGraphics(h10c, 4, "Strip #", "<ADC>");
   int ixl = iLo;
   int ixh = iHi;
   int yh = hcTrk->GetMean()-50;
   h10a->GetXaxis()->SetRangeUser(ixl-2,ixh+2);   
   h10a->GetYaxis()->SetRangeUser(yh-200,yh+300);
   /*
   h10a->Draw();
   h10b->SetLineColor(2);h10b->SetMarkerColor(2);
   h10b->Draw("same");
   h10c->SetLineColor(4);h10c->SetMarkerColor(4);
   h10c->Draw("same");

   TLegend* legend1 = new TLegend(0.25,0.75,0.94,0.89);
   legend1->SetFillStyle(0);
   legend1->SetBorderSize(0);
   legend1->SetFillStyle(0);
   legend1->SetTextSize(0.045);
   
   legend1->AddEntry(h10a,"Top half in Y","LEP"); 
   legend1->AddEntry(h10b,"Bottom half in Y","LEP"); 
   legend1->AddEntry(h10c,"Top 2 mm in Y","LEP"); 
   legend1->Draw();
   */
   addGraphics(h35, 1, "#DUT clusters", "Entries");   
   h35->GetYaxis()->SetTitleOffset(1.2);
   h35->Draw();

   c->cd(12)->SetLeftMargin(0.13);;
   addGraphics(h2p, 1, "TDC time / 2.5 ns", "<ADC>");
   h2p->Draw();
   TLine *l1e = new TLine(tdcLo,0,tdcLo,h2p->GetMaximum());
   TLine *l2e = new TLine(tdcHi,0,tdcHi,h2p->GetMaximum());
   l1e->SetLineColor(kBlue); l2e->SetLineColor(kBlue); l1e->SetLineWidth(2); l2e->SetLineWidth(2);   
   l1e->Draw(); l2e->Draw();

   c->Print("Plots/plot_"+m_board+"_"+runplace+"_"+consR+".png");

   //return;
   


   TCanvas *c4 = new TCanvas("c4","Plot 4",800,600);
   c4->Divide(2,2);
   c4->cd(1)->SetLeftMargin(0.13);
   addGraphics(h12en, 1, "X_{trk} [mm]", "");
   addGraphics(h12fn, 1, "X_{trk} [mm]", "");

   TH1F *hepa1 = (TH1F*)h12en->Clone("hepa1");
   TH1F *hepa2 = (TH1F*)h12fn->Clone("hepa2");
   TH1F *henpa = (TH1F*)h12gn->Clone("henpa");
   hepa1->Divide(h12en,h12ed,1.0,1.0,"B");
   hepa2->Divide(h12fn,h12fd,1.0,1.0,"B");
   henpa->Divide(h12gn,h12gd,1.0,1.0,"B");
   addGraphics(hepa1, 1, "X_{trk} [mm]", "#Good DUT hit / # Track ");
   addGraphics(hepa2, 1, "X_{trk} [mm]", "#Good DUT hit / # Track ");
   h3b->GetYaxis()->SetRangeUser(-5,5);
   h3b->Draw();

   c4->cd(2)->SetLeftMargin(0.13);
   hepa1->GetXaxis()->SetRangeUser(xMin-0.5,xMax+0.5);
   hepa1->SetMinimum(0.0);
   hepa1->SetMaximum(1.2);
   hepa1->SetLineWidth(1);
   hepa1->SetTitle(r1);
   hepa1->Draw("hist");
   c4->cd(3)->SetLeftMargin(0.13);
   hepa2->GetXaxis()->SetRangeUser(xMin-0.5,xMax+0.5);
   hepa2->SetMinimum(0.0);
   hepa2->SetMaximum(1.2);
   hepa2->SetLineWidth(1);
   hepa2->SetTitle(r2);
   hepa2->Draw("hist");

   c4->cd(4)->SetLeftMargin(0.13);
   addGraphics(henpa, 1, "X_{trk} [mm]", "#Good DUT hit / # Track ");
   henpa->GetXaxis()->SetRangeUser(xMin-0.5,xMax+0.5);
   henpa->SetMinimum(0.0);
   henpa->SetMaximum(1.2);
   henpa->SetLineWidth(1);
   henpa->SetTitle(r3);
   henpa->Draw("hist");   


   TCanvas *c5 = new TCanvas("c5","Plot 5",800,600);
   c5->Divide(2,2);
   c5->cd(1)->SetLeftMargin(0.13);
   addGraphics(h12hn, 1, "Rel. Strip Pos", "");
   addGraphics(h12in, 1, "Rel. Strip Pos", "");
   addGraphics(h12jn, 1, "Rel. Strip Pos", "");
   addGraphics(h12kn, 1, "Rel. Strip Pos", "");

   TH1F *hepas1 = (TH1F*)h12hn->Clone("hepas1");
   TH1F *hepas2 = (TH1F*)h12in->Clone("hepas2");
   TH1F *hepas3 = (TH1F*)h12jn->Clone("hepas3");
   TH1F *hepas4 = (TH1F*)h12kn->Clone("hepas4");
   hepas1->Divide(h12hn,h12hd,1.0,1.0,"B");
   hepas2->Divide(h12in,h12id,1.0,1.0,"B");
   hepas3->Divide(h12jn,h12jd,1.0,1.0,"B");
   hepas4->Divide(h12kn,h12kd,1.0,1.0,"B");
   addGraphics(hepas1, 1, "Rel. Strip Pos.", "#Good DUT hit / # Track ");
   addGraphics(hepas2, 1, "Rel. Strip Pos.", "#Good DUT hit / # Track ");
   addGraphics(hepas3, 1, "Rel. Strip Pos.", "#Good DUT hit / # Track ");
   addGraphics(hepas4, 1, "Rel. Strip Pos.", "#Good DUT hit / # Track ");
   hepas1->SetTitle("Full Beam Spot");
   hepas1->SetMinimum(0.8);
   hepas1->SetMaximum(1.2);
   hepas1->SetLineWidth(1);
   hepas1->Draw("hist");
   c5->cd(2)->SetLeftMargin(0.13);
   hepas2->SetTitle(r1);
   hepas2->SetMinimum(0.8);
   hepas2->SetMaximum(1.2);
   hepas2->SetLineWidth(1);
   hepas2->Draw("hist");
   c5->cd(3)->SetLeftMargin(0.13);
   hepas3->SetTitle(r2);
   hepas3->SetMinimum(0.8);
   hepas3->SetMaximum(1.2);
   hepas3->SetLineWidth(1);
   hepas3->Draw("hist");
   c5->cd(4)->SetLeftMargin(0.13);
   hepas4->SetTitle(r3);
   hepas4->SetMinimum(0.8);
   hepas4->SetMaximum(1.2);
   hepas4->SetLineWidth(1);
   hepas4->Draw("hist");

   c5->Print("Plots/plot5_"+m_board+"_"+runplace+"_"+consR+".png");
   //return;
   

   TCanvas *c1 = new TCanvas("c1","Plot 1",1600,800);
   c1->Divide(3,2);

   c1->cd(1)->SetLeftMargin(0.13);
   addGraphics(h10d, 2, "Y_{trk} [mm]", "<ADC>");
   h10d->GetXaxis()->SetRangeUser(yMin-0.5,yMax+0.5);
   h10d->Draw();

   //c1->cd(2)->SetLeftMargin(0.13);
   //h3b->Draw();   

   c1->cd(2)->SetLeftMargin(0.13);
   addGraphics(h12b, 2, "Y_{trk} [mm]", "");
   addGraphics(h12a, 1, "Y_{trk} [mm]", "");
   h12a->SetMaximum(1.2*h12a->GetMaximum());
   h12a->GetXaxis()->SetRangeUser(yMin-0.5,yMax+0.5);
   h12a->Draw("hist");
   h12b->Draw("hist,same");

   TLegend* legend0 = new TLegend(0.15,0.75,0.94,0.89);
   legend0->SetFillStyle(0);
   legend0->SetBorderSize(0);
   legend0->SetFillStyle(0);
   legend0->SetTextSize(0.045);   
   legend0->AddEntry(h12a,"Track Y pos","LEP"); 
   legend0->AddEntry(h12b,"Track Y pos with good cluster","LEP");
   legend0->Draw();

   c1->cd(3)->SetLeftMargin(0.13);
   TH1F *he = (TH1F*)h12b->Clone("he");
   he->Divide(h12b,h12a,1.0,1.0,"B");
   float bw = 1000*h12b->GetBinWidth(1);
   TString yt = Form("(#Good DUT hit / # Track) / %3.0f #mum",bw);
   addGraphics(he, 1, "Y_{trk} [mm]", yt);
   he->SetTitle("DUT Efficiency vs Y_{trk}");
   he->GetXaxis()->SetRangeUser(yMin-0.5,yMax+0.5);
   he->SetMinimum(0.8);
   he->SetMaximum(1.1);
   he->Draw("e");

   c1->cd(4)->SetLeftMargin(0.13);
   addGraphics(h10e, 2, "X_{trk} [mm]", "<ADC>");
   h10e->GetXaxis()->SetRangeUser(xMin-0.5,xMax+0.5);
   h10e->Draw();

   c1->cd(5)->SetLeftMargin(0.13);
   addGraphics(h12dd, 2, "X_{trk} [mm]", "");
   addGraphics(h12dn, 1, "X_{trk} [mm]", "");
   h12dd->SetMaximum(1.2*h12dd->GetMaximum());
   h12dd->GetXaxis()->SetRangeUser(xMin-0.5,xMax+0.5);
   h12dd->Draw("hist");
   h12dn->Draw("hist,same");

   c1->cd(6)->SetLeftMargin(0.13);
   TH1F *he2 = (TH1F*)h12dn->Clone("he");
   he2->Divide(h12dn,h12dd,1.0,1.0,"B");
   bw = 1000*h12dd->GetBinWidth(1);
   yt = Form("(#Good DUT hit / # Track) / %3.0f #mum",bw);
   addGraphics(he2, 1, "X_{trk} [mm]", yt);
   he2->SetTitle("DUT Efficiency vs X_{trk}");
   he2->GetXaxis()->SetRangeUser(xMin-0.5,xMax+0.5);
   he2->SetMinimum(0.8);
   he2->SetMaximum(1.1);
   he2->Draw("e");
   c1->Print("Plots/plot1_"+m_board+"_"+runplace+"_"+consR+".png");

   TCanvas *c8 = new TCanvas("c8","Plot 8",800,400);
   c8->Divide(2,1);
   TH1F *he4 = (TH1F*)h15c->Clone("Eff_trigger-DUT_time");
   he4->Divide(h15c,h16c,1.0,1.0,"B");
   yt = "#Good DUT hit / # Track";
   addGraphics(h16c, 1, "DUT time - Track Time (ns)", "Entries");
   addGraphics(he4, 1, "DUT time - Track Time (ns)", "Efficiency");
   c8->cd(1)->SetLeftMargin(0.15);;
   c8->cd(1)->SetRightMargin(0.05);;
   h16c->Draw();
   c8->cd(2)->SetLeftMargin(0.13);;
   c8->cd(2)->SetRightMargin(0.05);;
   he4->Draw();
   c8->Print("Plots/plot8_"+m_board+"_"+runplace+"_"+consR+".png");   

   if(holeSector){
     TCanvas *c7 = new TCanvas("c7","Plot 7",800,800);
     c7->SetLeftMargin(0.13);
     TH1F *he3 = (TH1F*)h12on->Clone("Erf()_fit");
     he3->Divide(h12on,h12od,1.0,1.0,"B");
     bw = 1000*h12od->GetBinWidth(1);
     yt = Form("(#Good DUT hit / # Track) / %3.0f #mum",bw);
     addGraphics(he3, 1, "Dist to cutout [mm]", yt);
     he3->SetStats(kTRUE);
     he3->SetTitle("DUT Efficiency vs Dist to Cutout");
     he3->GetXaxis()->SetRangeUser(-0.2,2.0);
     he3->GetYaxis()->SetRangeUser(0.0,1.3);
     he3->Draw("e");
     TLatex *myLatex = new TLatex();
     myLatex->SetTextFont(42); myLatex->SetTextColor(1); 
     myLatex->SetTextAlign(12); myLatex->SetNDC(kTRUE); myLatex->SetTextSize(0.047);
     TString text = "Sector "+m_sector;
     c7->cd();
     myLatex->DrawLatex(0.18,0.8,text);
     
     TF1 *f4a = new TF1("f4a","0.5*[0]*(1+TMath::Erf((x-[1])/[2]))",-0.1,2.0);
     f4a->SetParameters(0.5,0.0,0.04);
     f4a->SetParNames("Const","Mean","Sigma");
     he3->Fit("f4a","R");
     TPad *inset = new TPad("inset","y vx x",0.44,0.1,0.89,0.55);
     inset->SetLeftMargin(0.13);
     inset->SetRightMargin(0.05);
     h3->SetTitle("");
     inset->Draw();
     inset->cd();
     h3->Draw();
     h3b->SetMarkerSize(0.2);h3b->SetMarkerStyle(20);h3b->SetMarkerColor(kRed); 
     h3b->Draw("same");
     if(holeQuadPar[0]!=0) funchole->Draw("same");   
     
     c7->Print("Plots/plot7_"+m_board+"_"+runplace+"_"+consR+".png");   
   }
   
   /*
   TCanvas *c2 = new TCanvas("c2","Plot 2",1600,600);
   c2->Divide(5,2);
   addGraphics(h1mpa, 2, "X_{clu}-X_{trk} [mm]", ""); h1mpa->SetTitle("2.8<Y_{trk}<4.1 mm, All X, No Match Clu");
   addGraphics(h1mbpa, 4, "X_{clu}-X_{trk} [mm]", ""); h1mbpa->SetTitle("1.0<Y_{trk}<2.3 mm, All X, No Match Clu");
   addGraphics(h1fpa, 1, "X_{clu}-X_{trk} [mm]", ""); h1fpa->SetTitle("2.8<Y_{trk}<4.1 mm, All X, Match Clu");
   addGraphics(h1fbpa, 1, "X_{clu}-X_{trk} [mm]", ""); h1fbpa->SetTitle("1.0<Y_{trk}<2.3 mm, All X, Match Clu");

   addGraphics(h1mpa1, 2, "X_{clu}-X_{trk} [mm]", ""); h1mpa1->SetTitle("2.8<Y_{trk}<4.1 mm, -3.5<X_{trk}<-2.0 mm, No Match Clu");
   addGraphics(h1mpa2, 2, "X_{clu}-X_{trk} [mm]", ""); h1mpa2->SetTitle("2.8<Y_{trk}<4.1 mm, -2.0<X_{trk}<-1.0 mm, No Match Clu");
   addGraphics(h1mpa3, 2, "X_{clu}-X_{trk} [mm]", ""); h1mpa3->SetTitle("2.8<Y_{trk}<4.1 mm, -1.0<X_{trk}<0.0 mm, No Match Clu");
   addGraphics(h1mpa4, 2, "X_{clu}-X_{trk} [mm]", ""); h1mpa4->SetTitle("2.8<Y_{trk}<4.1 mm,  0.0<X_{trk}<1.0 mm, No Match Clu");
   addGraphics(h1mpa5, 2, "X_{clu}-X_{trk} [mm]", ""); h1mpa5->SetTitle("2.8<Y_{trk}<4.1 mm,  1.5<X_{trk}<3.5 mm, No Match Clu");
   h1mpa->SetLineWidth(1); 
   h1mpa1->SetLineWidth(1); 
   h1mpa2->SetLineWidth(1); 
   h1mpa3->SetLineWidth(1); 
   h1mpa4->SetLineWidth(1); 
   h1mpa5->SetLineWidth(1); 
   h1fpa->SetLineWidth(1); 
   h1fbpa->SetLineWidth(1); 

   
   h1fpa->GetXaxis()->SetRangeUser(-3,9); 
   h1fbpa->GetXaxis()->SetRangeUser(-3,9); 
   h1mbpa->GetXaxis()->SetRangeUser(-3,9); 
   h1mpa->GetXaxis()->SetRangeUser(-3,9); 
   h1mpa1->GetXaxis()->SetRangeUser(-3,9); 
   h1mpa2->GetXaxis()->SetRangeUser(-3,9); 
   h1mpa3->GetXaxis()->SetRangeUser(-3,9); 
   h1mpa4->GetXaxis()->SetRangeUser(-3,9); 
   h1mpa5->GetXaxis()->SetRangeUser(-3,9); 

   c2->cd(1);
   h3b->Draw();   
   double xl[5] = {-3.5, -2.0, -1.0, 0.0, 1.5};
   double xh[5] = {-2.0, -1.0,  0.0, 1.0, 3.5};
   
   
   for(int i=0;i<5;i++){
     TBox *b = new TBox(xl[i],yInt1[0],xh[i],yInt2[1]);
     b->SetLineColor(2); b->SetFillStyle(0);b->SetLineWidth(2);
     b->Draw();
   }
   TBox *b = new TBox(xl[0],yInt3[0],xh[4],yInt3[1]);
   b->SetLineColor(4);b->SetFillStyle(0);b->SetLineWidth(2);
   b->Draw();
   


   c2->cd(2);
   h1mpa->Draw();   
   c2->cd(3);
   h1fpa->GetYaxis()->SetRangeUser(0,30);
   h1fpa->Draw();   
   c2->cd(4);
   h1mbpa->Draw();   
   c2->cd(5);
   h1fbpa->GetYaxis()->SetRangeUser(0,30);
   h1fbpa->Draw();   
   c2->cd(6);   
   h1mpa1->Draw();   
   c2->cd(7);
   h1mpa2->Draw();   
   c2->cd(8);
   h1mpa3->Draw();   
   c2->cd(9);
   h1mpa4->Draw();   
   c2->cd(10);
   h1mpa5->Draw();
   c2->Print("Plots/plot2_"+m_board+"_s"+m_sector+"_vb"+m_bias+".png");
   */

   /*
   TCanvas *c3 = new TCanvas("c3","Plot 3",800,600);
   c3->Divide(1,2);
   c3->cd(1);
   h1mpaU->GetXaxis()->SetRangeUser(iLo-10,iHi+10);
   h1mpaU->Draw();
   c3->cd(2);
   h1mpaL->GetXaxis()->SetRangeUser(iLo-10,iHi+10);
   h1mpaL->Draw();   
   c3->Print("Plots/plot3_"+m_board+"_s"+m_sector+"_vb"+m_bias+".png");
   */

   addGraphics(h12m,1,"Interstrip Pos","<ADC>");
   addGraphics(h12n,1,"Interstrip Pos","<Cluster Size>");
   TCanvas *c6 = new TCanvas("c6","Plot 6",1200,400);
   c6->Divide(3,1);
   c6->cd(1);
   hepas1->SetMaximum(1.2);
   hepas1->SetMinimum(0.5);
   hepas1->Draw();
   c6->cd(2);
   h12m->SetMinimum(0);
   h12m->SetMaximum(1.2*h12m->GetMaximum());
   h12m->Draw();
   c6->cd(3);
   h12n->SetMinimum(0.5);
   h12n->SetMaximum(2.0);
   h12n->Draw();
   
   c6->Print("Plots/plot6_"+m_board+"_"+runplace+"_"+consR+".png");


   fout->Write();
   

}
