ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
 
/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// class T0 walk correction      Alla Maevskaya alla@inr.ru 20.11.2007        //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "AliT0CalibWalk.h"
#include "AliLog.h"

#include <TObjArray.h>
#include <TGraph.h>
#include <TFile.h>
#include <TH2F.h> 
#include <TMath.h>
#include <TSystem.h>
#include <Riostream.h>
#include <TSpectrum.h>
#include <TProfile.h>
#include <TF1.h>

using std::cout;
using std::endl;
using std::ifstream;
ClassImp(AliT0CalibWalk)

//________________________________________________________________
  AliT0CalibWalk::AliT0CalibWalk():   TNamed(),
				      fWalk(0),
				      fAmpLEDRec(0),
				      fQTC(0),
                                      fAmpLED(0), 
                                      fCalibByData(kFALSE)
{
  //
}

//________________________________________________________________
AliT0CalibWalk::AliT0CalibWalk(const char* name):TNamed(),
				      fWalk(0),
				      fAmpLEDRec(0),				  				      fQTC(0),
				      fAmpLED(0), 
                                      fCalibByData(kFALSE)
    
{
  TString namst = "Calib_";
  namst += name;
  SetName(namst.Data());
  SetTitle(namst.Data());

}

//________________________________________________________________
AliT0CalibWalk::AliT0CalibWalk(const AliT0CalibWalk& calibda) :
  TNamed(calibda),		
  fWalk(0),
  fAmpLEDRec(0),
  fQTC(0),
  fAmpLED(0) , 
  fCalibByData(kFALSE)
{
// copy constructor
  SetName(calibda.GetName());
  SetTitle(calibda.GetName());


}

//________________________________________________________________
AliT0CalibWalk &AliT0CalibWalk::operator =(const AliT0CalibWalk& calibda)
{
// assignment operator
  SetName(calibda.GetName());
  SetTitle(calibda.GetName());
 
  return *this;
}

//________________________________________________________________
AliT0CalibWalk::~AliT0CalibWalk()
{
  //
}
//________________________________________________________________  

