ROOT logo
//____________________________________________________________________
//
// $Id$
//
// Script that contains a class to draw hits, 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 <AliESDFMD.h>
#include <AliFMDInput.h>
#include <TH2D.h>
#include <TStyle.h>
#include <TArrayF.h>
#include <TCanvas.h>
#include <TStyle.h>
#include <TROOT.h>
#include <TFile.h>
#include <iostream>

/** @class Poisson
    @brief Make a poisson reconstruction
    @code 
    Root> .L Compile.C
    Root> Compile("Poisson.C")
    Root> Poisson c
    Root> c.Run();
    @endcode
    @ingroup FMD_script
 */
class Poisson : public AliFMDInput
{
protected:
  TH2D*  fEmpty; // Histogram 
  TH2D*  fTotal; // Histogram 
  TH2D*  fMult;  // Histogram 
  TFile* fFile;  // File 
  Int_t  fEv;    // Event number
  Double_t fThreshold;
public:
  /** Constructor 
      @param threshold Threshold
      @param nEta      # of @f$ \eta@f$ bins
      @param minEta    minimum @f$ \eta@f$
      @param maxEta    maximum @f$ \eta@f$
      @param nPhi      # of @f$ \eta@f$ bins
      @param minPhi    minimum @f$ \varphi@f$  
      @param maxPhi    maximum @f$ \varphi@f$ */
  Poisson(Double_t threshold=.3,
	  Int_t nEta=120, Float_t minEta=-6, Float_t maxEta=6, 
	  Int_t nPhi=4,   Float_t minPhi=0,  Float_t maxPhi=2*TMath::Pi())
    : fFile(0), fEv(0), fThreshold(threshold)
  { 
    AddLoad(kESD);

    fEmpty = new TH2D("empty", "# of empty strips", nEta, minEta, maxEta, 
		      nPhi, minPhi, maxPhi);
    fTotal = new TH2D("total", "Total # of strips", nEta, minEta, maxEta, 
		      nPhi, minPhi, maxPhi);
    fMult = new TH2D("mult", "Multiplicity", nEta, minEta, maxEta, 
		      nPhi, minPhi, maxPhi);
    fEmpty->SetXTitle("#eta");  
    fEmpty->SetYTitle("#phi"); 
    fEmpty->SetZTitle("N");
    fTotal->SetXTitle("#eta");  
    fTotal->SetYTitle("#phi"); 
    fTotal->SetZTitle("N");
    fMult->SetXTitle("#eta");  
    fMult->SetYTitle("#phi"); 
    fMult->SetZTitle("<M_{ch}>");

  }
  /** Initialize the analyser. Opens the output file. 
      @return @c true on success. */
  virtual Bool_t Init() 
  {
    if (!AliFMDInput::Init()) return kFALSE;
    fFile = TFile::Open("poisson.root", "RECREATE");
    if (!fFile) return kFALSE;
    return kTRUE;
  }
  /** Begining of event
      @param event Event number
      @return @c false on error */
  virtual Bool_t Begin(Int_t event) 
  {
    if (!AliFMDInput::Begin(event)) return kFALSE;
    fEv = event;
    fEmpty->Clear();
    fTotal->Clear();
    fMult->Clear();
    return kTRUE;
  }
  /** Process ESD data.  For each strip, check if the
      psuedo-multiplicity is less than the threshold.  If it is, then
      count the strip as empty. 
      @param esd ESD data 
      @return @c true on success. */
  virtual Bool_t ProcessESD(AliESDFMD* esd)
  {
    for (UShort_t det = 1; det <= 3; det++) {
      for (UShort_t rng = 0; rng < 2; rng++) {
	Char_t ring = (rng == 0 ? 'I' : 'O');
	// Not covered channels 
	for (UShort_t sec = 0; sec < 40; sec++) {
	  for (UShort_t str = 0; str < 512; str++) {
	    Float_t mult = esd->Multiplicity(det, ring, sec, str);
	    Float_t eta  = esd->Eta(det, ring, sec, str);
	    // Dead channels, or not covered. 
	    if (mult >= AliESDFMD::kInvalidMult) continue;
	    if (eta  >= AliESDFMD::kInvalidEta) continue;
	    Float_t phi;
	    switch (ring) { 
	    case 'I':  phi = (sec + .5) * 2 * TMath::Pi() / 20; break;
	    case 'O':  phi = (sec + .5) * 2 * TMath::Pi() / 40; break;
	    }
	    fTotal->Fill(eta, phi);
	    if (mult < fThreshold) fEmpty->Fill(eta, phi);
	  } // Loop over strips
	} // Loop over sectors
      } // Loop over rings
    } // Loop over detectors
    return kTRUE;
  }
  /** For each bin, reconstruct the charge particle multiplicity as 
      @f[
      m = - N_{total} \log\left(\frac{N_{empty}}{N_{total}}\right)
      @f]
      where @f$ N_{total}@f$ is the total number of strips in the bin,
      and @f$ N_{empty}@f$ is the number of strips in the bin that did
      not fire. 
      @return @c true  */
  virtual Bool_t End() 
  {
    for (Int_t etaBin = 1; etaBin <= fEmpty->GetNbinsX(); etaBin++) {
      for (Int_t phiBin = 1; phiBin <= fEmpty->GetNbinsY(); phiBin++) {
	Double_t empty  = fEmpty->GetBinContent(etaBin, phiBin);
	Double_t total  = fTotal->GetBinContent(etaBin, phiBin);
	Double_t lambda = (empty > 0 ? - TMath::Log(empty / total) : 1);
	Double_t mult   = lambda * total;
	fMult->SetBinContent(etaBin, phiBin, mult);
      }
    }
    fFile->cd();
    fMult->Write(Form("mult%03d", fEv));
    if (!gROOT->IsBatch()) { 
      gStyle->SetPalette(1);
      TCanvas* c = new TCanvas("poisson", "Poisson multiplicity");
      c->SetFillColor(0);
      fMult->Draw("colz");
    }
    return AliFMDInput::End();
  }
  
