ROOT logo
/*

Macro to perform fits of the Laser Central electrode data
Several fit methods implemented

0. RebuildCE("ce.root","pul.root"); - rebuild data from the scratch
                                    - the data will be storered in file inname
                                    
1. RebuildData() - transform arbitrary layout of the Input data to the internal format
   StoreData();  - The data tree expected in file inname (see variable bellow)
   StoreTree();  - Modify inname and xxside and tcor in order to transform data


2. MakeFit();    - Make a fit of the data - already in internal format    
   StoreData();  - Store
   StoreTree();

3. MakeRes();    - Make the final calibration  + combination of different components

4. LoadViewer(); - Browse the fit parameters
 

.x ~/rootlogon.C
gSystem->AddIncludePath("-I$ALICE_ROOT/TPC -I$ALICE_ROOT/STAT");
gSystem->Load("libSTAT.so");
.L $ALICE_ROOT/TPC/CalibMacros/AnalyzeLaserCE.C+

// setup aliases
qaside="CE_Q";
taside="CE_T";
raside="CE_RMS";
qcside="CE_Q";
tcside="CE_T";
rcside="CE_RMS";




Calibration viewer variables:

Result  -  resulting correction
out     -  outlyers not used for fit
tcor    -  offset specified by user before fitting
timeF1  -  sector local fit - plane
timeF2  -  sector local fit - parabola
timeIn  -  input times
qIn     -  input charge
out     -  outlyers not used for fit
tcor    -  offset specified by user before fitting
timeF1  -  sector time local fit - plane
timeF2  -  sector time local fit - parabola
qF1     -  sector q local fit    - plane
qF2     -  sector q local fit    - parabola
// fitted values
//
ffit0   - base fit
ffit1   - adding common shifts    - alpha dependendent
ffit2   - adding opposite shifts  - alpha dependent
//
fGXY    -  global fit parameter - XY
fInOut  -  global fit parameter - inner-outer sector matching
fLX     -  global LX  dependence
//
Gloabl fit o consist of
-fGXY~-fLX~-fTL~-fOff~:ffit0~

//
// Control variable - check results
//
//
ffit2~-(timeIn~):lx~  - fit value minus input time 

result cosntruction:
(timeF2~-ffit2~+fTL~+fInOut~):Result~
//
timeF2~-Result~:ffit2~-fTL~-fInOut~


*/
#include <fstream>
#include "TString.h"
#include "TSystem.h"
#include "TTree.h"
#include "TEntryList.h"
#include "TCut.h"
#include "TStatToolkit.h"
#include "AliTPCCalibViewer.h"
#include "AliTPCCalibViewerGUI.h"
#include "AliTPCPreprocessorOnline.h"
#include "AliTPCCalibCE.h"
#include "AliTPCCalibPulser.h"
#include "TStopwatch.h"
//
//Define interesting variables - file names
//
char * inname = "treeCE.root";  // input file with tree
//
// variable name definition in input tree - change it according the input
//
TString qaside("CE_Q");
TString taside("CE_T");
TString raside("CE_RMS");
TString qcside("CE_Q");
TString tcside("CE_T");
TString rcside("CE_RMS");

//
// correction variable - usually Pulser time
//
TString tcor("-pulCorr");

//
char * fname  = "treefitCE.root";       // output file with tree
char * oname  = "fitCE.root";           // output file with CalPads fit 

//
//
// Input CalPads
//
AliTPCCalPad *calPadIn  = 0;            // original time pad
AliTPCCalPad *calPadF1  = 0;            // original time pad - fit plane
AliTPCCalPad *calPadF2  = 0;            // original time pad - fit parabola
AliTPCCalPad *calPadQIn = 0;            // original Q pad
AliTPCCalPad *calPadQF1 = 0;            // original Q pad
AliTPCCalPad *calPadQF2 = 0;            // original Q pad

