#include "AliEveTPCSector3D.h"
#include <EveDet/AliEveTPCSectorData.h>
#include <TEveTrans.h>
#include <TBuffer3D.h>
#include <TBuffer3DTypes.h>
#include <TVirtualPad.h>
#include <TVirtualViewer3D.h>
#include <TStyle.h>
ClassImp(AliEveTPCSector3D)
AliEveTPCSector3D::AliEveTPCSector3D(const Text_t* n, const Text_t* t) :
AliEveTPCSectorViz(n, t),
fBoxSet (n, t),
fPointSetArray(n, t),
fPointFrac (0.25),
fPointSize (3),
fPointSetOn (0),
fPointSetMaxVal (0),
fDriftVel (1.07),
fZStep (250.0/900),
fCutOnEta (kFALSE),
fEtaMin (-1.5),
fEtaMax (1.5)
{
fRnrFrame = kTRUE;
ComputeBBox();
}
void AliEveTPCSector3D::SetRnrFrame(Bool_t rf)
{
if(fRnrFrame != rf) {
fRnrFrame = rf;
IncRTS();
}
}
void AliEveTPCSector3D::ComputeBBox()
{
const AliEveTPCSectorData::SegmentInfo& iSeg = AliEveTPCSectorData::GetInnSeg();
const AliEveTPCSectorData::SegmentInfo& o2Seg = AliEveTPCSectorData::GetOut2Seg();
BBoxInit();
Float_t w = 0.5*o2Seg.GetNMaxPads()*o2Seg.GetPadWidth();
fBBox[0] = -w;
fBBox[1] = w;
fBBox[2] = iSeg.GetRLow();
fBBox[3] = o2Seg.GetRLow() + o2Seg.GetNRows()*o2Seg.GetPadHeight();
fBBox[4] = 0;
fBBox[5] = AliEveTPCSectorData::GetZLength();
Float_t* b = fBoxSet.AssertBBox();
for (Int_t i=0; i<6; ++i) { b[i] = fBBox[i]; }
}
void AliEveTPCSector3D::Paint(Option_t* )
{
if(fRnrSelf == kFALSE)
return;
TBuffer3D buffer(TBuffer3DTypes::kGeneric);
SetMainColor(36);
SetMainTransparency(100);
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("AliEveTPCSector3D::Paint", "only direct OpenGL rendering supported.");
return;
}
void AliEveTPCSector3D::LoadPadrow(AliEveTPCSectorData::RowIterator& iter,
Float_t xs, Float_t ys,
Float_t pw, Float_t ph)
{
Short_t pad, time, val;
Float_t x0, z0;
Float_t ym = ys + 0.5*ph;
Float_t zs = fZStep/fDriftVel;
Float_t eta, x1, y1, z1, x, y, z, c, s, zL;
while (iter.NextPad())
{
pad = iter.TEvePad();
while (iter.Next())
{
time = iter.Time();
val = iter.Signal();
if (val <= fThreshold || time < fMinTime || time > fMaxTime)
continue;
if (fCutOnEta)
{
x1 = xs + (pad+0.5)*pw;
y1 = ym;
z1 = (time+0.5)*zs;
c = TMath::Cos((fSectorID + 0.5)*20*TMath::Pi()/180 - TMath::PiOver2());
s = TMath::Sin((fSectorID + 0.5)*20*TMath::Pi()/180 - TMath::PiOver2());
zL = AliEveTPCSectorData::GetZLength();
if (fSectorID < 18)
{
x = -c*x1-s*y1;
y = -s*x1+c*y1;
z = -z1+zL;
}
else
{
x = c*x1+s*y1;
y = -s*x1+c*y1;
z = z1-zL;
}
eta = -TMath::Log(TMath::Tan(0.5*TMath::ACos(z/TMath::Sqrt(x*x + y*y + z*z))));
if(!(eta < fEtaMax && eta > fEtaMin) && !(-eta < fEtaMax && -eta > fEtaMin))
continue;
}
if (fPointSetOn && val <= fPointSetMaxVal)
{
fPointSetArray.Fill(xs + (pad+0.5)*pw, ym, (time+0.5)*zs, val);
}
else
{
x0 = xs + pad*pw;
z0 = time*zs;
fBoxSet.AddBox(x0, ys, z0, pw, ph, zs);
fBoxSet.DigitColor(ColorFromArray(val));
}
}
}
}
void AliEveTPCSector3D::UpdateBoxesAndPoints()
{
fBoxSet.Reset(TEveBoxSet::kBT_AABox, kTRUE, 16384);
for (Int_t i = 0; i < fPointSetArray.GetNBins(); ++i)
delete fPointSetArray.GetBin(i);
fPointSetArray.RemoveElementsLocal();
AliEveTPCSectorData* data = GetSectorData();
if (data != 0) {
Bool_t isOn[3];
isOn[0] = fRnrInn;
isOn[1] = fRnrOut1;
isOn[2] = fRnrOut2;
SetupColorArray();
SetupPointSetArray();
for (Int_t sId = 0; sId <= 2; ++sId)
{
if (isOn[sId] == kFALSE)
continue;
const AliEveTPCSectorData::SegmentInfo& sInfo = AliEveTPCSectorData::GetSeg(sId);
Float_t sy = sInfo.GetRLow();
for (Int_t row=sInfo.GetFirstRow(); row<=sInfo.GetLastRow(); ++row)
{
AliEveTPCSectorData::RowIterator i = data->MakeRowIterator(row);
Float_t sx = -0.5*AliEveTPCSectorData::GetNPadsInRow(row)*sInfo.GetPadWidth();
LoadPadrow(i, sx, sy, sInfo.GetPadWidth(), sInfo.GetPadHeight());
sy += sInfo.GetPadHeight();
}
}
fBoxSet.RefitPlex();
if (fPointSetOn)
fPointSetArray.CloseBins();
}
}
void AliEveTPCSector3D::SetupPointSetArray()
{
Int_t nBins = (Int_t) TMath::Nint(fPointFrac*gStyle->GetNumberOfColors());
if (nBins > 0) {
fPointSetOn = kTRUE;
fPointSetMaxVal = fThreshold + (Int_t) TMath::Nint(fPointFrac*(fMaxVal - fThreshold));
fPointSetArray.InitBins("", nBins, fThreshold, fPointSetMaxVal);
for (Int_t b=0; b<nBins; ++b) {
fPointSetArray.GetBin(b)->SetMarkerColor(gStyle->GetColorPalette(b));
}
} else {
fPointSetOn = kFALSE;
}
}
AliEveTPCSector3D.cxx:100 AliEveTPCSector3D.cxx:101 AliEveTPCSector3D.cxx:102 AliEveTPCSector3D.cxx:103 AliEveTPCSector3D.cxx:104 AliEveTPCSector3D.cxx:105 AliEveTPCSector3D.cxx:106 AliEveTPCSector3D.cxx:107 AliEveTPCSector3D.cxx:108 AliEveTPCSector3D.cxx:109 AliEveTPCSector3D.cxx:110 AliEveTPCSector3D.cxx:111 AliEveTPCSector3D.cxx:112 AliEveTPCSector3D.cxx:113 AliEveTPCSector3D.cxx:114 AliEveTPCSector3D.cxx:115 AliEveTPCSector3D.cxx:116 AliEveTPCSector3D.cxx:117 AliEveTPCSector3D.cxx:118 AliEveTPCSector3D.cxx:119 AliEveTPCSector3D.cxx:120 AliEveTPCSector3D.cxx:121 AliEveTPCSector3D.cxx:122 AliEveTPCSector3D.cxx:123 AliEveTPCSector3D.cxx:124 AliEveTPCSector3D.cxx:125 AliEveTPCSector3D.cxx:126 AliEveTPCSector3D.cxx:127 AliEveTPCSector3D.cxx:128 AliEveTPCSector3D.cxx:129 AliEveTPCSector3D.cxx:130 AliEveTPCSector3D.cxx:131 AliEveTPCSector3D.cxx:132 AliEveTPCSector3D.cxx:133 AliEveTPCSector3D.cxx:134 AliEveTPCSector3D.cxx:135 AliEveTPCSector3D.cxx:136 AliEveTPCSector3D.cxx:137 AliEveTPCSector3D.cxx:138 AliEveTPCSector3D.cxx:139 AliEveTPCSector3D.cxx:140 AliEveTPCSector3D.cxx:141 AliEveTPCSector3D.cxx:142 AliEveTPCSector3D.cxx:143 AliEveTPCSector3D.cxx:144 AliEveTPCSector3D.cxx:145 AliEveTPCSector3D.cxx:146 AliEveTPCSector3D.cxx:147 AliEveTPCSector3D.cxx:148 AliEveTPCSector3D.cxx:149 AliEveTPCSector3D.cxx:150 AliEveTPCSector3D.cxx:151 AliEveTPCSector3D.cxx:152 AliEveTPCSector3D.cxx:153 AliEveTPCSector3D.cxx:154 AliEveTPCSector3D.cxx:155 AliEveTPCSector3D.cxx:156 AliEveTPCSector3D.cxx:157 AliEveTPCSector3D.cxx:158 AliEveTPCSector3D.cxx:159 AliEveTPCSector3D.cxx:160 AliEveTPCSector3D.cxx:161 AliEveTPCSector3D.cxx:162 AliEveTPCSector3D.cxx:163 AliEveTPCSector3D.cxx:164 AliEveTPCSector3D.cxx:165 AliEveTPCSector3D.cxx:166 AliEveTPCSector3D.cxx:167 AliEveTPCSector3D.cxx:168 AliEveTPCSector3D.cxx:169 AliEveTPCSector3D.cxx:170 AliEveTPCSector3D.cxx:171 AliEveTPCSector3D.cxx:172 AliEveTPCSector3D.cxx:173 AliEveTPCSector3D.cxx:174 AliEveTPCSector3D.cxx:175 AliEveTPCSector3D.cxx:176 AliEveTPCSector3D.cxx:177 AliEveTPCSector3D.cxx:178 AliEveTPCSector3D.cxx:179 AliEveTPCSector3D.cxx:180 AliEveTPCSector3D.cxx:181 AliEveTPCSector3D.cxx:182 AliEveTPCSector3D.cxx:183 AliEveTPCSector3D.cxx:184 AliEveTPCSector3D.cxx:185 AliEveTPCSector3D.cxx:186 AliEveTPCSector3D.cxx:187 AliEveTPCSector3D.cxx:188 AliEveTPCSector3D.cxx:189 AliEveTPCSector3D.cxx:190 AliEveTPCSector3D.cxx:191 AliEveTPCSector3D.cxx:192 AliEveTPCSector3D.cxx:193 AliEveTPCSector3D.cxx:194 AliEveTPCSector3D.cxx:195 AliEveTPCSector3D.cxx:196 AliEveTPCSector3D.cxx:197 AliEveTPCSector3D.cxx:198 AliEveTPCSector3D.cxx:199 AliEveTPCSector3D.cxx:200 AliEveTPCSector3D.cxx:201 AliEveTPCSector3D.cxx:202 AliEveTPCSector3D.cxx:203 AliEveTPCSector3D.cxx:204 AliEveTPCSector3D.cxx:205 AliEveTPCSector3D.cxx:206 AliEveTPCSector3D.cxx:207 AliEveTPCSector3D.cxx:208 AliEveTPCSector3D.cxx:209 AliEveTPCSector3D.cxx:210 AliEveTPCSector3D.cxx:211 AliEveTPCSector3D.cxx:212 AliEveTPCSector3D.cxx:213 AliEveTPCSector3D.cxx:214 AliEveTPCSector3D.cxx:215 AliEveTPCSector3D.cxx:216 AliEveTPCSector3D.cxx:217 AliEveTPCSector3D.cxx:218 AliEveTPCSector3D.cxx:219 AliEveTPCSector3D.cxx:220 AliEveTPCSector3D.cxx:221 AliEveTPCSector3D.cxx:222 AliEveTPCSector3D.cxx:223 AliEveTPCSector3D.cxx:224 AliEveTPCSector3D.cxx:225 AliEveTPCSector3D.cxx:226 AliEveTPCSector3D.cxx:227 AliEveTPCSector3D.cxx:228 AliEveTPCSector3D.cxx:229 AliEveTPCSector3D.cxx:230 AliEveTPCSector3D.cxx:231 AliEveTPCSector3D.cxx:232 AliEveTPCSector3D.cxx:233 AliEveTPCSector3D.cxx:234 AliEveTPCSector3D.cxx:235 AliEveTPCSector3D.cxx:236 AliEveTPCSector3D.cxx:237 AliEveTPCSector3D.cxx:238 AliEveTPCSector3D.cxx:239 AliEveTPCSector3D.cxx:240 AliEveTPCSector3D.cxx:241 AliEveTPCSector3D.cxx:242 AliEveTPCSector3D.cxx:243 AliEveTPCSector3D.cxx:244 AliEveTPCSector3D.cxx:245 AliEveTPCSector3D.cxx:246 AliEveTPCSector3D.cxx:247 AliEveTPCSector3D.cxx:248 AliEveTPCSector3D.cxx:249 AliEveTPCSector3D.cxx:250 AliEveTPCSector3D.cxx:251