  /** At end of run.  Write and close output file @c poisson.root 
      @return @c true on success */
  virtual Bool_t Finish()
  {
    fFile->Write();
    fFile->Close();
    fFile = 0;
    return AliFMDInput::Finish();
  }
  ClassDef(Poisson,0);
};

//____________________________________________________________________
//
// EOF
//
 Poisson.C:1
 Poisson.C:2
 Poisson.C:3
 Poisson.C:4
 Poisson.C:5
 Poisson.C:6
 Poisson.C:7
 Poisson.C:8
 Poisson.C:9
 Poisson.C:10
 Poisson.C:11
 Poisson.C:12
 Poisson.C:13
 Poisson.C:14
 Poisson.C:15
 Poisson.C:16
 Poisson.C:17
 Poisson.C:18
 Poisson.C:19
 Poisson.C:20
 Poisson.C:21
 Poisson.C:22
 Poisson.C:23
 Poisson.C:24
 Poisson.C:25
 Poisson.C:26
 Poisson.C:27
 Poisson.C:28
 Poisson.C:29
 Poisson.C:30
 Poisson.C:31
 Poisson.C:32
 Poisson.C:33
 Poisson.C:34
 Poisson.C:35
 Poisson.C:36
 Poisson.C:37
 Poisson.C:38
 Poisson.C:39
 Poisson.C:40
 Poisson.C:41
 Poisson.C:42
 Poisson.C:43
 Poisson.C:44
 Poisson.C:45
 Poisson.C:46
 Poisson.C:47
 Poisson.C:48
 Poisson.C:49
 Poisson.C:50
 Poisson.C:51
 Poisson.C:52
 Poisson.C:53
 Poisson.C:54
 Poisson.C:55
 Poisson.C:56
 Poisson.C:57
 Poisson.C:58
 Poisson.C:59
 Poisson.C:60
 Poisson.C:61
 Poisson.C:62
 Poisson.C:63
 Poisson.C:64
 Poisson.C:65
 Poisson.C:66
 Poisson.C:67
 Poisson.C:68
 Poisson.C:69
 Poisson.C:70
 Poisson.C:71
 Poisson.C:72
 Poisson.C:73
 Poisson.C:74
 Poisson.C:75
 Poisson.C:76
 Poisson.C:77
 Poisson.C:78
 Poisson.C:79
 Poisson.C:80
 Poisson.C:81
 Poisson.C:82
 Poisson.C:83
 Poisson.C:84
 Poisson.C:85
 Poisson.C:86
 Poisson.C:87
 Poisson.C:88
 Poisson.C:89
 Poisson.C:90
 Poisson.C:91
 Poisson.C:92
 Poisson.C:93
 Poisson.C:94
 Poisson.C:95
 Poisson.C:96
 Poisson.C:97
 Poisson.C:98
 Poisson.C:99
 Poisson.C:100
 Poisson.C:101
 Poisson.C:102
 Poisson.C:103
 Poisson.C:104
 Poisson.C:105
 Poisson.C:106
 Poisson.C:107
 Poisson.C:108
 Poisson.C:109
 Poisson.C:110
 Poisson.C:111
 Poisson.C:112
 Poisson.C:113
 Poisson.C:114
 Poisson.C:115
 Poisson.C:116
 Poisson.C:117
 Poisson.C:118
 Poisson.C:119
 Poisson.C:120
 Poisson.C:121
 Poisson.C:122
 Poisson.C:123
 Poisson.C:124
 Poisson.C:125
 Poisson.C:126
 Poisson.C:127
 Poisson.C:128
 Poisson.C:129
 Poisson.C:130
 Poisson.C:131
 Poisson.C:132
 Poisson.C:133
 Poisson.C:134
 Poisson.C:135
 Poisson.C:136
 Poisson.C:137
 Poisson.C:138
 Poisson.C:139
 Poisson.C:140
 Poisson.C:141
 Poisson.C:142
 Poisson.C:143
 Poisson.C:144
 Poisson.C:145
 Poisson.C:146
 Poisson.C:147
 Poisson.C:148
 Poisson.C:149
 Poisson.C:150
 Poisson.C:151
 Poisson.C:152
 Poisson.C:153
 Poisson.C:154
 Poisson.C:155
 Poisson.C:156
 Poisson.C:157
 Poisson.C:158
 Poisson.C:159
 Poisson.C:160
 Poisson.C:161
 Poisson.C:162
 Poisson.C:163
 Poisson.C:164
 Poisson.C:165
 Poisson.C:166
 Poisson.C:167
 Poisson.C:168
 Poisson.C:169
 Poisson.C:170
 Poisson.C:171
 Poisson.C:172
 Poisson.C:173
 Poisson.C:174
 Poisson.C:175