AliTPCCalPad *calPadCor = 0;            // base correction CalPad
AliTPCCalPad *calPadOut = 0;            // outlyer CalPad
//
// cuts
//
const Float_t tThr=0.3;                // max diff in the sector
const Float_t qThr0=0.5;               // max Q diff in the sector
const Float_t qThr1=2;                 // max Q diff in the sector

//
//
// fit Cal Pads
AliTPCCalPad *calPad0   = 0;            // global fit 0 - base
AliTPCCalPad *calPad1   = 0;            // global fit 1 - common behavior rotation -A-C
AliTPCCalPad *calPad2   = 0;            // gloabl fit 2 - CE missalign rotation     A-C
//
AliTPCCalPad *calPadInOut = 0;          // misaalign in-out
AliTPCCalPad *calPadLX    = 0;          // local x missalign
AliTPCCalPad *calPadTL   = 0;           // tan 
AliTPCCalPad *calPadQ     = 0;          // time (q)  correction
AliTPCCalPad *calPadGXY   = 0;          // global XY missalign (drift velocity grad) 
AliTPCCalPad *calPadOff   = 0;          // normalization offset fit
AliTPCCalPad *calPadRes   = 0;          // final calibration  

TObjString strFit0="";                     // string fit 0
TObjString strFit1="";                     // string fit 1
TObjString strFit2="";                     // string fit 2
TVectorD vecFit0;                       // parameters fit 0
TVectorD vecFit1;                       // parameters fit 1
TVectorD vecFit2;                       // parameters fit 2
TEntryList  *elist=0;                     // event list -slection criterias
//
// working variables
//
AliTPCCalibViewerGUI * viewer=0;   //viewerGUI
AliTPCCalibViewer    *makePad=0;   //viewer
TTree * tree=0;                    // working tree

void LoadViewer();
void RebuildData();   // transform the input data to the fit format 
void MakeFit();       // make fits
void MakeFitPulser(); // make fit for pulser correction data
//
//   internal functions
//
void MakeAliases0();  // Make Aliases 0  - for user tree
void MakeAliases1();  // Make Aliases 1  - for default tree   
void LoadData();      // Load data
void StoreData();     // store current data
void StoreTree();     // store fit data in the output tree



void AnalyzeLaser(){
  //
  //
  //
  LoadViewer();
  MakeAliases1();
}

void MakeFitPulser(){
  TStatToolkit stat;
  Int_t npoints;
  Double_t chi2;
  TVectorD vec0,vec1,vec2;
  TMatrixD mat;
  TString fitvar="P_T.fElements";
  TCut out("abs(P_T.fElements/P_T_Mean.fElements-1.001)<.002");
  TCut fitadd("P_T.fElements>446");
  TString fstring="";
  fstring+="(sector>=0&&sector<9)++";
  fstring+="(sector>=9&&sector<18)++";
  fstring+="(sector>=18&&sector<27)++";
  fstring+="(sector>=27&&sector<36)++";
  fstring+="(sector>=36&&sector<45)++";
  fstring+="(sector>=45&&sector<54)++";
  fstring+="(sector>=54&&sector<63)++";
  fstring+="(sector>=63&&sector<72)";

  TString *pulOff =stat.FitPlane(tree,fitvar.Data(),fstring.Data(),(out+fitadd).GetTitle(),chi2,npoints,vec0,mat);

  tree->SetAlias("pul0",pulOff->Data());
  tree->SetAlias("pulCorr","P_T.fElements-pul0");
  tree->SetAlias("pulOut",out.GetTitle());
}

