ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

#include "AliMUONPad.h"

#include "AliLog.h"
#include "AliMpArea.h"

#include "Riostream.h"
#include "TVirtualPad.h"
#include "TVirtualX.h"
#include "TVector2.h"
#include "TMath.h"

//-----------------------------------------------------------------------------
/// \class AliMUONPad
///
/// Object gathering information about a hit pad.
/// 
/// Can be seen as a combination of a Digit (which brings the charge) 
/// and an MpPad (which brings location and position)
///
/// Also provided are some static functions to compute overlap and
/// get neighboring information.
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

using std::setw;
using std::cout;
using std::endl;
using std::ios_base;
using std::cerr;
using std::ios;
/// \cond CLASSIMP
ClassImp(AliMUONPad)
/// \endcond

namespace
{
  AliMpArea
  Intersect(const AliMpArea& a, const AliMpArea& b)
  { 
    //
    // Returns the common part of a and b.
    //
    Double_t xmin = TMath::Max(a.LeftBorder(),b.LeftBorder());
    Double_t xmax = TMath::Min(a.RightBorder(),b.RightBorder());
    Double_t ymin = TMath::Max(a.DownBorder(),b.DownBorder());
    Double_t ymax = TMath::Min(a.UpBorder(),b.UpBorder());
    AliMpArea c( (xmin+xmax)/2.0, (ymin+ymax)/2.0 ,
                 (xmax-xmin)/2.0, (ymax-ymin)/2.0 );
	
    return c;
  }
}

//_____________________________________________________________________________
AliMUONPad::AliMUONPad()
:
TObject(),
fIsSaturated(kFALSE),
fIsReal(kFALSE),
fClusterId(-1),
fCathode(-1),
fDetElemId(-1),
fIx(-1),
fIy(-1),
fStatus(0),
fDimensions(),
fPosition(),
fCharge(0.0),
fChargeBackup(0.0)
{
  /// Default ctor
  Init(-1,-1,-1,-1,TVector2(0,0),TVector2(0,0),0);
}

//_____________________________________________________________________________
AliMUONPad::AliMUONPad(Int_t detElemId, Int_t cathode,
                       Int_t ix, Int_t iy, Double_t x, Double_t y,
                       Double_t dx, Double_t dy, Double_t charge)
:
TObject(),
fIsSaturated(kFALSE),
fIsReal(kFALSE),
fClusterId(-1),
fCathode(-1),
fDetElemId(-1),
fIx(-1),
fIy(-1),
fStatus(0),
fDimensions(),
fPosition(),
fCharge(0.0),
fChargeBackup(0.0)

{
  /// Normal ctor, using full information
  Init(detElemId,cathode,ix,iy,TVector2(x,y),TVector2(dx,dy),charge);
}

//_____________________________________________________________________________
AliMUONPad::AliMUONPad(Double_t x, Double_t y,
                       Double_t dx, Double_t dy, Double_t charge)
: TObject(),
fIsSaturated(kFALSE),
fIsReal(kFALSE),
fClusterId(-1),
fCathode(-1),
fDetElemId(-1),
fIx(-1),
fIy(-1),
fStatus(0),
fDimensions(),
fPosition(),
fCharge(0.0),
fChargeBackup(0.0)
{
  /// Truncated constructor (w/o DE, cath, ix, iy)
  Init(-1,-1,-1,-1,TVector2(x,y),TVector2(dx,dy),charge);
}

//_____________________________________________________________________________
AliMUONPad::AliMUONPad(const TVector2& position, const TVector2& dimensions,
                       Double_t charge)
: TObject(),
fIsSaturated(kFALSE),
fIsReal(kFALSE),
fClusterId(-1),
fCathode(-1),
fDetElemId(-1),
fIx(-1),
fIy(-1),
fStatus(0),
fDimensions(),
fPosition(),
fCharge(0.0),
fChargeBackup(0.0)
{
  /// Alternate ctor
  Init(-1,-1,-1,-1,position,dimensions,charge);
}

//_____________________________________________________________________________
AliMUONPad::~AliMUONPad()
{
/// Dtor
}

