// @(#)root/table:$Id$
// Author: Valery Fine 10/05/99 (E-mail: fine@bnl.gov)
/*************************************************************************
* Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
#include "TTable3Points.h"
///////////////////////////////////////////////////////////////////////////////////
//
// TTable3Points class is to create 3D view of any 3 columns of the TTable objects
// with one and the same "key column value".
//
// For example all values of the column "x[0]" "x[1]" "x[2]" of the begin_html g2t_tpc_hit end_html table
// from the rows with one and same "track_id" column value will be regarded
// as an image of one and the same "track".
// The last means all those points will be painted with one and the same 3D
// attributes like "color", "size", "style", "light","markers", "connections" etc.
//
// The original TTable object must be pre-sorted by "key column" via TTableSorter
// class
//
// void CreatePoints(Tg2t_tpc_hit *points)
// {
// g2t_tpc_hit_st *p = points->GetTable();
//
// TTable3Points *track = 0;
// TString tr;
// tr = "track_p";
// TTable &ttt = *((TTable *)points);
// // Track2Line MUST be on heap otherwise 3D view will crash just code leaves this
// // subroutine
// We will assemble all points by its "track_p" field.
//
// TTableSorter *Track2Line = new TTableSorter (ttt,"track_p");
//
// Int_t i = 0;
// Char_t buffer[10];
// Int_t ntracks = 0;
// const Int_t maxtracks = 5;
////---------------------------- Fill tracks -------------------
// long currentId = -1;
// long newId = 0;
// g2t_tpc_hit_st *hitPoint = 0;
// TVolume *thisTrack[7] = {0,0,0,0,0,0,0}; // seven volumes for 7 different colors
// Int_t MaxRowtoCount = 5000; // 5000;
// Int_t MaxTracks = Track2Line->CountKeys();
// MaxTracks = 100;
// for (i=0;iGetNRows() && ntracks < MaxTracks ;i++)
// {
// hitPoint = p + Track2Line->GetIndex(i);
// newId = hitPoint->track_p;
// if (newId != currentId) { // The hit for the new track has been found
//
// const Char_t *xName = "x[0]";
// const Char_t *yName = "x[1]";
// const Char_t *zName = "x[2]";
//
// track = new TTable3Points(Track2Line,(const void *)&newId,xName,yName,zName);
//
// // Create a shape for this node
// TPolyLineShape *trackShape = new TPolyLineShape(track);
// trackShape->SetVisibility(1);
// Int_t colorIndx = ntracks%7;
// trackShape->SetColorAttribute(colorIndx+kGreen);
// trackShape->SetLineStyle(1);
// trackShape->SetSizeAttribute(2);
// // Create a node to hold it
// if (!thisTrack[colorIndx]) {
// thisTrack[colorIndx] = new TVolume("hits","hits",trackShape);
// thisTrack[colorIndx]->Mark();
// thisTrack[colorIndx]->SetVisibility();
// TVolumePosition *pp = hall->Add(thisTrack[colorIndx]);
// if (!pp) printf(" no position %d\n",ntrack);
// }
// else
// thisTrack[colorIndx]->Add(trackShape);
// currentId = newId;
// ntracks++;
// }
// }
//
///////////////////////////////////////////////////////////////////////////////////
ClassImp(TTable3Points)
//________________________________________________________________________________
TTable3Points::TTable3Points():fColumnOffset(0)
{
//to be documented
}
//________________________________________________________________________________
TTable3Points::TTable3Points(TTableSorter *sorter,const void *key,
const Char_t *xName, const Char_t *yName, const Char_t *zName
,Option_t *opt)
: TTablePoints(sorter,key,opt)
{
//to be documented
fColumnOffset = new ULong_t [kTotalSize];
SetXColumn(xName); SetYColumn(yName); SetZColumn(zName);
}
//________________________________________________________________________________
TTable3Points::TTable3Points(TTableSorter *sorter,Int_t keyIndex,
const Char_t *xName, const Char_t *yName, const Char_t *zName
,Option_t *opt)
: TTablePoints(sorter,keyIndex,opt)
{
//to be documented
fColumnOffset = new ULong_t [kTotalSize];
SetXColumn(xName); SetYColumn(yName); SetZColumn(zName);
}
//________________________________________________________________________________
TTable3Points::~TTable3Points()
{
//to be documented
SafeDelete(fColumnOffset);
}
//________________________________________________________________________________
Float_t TTable3Points::GetAnyPoint(Int_t idx, EPointDirection xAxis) const
{
//to be documented
Float_t point = 0;
TTable *table = 0;
if (fTableSorter) table = fTableSorter->GetTable();
if (table) {
const Char_t *tablePtr = ((Char_t *)table->At(Indx(idx))) + fColumnOffset[xAxis] ;
point = *((Float_t *)tablePtr);
}
return point;
}
//____________________________________________________________________________
void TTable3Points::SetAnyColumn(const Char_t *anyName, EPointDirection indx)
{
//to be documented
fColumnOffset[indx] = fTableSorter->GetTable()->GetOffset(anyName);
if (fColumnOffset[indx] == ULong_t(-1)) MakeZombie();
}
//____________________________________________________________________________
Float_t *TTable3Points::GetXYZ(Float_t *xyz,Int_t idx, Int_t num) const
{
//to be documented
if (xyz) {
Int_t size = TMath::Min(idx+num,Size());
Int_t j=0;
for (Int_t i=idx;i