ROOT logo
//____________________________________________________________________
//
// $Id: DrawDigits.C 30718 2009-01-22 16:07:40Z cholm $
//
// Script that contains a class to draw eloss from hits, versus ADC
// counts from digits, using the AliFMDInputHits class in the util library. 
//
// It draws the energy loss versus the p/(mq^2).  It can be overlayed
// with the Bethe-Bloc curve to show how the simulation behaves
// relative to the expected. 
//
// Use the script `Compile.C' to compile this class using ACLic. 
//
#include <TH1D.h>
#include <AliCDBManager.h>
#include <AliFMDHit.h>
#include <AliFMDDigit.h>
#include <AliFMDInput.h>
#include <AliFMDEdepMap.h>
#include <AliFMDParameters.h>
#include <AliFMDCalibStripRange.h>
#include <AliFMDCalibSampleRate.h>
#include <AliFMDCalibGain.h>
#include <AliFMDCalibPedestal.h>
#include <AliFMDRawReader.h>
#include <iostream>
#include <fstream>
#include <TStyle.h>
#include <TArrayF.h>
#include <AliLog.h>
#include <TSystem.h>
#include <TFile.h>

/** @class DrawDigits
    @brief Draw hit energy loss versus digit ADC
    @code 
    Root> .L Compile.C
    Root> Compile("DrawCalibRaw.C")
    Root> DrawCalibRaw cr;
    Root> cr.SetRawFile("file");
    Root> cr.Run();
    @endcode
    @ingroup FMD_script
 */
class DrawCalibRaw : public AliFMDInput
{
private:
  Double_t   fFactor;
  TString    fCalibDir;
  TH1D*      fELoss; // Histogram 
  TObjArray* fDets;
  TFile*     fOut;
  Bool_t     fHasData;
  Int_t      fGotNEvents;

public:
  //__________________________________________________________________
  DrawCalibRaw(const       char*  file, 
	       const char* calibDir    = 0,
	       Double_t    noiseFactor = 5, 
	       Bool_t      save        = kTRUE,
	       Int_t       m           = 420, 
	       Double_t    mmin        = -0.5, 
	       Double_t    mmax        = 20.5) 
    : AliFMDInput(), 
      fFactor(noiseFactor),
      fCalibDir(""), 
      fELoss(0), 
      fDets(0), 
      fOut(0), 
      fHasData(kFALSE),
      fGotNEvents(0)
  { 
    if (calibDir) fCalibDir = calibDir;
    AddLoad(kRawCalib);
    fELoss = new TH1D("eLoss", "Scaled Energy loss", m, mmin, mmax);
    fELoss->SetXTitle("#Delta E/#Delta E_{mip}");
    fELoss->Sumw2();
    fELoss->SetDirectory(0);
    
    SetRawFile(file);

    if (!save) return;
    fDets = new TObjArray(3);

  }
  //__________________________________________________________________
  Bool_t CheckFile(const char* prefix, int number, TString& f)
  {
    f = (Form("%s%d.csv", prefix, number));
    f = gSystem->Which(fCalibDir.Data(), f.Data());
    return !f.IsNull();
  }

  //__________________________________________________________________
  Bool_t Init()
  {
    AliCDBManager* cdb = AliCDBManager::Instance();
    cdb->SetRun(0);
    cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");

    AliFMDCalibStripRange* range = 0;
    AliFMDCalibSampleRate* rate  = 0;
    AliFMDCalibPedestal*   peds  = 0;
    AliFMDCalibGain*       gains = 0;
    for (Int_t i = 1; i <= 3; i++) { 
      TString f;
      if (CheckFile("conditions", i, f)) {
	Info("Init", "Reading conditions for FMD%d from %s", i, f.Data());
	if (!range) range = new AliFMDCalibStripRange;
	if (!rate)  rate  = new AliFMDCalibSampleRate;
	std::ifstream in(f.Data());
	range->ReadFromFile(in);
	rate->ReadFromFile(in);
      }
      if (CheckFile("peds", i, f)) {
	Info("Init", "Reading pedestals for FMD%d from %s", i, f.Data());
	if (!peds) peds = new AliFMDCalibPedestal;
	std::ifstream in(f.Data());
	peds->ReadFromFile(in);
      }
      if (CheckFile("gains", i, f)) {
	Info("Init", "Reading gains for FMD%d from %s", i, f.Data());
	if (!gains) gains = new AliFMDCalibGain;
	std::ifstream in(f.Data());
	gains->ReadFromFile(in);
      }
    }

    Int_t mask = (AliFMDParameters::kDeadMap|
		  AliFMDParameters::kZeroSuppression|
		  AliFMDParameters::kAltroMap);

    if (!range) mask |= AliFMDParameters::kStripRange;
    if (!rate)  mask |= AliFMDParameters::kSampleRate;
    if (!peds)  mask |= AliFMDParameters::kPedestal;
    if (!gains) mask |= AliFMDParameters::kPulseGain;

    AliFMDParameters* pars = AliFMDParameters::Instance();
    pars->Init(kFALSE, mask);

    if (range)  pars->SetStripRange(range);
    if (rate)   pars->SetSampleRate(rate);
    if (peds)   pars->SetPedestal(peds);
    if (gains)  pars->SetGain(gains);
    
    Bool_t ret = AliFMDInput::Init();
    
    if (!fDets) return ret;

    fOut  = TFile::Open(Form("histo_%s", fRawFile.Data()), "RECREATE");

    Int_t m    = fELoss->GetXaxis()->GetNbins();
    Int_t mmin = fELoss->GetXaxis()->GetXmin();
    Int_t mmax = fELoss->GetXaxis()->GetXmax();
    for (Int_t d = 1; d <= 3; d++) {
      Int_t      nRng = (d == 1 ? 1 : 2);
      TObjArray* det  = 0;
      fDets->AddAt(det = new TObjArray(nRng), d-1);
      det->SetName(Form("FMD%d", d));
      TDirectory* detD = fOut->mkdir(det->GetName());
      for (Int_t q = 0; q < nRng; q++) { 
	Char_t r       = q == 0 ? 'I' : 'O';
	Int_t  nSec    = q == 0 ?  20 :  40;
	Int_t  nStr    = q == 0 ? 512 : 256;
	TObjArray* rng = 0;
	det->AddAt(rng = new TObjArray(nSec), q);
	rng->SetName(Form("FMD%d%c", d, r));
	TDirectory* rngD = detD->mkdir(rng->GetName());
	for (Int_t s = 0; s < nSec; s++) { 
	  TObjArray* sec = 0;
	  rng->AddAt(sec = new TObjArray(nStr), s);
	  sec->SetName(Form("FMD%d%c_%02d", d, r, s));
	  TDirectory* secD = rngD->mkdir(sec->GetName());
	  for (Int_t t = 0; t < nStr; t++) { 
	    secD->cd();
	    TH1* str = new TH1D(Form("FMD%d%c_%02d_%03d", d, r, s, t), 
				 Form("Scaled energy loss in FMD%d%c[%2d,%3d]",
				      d, r, s, t), m, mmin, mmax);
	    str->SetXTitle("#Delta E/#Delta E_{mip}");
	    // str->SetDirectory(secD);
	    sec->AddAt(str, t);
	  }
	}
      }
    }

    return ret;
  }