//_____________________________________________________________________________
Bool_t 
AliMUONPad::AreNeighbours(const AliMUONPad& d1, const AliMUONPad& d2) 
{
  /// Whether 2 pads are neighbours or not
  if ( d1.DetElemId() != d2.DetElemId() || 
       d1.Cathode() != d2.Cathode() )
  {
    return kFALSE;
  }
  else
  {
    static Double_t precision = 1E-4; // cm
    static TVector2 precisionAdjustment(-precision,-precision);    
    return AreOverlapping(d1,d2,precisionAdjustment);
  }
}

//_____________________________________________________________________________
Bool_t
AliMUONPad::AreOverlapping(const AliMUONPad& d1, const AliMUONPad& d2,
                           const TVector2& precision)
{
  /// Checks the overlap between 2 pads.
  /// The actual overlap is computed not on d1 and d2, but on d1 and d2
  /// "re-scaled" using the precision vector (conceptually equivalent to 
  /// d.Dimensions() += precision)
  ///
  /// So, if the elements (x,y) of precision are :
  ///
  /// - positive, the overlap is "computed" from smaller d1 and d2  
  ///   which is, modulo the precision, what you would think as a normal
  ///   overlap calculation
  /// - negative, overlap is from "bigger" d1 and d2, which is usefull to "tweek"
  ///   what we call an overlap, e.g. to consider 2 pads touching only by their
  ///   corners to be overlapping.
  
  AliMpArea a1(d1.X(),d1.Y(),d1.DX(),d1.DY());
  AliMpArea a2(d2.X(),d2.Y(),d2.DX(),d2.DY());
  
  if ( a1.LeftBorder() > a2.RightBorder() - precision.X() ||
       a1.RightBorder() < a2.LeftBorder() + precision.X() )
  {
    return kFALSE;
  }
  
  if ( a1.DownBorder() > a2.UpBorder() - precision.Y() ||
       a1.UpBorder() < a2.DownBorder() + precision.Y() )
  {
    return kFALSE;
  }
  return kTRUE;
}

//_____________________________________________________________________________
Bool_t
AliMUONPad::AreOverlapping(const AliMUONPad& d1, const AliMUONPad& d2,
                           const TVector2& precision,
                           AliMpArea& overlapRegion) 
{
  /// Checks the overlap between 2 pads, and returns the overlap area
  /// 
  /// See comments on the other AreOverlapping method, too : in this
  /// method, the overlapRegion does *not* depend on the precision parameter,
  /// which is only used to decide whether the pads are overlapping, while
  /// the actual overlap region is computed w/o reference to precision.
  ///
  if ( AreOverlapping(d1,d2,precision) )
  {
    overlapRegion = Overlap(d1,d2);
    if ( !overlapRegion.IsValid() )
    {
      cerr << "Something is wrong : the 2 pads below are flagged as overlapping"
      << ", but the overlapRegion is not valid"
      << endl;
      d1.Print("corners");
      d2.Print("corners");
    }
    return kTRUE;
  }
  return kFALSE;
}

//_____________________________________________________________________________
Int_t 
AliMUONPad::Compare(const TObject* obj) const
{
  /// Compare 2 pads. 
  /// Ordering is as complete as possible.
  
  const AliMUONPad* pad = static_cast<const AliMUONPad*>(obj);
    
  if (DetElemId() < 0)
  {
    // AZ - For "pixels" from MLEM cluster finder
    // we only sort on charge
    if (Charge() == pad->Charge()) return 0;
    return ( Charge() < pad->Charge() ) ? 1:-1;
  }

  if ( DetElemId() > pad->DetElemId() )
  {
    return 1;
  }
  else if ( DetElemId() < pad->DetElemId() )
  {
    return -1;
  }
  else
  {
    // same DetElemId...
    if ( Cathode() > pad->Cathode() )
    {
      return 1;
    }
    else if ( Cathode() < pad->Cathode() ) 
    {
      return -1;
    }
    else
    {
      // same cathode...
      if ( Ix() > pad->Ix() )
      {
        return 1;
      }
      else if ( Ix() < pad->Ix() ) 
      {
        return -1;
      }
      else
      {
        // same ix....
        if ( Iy() > pad->Iy() )
        {
          return 1;
        }
        else if ( Iy() < pad->Iy() ) 
        {
          return -1;
        }
        else
        {
          // same iy....
          if ( X() > pad->X() )
          {
            return 1;
          }
          else if ( X() < pad->X() )
          {
            return -1;
          }
          else
          {
            // same X
            if ( Y() > pad->Y() )
            {
              return 1;
            }
            else if ( Y() < pad->Y() )
            {
              return -1;
            }
            else
            {
              // same Y
              if ( Charge() < pad->Charge() ) 
              {
                return -1;
              }
              else if ( Charge() > pad->Charge() )
              {
                return 1;
              }
              else
              {
                return 0;
              }
            }
          }          
        }        
      }
    }
  }
  return 0;
}

