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. //
27 ///////////////////////////////////////////////////////////////////////////////
29 #include "AliTRDpadPlane.h"
30 #include "AliTRDgeometryFull.h"
32 ClassImp(AliTRDpadPlane)
34 //_____________________________________________________________________________
35 AliTRDpadPlane::AliTRDpadPlane():TObject()
38 // Default constructor
68 //_____________________________________________________________________________
69 AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c):TObject()
72 // Constructor that initializes a given pad plane type
75 fGeo = new AliTRDgeometryFull();
80 //fRowSpacing = 0.025;
81 //fColSpacing = 0.025;
92 // The pad plane parameter
105 fTiltingAngle = -2.0;
116 fTiltingAngle = -2.0;
153 fTiltingAngle = -2.0;
164 fTiltingAngle = -2.0;
201 fTiltingAngle = -2.0;
212 fTiltingAngle = -2.0;
242 // The positions of the borders of the pads
246 if (fPadRow) delete [] fPadRow;
247 fPadRow = new Double_t[fNrows];
248 Double_t row = fGeo->GetChamberLength(p,0)
249 + fGeo->GetChamberLength(p,1)
250 + fGeo->GetChamberLength(p,2) / 2.
252 for (Int_t ic = 0; ic < c; ic++) {
253 row -= fGeo->GetChamberLength(p,ic);
255 for (Int_t ir = 0; ir < fNrows; ir++) {
268 if (fPadCol) delete [] fPadCol;
269 fPadCol = new Double_t[fNcols];
270 Double_t col = fGeo->GetChamberWidth(p) / 2.
272 for (Int_t ic = 0; ic < fNcols; ic++) {
285 //_____________________________________________________________________________
286 AliTRDpadPlane::AliTRDpadPlane(const AliTRDpadPlane &p):TObject(p)
289 // AliTRDpadPlane copy constructor
292 ((AliTRDpadPlane &) p).Copy(*this);
296 //_____________________________________________________________________________
297 AliTRDpadPlane::~AliTRDpadPlane()
300 // AliTRDpadPlane destructor
320 //_____________________________________________________________________________
321 AliTRDpadPlane &AliTRDpadPlane::operator=(const AliTRDpadPlane &p)
324 // Assignment operator
327 if (this != &p) ((AliTRDpadPlane &) p).Copy(*this);
332 //_____________________________________________________________________________
333 void AliTRDpadPlane::Copy(TObject &p) const
341 ((AliTRDpadPlane &) p).fGeo = 0;
343 ((AliTRDpadPlane &) p).fPla = fPla;
344 ((AliTRDpadPlane &) p).fCha = fCha;
346 ((AliTRDpadPlane &) p).fLength = fLength;
347 ((AliTRDpadPlane &) p).fWidth = fWidth;
348 ((AliTRDpadPlane &) p).fLengthRim = fLengthRim;
349 ((AliTRDpadPlane &) p).fWidthRim = fWidthRim;
350 ((AliTRDpadPlane &) p).fLengthOPad = fLengthOPad;
351 ((AliTRDpadPlane &) p).fWidthOPad = fWidthOPad;
352 ((AliTRDpadPlane &) p).fLengthIPad = fLengthIPad;
353 ((AliTRDpadPlane &) p).fWidthIPad = fWidthIPad;
355 ((AliTRDpadPlane &) p).fRowSpacing = fRowSpacing;
356 ((AliTRDpadPlane &) p).fColSpacing = fColSpacing;
358 ((AliTRDpadPlane &) p).fNrows = fNrows;
359 ((AliTRDpadPlane &) p).fNcols = fNcols;
361 ((AliTRDpadPlane &) p).fTiltingAngle = fTiltingAngle;
363 if (((AliTRDpadPlane &) p).fPadRow) delete [] ((AliTRDpadPlane &) p).fPadRow;
364 ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
365 for (iBin = 0; iBin < fNrows; iBin++) {
366 ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
369 if (((AliTRDpadPlane &) p).fPadCol) delete [] ((AliTRDpadPlane &) p).fPadCol;
370 ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
371 for (iBin = 0; iBin < fNrows; iBin++) {
372 ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
379 //_____________________________________________________________________________
380 Int_t AliTRDpadPlane::GetPadRowNumber(const Double_t z)
383 // Finds the pad row number for a given global z-position
391 if ((z > fPadRow[0]) ||
392 (z < fPadRow[0] - fLength + 2.0*fLengthRim)) {
398 while (nabove - nbelow > 1) {
399 middle = (nabove + nbelow) / 2;
400 if (z == fPadRow[middle-1]) row = middle;
401 if (z > fPadRow[middle-1]) nabove = middle;
402 else nbelow = middle;
411 //_____________________________________________________________________________
412 Int_t AliTRDpadPlane::GetPadColNumber(const Double_t rphi)
415 // Finds the pad column number for a given global rphi-position
423 if ((rphi > fPadCol[0]) ||
424 (rphi < fPadCol[0] - fWidth + 2.0*fWidthRim)) {
430 while (nabove - nbelow > 1) {
431 middle = (nabove + nbelow) / 2;
432 if (rphi == fPadCol[middle-1]) col = middle;
433 if (rphi > fPadCol[middle-1]) nabove = middle;
434 else nbelow = middle;
443 //_____________________________________________________________________________
444 Double_t AliTRDpadPlane::GetPadRowOffset(const Int_t row, const Double_t z)
447 // Calculates the distance to the pad border in row direction
450 if ((row < 0) || (row >= fNrows)) {
454 return fPadRow[row] - z;
459 //_____________________________________________________________________________
460 Double_t AliTRDpadPlane::GetPadColOffset(const Int_t col, const Double_t rphi)
463 // Calculates the distance to the pad border in column direction
466 if ((col < 0) || (col >= fNcols)) {
470 return fPadCol[col] - rphi;