  //__________________________________________________________________
  Bool_t Begin(Int_t e)
  {
    fHasData = kFALSE;
    return AliFMDInput::Begin(e);
  }

  //__________________________________________________________________
  Bool_t ProcessRawCalibDigit(AliFMDDigit* digit)
  {
    if (!digit) return kTRUE;

    AliFMDParameters* parm = AliFMDParameters::Instance();
    UShort_t d             =  digit->Detector();
    Char_t   r             =  digit->Ring();
    UShort_t s             =  digit->Sector();
    UShort_t t             =  digit->Strip();
    Double_t gain          =  parm->GetPulseGain(d, r, s, t);
    Double_t ped           =  parm->GetPedestal(d, r, s, t);
    Double_t pedW          =  parm->GetPedestalWidth(d, r, s, t);
    Double_t adc           =  digit->Counts();
    Double_t threshold     =  pedW * fFactor;
    if (gain < 0.1 || gain > 10) return kTRUE;
    if (pedW > 10) { 
      Warning("ProcessRawCalibDigit", "FMD%d%c[%2d,%3d] is noisy: %f",
	      d, r, s, t, pedW);
      return kTRUE;
    }

    if (fFMDReader && fFMDReader->IsZeroSuppressed(d-1))
      adc += fFMDReader->NoiseFactor(d-1) * pedW;
    else 
      threshold            += ped;

    if (adc < threshold) return kTRUE;
    
    Double_t mult = (adc-ped) / (gain * parm->GetDACPerMIP());

    fHasData = kTRUE;
    fELoss->Fill(mult);

    // if (t >= 10) return kTRUE;
    TObjArray* det = static_cast<TObjArray*>(fDets->At(d-1));
    TObjArray* rng = static_cast<TObjArray*>(det->At(r == 'I' ? 0 : 1));
    TObjArray* sec = static_cast<TObjArray*>(rng->At(s));
    TH1*       str = static_cast<TH1*>(sec->At(t));
    str->Fill(mult);

    return kTRUE;
  }
  //__________________________________________________________________
  Bool_t End()
  {
    if (fHasData) fGotNEvents++;
    return AliFMDInput::End();
  }
  //__________________________________________________________________
  Bool_t Finish()
  {
    std::cout << "A total of " << fGotNEvents << " with data" << std::endl;
    gStyle->SetPalette(1);
    gStyle->SetOptTitle(0);
    gStyle->SetCanvasColor(0);
    gStyle->SetCanvasBorderSize(0);
    gStyle->SetPadColor(0);
    gStyle->SetPadBorderSize(0);
    fELoss->SetStats(kFALSE);
    fELoss->SetFillColor(kRed);
    fELoss->SetFillStyle(3001);
    fELoss->Scale(1. / fELoss->GetEntries());
    fELoss->DrawCopy("e1 bar");

    if (fDets && fOut) { 
      std::cout << "Flusing to disk ... " << std::flush;
      fOut->cd();
      fELoss->Write();
      fOut->Write();
      fOut->Close();
      std::cout << "done" << std::endl;
    }
    return kTRUE;
  }

  ClassDef(DrawCalibRaw,0);
};

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