ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// The drawing module for the VZERO detector                            //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "AliEveVZEROModule.h"

#include <TH1.h>
#include <TEveManager.h>
#include <EveBase/AliEveEventManager.h>
#include <TEveTrans.h>

#include <AliRawReader.h>
#include <AliVZERORawStream.h>
#include <AliESDEvent.h>

static const Float_t RadC[] = { 4.6, 7.1, 11.5, 18.9, 31.4 };
static const Float_t RadA[] = { 4.2, 7.6, 13.8, 22.7, 41.4 };
static const Float_t RadEps = 0.4;
static const Float_t PhiEps = 0.025;
static const Float_t PhiStp = TMath::TwoPi()/8.0;

ClassImp(AliEveVZEROModule)

/******************************************************************************/
AliEveVZEROModule::AliEveVZEROModule(const Text_t* n, Bool_t side)
  : TEveQuadSet(n),
    fStream(NULL),
    fSampleIndex(AliVZERORawStream::kNEvOfInt/2),
    fIsASide(side)
{
  //
  // Default constructor
  //
  TEveRGBAPalette* rawPalette  = new TEveRGBAPalette(0, 1023);
  rawPalette->SetLimits(0, 1023);
  SetPalette(rawPalette);
  Reset(TEveQuadSet::kQT_FreeQuad, kFALSE, 32);
}

/******************************************************************************/
AliEveVZEROModule::~AliEveVZEROModule()
{
  //
  // Destructor
  //
  delete fStream;
}

/******************************************************************************/
void AliEveVZEROModule::LoadRaw(AliRawReader *rawReader)
{
  //
  // Load VZERO raw-data
  //
  if (fStream) delete fStream;
  fStream = new AliVZERORawStream(rawReader);
  if (!fStream->Next()) {
    delete fStream;
    fStream = NULL;
    return;
  }

  for (Int_t iChannel=0; iChannel < AliVZERORawStream::kNChannels; ++iChannel) {
    Int_t offChannel = fStream->GetOfflineChannel(iChannel);
    Float_t minR,maxR,minP,maxP;
    if (fIsASide) {
      if (offChannel < 32) continue;

      Int_t ri = (offChannel-32) / 8;
      Int_t pi = (offChannel-32) % 8;
      minR = RadA[ri]  + RadEps, maxR = RadA[ri+1] - RadEps;
      minP = pi*PhiStp + PhiEps, maxP = (pi+1)*PhiStp - PhiEps;
    }
    else {
      if (offChannel >= 32) continue;

      Int_t ri = offChannel / 8;
      Int_t pi = offChannel % 8;
      minR = RadC[ri]  + RadEps, maxR = RadC[ri+1] - RadEps;
      minP = pi*PhiStp + PhiEps, maxP = (pi+1)*PhiStp - PhiEps;
    }
    Float_t v[12];
    v[ 0] = minR*TMath::Cos(minP); v[ 1] = minR*TMath::Sin(minP); v[ 2] = 0;
    v[ 3] = maxR*TMath::Cos(minP); v[ 4] = maxR*TMath::Sin(minP); v[ 5] = 0;
    v[ 6] = maxR*TMath::Cos(maxP); v[ 7] = maxR*TMath::Sin(maxP); v[ 8] = 0;
    v[ 9] = minR*TMath::Cos(maxP); v[10] = minR*TMath::Sin(maxP); v[11] = 0;

    AddQuad(v);
    QuadValue(fStream->GetPedestal(iChannel,fSampleIndex));
  }

  if (fIsASide) 
    RefMainTrans().SetPos(0, 0, 324);
  else
    RefMainTrans().SetPos(0, 0, -84);

  gEve->AddElement(this);
  gEve->Redraw3D();
}

