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 "AliEveTPCSectorViz.h"

#include <EveDet/AliEveTPCData.h>
#include <EveDet/AliEveTPCSectorData.h>

#include <TEveTrans.h>
#include <TStyle.h>
#include <TMath.h>

//==============================================================================
//==============================================================================
// AliEveTPCSectorViz
//==============================================================================

//______________________________________________________________________________
//
// Base class for TPC raw-data visualization.
// See AliEveTPCSector2D and AliEveTPCSector3D for concrete implementations.

ClassImp(AliEveTPCSectorViz)

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

AliEveTPCSectorViz::AliEveTPCSectorViz(const Text_t* n, const Text_t* t) :
  TEveElement(fFrameColor),
  TNamed(n, t),

  fTPCData  (0),
  fSectorID (0),

  fMinTime   (0),
  fMaxTime   (1000),
  fThreshold (5),
  fMaxVal    (128),

  fRnrInn   (kTRUE),
  fRnrOut1  (kTRUE),
  fRnrOut2  (kTRUE),

  fFrameColor (4),
  fRnrFrame   (kTRUE),
  fAutoTrans  (kFALSE),
  fRTS        (1),

  fColorArray (0)
{
  // Constructor.

   InitMainTrans();
}

AliEveTPCSectorViz::~AliEveTPCSectorViz()
{
  // Destructor.

  if (fTPCData) fTPCData->DecRefCount();
  delete [] fColorArray;
}

void AliEveTPCSectorViz::CopyVizParams(const TEveElement* el)
{
  // Copy basic viualization parameters from another TPCSectorViz.

  const AliEveTPCSectorViz* v = dynamic_cast<const AliEveTPCSectorViz*>(el);
  if (v) {
    fMinTime   = v->fMinTime;
    fMaxTime   = v->fMaxTime;
    fThreshold = v->fThreshold;
    fMaxVal    = v->fMaxVal;

    fRnrInn    = v->fRnrInn;
    fRnrOut1   = v->fRnrOut1;
    fRnrOut2   = v->fRnrOut2;
  }
}

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

void AliEveTPCSectorViz::SetDataSource(AliEveTPCData* data)
{
  // Set the data source.

  if (data == fTPCData) return;
  if (fTPCData) fTPCData->DecRefCount();
  fTPCData = data;
  if (fTPCData) fTPCData->IncRefCount();
  IncRTS();
}

void AliEveTPCSectorViz::SetSectorID(Int_t id)
{
  // Set sector id.

  if (id < 0)  id = 0;
  if (id > 35) id = 35;
  fSectorID = id;
  if (fAutoTrans)
    SetAutoTrans(kTRUE); // Force repositioning.
  IncRTS();
}

AliEveTPCSectorData* AliEveTPCSectorViz::GetSectorData() const
{
  // Get sector-data.

  return fTPCData ? fTPCData->GetSectorData(fSectorID) : 0;
}

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

void AliEveTPCSectorViz::SetThreshold(Short_t t)
{
  // Set visualization threshold.

  fThreshold = TMath::Min(t, (Short_t)(fMaxVal - 1));
  ClearColorArray();
  IncRTS();
}

void AliEveTPCSectorViz::SetMaxVal(Int_t mv)
{
  // Set visualization max signal value.
  // Signals above this will have the same color.

  fMaxVal = TMath::Max(mv, (Int_t)(fThreshold + 1));
  ClearColorArray();
  IncRTS();
}

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

void AliEveTPCSectorViz::SetAutoTrans(Bool_t trans)
{
  // Set automatic update of transformation matrix.
  // The position is calculated immediately.

  fAutoTrans = trans;
  if (fAutoTrans)
  {
    using namespace TMath;
    Float_t c = Cos((fSectorID + 0.5)*20*Pi()/180 - PiOver2());
    Float_t s = Sin((fSectorID + 0.5)*20*Pi()/180 - PiOver2());
    Float_t z = AliEveTPCSectorData::GetZLength();

    InitMainTrans();
    TEveTrans& t = RefMainTrans();

    if (fSectorID < 18) {
      // column major
      t[0]  = -c;  t[1]  = -s;
      t[4]  = -s;  t[5]  =  c;
      t[10] = -1;
      t[14] =  z;
    } else {
      t[0]  =  c;  t[1]  =  s;
      t[4]  = -s;  t[5]  =  c;
      t[10] =  1;
      t[14] = -z;
    }
  }
}
void AliEveTPCSectorViz::SetUseTrans(Bool_t t)
{
  // Set flag spcifying if transformation matrix should be applied.

  RefMainTrans().SetUseTrans(t);
}

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

