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

//-----------------------------------------------------------------------------
// Class AliMpPad
// ---------------
// Class which encapsuate all informations about a pad
// Included in AliRoot: 2003/05/02
// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
// root [0] .x testSectorAreaIterator.C
// Real time 0:00:56, CP time 36.270
//-----------------------------------------------------------------------------

#include "AliMpPad.h"
#include "AliMpEncodePair.h"
#include "AliLog.h"

#include <TClonesArray.h>
#include <Riostream.h>

using std::cout;
using std::endl;
/// \cond CLASSIMP
ClassImp(AliMpPad)
/// \endcond

const Int_t  AliMpPad::fgkMaxNofLocations = 6;

//_____________________________________________________________________________
AliMpPad::AliMpPad(Int_t manuId, Int_t channel,
                   Int_t ix, Int_t iy,
                   Double_t x,  Double_t y, 
                   Double_t dx,  Double_t dy, 
                   Bool_t validity)
 : TObject(),
   fNofLocations(0),
   fLLocations(0),
   fLLocation(AliMp::Pair(manuId, channel)),
   fLIndices(AliMp::Pair(ix, iy)),
   fPositionX(x),
   fPositionY(y),
   fDimensionX(dx),
   fDimensionY(dy),
   fValidity(validity)
{
/// Standard constructor                                                   \n
/// Be carefull : this constructor doesn't check the validity of
/// the correspondance between location and indices.
/// By default, validity is set true.
/// It is aimed to be used by MSegmentation methods, and never from outside....
}

//_____________________________________________________________________________
AliMpPad::AliMpPad(Int_t manuId, Int_t channel,
                   MpPair_t indices,
                   Double_t x,  Double_t y, 
                   Double_t dx,  Double_t dy, 
                   Bool_t validity)
 : TObject(),
   fNofLocations(0),
   fLLocations(0),
   fLLocation(AliMp::Pair(manuId, channel)),
   fLIndices(indices),
   fPositionX(x),
   fPositionY(y),
   fDimensionX(dx),
   fDimensionY(dy),
   fValidity(validity)
{
/// Standard constructor                                                   \n
/// Be carefull : this constructor doesn't check the validity of
/// the correspondance between location and indices.
/// By default, validity is set true.
/// It is aimed to be used by MSegmentation methods, and never from outside....
}

//_____________________________________________________________________________
AliMpPad::AliMpPad()
  : TObject(),
    fNofLocations(0),
    fLLocations(0),
    fLLocation(0),
    fLIndices(0),
    fPositionX(-1.),
    fPositionY(-1.),
    fDimensionX(-1.),
    fDimensionY(-1.),
    fValidity(false) 
{
/// Default constructor - creates pad in invalid state
}

//_____________________________________________________________________________
AliMpPad::AliMpPad(const AliMpPad& rhs)
  : TObject(),
    fNofLocations(0),
    fLLocations(0),
    fLLocation(0),
    fLIndices(0),
    fPositionX(-1.),
    fPositionY(-1.),
    fDimensionX(-1.),
    fDimensionY(-1.),
    fValidity(false) 
{
/// Copy constructor

 *this = rhs;
}

//_____________________________________________________________________________
AliMpPad::~AliMpPad() 
{
/// Destructor

  delete [] fLLocations;
}

//_____________________________________________________________________________
AliMpPad& AliMpPad::operator = (const AliMpPad& rhs) 
{
/// Assignment operator
 
  // check assignment to self
  if (this == &rhs) return *this;

  // base class assignment
  TObject::operator=(rhs);

  // assignment operator
  fLLocation   = rhs.fLLocation;
  fLIndices    = rhs.fLIndices;
  fPositionX   = rhs.fPositionX;
  fPositionY   = rhs.fPositionY;
  fDimensionX  = rhs.fDimensionX;
  fDimensionY  = rhs.fDimensionY;
  fValidity = rhs.fValidity;
  
  delete [] fLLocations;
  fLLocations = 0;
  fNofLocations = rhs.fNofLocations;
  if ( rhs.GetNofLocations() ) {
    fLLocations = new MpPair_t[fgkMaxNofLocations];
    for ( UInt_t i=0; i<rhs.fNofLocations; i++ )
      fLLocations[i] = rhs.fLLocations[i];
  }  			

  return *this;
}