void MakeFit(){
  //
  //
  LoadData();
  //LoadViewer();
  //
  makePad = new AliTPCCalibViewer(fname);
  tree = makePad->GetTree();
  MakeAliases1();
  //
  //  MakeFitPulser();
  TStatToolkit stat;
  Int_t npoints;
  Double_t chi2;
  TMatrixD mat;
  TString fstring="";
  //
  //Basic  correction
  //
  fstring+="side++";        // offset on 2 different sides              //1
  //fstring+="(1/qp)++";      // Q -threshold effect correction           //2
  //fstring+="(qp)++";        // Q -threshold effect correction           //3
  fstring+="(inn)++";       //  inner outer misalign   - common         //4 
  fstring+="(side*inn)++";  //                         - opposite       //5
  //
  fstring+="(gyr)++";       // drift velocity gradient - common         //6
  fstring+="(side*gyr)++";  //                         - opposite       //7
  fstring+="(gxr)++";       //  global x tilt          - common         //8
  fstring+="(side*gxr)++";  //                         - opposite       //9
  //
  fstring+="tl^2++";        // local phi correction                     //10
  //
  fstring+="(lxr)++";       // zr            angle      - common        //11
  fstring+="(side*lxr)++";  //                          - opposite      //12
  fstring+="(inn*lxr)++";   // inner outer angle        - common        //13             
  fstring+="(side*inn*lxr)++";//                        - opposite      //14
  fstring+="(lxr^2)++";       // zr          second     - common        //15
  fstring+="(side*lxr^2)++";  //                        - opposite      //16
  fstring+="(inn*lxr^2)++";       // zr          second     - common        //15
  fstring+="(inn*side*lxr^2)++";  //                        - opposite      //16
  //
  printf("Fit0\t start\n");
  TString *fit0 =stat.FitPlane(tree,"dt",fstring.Data(),"cutF&&cutCE",chi2,npoints,vecFit0,mat,0.9);
  tree->SetAlias("f0",fit0->Data());
  strFit0 = fit0->Data();
  printf("Fit0\t end\n");
  printf("Chi2/npoints\t=%f\n",TMath::Sqrt(chi2/npoints));
  fit0->Tokenize("++")->Print();
  //
  printf("Global tendencies extraction\n");
  //
  // Extract variables
  //
  TString tmpstr = fstring;
  TObjArray *arr = tmpstr.Tokenize("++");
  TString fitQ("0");       // q correction 
  TString fitLX("0");      // lx correction 
  TString fitInOut("0");   // inner-outer - match
  TString fitGXY("0");      // global xy fit
  TString fitOff("0");  // side offsets
  TString fitTL("0");  // side offsets
  //
  fitOff+="+";
  fitOff+=vecFit0[0];
  fitOff+="+side*";
  fitOff+=vecFit0[1];
  {
  for(Int_t i=0;i<arr->GetEntriesFast();i++){
    if (!arr->At(i)) continue;
    TString *fitstr = new TString(arr->At(i)->GetName());
    //
    //Bool_t isQ      = fitstr->Contains("qp)");
    Bool_t isRot    = fitstr->Contains("sin(")+fitstr->Contains("cos(");
    Bool_t isLX     = fitstr->Contains("lxr");
    Bool_t isIn     = fitstr->Contains("inn");
    Bool_t isGXY    = fitstr->Contains("gxr")+fitstr->Contains("gyr");
    if (fitstr->Contains("tl^2")){
      fitTL+="+";
      fitTL+=(*fitstr)+"*";
      fitTL+=vecFit0[i+1];
    }
    if (isGXY){
      fitGXY+="+";
      fitGXY+=(*fitstr)+"*";
      fitGXY+=vecFit0[i+1];
    }
    //
    if (isLX&&!isRot&&!isIn){
      fitLX+="+";
      fitLX+=(*fitstr)+"*";
      fitLX+=vecFit0[i+1];
    }
    //
    if (!isRot&&isIn){
      fitInOut+="+";
      fitInOut+=(*fitstr)+"*";
      fitInOut+=vecFit0[i+1];
    }
  }
  }
  //
  tree->SetAlias("fInOut",fitInOut.Data());
  tree->SetAlias("fLX",fitLX.Data());
  tree->SetAlias("fGXY",fitGXY.Data());
  tree->SetAlias("fOff",fitOff.Data());
  //tree->SetAlias("fQ",fitQ.Data());
  tree->SetAlias("fTL",fitTL.Data());

  //
  //
  // Common "deformation" tendencies
  //
  fstring+="(sin(atan2(gy.fElements,gx.fElements)))++";
  fstring+="(cos(atan2(gy.fElements,gx.fElements)))++";
  //
  fstring+="(sin(atan2(gy.fElements,gx.fElements)*2))++";
  fstring+="(cos(atan2(gy.fElements,gx.fElements)*2))++";
  fstring+="(sin(atan2(gy.fElements,gx.fElements)*3))++";
  fstring+="(cos(atan2(gy.fElements,gx.fElements)*3))++";
  //
  fstring+="(sin(atan2(gy.fElements,gx.fElements)*2))*lxr++";
  fstring+="(cos(atan2(gy.fElements,gx.fElements)*2))*lxr++";
  fstring+="(sin(atan2(gy.fElements,gx.fElements)*3))*lxr++";
  fstring+="(cos(atan2(gy.fElements,gx.fElements)*3))*lxr++";
  //

  TString *fit1 =stat.FitPlane(tree,"dt",fstring.Data(),"cutF&&cutCE",chi2,npoints,vecFit1,mat,0.9);
  tree->SetAlias("f1",fit1->Data());
  strFit1 = fit1->Data();
  printf("Fit1\t end\n");
  printf("Chi2/npoints\t=%f\n",TMath::Sqrt(chi2/npoints));
  fit1->Tokenize("++")->Print();

  //
  // Central electrode "deformation"
  //
  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)))++";
  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)))++";
  //
  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*2))++";
  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*2))++";
  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*3))++";
  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*3))++";
  // 
  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*2))*lxr++";
  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*2))*lxr++";
  fstring+="(side*sin(atan2(gy.fElements,gx.fElements)*3))*lxr++";
  fstring+="(side*cos(atan2(gy.fElements,gx.fElements)*3))*lxr++";
   
  TString *fit2 =stat.FitPlane(tree,"dt",fstring.Data(),"cutF&&abs(dt-f0)<0.7&&cutCE",chi2,npoints,vecFit2,mat,0.9);
  strFit2 = fit2->Data();
  printf("Fit2\t end\n");
  printf("Chi2/npoints\t=%f\n",TMath::Sqrt(chi2/npoints));
  fit2->Tokenize("++")->Print();
  tree->SetAlias("f2",fit2->Data());
  //
  //
  //
  calPad0      = makePad->GetCalPad("f0","1", "ffit0");
  calPad1      = makePad->GetCalPad("f1","1", "ffit1");
  calPad2      = makePad->GetCalPad("f2","1", "ffit2");
  calPadInOut  = makePad->GetCalPad("fInOut","1", "fInOut");
  calPadLX     = makePad->GetCalPad("fLX","1", "fLX");
  calPadTL     = makePad->GetCalPad("fTL","1", "fTL");
  //calPadQ      = makePad->GetCalPad("fQ","1", "fQ");
  calPadGXY    = makePad->GetCalPad("fGXY","1", "fGXY");
  calPadOff    = makePad->GetCalPad("fOff","1", "fOff");  
}