Bool_t AliT0CalibWalk::MakeWalkCorrGraph(const char *laserFile)
{
  //make walk corerction for preprocessor
  Float_t sigma,cfdmean, qtmean, ledmean;
  Bool_t ok=true;
  Float_t   mips[50];
  cout<<" @@@@ fCalibByData "<<fCalibByData<<endl;

  gFile = TFile::Open(laserFile);
  if(!gFile) {
    AliError("No input laser data found ");
  }
  else
    {
      //      gFile->ls();
      TH1F* hAmp = (TH1F*) gFile->Get("hAmpLaser");
      Int_t nmips=0;
      for (Int_t ibin=0; ibin<2000; ibin++) {
	Float_t bincont = hAmp->GetBinContent(ibin);
	if(bincont>0){ 
	  mips[nmips] = hAmp->GetXaxis()->GetBinCenter(ibin);
	  cout<<ibin<<" bincont "<<bincont<<" amp "<< mips[nmips]<<endl;
	  nmips++;
	}	
      }    
      /*     
      if (nmips<17) {
	ok=false;
	return ok;
      } 
      */     
      Float_t x1[50], y1[50]; 
      Float_t x2[50], xx2[50],y2[50];
      Float_t xx1[50],yy1[50], xx[50];
      
      Float_t cfd0 = 0;
      
      for (Int_t ii=0; ii<nmips; ii++)
	x1[ii] = y1[ii] = x2[ii] = y2[ii] = 0; 
      
      for (Int_t i=0; i<24; i++)
	{
	  cfd0 = 0;
	  for (Int_t im=0; im<nmips; im++)
	    {	      
	      TString cfd = Form("hCFD%i_%i",i+1,im+1);
	      TString qtc = Form("hQTC%i_%i",i+1,im+1);
	      TString led = Form("hLED%i_%i",i+1,im+1);
	      
	      TH1F *hCFD = (TH1F*) gFile->Get(cfd.Data()) ;
	      TH1F *hLED = (TH1F*) gFile->Get(led.Data());
	      TH1F *hQTC = (TH1F*) gFile->Get(qtc.Data()) ;
	      //	      hCFD->SetDirectory(0);
	      //	      hQTC->SetDirectory(0);
	      //	      hLED->SetDirectory(0);
	      if(!hCFD )
 	      	AliWarning(Form(" no CFD data in LASER DA for channel %i for amplitude %f MIPs",i,mips[im]));
	      if(!hQTC )
 	      	AliWarning(Form(" no QTC correction data in LASER DA for channel %i for amplitude %f MIPs",i,mips[im]));
	      if(!hLED)	      
	      	AliWarning(Form(" no LED correction data in LASER DA for channel %i for amplitude %f MIPs",i,mips[im]));
	      if( hCFD && hCFD->GetEntries()<500 ) {
		ok=false;
		printf("no peak in CFD spectrum for PMT %i amplitude %i\n",i,im);
		return ok;
	      }
	      if(hCFD && hCFD->GetEntries()>500 ) {
		if( hCFD->GetRMS() >= 1.5) 
		  GetMeanAndSigma(hCFD, cfdmean, sigma);
		else
		  cfdmean = hCFD->GetMean();
		
		Int_t   maxBin = hCFD->GetMaximumBin(); 
		Double_t  meanEstimate = hCFD->GetBinCenter( maxBin); 
		if(TMath::Abs(meanEstimate - cfdmean) > 20 ) cfdmean = meanEstimate; 
		if (im == 0) cfd0 = cfdmean;
		y1[im] =  cfdmean - cfd0;
	      }	
	      if(hQTC && hQTC->GetEntries()>500) {
		GetMeanAndSigma(hQTC, qtmean, sigma);
		
		x1[im] = qtmean;
		if( x1[im] == 0) {
		  ok=false;
		  printf("no peak in QTC signal for PMT %i amplitude %i\n",i,im);
		  return ok;
		}
	      }
		
	      if( hLED && hLED->GetEntries()>500) {
		GetMeanAndSigma(hLED, ledmean, sigma);
	      }				   
	      else
		{ 
		  //	  ok=false;
		  printf("no peak in LED spectrum for PMT %i amplitude %i\n",i,im);
		  ledmean=0;
		  //  return ok;
		}
	      x2[im] = ledmean;
	      xx2[im] = x2[nmips-im-1];
		
		xx[im]=mips[im];
		if (hQTC) delete  hQTC;
		if (hCFD) delete  hCFD;
		if (hLED) delete  hLED;
		
	    }
	  
	  for (Int_t imi=0; imi<nmips; imi++)
	    {
	      yy1[imi] = Float_t (mips[nmips-imi-1]);
	      xx1[imi] = x2[nmips-imi-1]; 
	      //	      cout<<" LED rev "<<i<<" "<<imi<<" "<<xx1[imi]<<" "<< yy1[imi]<<"nmips-imi-1 = "<< nmips-imi-1<<endl;
	    }
	  
	  if(i==0) cout<<"Making graphs..."<<endl;
	  
      TGraph *grwalkqtc = new TGraph (nmips,x1,y1);
      grwalkqtc->SetTitle(Form("PMT%i",i));
      TGraph *grwalkled = new TGraph (nmips,x2,y1);
      grwalkled->SetTitle(Form("PMT%i",i));
      if(!fCalibByData)
	fWalk.AddAtAndExpand(grwalkqtc,i);
      fAmpLEDRec.AddAtAndExpand(grwalkled,i);
      //	  cout<<" add walk "<<i<<endl;
      
      //fit amplitude graphs to make comparison wth new one	  
      TGraph *grampled = new TGraph (nmips,xx1,yy1);
      TGraph *grqtc = new TGraph (nmips,x1,xx);
      fQTC.AddAtAndExpand(grqtc,i);	 
      fAmpLED.AddAtAndExpand(grampled,i);
      //	  cout<<" add amp "<<i<<endl;
      
      if(i==23)
	cout<<"Graphs created..."<<endl;   
	}
    }
  Float_t xpoint, ypoint, xdata[250], ydata[250];
  Int_t ipmt;
  if(fCalibByData) {
    cout<<" read ingraph "<<endl;
    ifstream ingraph ("calibfit.txt");
    for (Int_t i=0; i<24; i++) 
      {
	for (Int_t ip=0; ip<200; ip++) 
	  {
	    ingraph>>ipmt>>xpoint>>ypoint; 
	    // cout<<i<<" "<<ipmt<<" "<<ip<<" "<< xpoint<<" "<<ypoint<<endl;  
	    xdata[ip]=xpoint;
	    ydata[ip]=ypoint;
	  }
	for (Int_t ip=200; ip<250; ip++) {
	    xdata[ip] =xdata[ip-1]+10;
	    ydata[ip]=ydata[199];
	}
       
	TGraph *grwalkqtc = new TGraph (250,xdata,ydata);
	grwalkqtc->Print();
	grwalkqtc->SetTitle(Form("PMT%i",i));
	fWalk.AddAtAndExpand(grwalkqtc,i);
	for (Int_t ip=0; ip<250; ip++)
	  {
	    xdata[ip]=0;
	    ydata[ip]=0;
	  }
      }
  }

  
return ok;
}

