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 "AliTRDgeometry.h"
32 ClassImp(AliTRDpadPlane)
34 //_____________________________________________________________________________
35 AliTRDpadPlane::AliTRDpadPlane()
58 // Default constructor
63 //_____________________________________________________________________________
64 AliTRDpadPlane::AliTRDpadPlane(Int_t p, Int_t c)
87 // Constructor that initializes a given pad plane type
90 fGeo = new AliTRDgeometry();
104 // The pad plane parameter
117 fTiltingAngle = -2.0;
128 fTiltingAngle = -2.0;
165 fTiltingAngle = -2.0;
176 fTiltingAngle = -2.0;
213 fTiltingAngle = -2.0;
224 fTiltingAngle = -2.0;
254 // Store tilting angle as tangens
256 fTiltingTan = TMath::Tan(TMath::Pi()/180.0 * fTiltingAngle);
259 // The positions of the borders of the pads
263 fPadRow = new Double_t[fNrows];
264 Double_t row = fGeo->GetChamberLength(p,0)
265 + fGeo->GetChamberLength(p,1)
266 + fGeo->GetChamberLength(p,2) / 2.
269 for (Int_t ic = 0; ic < c; ic++) {
270 row -= fGeo->GetChamberLength(p,ic);
272 for (Int_t ir = 0; ir < fNrows; ir++) {
285 fPadCol = new Double_t[fNcols];
286 Double_t col = fGeo->GetChamberWidth(p) / 2.
289 for (Int_t ic = 0; ic < fNcols; ic++) {
302 //_____________________________________________________________________________
303 AliTRDpadPlane::AliTRDpadPlane(const AliTRDpadPlane &p)
310 ,fLengthRim(p.fLengthRim)
311 ,fWidthRim(p.fLengthRim)
312 ,fLengthOPad(p.fLengthOPad)
313 ,fWidthOPad(p.fWidthOPad)
314 ,fLengthIPad(p.fLengthIPad)
315 ,fWidthIPad(p.fWidthIPad)
316 ,fRowSpacing(p.fRowSpacing)
317 ,fColSpacing(p.fColSpacing)
320 ,fTiltingAngle(p.fTiltingAngle)
321 ,fTiltingTan(p.fTiltingTan)
326 // AliTRDpadPlane copy constructor
331 if (((AliTRDpadPlane &) p).fPadRow) delete [] ((AliTRDpadPlane &) p).fPadRow;
332 ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
333 for (iBin = 0; iBin < fNrows; iBin++) {
334 ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
337 if (((AliTRDpadPlane &) p).fPadCol) delete [] ((AliTRDpadPlane &) p).fPadCol;
338 ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
339 for (iBin = 0; iBin < fNrows; iBin++) {
340 ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
345 //_____________________________________________________________________________
346 AliTRDpadPlane::~AliTRDpadPlane()
349 // AliTRDpadPlane destructor
369 //_____________________________________________________________________________
370 AliTRDpadPlane &AliTRDpadPlane::operator=(const AliTRDpadPlane &p)
373 // Assignment operator
376 if (this != &p) ((AliTRDpadPlane &) p).Copy(*this);
381 //_____________________________________________________________________________
382 void AliTRDpadPlane::Copy(TObject &p) const
390 ((AliTRDpadPlane &) p).fGeo = 0;
392 ((AliTRDpadPlane &) p).fPla = fPla;
393 ((AliTRDpadPlane &) p).fCha = fCha;
395 ((AliTRDpadPlane &) p).fLength = fLength;
396 ((AliTRDpadPlane &) p).fWidth = fWidth;
397 ((AliTRDpadPlane &) p).fLengthRim = fLengthRim;
398 ((AliTRDpadPlane &) p).fWidthRim = fWidthRim;
399 ((AliTRDpadPlane &) p).fLengthOPad = fLengthOPad;
400 ((AliTRDpadPlane &) p).fWidthOPad = fWidthOPad;
401 ((AliTRDpadPlane &) p).fLengthIPad = fLengthIPad;
402 ((AliTRDpadPlane &) p).fWidthIPad = fWidthIPad;
404 ((AliTRDpadPlane &) p).fRowSpacing = fRowSpacing;
405 ((AliTRDpadPlane &) p).fColSpacing = fColSpacing;
407 ((AliTRDpadPlane &) p).fNrows = fNrows;
408 ((AliTRDpadPlane &) p).fNcols = fNcols;
410 ((AliTRDpadPlane &) p).fTiltingAngle = fTiltingAngle;
411 ((AliTRDpadPlane &) p).fTiltingTan = fTiltingTan;
413 if (((AliTRDpadPlane &) p).fPadRow) delete [] ((AliTRDpadPlane &) p).fPadRow;
414 ((AliTRDpadPlane &) p).fPadRow = new Double_t[fNrows];
415 for (iBin = 0; iBin < fNrows; iBin++) {
416 ((AliTRDpadPlane &) p).fPadRow[iBin] = fPadRow[iBin];
419 if (((AliTRDpadPlane &) p).fPadCol) delete [] ((AliTRDpadPlane &) p).fPadCol;
420 ((AliTRDpadPlane &) p).fPadCol = new Double_t[fNrows];
421 for (iBin = 0; iBin < fNrows; iBin++) {
422 ((AliTRDpadPlane &) p).fPadCol[iBin] = fPadCol[iBin];
429 //_____________________________________________________________________________
430 Int_t AliTRDpadPlane::GetPadRowNumber(Double_t z) const
433 // Finds the pad row number for a given global z-position
441 if ((z > GetRow0()) || (z < GetRowEnd())) {
450 while (nabove - nbelow > 1) {
451 middle = (nabove + nbelow) / 2;
452 if (z == fPadRow[middle-1]) row = middle;
453 if (z > fPadRow[middle-1]) nabove = middle;
454 else nbelow = middle;
464 //_____________________________________________________________________________
465 Int_t AliTRDpadPlane::GetPadColNumber(Double_t rphi
466 , Double_t /*rowOffset*/) const
469 // Finds the pad column number for a given global rphi-position
476 Double_t rphiShift = 0;
478 // MI change don't apply tilting angle here - better to do it directly on hit level
479 // Take the tilting angle into account by shifting the hit position
480 // into the opposite direction
485 if ((rphiShift > GetCol0()) || (rphiShift < GetColEnd())) {
494 while (nabove - nbelow > 1) {
495 middle = (nabove + nbelow) / 2;
496 if (rphiShift == fPadCol[middle-1]) col = middle;
497 if (rphiShift > fPadCol[middle-1]) nabove = middle;
498 else nbelow = middle;