ROOT logo
/*
This macro creates for each pattern four 2D histograms: distance between MChit and COG vs impact angle. This information are taken
from the output of compClusHits.C. Information about the pattern are taken from the database generated by BuildClTop.C.
The macro fits these histograms with gaussians along y axis, in order to study the dependence of dZ and dX wrt
the imact angles. Two 1D histograms with dZ and dX are generated as a projection on to the y axis and are used to calculate mean value-sigma
for each pattern.
The output is a PDF with 4 2D histograms (mean-value of dZ(dX) vs alpha, sigma of dZ(dX) vs alpha,mean-value of dZ(dX) vs beta,
sigma of dZ(dX) vs beta) and 2 histograms, dZ and dX, for each pattern, a drawing of the pattern and the information from the fit and the DB and
information from DB and fits.
You can set the range of patterns you want to study by setting LowerLimit/UpperLimit. If the range coincide with the the whole ragne of patterns,
the DB is updated with the information from these fits.
It is possible to loop over few clusters instead of all the cluster setting ntotCl: usefull to check the macro. (-1 means all the clusters).
It is possilble toprint a PDF with the 2D histograms, pattern drawing and info: setting number2d histos you decide the number of pattern for which
you want 2D histograms.
*/


#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TObjArray.h"
#include "TFile.h"
#include "TTree.h"
#include "TH1.h"
#include "TH2.h"
#include "TF1.h"
#include "TArrayI.h"
#include "TArrayF.h"
#include "TCanvas.h"
#include "TLegend.h"
#include "TPad.h"
#include "TLatex.h"
#include "TBits.h"
#include "TStopwatch.h"
#include "TLine.h"
#include "TMarker.h"
#include "../ITS/UPGRADE/AliITSUClusterPix.h"
#include "../ITS/UPGRADE/AliITSURecoLayer.h"
#include "../ITS/UPGRADE/AliITSURecoDet.h"
#include "../ITS/UPGRADE/AliITSUHit.h"
#include "../ITS/UPGRADE/AliITSUGeomTGeo.h"
#include "AliITSsegmentation.h"
#include "AliGeomManager.h"
#include "TROOT.h"
#include "TStyle.h"

#endif

TObjArray* pattDB=0; //it is an array with all the patterns in TBits format (forom the most to the least frequent)
TVectorF* pattFR=0; //frequency of the pattern in the database
TVectorF* xCentrePix=0; //coordinate of the centre of the pixel containing the COG for the down-left corner in fracion of the pitch
TVectorF* zCentrePix=0;
TVectorF* xCentreShift=0; //Difference between x coordinate fo COG and the centre of the pixel containing the COG, in fraction of the pitch
TVectorF* zCentreShift=0;
TVectorF* NPix=0; //Number of fired pixels
TVectorF* NRow=0; //Number of rows of the pattern
TVectorF* NCol=0; //Number of columns of the pattern

TArrayF DeltaZmean; //mean value of the difference between MChit and COG z coordinate in micron derived from a gaussian fit
TArrayF DeltaZmeanErr;
TArrayF DeltaXmean; //mean value of the difference between MChit and COG x coordinate in micron derived from a gaussian fit
TArrayF DeltaXmeanErr;
TArrayF DeltaZsigma; //sigma of the difference between MChit and COG z coordinate in micron derived from a gaussian fit
TArrayF DeltaZsigmaErr;
TArrayF DeltaXsigma; //sigma of the difference between MChit and COG x coordinate in micron derived from a gaussian fit
TArrayF DeltaXsigmaErr;
TArrayF Chi2x; //Chi2 of the gaussian fit over x
TArrayF Chi2z; //Chi2 of the aussian fut over z
TArrayI NDFx; 
TArrayI NDFz;

TObjArray histoArr;

TStopwatch timer;
TStopwatch timer1;

Float_t pitchX; //pitch of the pixel in x direction
Float_t pitchZ; //pitch of the pixel in z direction

enum{kDXAlpha=0, kDZAlpha=1, kDXBeta=2, kDZBeta=3};//to select the kind of TH2 we want

void LoadDB(const char* fname);
void CreateHistos(TObjArray* harr);
TH2* GetHisto(Int_t pattID, Int_t kind, TObjArray* harr);
void FitHistos(Int_t pattID, Float_t Freq, Int_t nPix, Int_t nRow, Int_t nCol,
 TObjArray* harr, TCanvas* canvas, TCanvas* canvasbis);
void UpDateDB(const char* outDBFile);

typedef struct {
  Int_t evID;
  Int_t volID;
  Int_t lrID;
  Int_t clID;
  Int_t nPix;
  Int_t nX;
  Int_t nZ;
  Int_t q;
  Float_t pt;
  Float_t eta;
  Float_t phi;
  Float_t xyz[3];
  Float_t dX;
  Float_t dY;
  Float_t dZ;  
  Bool_t split;  
  Bool_t prim;
  Int_t  pdg;
  Int_t  ntr;
  Float_t alpha; // alpha is the angle in y-radius plane in local frame
  Float_t beta;  // beta is the angle in xz plane, taken from z axis, growing counterclockwise
  Int_t nRowPatt;
  Int_t nColPatt;
  Int_t pattID;
  Float_t freq;
  Float_t xCen;
  Float_t zCen;
  Float_t zShift;
  Float_t xShift;
} clSumm;

static clSumm Summ;

Int_t nPatterns=0;
Int_t LowerLimit=0;//set the first cluster of the range of interest, INCLUDED (to update DB LowerLimit=0)
Int_t UpperLimit=4000; // EXCLUDED; -1 means number of Patterns. In this case the database is updated with the information about DeltaxMean, DeltaXerr, etc.
Int_t nStudied=0;
Int_t ntotCl=-1;//Set -1 to loop over all the clusters, otherwise set the number of clusters
Int_t number2dhisto=10;//Set the number pattern from 0 to number2dhisto-1 for which you want to print the TH2 histos (dZ or dX vs alpha or beta)