//_____________________________________________________________________________
Double_t
AliMUONPad::Coord(Int_t ixy) const
{
  /// To be friendly and backward compatible with AZ code, which 
  /// used that kind of coordinate accessing.
  
  if ( ixy == 0 ) 
  {
    return X();
  }
  else if ( ixy == 1 )
  {
    return Y();
  }
  AliError(Form("Incorrect coordinates index %d (only 0,1 are valid)",ixy));
  return 0;
}

//_____________________________________________________________________________
void 
AliMUONPad::Init(Int_t detElemId, Int_t cathode,
                 Int_t ix, Int_t iy,
                 const TVector2& position,
                 const TVector2& dimensions,
                 Double_t charge)
{
  /// Called by all the ctors
  fIsSaturated = kFALSE;
  fIsReal = kTRUE;
  fDetElemId = detElemId;
  fCathode = cathode;
  fIx = ix;
  fIy = iy;
  fPosition = position;
  fDimensions = dimensions;
  fCharge = charge;
  fChargeBackup = fCharge;
  
  fClusterId = -1;

  fStatus = 0;
}

//_____________________________________________________________________________
AliMpArea
AliMUONPad::Overlap(const AliMUONPad& d1, const AliMUONPad& d2)
{  
  /// Return the overlap region between two pads
  AliMpArea a1(d1.X(),d1.Y(),d1.DX(),d1.DY());
  AliMpArea a2(d2.X(),d2.Y(),d2.DX(),d2.DY());
  return Intersect(a1,a2);
}


//_____________________________________________________________________________
void
AliMUONPad::Paint(Option_t*)
{
  /// Paint pad on screen
  TVector2 ll = Position() - Dimensions();
  TVector2 ur = Position() + Dimensions();

  gPad->PaintBox(ll.X(),ll.Y(),ur.X(),ur.Y());
}

//_____________________________________________________________________________
void
AliMUONPad::Print(Option_t* opt) const
{
  /// Printout
  TString sopt(opt);
  sopt.ToLower();
  
  ios_base::fmtflags oldflags = cout.flags();
  if ( Cathode() >= 0 )
  {
    cout << "DetEle " << setw(5) << DetElemId()
    << " Cath " << setw(2) << Cathode()
    << " (Ix,Iy)=(" << setw(3) << Ix() << "," << setw(3) << Iy() << ") ";
  }
  cout.setf(ios::fixed);
  cout.precision(6);
  cout << " (x,y)=(" << setw(9) << X() << "," << setw(9) << Y() << ") "
  << " (dx,dy)=(" << setw(9) << DX() << "," << setw(9) << DY() << ") "
  << " Charge=";
  cout.precision(2);
  cout << setw(7) << Charge();
  if ( sopt.Contains("full") )
  {
    cout 
    << " Used=" << (IsUsed()?Form("YES (ClusterId %d)",fClusterId):"NO")
    << (IsSaturated()?"(S)":"   ")
    << (IsReal()?"   ":"(V)")
    << " Status=" << setw(4) << Status()
    << " ChargeBackup=" << ChargeBackup();
  }
  if ( sopt.Contains("corners") )
  {
    cout << Form(" (xmin,xmax)=(%e,%e) (ymin,ymax)=(%e,%e)",
                 X()-DX(),X()+DX(),
                 Y()-DY(),Y()+DY()) << endl;
  }
  cout << endl;
  cout.precision(6); // reset to default precision
  cout.flags(oldflags);
}