/******************************************************************************/
void AliEveVZEROModule::DigitSelected(Int_t idx)
{
  //
  // Override control-click from TEveQuadSet
  //
  if (!fStream) return;

  Int_t iPMT = idx;
  if (!fIsASide) iPMT += 32;
  printf("PMT = %2d ADC = ",iPMT);
  TH1S *hADC = new TH1S(Form("VZERO_ADC_%d",iPMT),
			Form("ADC samples for PMT %d, Time/Width = %3.1f/%3.1f ns",
			     iPMT,
			     (Float_t)fStream->GetTime(iPMT)/10.,(Float_t)fStream->GetWidth(iPMT)/10.),
			AliVZERORawStream::kNEvOfInt,-0.5,(Float_t)AliVZERORawStream::kNEvOfInt-0.5);
  hADC->SetXTitle("Sample index");
  hADC->SetYTitle("ADC value");
  hADC->SetStats(kFALSE);
  for (Int_t iEv = 0; iEv < AliVZERORawStream::kNEvOfInt; ++iEv) {
    printf("%4d ",fStream->GetPedestal(iPMT,iEv));
    hADC->SetBinContent(iEv+1,fStream->GetPedestal(iPMT,iEv));
  }
  printf("\nTime = %3.1f ns  Width = %3.1f ns\n",(Float_t)fStream->GetTime(iPMT)/10.,(Float_t)fStream->GetWidth(iPMT)/10.);
  hADC->Draw();
  gPad->Modified();
  gPad->Update();
}