void complete1(){

  //importing data

  LoadDB("clusterTopology.root");

  AliGeomManager::LoadGeometry("geometry.root");
  AliITSUGeomTGeo* gm = new AliITSUGeomTGeo(kTRUE);
  AliITSUClusterPix::SetGeom(gm);
  const AliITSsegmentation* segm = gm->GetSegmentation(0);
  pitchX = segm->Dpx(0)*10000; //pitch in X in micron
  printf("pitchX: %f\n",pitchX);
  pitchZ = segm->Dpz(0)*10000; //pitch in Z in micron
  printf("pitchX: %f\n",pitchX);
  delete gm;

  nPatterns = (pattDB->GetEntriesFast());

  if(UpperLimit==-1){
    UpperLimit=nPatterns;
  }

  nStudied=UpperLimit-LowerLimit+1;

  printf("\n\n nPatterns %d\n\n",nPatterns);

  DeltaZmean.Set(nPatterns+100);
  DeltaZmeanErr.Set(nPatterns+100);
  DeltaXmean.Set(nPatterns+100);
  DeltaXmeanErr.Set(nPatterns+100);
  DeltaZsigma.Set(nPatterns+100);
  DeltaZsigmaErr.Set(nPatterns+100);
  DeltaXsigma.Set(nPatterns+100);
  DeltaXsigmaErr.Set(nPatterns+100);
  Chi2x.Set(nPatterns+100);
  Chi2z.Set(nPatterns+100);
  NDFx.Set(nPatterns+100);
  NDFz.Set(nPatterns+100);

  printf("Loading input tree... ");

  TFile *input = new TFile("clInfo.root","read");
  TTree *clitsu = (TTree*) input->Get("clitsu");
  
  if(ntotCl==-1){
    ntotCl = (Int_t) clitsu->GetEntries();
  }
  TBranch *brdZ = clitsu->GetBranch("dZ");
  brdZ->SetAddress(&Summ.dZ);
  TBranch *brdX = clitsu->GetBranch("dX");
  brdX->SetAddress(&Summ.dX);
  TBranch *brpattID = clitsu->GetBranch("pattID");
  brpattID->SetAddress(&Summ.pattID);
  TBranch *brfreq = clitsu->GetBranch("freq");
  brfreq->SetAddress(&Summ.freq);
  TBranch *bralpha = clitsu->GetBranch("alpha");
  bralpha->SetAddress(&Summ.alpha);
  TBranch *brbeta = clitsu->GetBranch("beta");
  brbeta->SetAddress(&Summ.beta);
  printf("done!!\n\n");

  CreateHistos(&histoArr);
  printf("Starting to process clusters\n\n");
  timer.Start();
  for(Int_t iCl=0; iCl<ntotCl; iCl++){
    clitsu->GetEntry(iCl);
    Int_t ID = Summ.pattID;
    printf("Processing cluster %d... ",iCl);
    if(ID<LowerLimit || ID>=UpperLimit) {
      printf("skipped!\n\n");
      continue;
    }
    GetHisto(ID,kDXAlpha,&histoArr)->Fill(Summ.alpha,Summ.dX);
    GetHisto(ID,kDZAlpha,&histoArr)->Fill(Summ.alpha,Summ.dZ);
    GetHisto(ID,kDXBeta,&histoArr)->Fill(Summ.beta,Summ.dX);
    GetHisto(ID,kDZBeta,&histoArr)->Fill(Summ.beta,Summ.dZ);
    printf("done!\n\n");
  }
  printf("All clusters processed!\n");
  timer.Stop();
  timer.Print();

  TCanvas* cnv1 = new TCanvas("cnv1","cnv1",900,700);
  TCanvas* cnv2 = new TCanvas("cnv2","cnv2",900,700);

  printf("Printing PDF...\n\n");
  timer1.Start();
  
  cnv1->Print("angles.pdf[");
  cnv2->Print("angles2D.pdf[");

  for(Int_t i=LowerLimit; i<UpperLimit; i++){
    
    FitHistos(i,(*pattFR)[i],(*NPix)[i],(*NRow)[i],(*NCol)[i],&histoArr, cnv1, cnv2);
  }

  cnv1->Print("angles.pdf]");
  cnv2->Print("angles2D.pdf]");
  timer1.Stop();
  printf("\n\ndone!!\n\n");
  timer1.Print();

  delete cnv1;
  delete cnv2;

  if(LowerLimit==0 && UpperLimit==nPatterns){
    UpDateDB("clusterTopology2.root");
  }

}

void LoadDB(const char* fname){ //load the data base built by BuildClTopDB.C

  // load database
  TFile* fl = TFile::Open(fname);
  if(!fl){printf("Could not find %s",fname); exit(1);}
  pattDB = (TObjArray*)fl->Get("TopDB");
  pattFR = (TVectorF*)fl->Get("TopFreq");
  xCentrePix =(TVectorF*)fl->Get("xCOG");
  zCentrePix =(TVectorF*)fl->Get("zCOG");
  xCentreShift =(TVectorF*)fl->Get("xShift");
  zCentreShift =(TVectorF*)fl->Get("zShift");
  NPix =(TVectorF*)fl->Get("NPix");
  NCol =(TVectorF*)fl->Get("NCol");
  NRow =(TVectorF*)fl->Get("NRow");
}

void CreateHistos(TObjArray* harr){ //creates four 2D histograms (dX or dZ vs alpha or beta) for each pattern included in the study range

  printf("Creating histograms... ");

  //for each pattern we crate 4 2D histograms corresponding the cathegories within the enumeration
  if(!harr) harr=&histoArr;
    
  for(Int_t i=0; i<nStudied; i++){

    TH2* h0 = new TH2F(Form("hXalpha%d", i),
      Form("#DeltaX vs #alpha for pattID %d", i),10,-0.1, 1.1* TMath::Pi()/2,100,-30,30);
    h0->SetDirectory(0);
    harr->AddAtAndExpand(h0, i*4);//This histogram is the first of the 4-histos series
    
    TH2* h1 = new TH2F(Form("hZalpha%d", i),
      Form("#DeltaZ vs #alpha for pattID %d", i),10, -0.1, 1.1* TMath::Pi()/2,100,-30,30);
    h1->SetDirectory(0);
    harr->AddAtAndExpand(h1, i*4+1);//This histogram is the second of the 4-histos series and so on...

    TH2* h2 = new TH2F(Form("hXbeta%d", i),
      Form("#DeltaX vs #beta for pattID %d", i),10,-0.1, 1.1* TMath::Pi()/2,100,-30,30);
    h2->SetDirectory(0);
    harr->AddAtAndExpand(h2, i*4+2);

    TH2* h3 = new TH2F(Form("hZbeta%d", i),
      Form("#DeltaZ vs #beta for pattID %d", i),10,-0.1, 1.1* TMath::Pi()/2,100,-30,30);
    h3->SetDirectory(0);
    harr->AddAtAndExpand(h3, i*4+3);

  }

  printf("done!!\n\n");
}

TH2* GetHisto(Int_t pattID, Int_t kind, TObjArray* harr){

  if(!harr) harr=&histoArr ;
  TH2*  h=0;
  h=(TH2*)harr->At((pattID-LowerLimit)*4+kind);
  if (!h) {
    printf("Unknown histo id=%d\n",pattID); 
    exit(1);
  }
  return h;

}

