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;
195 fPadRow = new Double_t[fNrows];
196 for (iBin = 0; iBin < fNrows; iBin++) {
197 fPadRow[iBin] = ((AliTRDpadPlane &) p).fPadRow[iBin];
203 fPadCol = new Double_t[fNrows];
204 for (iBin = 0; iBin < fNrows; iBin++) {
205 fPadCol[iBin] = ((AliTRDpadPlane &) p).fPadCol[iBin];
212 //_____________________________________________________________________________
213 void AliTRDpadPlane::Copy(TObject &p) const
221 ((AliTRDpadPlane &) p).fLayer = fLayer;
222 ((AliTRDpadPlane &) p).fStack = fStack;
224 ((AliTRDpadPlane &) p).fLength = fLength;
225 ((AliTRDpadPlane &) p).fWidth = fWidth;
226 ((AliTRDpadPlane &) p).fLengthRim = fLengthRim;
227 ((AliTRDpadPlane &) p).fWidthRim = fWidthRim;
228 ((AliTRDpadPlane &) p).fLengthOPad = fLengthOPad;
229 ((AliTRDpadPlane &) p).fWidthOPad = fWidthOPad;
230 ((AliTRDpadPlane &) p).fLengthIPad = fLengthIPad;
231 ((AliTRDpadPlane &) p).fWidthIPad = fWidthIPad;
233 ((AliTRDpadPlane &) p).fRowSpacing = fRowSpacing;
234 ((AliTRDpadPlane &) p).fColSpacing = fColSpacing;
236 ((AliTRDpadPlane &) p).fNrows = fNrows;
237 ((AliTRDpadPlane &) p).fNcols = fNcols;
239 ((AliTRDpadPlane &) p).fTiltingAngle = fTiltingAngle;
240 ((AliTRDpadPlane &) p).fTiltingTan = fTiltingTan;
242 ((AliTRDpadPlane &) p).fPadRowSMOffset = fPadRowSMOffset;
243 ((AliTRDpadPlane &) p).fAnodeWireOffset = fAnodeWireOffset;
245 if (((AliTRDpadPlane &) p).fPadRow) {
246 delete [] ((AliTRDpadPlane &) p).fPadRow;
248 ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
249 for (iBin = 0; iBin < fNrows; iBin++) {
250 ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
253 if (((AliTRDpadPlane &) p).fPadCol) {
254 delete [] ((AliTRDpadPlane &) p).fPadCol;
256 ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
257 for (iBin = 0; iBin < fNrows; iBin++) {
258 ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
265 //_____________________________________________________________________________
266 void AliTRDpadPlane::SetTiltingAngle(Double_t t)
269 // Set the tilting angle of the pads
273 fTiltingTan = TMath::Tan(TMath::Pi()/180.0 * fTiltingAngle);
277 //_____________________________________________________________________________
278 Int_t AliTRDpadPlane::GetPadRowNumber(Double_t z) const
281 // Finds the pad row number for a given z-position in local supermodule system
289 if ((z > GetRow0() ) ||
299 while (nabove - nbelow > 1) {
300 middle = (nabove + nbelow) / 2;
301 if (z == (fPadRow[middle-1] + fPadRowSMOffset)) {
304 if (z > (fPadRow[middle-1] + fPadRowSMOffset)) {
319 //_____________________________________________________________________________
320 Int_t AliTRDpadPlane::GetPadRowNumberROC(Double_t z) const
323 // Finds the pad row number for a given z-position in local ROC system
331 if ((z > GetRow0ROC() ) ||
332 (z < GetRowEndROC())) {
341 while (nabove - nbelow > 1) {
342 middle = (nabove + nbelow) / 2;
343 if (z == fPadRow[middle-1]) {
346 if (z > fPadRow[middle-1]) {
361 //_____________________________________________________________________________
362 Int_t AliTRDpadPlane::GetPadColNumber(Double_t rphi) const
365 // Finds the pad column number for a given rphi-position
373 if ((rphi < GetCol0() ) ||
374 (rphi > GetColEnd())) {
383 while (nabove - nbelow > 1) {
384 middle = (nabove + nbelow) / 2;
385 if (rphi == fPadCol[middle]) {
388 if (rphi > fPadCol[middle]) {