1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Describes a pad plane of a TRD ROC //
22 // Contains the information on pad postions, pad dimensions, //
23 // tilting angle, etc. //
24 // It also provides methods to identify the current pad number from //
25 // global coordinates. //
26 // The numbering and coordinates should follow the official convention //
27 // (see David Emschermanns note on TRD convention //
29 ///////////////////////////////////////////////////////////////////////////////
33 #include "AliTRDpadPlane.h"
35 ClassImp(AliTRDpadPlane)
37 //_____________________________________________________________________________
38 AliTRDpadPlane::AliTRDpadPlane()
62 // Default constructor
67 //_____________________________________________________________________________
68 AliTRDpadPlane::AliTRDpadPlane(Int_t layer, Int_t stack)
97 //_____________________________________________________________________________
98 AliTRDpadPlane::AliTRDpadPlane(const AliTRDpadPlane &p)
104 ,fLengthRim(p.fLengthRim)
105 ,fWidthRim(p.fLengthRim)
106 ,fLengthOPad(p.fLengthOPad)
107 ,fWidthOPad(p.fWidthOPad)
108 ,fLengthIPad(p.fLengthIPad)
109 ,fWidthIPad(p.fWidthIPad)
110 ,fRowSpacing(p.fRowSpacing)
111 ,fColSpacing(p.fColSpacing)
114 ,fTiltingAngle(p.fTiltingAngle)
115 ,fTiltingTan(p.fTiltingTan)
118 ,fPadRowSMOffset(p.fPadRowSMOffset)
119 ,fAnodeWireOffset(p.fAnodeWireOffset)
122 // AliTRDpadPlane copy constructor
127 fPadRow = new Double_t[fNrows];
128 for (iBin = 0; iBin < fNrows; iBin++) {
129 fPadRow[iBin] = ((AliTRDpadPlane &) p).fPadRow[iBin];
132 fPadCol = new Double_t[fNrows];
133 for (iBin = 0; iBin < fNrows; iBin++) {
134 fPadCol[iBin] = ((AliTRDpadPlane &) p).fPadCol[iBin];
139 //_____________________________________________________________________________
140 AliTRDpadPlane::~AliTRDpadPlane()
143 // AliTRDpadPlane destructor
158 //_____________________________________________________________________________
159 AliTRDpadPlane &AliTRDpadPlane::operator=(const AliTRDpadPlane &p)
162 // Assignment operator
173 fLengthRim = p.fLengthRim;
174 fWidthRim = p.fLengthRim;
175 fLengthOPad = p.fLengthOPad;
176 fWidthOPad = p.fWidthOPad;
177 fLengthIPad = p.fLengthIPad;
178 fWidthIPad = p.fWidthIPad;
179 fRowSpacing = p.fRowSpacing;
180 fColSpacing = p.fColSpacing;
183 fTiltingAngle = p.fTiltingAngle;
184 fTiltingTan = p.fTiltingTan;
187 fPadRowSMOffset = p.fPadRowSMOffset;
188 fAnodeWireOffset = p.fAnodeWireOffset;
192 fPadRow = new Double_t[fNrows];
193 for (iBin = 0; iBin < fNrows; iBin++) {
194 fPadRow[iBin] = ((AliTRDpadPlane &) p).fPadRow[iBin];
197 fPadCol = new Double_t[fNrows];
198 for (iBin = 0; iBin < fNrows; iBin++) {
199 fPadCol[iBin] = ((AliTRDpadPlane &) p).fPadCol[iBin];
206 //_____________________________________________________________________________
207 void AliTRDpadPlane::Copy(TObject &p) const
215 ((AliTRDpadPlane &) p).fLayer = fLayer;
216 ((AliTRDpadPlane &) p).fStack = fStack;
218 ((AliTRDpadPlane &) p).fLength = fLength;
219 ((AliTRDpadPlane &) p).fWidth = fWidth;
220 ((AliTRDpadPlane &) p).fLengthRim = fLengthRim;
221 ((AliTRDpadPlane &) p).fWidthRim = fWidthRim;
222 ((AliTRDpadPlane &) p).fLengthOPad = fLengthOPad;
223 ((AliTRDpadPlane &) p).fWidthOPad = fWidthOPad;
224 ((AliTRDpadPlane &) p).fLengthIPad = fLengthIPad;
225 ((AliTRDpadPlane &) p).fWidthIPad = fWidthIPad;
227 ((AliTRDpadPlane &) p).fRowSpacing = fRowSpacing;
228 ((AliTRDpadPlane &) p).fColSpacing = fColSpacing;
230 ((AliTRDpadPlane &) p).fNrows = fNrows;
231 ((AliTRDpadPlane &) p).fNcols = fNcols;
233 ((AliTRDpadPlane &) p).fTiltingAngle = fTiltingAngle;
234 ((AliTRDpadPlane &) p).fTiltingTan = fTiltingTan;
236 ((AliTRDpadPlane &) p).fPadRowSMOffset = fPadRowSMOffset;
237 ((AliTRDpadPlane &) p).fAnodeWireOffset = fAnodeWireOffset;
239 if (((AliTRDpadPlane &) p).fPadRow) {
240 delete [] ((AliTRDpadPlane &) p).fPadRow;
242 ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
243 for (iBin = 0; iBin < fNrows; iBin++) {
244 ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
247 if (((AliTRDpadPlane &) p).fPadCol) {
248 delete [] ((AliTRDpadPlane &) p).fPadCol;
250 ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
251 for (iBin = 0; iBin < fNrows; iBin++) {
252 ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
259 //_____________________________________________________________________________
260 void AliTRDpadPlane::SetTiltingAngle(Double_t t)
263 // Set the tilting angle of the pads
267 fTiltingTan = TMath::Tan(TMath::Pi()/180.0 * fTiltingAngle);
271 //_____________________________________________________________________________
272 Int_t AliTRDpadPlane::GetPadRowNumber(Double_t z) const
275 // Finds the pad row number for a given z-position in local supermodule system
283 if ((z > GetRow0() ) ||
293 while (nabove - nbelow > 1) {
294 middle = (nabove + nbelow) / 2;
295 if (z == (fPadRow[middle-1] + fPadRowSMOffset)) {
298 if (z > (fPadRow[middle-1] + fPadRowSMOffset)) {
313 //_____________________________________________________________________________
314 Int_t AliTRDpadPlane::GetPadRowNumberROC(Double_t z) const
317 // Finds the pad row number for a given z-position in local ROC system
325 if ((z > GetRow0ROC() ) ||
326 (z < GetRowEndROC())) {
335 while (nabove - nbelow > 1) {
336 middle = (nabove + nbelow) / 2;
337 if (z == fPadRow[middle-1]) {
340 if (z > fPadRow[middle-1]) {
355 //_____________________________________________________________________________
356 Int_t AliTRDpadPlane::GetPadColNumber(Double_t rphi) const
359 // Finds the pad column number for a given rphi-position
367 if ((rphi < GetCol0() ) ||
368 (rphi > GetColEnd())) {
377 while (nabove - nbelow > 1) {
378 middle = (nabove + nbelow) / 2;
379 if (rphi == fPadCol[middle]) {
382 if (rphi > fPadCol[middle]) {