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 purpeateose. It is      *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$
// $MpId: AliMpTrigger.cxx,v 1.4 2006/05/24 13:58:52 ivana Exp $

#include "AliMpTrigger.h"
#include "AliMpSlatSegmentation.h"
#include "AliMpConstants.h"
#include "AliLog.h"
#include "AliMpSlat.h"

#include "Riostream.h"
#include "TArrayI.h"
#include "TObjArray.h"

//-----------------------------------------------------------------------------
/// \class AliMpTrigger
/// 
/// A trigger 'slat' object. 
/// It is to be viewed as a superposition of  
/// virtual layers of AliMpSlat objects. The need for more than one layer  
/// arise from the fact that a given local board deals with strips  
/// located in different detelem. So a given strip (pad) can have several  
/// "locations".
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

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

namespace
{
  Bool_t IsEqual(Double_t a, Double_t b, Double_t precision)
{
    if (b)
    {
      Double_t diff = TMath::Abs(b-a)/TMath::Abs(b);
      if ( diff < precision ) 
      {
        return kTRUE;
      }
    }
    else
    {
      if ( !a ) return kTRUE;
    }
    return kFALSE;
}
}

//_____________________________________________________________________________
AliMpTrigger::AliMpTrigger()
: TObject(), 
  fId(""), 
  fPlaneType(AliMp::kNonBendingPlane), 
  fSlats(0),
  fSlatSegmentations(0),
  fMaxNofPadsY(0),
  fDX(0), 
  fDY(0)
{
  /// default ctor

  AliDebugStream(1) << "this = " << this << endl;

  fSlats.SetOwner(kFALSE);
  fSlatSegmentations.SetOwner(kTRUE);
}

//_____________________________________________________________________________
AliMpTrigger::AliMpTrigger(const char* slatType, AliMp::PlaneType bendingOrNot)
    :  TObject(), 
       fId(slatType), 
       fPlaneType(bendingOrNot), 
       fSlats(0),
       fSlatSegmentations(0),
       fMaxNofPadsY(0), 
       fDX(0), 
       fDY(0)
{
  /// normal ctor

  AliDebugStream(1) << "this = " << this << endl;

  fSlats.SetOwner(kFALSE);
  fSlatSegmentations.SetOwner(kTRUE);
}

//_____________________________________________________________________________
AliMpTrigger::~AliMpTrigger()
{
  /// dtor
  AliDebugStream(1) << "this = " << this << endl;

  fSlatSegmentations.Delete();
}

//_____________________________________________________________________________
Bool_t
AliMpTrigger::AdoptLayer(AliMpSlat* slat)
{
  /// Adopt (i.e. we become owner of that pointer) a slat, as 
  /// a layer of this trigger slat.

  AliDebug(2,Form("%s is adopting %s ",
                  GetID(),slat->GetID()));

  // Check that we keep our size constant.
    
  if ( GetSize() > 0 && 
       ( !::IsEqual(slat->DX(),fDX,AliMpConstants::LengthTolerance()) || 
         !::IsEqual(slat->DY(),fDY,AliMpConstants::LengthTolerance()) )
     )
  {
    AliError(Form("In %s trying to add a layer (%e,%e) (layer #%d) "
                  "of a different size than mine (%e,%e)",
                  GetID(),slat->DX(),slat->DY(),fSlats.GetEntries(),
                  fDX,fDY));
    return kFALSE;
  }
  fSlats.Add(slat);
  Bool_t owner(kTRUE);
  // the slat segmentation will be the owner of the slat, and will delete
  // it when it'll be deleted itself
  fSlatSegmentations.Add(new AliMpSlatSegmentation(slat,owner));
  fMaxNofPadsY = TMath::Max(slat->GetMaxNofPadsY(),fMaxNofPadsY);
  fDX = TMath::Max(fDX,slat->DX());
  fDY = TMath::Max(fDY,slat->DY());
  return kTRUE;
}

