#include <TGeoManager.h>
#include <TClonesArray.h>
#include <TTree.h>
#include <TEveTrans.h>
#include <AliTOFdigit.h>
#include <AliTOFGeometry.h>
#include "AliEveTOFSector.h"
Bool_t AliEveTOFSector::fgStaticInitDone = kFALSE;
TEveFrameBox* AliEveTOFSector::fgTOFsectorFrameBox = 0;
TEveRGBAPalette* AliEveTOFSector::fgTOFsectorPalette = 0;
ClassImp(AliEveTOFSector)
AliEveTOFSector::AliEveTOFSector(const Text_t* n, const Text_t* t) :
TEveQuadSet(n, t),
fTOFgeometry(new AliTOFGeometry()),
fTOFarray(0x0),
fTOFtree(0x0),
fSector(-1),
fDx(0), fDy(0), fDz(0),
fAutoTrans (kTRUE),
fThreshold (5), fMaxVal (80),
fSectorID (0),
fPlateFlag (0x0),
fGeoManager(0)
{
fPlateFlag = new Bool_t[5];
for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
if (!fGeoManager) {
printf("ERROR: no TGeo\n");
}
}
AliEveTOFSector::AliEveTOFSector(TGeoManager *localGeoManager,
Int_t nSector)
:
TEveQuadSet(Form("Sector%i",nSector)),
fTOFgeometry(new AliTOFGeometry()),
fTOFarray(0x0),
fTOFtree(0x0),
fSector(nSector),
fDx(0), fDy(0), fDz(0),
fAutoTrans (kTRUE),
fThreshold (5), fMaxVal (80),
fSectorID (nSector),
fPlateFlag (0x0),
fGeoManager(localGeoManager)
{
fPlateFlag = new Bool_t[5];
for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
InitModule();
}
AliEveTOFSector::AliEveTOFSector(TGeoManager *localGeoManager,
Int_t nSector,
TClonesArray *tofArray)
:
TEveQuadSet(Form("Sector%i",nSector)),
fTOFgeometry(new AliTOFGeometry()),
fTOFarray(tofArray),
fTOFtree(0x0),
fSector(nSector),
fDx(0), fDy(0), fDz(0),
fAutoTrans (kTRUE),
fThreshold (5), fMaxVal (80),
fSectorID (nSector),
fPlateFlag (0x0),
fGeoManager(localGeoManager)
{
fPlateFlag = new Bool_t[5];
for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
InitModule();
}
AliEveTOFSector::AliEveTOFSector(TGeoManager *localGeoManager,
Int_t nSector,
TTree *tofTree)
:
TEveQuadSet(Form("Sector%i",nSector)),
fTOFgeometry(new AliTOFGeometry()),
fTOFarray(0x0),
fTOFtree(tofTree),
fSector(nSector),
fDx(0), fDy(0), fDz(0),
fAutoTrans (kTRUE),
fThreshold (5), fMaxVal (80),
fSectorID (nSector),
fPlateFlag (0x0),
fGeoManager(localGeoManager)
{
fPlateFlag = new Bool_t[5];
for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
InitModule();
}
AliEveTOFSector::~AliEveTOFSector()
{
delete fPlateFlag;
}
void AliEveTOFSector::InitStatics()
{
if (fgStaticInitDone) return;
Float_t dx = 124.5;
Float_t dz = 29.;
Float_t dy = 370.6*2.;
fgTOFsectorFrameBox = new TEveFrameBox();
fgTOFsectorFrameBox->SetAABox(-dx*0.5, -dy*0.5, -dz*0.5, dx, dy, dz);
fgTOFsectorFrameBox->SetFrameColor(Color_t(32));
fgTOFsectorFrameBox->IncRefCount();
fgTOFsectorPalette = new TEveRGBAPalette(0, 100000);
fgTOFsectorPalette->SetOverflowAction(2);
fgTOFsectorPalette->SetUnderflowAction(2);
fgTOFsectorPalette->IncRefCount();
fgStaticInitDone = kTRUE;
}
void AliEveTOFSector::InitModule()
{
fDx = fTOFgeometry->XPad()*fTOFgeometry->NpadX();
fDz = fTOFgeometry->ZPad()*fTOFgeometry->NpadZ();
if (!fgStaticInitDone) InitStatics();
SetFrame(fgTOFsectorFrameBox);
SetPalette(fgTOFsectorPalette);
LoadQuads();
ComputeBBox();
SetTrans();
}
void AliEveTOFSector::LoadQuads()
{
Int_t vol[5] = {fSectorID, -1, -1, -1, -1};
Int_t informations[4] = {-1, -1, -1, -1};
Int_t dummy[3] = {-1, -1, -1};
Int_t tdc = -1;
Int_t tot = -1;
Double_t coord[4][3];
Reset(kQT_FreeQuad, kFALSE, 32);
if (fTOFtree && !fTOFarray) {
TClonesArray* digitsTOFnew = new TClonesArray("AliTOFdigit", 300);
fTOFarray = new TClonesArray("AliTOFdigit", 300);
TClonesArray &ldigits = *fTOFarray;
Int_t newCounter = 0;
AliTOFdigit *digs;
fTOFtree->SetBranchAddress("TOF",&digitsTOFnew);
fTOFtree->GetEntry(0);
for (Int_t digitNumber=0; digitNumber<digitsTOFnew->GetEntries(); digitNumber++) {
digs = (AliTOFdigit*)digitsTOFnew->UncheckedAt(digitNumber);
if (digs->GetSector()!=fSectorID) continue;
vol[1] = digs->GetPlate();
vol[2] = digs->GetStrip();
vol[3] = digs->GetPadx();
vol[4] = digs->GetPadz();
informations[0] = digs->GetTdc();
informations[1] = digs->GetAdc();
informations[2] = digs->GetToT();
informations[3] = digs->GetTdcND();
new (ldigits[newCounter++]) AliTOFdigit(dummy, vol, informations);
}
}
AliTOFdigit *tofDigit;
for (Int_t ii=0; ii<fTOFarray->GetEntries(); ii++) {
tofDigit = (AliTOFdigit*)fTOFarray->UncheckedAt(ii);
if (fPlateFlag[tofDigit->GetPlate()]) {
vol[1] = tofDigit->GetPlate();
vol[2] = tofDigit->GetStrip();
vol[3] = tofDigit->GetPadz();
vol[4] = tofDigit->GetPadx();
tot = tofDigit->GetToT();
tdc = tofDigit->GetTdc();
for (Int_t kk=0; kk<4; kk++) for (Int_t jj=0; jj<3; jj++) coord[kk][jj]=0.;
fTOFgeometry->DetToSectorRF(vol, coord);
Float_t vertices[12]={(Float_t)coord[0][0], (Float_t)coord[0][1], (Float_t)coord[0][2],
(Float_t)coord[1][0], (Float_t)coord[1][1], (Float_t)coord[1][2],
(Float_t)coord[2][0], (Float_t)coord[2][1], (Float_t)coord[2][2],
(Float_t)coord[3][0], (Float_t)coord[3][1], (Float_t)coord[3][2]};
AddQuad(vertices);
QuadValue((Int_t)tdc);
QuadId(tofDigit);
}
}
RefitPlex();
fTOFarray = 0x0;
}
void AliEveTOFSector::SetTrans()
{
InitMainTrans();
TEveTrans& t = RefMainTrans();
Char_t path[200];
Int_t localSector = fSector;
if (!fAutoTrans) localSector = 4;
fTOFgeometry->GetVolumePath(localSector,path);
fGeoManager->cd(path);
TGeoHMatrix global = *fGeoManager->GetCurrentMatrix();
Double_t *rotMat = global.GetRotationMatrix();
Double_t *tr = global.GetTranslation();
t.SetBaseVec(1, rotMat[0], rotMat[3], rotMat[6]);
t.SetBaseVec(2, rotMat[1], rotMat[4], rotMat[7]);
t.SetBaseVec(3, rotMat[2], rotMat[5], rotMat[8]);
t.SetBaseVec(4, tr);
}
void AliEveTOFSector::SetSectorID(Int_t id)
{
fSectorID = id;
fSector = id;
if (fAutoTrans)
SetTrans();
LoadQuads();
}
void AliEveTOFSector::SetPlate(Int_t nPlate, Bool_t r)
{
fPlateFlag[nPlate] = r;
}
void AliEveTOFSector::SetThreshold(Short_t t)
{
fThreshold = TMath::Min(t, (Short_t)(fMaxVal - 1));
}
void AliEveTOFSector::SetMaxVal(Int_t mv)
{
fMaxVal = TMath::Max(mv, (Int_t)(fThreshold + 1));
}
void AliEveTOFSector::DigitSelected(Int_t idx)
{
TObject* obj = GetId(idx);
AliTOFdigit* digs = dynamic_cast<AliTOFdigit*>(obj);
if (digs)
printf("\n Sector = %2i Plate = %1i Strip = %2i PadZ = %1i PadX = %2i ToT = %3i Tof = %5i\n",
fSector , digs->GetPlate(), digs->GetStrip(), digs->GetPadz(), digs->GetPadx(), digs->GetToT(), digs->GetTdc());
else printf("\n");
}