/******************************************************************************/
void AliEveVZEROModule::SetSampleIndex(Int_t index)
{
  fSampleIndex = index;
  if (!fStream) return;

  for(Int_t idx = 0; idx < (AliVZERORawStream::kNChannels/2); ++idx) {
    Int_t iPMT = idx;
    if (!fIsASide) iPMT += 32;
    DigitBase_t *qb  = GetDigit(idx);
    qb->fValue = fStream->GetPedestal(iPMT,fSampleIndex);
  }
}
 AliEveVZEROModule.cxx:1
 AliEveVZEROModule.cxx:2
 AliEveVZEROModule.cxx:3
 AliEveVZEROModule.cxx:4
 AliEveVZEROModule.cxx:5
 AliEveVZEROModule.cxx:6
 AliEveVZEROModule.cxx:7
 AliEveVZEROModule.cxx:8
 AliEveVZEROModule.cxx:9
 AliEveVZEROModule.cxx:10
 AliEveVZEROModule.cxx:11
 AliEveVZEROModule.cxx:12
 AliEveVZEROModule.cxx:13
 AliEveVZEROModule.cxx:14
 AliEveVZEROModule.cxx:15
 AliEveVZEROModule.cxx:16
 AliEveVZEROModule.cxx:17
 AliEveVZEROModule.cxx:18
 AliEveVZEROModule.cxx:19
 AliEveVZEROModule.cxx:20
 AliEveVZEROModule.cxx:21
 AliEveVZEROModule.cxx:22
 AliEveVZEROModule.cxx:23
 AliEveVZEROModule.cxx:24
 AliEveVZEROModule.cxx:25
 AliEveVZEROModule.cxx:26
 AliEveVZEROModule.cxx:27
 AliEveVZEROModule.cxx:28
 AliEveVZEROModule.cxx:29
 AliEveVZEROModule.cxx:30
 AliEveVZEROModule.cxx:31
 AliEveVZEROModule.cxx:32
 AliEveVZEROModule.cxx:33
 AliEveVZEROModule.cxx:34
 AliEveVZEROModule.cxx:35
 AliEveVZEROModule.cxx:36
 AliEveVZEROModule.cxx:37
 AliEveVZEROModule.cxx:38
 AliEveVZEROModule.cxx:39
 AliEveVZEROModule.cxx:40
 AliEveVZEROModule.cxx:41
 AliEveVZEROModule.cxx:42
 AliEveVZEROModule.cxx:43
 AliEveVZEROModule.cxx:44
 AliEveVZEROModule.cxx:45
 AliEveVZEROModule.cxx:46
 AliEveVZEROModule.cxx:47
 AliEveVZEROModule.cxx:48
 AliEveVZEROModule.cxx:49
 AliEveVZEROModule.cxx:50
 AliEveVZEROModule.cxx:51
 AliEveVZEROModule.cxx:52
 AliEveVZEROModule.cxx:53
 AliEveVZEROModule.cxx:54
 AliEveVZEROModule.cxx:55
 AliEveVZEROModule.cxx:56
 AliEveVZEROModule.cxx:57
 AliEveVZEROModule.cxx:58
 AliEveVZEROModule.cxx:59
 AliEveVZEROModule.cxx:60
 AliEveVZEROModule.cxx:61
 AliEveVZEROModule.cxx:62
 AliEveVZEROModule.cxx:63
 AliEveVZEROModule.cxx:64
 AliEveVZEROModule.cxx:65
 AliEveVZEROModule.cxx:66
 AliEveVZEROModule.cxx:67
 AliEveVZEROModule.cxx:68
 AliEveVZEROModule.cxx:69
 AliEveVZEROModule.cxx:70
 AliEveVZEROModule.cxx:71
 AliEveVZEROModule.cxx:72
 AliEveVZEROModule.cxx:73
 AliEveVZEROModule.cxx:74
 AliEveVZEROModule.cxx:75
 AliEveVZEROModule.cxx:76
 AliEveVZEROModule.cxx:77
 AliEveVZEROModule.cxx:78
 AliEveVZEROModule.cxx:79
 AliEveVZEROModule.cxx:80
 AliEveVZEROModule.cxx:81
 AliEveVZEROModule.cxx:82
 AliEveVZEROModule.cxx:83
 AliEveVZEROModule.cxx:84
 AliEveVZEROModule.cxx:85
 AliEveVZEROModule.cxx:86
 AliEveVZEROModule.cxx:87
 AliEveVZEROModule.cxx:88
 AliEveVZEROModule.cxx:89
 AliEveVZEROModule.cxx:90
 AliEveVZEROModule.cxx:91
 AliEveVZEROModule.cxx:92
 AliEveVZEROModule.cxx:93
 AliEveVZEROModule.cxx:94
 AliEveVZEROModule.cxx:95
 AliEveVZEROModule.cxx:96
 AliEveVZEROModule.cxx:97
 AliEveVZEROModule.cxx:98
 AliEveVZEROModule.cxx:99
 AliEveVZEROModule.cxx:100
 AliEveVZEROModule.cxx:101
 AliEveVZEROModule.cxx:102
 AliEveVZEROModule.cxx:103
 AliEveVZEROModule.cxx:104
 AliEveVZEROModule.cxx:105
 AliEveVZEROModule.cxx:106
 AliEveVZEROModule.cxx:107
 AliEveVZEROModule.cxx:108
 AliEveVZEROModule.cxx:109
 AliEveVZEROModule.cxx:110
 AliEveVZEROModule.cxx:111
 AliEveVZEROModule.cxx:112
 AliEveVZEROModule.cxx:113
 AliEveVZEROModule.cxx:114
 AliEveVZEROModule.cxx:115
 AliEveVZEROModule.cxx:116
 AliEveVZEROModule.cxx:117
 AliEveVZEROModule.cxx:118
 AliEveVZEROModule.cxx:119
 AliEveVZEROModule.cxx:120
 AliEveVZEROModule.cxx:121
 AliEveVZEROModule.cxx:122
 AliEveVZEROModule.cxx:123
 AliEveVZEROModule.cxx:124
 AliEveVZEROModule.cxx:125
 AliEveVZEROModule.cxx:126
 AliEveVZEROModule.cxx:127
 AliEveVZEROModule.cxx:128
 AliEveVZEROModule.cxx:129
 AliEveVZEROModule.cxx:130
 AliEveVZEROModule.cxx:131
 AliEveVZEROModule.cxx:132
 AliEveVZEROModule.cxx:133
 AliEveVZEROModule.cxx:134
 AliEveVZEROModule.cxx:135
 AliEveVZEROModule.cxx:136
 AliEveVZEROModule.cxx:137
 AliEveVZEROModule.cxx:138
 AliEveVZEROModule.cxx:139
 AliEveVZEROModule.cxx:140
 AliEveVZEROModule.cxx:141
 AliEveVZEROModule.cxx:142
 AliEveVZEROModule.cxx:143
 AliEveVZEROModule.cxx:144
 AliEveVZEROModule.cxx:145
 AliEveVZEROModule.cxx:146
 AliEveVZEROModule.cxx:147
 AliEveVZEROModule.cxx:148
 AliEveVZEROModule.cxx:149
 AliEveVZEROModule.cxx:150