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$
// $MpId: AliMpVSegmentation.cxx,v 1.5 2006/05/24 13:58:29 ivana Exp $
// Category: basic

//-----------------------------------------------------------------------------
// Class AliMpVSegmentation
// ------------------------
// The abstract base class for the segmentation.
// Provides methods related to pads:
// conversion between pad indices, pad location, pad position;
// finding pad neighbour.
//
// Included in AliRoot: 2003/05/02
// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
//         Laurent Aphecetche, SUBATECH
//-----------------------------------------------------------------------------


#include "AliMpVSegmentation.h"
#include "AliMpArea.h"
#include "AliMpConstants.h"

#include "AliLog.h"

#include "TObjArray.h"

/// \cond CLASSIMP
ClassImp(AliMpVSegmentation)
/// \endcond

//_____________________________________________________________________________
AliMpVSegmentation::AliMpVSegmentation() 
  : TObject()
{
/// Default constructor
}

//_____________________________________________________________________________
AliMpVSegmentation::~AliMpVSegmentation() 
{
/// Destructor 
}

//_____________________________________________________________________________
Int_t 
AliMpVSegmentation::GetNeighbours(const AliMpPad& pad, 
                                  TObjArray& neighbours,
                                  Bool_t includeSelf,
                                  Bool_t includeVoid) const
{
  /// Returns the list of neighbours of pad
  /// testPositions are the positions (L,T,R,B) relative to pad's center (O)
  /// were we'll try to get a neighbouring pad, by getting a little
  /// bit outside the pad itself.
  /// The pad density can only decrease when going from left to right except
  /// for round slates where it is the opposite.
  /// The pad density can only decrease when going from bottom to top but
  /// to be symmetric we also consider the opposite.
  /// The order in which we actually test the positions has some importance,
  /// i.e. when using this information to compute status map later on. Here's
  /// the sequence :
  /// <pre>
  /// 4- 5- 6-7
  /// |       |
  /// 3       8
  /// |   0   |
  /// 2       9
  /// |       |
  /// 1-12-11-10
  /// </pre>

  static const Int_t kNofTestPositions(12);
  static Double_t shiftx[12] = {-1., -1., -1., -1., -1./3., 1./3., 1., 1., 1., 1., 1./3., -1./3.};
  static Double_t shifty[12] = {-1., -1./3., 1./3., 1., 1., 1., 1., 1./3., -1./3., -1., -1., -1.};

  static const Double_t kEpsilon(AliMpConstants::LengthTolerance()*2.0);
  
  neighbours.Delete();
  neighbours.SetOwner(kTRUE);
  
  if ( ! pad.IsValid() ) return 0;
  
  AliMpPad invalid(AliMpPad::Invalid());
  AliMpPad *previous = &invalid;
  Int_t n(0);
  
  // consider adding the pad itself
  if ( includeSelf )
  {
    neighbours.Add(new AliMpPad(pad));
    ++n;
  }
  else if ( includeVoid )
  {
    neighbours.Add(new AliMpPad(invalid));
    ++n;
  }
  
  // add the neighbours (only once)
  for ( Int_t i = 0; i < kNofTestPositions; ++i )
  {
    
    AliMpPad p
      = PadByPosition(pad.GetPositionX() + ( pad.GetDimensionX() + kEpsilon )*shiftx[i], 
                      pad.GetPositionY() + ( pad.GetDimensionY() + kEpsilon )*shifty[i],
                      kFALSE);
    
    if ( p.IsValid() && p != *previous )
    {
      previous = new AliMpPad(p);
      neighbours.Add(previous);
      ++n;
    }
    else if ( includeVoid )
    {
      neighbours.Add(new AliMpPad(invalid));
      ++n;
    }
    
  }
  
  return n;
  
}

//
// public methods
//

//_____________________________________________________________________________
Bool_t 
AliMpVSegmentation::HasPadByIndices(Int_t ix, Int_t iy) const
{
  /// Default implementation. Must be overwritten if can be made more
  /// efficient in the child class
  
  return ( PadByIndices(ix, iy, kFALSE) != AliMpPad::Invalid() );
}