void LoadViewer(){
  //
  // Load calib Viewer
  //
  TObjArray * array = AliTPCCalibViewerGUI::ShowGUI(fname);
  viewer = (AliTPCCalibViewerGUI*)array->At(0);
  makePad = viewer->GetViewer();
  tree = viewer->GetViewer()->GetTree();
  MakeAliases1();  
}






void RebuildData(){
  //
  // transform the input data to the fit format 
  //
  TStopwatch timer;
  makePad = new AliTPCCalibViewer(inname);
  tree = makePad->GetTree();
  //

  timer.Print();
  timer.Continue();
  printf("-1.   MaQkeFitPulser\n");
  MakeFitPulser();
  timer.Print();
  timer.Continue();
  MakeAliases0(); //
  //
  printf("0.   GetCalPads\n");
  timer.Print();
  calPadCor = makePad->GetCalPad("tcor","1", "tcor");
  calPadOut = makePad->GetCalPad("1","!((cutA||cutC)&&abs(ly.fElements/lx.fElements)<0.16)", "out");
  calPadIn  = makePad->GetCalPad("dt","1","timeIn");
  
  calPadF1  = calPadIn->GlobalFit("timeF1", calPadOut,kFALSE,0,0,0.8);  // use robust fit  
  calPadQIn = makePad->GetCalPad("qa*(sector%36<18)+qc*(sector%36>17)","1","qIn");
  //
  //
  printf("1.   Create outlyer map\n");
  timer.Print(); 
  timer.Continue();
  //
  // Update outlyer maps
  //
  for (Int_t isector=0;isector<72; isector++){
    for (UInt_t ich=0;ich<calPadIn->GetCalROC(isector)->GetNchannels();ich++){
      Float_t val0= calPadIn->GetCalROC(isector)->GetValue(ich);
      Float_t val1= calPadF1->GetCalROC(isector)->GetValue(ich);
      if (TMath::Abs(val0-val1)>tThr) calPadOut->GetCalROC(isector)->SetValue(ich,1);
    }
  }
  printf("2.   Fit sector parabolas\n");
  timer.Print();
  timer.Continue();
  calPadF1  = calPadIn->GlobalFit("timeF1", calPadOut,kFALSE,0,0,0.9);
  calPadF2  = calPadIn->GlobalFit("timeF2", calPadOut,kFALSE,1,0,0.9);
  calPadQF1 = calPadQIn->GlobalFit("qF1", calPadOut,kFALSE,1);
  calPadQF2 = calPadQIn->GlobalFit("qF2", calPadOut,kFALSE,1);

  //
  // Update outlyer maps
  //
  printf("3.   Update outlyer map\n");
  for (Int_t isector=0;isector<72; isector++){
    for (UInt_t ich=0;ich<calPadIn->GetCalROC(isector)->GetNchannels();ich++){
      Float_t val0= calPadQIn->GetCalROC(isector)->GetValue(ich);
      Float_t val1= calPadQF2->GetCalROC(isector)->GetValue(ich);
      if (val1<=0)  {
	continue;
      }
      if (TMath::Abs(val0/val1)<qThr0) calPadOut->GetCalROC(isector)->SetValue(ich,1);
      if (TMath::Abs(val0/val1)>qThr1) calPadOut->GetCalROC(isector)->SetValue(ich,1);
    }
  }
  printf("4.  Redo fit of the of parabola \n");
  timer.Print();
  timer.Continue();
  //
  //
  AliTPCCalPad *calPadInCor  = makePad->GetCalPad("dt","1","timeIn");
  calPadF1  = calPadInCor->GlobalFit("timeF1", calPadOut,kFALSE,0,0.9);
  calPadF2  = calPadInCor->GlobalFit("timeF2", calPadOut,kFALSE,1,0.9);
  calPadQF1 = calPadQIn->GlobalFit("qF1", calPadOut,kFALSE,0,0,0.9);
  calPadQF2 = calPadQIn->GlobalFit("qF2", calPadOut,kFALSE,1,0,0.9);
  printf("5. End\n");
  timer.Print();

}