//_____________________________________________________________________________
Double_t
AliMpTrigger::DX() const
{
  /// Returns the half-size in X (cm)
  return fDX;
}

//_____________________________________________________________________________
Double_t
AliMpTrigger::DY() const
{
  /// Returns the half-size in Y (cm)
  return fDY;
}

//_____________________________________________________________________________
void 
AliMpTrigger::GetAllLocalBoardNumbers(TArrayI& lbn) const
{
  /// Fills lbn with the local board numbers we're dealing with
  Int_t n(0);
  for ( Int_t i = 0; i < GetSize(); ++i )
  {
    n += GetLayer(i)->GetNofElectronicCards();
  }
  
  lbn.Set(n);

  Int_t index(0);
  
  for ( Int_t i = 0; i < GetSize(); ++i )
  {
    TArrayI slbn;
    GetLayer(i)->GetAllMotifPositionsIDs(slbn);
    for ( Int_t j = 0; j < slbn.GetSize(); ++j )
    {
      lbn[index] = slbn[j];
      ++index;
    }
  }
}

//_____________________________________________________________________________
const char*
AliMpTrigger::GetID() const
{
  /// returns the id of this slat
  return fId.Data();
}

//_____________________________________________________________________________
const char*
AliMpTrigger::GetName() const
{
  /// returns the name (=id+bending/non-bending) of this slat
  TString name(GetID());
  if ( fPlaneType == AliMp::kBendingPlane )
  {
    name += ".Bending";
  }
  else if ( fPlaneType == AliMp::kNonBendingPlane )
  {
    name += ".NonBending";
  }
  else
  {
    name += ".Invalid";
  }
  return name.Data();
}

//_____________________________________________________________________________
AliMpSlat*
AliMpTrigger::GetLayer(int layer) const
{
  /// Returns a given layer
  if ( IsLayerValid(layer) )
  {
    return (AliMpSlat*)fSlats.At(layer);
  }
  return 0;
}

//_____________________________________________________________________________
AliMpVSegmentation*
AliMpTrigger::GetLayerSegmentation(int layer) const
{
  /// Returns a given layer
  if ( IsLayerValid(layer) )
  {
    return (AliMpSlatSegmentation*)fSlatSegmentations.At(layer);
  }
  return 0;
}

//_____________________________________________________________________________
Int_t
AliMpTrigger::GetNofPadsX() const
{
  /// Returns the number of pad in x direction
  if ( !GetSize() ) return -1;
  if ( GetLayer(0) )
  {
    return GetLayer(0)->GetNofPadsX();
  }
  return -1;
}

//_____________________________________________________________________________
Int_t
AliMpTrigger::GetMaxNofPadsY() const
{
  /// Maximum number of pads in y direction
  return fMaxNofPadsY;
}

//_____________________________________________________________________________
Int_t
AliMpTrigger::GetSize() const
{
  /// Number of layers
  return fSlats.GetEntriesFast();
}

//_____________________________________________________________________________
Bool_t
AliMpTrigger::IsLayerValid(int layer) const
{
  /// Whether a given layer index is valid or not
  if ( layer >= 0 && layer < GetSize() )
  {
    return kTRUE;
  }
  return kFALSE;
}

//_____________________________________________________________________________
AliMp::PlaneType
AliMpTrigger::PlaneType() const
{
  /// Bending or not
  return fPlaneType;
}

//_____________________________________________________________________________
void
AliMpTrigger::Print(Option_t* opt) const
{
  /// Dump on screen
  cout << "AliMpTrigger::" << GetID();
  if ( GetSize() == 0 )
  {
    cout << " Empty";
  }
  else if ( GetSize() > 1 )
  {
    cout << " Number of layers : " << GetSize();
  }
  else 
  {
    cout << " One layer";
  }
  cout << endl;
  for ( Int_t i = 0; i < GetSize(); ++i ) 
  {
    cout << "   ";
    GetLayer(i)->Print(opt);
  }
}

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