//_____________________________________________________________________________
Bool_t AliMpPad::operator == (const AliMpPad& rhs) const
{
/// Equality operator

  // are this and rhs equals?

  // one valid, one invalid
  if (fValidity != rhs.fValidity) return false;
  
  // both invalid
  if (!fValidity) return true;
  
  // both valid
  Bool_t sameLocations = true;
  
  if (rhs.GetNofLocations()) {
    for (Int_t i=0; i<rhs.GetNofLocations(); i++) 
      if ( GetLocation(i) != rhs.GetLocation(i) )
        sameLocations = false;
  }
  
  return    ( fLLocation  == rhs.fLLocation ) 
         && ( fLIndices   == rhs.fLIndices )
         && ( fPositionX  == rhs.fPositionX ) 
         && ( fPositionY  == rhs.fPositionY ) 
	 && ( fDimensionX == rhs.fDimensionX )
	 && sameLocations;
}
//_____________________________________________________________________________
Bool_t AliMpPad::operator != (const AliMpPad& rhs) const
{
/// Non-equality operator

  // are this and rhs equals?
  return !(*this==rhs);
}

//_____________________________________________________________________________
Bool_t operator < (const AliMpPad& left, const AliMpPad& right)
{
/// Less operator

  if ( left.GetIx() < right.GetIx() ) return kTRUE;
  if ( left.GetIx() > right.GetIx() ) return kFALSE;
  if ( left.GetIy() < right.GetIy() ) return kTRUE;
  return kFALSE;
}

//_____________________________________________________________________________
Bool_t AliMpPad::AddLocation(Int_t localBoardId, Int_t localBoardChannel, 
                             Bool_t warn)
{
/// Add location to the collection if not yet present and
/// if collection is not yet full                                           \n
/// Return false and optionally give a warning if location is not 
/// added. 

  // Check maximum number limit
  if ( GetNofLocations() == fgkMaxNofLocations ) {
    if (warn) {
      AliWarningStream() << "Cannot add location: ("
                         << localBoardId << "," << localBoardChannel << ")."
       	                 << "  Maximum number has been reached." << endl;
    }
    return false;
  }  			 

  // Check if location is present
  if ( HasLocation(localBoardId, localBoardChannel) ) {
    if (warn) {
      AliWarningStream() << "Cannot add location: "
                         << localBoardId << "," << localBoardChannel << ")."
                         << "  Location is already present." << endl;
    }
    return false;
  } 
  
  // Add location
  if ( ! fLLocations)
    fLLocations = new MpPair_t[fgkMaxNofLocations];
  
  fLLocations[fNofLocations++] 
    = AliMp::Pair(localBoardId, localBoardChannel);

  return true;
}

//_____________________________________________________________________________
Int_t  AliMpPad::GetManuId() const
{
/// Return pad manu Id 

  return AliMp::PairFirst(fLLocation);
}  

//_____________________________________________________________________________
Int_t  AliMpPad::GetManuChannel() const
{
/// Return pad manu channel

  return AliMp::PairSecond(fLLocation);
}  

//_____________________________________________________________________________
Int_t  AliMpPad::GetIx() const
{
/// Return pad index ix

  return AliMp::PairFirst(fLIndices);
}  

//_____________________________________________________________________________
Int_t  AliMpPad::GetIy() const
{
/// Return pad index iy

  return AliMp::PairSecond(fLIndices);
}  

//_____________________________________________________________________________
void AliMpPad::PrintOn(ostream& out) const
{
/// Prints all pad data.

  if ( !fValidity ) {
    out << "Pad::Invalid";
    return;
  }  

  out << "Pad: Location ";
  AliMp::PairPut(out, fLLocation)
      << "  Indices ";     
  AliMp::PairPut(out,fLIndices)
      << "  Position "
      << "(" << fPositionX << "," << fPositionY << ")"
      << "  Dimensions "
      << "(" << fDimensionX << "," << fDimensionY << ")";

  if ( GetNofLocations() ) {
    out << endl;
    out << "     Other locations: ";

    for (Int_t i=0; i<GetNofLocations(); i++) 
        AliMp::PairPut(out,GetLocation(i)) << "  ";
  }
}