void LoadData(){
  //
  // Get Data
  //
  TFile f(oname);
  calPadIn  = (AliTPCCalPad*)f.Get("timeIn");  // original time pad
  calPadF1  = (AliTPCCalPad*)f.Get("timeF1");  // original time pad - fit plane
  calPadF2  = (AliTPCCalPad*)f.Get("timeF2");  // original time pad - fit parabola
  //
  calPadQIn  = (AliTPCCalPad*)f.Get("qIn");  // original time pad
  calPadQF1  = (AliTPCCalPad*)f.Get("qF1");  // original time pad - fit plane
  calPadQF2  = (AliTPCCalPad*)f.Get("qF2");  // original time pad - fit parabola
  //
  calPadCor = (AliTPCCalPad*)f.Get("tcor");    // base correction CalPad
  calPadOut = (AliTPCCalPad*)f.Get("out");     // outlyer CalPad  
  //
  calPad0   = (AliTPCCalPad*)f.Get("ffit0");   // global fit 0 - base
  calPad1   = (AliTPCCalPad*)f.Get("ffit1");   // global fit 1 - common behavior rotation -A-C
  calPad2   = (AliTPCCalPad*)f.Get("ffit2");   // gloabl fit 2 - CE missalign rotation     A-C
  calPadInOut = (AliTPCCalPad*)f.Get("fInOut");// misaalign in-out
  calPadLX    = (AliTPCCalPad*)f.Get("fLX");   // local x missalign
  calPadTL    = (AliTPCCalPad*)f.Get("fTL");   // local y/x missalign
  calPadQ     = (AliTPCCalPad*)f.Get("fQ");    // time (q)  correction
  calPadGXY   = (AliTPCCalPad*)f.Get("fGXY");  // global XY missalign (drift velocity grad) 
  calPadOff   = (AliTPCCalPad*)f.Get("fOff");  // normalization offset fit
  calPadRes   = (AliTPCCalPad*)f.Get("Result");  //resulting calibration
}