void FitHistos(Int_t pattID, Float_t Freq, Int_t nPix, Int_t nRow, 
 Int_t nCol, TObjArray* harr, TCanvas* canvas, TCanvas* canvasbis){ //Fit the 2D histograms with gaussian along the Y and creates two 1D histograms,
                                                                    // with dX and dZ, bay a projection to the y axis and the fit with gaussian  

  static TF1* gs = new TF1("gs","gaus",-50,50);
  
  if(!harr) harr=&histoArr;

  //Creating the pads for the output
  
  canvas->Clear();
  canvas->cd();

  Float_t width = (1 - canvas->GetRightMargin() - canvas->GetLeftMargin() )/3;

  TPad* titlepad = new TPad("titlepad","",canvas->GetLeftMargin(),0.825,1-canvas->GetRightMargin(),0.95);
  titlepad->SetFillColor(kYellow);
  titlepad->Draw();
  TPad* pad1 = new TPad("pad1","",canvas->GetLeftMargin(),(0.8-canvas->GetBottomMargin())/2+canvas->GetBottomMargin(),canvas->GetLeftMargin()+width,0.8);
  pad1->Draw();
  TPad* pad2 = new TPad("pad2","",canvas->GetLeftMargin()+width,(0.8-canvas->GetBottomMargin())/2+canvas->GetBottomMargin(),canvas->GetLeftMargin()+2*width,0.8);
  pad2->Draw();
  TPad* pad3 = new TPad("pad3","",canvas->GetLeftMargin()+2*width,(0.8-canvas->GetBottomMargin())/2+canvas->GetBottomMargin(),1-canvas->GetRightMargin(),0.8);
  pad3->Draw();
  TPad* pad4 = new TPad("pad3","",canvas->GetLeftMargin(),canvas->GetBottomMargin(),canvas->GetLeftMargin()+width,(0.8-canvas->GetBottomMargin())/2+canvas->GetBottomMargin());
  pad4->Draw();
  TPad* pad5 = new TPad("pad5","",canvas->GetLeftMargin()+width,canvas->GetBottomMargin(),canvas->GetLeftMargin()+2*width,(0.8-canvas->GetBottomMargin())/2+canvas->GetBottomMargin());
  pad5->Draw();
  TPad* pad6 = new TPad("pad6","",canvas->GetLeftMargin()+2*width,canvas->GetBottomMargin(),1-canvas->GetRightMargin(),(0.8-canvas->GetBottomMargin())/2+canvas->GetBottomMargin());
  pad6->Draw();
  TPad* padPattern = new TPad("padPattern","",0.75,0.825,0.9,0.95);
  padPattern->Draw();
  
  //...................................................................................................

  // dX vs alpha
  
  TObjArray harrFXA;
  TH2* hXA = (TH2*)harr->At((pattID-LowerLimit)*4);
  hXA->GetYaxis()->SetTitle("#DeltaX, #mum");
  hXA->GetXaxis()->SetTitle("#alpha");
  hXA->SetStats(0);
  hXA->FitSlicesY(gs,0,-1,0,"qnr",&harrFXA);
  TH1* hXA_1 = (TH1*)harrFXA.At(1);
  hXA_1->SetStats(0);
  hXA_1->SetDirectory(0);
  hXA_1->GetYaxis()->SetTitle("#DeltaX_{#mu}(#DeltaZ_{#mu}), #mum");
  TH1* hXA_2 = (TH1*)harrFXA.At(2);
  hXA_2->SetStats(0);
  hXA_2->SetDirectory(0);
  hXA_2->GetYaxis()->SetTitle("#DeltaX_{#sigma}(#DeltaZ_{#sigma}), #mum");
  
  //............................................................................................................

  // dX

  Int_t fitStatusX=0;

  TH1* hdx = hXA->ProjectionY("hdx");
  hdx->GetXaxis()->SetTitle("#DeltaX, #mum");
  hdx->SetTitle(Form("#DeltaX for pattID %d",pattID));
  hdx->SetStats(0);
  pad3->cd();
  gs->SetParameters(hdx->GetMaximum(),hdx->GetMean(),hdx->GetRMS());
  if((hdx->GetEntries())<100) fitStatusX = hdx->Fit("gs","ql");
  else fitStatusX = hdx->Fit("gs","q");

  if(fitStatusX==0){
    DeltaXmean[pattID]= gs->GetParameter(1);
    DeltaXmeanErr[pattID]= gs->GetParError(1);
    DeltaXsigma[pattID]= gs->GetParameter(2);
    DeltaXsigmaErr[pattID]= gs->GetParError(2);
    Chi2x[pattID] = gs->GetChisquare();
    Int_t varNDFx = gs->GetNDF();
    if(varNDFx>=0)
    NDFx[pattID] = varNDFx;
    else{
      NDFx[pattID]=-1;
    }
  }
  else{
    DeltaXmean[pattID]=0;
    DeltaXmeanErr[pattID]=0;
    DeltaXsigma[pattID]=0;
    DeltaXsigmaErr[pattID]=0;
    Chi2x[pattID] = -1;   
  }

  pad3->cd();
  hdx->Draw();


  //.............................................................................................................

  
  // dZ vs alpha

  TObjArray harrFZA;
  TH2* hZA = (TH2*)harr->At((pattID-LowerLimit)*4+1);
  hZA->GetYaxis()->SetTitle("#DeltaZ, #mum");
  hZA->GetXaxis()->SetTitle("#alpha");
  hZA->SetStats(0);
  hZA->FitSlicesY(gs,0,-1,0,"qnr",&harrFZA);
  TH1* hZA_1 = (TH1*)harrFZA.At(1);
  hZA_1->SetMarkerColor(8);
  hZA_1->SetLineColor(8);
  hZA_1->SetStats(0);
  TH1* hZA_2 = (TH1*)harrFZA.At(2);
  hZA_2->SetMarkerColor(8);
  hZA_2->SetLineColor(8);
  hZA_2->SetStats(0);
  
  Double_t maxA_1 = TMath::Max(hXA_1->GetMaximum(),hZA_1->GetMaximum());
  Double_t minA_1 = TMath::Min(hXA_1->GetMinimum(),hZA_1->GetMinimum());
  Double_t addtorangeA_1 = (maxA_1-minA_1)*0.1;
  Double_t rangeA_1 = addtorangeA_1*10;

  Double_t maxA_2 = TMath::Max(hXA_2->GetMaximum(),hZA_2->GetMaximum());
  Double_t minA_2 = TMath::Min(hXA_2->GetMinimum(),hZA_2->GetMinimum());
  Double_t addtorangeA_2 = (maxA_2-minA_2)*0.1;
  Double_t rangeA_2 = addtorangeA_2*10;

  hXA_1->SetMaximum(maxA_1+addtorangeA_1);
  hXA_1->SetMinimum(minA_1-addtorangeA_1);

  hXA_2->SetMaximum(maxA_2+addtorangeA_2);
  hXA_2->SetMinimum(minA_2-addtorangeA_2);

  pad1->cd();
  hXA_1->Draw();
  hZA_1->Draw("same");
  TLegend* legA_1 = new TLegend(0.8*1.1* TMath::Pi()/2, maxA_1-0.2*rangeA_1, TMath::Pi()/2, maxA_1,"","");
  legA_1->AddEntry(hXA_1, "   #DeltaX_{#mu}", "l");
  legA_1->AddEntry(hZA_1, "   #DeltaZ_{#mu}", "l");
  legA_1->SetFillColor(0);
  legA_1->SetBorderSize(0);
  legA_1->Draw();
  pad2->cd();
  hXA_2->Draw();
  hZA_2->Draw("same");
  TLegend* legA_2 = new TLegend(0.8*1.1* TMath::Pi()/2, maxA_2-0.2*rangeA_2, TMath::Pi()/2, maxA_2,"","");
  legA_2->AddEntry(hXA_2, "   #DeltaX_{#sigma}", "l");
  legA_2->AddEntry((TObject*)0, "", "");
  legA_2->AddEntry(hZA_2, "   #DeltaZ_{#sigma}", "l");
  legA_2->SetFillColor(0);
  legA_2->SetBorderSize(0);
  legA_2->Draw();
 
  //...........................................................................................


  // dZ

  Int_t fitStatusZ=0;

  TH1* hdz = hZA->ProjectionY("hdz");
  hdz->GetXaxis()->SetTitle("#DeltaZ, #mum");
  hdz->SetTitle(Form("#DeltaZ for pattID %d",pattID));
  hdz->SetStats(0);
  pad6->cd();
  gs->SetParameters(hdz->GetMaximum(),hdz->GetMean(),hdz->GetRMS());
  if((hdz->GetEntries())<100) fitStatusZ = hdz->Fit("gs","ql");
  else fitStatusZ = hdz->Fit("gs","q");

  if(fitStatusZ==0){
    DeltaZmean[pattID]= gs->GetParameter(1);
    DeltaZmeanErr[pattID]= gs->GetParError(1);
    DeltaZsigma[pattID]= gs->GetParameter(2);
    DeltaZsigmaErr[pattID]= gs->GetParError(2);
    Chi2z[pattID] = gs->GetChisquare();
    Int_t varNDFz = gs->GetNDF();
    if(varNDFz>=0)
    NDFz[pattID] = varNDFz;
    else{
    NDFz[pattID]=-1;
    }
  }
  else{
    DeltaZmean[pattID]=0;
    DeltaZmeanErr[pattID]=0;
    DeltaZsigma[pattID]=0;
    DeltaZsigmaErr[pattID]=0;
    Chi2z[pattID] = -1;   
  }

  pad6->cd();
  hdz->Draw();

  //.............................................................................................................

  // dX vs beta

  TObjArray harrFXB;
  TH2* hXB = (TH2*)harr->At((pattID-LowerLimit)*4+2);
  hXB->GetYaxis()->SetTitle("#DeltaX, #mum");
  hXB->GetXaxis()->SetTitle("#beta");
  hXB->SetStats(0);
  hXB->FitSlicesY(gs,0,-1,0,"qnr",&harrFXB);
  TH1* hXB_1 = (TH1*)harrFXB.At(1);
  hXB_1->SetDirectory(0);
  hXB_1->SetStats(0);
  hXB_1->GetYaxis()->SetTitle("#DeltaX_{#mu}(#DeltaZ_{#mu}), #mum");
  TH1* hXB_2 = (TH1*)harrFXB.At(2);
  hXB_2->SetDirectory(0);
  hXB_2->SetStats(0);
  hXB_2->GetYaxis()->SetTitle("#DeltaX_{#sigma}(#DeltaZ_{#sigma}), #mum");
  
  //............................................................................................

  //dZ vs beta

  TObjArray harrFZB;
  TH2* hZB = (TH2*)harr->At((pattID-LowerLimit)*4+3);
  hZB->GetYaxis()->SetTitle("#DeltaZ, #mum");
  hZB->GetXaxis()->SetTitle("#alpha");
  hZB->SetStats(0);
  hZB->FitSlicesY(gs,0,-1,0,"qnr",&harrFZB);
  TH1* hZB_1 = (TH1*)harrFZB.At(1);
  hZB_1->SetMarkerColor(8);
  hZB_1->SetLineColor(8);
  hZB_1->SetStats(0);
  TH1* hZB_2 = (TH1*)harrFZB.At(2);
  hZB_2->SetMarkerColor(8);
  hZB_2->SetLineColor(8);
  hZB_2->SetStats(0);

  Double_t maxB_1 = TMath::Max(hXB_1->GetMaximum(),hZB_1->GetMaximum());
  Double_t minB_1 = TMath::Min(hXB_1->GetMinimum(),hZB_1->GetMinimum());
  Double_t addtorangeB_1 = (maxB_1-minB_1)*0.1;
  Double_t rangeB_1 = 10*addtorangeB_1;

  Double_t maxB_2 = TMath::Max(hXB_2->GetMaximum(),hZB_2->GetMaximum());
  Double_t minB_2 = TMath::Min(hXB_2->GetMinimum(),hZB_2->GetMinimum());
  Double_t addtorangeB_2 = (maxB_2-minB_2)*0.1;
  Double_t rangeB_2 = 10*addtorangeB_2;


  hXB_1->SetMaximum(maxB_1+addtorangeB_1);
  hXB_1->SetMinimum(minB_1-addtorangeB_1);

  hXB_2->SetMaximum(maxB_2+addtorangeB_2);
  hXB_2->SetMinimum(minB_2-addtorangeB_2);

  pad4->cd();
  hXB_1->Draw();
  hZB_1->Draw("same");
  TLegend* legB_1 = new TLegend(0.8*1.1* TMath::Pi()/2, maxB_1-0.2*rangeB_1, TMath::Pi()/2, maxB_1,"","");
  legB_1->AddEntry(hXA_1, "   #DeltaX_{#mu}", "l");
  legB_1->AddEntry((TObject*)0, "", "");
  legB_1->AddEntry(hZA_1, "   #DeltaZ_{#mu}", "l");
  legB_1->SetFillColor(0);
  legB_1->SetBorderSize(0);
  legB_1->Draw();
  pad5->cd();
  hXB_2->Draw();
  hZB_2->Draw("same");
  TLegend* legB_2 = new TLegend(0.8*1.1* TMath::Pi()/2, maxB_2-0.2*rangeB_2, TMath::Pi()/2, maxB_2,"","");
  legB_2->AddEntry(hXB_2, "   #DeltaX_{#sigma}", "l");
  legB_2->AddEntry((TObject*)0, "", "");
  legB_2->AddEntry(hZB_2, "   #DeltaZ_{#sigma}", "l");
  legB_2->SetFillColor(0);
  legB_2->SetBorderSize(0);
  legB_2->Draw();
  
  //cnv->Print("patt0.gif");

  //..................................................................................................................

  // Drawing the title

  const char* text = Form("pattID: %d   freq: %f   nPix: %d   nRow: %d   nCol: %d  xCOG (fraction): %0.2f + (%0.2f)   zCOG (fraction): %0.2f + (%0.2f)",
    pattID,Freq,nPix,nRow,nCol, (*xCentrePix)[pattID],(*xCentreShift)[pattID],(*zCentrePix)[pattID],
    (*zCentreShift)[pattID]);
  const char* text1 = Form("#DeltaX_{#mu}: (%.2f #pm %.2f) #mum     #DeltaX_{#sigma}: (%.2f #pm %.2f) #mum     #DeltaX_{MC-centre}: %.2f #mum     #chi^{2}/NDF: %.2f / %d",
    DeltaXmean[pattID],DeltaXmeanErr[pattID],DeltaXsigma[pattID],DeltaXsigmaErr[pattID], DeltaXmean[pattID]+(*xCentreShift)[pattID]*pitchX, Chi2x[pattID], NDFx[pattID]);
  const char* text2 = Form("#DeltaZ_{#mu}: (%.2f #pm %.2f) #mum     #DeltaZ_{#sigma}: (%.2f #pm %.2f) #mum     #DeltaZ_{MC-centre}: %.2f #mum     #chi^{2}/NDF: %.2f / %d",
    DeltaZmean[pattID],DeltaZmeanErr[pattID],DeltaZsigma[pattID],DeltaZsigmaErr[pattID], DeltaZmean[pattID]+(*zCentreShift)[pattID]*pitchZ, Chi2z[pattID], NDFz[pattID]);
  TLatex title;
  title.SetTextSize(0.1);
  title.SetTextAlign(12);
  titlepad->cd();
  title.DrawLatex(0.085,0.75,text);
  title.DrawLatex(0.085,0.5,text1);
  title.DrawLatex(0.085,0.25,text2);


  //Drawing the pattern

  TH2* patternIm = new TH2F("patternIm","", nCol,-0.5,nCol-0.5,nRow,-0.5,nRow-0.5);
  for (Int_t ir=0; ir<nRow; ir++) {
    for (Int_t ic=0; ic<nCol; ic++) {
      if(((TBits*)(*pattDB)[pattID])->TestBitNumber(ir*nCol+ic)){
        patternIm->Fill(ic,ir);
      }
    }
  }

  patternIm->SetStats(0);
  padPattern->cd();
  patternIm->Draw("Acol");

  //Drawing vertical lines on the pattern

  TObjArray vertlinesarray;
  for(int i=2; i<=nCol; i++){
    TLine* vline = new TLine(patternIm->GetXaxis()->GetBinLowEdge(i),patternIm->GetYaxis()->GetBinLowEdge(1),
      patternIm->GetXaxis()->GetBinLowEdge(i),patternIm->GetYaxis()->GetBinLowEdge(nRow+1));
    vertlinesarray.AddAtAndExpand(vline,i);
  }

  for(int i=2; i<=nCol; i++){
    TLine* v1 = (TLine*)vertlinesarray.At(i);
    padPattern->cd();
    v1->Draw();
  }

  //Drawing horizontal lines on the pattern
  
  TObjArray horlinesarray;
  for(int i=2; i<=nRow; i++){
    TLine* hline = new TLine(patternIm->GetXaxis()->GetBinLowEdge(1),patternIm->GetYaxis()->GetBinLowEdge(i),
      patternIm->GetXaxis()->GetBinLowEdge(nCol+1),patternIm->GetYaxis()->GetBinLowEdge(i));
    horlinesarray.AddAtAndExpand(hline,i);
  }

  for(int i=2; i<=nRow; i++){
    TLine* hor1 = (TLine*)horlinesarray.At(i);
    padPattern->cd();
    hor1->Draw();
  }

  //Drawing MChit and COG

  TMarker* COG = new TMarker((*zCentrePix)[pattID]+(*zCentreShift)[pattID]-0.5,
    (*xCentrePix)[pattID]+(*xCentreShift)[pattID]-0.5,20);
  COG->Draw();

  TMarker* MChit = new TMarker((*zCentrePix)[pattID]+(*zCentreShift)[pattID]+(DeltaZmean[pattID])/pitchZ-0.5, //20 is the pixel pitch
    (*xCentrePix)[pattID]+(*xCentreShift)[pattID]+(DeltaXmean[pattID])/pitchX-0.5,29);
  MChit->SetMarkerColor(kWhite);
  MChit->Draw();

  canvas->Print("angles.pdf");
  canvas->Clear();

  if(pattID<number2dhisto){

    canvasbis->cd();
    TPad* titlepadbis = new TPad("titlepadbis","",canvas->GetLeftMargin(),0.825,1-canvas->GetRightMargin(),0.95);
    titlepadbis->SetFillColor(kYellow);
    titlepadbis->Draw();
    TPad* pad1bis = new TPad("pad1bis","",canvasbis->GetLeftMargin(),(0.8-canvasbis->GetBottomMargin())/2+canvasbis->GetBottomMargin(),0.5,0.8);
    pad1bis->Draw();
    TPad* pad2bis = new TPad("pad2bis","",0.5,(0.8-canvasbis->GetBottomMargin())/2+canvasbis->GetBottomMargin(),1-canvasbis->GetRightMargin(),0.8);
    pad2bis->Draw();
    TPad* pad3bis = new TPad("pad3bis","",canvasbis->GetLeftMargin(),canvasbis->GetBottomMargin(),0.5,(0.8-canvasbis->GetBottomMargin())/2+canvasbis->GetBottomMargin());
    pad3bis->Draw();
    TPad* pad4bis = new TPad("pad4bis","",0.5,canvasbis->GetBottomMargin(),1-canvasbis->GetRightMargin(),(0.8-canvasbis->GetBottomMargin())/2+canvasbis->GetBottomMargin());
    pad4bis->Draw();
    TPad* padPatternbis = new TPad("padPatternbis","",0.75,0.825,0.9,0.95);
    padPatternbis->Draw();

    titlepadbis->cd();
    title.DrawLatex(0.085,0.75,text);
    title.DrawLatex(0.085,0.5,text1);
    title.DrawLatex(0.085,0.25,text2);
    pad1bis->cd();
    hXA->Draw("colz");
    pad2bis->cd();
    hXB->Draw("colz");
    pad3bis->cd();
    hZA->Draw("colz");
    pad4bis->cd();
    hZB->Draw("colz");
    padPatternbis->cd();
    patternIm->Draw("Acol");
    for(int i=2; i<=nCol; i++){
      TLine* v1 = (TLine*)vertlinesarray.At(i);
      padPatternbis->cd();
      v1->Draw();
    }
    for(int i=2; i<=nRow; i++){
      TLine* hor1 = (TLine*)horlinesarray.At(i);
      padPatternbis->cd();
      hor1->Draw();
    }
    COG->Draw();
    MChit->Draw();
    canvasbis->Print("angles2D.pdf");
    canvasbis->Clear();
  }

  delete patternIm;
  delete COG;
  delete MChit;

  horlinesarray.Delete();
  vertlinesarray.Delete();

}

