ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TH2F.h>
#include <TCanvas.h>
#include <TStopwatch.h>
#include <TStyle.h>
#include <TLatex.h>
#include <TFile.h>
#include <TGrid.h>
#include "AliRawReader.h"
#include "AliRawReaderDate.h"
#include "AliRawReaderRoot.h"
#include "AliITSOnlineSDDBase.h"
#include "AliITSOnlineSDDCMN.h"
#include "AliITSOnlineSDDTP.h"
#include "AliITSRawStreamSDD.h"
#include "AliITSRawStreamSDDCompressed.h"
#endif

// Macro for the analysis of PULSER runs (equivalent to ITSSDDGAINda.cxx)
// Two functions named AnalyzeSDDGainAllModules: 
// The first is for analyzing a local raw data file and takes as agrument the file name.
// The second is for running on ALIEN
// All DDLs are analyzed, the argument nDDL selects the DDL to be plotted
// Origin: F. Prino (prino@to.infn.it)


void AnalyzeSDDGainAllMod(Char_t *datafil, 
			  Int_t adcfreq=20, 
			  Int_t nDDL=0, 
			  Int_t firstEv=18, 
			  Int_t lastEv=22, 
			  Float_t pascalDAC=100){

  const Int_t kTotDDL=24;
  const Int_t kModPerDDL=12;
  const Int_t kSides=2;
  Bool_t writtenoutput=kFALSE;


  TH2F** histo = new TH2F*[kTotDDL*kModPerDDL*kSides];
  AliITSOnlineSDDTP **anal=new AliITSOnlineSDDTP*[kTotDDL*kModPerDDL*kSides];
  Bool_t isFilled[kTotDDL*kModPerDDL*kSides];

  Char_t hisnam[20];
  for(Int_t iddl=0; iddl<kTotDDL;iddl++){
    for(Int_t imod=0; imod<kModPerDDL;imod++){
      for(Int_t isid=0;isid<kSides;isid++){
	Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
	anal[index]=new AliITSOnlineSDDTP(iddl,imod,isid,pascalDAC);
	if(adcfreq==40) anal[index]->SetLastGoodTB(254);
	else anal[index]->SetLastGoodTB(126);
	sprintf(hisnam,"h%02dc%02ds%d",iddl,imod,isid);
	histo[index]=new TH2F(hisnam,"",256,-0.5,255.5,256,-0.5,255.5);
	isFilled[index]=0;
      }
    }
  }

  TCanvas* c0 = new TCanvas("c0","Ev Display",900,900);
  gStyle->SetPalette(1);
  Char_t text[50];

  Int_t iev=firstEv;
  AliRawReader *rd; 
  if(strstr(datafil,".root")!=0){
    rd=new AliRawReaderRoot(datafil,iev);
  }else{
    rd=new AliRawReaderDate(datafil,iev);
  }
  TLatex *t0=new TLatex();
  t0->SetNDC();
  t0->SetTextSize(0.06);
  t0->SetTextColor(4);

  do{
    c0->Clear();
    c0->Divide(4,6,0.001,0.001);
    printf("Event # %d\n",iev);
    rd->Reset();
    for(Int_t iddl=0; iddl<kTotDDL;iddl++){
      for(Int_t imod=0; imod<kModPerDDL;imod++){
	for(Int_t isid=0;isid<kSides;isid++){
	  Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
	  histo[index]->Reset();
	}
      }
    }

    UChar_t cdhAttr=AliITSRawStreamSDD::ReadBlockAttributes(rd);
    UInt_t amSamplFreq=AliITSRawStreamSDD::ReadAMSamplFreqFromCDH(cdhAttr);
    AliITSRawStream* s=AliITSRawStreamSDD::CreateRawStreamSDD(rd,cdhAttr);
    if(!writtenoutput){
      printf("Use %s raw stream, sampling frequency %d MHz\n",s->ClassName(),amSamplFreq);
      writtenoutput=kTRUE;
    }
    while(s->Next()){
      Int_t iDDL=rd->GetDDLID();
      Int_t iCarlos=s->GetCarlosId();
      if(s->IsCompletedModule()) continue;
      if(s->IsCompletedDDL()) continue;
      if(iDDL>=0 && iDDL<kTotDDL){ 
	Int_t index=kSides*(kModPerDDL*iDDL+iCarlos)+s->GetChannel(); 
	histo[index]->Fill(s->GetCoord2(),s->GetCoord1(),s->GetSignal());
	isFilled[index]=1;
      }
    }
    delete s;
    iev++;
    for(Int_t iddl=0; iddl<kTotDDL;iddl++){
      for(Int_t imod=0; imod<kModPerDDL;imod++){
	for(Int_t isid=0;isid<kSides;isid++){
	  Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
	  anal[index]->AddEvent(histo[index]);
	  if(iddl==nDDL){
	    Int_t index2=kSides*imod+isid;
	    c0->cd(index2+1);
	    histo[index]->DrawCopy("colz");
	    sprintf(text,"DDL %d channel %d Side %d",nDDL,imod,isid);
	    t0->DrawLatex(0.15,0.92,text);
	    c0->Update();
	  }
	}
      }
    }
    printf(" --- OK\n");
  }while(rd->NextEvent()&&iev<=lastEv);

  TH1F *htotgain=new TH1F("htotgain","",100,0.2,4.2);
  TH1F *htotpeakpos=new TH1F("htotpeakpos","",256,-0.5,255.5);
  TH1F *hstatus=new TH1F("hstatus","",2,-0.5,1.5);

  TFile *outfil=new TFile("SDDgain-results.root","recreate");
  for(Int_t iddl=0; iddl<kTotDDL;iddl++){
    for(Int_t imod=0; imod<kModPerDDL;imod++){
      for(Int_t isid=0;isid<kSides;isid++){
	Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
	if(isFilled[index]){
	  anal[index]->ValidateAnodes();
	  anal[index]->WriteToASCII();
	  anal[index]->WriteToROOT(outfil);
	  for(Int_t ian=0; ian<256;ian++){
	    Float_t gain=anal[index]->GetChannelGain(ian);
	    Float_t ppos=anal[index]->GetTimeBinTPPeak(ian);
	    Int_t anstatus=anal[index]->IsAnodeGood(ian);
	    hstatus->Fill(anstatus);
	    htotgain->Fill(gain);
	    htotpeakpos->Fill(ppos);
	  }
	}
      }
    }
  }
  outfil->Close();

  // Draw Statistics of baselines and noise
  TCanvas *call=new TCanvas("call","General stats",700,700);
  call->Divide(2,2);
  call->cd(1);
  htotpeakpos->Draw();
  htotpeakpos->GetXaxis()->SetTitle("TP peak position (Time Bin)");
  htotpeakpos->GetXaxis()->SetTitleSize(0.07);
  htotpeakpos->GetXaxis()->SetTitleOffset(0.6);
  call->cd(2);
  htotgain->Draw();
  htotgain->GetXaxis()->SetTitle("Gain (ADC/DAC)");
  htotgain->GetXaxis()->SetTitleSize(0.07);
  htotgain->GetXaxis()->SetTitleOffset(0.6);
  call->cd(3);
  hstatus->Draw();
  hstatus->GetXaxis()->SetTitle("Anode Status (0=bad 1=good)");
  hstatus->GetXaxis()->SetTitleSize(0.07);
  hstatus->GetXaxis()->SetTitleOffset(0.6);
  call->Update();
  call->SaveAs("GenStatsPulser.gif");

  // Draw baselines and noisegain and TestPulse time bin for all modules

  TH1F** hgain = new TH1F*[kModPerDDL*kSides];
  TH1F** htptb = new TH1F*[kModPerDDL*kSides];

  TCanvas *c1=new TCanvas("c1","DDL: TP position",900,900);
  c1->SetBottomMargin(0.14);
  c1->Divide(4,6,0.001,0.001);
  TCanvas *c2=new TCanvas("c2","DDL: gain",900,900);
  c2->SetBottomMargin(0.14);
  c2->Divide(4,6,0.001,0.001);

  for(Int_t imod=0; imod<kModPerDDL;imod++){
    for(Int_t isid=0;isid<kSides;isid++){
      Int_t index1=kSides*(kModPerDDL*nDDL+imod)+isid;
      Int_t index2=kSides*imod+isid;
      sprintf(text,"DDL %d channel %d Side %d",nDDL,imod,isid);

      TLatex *t3=new TLatex(0.15,0.92,text);
      t3->SetNDC();
      t3->SetTextSize(0.06);
      t3->SetTextColor(4);
      sprintf(hisnam,"hgain%ds%d",imod,isid);
      hgain[index2]=new TH1F(hisnam,"",256,-0.5,255.5);
      sprintf(hisnam,"htptb%ds%d",imod,isid);
      htptb[index2]=new TH1F(hisnam,"",256,-0.5,255.5);
      for(Int_t ian=0;ian<256;ian++){
	hgain[index2]->SetBinContent(ian+1,anal[index1]->GetChannelGain(ian));
	htptb[index2]->SetBinContent(ian+1,anal[index1]->GetTimeBinTPPeak(ian));
      }

      c1->cd(index2+1);
      htptb[index2]->Draw();
    //    htptb[imod]->SetMinimum(0);
    //    htptb[imod]->SetMaximum(75);
      htptb[index2]->GetXaxis()->SetTitle("Anode");
      htptb[index2]->GetYaxis()->SetTitle("TP position (Time Bin)");
      htptb[index2]->GetXaxis()->SetTitleSize(0.07);
      htptb[index2]->GetYaxis()->SetTitleSize(0.07);
      htptb[index2]->GetXaxis()->SetTitleOffset(0.6);
      htptb[index2]->GetYaxis()->SetTitleOffset(0.7);
      t3->Draw();
      c1->Update();


      c2->cd(index2+1); 
      hgain[index2]->SetMinimum(0.);
      hgain[index2]->SetMaximum(4.);
      hgain[index2]->Draw();
      hgain[index2]->GetXaxis()->SetTitle("Anode");
      hgain[index2]->GetYaxis()->SetTitle("Gain");
      hgain[index2]->GetXaxis()->SetTitleSize(0.07);
      hgain[index2]->GetYaxis()->SetTitleSize(0.07);
      hgain[index2]->GetXaxis()->SetTitleOffset(0.6);
      hgain[index2]->GetYaxis()->SetTitleOffset(0.7);
      hgain[index2]->SetStats(0);
      t3->Draw();
      c2->Update();
    }
  }

  c1->SaveAs("TPtimebin.gif");
  c2->SaveAs("Gain.gif");

}