void AliEveTPCSectorViz::SetupColor(Int_t val, UChar_t* pixel) const
{
  // Set pixel color to represent signal val from the current palette.

  Float_t div  = TMath::Max(1, fMaxVal - fThreshold);
  Int_t   nCol = gStyle->GetNumberOfColors();
  Int_t   cBin = TMath::Nint(nCol*(val - fThreshold)/div);

  TEveUtil::ColorFromIdx(gStyle->GetColorPalette(TMath::Min(nCol - 1, cBin)), pixel);
}

void AliEveTPCSectorViz::ClearColorArray()
{
  // Clear cached color array.

  if (fColorArray) {
    delete [] fColorArray;
    fColorArray = 0;
  }
}

void AliEveTPCSectorViz::SetupColorArray() const
{
  // Initialize cached color array.

  if (fColorArray)
    return;

  fColorArray = new UChar_t [4 * (fMaxVal - fThreshold + 1)];
  UChar_t* p = fColorArray;
  for (Int_t v=fThreshold; v<=fMaxVal; ++v, p+=4)
    SetupColor(v, p);
}
 AliEveTPCSectorViz.cxx:1
 AliEveTPCSectorViz.cxx:2
 AliEveTPCSectorViz.cxx:3
 AliEveTPCSectorViz.cxx:4
 AliEveTPCSectorViz.cxx:5
 AliEveTPCSectorViz.cxx:6
 AliEveTPCSectorViz.cxx:7
 AliEveTPCSectorViz.cxx:8
 AliEveTPCSectorViz.cxx:9
 AliEveTPCSectorViz.cxx:10
 AliEveTPCSectorViz.cxx:11
 AliEveTPCSectorViz.cxx:12
 AliEveTPCSectorViz.cxx:13
 AliEveTPCSectorViz.cxx:14
 AliEveTPCSectorViz.cxx:15
 AliEveTPCSectorViz.cxx:16
 AliEveTPCSectorViz.cxx:17
 AliEveTPCSectorViz.cxx:18
 AliEveTPCSectorViz.cxx:19
 AliEveTPCSectorViz.cxx:20
 AliEveTPCSectorViz.cxx:21
 AliEveTPCSectorViz.cxx:22
 AliEveTPCSectorViz.cxx:23
 AliEveTPCSectorViz.cxx:24
 AliEveTPCSectorViz.cxx:25
 AliEveTPCSectorViz.cxx:26
 AliEveTPCSectorViz.cxx:27
 AliEveTPCSectorViz.cxx:28
 AliEveTPCSectorViz.cxx:29
 AliEveTPCSectorViz.cxx:30
 AliEveTPCSectorViz.cxx:31
 AliEveTPCSectorViz.cxx:32
 AliEveTPCSectorViz.cxx:33
 AliEveTPCSectorViz.cxx:34
 AliEveTPCSectorViz.cxx:35
 AliEveTPCSectorViz.cxx:36
 AliEveTPCSectorViz.cxx:37
 AliEveTPCSectorViz.cxx:38
 AliEveTPCSectorViz.cxx:39
 AliEveTPCSectorViz.cxx:40
 AliEveTPCSectorViz.cxx:41
 AliEveTPCSectorViz.cxx:42
 AliEveTPCSectorViz.cxx:43
 AliEveTPCSectorViz.cxx:44
 AliEveTPCSectorViz.cxx:45
 AliEveTPCSectorViz.cxx:46
 AliEveTPCSectorViz.cxx:47
 AliEveTPCSectorViz.cxx:48
 AliEveTPCSectorViz.cxx:49
 AliEveTPCSectorViz.cxx:50
 AliEveTPCSectorViz.cxx:51
 AliEveTPCSectorViz.cxx:52
 AliEveTPCSectorViz.cxx:53
 AliEveTPCSectorViz.cxx:54
 AliEveTPCSectorViz.cxx:55
 AliEveTPCSectorViz.cxx:56
 AliEveTPCSectorViz.cxx:57
 AliEveTPCSectorViz.cxx:58
 AliEveTPCSectorViz.cxx:59
 AliEveTPCSectorViz.cxx:60
 AliEveTPCSectorViz.cxx:61
 AliEveTPCSectorViz.cxx:62
 AliEveTPCSectorViz.cxx:63
 AliEveTPCSectorViz.cxx:64
 AliEveTPCSectorViz.cxx:65
 AliEveTPCSectorViz.cxx:66
 AliEveTPCSectorViz.cxx:67
 AliEveTPCSectorViz.cxx:68
 AliEveTPCSectorViz.cxx:69
 AliEveTPCSectorViz.cxx:70
 AliEveTPCSectorViz.cxx:71
 AliEveTPCSectorViz.cxx:72
 AliEveTPCSectorViz.cxx:73
 AliEveTPCSectorViz.cxx:74
 AliEveTPCSectorViz.cxx:75
 AliEveTPCSectorViz.cxx:76
 AliEveTPCSectorViz.cxx:77
 AliEveTPCSectorViz.cxx:78
 AliEveTPCSectorViz.cxx:79
 AliEveTPCSectorViz.cxx:80
 AliEveTPCSectorViz.cxx:81
 AliEveTPCSectorViz.cxx:82
 AliEveTPCSectorViz.cxx:83
 AliEveTPCSectorViz.cxx:84
 AliEveTPCSectorViz.cxx:85
 AliEveTPCSectorViz.cxx:86
 AliEveTPCSectorViz.cxx:87
 AliEveTPCSectorViz.cxx:88
 AliEveTPCSectorViz.cxx:89
 AliEveTPCSectorViz.cxx:90
 AliEveTPCSectorViz.cxx:91
 AliEveTPCSectorViz.cxx:92
 AliEveTPCSectorViz.cxx:93
 AliEveTPCSectorViz.cxx:94
 AliEveTPCSectorViz.cxx:95
 AliEveTPCSectorViz.cxx:96
 AliEveTPCSectorViz.cxx:97
 AliEveTPCSectorViz.cxx:98
 AliEveTPCSectorViz.cxx:99
 AliEveTPCSectorViz.cxx:100
 AliEveTPCSectorViz.cxx:101
 AliEveTPCSectorViz.cxx:102
 AliEveTPCSectorViz.cxx:103
 AliEveTPCSectorViz.cxx:104
 AliEveTPCSectorViz.cxx:105
 AliEveTPCSectorViz.cxx:106
 AliEveTPCSectorViz.cxx:107
 AliEveTPCSectorViz.cxx:108
 AliEveTPCSectorViz.cxx:109
 AliEveTPCSectorViz.cxx:110
 AliEveTPCSectorViz.cxx:111
 AliEveTPCSectorViz.cxx:112
 AliEveTPCSectorViz.cxx:113
 AliEveTPCSectorViz.cxx:114
 AliEveTPCSectorViz.cxx:115
 AliEveTPCSectorViz.cxx:116
 AliEveTPCSectorViz.cxx:117
 AliEveTPCSectorViz.cxx:118
 AliEveTPCSectorViz.cxx:119
 AliEveTPCSectorViz.cxx:120
 AliEveTPCSectorViz.cxx:121
 AliEveTPCSectorViz.cxx:122
 AliEveTPCSectorViz.cxx:123
 AliEveTPCSectorViz.cxx:124
 AliEveTPCSectorViz.cxx:125
 AliEveTPCSectorViz.cxx:126
 AliEveTPCSectorViz.cxx:127
 AliEveTPCSectorViz.cxx:128
 AliEveTPCSectorViz.cxx:129
 AliEveTPCSectorViz.cxx:130
 AliEveTPCSectorViz.cxx:131
 AliEveTPCSectorViz.cxx:132
 AliEveTPCSectorViz.cxx:133
 AliEveTPCSectorViz.cxx:134
 AliEveTPCSectorViz.cxx:135
 AliEveTPCSectorViz.cxx:136
 AliEveTPCSectorViz.cxx:137
 AliEveTPCSectorViz.cxx:138
 AliEveTPCSectorViz.cxx:139
 AliEveTPCSectorViz.cxx:140
 AliEveTPCSectorViz.cxx:141
 AliEveTPCSectorViz.cxx:142
 AliEveTPCSectorViz.cxx:143
 AliEveTPCSectorViz.cxx:144
 AliEveTPCSectorViz.cxx:145
 AliEveTPCSectorViz.cxx:146
 AliEveTPCSectorViz.cxx:147
 AliEveTPCSectorViz.cxx:148
 AliEveTPCSectorViz.cxx:149
 AliEveTPCSectorViz.cxx:150
 AliEveTPCSectorViz.cxx:151
 AliEveTPCSectorViz.cxx:152
 AliEveTPCSectorViz.cxx:153
 AliEveTPCSectorViz.cxx:154
 AliEveTPCSectorViz.cxx:155
 AliEveTPCSectorViz.cxx:156
 AliEveTPCSectorViz.cxx:157
 AliEveTPCSectorViz.cxx:158
 AliEveTPCSectorViz.cxx:159
 AliEveTPCSectorViz.cxx:160
 AliEveTPCSectorViz.cxx:161
 AliEveTPCSectorViz.cxx:162
 AliEveTPCSectorViz.cxx:163
 AliEveTPCSectorViz.cxx:164
 AliEveTPCSectorViz.cxx:165
 AliEveTPCSectorViz.cxx:166
 AliEveTPCSectorViz.cxx:167
 AliEveTPCSectorViz.cxx:168
 AliEveTPCSectorViz.cxx:169
 AliEveTPCSectorViz.cxx:170
 AliEveTPCSectorViz.cxx:171
 AliEveTPCSectorViz.cxx:172
 AliEveTPCSectorViz.cxx:173
 AliEveTPCSectorViz.cxx:174
 AliEveTPCSectorViz.cxx:175
 AliEveTPCSectorViz.cxx:176
 AliEveTPCSectorViz.cxx:177
 AliEveTPCSectorViz.cxx:178
 AliEveTPCSectorViz.cxx:179
 AliEveTPCSectorViz.cxx:180
 AliEveTPCSectorViz.cxx:181
 AliEveTPCSectorViz.cxx:182
 AliEveTPCSectorViz.cxx:183
 AliEveTPCSectorViz.cxx:184
 AliEveTPCSectorViz.cxx:185
 AliEveTPCSectorViz.cxx:186
 AliEveTPCSectorViz.cxx:187
 AliEveTPCSectorViz.cxx:188
 AliEveTPCSectorViz.cxx:189
 AliEveTPCSectorViz.cxx:190
 AliEveTPCSectorViz.cxx:191
 AliEveTPCSectorViz.cxx:192
 AliEveTPCSectorViz.cxx:193
 AliEveTPCSectorViz.cxx:194
 AliEveTPCSectorViz.cxx:195
 AliEveTPCSectorViz.cxx:196
 AliEveTPCSectorViz.cxx:197
 AliEveTPCSectorViz.cxx:198
 AliEveTPCSectorViz.cxx:199
 AliEveTPCSectorViz.cxx:200
 AliEveTPCSectorViz.cxx:201
 AliEveTPCSectorViz.cxx:202
 AliEveTPCSectorViz.cxx:203
 AliEveTPCSectorViz.cxx:204
 AliEveTPCSectorViz.cxx:205
 AliEveTPCSectorViz.cxx:206
 AliEveTPCSectorViz.cxx:207
 AliEveTPCSectorViz.cxx:208
 AliEveTPCSectorViz.cxx:209
 AliEveTPCSectorViz.cxx:210
 AliEveTPCSectorViz.cxx:211
 AliEveTPCSectorViz.cxx:212