ROOT logo
#include "TMath.h"
#include "TList.h"
#include "TH2F.h"
#include "TH1F.h"
#include "TF1.h"
#include "TH1D.h"
#include "TProfile.h"
#include "TFile.h"
#include "TCanvas.h"
#include <Riostream.h>
#include <TROOT.h>
#include <TString.h>
#include "TStyle.h"
#include "TGrid.h"
 
 
class TList;
class TH2F;
class TH1F;
class TH1D;
class TProfile;
class TFile;
class TCanvas;
class TStyle;
class TF1;
class TGrid;





Double_t convolution(Double_t* x,Double_t *par)
{
	  //Fit parameters:
   //par[0]=Width (scale) parameter of Landau density
   //par[1]=Most Probable (MP, location) parameter of Landau density
   //par[2]=Total area (integral -inf to inf, normalization constant)
   //par[3]=Width (sigma) of convoluted Gaussian function
   //
   //In the Landau distribution (represented by the CERNLIB approximation),
   //the maximum is located at x=-0.22278298 with the location parameter=0.
   //This shift is corrected within this function, so that the actual
   //maximum is identical to the MP parameter.

      // Numeric constants
      Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
      Double_t mpshift  = -0.22278298;       // Landau maximum location

      // Control constants
      Double_t np = 200.0;      // number of convolution steps
      Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas

      // Variables
      Double_t xx;
      Double_t mpc;
      Double_t fland;
      Double_t sum = 0.0;
      Double_t xlow,xupp;
      Double_t step;
      Double_t i;


      // MP shift correction
      mpc = par[1] - mpshift * par[0];

      // Range of convolution integral
      xlow = x[0] - sc * par[3];
      xupp = x[0] + sc * par[3];

      step = (xupp-xlow) / np;

      // Convolution integral of Landau and Gaussian by sum
      for(i=1.0; i<=np/2; i++) 
      {
        	 xx = xlow + (i-.5) * step;
         	fland = TMath::Landau(xx,mpc,par[0]) / par[0];
         	sum += fland * TMath::Gaus(x[0],xx,par[3]);

         	xx = xupp - (i-.5) * step;
         	fland = TMath::Landau(xx,mpc,par[0]) / par[0];
         	sum += fland * TMath::Gaus(x[0],xx,par[3]);
      }

      return (par[2] * step * sum * invsq2pi / par[3]);
}