//_____________________________________________________________________________
void AliMpPad::Print(const char* /*option*/) const
{
/// Prints all pad data.

  PrintOn(cout);
  cout << endl;
}

//_____________________________________________________________________________
Int_t  AliMpPad::GetNofLocations() const
{
/// Return number of other locations associated with this pad

  if (!fLLocations) return 0;
  
  return fNofLocations;
}  
  

//_____________________________________________________________________________
MpPair_t AliMpPad::GetLocation(Int_t i) const
{
/// Return i-th other location associated with this pad

  if ( !fLLocations || i<0 || i>=GetNofLocations() ) 
    return 0;

  return fLLocations[i];
}  

//_____________________________________________________________________________
Int_t AliMpPad::GetLocalBoardId(Int_t i) const
{
/// Return i-th other local board Id associated with this pad

  if ( !fLLocations || i<0 || i>=GetNofLocations() ) 
    return 0;

  return AliMp::PairFirst(fLLocations[i]);
}  

//_____________________________________________________________________________
Int_t AliMpPad::GetLocalBoardChannel(Int_t i) const
{
/// Return i-th other local board channel associated with this pad

  if ( !fLLocations || i<0 || i>=GetNofLocations() ) 
    return 0;

  return AliMp::PairSecond(fLLocations[i]);
}  

//_____________________________________________________________________________
Bool_t AliMpPad::HasLocation(Int_t localBoardId, Int_t localBoardChannel) const
{
/// Return true if given location is present either as fLLocation
/// or in the collectio

  MpPair_t location = AliMp::Pair(localBoardId, localBoardChannel);

  if (fLLocation == location) return true;

  for ( Int_t i=0; i<GetNofLocations(); i++ ) {
    if ( GetLocation(i) == location ) return true;
  }
    
  return false;
}      