//_____________________________________________________________________________
void 
AliMUONPad::SetCoord(Int_t ixy, Double_t coord)
{
  /// Set the pad coordinate (ixy=0 means x, ixy=1 means y)
  if ( ixy == 0 ) 
  {
    fPosition.Set(coord,Y());
  }
  else if ( ixy == 1 )
  {
    fPosition.Set(X(),coord);
  }
  else
  {
    AliError(Form("Incorrect coordinates index %d (only 0,1 are valid)",ixy));
  }
}

//_____________________________________________________________________________
void 
AliMUONPad::SetSize(Int_t ixy, Double_t size)
{
  /// Set the pad half size (ixy=0 means x half size, ixy=1 means y half size)
  if ( ixy == 0 ) 
  {
    fDimensions.Set(size,DY());
  }
  else if ( ixy == 1 )
  {
    fDimensions.Set(DX(),size);
  }
  else
  {
    AliError(Form("Incorrect coordinates index %d (only 0,1 are valid)",ixy));
  }
}

//_____________________________________________________________________________
void 
AliMUONPad::Shift(Int_t ixy, Double_t shift)
{
  /// Shift the position by "shift"
  SetCoord(ixy,Coord(ixy)+shift);
}

//_____________________________________________________________________________
Double_t
AliMUONPad::Size(Int_t ixy) const
{
  /// Returns the half size along a direction, given by ixy
  /// (see SetSize for ixy meaning)
  
  if ( ixy == 0 ) 
  {
    return DX();
  }
  else if ( ixy == 1 )
  {
    return DY();
  }
  AliError(Form("Incorrect coordinates index %d (only 0,1 are valid)",ixy));
  return 0;
}
 AliMUONPad.cxx:1
 AliMUONPad.cxx:2
 AliMUONPad.cxx:3
 AliMUONPad.cxx:4
 AliMUONPad.cxx:5
 AliMUONPad.cxx:6
 AliMUONPad.cxx:7
 AliMUONPad.cxx:8
 AliMUONPad.cxx:9
 AliMUONPad.cxx:10
 AliMUONPad.cxx:11
 AliMUONPad.cxx:12
 AliMUONPad.cxx:13
 AliMUONPad.cxx:14
 AliMUONPad.cxx:15
 AliMUONPad.cxx:16
 AliMUONPad.cxx:17
 AliMUONPad.cxx:18
 AliMUONPad.cxx:19
 AliMUONPad.cxx:20
 AliMUONPad.cxx:21
 AliMUONPad.cxx:22
 AliMUONPad.cxx:23
 AliMUONPad.cxx:24
 AliMUONPad.cxx:25
 AliMUONPad.cxx:26
 AliMUONPad.cxx:27
 AliMUONPad.cxx:28
 AliMUONPad.cxx:29
 AliMUONPad.cxx:30
 AliMUONPad.cxx:31
 AliMUONPad.cxx:32
 AliMUONPad.cxx:33
 AliMUONPad.cxx:34
 AliMUONPad.cxx:35
 AliMUONPad.cxx:36
 AliMUONPad.cxx:37
 AliMUONPad.cxx:38
 AliMUONPad.cxx:39
 AliMUONPad.cxx:40
 AliMUONPad.cxx:41
 AliMUONPad.cxx:42
 AliMUONPad.cxx:43
 AliMUONPad.cxx:44
 AliMUONPad.cxx:45
 AliMUONPad.cxx:46
 AliMUONPad.cxx:47
 AliMUONPad.cxx:48
 AliMUONPad.cxx:49
 AliMUONPad.cxx:50
 AliMUONPad.cxx:51
 AliMUONPad.cxx:52
 AliMUONPad.cxx:53
 AliMUONPad.cxx:54
 AliMUONPad.cxx:55
 AliMUONPad.cxx:56
 AliMUONPad.cxx:57
 AliMUONPad.cxx:58
 AliMUONPad.cxx:59
 AliMUONPad.cxx:60
 AliMUONPad.cxx:61
 AliMUONPad.cxx:62
 AliMUONPad.cxx:63
 AliMUONPad.cxx:64
 AliMUONPad.cxx:65
 AliMUONPad.cxx:66
 AliMUONPad.cxx:67
 AliMUONPad.cxx:68
 AliMUONPad.cxx:69
 AliMUONPad.cxx:70
 AliMUONPad.cxx:71
 AliMUONPad.cxx:72
 AliMUONPad.cxx:73
 AliMUONPad.cxx:74
 AliMUONPad.cxx:75
 AliMUONPad.cxx:76
 AliMUONPad.cxx:77
 AliMUONPad.cxx:78
 AliMUONPad.cxx:79
 AliMUONPad.cxx:80
 AliMUONPad.cxx:81
 AliMUONPad.cxx:82
 AliMUONPad.cxx:83
 AliMUONPad.cxx:84
 AliMUONPad.cxx:85
 AliMUONPad.cxx:86
 AliMUONPad.cxx:87
 AliMUONPad.cxx:88
 AliMUONPad.cxx:89
 AliMUONPad.cxx:90
 AliMUONPad.cxx:91
 AliMUONPad.cxx:92
 AliMUONPad.cxx:93
 AliMUONPad.cxx:94
 AliMUONPad.cxx:95
 AliMUONPad.cxx:96
 AliMUONPad.cxx:97
 AliMUONPad.cxx:98
 AliMUONPad.cxx:99
 AliMUONPad.cxx:100
 AliMUONPad.cxx:101
 AliMUONPad.cxx:102
 AliMUONPad.cxx:103
 AliMUONPad.cxx:104
 AliMUONPad.cxx:105
 AliMUONPad.cxx:106
 AliMUONPad.cxx:107
 AliMUONPad.cxx:108
 AliMUONPad.cxx:109
 AliMUONPad.cxx:110
 AliMUONPad.cxx:111
 AliMUONPad.cxx:112
 AliMUONPad.cxx:113
 AliMUONPad.cxx:114
 AliMUONPad.cxx:115
 AliMUONPad.cxx:116
 AliMUONPad.cxx:117
 AliMUONPad.cxx:118
 AliMUONPad.cxx:119
 AliMUONPad.cxx:120
 AliMUONPad.cxx:121
 AliMUONPad.cxx:122
 AliMUONPad.cxx:123
 AliMUONPad.cxx:124
 AliMUONPad.cxx:125
 AliMUONPad.cxx:126
 AliMUONPad.cxx:127
 AliMUONPad.cxx:128
 AliMUONPad.cxx:129
 AliMUONPad.cxx:130
 AliMUONPad.cxx:131
 AliMUONPad.cxx:132
 AliMUONPad.cxx:133
 AliMUONPad.cxx:134
 AliMUONPad.cxx:135
 AliMUONPad.cxx:136
 AliMUONPad.cxx:137
 AliMUONPad.cxx:138
 AliMUONPad.cxx:139
 AliMUONPad.cxx:140
 AliMUONPad.cxx:141
 AliMUONPad.cxx:142
 AliMUONPad.cxx:143
 AliMUONPad.cxx:144
 AliMUONPad.cxx:145
 AliMUONPad.cxx:146
 AliMUONPad.cxx:147
 AliMUONPad.cxx:148
 AliMUONPad.cxx:149
 AliMUONPad.cxx:150
 AliMUONPad.cxx:151
 AliMUONPad.cxx:152
 AliMUONPad.cxx:153
 AliMUONPad.cxx:154
 AliMUONPad.cxx:155
 AliMUONPad.cxx:156
 AliMUONPad.cxx:157
 AliMUONPad.cxx:158
 AliMUONPad.cxx:159
 AliMUONPad.cxx:160
 AliMUONPad.cxx:161
 AliMUONPad.cxx:162
 AliMUONPad.cxx:163
 AliMUONPad.cxx:164
 AliMUONPad.cxx:165
 AliMUONPad.cxx:166
 AliMUONPad.cxx:167
 AliMUONPad.cxx:168
 AliMUONPad.cxx:169
 AliMUONPad.cxx:170
 AliMUONPad.cxx:171
 AliMUONPad.cxx:172
 AliMUONPad.cxx:173
 AliMUONPad.cxx:174
 AliMUONPad.cxx:175
 AliMUONPad.cxx:176
 AliMUONPad.cxx:177
 AliMUONPad.cxx:178
 AliMUONPad.cxx:179
 AliMUONPad.cxx:180
 AliMUONPad.cxx:181
 AliMUONPad.cxx:182
 AliMUONPad.cxx:183
 AliMUONPad.cxx:184
 AliMUONPad.cxx:185
 AliMUONPad.cxx:186
 AliMUONPad.cxx:187
 AliMUONPad.cxx:188
 AliMUONPad.cxx:189
 AliMUONPad.cxx:190
 AliMUONPad.cxx:191
 AliMUONPad.cxx:192
 AliMUONPad.cxx:193
 AliMUONPad.cxx:194
 AliMUONPad.cxx:195
 AliMUONPad.cxx:196
 AliMUONPad.cxx:197
 AliMUONPad.cxx:198
 AliMUONPad.cxx:199
 AliMUONPad.cxx:200
 AliMUONPad.cxx:201
 AliMUONPad.cxx:202
 AliMUONPad.cxx:203
 AliMUONPad.cxx:204
 AliMUONPad.cxx:205
 AliMUONPad.cxx:206
 AliMUONPad.cxx:207
 AliMUONPad.cxx:208
 AliMUONPad.cxx:209
 AliMUONPad.cxx:210
 AliMUONPad.cxx:211
 AliMUONPad.cxx:212
 AliMUONPad.cxx:213
 AliMUONPad.cxx:214
 AliMUONPad.cxx:215
 AliMUONPad.cxx:216
 AliMUONPad.cxx:217
 AliMUONPad.cxx:218
 AliMUONPad.cxx:219
 AliMUONPad.cxx:220
 AliMUONPad.cxx:221
 AliMUONPad.cxx:222
 AliMUONPad.cxx:223
 AliMUONPad.cxx:224
 AliMUONPad.cxx:225
 AliMUONPad.cxx:226
 AliMUONPad.cxx:227
 AliMUONPad.cxx:228
 AliMUONPad.cxx:229
 AliMUONPad.cxx:230
 AliMUONPad.cxx:231
 AliMUONPad.cxx:232
 AliMUONPad.cxx:233
 AliMUONPad.cxx:234
 AliMUONPad.cxx:235
 AliMUONPad.cxx:236
 AliMUONPad.cxx:237
 AliMUONPad.cxx:238
 AliMUONPad.cxx:239
 AliMUONPad.cxx:240
 AliMUONPad.cxx:241
 AliMUONPad.cxx:242
 AliMUONPad.cxx:243
 AliMUONPad.cxx:244
 AliMUONPad.cxx:245
 AliMUONPad.cxx:246
 AliMUONPad.cxx:247
 AliMUONPad.cxx:248
 AliMUONPad.cxx:249
 AliMUONPad.cxx:250
 AliMUONPad.cxx:251
 AliMUONPad.cxx:252
 AliMUONPad.cxx:253
 AliMUONPad.cxx:254
 AliMUONPad.cxx:255
 AliMUONPad.cxx:256
 AliMUONPad.cxx:257
 AliMUONPad.cxx:258
 AliMUONPad.cxx:259
 AliMUONPad.cxx:260
 AliMUONPad.cxx:261
 AliMUONPad.cxx:262
 AliMUONPad.cxx:263
 AliMUONPad.cxx:264
 AliMUONPad.cxx:265
 AliMUONPad.cxx:266
 AliMUONPad.cxx:267
 AliMUONPad.cxx:268
 AliMUONPad.cxx:269
 AliMUONPad.cxx:270
 AliMUONPad.cxx:271
 AliMUONPad.cxx:272
 AliMUONPad.cxx:273
 AliMUONPad.cxx:274
 AliMUONPad.cxx:275
 AliMUONPad.cxx:276
 AliMUONPad.cxx:277
 AliMUONPad.cxx:278
 AliMUONPad.cxx:279
 AliMUONPad.cxx:280
 AliMUONPad.cxx:281
 AliMUONPad.cxx:282
 AliMUONPad.cxx:283
 AliMUONPad.cxx:284
 AliMUONPad.cxx:285
 AliMUONPad.cxx:286
 AliMUONPad.cxx:287
 AliMUONPad.cxx:288
 AliMUONPad.cxx:289
 AliMUONPad.cxx:290
 AliMUONPad.cxx:291
 AliMUONPad.cxx:292
 AliMUONPad.cxx:293
 AliMUONPad.cxx:294
 AliMUONPad.cxx:295
 AliMUONPad.cxx:296
 AliMUONPad.cxx:297
 AliMUONPad.cxx:298
 AliMUONPad.cxx:299
 AliMUONPad.cxx:300
 AliMUONPad.cxx:301
 AliMUONPad.cxx:302
 AliMUONPad.cxx:303
 AliMUONPad.cxx:304
 AliMUONPad.cxx:305
 AliMUONPad.cxx:306
 AliMUONPad.cxx:307
 AliMUONPad.cxx:308
 AliMUONPad.cxx:309
 AliMUONPad.cxx:310
 AliMUONPad.cxx:311
 AliMUONPad.cxx:312
 AliMUONPad.cxx:313
 AliMUONPad.cxx:314
 AliMUONPad.cxx:315
 AliMUONPad.cxx:316
 AliMUONPad.cxx:317
 AliMUONPad.cxx:318
 AliMUONPad.cxx:319
 AliMUONPad.cxx:320
 AliMUONPad.cxx:321
 AliMUONPad.cxx:322
 AliMUONPad.cxx:323
 AliMUONPad.cxx:324
 AliMUONPad.cxx:325
 AliMUONPad.cxx:326
 AliMUONPad.cxx:327
 AliMUONPad.cxx:328
 AliMUONPad.cxx:329
 AliMUONPad.cxx:330
 AliMUONPad.cxx:331
 AliMUONPad.cxx:332
 AliMUONPad.cxx:333
 AliMUONPad.cxx:334
 AliMUONPad.cxx:335
 AliMUONPad.cxx:336
 AliMUONPad.cxx:337
 AliMUONPad.cxx:338
 AliMUONPad.cxx:339
 AliMUONPad.cxx:340
 AliMUONPad.cxx:341
 AliMUONPad.cxx:342
 AliMUONPad.cxx:343
 AliMUONPad.cxx:344
 AliMUONPad.cxx:345
 AliMUONPad.cxx:346
 AliMUONPad.cxx:347
 AliMUONPad.cxx:348
 AliMUONPad.cxx:349
 AliMUONPad.cxx:350
 AliMUONPad.cxx:351
 AliMUONPad.cxx:352
 AliMUONPad.cxx:353
 AliMUONPad.cxx:354
 AliMUONPad.cxx:355
 AliMUONPad.cxx:356
 AliMUONPad.cxx:357
 AliMUONPad.cxx:358
 AliMUONPad.cxx:359
 AliMUONPad.cxx:360
 AliMUONPad.cxx:361
 AliMUONPad.cxx:362
 AliMUONPad.cxx:363
 AliMUONPad.cxx:364
 AliMUONPad.cxx:365
 AliMUONPad.cxx:366
 AliMUONPad.cxx:367
 AliMUONPad.cxx:368
 AliMUONPad.cxx:369
 AliMUONPad.cxx:370
 AliMUONPad.cxx:371
 AliMUONPad.cxx:372
 AliMUONPad.cxx:373
 AliMUONPad.cxx:374
 AliMUONPad.cxx:375
 AliMUONPad.cxx:376
 AliMUONPad.cxx:377
 AliMUONPad.cxx:378
 AliMUONPad.cxx:379
 AliMUONPad.cxx:380
 AliMUONPad.cxx:381
 AliMUONPad.cxx:382
 AliMUONPad.cxx:383
 AliMUONPad.cxx:384
 AliMUONPad.cxx:385
 AliMUONPad.cxx:386
 AliMUONPad.cxx:387
 AliMUONPad.cxx:388
 AliMUONPad.cxx:389
 AliMUONPad.cxx:390
 AliMUONPad.cxx:391
 AliMUONPad.cxx:392
 AliMUONPad.cxx:393
 AliMUONPad.cxx:394
 AliMUONPad.cxx:395
 AliMUONPad.cxx:396
 AliMUONPad.cxx:397
 AliMUONPad.cxx:398
 AliMUONPad.cxx:399
 AliMUONPad.cxx:400
 AliMUONPad.cxx:401
 AliMUONPad.cxx:402
 AliMUONPad.cxx:403
 AliMUONPad.cxx:404
 AliMUONPad.cxx:405
 AliMUONPad.cxx:406
 AliMUONPad.cxx:407
 AliMUONPad.cxx:408
 AliMUONPad.cxx:409
 AliMUONPad.cxx:410
 AliMUONPad.cxx:411
 AliMUONPad.cxx:412
 AliMUONPad.cxx:413
 AliMUONPad.cxx:414
 AliMUONPad.cxx:415
 AliMUONPad.cxx:416
 AliMUONPad.cxx:417
 AliMUONPad.cxx:418
 AliMUONPad.cxx:419
 AliMUONPad.cxx:420
 AliMUONPad.cxx:421
 AliMUONPad.cxx:422
 AliMUONPad.cxx:423
 AliMUONPad.cxx:424
 AliMUONPad.cxx:425
 AliMUONPad.cxx:426
 AliMUONPad.cxx:427
 AliMUONPad.cxx:428
 AliMUONPad.cxx:429
 AliMUONPad.cxx:430
 AliMUONPad.cxx:431
 AliMUONPad.cxx:432
 AliMUONPad.cxx:433
 AliMUONPad.cxx:434
 AliMUONPad.cxx:435
 AliMUONPad.cxx:436
 AliMUONPad.cxx:437
 AliMUONPad.cxx:438
 AliMUONPad.cxx:439
 AliMUONPad.cxx:440
 AliMUONPad.cxx:441
 AliMUONPad.cxx:442
 AliMUONPad.cxx:443
 AliMUONPad.cxx:444
 AliMUONPad.cxx:445
 AliMUONPad.cxx:446
 AliMUONPad.cxx:447
 AliMUONPad.cxx:448
 AliMUONPad.cxx:449
 AliMUONPad.cxx:450
 AliMUONPad.cxx:451
 AliMUONPad.cxx:452
 AliMUONPad.cxx:453
 AliMUONPad.cxx:454
 AliMUONPad.cxx:455
 AliMUONPad.cxx:456
 AliMUONPad.cxx:457
 AliMUONPad.cxx:458
 AliMUONPad.cxx:459
 AliMUONPad.cxx:460
 AliMUONPad.cxx:461
 AliMUONPad.cxx:462
 AliMUONPad.cxx:463
 AliMUONPad.cxx:464
 AliMUONPad.cxx:465
 AliMUONPad.cxx:466
 AliMUONPad.cxx:467
 AliMUONPad.cxx:468
 AliMUONPad.cxx:469
 AliMUONPad.cxx:470
 AliMUONPad.cxx:471
 AliMUONPad.cxx:472
 AliMUONPad.cxx:473
 AliMUONPad.cxx:474
 AliMUONPad.cxx:475
 AliMUONPad.cxx:476
 AliMUONPad.cxx:477
 AliMUONPad.cxx:478
 AliMUONPad.cxx:479
 AliMUONPad.cxx:480
 AliMUONPad.cxx:481
 AliMUONPad.cxx:482
 AliMUONPad.cxx:483
 AliMUONPad.cxx:484
 AliMUONPad.cxx:485
 AliMUONPad.cxx:486
 AliMUONPad.cxx:487
 AliMUONPad.cxx:488
 AliMUONPad.cxx:489
 AliMUONPad.cxx:490
 AliMUONPad.cxx:491
 AliMUONPad.cxx:492
 AliMUONPad.cxx:493
 AliMUONPad.cxx:494
 AliMUONPad.cxx:495
 AliMUONPad.cxx:496
 AliMUONPad.cxx:497
 AliMUONPad.cxx:498
 AliMUONPad.cxx:499
 AliMUONPad.cxx:500
 AliMUONPad.cxx:501
 AliMUONPad.cxx:502
 AliMUONPad.cxx:503
 AliMUONPad.cxx:504
 AliMUONPad.cxx:505
 AliMUONPad.cxx:506
 AliMUONPad.cxx:507
 AliMUONPad.cxx:508
 AliMUONPad.cxx:509
 AliMUONPad.cxx:510
 AliMUONPad.cxx:511
 AliMUONPad.cxx:512
 AliMUONPad.cxx:513
 AliMUONPad.cxx:514
 AliMUONPad.cxx:515
 AliMUONPad.cxx:516
 AliMUONPad.cxx:517
 AliMUONPad.cxx:518
 AliMUONPad.cxx:519
 AliMUONPad.cxx:520
 AliMUONPad.cxx:521
 AliMUONPad.cxx:522
 AliMUONPad.cxx:523