1 /**************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
3 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
4 * full copyright notice. *
5 **************************************************************************/
7 //////////////////////////////////////////////////////////////////////////
9 // The drawing module for the VZERO detector //
11 //////////////////////////////////////////////////////////////////////////
13 #include "AliEveVZEROModule.h"
16 #include <TEveManager.h>
17 #include <EveBase/AliEveEventManager.h>
18 #include <TEveTrans.h>
20 #include <AliRawReader.h>
21 #include <AliVZERORawStream.h>
22 #include <AliESDEvent.h>
24 static const Float_t RadC[] = { 4.6, 7.1, 11.5, 18.9, 31.4 };
25 static const Float_t RadA[] = { 4.2, 7.6, 13.8, 22.7, 41.4 };
26 static const Float_t RadEps = 0.4;
27 static const Float_t PhiEps = 0.025;
28 static const Float_t PhiStp = TMath::TwoPi()/8.0;
30 ClassImp(AliEveVZEROModule)
32 /******************************************************************************/
33 AliEveVZEROModule::AliEveVZEROModule(const Text_t* n, Bool_t side)
36 fSampleIndex(AliVZERORawStream::kNEvOfInt/2),
40 // Default constructor
42 TEveRGBAPalette* rawPalette = new TEveRGBAPalette(0, 1023);
43 rawPalette->SetLimits(0, 1023);
44 SetPalette(rawPalette);
45 Reset(TEveQuadSet::kQT_FreeQuad, kFALSE, 32);
48 /******************************************************************************/
49 AliEveVZEROModule::~AliEveVZEROModule()
57 /******************************************************************************/
58 void AliEveVZEROModule::LoadRaw(AliRawReader *rawReader)
61 // Load VZERO raw-data
63 if (fStream) delete fStream;
64 fStream = new AliVZERORawStream(rawReader);
65 if (!fStream->Next()) {
71 for (Int_t iChannel=0; iChannel < AliVZERORawStream::kNChannels; ++iChannel) {
72 Int_t offChannel = fStream->GetOfflineChannel(iChannel);
73 Float_t minR,maxR,minP,maxP;
75 if (offChannel < 32) continue;
77 Int_t ri = (offChannel-32) / 8;
78 Int_t pi = (offChannel-32) % 8;
79 minR = RadA[ri] + RadEps, maxR = RadA[ri+1] - RadEps;
80 minP = pi*PhiStp + PhiEps, maxP = (pi+1)*PhiStp - PhiEps;
83 if (offChannel >= 32) continue;
85 Int_t ri = offChannel / 8;
86 Int_t pi = offChannel % 8;
87 minR = RadC[ri] + RadEps, maxR = RadC[ri+1] - RadEps;
88 minP = pi*PhiStp + PhiEps, maxP = (pi+1)*PhiStp - PhiEps;
91 v[ 0] = minR*TMath::Cos(minP); v[ 1] = minR*TMath::Sin(minP); v[ 2] = 0;
92 v[ 3] = maxR*TMath::Cos(minP); v[ 4] = maxR*TMath::Sin(minP); v[ 5] = 0;
93 v[ 6] = maxR*TMath::Cos(maxP); v[ 7] = maxR*TMath::Sin(maxP); v[ 8] = 0;
94 v[ 9] = minR*TMath::Cos(maxP); v[10] = minR*TMath::Sin(maxP); v[11] = 0;
97 QuadValue(fStream->GetPedestal(iChannel,fSampleIndex));
101 RefMainTrans().SetPos(0, 0, 324);
103 RefMainTrans().SetPos(0, 0, -84);
105 gEve->AddElement(this);
109 /******************************************************************************/
110 void AliEveVZEROModule::DigitSelected(Int_t idx)
113 // Override control-click from TEveQuadSet
115 if (!fStream) return;
118 if (!fIsASide) iPMT += 32;
119 printf("PMT = %2d ADC = ",iPMT);
120 TH1S *hADC = new TH1S(Form("VZERO_ADC_%d",iPMT),
121 Form("ADC samples for PMT %d, Time/Width = %3.1f/%3.1f ns",
123 (Float_t)fStream->GetTime(iPMT)/10.,(Float_t)fStream->GetWidth(iPMT)/10.),
124 AliVZERORawStream::kNEvOfInt,-0.5,(Float_t)AliVZERORawStream::kNEvOfInt-0.5);
125 hADC->SetXTitle("Sample index");
126 hADC->SetYTitle("ADC value");
127 hADC->SetStats(kFALSE);
128 for (Int_t iEv = 0; iEv < AliVZERORawStream::kNEvOfInt; ++iEv) {
129 printf("%4.1f ",fStream->GetPedestal(iPMT,iEv));
130 hADC->SetBinContent(iEv+1,fStream->GetPedestal(iPMT,iEv));
132 printf("\nTime = %3.1f ns Width = %3.1f ns\n",(Float_t)fStream->GetTime(iPMT)/10.,(Float_t)fStream->GetWidth(iPMT)/10.);
138 /******************************************************************************/
139 void AliEveVZEROModule::SetSampleIndex(Int_t index)
141 fSampleIndex = index;
142 if (!fStream) return;
144 for(Int_t idx = 0; idx < (AliVZERORawStream::kNChannels/2); ++idx) {
146 if (!fIsASide) iPMT += 32;
147 DigitBase_t *qb = GetDigit(idx);
148 qb->fValue = fStream->GetPedestal(iPMT,fSampleIndex);