#include <TMath.h>
#include "AliTRDpadPlane.h"
ClassImp(AliTRDpadPlane)
AliTRDpadPlane::AliTRDpadPlane()
:TObject()
,fLayer(0)
,fStack(0)
,fLength(0)
,fWidth(0)
,fLengthRim(0)
,fWidthRim(0)
,fLengthOPad(0)
,fWidthOPad(0)
,fLengthIPad(0)
,fWidthIPad(0)
,fRowSpacing(0)
,fColSpacing(0)
,fNrows(0)
,fNcols(0)
,fTiltingAngle(0)
,fTiltingTan(0)
,fPadRow(0)
,fPadCol(0)
,fPadRowSMOffset(0)
,fAnodeWireOffset(0)
{
}
AliTRDpadPlane::AliTRDpadPlane(Int_t layer, Int_t stack)
:TObject()
,fLayer(layer)
,fStack(stack)
,fLength(0)
,fWidth(0)
,fLengthRim(0)
,fWidthRim(0)
,fLengthOPad(0)
,fWidthOPad(0)
,fLengthIPad(0)
,fWidthIPad(0)
,fRowSpacing(0)
,fColSpacing(0)
,fNrows(0)
,fNcols(0)
,fTiltingAngle(0)
,fTiltingTan(0)
,fPadRow(0)
,fPadCol(0)
,fPadRowSMOffset(0)
,fAnodeWireOffset(0)
{
}
AliTRDpadPlane::~AliTRDpadPlane()
{
if (fPadRow) {
delete [] fPadRow;
fPadRow = 0;
}
if (fPadCol) {
delete [] fPadCol;
fPadCol = 0;
}
}
void AliTRDpadPlane::Copy(TObject &p) const
{
Int_t iBin = 0;
((AliTRDpadPlane &) p).fLayer = fLayer;
((AliTRDpadPlane &) p).fStack = fStack;
((AliTRDpadPlane &) p).fLength = fLength;
((AliTRDpadPlane &) p).fWidth = fWidth;
((AliTRDpadPlane &) p).fLengthRim = fLengthRim;
((AliTRDpadPlane &) p).fWidthRim = fWidthRim;
((AliTRDpadPlane &) p).fLengthOPad = fLengthOPad;
((AliTRDpadPlane &) p).fWidthOPad = fWidthOPad;
((AliTRDpadPlane &) p).fLengthIPad = fLengthIPad;
((AliTRDpadPlane &) p).fWidthIPad = fWidthIPad;
((AliTRDpadPlane &) p).fRowSpacing = fRowSpacing;
((AliTRDpadPlane &) p).fColSpacing = fColSpacing;
((AliTRDpadPlane &) p).fNrows = fNrows;
((AliTRDpadPlane &) p).fNcols = fNcols;
((AliTRDpadPlane &) p).fTiltingAngle = fTiltingAngle;
((AliTRDpadPlane &) p).fTiltingTan = fTiltingTan;
((AliTRDpadPlane &) p).fPadRowSMOffset = fPadRowSMOffset;
((AliTRDpadPlane &) p).fAnodeWireOffset = fAnodeWireOffset;
if (((AliTRDpadPlane &) p).fPadRow) {
delete [] ((AliTRDpadPlane &) p).fPadRow;
}
((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
for (iBin = 0; iBin < fNrows; iBin++) {
((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
}
if (((AliTRDpadPlane &) p).fPadCol) {
delete [] ((AliTRDpadPlane &) p).fPadCol;
}
((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
for (iBin = 0; iBin < fNrows; iBin++) {
((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
}
TObject::Copy(p);
}
void AliTRDpadPlane::SetTiltingAngle(Double_t t)
{
fTiltingAngle = t;
fTiltingTan = TMath::Tan(TMath::Pi()/180.0 * fTiltingAngle);
}
Int_t AliTRDpadPlane::GetPadRowNumber(Double_t z) const
{
Int_t row = 0;
Int_t nabove = 0;
Int_t nbelow = 0;
Int_t middle = 0;
if ((z > GetRow0() ) ||
(z < GetRowEnd())) {
row = -1;
}
else {
nabove = fNrows + 1;
nbelow = 0;
while (nabove - nbelow > 1) {
middle = (nabove + nbelow) / 2;
if (z == (fPadRow[middle-1] + fPadRowSMOffset)) {
row = middle;
}
if (z > (fPadRow[middle-1] + fPadRowSMOffset)) {
nabove = middle;
}
else {
nbelow = middle;
}
}
row = nbelow - 1;
}
return row;
}
Int_t AliTRDpadPlane::GetPadRowNumberROC(Double_t z) const
{
Int_t row = 0;
Int_t nabove = 0;
Int_t nbelow = 0;
Int_t middle = 0;
if ((z > GetRow0ROC() ) ||
(z < GetRowEndROC())) {
row = -1;
}
else {
nabove = fNrows + 1;
nbelow = 0;
while (nabove - nbelow > 1) {
middle = (nabove + nbelow) / 2;
if (z == fPadRow[middle-1]) {
row = middle;
}
if (z > fPadRow[middle-1]) {
nabove = middle;
}
else {
nbelow = middle;
}
}
row = nbelow - 1;
}
return row;
}
Int_t AliTRDpadPlane::GetPadColNumber(Double_t rphi) const
{
Int_t col = 0;
Int_t nabove = 0;
Int_t nbelow = 0;
Int_t middle = 0;
if ((rphi < GetCol0() ) ||
(rphi > GetColEnd())) {
col = -1;
}
else {
nabove = fNcols;
nbelow = 0;
while (nabove - nbelow > 1) {
middle = (nabove + nbelow) / 2;
if (rphi == fPadCol[middle]) {
col = middle;
}
if (rphi > fPadCol[middle]) {
nbelow = middle;
}
else {
nabove = middle;
}
}
col = nbelow;
}
return col;
}