void AliT0CalibWalk::GetMeanAndSigma(TH1F* hist, Float_t &mean, Float_t &sigma) 
{

  const double window = 2.;  //fit window 
 
  double meanEstimate, sigmaEstimate; 
  int maxBin;
  maxBin        =  hist->GetMaximumBin(); //position of maximum
  meanEstimate  =  hist->GetBinCenter( maxBin); // mean of gaussian sitting in maximum
  sigmaEstimate = hist->GetRMS();
  TF1* fit= new TF1("fit","gaus", meanEstimate - window*sigmaEstimate, meanEstimate + window*sigmaEstimate);
  fit->SetParameters(hist->GetBinContent(maxBin), meanEstimate, sigmaEstimate);
  hist->Fit("fit","RQ","Q");

  mean  = (Float_t) fit->GetParameter(1);
  sigma = (Float_t) fit->GetParameter(2);
  //  printf(" mean %f max %f sigma %f \n",mean, meanEstimate , sigma);  

  delete fit;
}



 AliT0CalibWalk.cxx:1
 AliT0CalibWalk.cxx:2
 AliT0CalibWalk.cxx:3
 AliT0CalibWalk.cxx:4
 AliT0CalibWalk.cxx:5
 AliT0CalibWalk.cxx:6
 AliT0CalibWalk.cxx:7
 AliT0CalibWalk.cxx:8
 AliT0CalibWalk.cxx:9
 AliT0CalibWalk.cxx:10
 AliT0CalibWalk.cxx:11
 AliT0CalibWalk.cxx:12
 AliT0CalibWalk.cxx:13
 AliT0CalibWalk.cxx:14
 AliT0CalibWalk.cxx:15
 AliT0CalibWalk.cxx:16
 AliT0CalibWalk.cxx:17
 AliT0CalibWalk.cxx:18
 AliT0CalibWalk.cxx:19
 AliT0CalibWalk.cxx:20
 AliT0CalibWalk.cxx:21
 AliT0CalibWalk.cxx:22
 AliT0CalibWalk.cxx:23
 AliT0CalibWalk.cxx:24
 AliT0CalibWalk.cxx:25
 AliT0CalibWalk.cxx:26
 AliT0CalibWalk.cxx:27
 AliT0CalibWalk.cxx:28
 AliT0CalibWalk.cxx:29
 AliT0CalibWalk.cxx:30
 AliT0CalibWalk.cxx:31
 AliT0CalibWalk.cxx:32
 AliT0CalibWalk.cxx:33
 AliT0CalibWalk.cxx:34
 AliT0CalibWalk.cxx:35
 AliT0CalibWalk.cxx:36
 AliT0CalibWalk.cxx:37
 AliT0CalibWalk.cxx:38
 AliT0CalibWalk.cxx:39
 AliT0CalibWalk.cxx:40
 AliT0CalibWalk.cxx:41
 AliT0CalibWalk.cxx:42
 AliT0CalibWalk.cxx:43
 AliT0CalibWalk.cxx:44
 AliT0CalibWalk.cxx:45
 AliT0CalibWalk.cxx:46
 AliT0CalibWalk.cxx:47
 AliT0CalibWalk.cxx:48
 AliT0CalibWalk.cxx:49
 AliT0CalibWalk.cxx:50
 AliT0CalibWalk.cxx:51
 AliT0CalibWalk.cxx:52
 AliT0CalibWalk.cxx:53
 AliT0CalibWalk.cxx:54
 AliT0CalibWalk.cxx:55
 AliT0CalibWalk.cxx:56
 AliT0CalibWalk.cxx:57
 AliT0CalibWalk.cxx:58
 AliT0CalibWalk.cxx:59
 AliT0CalibWalk.cxx:60
 AliT0CalibWalk.cxx:61
 AliT0CalibWalk.cxx:62
 AliT0CalibWalk.cxx:63
 AliT0CalibWalk.cxx:64
 AliT0CalibWalk.cxx:65
 AliT0CalibWalk.cxx:66
 AliT0CalibWalk.cxx:67
 AliT0CalibWalk.cxx:68
 AliT0CalibWalk.cxx:69
 AliT0CalibWalk.cxx:70
 AliT0CalibWalk.cxx:71
 AliT0CalibWalk.cxx:72
 AliT0CalibWalk.cxx:73
 AliT0CalibWalk.cxx:74
 AliT0CalibWalk.cxx:75
 AliT0CalibWalk.cxx:76
 AliT0CalibWalk.cxx:77
 AliT0CalibWalk.cxx:78
 AliT0CalibWalk.cxx:79
 AliT0CalibWalk.cxx:80
 AliT0CalibWalk.cxx:81
 AliT0CalibWalk.cxx:82
 AliT0CalibWalk.cxx:83
 AliT0CalibWalk.cxx:84
 AliT0CalibWalk.cxx:85
 AliT0CalibWalk.cxx:86
 AliT0CalibWalk.cxx:87
 AliT0CalibWalk.cxx:88
 AliT0CalibWalk.cxx:89
 AliT0CalibWalk.cxx:90
 AliT0CalibWalk.cxx:91
 AliT0CalibWalk.cxx:92
 AliT0CalibWalk.cxx:93
 AliT0CalibWalk.cxx:94
 AliT0CalibWalk.cxx:95
 AliT0CalibWalk.cxx:96
 AliT0CalibWalk.cxx:97
 AliT0CalibWalk.cxx:98
 AliT0CalibWalk.cxx:99
 AliT0CalibWalk.cxx:100
 AliT0CalibWalk.cxx:101
 AliT0CalibWalk.cxx:102
 AliT0CalibWalk.cxx:103
 AliT0CalibWalk.cxx:104
 AliT0CalibWalk.cxx:105
 AliT0CalibWalk.cxx:106
 AliT0CalibWalk.cxx:107
 AliT0CalibWalk.cxx:108
 AliT0CalibWalk.cxx:109
 AliT0CalibWalk.cxx:110
 AliT0CalibWalk.cxx:111
 AliT0CalibWalk.cxx:112
 AliT0CalibWalk.cxx:113
 AliT0CalibWalk.cxx:114
 AliT0CalibWalk.cxx:115
 AliT0CalibWalk.cxx:116
 AliT0CalibWalk.cxx:117
 AliT0CalibWalk.cxx:118
 AliT0CalibWalk.cxx:119
 AliT0CalibWalk.cxx:120
 AliT0CalibWalk.cxx:121
 AliT0CalibWalk.cxx:122
 AliT0CalibWalk.cxx:123
 AliT0CalibWalk.cxx:124
 AliT0CalibWalk.cxx:125
 AliT0CalibWalk.cxx:126
 AliT0CalibWalk.cxx:127
 AliT0CalibWalk.cxx:128
 AliT0CalibWalk.cxx:129
 AliT0CalibWalk.cxx:130
 AliT0CalibWalk.cxx:131
 AliT0CalibWalk.cxx:132
 AliT0CalibWalk.cxx:133
 AliT0CalibWalk.cxx:134
 AliT0CalibWalk.cxx:135
 AliT0CalibWalk.cxx:136
 AliT0CalibWalk.cxx:137
 AliT0CalibWalk.cxx:138
 AliT0CalibWalk.cxx:139
 AliT0CalibWalk.cxx:140
 AliT0CalibWalk.cxx:141
 AliT0CalibWalk.cxx:142
 AliT0CalibWalk.cxx:143
 AliT0CalibWalk.cxx:144
 AliT0CalibWalk.cxx:145
 AliT0CalibWalk.cxx:146
 AliT0CalibWalk.cxx:147
 AliT0CalibWalk.cxx:148
 AliT0CalibWalk.cxx:149
 AliT0CalibWalk.cxx:150
 AliT0CalibWalk.cxx:151
 AliT0CalibWalk.cxx:152
 AliT0CalibWalk.cxx:153
 AliT0CalibWalk.cxx:154
 AliT0CalibWalk.cxx:155
 AliT0CalibWalk.cxx:156
 AliT0CalibWalk.cxx:157
 AliT0CalibWalk.cxx:158
 AliT0CalibWalk.cxx:159
 AliT0CalibWalk.cxx:160
 AliT0CalibWalk.cxx:161
 AliT0CalibWalk.cxx:162
 AliT0CalibWalk.cxx:163
 AliT0CalibWalk.cxx:164
 AliT0CalibWalk.cxx:165
 AliT0CalibWalk.cxx:166
 AliT0CalibWalk.cxx:167
 AliT0CalibWalk.cxx:168
 AliT0CalibWalk.cxx:169
 AliT0CalibWalk.cxx:170
 AliT0CalibWalk.cxx:171
 AliT0CalibWalk.cxx:172
 AliT0CalibWalk.cxx:173
 AliT0CalibWalk.cxx:174
 AliT0CalibWalk.cxx:175
 AliT0CalibWalk.cxx:176
 AliT0CalibWalk.cxx:177
 AliT0CalibWalk.cxx:178
 AliT0CalibWalk.cxx:179
 AliT0CalibWalk.cxx:180
 AliT0CalibWalk.cxx:181
 AliT0CalibWalk.cxx:182
 AliT0CalibWalk.cxx:183
 AliT0CalibWalk.cxx:184
 AliT0CalibWalk.cxx:185
 AliT0CalibWalk.cxx:186
 AliT0CalibWalk.cxx:187
 AliT0CalibWalk.cxx:188
 AliT0CalibWalk.cxx:189
 AliT0CalibWalk.cxx:190
 AliT0CalibWalk.cxx:191
 AliT0CalibWalk.cxx:192
 AliT0CalibWalk.cxx:193
 AliT0CalibWalk.cxx:194
 AliT0CalibWalk.cxx:195
 AliT0CalibWalk.cxx:196
 AliT0CalibWalk.cxx:197
 AliT0CalibWalk.cxx:198
 AliT0CalibWalk.cxx:199
 AliT0CalibWalk.cxx:200
 AliT0CalibWalk.cxx:201
 AliT0CalibWalk.cxx:202
 AliT0CalibWalk.cxx:203
 AliT0CalibWalk.cxx:204
 AliT0CalibWalk.cxx:205
 AliT0CalibWalk.cxx:206
 AliT0CalibWalk.cxx:207
 AliT0CalibWalk.cxx:208
 AliT0CalibWalk.cxx:209
 AliT0CalibWalk.cxx:210
 AliT0CalibWalk.cxx:211
 AliT0CalibWalk.cxx:212
 AliT0CalibWalk.cxx:213
 AliT0CalibWalk.cxx:214
 AliT0CalibWalk.cxx:215
 AliT0CalibWalk.cxx:216
 AliT0CalibWalk.cxx:217
 AliT0CalibWalk.cxx:218
 AliT0CalibWalk.cxx:219
 AliT0CalibWalk.cxx:220
 AliT0CalibWalk.cxx:221
 AliT0CalibWalk.cxx:222
 AliT0CalibWalk.cxx:223
 AliT0CalibWalk.cxx:224
 AliT0CalibWalk.cxx:225
 AliT0CalibWalk.cxx:226
 AliT0CalibWalk.cxx:227
 AliT0CalibWalk.cxx:228
 AliT0CalibWalk.cxx:229
 AliT0CalibWalk.cxx:230
 AliT0CalibWalk.cxx:231
 AliT0CalibWalk.cxx:232
 AliT0CalibWalk.cxx:233
 AliT0CalibWalk.cxx:234
 AliT0CalibWalk.cxx:235
 AliT0CalibWalk.cxx:236
 AliT0CalibWalk.cxx:237
 AliT0CalibWalk.cxx:238
 AliT0CalibWalk.cxx:239
 AliT0CalibWalk.cxx:240
 AliT0CalibWalk.cxx:241
 AliT0CalibWalk.cxx:242
 AliT0CalibWalk.cxx:243
 AliT0CalibWalk.cxx:244
 AliT0CalibWalk.cxx:245
 AliT0CalibWalk.cxx:246
 AliT0CalibWalk.cxx:247
 AliT0CalibWalk.cxx:248
 AliT0CalibWalk.cxx:249
 AliT0CalibWalk.cxx:250
 AliT0CalibWalk.cxx:251
 AliT0CalibWalk.cxx:252
 AliT0CalibWalk.cxx:253
 AliT0CalibWalk.cxx:254
 AliT0CalibWalk.cxx:255
 AliT0CalibWalk.cxx:256
 AliT0CalibWalk.cxx:257
 AliT0CalibWalk.cxx:258
 AliT0CalibWalk.cxx:259
 AliT0CalibWalk.cxx:260
 AliT0CalibWalk.cxx:261
 AliT0CalibWalk.cxx:262
 AliT0CalibWalk.cxx:263
 AliT0CalibWalk.cxx:264
 AliT0CalibWalk.cxx:265
 AliT0CalibWalk.cxx:266
 AliT0CalibWalk.cxx:267
 AliT0CalibWalk.cxx:268
 AliT0CalibWalk.cxx:269
 AliT0CalibWalk.cxx:270
 AliT0CalibWalk.cxx:271
 AliT0CalibWalk.cxx:272
 AliT0CalibWalk.cxx:273
 AliT0CalibWalk.cxx:274
 AliT0CalibWalk.cxx:275
 AliT0CalibWalk.cxx:276
 AliT0CalibWalk.cxx:277
 AliT0CalibWalk.cxx:278
 AliT0CalibWalk.cxx:279
 AliT0CalibWalk.cxx:280
 AliT0CalibWalk.cxx:281
 AliT0CalibWalk.cxx:282
 AliT0CalibWalk.cxx:283
 AliT0CalibWalk.cxx:284
 AliT0CalibWalk.cxx:285
 AliT0CalibWalk.cxx:286
 AliT0CalibWalk.cxx:287
 AliT0CalibWalk.cxx:288
 AliT0CalibWalk.cxx:289
 AliT0CalibWalk.cxx:290
 AliT0CalibWalk.cxx:291
 AliT0CalibWalk.cxx:292
 AliT0CalibWalk.cxx:293
 AliT0CalibWalk.cxx:294
 AliT0CalibWalk.cxx:295
 AliT0CalibWalk.cxx:296
 AliT0CalibWalk.cxx:297