void UpDateDB(const char* outDBFile){

  printf("\n\n\nStoring data in the DataBase\n\n\n");

  TString outDBFileName = outDBFile;
  if (outDBFileName.IsNull()) outDBFileName = "clusterTopology2.root";

  TVectorF arrDeltaZmean(nPatterns);
  TVectorF arrDeltaZmeanErr(nPatterns);
  TVectorF arrDeltaXmean(nPatterns);
  TVectorF arrDeltaXmeanErr(nPatterns);
  TVectorF arrDeltaZsigma(nPatterns);
  TVectorF arrDeltaZsigmaErr(nPatterns);
  TVectorF arrDeltaXsigma(nPatterns);
  TVectorF arrDeltaXsigmaErr(nPatterns);
  TVectorF arrChi2x(nPatterns);
  TVectorF arrNDFx(nPatterns);
  TVectorF arrChi2z(nPatterns);
  TVectorF arrNDFz(nPatterns);

  for(Int_t ID=0; ID<nPatterns; ID++){

    printf("Processing pattern %d... ", ID);

    arrDeltaZmean[ID]=DeltaZmean[ID];
    arrDeltaZmeanErr[ID]=DeltaZmeanErr[ID];
    arrDeltaXmean[ID]=DeltaXmean[ID];
    arrDeltaXmeanErr[ID]=DeltaXmeanErr[ID];
    arrDeltaZsigma[ID]=DeltaZsigma[ID];
    arrDeltaZsigmaErr[ID]=DeltaZsigmaErr[ID];
    arrDeltaXsigma[ID]=DeltaXsigma[ID];
    arrDeltaXsigmaErr[ID]=DeltaXsigmaErr[ID];
    arrChi2x[ID]=Chi2x[ID];
    arrNDFx[ID]=NDFx[ID];
    arrChi2z[ID]=Chi2z[ID];
    arrNDFz[ID]=NDFz[ID];

    printf("done!!\n\n");
  }

  TFile* flDB = TFile::Open(outDBFileName.Data(), "recreate");
  flDB->WriteObject(pattDB,"TopDB","kSingleKey");
  flDB->WriteObject(NPix,"NPix","kSingleKey");
  flDB->WriteObject(NRow,"NRow","kSingleKey");
  flDB->WriteObject(NCol,"NCol","kSingleKey");
  flDB->WriteObject(pattFR, "TopFreq","kSingleKey");
  flDB->WriteObject(xCentrePix,"xCOG","kSingleKey");
  flDB->WriteObject(xCentreShift,"xShift","kSingleKey");
  flDB->WriteObject(zCentrePix,"zCOG","kSingleKey");
  flDB->WriteObject(zCentreShift,"zShift","kSingleKey");
  flDB->WriteObject(&arrDeltaZmean,"DeltaZmean","kSingleKey");
  flDB->WriteObject(&arrDeltaZmeanErr,"DeltaZmeanErr","kSingleKey");
  flDB->WriteObject(&arrDeltaXmean,"DeltaXmean","kSingleKey");
  flDB->WriteObject(&arrDeltaXmeanErr,"DeltaXmeanErr","kSingleKey");
  flDB->WriteObject(&arrDeltaZsigma,"DeltaZsigma","kSingleKey");
  flDB->WriteObject(&arrDeltaZsigmaErr,"DeltaZsigmaErr","kSingleKey");
  flDB->WriteObject(&arrDeltaXsigma,"DeltaXsigma","kSingleKey");
  flDB->WriteObject(&arrDeltaXsigmaErr,"DeltaXsigmaErr","kSingleKey");
  flDB->WriteObject(&arrChi2x,"Chi2x","kSingleKey");
  flDB->WriteObject(&arrChi2z,"Chi2z","kSingleKey");
  flDB->WriteObject(&arrNDFx,"NDFx","kSingleKey");
  flDB->WriteObject(&arrNDFz,"NDFz","kSingleKey");
  //
  flDB->Close();
  delete flDB;

  printf("\n\nDB Complete!!\n\n");
 complete1.C:1
 complete1.C:2
 complete1.C:3
 complete1.C:4
 complete1.C:5
 complete1.C:6
 complete1.C:7
 complete1.C:8
 complete1.C:9
 complete1.C:10
 complete1.C:11
 complete1.C:12
 complete1.C:13
 complete1.C:14
 complete1.C:15
 complete1.C:16
 complete1.C:17
 complete1.C:18
 complete1.C:19
 complete1.C:20
 complete1.C:21
 complete1.C:22
 complete1.C:23
 complete1.C:24
 complete1.C:25
 complete1.C:26
 complete1.C:27
 complete1.C:28
 complete1.C:29
 complete1.C:30
 complete1.C:31
 complete1.C:32
 complete1.C:33
 complete1.C:34
 complete1.C:35
 complete1.C:36
 complete1.C:37
 complete1.C:38
 complete1.C:39
 complete1.C:40
 complete1.C:41
 complete1.C:42
 complete1.C:43
 complete1.C:44
 complete1.C:45
 complete1.C:46
 complete1.C:47
 complete1.C:48
 complete1.C:49
 complete1.C:50
 complete1.C:51
 complete1.C:52
 complete1.C:53
 complete1.C:54
 complete1.C:55
 complete1.C:56
 complete1.C:57
 complete1.C:58
 complete1.C:59
 complete1.C:60
 complete1.C:61
 complete1.C:62
 complete1.C:63
 complete1.C:64
 complete1.C:65
 complete1.C:66
 complete1.C:67
 complete1.C:68
 complete1.C:69
 complete1.C:70
 complete1.C:71
 complete1.C:72
 complete1.C:73
 complete1.C:74
 complete1.C:75
 complete1.C:76
 complete1.C:77
 complete1.C:78
 complete1.C:79
 complete1.C:80
 complete1.C:81
 complete1.C:82
 complete1.C:83
 complete1.C:84
 complete1.C:85
 complete1.C:86
 complete1.C:87
 complete1.C:88
 complete1.C:89
 complete1.C:90
 complete1.C:91
 complete1.C:92
 complete1.C:93
 complete1.C:94
 complete1.C:95
 complete1.C:96
 complete1.C:97
 complete1.C:98
 complete1.C:99
 complete1.C:100
 complete1.C:101
 complete1.C:102
 complete1.C:103
 complete1.C:104
 complete1.C:105
 complete1.C:106
 complete1.C:107
 complete1.C:108
 complete1.C:109
 complete1.C:110
 complete1.C:111
 complete1.C:112
 complete1.C:113
 complete1.C:114
 complete1.C:115
 complete1.C:116
 complete1.C:117
 complete1.C:118
 complete1.C:119
 complete1.C:120
 complete1.C:121
 complete1.C:122
 complete1.C:123
 complete1.C:124
 complete1.C:125
 complete1.C:126
 complete1.C:127
 complete1.C:128
 complete1.C:129
 complete1.C:130
 complete1.C:131
 complete1.C:132
 complete1.C:133
 complete1.C:134
 complete1.C:135
 complete1.C:136
 complete1.C:137
 complete1.C:138
 complete1.C:139
 complete1.C:140
 complete1.C:141
 complete1.C:142
 complete1.C:143
 complete1.C:144
 complete1.C:145
 complete1.C:146
 complete1.C:147
 complete1.C:148
 complete1.C:149
 complete1.C:150
 complete1.C:151
 complete1.C:152
 complete1.C:153
 complete1.C:154
 complete1.C:155
 complete1.C:156
 complete1.C:157
 complete1.C:158
 complete1.C:159
 complete1.C:160
 complete1.C:161
 complete1.C:162
 complete1.C:163
 complete1.C:164
 complete1.C:165
 complete1.C:166
 complete1.C:167
 complete1.C:168
 complete1.C:169
 complete1.C:170
 complete1.C:171
 complete1.C:172
 complete1.C:173
 complete1.C:174
 complete1.C:175
 complete1.C:176
 complete1.C:177
 complete1.C:178
 complete1.C:179
 complete1.C:180
 complete1.C:181
 complete1.C:182
 complete1.C:183
 complete1.C:184
 complete1.C:185
 complete1.C:186
 complete1.C:187
 complete1.C:188
 complete1.C:189
 complete1.C:190
 complete1.C:191
 complete1.C:192
 complete1.C:193
 complete1.C:194
 complete1.C:195
 complete1.C:196
 complete1.C:197
 complete1.C:198
 complete1.C:199
 complete1.C:200
 complete1.C:201
 complete1.C:202
 complete1.C:203
 complete1.C:204
 complete1.C:205
 complete1.C:206
 complete1.C:207
 complete1.C:208
 complete1.C:209
 complete1.C:210
 complete1.C:211
 complete1.C:212
 complete1.C:213
 complete1.C:214
 complete1.C:215
 complete1.C:216
 complete1.C:217
 complete1.C:218
 complete1.C:219
 complete1.C:220
 complete1.C:221
 complete1.C:222
 complete1.C:223
 complete1.C:224
 complete1.C:225
 complete1.C:226
 complete1.C:227
 complete1.C:228
 complete1.C:229
 complete1.C:230
 complete1.C:231
 complete1.C:232
 complete1.C:233
 complete1.C:234
 complete1.C:235
 complete1.C:236
 complete1.C:237
 complete1.C:238
 complete1.C:239
 complete1.C:240
 complete1.C:241
 complete1.C:242
 complete1.C:243
 complete1.C:244
 complete1.C:245
 complete1.C:246
 complete1.C:247
 complete1.C:248
 complete1.C:249
 complete1.C:250
 complete1.C:251
 complete1.C:252
 complete1.C:253
 complete1.C:254
 complete1.C:255
 complete1.C:256
 complete1.C:257
 complete1.C:258
 complete1.C:259
 complete1.C:260
 complete1.C:261
 complete1.C:262
 complete1.C:263
 complete1.C:264
 complete1.C:265
 complete1.C:266
 complete1.C:267
 complete1.C:268
 complete1.C:269
 complete1.C:270
 complete1.C:271
 complete1.C:272
 complete1.C:273
 complete1.C:274
 complete1.C:275
 complete1.C:276
 complete1.C:277
 complete1.C:278
 complete1.C:279
 complete1.C:280
 complete1.C:281
 complete1.C:282
 complete1.C:283
 complete1.C:284
 complete1.C:285
 complete1.C:286
 complete1.C:287
 complete1.C:288
 complete1.C:289
 complete1.C:290
 complete1.C:291
 complete1.C:292
 complete1.C:293
 complete1.C:294
 complete1.C:295
 complete1.C:296
 complete1.C:297
 complete1.C:298
 complete1.C:299
 complete1.C:300
 complete1.C:301
 complete1.C:302
 complete1.C:303
 complete1.C:304
 complete1.C:305
 complete1.C:306
 complete1.C:307
 complete1.C:308
 complete1.C:309
 complete1.C:310
 complete1.C:311
 complete1.C:312
 complete1.C:313
 complete1.C:314
 complete1.C:315
 complete1.C:316
 complete1.C:317
 complete1.C:318
 complete1.C:319
 complete1.C:320
 complete1.C:321
 complete1.C:322
 complete1.C:323
 complete1.C:324
 complete1.C:325
 complete1.C:326
 complete1.C:327
 complete1.C:328
 complete1.C:329
 complete1.C:330
 complete1.C:331
 complete1.C:332
 complete1.C:333
 complete1.C:334
 complete1.C:335
 complete1.C:336
 complete1.C:337
 complete1.C:338
 complete1.C:339
 complete1.C:340
 complete1.C:341
 complete1.C:342
 complete1.C:343
 complete1.C:344
 complete1.C:345
 complete1.C:346
 complete1.C:347
 complete1.C:348
 complete1.C:349
 complete1.C:350
 complete1.C:351
 complete1.C:352
 complete1.C:353
 complete1.C:354
 complete1.C:355
 complete1.C:356
 complete1.C:357
 complete1.C:358
 complete1.C:359
 complete1.C:360
 complete1.C:361
 complete1.C:362
 complete1.C:363
 complete1.C:364
 complete1.C:365
 complete1.C:366
 complete1.C:367
 complete1.C:368
 complete1.C:369
 complete1.C:370
 complete1.C:371
 complete1.C:372
 complete1.C:373
 complete1.C:374
 complete1.C:375
 complete1.C:376
 complete1.C:377
 complete1.C:378
 complete1.C:379
 complete1.C:380
 complete1.C:381
 complete1.C:382
 complete1.C:383
 complete1.C:384
 complete1.C:385
 complete1.C:386
 complete1.C:387
 complete1.C:388
 complete1.C:389
 complete1.C:390
 complete1.C:391
 complete1.C:392
 complete1.C:393
 complete1.C:394
 complete1.C:395
 complete1.C:396
 complete1.C:397
 complete1.C:398
 complete1.C:399
 complete1.C:400
 complete1.C:401
 complete1.C:402
 complete1.C:403
 complete1.C:404
 complete1.C:405
 complete1.C:406
 complete1.C:407
 complete1.C:408
 complete1.C:409
 complete1.C:410
 complete1.C:411
 complete1.C:412
 complete1.C:413
 complete1.C:414
 complete1.C:415
 complete1.C:416
 complete1.C:417
 complete1.C:418
 complete1.C:419
 complete1.C:420
 complete1.C:421
 complete1.C:422
 complete1.C:423
 complete1.C:424
 complete1.C:425
 complete1.C:426
 complete1.C:427
 complete1.C:428
 complete1.C:429
 complete1.C:430
 complete1.C:431
 complete1.C:432
 complete1.C:433
 complete1.C:434
 complete1.C:435
 complete1.C:436
 complete1.C:437
 complete1.C:438
 complete1.C:439
 complete1.C:440
 complete1.C:441
 complete1.C:442
 complete1.C:443
 complete1.C:444
 complete1.C:445
 complete1.C:446
 complete1.C:447
 complete1.C:448
 complete1.C:449
 complete1.C:450
 complete1.C:451
 complete1.C:452
 complete1.C:453
 complete1.C:454
 complete1.C:455
 complete1.C:456
 complete1.C:457
 complete1.C:458
 complete1.C:459
 complete1.C:460
 complete1.C:461
 complete1.C:462
 complete1.C:463
 complete1.C:464
 complete1.C:465
 complete1.C:466
 complete1.C:467
 complete1.C:468
 complete1.C:469
 complete1.C:470
 complete1.C:471
 complete1.C:472
 complete1.C:473
 complete1.C:474
 complete1.C:475
 complete1.C:476
 complete1.C:477
 complete1.C:478
 complete1.C:479
 complete1.C:480
 complete1.C:481
 complete1.C:482
 complete1.C:483
 complete1.C:484
 complete1.C:485
 complete1.C:486
 complete1.C:487
 complete1.C:488
 complete1.C:489
 complete1.C:490
 complete1.C:491
 complete1.C:492
 complete1.C:493
 complete1.C:494
 complete1.C:495
 complete1.C:496
 complete1.C:497
 complete1.C:498
 complete1.C:499
 complete1.C:500
 complete1.C:501
 complete1.C:502
 complete1.C:503
 complete1.C:504
 complete1.C:505
 complete1.C:506
 complete1.C:507
 complete1.C:508
 complete1.C:509
 complete1.C:510
 complete1.C:511
 complete1.C:512
 complete1.C:513
 complete1.C:514
 complete1.C:515
 complete1.C:516
 complete1.C:517
 complete1.C:518
 complete1.C:519
 complete1.C:520
 complete1.C:521
 complete1.C:522
 complete1.C:523
 complete1.C:524
 complete1.C:525
 complete1.C:526
 complete1.C:527
 complete1.C:528
 complete1.C:529
 complete1.C:530
 complete1.C:531
 complete1.C:532
 complete1.C:533
 complete1.C:534
 complete1.C:535
 complete1.C:536
 complete1.C:537
 complete1.C:538
 complete1.C:539
 complete1.C:540
 complete1.C:541
 complete1.C:542
 complete1.C:543
 complete1.C:544
 complete1.C:545
 complete1.C:546
 complete1.C:547
 complete1.C:548
 complete1.C:549
 complete1.C:550
 complete1.C:551
 complete1.C:552
 complete1.C:553
 complete1.C:554
 complete1.C:555
 complete1.C:556
 complete1.C:557
 complete1.C:558
 complete1.C:559
 complete1.C:560
 complete1.C:561
 complete1.C:562
 complete1.C:563
 complete1.C:564
 complete1.C:565
 complete1.C:566
 complete1.C:567
 complete1.C:568
 complete1.C:569
 complete1.C:570
 complete1.C:571
 complete1.C:572
 complete1.C:573
 complete1.C:574
 complete1.C:575
 complete1.C:576
 complete1.C:577
 complete1.C:578
 complete1.C:579
 complete1.C:580
 complete1.C:581
 complete1.C:582
 complete1.C:583
 complete1.C:584
 complete1.C:585
 complete1.C:586
 complete1.C:587
 complete1.C:588
 complete1.C:589
 complete1.C:590
 complete1.C:591
 complete1.C:592
 complete1.C:593
 complete1.C:594
 complete1.C:595
 complete1.C:596
 complete1.C:597
 complete1.C:598
 complete1.C:599
 complete1.C:600
 complete1.C:601
 complete1.C:602
 complete1.C:603
 complete1.C:604
 complete1.C:605
 complete1.C:606
 complete1.C:607
 complete1.C:608
 complete1.C:609
 complete1.C:610
 complete1.C:611
 complete1.C:612
 complete1.C:613
 complete1.C:614
 complete1.C:615
 complete1.C:616
 complete1.C:617
 complete1.C:618
 complete1.C:619
 complete1.C:620
 complete1.C:621
 complete1.C:622
 complete1.C:623
 complete1.C:624
 complete1.C:625
 complete1.C:626
 complete1.C:627
 complete1.C:628
 complete1.C:629
 complete1.C:630
 complete1.C:631
 complete1.C:632
 complete1.C:633
 complete1.C:634
 complete1.C:635
 complete1.C:636
 complete1.C:637
 complete1.C:638
 complete1.C:639
 complete1.C:640
 complete1.C:641
 complete1.C:642
 complete1.C:643
 complete1.C:644
 complete1.C:645
 complete1.C:646
 complete1.C:647
 complete1.C:648
 complete1.C:649
 complete1.C:650
 complete1.C:651
 complete1.C:652
 complete1.C:653
 complete1.C:654
 complete1.C:655
 complete1.C:656
 complete1.C:657
 complete1.C:658
 complete1.C:659
 complete1.C:660
 complete1.C:661
 complete1.C:662
 complete1.C:663
 complete1.C:664
 complete1.C:665
 complete1.C:666
 complete1.C:667
 complete1.C:668
 complete1.C:669
 complete1.C:670
 complete1.C:671
 complete1.C:672
 complete1.C:673
 complete1.C:674
 complete1.C:675
 complete1.C:676
 complete1.C:677
 complete1.C:678
 complete1.C:679
 complete1.C:680
 complete1.C:681
 complete1.C:682
 complete1.C:683
 complete1.C:684
 complete1.C:685
 complete1.C:686
 complete1.C:687
 complete1.C:688
 complete1.C:689
 complete1.C:690
 complete1.C:691
 complete1.C:692
 complete1.C:693
 complete1.C:694
 complete1.C:695
 complete1.C:696
 complete1.C:697
 complete1.C:698
 complete1.C:699
 complete1.C:700
 complete1.C:701
 complete1.C:702
 complete1.C:703
 complete1.C:704
 complete1.C:705
 complete1.C:706
 complete1.C:707
 complete1.C:708
 complete1.C:709
 complete1.C:710
 complete1.C:711
 complete1.C:712
 complete1.C:713
 complete1.C:714
 complete1.C:715
 complete1.C:716
 complete1.C:717
 complete1.C:718
 complete1.C:719
 complete1.C:720
 complete1.C:721
 complete1.C:722
 complete1.C:723
 complete1.C:724
 complete1.C:725
 complete1.C:726
 complete1.C:727
 complete1.C:728
 complete1.C:729
 complete1.C:730
 complete1.C:731
 complete1.C:732
 complete1.C:733
 complete1.C:734
 complete1.C:735
 complete1.C:736
 complete1.C:737
 complete1.C:738
 complete1.C:739
 complete1.C:740
 complete1.C:741
 complete1.C:742
 complete1.C:743
 complete1.C:744
 complete1.C:745
 complete1.C:746
 complete1.C:747
 complete1.C:748
 complete1.C:749
 complete1.C:750
 complete1.C:751
 complete1.C:752
 complete1.C:753
 complete1.C:754
 complete1.C:755
 complete1.C:756
 complete1.C:757
 complete1.C:758
 complete1.C:759
 complete1.C:760
 complete1.C:761
 complete1.C:762
 complete1.C:763
 complete1.C:764
 complete1.C:765
 complete1.C:766
 complete1.C:767
 complete1.C:768
 complete1.C:769
 complete1.C:770