void StoreData(){
  //
  // Store data
  // 
  TFile * fstore = new TFile(oname,"recreate");
  if (calPadIn) calPadIn->Write("timeIn");   // original time pad
  if (calPadF1) calPadF1->Write("timeF1");   // original time pad - fit plane
  if (calPadF2) calPadF2->Write("timeF2");   // original time pad - fit parabola
  //
  if (calPadQIn) calPadQIn->Write("qIn");   // original time pad
  if (calPadQF1) calPadQF1->Write("qF1");   // original time pad - fit plane
  if (calPadQF2) calPadQF2->Write("qF2");   // original time pad - fit parabola
  //
  if (calPadCor) calPadCor->Write("tcor");   // base correction CalPad
  if (calPadOut) calPadOut->Write("out");    // outlyer CalPad  
  //
  if (calPad0)   calPad0->Write("ffit0");    // global fit 0 - base
  if (calPad1)   calPad1->Write("ffit1");    // global fit 1 - common behavior rotation -A-C
  if (calPad2)   calPad2->Write("ffit2");    // gloabl fit 2 - CE missalign rotation     A-C
  if (calPadInOut)calPadInOut->Write("fInOut");   // misaalign in-out
  if (calPadLX)  calPadLX->Write("fLX");     // local x missalign
  if (calPadTL)  calPadTL->Write("fTL");     // local y/x missalign
  if (calPadQ)   calPadQ->Write("fQ");       // time (q)  correction
  if (calPadGXY) calPadGXY->Write("fGXY");   // global XY missalign (drift velocity grad) 
  if (calPadOff) calPadOff->Write("fOff");   // normalization offset fit
  if (calPadRes) calPadRes->Write("Result");   //resulting calibration
  fstore->Close();
  delete fstore;
}

void StoreTree(){
  //
  //
  //
  AliTPCPreprocessorOnline * preprocesor = new AliTPCPreprocessorOnline;
  //
  if (calPadIn) preprocesor->AddComponent(calPadIn->Clone());
  if (calPadF1) preprocesor->AddComponent(calPadF1->Clone());   
  if (calPadF2) preprocesor->AddComponent(calPadF2->Clone());   
  //
  if (calPadQIn) preprocesor->AddComponent(calPadQIn->Clone());
  if (calPadQF1) preprocesor->AddComponent(calPadQF1->Clone());   
  if (calPadQF2) preprocesor->AddComponent(calPadQF2->Clone());   
  //
  if (calPadCor) preprocesor->AddComponent(calPadCor->Clone());   
  if (calPadOut) preprocesor->AddComponent(calPadOut->Clone());  
  //
  if (calPad0)   preprocesor->AddComponent(calPad0->Clone());
  if (calPad1)   preprocesor->AddComponent(calPad1->Clone());
  if (calPad2)   preprocesor->AddComponent(calPad2->Clone());
  if (calPadInOut)preprocesor->AddComponent(calPadInOut->Clone());
  if (calPadLX)  preprocesor->AddComponent(calPadLX->Clone());
  if (calPadTL)  preprocesor->AddComponent(calPadTL->Clone());
  if (calPadQ)   preprocesor->AddComponent(calPadQ->Clone());
  if (calPadGXY) preprocesor->AddComponent(calPadGXY->Clone());
  if (calPadOff) preprocesor->AddComponent(calPadOff->Clone());
  if (calPadRes) preprocesor->AddComponent(calPadRes->Clone());
  preprocesor->DumpToFile(fname);
  delete preprocesor;
}