//_____________________________________________________________________________
ostream& operator<< (ostream &out, const AliMpPad& pad)
{
/// Output streaming

  pad.PrintOn(out);

  return out;
}

 AliMpPad.cxx:1
 AliMpPad.cxx:2
 AliMpPad.cxx:3
 AliMpPad.cxx:4
 AliMpPad.cxx:5
 AliMpPad.cxx:6
 AliMpPad.cxx:7
 AliMpPad.cxx:8
 AliMpPad.cxx:9
 AliMpPad.cxx:10
 AliMpPad.cxx:11
 AliMpPad.cxx:12
 AliMpPad.cxx:13
 AliMpPad.cxx:14
 AliMpPad.cxx:15
 AliMpPad.cxx:16
 AliMpPad.cxx:17
 AliMpPad.cxx:18
 AliMpPad.cxx:19
 AliMpPad.cxx:20
 AliMpPad.cxx:21
 AliMpPad.cxx:22
 AliMpPad.cxx:23
 AliMpPad.cxx:24
 AliMpPad.cxx:25
 AliMpPad.cxx:26
 AliMpPad.cxx:27
 AliMpPad.cxx:28
 AliMpPad.cxx:29
 AliMpPad.cxx:30
 AliMpPad.cxx:31
 AliMpPad.cxx:32
 AliMpPad.cxx:33
 AliMpPad.cxx:34
 AliMpPad.cxx:35
 AliMpPad.cxx:36
 AliMpPad.cxx:37
 AliMpPad.cxx:38
 AliMpPad.cxx:39
 AliMpPad.cxx:40
 AliMpPad.cxx:41
 AliMpPad.cxx:42
 AliMpPad.cxx:43
 AliMpPad.cxx:44
 AliMpPad.cxx:45
 AliMpPad.cxx:46
 AliMpPad.cxx:47
 AliMpPad.cxx:48
 AliMpPad.cxx:49
 AliMpPad.cxx:50
 AliMpPad.cxx:51
 AliMpPad.cxx:52
 AliMpPad.cxx:53
 AliMpPad.cxx:54
 AliMpPad.cxx:55
 AliMpPad.cxx:56
 AliMpPad.cxx:57
 AliMpPad.cxx:58
 AliMpPad.cxx:59
 AliMpPad.cxx:60
 AliMpPad.cxx:61
 AliMpPad.cxx:62
 AliMpPad.cxx:63
 AliMpPad.cxx:64
 AliMpPad.cxx:65
 AliMpPad.cxx:66
 AliMpPad.cxx:67
 AliMpPad.cxx:68
 AliMpPad.cxx:69
 AliMpPad.cxx:70
 AliMpPad.cxx:71
 AliMpPad.cxx:72
 AliMpPad.cxx:73
 AliMpPad.cxx:74
 AliMpPad.cxx:75
 AliMpPad.cxx:76
 AliMpPad.cxx:77
 AliMpPad.cxx:78
 AliMpPad.cxx:79
 AliMpPad.cxx:80
 AliMpPad.cxx:81
 AliMpPad.cxx:82
 AliMpPad.cxx:83
 AliMpPad.cxx:84
 AliMpPad.cxx:85
 AliMpPad.cxx:86
 AliMpPad.cxx:87
 AliMpPad.cxx:88
 AliMpPad.cxx:89
 AliMpPad.cxx:90
 AliMpPad.cxx:91
 AliMpPad.cxx:92
 AliMpPad.cxx:93
 AliMpPad.cxx:94
 AliMpPad.cxx:95
 AliMpPad.cxx:96
 AliMpPad.cxx:97
 AliMpPad.cxx:98
 AliMpPad.cxx:99
 AliMpPad.cxx:100
 AliMpPad.cxx:101
 AliMpPad.cxx:102
 AliMpPad.cxx:103
 AliMpPad.cxx:104
 AliMpPad.cxx:105
 AliMpPad.cxx:106
 AliMpPad.cxx:107
 AliMpPad.cxx:108
 AliMpPad.cxx:109
 AliMpPad.cxx:110
 AliMpPad.cxx:111
 AliMpPad.cxx:112
 AliMpPad.cxx:113
 AliMpPad.cxx:114
 AliMpPad.cxx:115
 AliMpPad.cxx:116
 AliMpPad.cxx:117
 AliMpPad.cxx:118
 AliMpPad.cxx:119
 AliMpPad.cxx:120
 AliMpPad.cxx:121
 AliMpPad.cxx:122
 AliMpPad.cxx:123
 AliMpPad.cxx:124
 AliMpPad.cxx:125
 AliMpPad.cxx:126
 AliMpPad.cxx:127
 AliMpPad.cxx:128
 AliMpPad.cxx:129
 AliMpPad.cxx:130
 AliMpPad.cxx:131
 AliMpPad.cxx:132
 AliMpPad.cxx:133
 AliMpPad.cxx:134
 AliMpPad.cxx:135
 AliMpPad.cxx:136
 AliMpPad.cxx:137
 AliMpPad.cxx:138
 AliMpPad.cxx:139
 AliMpPad.cxx:140
 AliMpPad.cxx:141
 AliMpPad.cxx:142
 AliMpPad.cxx:143
 AliMpPad.cxx:144
 AliMpPad.cxx:145
 AliMpPad.cxx:146
 AliMpPad.cxx:147
 AliMpPad.cxx:148
 AliMpPad.cxx:149
 AliMpPad.cxx:150
 AliMpPad.cxx:151
 AliMpPad.cxx:152
 AliMpPad.cxx:153
 AliMpPad.cxx:154
 AliMpPad.cxx:155
 AliMpPad.cxx:156
 AliMpPad.cxx:157
 AliMpPad.cxx:158
 AliMpPad.cxx:159
 AliMpPad.cxx:160
 AliMpPad.cxx:161
 AliMpPad.cxx:162
 AliMpPad.cxx:163
 AliMpPad.cxx:164
 AliMpPad.cxx:165
 AliMpPad.cxx:166
 AliMpPad.cxx:167
 AliMpPad.cxx:168
 AliMpPad.cxx:169
 AliMpPad.cxx:170
 AliMpPad.cxx:171
 AliMpPad.cxx:172
 AliMpPad.cxx:173
 AliMpPad.cxx:174
 AliMpPad.cxx:175
 AliMpPad.cxx:176
 AliMpPad.cxx:177
 AliMpPad.cxx:178
 AliMpPad.cxx:179
 AliMpPad.cxx:180
 AliMpPad.cxx:181
 AliMpPad.cxx:182
 AliMpPad.cxx:183
 AliMpPad.cxx:184
 AliMpPad.cxx:185
 AliMpPad.cxx:186
 AliMpPad.cxx:187
 AliMpPad.cxx:188
 AliMpPad.cxx:189
 AliMpPad.cxx:190
 AliMpPad.cxx:191
 AliMpPad.cxx:192
 AliMpPad.cxx:193
 AliMpPad.cxx:194
 AliMpPad.cxx:195
 AliMpPad.cxx:196
 AliMpPad.cxx:197
 AliMpPad.cxx:198
 AliMpPad.cxx:199
 AliMpPad.cxx:200
 AliMpPad.cxx:201
 AliMpPad.cxx:202
 AliMpPad.cxx:203
 AliMpPad.cxx:204
 AliMpPad.cxx:205
 AliMpPad.cxx:206
 AliMpPad.cxx:207
 AliMpPad.cxx:208
 AliMpPad.cxx:209
 AliMpPad.cxx:210
 AliMpPad.cxx:211
 AliMpPad.cxx:212
 AliMpPad.cxx:213
 AliMpPad.cxx:214
 AliMpPad.cxx:215
 AliMpPad.cxx:216
 AliMpPad.cxx:217
 AliMpPad.cxx:218
 AliMpPad.cxx:219
 AliMpPad.cxx:220
 AliMpPad.cxx:221
 AliMpPad.cxx:222
 AliMpPad.cxx:223
 AliMpPad.cxx:224
 AliMpPad.cxx:225
 AliMpPad.cxx:226
 AliMpPad.cxx:227
 AliMpPad.cxx:228
 AliMpPad.cxx:229
 AliMpPad.cxx:230
 AliMpPad.cxx:231
 AliMpPad.cxx:232
 AliMpPad.cxx:233
 AliMpPad.cxx:234
 AliMpPad.cxx:235
 AliMpPad.cxx:236
 AliMpPad.cxx:237
 AliMpPad.cxx:238
 AliMpPad.cxx:239
 AliMpPad.cxx:240
 AliMpPad.cxx:241
 AliMpPad.cxx:242
 AliMpPad.cxx:243
 AliMpPad.cxx:244
 AliMpPad.cxx:245
 AliMpPad.cxx:246
 AliMpPad.cxx:247
 AliMpPad.cxx:248
 AliMpPad.cxx:249
 AliMpPad.cxx:250
 AliMpPad.cxx:251
 AliMpPad.cxx:252
 AliMpPad.cxx:253
 AliMpPad.cxx:254
 AliMpPad.cxx:255
 AliMpPad.cxx:256
 AliMpPad.cxx:257
 AliMpPad.cxx:258
 AliMpPad.cxx:259
 AliMpPad.cxx:260
 AliMpPad.cxx:261
 AliMpPad.cxx:262
 AliMpPad.cxx:263
 AliMpPad.cxx:264
 AliMpPad.cxx:265
 AliMpPad.cxx:266
 AliMpPad.cxx:267
 AliMpPad.cxx:268
 AliMpPad.cxx:269
 AliMpPad.cxx:270
 AliMpPad.cxx:271
 AliMpPad.cxx:272
 AliMpPad.cxx:273
 AliMpPad.cxx:274
 AliMpPad.cxx:275
 AliMpPad.cxx:276
 AliMpPad.cxx:277
 AliMpPad.cxx:278
 AliMpPad.cxx:279
 AliMpPad.cxx:280
 AliMpPad.cxx:281
 AliMpPad.cxx:282
 AliMpPad.cxx:283
 AliMpPad.cxx:284
 AliMpPad.cxx:285
 AliMpPad.cxx:286
 AliMpPad.cxx:287
 AliMpPad.cxx:288
 AliMpPad.cxx:289
 AliMpPad.cxx:290
 AliMpPad.cxx:291
 AliMpPad.cxx:292
 AliMpPad.cxx:293
 AliMpPad.cxx:294
 AliMpPad.cxx:295
 AliMpPad.cxx:296
 AliMpPad.cxx:297
 AliMpPad.cxx:298
 AliMpPad.cxx:299
 AliMpPad.cxx:300
 AliMpPad.cxx:301
 AliMpPad.cxx:302
 AliMpPad.cxx:303
 AliMpPad.cxx:304
 AliMpPad.cxx:305
 AliMpPad.cxx:306
 AliMpPad.cxx:307
 AliMpPad.cxx:308
 AliMpPad.cxx:309
 AliMpPad.cxx:310
 AliMpPad.cxx:311
 AliMpPad.cxx:312
 AliMpPad.cxx:313
 AliMpPad.cxx:314
 AliMpPad.cxx:315
 AliMpPad.cxx:316
 AliMpPad.cxx:317
 AliMpPad.cxx:318
 AliMpPad.cxx:319
 AliMpPad.cxx:320
 AliMpPad.cxx:321
 AliMpPad.cxx:322
 AliMpPad.cxx:323
 AliMpPad.cxx:324
 AliMpPad.cxx:325
 AliMpPad.cxx:326
 AliMpPad.cxx:327
 AliMpPad.cxx:328
 AliMpPad.cxx:329
 AliMpPad.cxx:330
 AliMpPad.cxx:331
 AliMpPad.cxx:332
 AliMpPad.cxx:333
 AliMpPad.cxx:334
 AliMpPad.cxx:335
 AliMpPad.cxx:336
 AliMpPad.cxx:337
 AliMpPad.cxx:338
 AliMpPad.cxx:339
 AliMpPad.cxx:340
 AliMpPad.cxx:341
 AliMpPad.cxx:342
 AliMpPad.cxx:343
 AliMpPad.cxx:344
 AliMpPad.cxx:345
 AliMpPad.cxx:346
 AliMpPad.cxx:347
 AliMpPad.cxx:348
 AliMpPad.cxx:349
 AliMpPad.cxx:350
 AliMpPad.cxx:351
 AliMpPad.cxx:352
 AliMpPad.cxx:353
 AliMpPad.cxx:354
 AliMpPad.cxx:355
 AliMpPad.cxx:356
 AliMpPad.cxx:357
 AliMpPad.cxx:358
 AliMpPad.cxx:359
 AliMpPad.cxx:360
 AliMpPad.cxx:361
 AliMpPad.cxx:362
 AliMpPad.cxx:363
 AliMpPad.cxx:364
 AliMpPad.cxx:365
 AliMpPad.cxx:366
 AliMpPad.cxx:367
 AliMpPad.cxx:368
 AliMpPad.cxx:369
 AliMpPad.cxx:370
 AliMpPad.cxx:371
 AliMpPad.cxx:372
 AliMpPad.cxx:373
 AliMpPad.cxx:374
 AliMpPad.cxx:375
 AliMpPad.cxx:376
 AliMpPad.cxx:377
 AliMpPad.cxx:378
 AliMpPad.cxx:379
 AliMpPad.cxx:380
 AliMpPad.cxx:381
 AliMpPad.cxx:382
 AliMpPad.cxx:383
 AliMpPad.cxx:384
 AliMpPad.cxx:385
 AliMpPad.cxx:386
 AliMpPad.cxx:387
 AliMpPad.cxx:388
 AliMpPad.cxx:389
 AliMpPad.cxx:390
 AliMpPad.cxx:391
 AliMpPad.cxx:392
 AliMpPad.cxx:393
 AliMpPad.cxx:394