//_____________________________________________________________________________
Bool_t 
AliMpVSegmentation::HasPadByLocation(Int_t manuId, Int_t manuChannel) const
{
  /// Default implementation. Must be overwritten if can be made more
  /// efficient in the child class
  
  return (PadByLocation(manuId, manuChannel, kFALSE) != AliMpPad::Invalid());
}

//_____________________________________________________________________________
Bool_t 
AliMpVSegmentation::HasMotifPosition(Int_t manuId) const
{
  /// Default implementation to know if we hold a given manu
  return ( MotifPosition(manuId) != 0x0 );
}


 AliMpVSegmentation.cxx:1
 AliMpVSegmentation.cxx:2
 AliMpVSegmentation.cxx:3
 AliMpVSegmentation.cxx:4
 AliMpVSegmentation.cxx:5
 AliMpVSegmentation.cxx:6
 AliMpVSegmentation.cxx:7
 AliMpVSegmentation.cxx:8
 AliMpVSegmentation.cxx:9
 AliMpVSegmentation.cxx:10
 AliMpVSegmentation.cxx:11
 AliMpVSegmentation.cxx:12
 AliMpVSegmentation.cxx:13
 AliMpVSegmentation.cxx:14
 AliMpVSegmentation.cxx:15
 AliMpVSegmentation.cxx:16
 AliMpVSegmentation.cxx:17
 AliMpVSegmentation.cxx:18
 AliMpVSegmentation.cxx:19
 AliMpVSegmentation.cxx:20
 AliMpVSegmentation.cxx:21
 AliMpVSegmentation.cxx:22
 AliMpVSegmentation.cxx:23
 AliMpVSegmentation.cxx:24
 AliMpVSegmentation.cxx:25
 AliMpVSegmentation.cxx:26
 AliMpVSegmentation.cxx:27
 AliMpVSegmentation.cxx:28
 AliMpVSegmentation.cxx:29
 AliMpVSegmentation.cxx:30
 AliMpVSegmentation.cxx:31
 AliMpVSegmentation.cxx:32
 AliMpVSegmentation.cxx:33
 AliMpVSegmentation.cxx:34
 AliMpVSegmentation.cxx:35
 AliMpVSegmentation.cxx:36
 AliMpVSegmentation.cxx:37
 AliMpVSegmentation.cxx:38
 AliMpVSegmentation.cxx:39
 AliMpVSegmentation.cxx:40
 AliMpVSegmentation.cxx:41
 AliMpVSegmentation.cxx:42
 AliMpVSegmentation.cxx:43
 AliMpVSegmentation.cxx:44
 AliMpVSegmentation.cxx:45
 AliMpVSegmentation.cxx:46
 AliMpVSegmentation.cxx:47
 AliMpVSegmentation.cxx:48
 AliMpVSegmentation.cxx:49
 AliMpVSegmentation.cxx:50
 AliMpVSegmentation.cxx:51
 AliMpVSegmentation.cxx:52
 AliMpVSegmentation.cxx:53
 AliMpVSegmentation.cxx:54
 AliMpVSegmentation.cxx:55
 AliMpVSegmentation.cxx:56
 AliMpVSegmentation.cxx:57
 AliMpVSegmentation.cxx:58
 AliMpVSegmentation.cxx:59
 AliMpVSegmentation.cxx:60
 AliMpVSegmentation.cxx:61
 AliMpVSegmentation.cxx:62
 AliMpVSegmentation.cxx:63
 AliMpVSegmentation.cxx:64
 AliMpVSegmentation.cxx:65
 AliMpVSegmentation.cxx:66
 AliMpVSegmentation.cxx:67
 AliMpVSegmentation.cxx:68
 AliMpVSegmentation.cxx:69
 AliMpVSegmentation.cxx:70
 AliMpVSegmentation.cxx:71
 AliMpVSegmentation.cxx:72
 AliMpVSegmentation.cxx:73
 AliMpVSegmentation.cxx:74
 AliMpVSegmentation.cxx:75
 AliMpVSegmentation.cxx:76
 AliMpVSegmentation.cxx:77
 AliMpVSegmentation.cxx:78
 AliMpVSegmentation.cxx:79
 AliMpVSegmentation.cxx:80
 AliMpVSegmentation.cxx:81
 AliMpVSegmentation.cxx:82
 AliMpVSegmentation.cxx:83
 AliMpVSegmentation.cxx:84
 AliMpVSegmentation.cxx:85
 AliMpVSegmentation.cxx:86
 AliMpVSegmentation.cxx:87
 AliMpVSegmentation.cxx:88
 AliMpVSegmentation.cxx:89
 AliMpVSegmentation.cxx:90
 AliMpVSegmentation.cxx:91
 AliMpVSegmentation.cxx:92
 AliMpVSegmentation.cxx:93
 AliMpVSegmentation.cxx:94
 AliMpVSegmentation.cxx:95
 AliMpVSegmentation.cxx:96
 AliMpVSegmentation.cxx:97
 AliMpVSegmentation.cxx:98
 AliMpVSegmentation.cxx:99
 AliMpVSegmentation.cxx:100
 AliMpVSegmentation.cxx:101
 AliMpVSegmentation.cxx:102
 AliMpVSegmentation.cxx:103
 AliMpVSegmentation.cxx:104
 AliMpVSegmentation.cxx:105
 AliMpVSegmentation.cxx:106
 AliMpVSegmentation.cxx:107
 AliMpVSegmentation.cxx:108
 AliMpVSegmentation.cxx:109
 AliMpVSegmentation.cxx:110
 AliMpVSegmentation.cxx:111
 AliMpVSegmentation.cxx:112
 AliMpVSegmentation.cxx:113
 AliMpVSegmentation.cxx:114
 AliMpVSegmentation.cxx:115
 AliMpVSegmentation.cxx:116
 AliMpVSegmentation.cxx:117
 AliMpVSegmentation.cxx:118
 AliMpVSegmentation.cxx:119
 AliMpVSegmentation.cxx:120
 AliMpVSegmentation.cxx:121
 AliMpVSegmentation.cxx:122
 AliMpVSegmentation.cxx:123
 AliMpVSegmentation.cxx:124
 AliMpVSegmentation.cxx:125
 AliMpVSegmentation.cxx:126
 AliMpVSegmentation.cxx:127
 AliMpVSegmentation.cxx:128
 AliMpVSegmentation.cxx:129
 AliMpVSegmentation.cxx:130
 AliMpVSegmentation.cxx:131
 AliMpVSegmentation.cxx:132
 AliMpVSegmentation.cxx:133
 AliMpVSegmentation.cxx:134
 AliMpVSegmentation.cxx:135
 AliMpVSegmentation.cxx:136
 AliMpVSegmentation.cxx:137
 AliMpVSegmentation.cxx:138
 AliMpVSegmentation.cxx:139
 AliMpVSegmentation.cxx:140
 AliMpVSegmentation.cxx:141
 AliMpVSegmentation.cxx:142
 AliMpVSegmentation.cxx:143
 AliMpVSegmentation.cxx:144
 AliMpVSegmentation.cxx:145
 AliMpVSegmentation.cxx:146
 AliMpVSegmentation.cxx:147
 AliMpVSegmentation.cxx:148
 AliMpVSegmentation.cxx:149
 AliMpVSegmentation.cxx:150
 AliMpVSegmentation.cxx:151
 AliMpVSegmentation.cxx:152
 AliMpVSegmentation.cxx:153
 AliMpVSegmentation.cxx:154
 AliMpVSegmentation.cxx:155
 AliMpVSegmentation.cxx:156
 AliMpVSegmentation.cxx:157
 AliMpVSegmentation.cxx:158
 AliMpVSegmentation.cxx:159
 AliMpVSegmentation.cxx:160
 AliMpVSegmentation.cxx:161
 AliMpVSegmentation.cxx:162
 AliMpVSegmentation.cxx:163
 AliMpVSegmentation.cxx:164
 AliMpVSegmentation.cxx:165
 AliMpVSegmentation.cxx:166
 AliMpVSegmentation.cxx:167
 AliMpVSegmentation.cxx:168
 AliMpVSegmentation.cxx:169
 AliMpVSegmentation.cxx:170
 AliMpVSegmentation.cxx:171
 AliMpVSegmentation.cxx:172
 AliMpVSegmentation.cxx:173