void MakeAliases0(){
  //
  // Define variables and selection of outliers - for user defined tree
  //
  tree->SetAlias("tcor",tcor.Data());          // correction variable
  tree->SetAlias("ta",taside+".fElements");
  tree->SetAlias("tc",tcside+".fElements");
  tree->SetAlias("qa",qaside+".fElements");
  tree->SetAlias("qc",qcside+".fElements");
  tree->SetAlias("ra",raside+".fElements");
  tree->SetAlias("rc",rcside+".fElements");
  tree->SetAlias("side","1-(sector%36>17)*2");
  tree->SetAlias("dt","(ta)*(sector%36<18)+(tc)*(sector%36>17)+tcor");
  tree->SetAlias("cutA","qa>30&&qa<400&&abs(ta)<2&&ra>0.5&&ra<2");
  tree->SetAlias("cutC","qc>30&&qc<400&&abs(tc)<2&&rc>0.5&&rc<2");
  tree->SetAlias("cutF","((row.fElements+pad.fElements+sector)%19==0)");  // use just part of the statistic - 5 %
  tree->SetAlias("cutCE","V.out.fElements");
  //
  // fit param aliases
  //
  tree->SetAlias("inn","sector<36");
  tree->SetAlias("gxr","(gx.fElements/250.)"); //
  tree->SetAlias("gyr","(gy.fElements/250.)"); //
  tree->SetAlias("lxr","(lx.fElements-133.41)/250.");
  tree->SetAlias("qp","((sector%36<18)*sqrt(qa)/10.+(sector%36>17)*sqrt(qc)/10.)"); //
  tree->SetAlias("tl","(ly.fElements/lx.fElements)/0.17");  
}


void MakeAliases1(){
  //
  // Define variables and selection of outliers -for default usage
  //
  tree->SetAlias("tcor","tcor.fElements");          // correction variable  
  tree->SetAlias("side","1-(sector%36>17)*2");
  tree->SetAlias("dt","timeIn.fElements");
  //
  tree->SetAlias("cutA","out.fElements==1");
  tree->SetAlias("cutC","out.fElements==1");
  tree->SetAlias("cutF","((row.fElements+pad.fElements+sector.fElements)%19==0)");  // use just part of the statistic - 5 %

  tree->SetAlias("cutCE","out.fElements<0.5");
  //
  // fit param aliases
  //
  tree->SetAlias("inn","sector<36");
  tree->SetAlias("gxr","(gx.fElements/250.)"); //
  tree->SetAlias("gyr","(gy.fElements/250.)"); //
  tree->SetAlias("lxr","(lx.fElements-133.41)/250.");
  tree->SetAlias("qp","(sqrt(qIn.fElements)/10.+(out.fElements>0.5))"); //
  tree->SetAlias("tl","(ly.fElements/lx.fElements)/0.17");  
}


