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 "Poisson.C"
#include <TMath.h>
#include <TCanvas.h>
#include <AliFMDHit.h>
#include <AliFMDGeometry.h>

/** @class PoissonHit
    @brief Make a poisson reconstruction and compare to simulated hits
    @code 
    Root> .L Compile.C
    Root> Compile("Poisson.C")
    Root> Compile("PoissonHit.C")
    Root> PoissonHit c
    Root> c.Run();
    @endcode
    @ingroup FMD_script
 */
class PoissonHit : public Poisson
{
protected:
  TH2D*  fHits; // Histogram 
  TH2D*  fDiff; // Histogram 
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$ */
  PoissonHit(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())
    : Poisson(threshold, nEta, minEta, maxEta, nPhi, minPhi, maxPhi)
  { 
    AddLoad(kHits);
    AddLoad(kGeometry);
    fHits  = new TH2D(*fEmpty);
    fHits->SetName("hits");
    fHits->SetTitle("# of hits");
    fDiff  = new TH2D(*fEmpty);
    fDiff->SetName("diff");
    fDiff->SetTitle("Difference between poisson and hits");
    fHits->SetXTitle("#eta");  
    fHits->SetYTitle("#phi"); 
    fHits->SetZTitle("N");
    fDiff->SetXTitle("#eta");  
    fDiff->SetYTitle("#phi"); 
    fDiff->SetZTitle("#frac{N_{hit}-N_{poisson}}{N_{hit}}");
  }
  /** Initialize the analyser. Opens the output file. 
      @return @c true on success. */
  virtual Bool_t Init() 
  {
    if (!Poisson::Init()) return kFALSE;
    AliFMDGeometry::Instance()->Init();
    AliFMDGeometry::Instance()->InitTransformations();    
    return kTRUE;
  }
  /** Get the @f$ \eta@f$ and @f$\varphi@f$ corresponding to the
      spatial coordinates @f$ \mathbf{v} = (x,y,z)@f$
      @param x    X coordinate
      @param y    Y coordinate
      @param z    Z coordinate
      @param eta  Psuedo rapidity @f$ \eta@f$
      @param phi  Azimuthal angle @f$\varphi@f$
  */
  void PhysicalCoordinates(Double_t x, Double_t y, Double_t z, 
			   Double_t& eta, Double_t& phi)
  {
    Double_t r, theta;
    phi   =  TMath::ATan2(y, x);
    r     =  TMath::Sqrt(y * y + x * x);
    theta =  TMath::ATan2(r, z);
    eta   = -TMath::Log(TMath::Tan(theta / 2));
    if (phi < 0) phi += 2 * TMath::Pi();
  }
  /** Process one hit.  Increment bin corresponding to strip. 
      @param hit Hit. 
      @return @c true on success */
  virtual Bool_t ProcessHit(AliFMDHit* hit, TParticle*)
  {
    Double_t x, y, z;
#if 0
    AliFMDGeometry* geom = AliFMDGeometry::Instance();
    geom->Detector2XYZ(hit->Detector(),hit->Ring(),hit->Sector(),
		       hit->Strip(),x,y,z);
#else
    x = hit->X();
    y = hit->Y();
    z = hit->Z();
#endif
    Double_t eta, phi;
    PhysicalCoordinates(x, y, z, eta, phi);
    fHits->Fill(eta, phi);
    return kTRUE;
  }
  /** Begining of event
      @param event Event number
      @return @c false on error */
  virtual Bool_t Begin(Int_t event) 
  {
    if (!Poisson::Begin(event)) return kFALSE;
    fHits->Clear();
    fDiff->Clear();
    return kTRUE;
  }
  /** Let the poisson code do it's job, and then compare to the
      numberr of hits. 
      @return @c true  */
  virtual Bool_t End() 
  {
    if (!Poisson::End()) return kFALSE;
    fDiff->Add(fMult,fHits,-1.,1.);
    fDiff->Divide(fHits);
    if (!gROOT->IsBatch()) { 
      gStyle->SetPalette(1);
      TCanvas* c1 = new TCanvas("hits", "Hit multiplicity");
      c1->SetFillColor(0);
      fHits->Draw("colz");
      TCanvas* c2 = new TCanvas("diff", "Difference between Hit and poisson");
      c2->SetFillColor(0);
      fDiff->Draw("colz");
      TCanvas* c3 = new TCanvas("empty", "# of Empty strips");
      c3->SetFillColor(0);
      fEmpty->Draw("colz");
      TCanvas* c4 = new TCanvas("total", "Total # of strips");
      c4->SetFillColor(0);
      fTotal->Draw("colz");
    }
    return kTRUE;
  }
  
  ClassDef(PoissonHit,0);
};

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