void GetGainModuleLevel(TString filename,Bool_t normal=1,Int_t ntofit=500, Bool_t grid=0)
{
	gROOT->SetStyle("Plain");
	gStyle->SetPalette(1,0);
	gStyle->SetOptStat(111111);
	gStyle->SetOptFit(1);	
	if(grid)
		TGrid::Connect("alien://");
	
	TFile* file_data=TFile::Open(filename);
	if(!file_data)
		return;
	TList *listin=0x0;
	listin=(TList*)file_data->Get("output");
	if(!listin)
		listin=(TList*)file_data->Get("PWGPPdEdxSSDQA/output");
	if(!listin)	
		listin=(TList*)file_data->Get("PWGPPdEdxSSDQA/SSDdEdxQA");
	if(!listin)	
		listin=(TList*)file_data->Get("SSDdEdxQA");
	if(!listin)	
		return;
	TH2F* fHistQ=0x0;
	if (normal)		
		fHistQ=(TH2F*)listin ->FindObject("QACharge");
	else
		fHistQ=(TH2F*)listin ->FindObject("QAChargeCorrected");
	if(!fHistQ)
		return;
	TH2F* fHistCR=(TH2F*)listin ->FindObject("QAChargeRatio");
	if(!fHistCR)
		return;
	TList *listout1=new TList();
	
	TList *listout2=new TList();
	
	TH1F* fHistMPVs=new TH1F("HistMPVS","HistMPVs;MPV;N",75,70,95);
	fHistMPVs->SetDirectory(0);
	listout2->Add(fHistMPVs);
	
	TH1F* fHistSL=new TH1F("HistSL","#sigma_{Landau};#sigma_{Landau};N",40,0,16);
	fHistSL->SetDirectory(0);
	listout2->Add(fHistSL);
	
	TH1F* fHistSG=new TH1F("HistSG","#sigma_{Gaus};#sigma_{Gaus};N",40,0,16);
	fHistSG->SetDirectory(0);
	listout2->Add(fHistSG);
	
	TH1F* fHistCRmean=new TH1F("HistCRmean","HistCRmean;CRmean;N",200,-1,1);
	fHistCRmean->SetDirectory(0);
	listout2->Add(fHistCRmean);
	
	TH1F* fHistCRRMS=new TH1F("HistCRRMS","HistCRRMS;CRRMS;N",100,0,1);
	fHistCRRMS->SetDirectory(0);
	listout2->Add(fHistCRRMS);
	
	TH1F* fHistGainP=new TH1F("HistGainP","HistGainP;CRGainPcorr;N",120,0.5,2.0);
	fHistGainP->SetDirectory(0);
	listout2->Add(fHistGainP);
	
	TH1F* fHistGainN=new TH1F("HistGainN","HistGainN;CRGainNcorr;N",120,0.5,2.0);
	fHistGainN->SetDirectory(0);
	listout2->Add(fHistGainN);
	
	TH1F *fMPVGraph = new TH1F("MPVgraph","MPVgraph;Module number;MPV",1698,-0.5,1697.5);
	fMPVGraph->SetMarkerColor(kRed);
	fMPVGraph->SetMarkerStyle(22);
	listout2->Add(fMPVGraph);
	
	TH1F *fCRmeanGraph = new TH1F("CRmeangraph","CRmeangraph;Module number;MPV",1698,-0.5,1697.5);
	fCRmeanGraph->SetMarkerColor(kBlue);
	fCRmeanGraph->SetMarkerStyle(23);
	listout2->Add(fCRmeanGraph);
	
	Float_t gainP[1698];
	Float_t gainN[1698];
	Float_t mpv[1698];
	Int_t flag[1698];	
	
	ofstream outfiletxt;
	outfiletxt.open("gain.txt");
	 outfiletxt.width(10) ;
	outfiletxt.setf(outfiletxt.left);
	outfiletxt<<"MODULE"<<"\t";
	outfiletxt.width(10);
	outfiletxt.setf(outfiletxt.left);
	outfiletxt<<"FLAG"<<"\t";
	outfiletxt.width(10) ;
	outfiletxt.setf(outfiletxt.left);
	outfiletxt<<"GainPcorr"<<"\t";
	outfiletxt.width(10) ;
	outfiletxt.setf(outfiletxt.left);
	outfiletxt<<"GainNcorr"<<"\t";
	outfiletxt.width(10) ;
	outfiletxt.setf(outfiletxt.left);
	outfiletxt<<"MPV"<<endl;
	
	
	ofstream outfiletxtbad;
	outfiletxtbad.open("badModules.txt");
	
	
	
	
	for (int i =0;i<1698;i++)
	{
		cout<<i<<endl;
		TString tmpQ("Q");
		tmpQ+=i;
		TString tmpCR("CR");
		tmpCR+=i;
		TH1D* fHist1DCR= fHistCR->ProjectionY(tmpCR,i+1,i+1);
		Double_t mean=fHist1DCR->GetMean();
		if(!(TMath::Abs(mean)<1.0)||fHist1DCR->GetEntries()<10)
		{		
			flag[i]=-2;
			gainN[i]=1.0;
			gainP[i]=1.0;
			mpv[i]=1.0;
			continue;
		}
		fHistCRmean->Fill(mean);
		fHistCRRMS->Fill(fHist1DCR->GetRMS());
		gainN[i]=1.0/(1.0+mean);
		gainP[i]=1.0/(1.0-mean);
		fHistGainP->Fill(gainP[i]);
		fHistGainN->Fill(gainN[i]);
		fCRmeanGraph->SetBinContent(i+1,mean);
		fCRmeanGraph->SetBinError(i+1,fHist1DCR->GetRMS());
		
		
		TH1D* fHist1DQ=fHistQ->ProjectionY(tmpQ,i+1,i+1);
		 fHist1DQ->SetDirectory(0);
		 listout1->Add(fHist1DQ);
		if(fHist1DQ->GetEntries()<ntofit)
		{
			flag[i]=-1;
			mpv[i]=1.0;
			 outfiletxtbad<<"Low statistic \t module= "<<i<<" netries="<<fHist1DQ->GetEntries()<<endl;
			continue;
		}
		else
		{
			tmpQ+="fit";
			Float_t range=fHist1DQ->GetBinCenter(fHist1DQ->GetMaximumBin());
			TF1 *f1 = new TF1(tmpQ,convolution,range*0.45,range*3.0,4);
			f1->SetParameters(7.0,range,1.0,5.5);
			Float_t normalization=fHist1DQ->GetEntries()*fHist1DQ->GetXaxis()->GetBinWidth(2)/f1->Integral(range*0.45,range*3.0);
			f1->SetParameters(7.0,range,normalization,5.5);
			//f1->SetParameters(7.0,range,fHist1DQ->GetMaximum(),5.5);
			f1->SetParNames("sigma Landau","MPV","N","sigma Gaus");
			f1->SetParLimits(0,2.0,100.0);
			f1->SetParLimits(3,0.0,100.0);
			if(fHist1DQ->Fit(tmpQ,"BRQ")==0)
			{
				mpv[i]=f1->GetParameter(1);
				fHistMPVs->Fill(mpv[i]);
				fHistSL->Fill(f1->GetParameter(0));
				fHistSG->Fill(f1->GetParameter(3));
				flag[i]=1;		
				fMPVGraph->SetBinContent(i+1,f1->GetParameter(1));
				fMPVGraph->SetBinError(i+1,f1->GetParError(1));
				if(mpv[i]<75.0)
				{
					outfiletxtbad<<"MPV lower than 75 \t module="<<i<<endl;
					flag[i]=0;
				}	
				if(mpv[i]>100.0)
				{
					outfiletxtbad<<"MPV higher than 100 \t module="<<i<<endl;
					flag[i]=0;
					
				}
				if(f1->GetParError(1)>1.0)
				{
					outfiletxtbad<<"MPV high error on MPV  \t module="<<i<<endl;				
					flag[i]=0;
				}
			}
			else
			{
				mpv[i]=1;
				flag[i]=0;
				 outfiletxtbad<<"BAD FIT \t module="<<i<<endl;
				//continue;
			}	
		}	
	}	
	
	for (int i=0;i<1698;i++)
	{	
		outfiletxt.setf(outfiletxt.scientific);
		outfiletxt.precision(2);	
		 outfiletxt.width(10) ;
		outfiletxt.setf(outfiletxt.left);
		outfiletxt<<i<<"\t";
		 outfiletxt.width(10) ;
		outfiletxt.setf(outfiletxt.left);
		outfiletxt<<flag[i]<<"\t";
		 outfiletxt.width(10) ;
		outfiletxt.setf(outfiletxt.left);
		outfiletxt<<gainP[i]<<"\t";
		 outfiletxt.width(10) ;
		outfiletxt.setf(outfiletxt.left);
		outfiletxt<<gainN[i]<<"\t";
		 outfiletxt.width(10) ;
		outfiletxt.setf(outfiletxt.left);
		outfiletxt<<mpv[i]<<endl;
	}
		 
	TCanvas *c1 = new TCanvas("1","1",1200,800);
	c1->Divide(2,1);
	c1->cd(1);
	fHistQ->Draw("colz");
	c1->cd(2);
	fHistCR->Draw("colz");
	
	
	
	TFile* fout1=TFile::Open("gain_all_fits.root","recreate");
	listout1->Write("output",TObject::kSingleKey);	
	fout1->Close();
	
	TFile* fout2=TFile::Open("gain_control_plots.root","recreate");
	listout2->Write("output",TObject::kSingleKey);	
	fout2->Close();
	
	
	
}
 GetGainModuleLevel.C:1
 GetGainModuleLevel.C:2
 GetGainModuleLevel.C:3
 GetGainModuleLevel.C:4
 GetGainModuleLevel.C:5
 GetGainModuleLevel.C:6
 GetGainModuleLevel.C:7
 GetGainModuleLevel.C:8
 GetGainModuleLevel.C:9
 GetGainModuleLevel.C:10
 GetGainModuleLevel.C:11
 GetGainModuleLevel.C:12
 GetGainModuleLevel.C:13
 GetGainModuleLevel.C:14
 GetGainModuleLevel.C:15
 GetGainModuleLevel.C:16
 GetGainModuleLevel.C:17
 GetGainModuleLevel.C:18
 GetGainModuleLevel.C:19
 GetGainModuleLevel.C:20
 GetGainModuleLevel.C:21
 GetGainModuleLevel.C:22
 GetGainModuleLevel.C:23
 GetGainModuleLevel.C:24
 GetGainModuleLevel.C:25
 GetGainModuleLevel.C:26
 GetGainModuleLevel.C:27
 GetGainModuleLevel.C:28
 GetGainModuleLevel.C:29
 GetGainModuleLevel.C:30
 GetGainModuleLevel.C:31
 GetGainModuleLevel.C:32
 GetGainModuleLevel.C:33
 GetGainModuleLevel.C:34
 GetGainModuleLevel.C:35
 GetGainModuleLevel.C:36
 GetGainModuleLevel.C:37
 GetGainModuleLevel.C:38
 GetGainModuleLevel.C:39
 GetGainModuleLevel.C:40
 GetGainModuleLevel.C:41
 GetGainModuleLevel.C:42
 GetGainModuleLevel.C:43
 GetGainModuleLevel.C:44
 GetGainModuleLevel.C:45
 GetGainModuleLevel.C:46
 GetGainModuleLevel.C:47
 GetGainModuleLevel.C:48
 GetGainModuleLevel.C:49
 GetGainModuleLevel.C:50
 GetGainModuleLevel.C:51
 GetGainModuleLevel.C:52
 GetGainModuleLevel.C:53
 GetGainModuleLevel.C:54
 GetGainModuleLevel.C:55
 GetGainModuleLevel.C:56
 GetGainModuleLevel.C:57
 GetGainModuleLevel.C:58
 GetGainModuleLevel.C:59
 GetGainModuleLevel.C:60
 GetGainModuleLevel.C:61
 GetGainModuleLevel.C:62
 GetGainModuleLevel.C:63
 GetGainModuleLevel.C:64
 GetGainModuleLevel.C:65
 GetGainModuleLevel.C:66
 GetGainModuleLevel.C:67
 GetGainModuleLevel.C:68
 GetGainModuleLevel.C:69
 GetGainModuleLevel.C:70
 GetGainModuleLevel.C:71
 GetGainModuleLevel.C:72
 GetGainModuleLevel.C:73
 GetGainModuleLevel.C:74
 GetGainModuleLevel.C:75
 GetGainModuleLevel.C:76
 GetGainModuleLevel.C:77
 GetGainModuleLevel.C:78
 GetGainModuleLevel.C:79
 GetGainModuleLevel.C:80
 GetGainModuleLevel.C:81
 GetGainModuleLevel.C:82
 GetGainModuleLevel.C:83
 GetGainModuleLevel.C:84
 GetGainModuleLevel.C:85
 GetGainModuleLevel.C:86
 GetGainModuleLevel.C:87
 GetGainModuleLevel.C:88
 GetGainModuleLevel.C:89
 GetGainModuleLevel.C:90
 GetGainModuleLevel.C:91
 GetGainModuleLevel.C:92
 GetGainModuleLevel.C:93
 GetGainModuleLevel.C:94
 GetGainModuleLevel.C:95
 GetGainModuleLevel.C:96
 GetGainModuleLevel.C:97
 GetGainModuleLevel.C:98
 GetGainModuleLevel.C:99
 GetGainModuleLevel.C:100
 GetGainModuleLevel.C:101
 GetGainModuleLevel.C:102
 GetGainModuleLevel.C:103
 GetGainModuleLevel.C:104
 GetGainModuleLevel.C:105
 GetGainModuleLevel.C:106
 GetGainModuleLevel.C:107
 GetGainModuleLevel.C:108
 GetGainModuleLevel.C:109
 GetGainModuleLevel.C:110
 GetGainModuleLevel.C:111
 GetGainModuleLevel.C:112
 GetGainModuleLevel.C:113
 GetGainModuleLevel.C:114
 GetGainModuleLevel.C:115
 GetGainModuleLevel.C:116
 GetGainModuleLevel.C:117
 GetGainModuleLevel.C:118
 GetGainModuleLevel.C:119
 GetGainModuleLevel.C:120
 GetGainModuleLevel.C:121
 GetGainModuleLevel.C:122
 GetGainModuleLevel.C:123
 GetGainModuleLevel.C:124
 GetGainModuleLevel.C:125
 GetGainModuleLevel.C:126
 GetGainModuleLevel.C:127
 GetGainModuleLevel.C:128
 GetGainModuleLevel.C:129
 GetGainModuleLevel.C:130
 GetGainModuleLevel.C:131
 GetGainModuleLevel.C:132
 GetGainModuleLevel.C:133
 GetGainModuleLevel.C:134
 GetGainModuleLevel.C:135
 GetGainModuleLevel.C:136
 GetGainModuleLevel.C:137
 GetGainModuleLevel.C:138
 GetGainModuleLevel.C:139
 GetGainModuleLevel.C:140
 GetGainModuleLevel.C:141
 GetGainModuleLevel.C:142
 GetGainModuleLevel.C:143
 GetGainModuleLevel.C:144
 GetGainModuleLevel.C:145
 GetGainModuleLevel.C:146
 GetGainModuleLevel.C:147
 GetGainModuleLevel.C:148
 GetGainModuleLevel.C:149
 GetGainModuleLevel.C:150
 GetGainModuleLevel.C:151
 GetGainModuleLevel.C:152
 GetGainModuleLevel.C:153
 GetGainModuleLevel.C:154
 GetGainModuleLevel.C:155
 GetGainModuleLevel.C:156
 GetGainModuleLevel.C:157
 GetGainModuleLevel.C:158
 GetGainModuleLevel.C:159
 GetGainModuleLevel.C:160
 GetGainModuleLevel.C:161
 GetGainModuleLevel.C:162
 GetGainModuleLevel.C:163
 GetGainModuleLevel.C:164
 GetGainModuleLevel.C:165
 GetGainModuleLevel.C:166
 GetGainModuleLevel.C:167
 GetGainModuleLevel.C:168
 GetGainModuleLevel.C:169
 GetGainModuleLevel.C:170
 GetGainModuleLevel.C:171
 GetGainModuleLevel.C:172
 GetGainModuleLevel.C:173
 GetGainModuleLevel.C:174
 GetGainModuleLevel.C:175
 GetGainModuleLevel.C:176
 GetGainModuleLevel.C:177
 GetGainModuleLevel.C:178
 GetGainModuleLevel.C:179
 GetGainModuleLevel.C:180
 GetGainModuleLevel.C:181
 GetGainModuleLevel.C:182
 GetGainModuleLevel.C:183
 GetGainModuleLevel.C:184
 GetGainModuleLevel.C:185
 GetGainModuleLevel.C:186
 GetGainModuleLevel.C:187
 GetGainModuleLevel.C:188
 GetGainModuleLevel.C:189
 GetGainModuleLevel.C:190
 GetGainModuleLevel.C:191
 GetGainModuleLevel.C:192
 GetGainModuleLevel.C:193
 GetGainModuleLevel.C:194
 GetGainModuleLevel.C:195
 GetGainModuleLevel.C:196
 GetGainModuleLevel.C:197
 GetGainModuleLevel.C:198
 GetGainModuleLevel.C:199
 GetGainModuleLevel.C:200
 GetGainModuleLevel.C:201
 GetGainModuleLevel.C:202
 GetGainModuleLevel.C:203
 GetGainModuleLevel.C:204
 GetGainModuleLevel.C:205
 GetGainModuleLevel.C:206
 GetGainModuleLevel.C:207
 GetGainModuleLevel.C:208
 GetGainModuleLevel.C:209
 GetGainModuleLevel.C:210
 GetGainModuleLevel.C:211
 GetGainModuleLevel.C:212
 GetGainModuleLevel.C:213
 GetGainModuleLevel.C:214
 GetGainModuleLevel.C:215
 GetGainModuleLevel.C:216
 GetGainModuleLevel.C:217
 GetGainModuleLevel.C:218
 GetGainModuleLevel.C:219
 GetGainModuleLevel.C:220
 GetGainModuleLevel.C:221
 GetGainModuleLevel.C:222
 GetGainModuleLevel.C:223
 GetGainModuleLevel.C:224
 GetGainModuleLevel.C:225
 GetGainModuleLevel.C:226
 GetGainModuleLevel.C:227
 GetGainModuleLevel.C:228
 GetGainModuleLevel.C:229
 GetGainModuleLevel.C:230
 GetGainModuleLevel.C:231
 GetGainModuleLevel.C:232
 GetGainModuleLevel.C:233
 GetGainModuleLevel.C:234
 GetGainModuleLevel.C:235
 GetGainModuleLevel.C:236
 GetGainModuleLevel.C:237
 GetGainModuleLevel.C:238
 GetGainModuleLevel.C:239
 GetGainModuleLevel.C:240
 GetGainModuleLevel.C:241
 GetGainModuleLevel.C:242
 GetGainModuleLevel.C:243
 GetGainModuleLevel.C:244
 GetGainModuleLevel.C:245
 GetGainModuleLevel.C:246
 GetGainModuleLevel.C:247
 GetGainModuleLevel.C:248
 GetGainModuleLevel.C:249
 GetGainModuleLevel.C:250
 GetGainModuleLevel.C:251
 GetGainModuleLevel.C:252
 GetGainModuleLevel.C:253
 GetGainModuleLevel.C:254
 GetGainModuleLevel.C:255
 GetGainModuleLevel.C:256
 GetGainModuleLevel.C:257
 GetGainModuleLevel.C:258
 GetGainModuleLevel.C:259
 GetGainModuleLevel.C:260
 GetGainModuleLevel.C:261
 GetGainModuleLevel.C:262
 GetGainModuleLevel.C:263
 GetGainModuleLevel.C:264
 GetGainModuleLevel.C:265
 GetGainModuleLevel.C:266
 GetGainModuleLevel.C:267
 GetGainModuleLevel.C:268
 GetGainModuleLevel.C:269
 GetGainModuleLevel.C:270
 GetGainModuleLevel.C:271
 GetGainModuleLevel.C:272
 GetGainModuleLevel.C:273
 GetGainModuleLevel.C:274
 GetGainModuleLevel.C:275
 GetGainModuleLevel.C:276
 GetGainModuleLevel.C:277
 GetGainModuleLevel.C:278
 GetGainModuleLevel.C:279
 GetGainModuleLevel.C:280
 GetGainModuleLevel.C:281
 GetGainModuleLevel.C:282
 GetGainModuleLevel.C:283
 GetGainModuleLevel.C:284
 GetGainModuleLevel.C:285
 GetGainModuleLevel.C:286
 GetGainModuleLevel.C:287
 GetGainModuleLevel.C:288
 GetGainModuleLevel.C:289
 GetGainModuleLevel.C:290
 GetGainModuleLevel.C:291
 GetGainModuleLevel.C:292
 GetGainModuleLevel.C:293
 GetGainModuleLevel.C:294
 GetGainModuleLevel.C:295
 GetGainModuleLevel.C:296
 GetGainModuleLevel.C:297
 GetGainModuleLevel.C:298
 GetGainModuleLevel.C:299
 GetGainModuleLevel.C:300
 GetGainModuleLevel.C:301
 GetGainModuleLevel.C:302
 GetGainModuleLevel.C:303
 GetGainModuleLevel.C:304
 GetGainModuleLevel.C:305
 GetGainModuleLevel.C:306
 GetGainModuleLevel.C:307
 GetGainModuleLevel.C:308
 GetGainModuleLevel.C:309
 GetGainModuleLevel.C:310
 GetGainModuleLevel.C:311
 GetGainModuleLevel.C:312
 GetGainModuleLevel.C:313
 GetGainModuleLevel.C:314
 GetGainModuleLevel.C:315
 GetGainModuleLevel.C:316
 GetGainModuleLevel.C:317
 GetGainModuleLevel.C:318
 GetGainModuleLevel.C:319
 GetGainModuleLevel.C:320