void MakeRes()
{
  //
  // make final calibration
  //
  AliTPCCalPad * calPadRes0 =new AliTPCCalPad(*calPadIn);
  calPadRes0->Add(calPad2,-1);      // remove global fit
  calPadRes  = calPadRes0->GlobalFit("Result", calPadOut,kTRUE,1,0.9);
  //
  //
  {
    Float_t tlmedian =  calPadTL->GetMedian();
    for (Int_t isector=0;isector<72; isector++){
      for (UInt_t ich=0;ich<calPadIn->GetCalROC(isector)->GetNchannels();ich++){
	//
	//
	Float_t val0 = calPadRes->GetCalROC(isector)->GetValue(ich);
	if (TMath::Abs(val0)>0.5) calPadRes->GetCalROC(isector)->SetValue(ich,0);
	Float_t tl = calPadTL->GetCalROC(isector)->GetValue(ich);
	Float_t inOut = calPadInOut->GetCalROC(isector)->GetValue(ich);
	calPadRes->GetCalROC(isector)->SetValue(ich,calPadRes->GetCalROC(isector)->GetValue(ich)+tl+inOut);
	//
      }
    }
  }
  calPadRes->Add(calPadCor,-1);     // remove back correction (e.g Pulser time 0)
}




void RebuildCE(char *finname, char *pulname){
  //
  // Transformation from the CE to the visualization-analisys output
  //
  // finname = CE_Vscan_Run_61684-50_170.root;
  TFile f(finname);
  AliTPCCalibCE * ce  = (AliTPCCalibCE*)f.Get("AliTPCCalibCE");
  //
  AliTPCCalPad *padtime = new AliTPCCalPad((TObjArray*)ce->GetCalPadT0());
  AliTPCCalPad *padRMS = new AliTPCCalPad((TObjArray*)ce->GetCalPadRMS());
  AliTPCCalPad *padq = new AliTPCCalPad((TObjArray*)ce->GetCalPadQ());
  padtime->SetName("CE_T");
  padRMS->SetName("CE_RMS");
  padq->SetName("CE_Q");

  TFile f2(pulname);
  AliTPCCalibPulser *pul = (AliTPCCalibPulser*)f2.Get("AliTPCCalibPulser");
  AliTPCCalPad *pultime = new AliTPCCalPad((TObjArray*)pul->GetCalPadT0());
  AliTPCCalPad *pulRMS = new AliTPCCalPad((TObjArray*)pul->GetCalPadRMS());
  AliTPCCalPad *pulq = new AliTPCCalPad((TObjArray*)pul->GetCalPadQ());
  pultime->SetName("P_T");
  pulRMS->SetName("P_RMS");
  pulq->SetName("P_Q");


  AliTPCPreprocessorOnline * preprocesor = new AliTPCPreprocessorOnline;
  preprocesor->AddComponent(padtime);
  preprocesor->AddComponent(padq);
  preprocesor->AddComponent(padRMS);
  preprocesor->AddComponent(pultime);
  preprocesor->AddComponent(pulq);
  preprocesor->AddComponent(pulRMS);
  preprocesor->DumpToFile(inname);
}


void AnalyzeLaserCE(){
  RebuildCE("ce.root","pul.root");
  StoreData();
  StoreTree();
  RebuildData();
  StoreData();
  StoreTree();
  MakeFit();
  StoreData();
  StoreTree();
  MakeRes();
}



void AddFiles(char *list){
  //
  // prepare viewer for data sets
  //
  fstream finput;
  finput.open(list, ios_base::in);
  //
  TString currentFile;
  Int_t counter=0;
  if (!elist ) {
    elist = new TEntryList("elist","elist");
    tree->Draw(Form(">>elist%d",counter),"1","entrylist");
  }
  while(finput.good()) {
    finput >> currentFile;
    printf("Getting file%s\n",currentFile.Data());
    TFile * fC = new TFile(currentFile.Data());
    TTree * treeC = (TTree*) fC->Get("calPads");
    makePad->AddFriend(treeC,Form("T%d",counter));
    //
    TString cutStrF1=Form("abs(T%d.timeIn.fElements-T%d.timeF1.fElements)<1.5",counter,counter);
    TEntryList *celist = new TEntryList(Form("listF1%d",counter),Form("listF1%d",counter));
    tree->Draw(Form(">>listF1%d",counter),cutStrF1,"entrylist");
    if (celist->GetN()>0) elist->Add(celist);
    counter++;
  }
  viewer->Reload();
}

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