ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include "AliRawReaderRoot.h"
#include "AliCaloRawStream.h"
#include "TString.h"
#include "TH2F.h"
#include "TH1S.h"
#include "TFile.h"
#include "TStopwatch.h"
#include "iostream.h"

#endif

/* $Id$ */

void PedAmp(const char *rawFile, const Int_t debug=0)
{
  // Read raw data, decode it to samples,
  // calculate pedestals from presamples, 
  // evaluate the signal amplitude as a maximum sample, 
  // and fill histograms with pedestals and amplitudes
  // This script should be compiled to speed up the data processing:
  // .L PedAmp.C++
  //___
  // Yuri Kharlov. 6 September 2007

  TStopwatch stopwatch;
  stopwatch.Start();
  
  AliRawReaderRoot* rf = new AliRawReaderRoot(rawFile);
  AliCaloRawStream in(rf,"PHOS");
  in.SetOldRCUFormat(kTRUE);
  const Int_t nPresample = 10;

  TString baseNamePed ="hPed";
  TString baseTitlePed="Ped in cell (";
  TString baseNameLed ="hLED";
  TString baseTitleLed="LED in cell (";
  const char* sgain[2]={"high","low"};

  const Int_t gainMax=2,modMax=5,colMax=56,rowMax=64;
  TH1F *hPed[2][56][64];
  TH1F *hLed[2][56][64];
  for (Int_t gain=0; gain<gainMax; gain++) {
    for (Int_t mod=0; mod<modMax; mod++) {
      for (Int_t col=0; col<colMax; col++) {
	for (Int_t row=0; row<rowMax; row++) {
	  hPed[gain][col][row] = 0;
	  hLed[gain][col][row] = 0;
	}
      }
    }
  }
  TH1F *hPedHiMean1 = new TH1F("hPedHiMean1","Mean pedestals, high gain" ,100,0.,100.);
  TH1F *hPedHiRMS1  = new TH1F("hPedHiRMS1" ,"RMS pedestals, high gain"  ,100,0.,50.);
  TH1F *hPedLoMean1 = new TH1F("hPedLoMean1","Mean pedestals, low gain"  ,100,0.,100.);
  TH1F *hPedLoRMS1  = new TH1F("hPedLoRMS1" ,"RMS pedestals, low gain"   ,100,0.,50.);
  hPedHiMean1->Sumw2();
  hPedHiRMS1 ->Sumw2();
  hPedLoMean1->Sumw2();
  hPedLoRMS1 ->Sumw2();

  TH2F *hPedHiMean  = new TH2F("hPedHiMean","Mean pedestals, high gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hPedHiRMS   = new TH2F("hPedHiRMS" ,"R.M.S. of pedestals, high gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hPedHiNum   = new TH2F("hPedHiNum" ,"Number of pedestals, high gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hPedLoMean  = new TH2F("hPedLoMean","Mean pedestals, low gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hPedLoRMS   = new TH2F("hPedLoRMS" ,"R.M.S. of pedestals, low gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hPedLoNum   = new TH2F("hPedLoNum" ,"Number of pedestals, low gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  
  TH2F *hLedHiMean  = new TH2F("hLedHiMean","Mean LED, high gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hLedHiRMS   = new TH2F("hLedHiRMS" ,"R.M.S. of LED, high gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hLedHiNum   = new TH2F("hLedHiNum" ,"Number of LED, high gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hLedLoMean  = new TH2F("hLedLoMean","Mean LED, low gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hLedLoRMS   = new TH2F("hLedLoRMS" ,"R.M.S. of LED, low gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);
  TH2F *hLedLoNum   = new TH2F("hLedLoNum" ,"Number of LED, low gain",
			       rowMax,0.,rowMax, colMax,0.,colMax);

  Int_t iEvent=0;
  Int_t iBin=0;
  Int_t gain=-1,mod=-1,col=-1,row=-1;
  Int_t runNum = 0;
  Double_t maxAmp = 0;
//   Double_t meanPed,rmsPed;
  Float_t pedMean = 0;
  Int_t   nPed = 0;
  while (rf->NextEvent()) {
    cout << "\n\n\tEvent "<< iEvent << " of type " << rf->GetType() << endl;
    runNum = rf->GetRunNumber();
    while ( in.Next() ) {
      if (!in.IsNewHWAddress() && debug > 1) {
	cout << " time=" << in.GetTime() << "/"<< in.GetTimeLength()
	     << " amp=" <<  in.GetSignal() <<endl;
      }
      if (in.IsNewHWAddress()) {
	iBin   = 0;
	if (gain!=-1 && col!=-1 && row!=-1) {
	  if (nPed < 1) continue;
	  maxAmp -= (Double_t)(pedMean/nPed); // "pedestal subtraction"
	  if (maxAmp > 5) hLed[gain][col][row]->Fill(maxAmp);
	}
	maxAmp  = 0;
	pedMean = 0;
	nPed    = 0;
	gain = in.IsLowGain(); // 0-high, 1-low
	mod  = in.GetModule();
	col  = in.GetColumn();
	row  = in.GetRow();
	if (debug > 0) {
	  cout << "\n\tNew HW address: "<<in.GetHWAddress()
	       << ", gain="<< gain
	       << ", module="<<mod
	       << ", xz=("<<col<<","<<row<<")"<< endl;
	}

	// Create a new histo for the new cell, if it does not exist yet
	if (!hPed[gain][col][row]) {
	  TString name  = baseNamePed;
	  TString title = baseTitlePed;
	  name +="_g"; name +=gain;
	  name +="_m"; name +=mod;
	  name +="_z"; name +=col;
	  name +="_x"; name +=row;

	  title +=mod; title +=",";
	  title +=col; title +=",";
	  title +=row; title +="), ";
	  title +=sgain[gain]; title +=" gain";

	  hPed[gain][col][row] = new TH1F(name,title,100,0.,100.);
	  hPed[gain][col][row]->Sumw2();
	  hPed[gain][col][row]->SetMarkerStyle(20);
	  hPed[gain][col][row]->SetOption("eph");
	}
	if (!hLed[gain][col][row]) {
	  TString name  = baseNameLed;
	  TString title = baseTitleLed;
	  name +="_g"; name +=gain;
	  name +="_m"; name +=mod;
	  name +="_z"; name +=col;
	  name +="_x"; name +=row;

	  title +=mod; title +=",";
	  title +=col; title +=",";
	  title +=row; title +="), ";
	  title +=sgain[gain]; title +=" gain";

	  hLed[gain][col][row] = new TH1F(name,title,1023,0.,1023.);
	  hLed[gain][col][row]->Sumw2();
	  hLed[gain][col][row]->SetMarkerStyle(20);
	  hLed[gain][col][row]->SetOption("eph");
	}
      }

      iBin++;
      // Assume that first nPresample are pedestals
      if (in.GetTimeLength()-iBin < nPresample) {
	hPed[gain][col][row]->Fill(in.GetSignal());
	pedMean += in.GetSignal();
	nPed++;
      }
      if (in.GetSignal() > maxAmp) maxAmp = in.GetSignal();
    } // end of next signal
    iEvent++;
  } // end of next event

  // Fill 2-dim histograms for mean, rms and n pedestals

  gain = 0;
  for (Int_t col=0; col<colMax; col++) {
    for (Int_t row=0; row<rowMax; row++) {
      if (hPed[gain][col][row] != 0) {
	hPedHiMean1->Fill( hPed[gain][col][row]->GetMean());
	hPedHiRMS1 ->Fill( hPed[gain][col][row]->GetRMS() );
	hPedHiMean ->Fill( (Double_t)row, (Double_t)col, hPed[gain][col][row]->GetMean()    );
	hPedHiRMS  ->Fill( (Double_t)row, (Double_t)col, hPed[gain][col][row]->GetRMS()     );
	hPedHiNum  ->Fill( (Double_t)row, (Double_t)col, hPed[gain][col][row]->GetEntries() );
      }
      if (hLed[gain][col][row] != 0) {
	hLedHiMean ->Fill( (Double_t)row, (Double_t)col, hLed[gain][col][row]->GetMean()    );
	hLedHiRMS  ->Fill( (Double_t)row, (Double_t)col, hLed[gain][col][row]->GetRMS()     );
	hLedHiNum  ->Fill( (Double_t)row, (Double_t)col, hLed[gain][col][row]->GetEntries() );
      }
    }
  }
  gain = 1;
  for (Int_t col=0; col<colMax; col++) {
    for (Int_t row=0; row<rowMax; row++) {
      if (hPed[gain][col][row] != 0) {
	hPedLoMean1->Fill( hPed[gain][col][row]->GetMean());
	hPedLoRMS1 ->Fill( hPed[gain][col][row]->GetRMS() );
	hPedLoMean ->Fill( (Double_t)row, (Double_t)col, hPed[gain][col][row]->GetMean()    );
	hPedLoRMS  ->Fill( (Double_t)row, (Double_t)col, hPed[gain][col][row]->GetRMS()     );
	hPedLoNum  ->Fill( (Double_t)row, (Double_t)col, hPed[gain][col][row]->GetEntries() );
      }
      if (hLed[gain][col][row] != 0) {
	hLedLoMean ->Fill( (Double_t)row, (Double_t)col, hLed[gain][col][row]->GetMean()    );
	hLedLoRMS  ->Fill( (Double_t)row, (Double_t)col, hLed[gain][col][row]->GetRMS()     );
	hLedLoNum  ->Fill( (Double_t)row, (Double_t)col, hLed[gain][col][row]->GetEntries() );
      }
    }
  }

  // Write existing histograms to a root file

  TString fileName = "ped";
  fileName += runNum;
  fileName += ".root";
  TFile *file = new TFile(fileName,"RECREATE");

  for (Int_t gain=0; gain<gainMax; gain++) {
    for (Int_t col=0; col<colMax; col++) {
      for (Int_t row=0; row<rowMax; row++) {
	if (hPed[gain][col][row] != 0)
	  hPed[gain][col][row]->Write();
	if (hLed[gain][col][row] != 0)
	  hLed[gain][col][row]->Write();
      }
    }
  }
  hPedHiMean1->Write();
  hPedHiRMS1 ->Write();
  hPedLoMean1->Write();
  hPedLoRMS1 ->Write();
  hPedHiMean ->Write();
  hPedHiRMS  ->Write();
  hPedHiNum  ->Write();
  hPedLoMean ->Write();
  hPedLoRMS  ->Write();
  hPedLoNum  ->Write();
  
  hLedHiMean ->Write();
  hLedHiRMS  ->Write();
  hLedHiNum  ->Write();
  hLedLoMean ->Write();
  hLedLoRMS  ->Write();
  hLedLoNum  ->Write();
  
  file->Close();
  stopwatch.Print();
}
 PedAmp.C:1
 PedAmp.C:2
 PedAmp.C:3
 PedAmp.C:4
 PedAmp.C:5
 PedAmp.C:6
 PedAmp.C:7
 PedAmp.C:8
 PedAmp.C:9
 PedAmp.C:10
 PedAmp.C:11
 PedAmp.C:12
 PedAmp.C:13
 PedAmp.C:14
 PedAmp.C:15
 PedAmp.C:16
 PedAmp.C:17
 PedAmp.C:18
 PedAmp.C:19
 PedAmp.C:20
 PedAmp.C:21
 PedAmp.C:22
 PedAmp.C:23
 PedAmp.C:24
 PedAmp.C:25
 PedAmp.C:26
 PedAmp.C:27
 PedAmp.C:28
 PedAmp.C:29
 PedAmp.C:30
 PedAmp.C:31
 PedAmp.C:32
 PedAmp.C:33
 PedAmp.C:34
 PedAmp.C:35
 PedAmp.C:36
 PedAmp.C:37
 PedAmp.C:38
 PedAmp.C:39
 PedAmp.C:40
 PedAmp.C:41
 PedAmp.C:42
 PedAmp.C:43
 PedAmp.C:44
 PedAmp.C:45
 PedAmp.C:46
 PedAmp.C:47
 PedAmp.C:48
 PedAmp.C:49
 PedAmp.C:50
 PedAmp.C:51
 PedAmp.C:52
 PedAmp.C:53
 PedAmp.C:54
 PedAmp.C:55
 PedAmp.C:56
 PedAmp.C:57
 PedAmp.C:58
 PedAmp.C:59
 PedAmp.C:60
 PedAmp.C:61
 PedAmp.C:62
 PedAmp.C:63
 PedAmp.C:64
 PedAmp.C:65
 PedAmp.C:66
 PedAmp.C:67
 PedAmp.C:68
 PedAmp.C:69
 PedAmp.C:70
 PedAmp.C:71
 PedAmp.C:72
 PedAmp.C:73
 PedAmp.C:74
 PedAmp.C:75
 PedAmp.C:76
 PedAmp.C:77
 PedAmp.C:78
 PedAmp.C:79
 PedAmp.C:80
 PedAmp.C:81
 PedAmp.C:82
 PedAmp.C:83
 PedAmp.C:84
 PedAmp.C:85
 PedAmp.C:86
 PedAmp.C:87
 PedAmp.C:88
 PedAmp.C:89
 PedAmp.C:90
 PedAmp.C:91
 PedAmp.C:92
 PedAmp.C:93
 PedAmp.C:94
 PedAmp.C:95
 PedAmp.C:96
 PedAmp.C:97
 PedAmp.C:98
 PedAmp.C:99
 PedAmp.C:100
 PedAmp.C:101
 PedAmp.C:102
 PedAmp.C:103
 PedAmp.C:104
 PedAmp.C:105
 PedAmp.C:106
 PedAmp.C:107
 PedAmp.C:108
 PedAmp.C:109
 PedAmp.C:110
 PedAmp.C:111
 PedAmp.C:112
 PedAmp.C:113
 PedAmp.C:114
 PedAmp.C:115
 PedAmp.C:116
 PedAmp.C:117
 PedAmp.C:118
 PedAmp.C:119
 PedAmp.C:120
 PedAmp.C:121
 PedAmp.C:122
 PedAmp.C:123
 PedAmp.C:124
 PedAmp.C:125
 PedAmp.C:126
 PedAmp.C:127
 PedAmp.C:128
 PedAmp.C:129
 PedAmp.C:130
 PedAmp.C:131
 PedAmp.C:132
 PedAmp.C:133
 PedAmp.C:134
 PedAmp.C:135
 PedAmp.C:136
 PedAmp.C:137
 PedAmp.C:138
 PedAmp.C:139
 PedAmp.C:140
 PedAmp.C:141
 PedAmp.C:142
 PedAmp.C:143
 PedAmp.C:144
 PedAmp.C:145
 PedAmp.C:146
 PedAmp.C:147
 PedAmp.C:148
 PedAmp.C:149
 PedAmp.C:150
 PedAmp.C:151
 PedAmp.C:152
 PedAmp.C:153
 PedAmp.C:154
 PedAmp.C:155
 PedAmp.C:156
 PedAmp.C:157
 PedAmp.C:158
 PedAmp.C:159
 PedAmp.C:160
 PedAmp.C:161
 PedAmp.C:162
 PedAmp.C:163
 PedAmp.C:164
 PedAmp.C:165
 PedAmp.C:166
 PedAmp.C:167
 PedAmp.C:168
 PedAmp.C:169
 PedAmp.C:170
 PedAmp.C:171
 PedAmp.C:172
 PedAmp.C:173
 PedAmp.C:174
 PedAmp.C:175
 PedAmp.C:176
 PedAmp.C:177
 PedAmp.C:178
 PedAmp.C:179
 PedAmp.C:180
 PedAmp.C:181
 PedAmp.C:182
 PedAmp.C:183
 PedAmp.C:184
 PedAmp.C:185
 PedAmp.C:186
 PedAmp.C:187
 PedAmp.C:188
 PedAmp.C:189
 PedAmp.C:190
 PedAmp.C:191
 PedAmp.C:192
 PedAmp.C:193
 PedAmp.C:194
 PedAmp.C:195
 PedAmp.C:196
 PedAmp.C:197
 PedAmp.C:198
 PedAmp.C:199
 PedAmp.C:200
 PedAmp.C:201
 PedAmp.C:202
 PedAmp.C:203
 PedAmp.C:204
 PedAmp.C:205
 PedAmp.C:206
 PedAmp.C:207
 PedAmp.C:208
 PedAmp.C:209
 PedAmp.C:210
 PedAmp.C:211
 PedAmp.C:212
 PedAmp.C:213
 PedAmp.C:214
 PedAmp.C:215
 PedAmp.C:216
 PedAmp.C:217
 PedAmp.C:218
 PedAmp.C:219
 PedAmp.C:220
 PedAmp.C:221
 PedAmp.C:222
 PedAmp.C:223
 PedAmp.C:224
 PedAmp.C:225
 PedAmp.C:226
 PedAmp.C:227
 PedAmp.C:228
 PedAmp.C:229
 PedAmp.C:230
 PedAmp.C:231
 PedAmp.C:232
 PedAmp.C:233
 PedAmp.C:234
 PedAmp.C:235
 PedAmp.C:236
 PedAmp.C:237
 PedAmp.C:238
 PedAmp.C:239
 PedAmp.C:240
 PedAmp.C:241
 PedAmp.C:242
 PedAmp.C:243
 PedAmp.C:244
 PedAmp.C:245
 PedAmp.C:246
 PedAmp.C:247
 PedAmp.C:248
 PedAmp.C:249
 PedAmp.C:250
 PedAmp.C:251