void AnalyzeSDDGainAllMod(Int_t nrun, Int_t n2, Int_t year=2009, Char_t* dir="LHC09b_SDD",
			  Int_t adcfreq=20, 
			  Int_t nDDL=0, 
			  Int_t firstEv=18, 
			  Int_t lastEv=22, 
			  Float_t pascalDAC=100){


  TGrid::Connect("alien:",0,0,"t");
  Char_t filnam[200];
  sprintf(filnam,"alien:///alice/data/%d/%s/%09d/raw/%02d%09d%03d.10.root",year,dir,nrun,year-2000,nrun,n2);
  printf("Open file %s\n",filnam);
  AnalyzeSDDGainAllMod(filnam,adcfreq,nDDL,firstEv,lastEv,pascalDAC);
}
 AnalyzeSDDGainAllMod.C:1
 AnalyzeSDDGainAllMod.C:2
 AnalyzeSDDGainAllMod.C:3
 AnalyzeSDDGainAllMod.C:4
 AnalyzeSDDGainAllMod.C:5
 AnalyzeSDDGainAllMod.C:6
 AnalyzeSDDGainAllMod.C:7
 AnalyzeSDDGainAllMod.C:8
 AnalyzeSDDGainAllMod.C:9
 AnalyzeSDDGainAllMod.C:10
 AnalyzeSDDGainAllMod.C:11
 AnalyzeSDDGainAllMod.C:12
 AnalyzeSDDGainAllMod.C:13
 AnalyzeSDDGainAllMod.C:14
 AnalyzeSDDGainAllMod.C:15
 AnalyzeSDDGainAllMod.C:16
 AnalyzeSDDGainAllMod.C:17
 AnalyzeSDDGainAllMod.C:18
 AnalyzeSDDGainAllMod.C:19
 AnalyzeSDDGainAllMod.C:20
 AnalyzeSDDGainAllMod.C:21
 AnalyzeSDDGainAllMod.C:22
 AnalyzeSDDGainAllMod.C:23
 AnalyzeSDDGainAllMod.C:24
 AnalyzeSDDGainAllMod.C:25
 AnalyzeSDDGainAllMod.C:26
 AnalyzeSDDGainAllMod.C:27
 AnalyzeSDDGainAllMod.C:28
 AnalyzeSDDGainAllMod.C:29
 AnalyzeSDDGainAllMod.C:30
 AnalyzeSDDGainAllMod.C:31
 AnalyzeSDDGainAllMod.C:32
 AnalyzeSDDGainAllMod.C:33
 AnalyzeSDDGainAllMod.C:34
 AnalyzeSDDGainAllMod.C:35
 AnalyzeSDDGainAllMod.C:36
 AnalyzeSDDGainAllMod.C:37
 AnalyzeSDDGainAllMod.C:38
 AnalyzeSDDGainAllMod.C:39
 AnalyzeSDDGainAllMod.C:40
 AnalyzeSDDGainAllMod.C:41
 AnalyzeSDDGainAllMod.C:42
 AnalyzeSDDGainAllMod.C:43
 AnalyzeSDDGainAllMod.C:44
 AnalyzeSDDGainAllMod.C:45
 AnalyzeSDDGainAllMod.C:46
 AnalyzeSDDGainAllMod.C:47
 AnalyzeSDDGainAllMod.C:48
 AnalyzeSDDGainAllMod.C:49
 AnalyzeSDDGainAllMod.C:50
 AnalyzeSDDGainAllMod.C:51
 AnalyzeSDDGainAllMod.C:52
 AnalyzeSDDGainAllMod.C:53
 AnalyzeSDDGainAllMod.C:54
 AnalyzeSDDGainAllMod.C:55
 AnalyzeSDDGainAllMod.C:56
 AnalyzeSDDGainAllMod.C:57
 AnalyzeSDDGainAllMod.C:58
 AnalyzeSDDGainAllMod.C:59
 AnalyzeSDDGainAllMod.C:60
 AnalyzeSDDGainAllMod.C:61
 AnalyzeSDDGainAllMod.C:62
 AnalyzeSDDGainAllMod.C:63
 AnalyzeSDDGainAllMod.C:64
 AnalyzeSDDGainAllMod.C:65
 AnalyzeSDDGainAllMod.C:66
 AnalyzeSDDGainAllMod.C:67
 AnalyzeSDDGainAllMod.C:68
 AnalyzeSDDGainAllMod.C:69
 AnalyzeSDDGainAllMod.C:70
 AnalyzeSDDGainAllMod.C:71
 AnalyzeSDDGainAllMod.C:72
 AnalyzeSDDGainAllMod.C:73
 AnalyzeSDDGainAllMod.C:74
 AnalyzeSDDGainAllMod.C:75
 AnalyzeSDDGainAllMod.C:76
 AnalyzeSDDGainAllMod.C:77
 AnalyzeSDDGainAllMod.C:78
 AnalyzeSDDGainAllMod.C:79
 AnalyzeSDDGainAllMod.C:80
 AnalyzeSDDGainAllMod.C:81
 AnalyzeSDDGainAllMod.C:82
 AnalyzeSDDGainAllMod.C:83
 AnalyzeSDDGainAllMod.C:84
 AnalyzeSDDGainAllMod.C:85
 AnalyzeSDDGainAllMod.C:86
 AnalyzeSDDGainAllMod.C:87
 AnalyzeSDDGainAllMod.C:88
 AnalyzeSDDGainAllMod.C:89
 AnalyzeSDDGainAllMod.C:90
 AnalyzeSDDGainAllMod.C:91
 AnalyzeSDDGainAllMod.C:92
 AnalyzeSDDGainAllMod.C:93
 AnalyzeSDDGainAllMod.C:94
 AnalyzeSDDGainAllMod.C:95
 AnalyzeSDDGainAllMod.C:96
 AnalyzeSDDGainAllMod.C:97
 AnalyzeSDDGainAllMod.C:98
 AnalyzeSDDGainAllMod.C:99
 AnalyzeSDDGainAllMod.C:100
 AnalyzeSDDGainAllMod.C:101
 AnalyzeSDDGainAllMod.C:102
 AnalyzeSDDGainAllMod.C:103
 AnalyzeSDDGainAllMod.C:104
 AnalyzeSDDGainAllMod.C:105
 AnalyzeSDDGainAllMod.C:106
 AnalyzeSDDGainAllMod.C:107
 AnalyzeSDDGainAllMod.C:108
 AnalyzeSDDGainAllMod.C:109
 AnalyzeSDDGainAllMod.C:110
 AnalyzeSDDGainAllMod.C:111
 AnalyzeSDDGainAllMod.C:112
 AnalyzeSDDGainAllMod.C:113
 AnalyzeSDDGainAllMod.C:114
 AnalyzeSDDGainAllMod.C:115
 AnalyzeSDDGainAllMod.C:116
 AnalyzeSDDGainAllMod.C:117
 AnalyzeSDDGainAllMod.C:118
 AnalyzeSDDGainAllMod.C:119
 AnalyzeSDDGainAllMod.C:120
 AnalyzeSDDGainAllMod.C:121
 AnalyzeSDDGainAllMod.C:122
 AnalyzeSDDGainAllMod.C:123
 AnalyzeSDDGainAllMod.C:124
 AnalyzeSDDGainAllMod.C:125
 AnalyzeSDDGainAllMod.C:126
 AnalyzeSDDGainAllMod.C:127
 AnalyzeSDDGainAllMod.C:128
 AnalyzeSDDGainAllMod.C:129
 AnalyzeSDDGainAllMod.C:130
 AnalyzeSDDGainAllMod.C:131
 AnalyzeSDDGainAllMod.C:132
 AnalyzeSDDGainAllMod.C:133
 AnalyzeSDDGainAllMod.C:134
 AnalyzeSDDGainAllMod.C:135
 AnalyzeSDDGainAllMod.C:136
 AnalyzeSDDGainAllMod.C:137
 AnalyzeSDDGainAllMod.C:138
 AnalyzeSDDGainAllMod.C:139
 AnalyzeSDDGainAllMod.C:140
 AnalyzeSDDGainAllMod.C:141
 AnalyzeSDDGainAllMod.C:142
 AnalyzeSDDGainAllMod.C:143
 AnalyzeSDDGainAllMod.C:144
 AnalyzeSDDGainAllMod.C:145
 AnalyzeSDDGainAllMod.C:146
 AnalyzeSDDGainAllMod.C:147
 AnalyzeSDDGainAllMod.C:148
 AnalyzeSDDGainAllMod.C:149
 AnalyzeSDDGainAllMod.C:150
 AnalyzeSDDGainAllMod.C:151
 AnalyzeSDDGainAllMod.C:152
 AnalyzeSDDGainAllMod.C:153
 AnalyzeSDDGainAllMod.C:154
 AnalyzeSDDGainAllMod.C:155
 AnalyzeSDDGainAllMod.C:156
 AnalyzeSDDGainAllMod.C:157
 AnalyzeSDDGainAllMod.C:158
 AnalyzeSDDGainAllMod.C:159
 AnalyzeSDDGainAllMod.C:160
 AnalyzeSDDGainAllMod.C:161
 AnalyzeSDDGainAllMod.C:162
 AnalyzeSDDGainAllMod.C:163
 AnalyzeSDDGainAllMod.C:164
 AnalyzeSDDGainAllMod.C:165
 AnalyzeSDDGainAllMod.C:166
 AnalyzeSDDGainAllMod.C:167
 AnalyzeSDDGainAllMod.C:168
 AnalyzeSDDGainAllMod.C:169
 AnalyzeSDDGainAllMod.C:170
 AnalyzeSDDGainAllMod.C:171
 AnalyzeSDDGainAllMod.C:172
 AnalyzeSDDGainAllMod.C:173
 AnalyzeSDDGainAllMod.C:174
 AnalyzeSDDGainAllMod.C:175
 AnalyzeSDDGainAllMod.C:176
 AnalyzeSDDGainAllMod.C:177
 AnalyzeSDDGainAllMod.C:178
 AnalyzeSDDGainAllMod.C:179
 AnalyzeSDDGainAllMod.C:180
 AnalyzeSDDGainAllMod.C:181
 AnalyzeSDDGainAllMod.C:182
 AnalyzeSDDGainAllMod.C:183
 AnalyzeSDDGainAllMod.C:184
 AnalyzeSDDGainAllMod.C:185
 AnalyzeSDDGainAllMod.C:186
 AnalyzeSDDGainAllMod.C:187
 AnalyzeSDDGainAllMod.C:188
 AnalyzeSDDGainAllMod.C:189
 AnalyzeSDDGainAllMod.C:190
 AnalyzeSDDGainAllMod.C:191
 AnalyzeSDDGainAllMod.C:192
 AnalyzeSDDGainAllMod.C:193
 AnalyzeSDDGainAllMod.C:194
 AnalyzeSDDGainAllMod.C:195
 AnalyzeSDDGainAllMod.C:196
 AnalyzeSDDGainAllMod.C:197
 AnalyzeSDDGainAllMod.C:198
 AnalyzeSDDGainAllMod.C:199
 AnalyzeSDDGainAllMod.C:200
 AnalyzeSDDGainAllMod.C:201
 AnalyzeSDDGainAllMod.C:202
 AnalyzeSDDGainAllMod.C:203
 AnalyzeSDDGainAllMod.C:204
 AnalyzeSDDGainAllMod.C:205
 AnalyzeSDDGainAllMod.C:206
 AnalyzeSDDGainAllMod.C:207
 AnalyzeSDDGainAllMod.C:208
 AnalyzeSDDGainAllMod.C:209
 AnalyzeSDDGainAllMod.C:210
 AnalyzeSDDGainAllMod.C:211
 AnalyzeSDDGainAllMod.C:212
 AnalyzeSDDGainAllMod.C:213
 AnalyzeSDDGainAllMod.C:214
 AnalyzeSDDGainAllMod.C:215
 AnalyzeSDDGainAllMod.C:216
 AnalyzeSDDGainAllMod.C:217
 AnalyzeSDDGainAllMod.C:218
 AnalyzeSDDGainAllMod.C:219
 AnalyzeSDDGainAllMod.C:220
 AnalyzeSDDGainAllMod.C:221
 AnalyzeSDDGainAllMod.C:222
 AnalyzeSDDGainAllMod.C:223
 AnalyzeSDDGainAllMod.C:224
 AnalyzeSDDGainAllMod.C:225
 AnalyzeSDDGainAllMod.C:226
 AnalyzeSDDGainAllMod.C:227
 AnalyzeSDDGainAllMod.C:228
 AnalyzeSDDGainAllMod.C:229
 AnalyzeSDDGainAllMod.C:230
 AnalyzeSDDGainAllMod.C:231
 AnalyzeSDDGainAllMod.C:232
 AnalyzeSDDGainAllMod.C:233
 AnalyzeSDDGainAllMod.C:234
 AnalyzeSDDGainAllMod.C:235
 AnalyzeSDDGainAllMod.C:236
 AnalyzeSDDGainAllMod.C:237
 AnalyzeSDDGainAllMod.C:238
 AnalyzeSDDGainAllMod.C:239
 AnalyzeSDDGainAllMod.C:240
 AnalyzeSDDGainAllMod.C:241
 AnalyzeSDDGainAllMod.C:242
 AnalyzeSDDGainAllMod.C:243
 AnalyzeSDDGainAllMod.C:244
 AnalyzeSDDGainAllMod.C:245
 AnalyzeSDDGainAllMod.C:246
 AnalyzeSDDGainAllMod.C:247
 AnalyzeSDDGainAllMod.C:248
 AnalyzeSDDGainAllMod.C:249
 AnalyzeSDDGainAllMod.C:250
 AnalyzeSDDGainAllMod.C:251
 AnalyzeSDDGainAllMod.C:252
 AnalyzeSDDGainAllMod.C:253
 AnalyzeSDDGainAllMod.C:254
 AnalyzeSDDGainAllMod.C:255
 AnalyzeSDDGainAllMod.C:256