ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

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

#include "AliEveTPCSector2D.h"
#include "AliEveTPCSector3D.h"

#include <EveDet/AliEveTPCSectorData.h>

#include <TEveTrans.h>

#include <TBuffer3D.h>
#include <TBuffer3DTypes.h>
#include <TVirtualPad.h>
#include <TVirtualViewer3D.h>

#include <TH1S.h>
#include <TH2S.h>
#include <TVirtualPad.h>

//==============================================================================
//==============================================================================
// AliEveTPCSector2D
//==============================================================================

//______________________________________________________________________________
//
// Displays TPC raw-data in 2D.
//
// fShowMax: true  - display maximum value for given time interval
//           false - display integral
// fAverage: only available when fShowMax = false; divide by time window width
//
// fUseTexture: use OpenGL textures to display data (fast rendering,
//   updates take the same time)
//

ClassImp(AliEveTPCSector2D)

/******************************************************************************/

AliEveTPCSector2D::AliEveTPCSector2D(const Text_t* n, const Text_t* t) :
  AliEveTPCSectorViz(n,t),

  fShowMax (kTRUE),
  fAverage (kFALSE),

  fUseTexture (kTRUE),
  fPickEmpty  (kFALSE),
  fPickMode   (1)
{
  // Constructor.
}

/******************************************************************************/

void AliEveTPCSector2D::MakeSector3D()
{
  // Make a 3D sector with same setting as this one.
  // It is added as a child ot this object.

  AliEveTPCSector3D* s = new AliEveTPCSector3D;
  s->SetDataSource(fTPCData);
  s->SetSectorID(fSectorID);
  s->SetAutoTrans(fAutoTrans);
  s->CopyVizParams(this);
  AddElement(s);
  ElementChanged(kFALSE, kTRUE);
}

/******************************************************************************/

void AliEveTPCSector2D::ComputeBBox()
{
  // Compute boundig-box.

  const AliEveTPCSectorData::SegmentInfo&  iSeg = AliEveTPCSectorData::GetInnSeg();
  const AliEveTPCSectorData::SegmentInfo& o2Seg = AliEveTPCSectorData::GetOut2Seg();

  BBoxInit();
  Float_t w = o2Seg.GetNMaxPads()*o2Seg.GetPadWidth()/2;
  fBBox[0] = -w;
  fBBox[1] =  w;
  fBBox[2] =  iSeg.GetRLow();
  fBBox[3] =  o2Seg.GetRLow() + o2Seg.GetNRows()*o2Seg.GetPadHeight();
  fBBox[4] = -0.5; // Fake z-width to 1 cm.
  fBBox[5] =  0.5;
}

/******************************************************************************/

void AliEveTPCSector2D::PadSelected(Int_t row, Int_t pad)
{
  // Called when ctrl-mouse-left-click registered over a pad.

  // EVE -> Std convention
  Int_t sseg = fSectorID, srow = row;
  if (row >= AliEveTPCSectorData::GetInnSeg().GetNRows()) {
    sseg += 36;
    srow -= AliEveTPCSectorData::GetInnSeg().GetNRows();
  }
  switch (fPickMode)
    {
    case 0: {
      printf("AliEveTPCSector2DGL::ProcessSelection segment=%d, row=%d, pad=%d\n",
	     sseg, srow, pad);
      break;
    }
    case 1: {
      AliEveTPCSectorData* sectorData = GetSectorData();
      if (sectorData == 0) return;
      Int_t mint = fMinTime;
      Int_t maxt = fMaxTime;
      TH1S* h = new TH1S(Form("Seg%d_Row%d_TEvePad%d", sseg, srow, pad),
			 Form("Segment %d, Row %d, TEvePad %d", sseg, srow, pad),
			 maxt - mint +1 , mint, maxt);
      h->SetXTitle("Time");
      h->SetYTitle("ADC");
      AliEveTPCSectorData::PadIterator i = sectorData->MakePadIterator(row, pad);
      while (i.Next())
	h->Fill(i.Time(), i.Signal());
      h->Draw();
      gPad->Modified();
      gPad->Update();
      break;
    }
    case 2: {
      AliEveTPCSectorData* sectorData = GetSectorData();
      if (sectorData == 0) return;
      Int_t mint = fMinTime;
      Int_t maxt = fMaxTime;
      Int_t npad = AliEveTPCSectorData::GetNPadsInRow(row);
      TH2S* h = new TH2S(Form("Seg%d_Row%d", sseg, srow),
			 Form("Segment %d, Row %d", sseg, srow),
			 maxt - mint +1 , mint, maxt,
			 npad, 0, npad - 1);
      h->SetXTitle("Time");
      h->SetYTitle("TEvePad");
      h->SetZTitle("ADC");
      AliEveTPCSectorData::RowIterator i = sectorData->MakeRowIterator(row);
      while (i.NextPad())
	while (i.Next())
	  h->Fill(i.Time(), i.TEvePad(), i.Signal());
      h->Draw();
      gPad->Modified();
      gPad->Update();
      break;
    }
    } // switch
}

/******************************************************************************/

void AliEveTPCSector2D::Paint(Option_t* )
{
  // Paint object.

  if(fRnrSelf == kFALSE)
    return;

  TBuffer3D buffer(TBuffer3DTypes::kGeneric);

  // Section kCore
  buffer.fID           = this;
  buffer.fColor        = GetMainColor();
  buffer.fTransparency = GetMainTransparency();
  if (HasMainTrans()) RefMainTrans().SetBuffer3D(buffer);
  buffer.SetSectionsValid(TBuffer3D::kCore);

  Int_t reqSections = gPad->GetViewer3D()->AddObject(buffer);
  if (reqSections == TBuffer3D::kNone) {
    return;
  }

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