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: AliMpBusPatch.cxx,v 1.4 2006/05/24 13:58:34 ivana Exp $

//-----------------------------------------------------------------------------
// Class AliMpBusPatch
// --------------------
// The class defines the properties of BusPatch
// Author: Ivana Hrivnacova, IPN Orsay
//-----------------------------------------------------------------------------

#include "AliMpBusPatch.h"

#include "AliDAQ.h"
#include "AliMpConstants.h"
#include "AliMpDEManager.h"
#include "AliMpSegmentation.h"
#include "AliMpSlat.h"
#include "AliMpPCB.h"
#include "AliMpMotifPosition.h"

#include "AliLog.h"

#include <Riostream.h>

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

const Int_t  AliMpBusPatch::fgkOffset = 100;
//
// static methods
//

//____________________________________________________________________
Int_t AliMpBusPatch::GetGlobalBusID(Int_t localID, Int_t ddlID)
{
  /// return global bus id from local bus and ddl id

  return ddlID*fgkOffset + localID;

}
//____________________________________________________________________
Int_t AliMpBusPatch::GetLocalBusID(Int_t globalID, Int_t ddlID)
{
  /// return local bus id from local bus id

  return globalID - ddlID*fgkOffset;

}

//______________________________________________________________________________
AliMpBusPatch::AliMpBusPatch(Int_t id, Int_t detElemId, Int_t ddlId)
  : TObject(),
    fId(id),
    fDEId(detElemId),
    fDdlId(ddlId),
    fManus(false),
    fNofManusPerModule(false),
    fCableLength(-1),
    fCableLabel(),
    fTranslatorLabel(),
    fFrtId(0)
{
/// Standard constructor
}

//______________________________________________________________________________
AliMpBusPatch::AliMpBusPatch(TRootIOCtor* /*ioCtor*/)
  : TObject(),
    fId(),
    fDEId(),
    fDdlId(),
    fManus(false),
    fNofManusPerModule(false),
    fCableLength(-1),
    fCableLabel(),
    fTranslatorLabel(),
    fFrtId(0)
{
/// Root IO constructor
}

//______________________________________________________________________________
AliMpBusPatch::~AliMpBusPatch()
{
/// Destructor
}

//
// public methods
//

//______________________________________________________________________________
Bool_t AliMpBusPatch::AddManu(Int_t manuId)
{
/// Add detection element with given detElemId.
/// Return true if the detection element was added

  if ( HasManu(manuId) ) {
    AliWarningStream() 
      << "Manu with manuId=" << manuId << " already present."
      << endl;
    return false;
  }    

  fManus.Add(manuId);
  return true;
}   

//______________________________________________________________________________
Bool_t AliMpBusPatch::SetNofManusPerModule(Int_t manuNumber)
{
/// Set the number of manus per patch module (PCB):
/// - for stations 1 all manus are connected to one PCB,
/// - for stations 2 there maximum two PCBs per buspatch,
/// - for slat stations there are maximum three PCBs per buspatch

  if ( AliMpDEManager::GetStation12Type(fDEId) == AliMq::kStation1) {

    // simply fill the number of manus, no bridge for station 1
       
    fNofManusPerModule.Add(GetNofManus());
    return true;
  }

 if ( AliMpDEManager::GetStation12Type(fDEId) == AliMq::kStation2) {

    // there is max two patch modules per buspatch
       
    fNofManusPerModule.Add(manuNumber);
    if (manuNumber != GetNofManus())
	fNofManusPerModule.Add(GetNofManus() - manuNumber);

    return true;
  }

  if ( AliMpDEManager::GetStationType(fDEId) == AliMp::kStation345 ) {
  
    const AliMpSlat* kSlat0 
	= AliMpSegmentation::Instance()->GetSlat(fDEId, AliMp::kCath0);

    const AliMpSlat* kSlat1 
	= AliMpSegmentation::Instance()->GetSlat(fDEId, AliMp::kCath1);
       
    Int_t iPcb = 0;
    Int_t iPcbPrev = -1;
    Int_t manuPerPcb = 0;

    Double_t x = 0.;
    Double_t length = 0.;

    // Loop over manu
    for (Int_t iManu = 0; iManu < GetNofManus(); ++iManu) {
      Int_t manuId = GetManuId(iManu);
      AliMpMotifPosition* motifPos0 = kSlat0->FindMotifPosition(manuId);
      AliMpMotifPosition* motifPos1 = kSlat1->FindMotifPosition(manuId);	  
      
      if ( !motifPos0 && !motifPos1 ) {
        // should never happen
        AliErrorStream() 
          << "Motif position for manuId = " << manuId << "not found" << endl;
        return false;
      }

      // find PCB id
      if ( motifPos0 ) {
        x = motifPos0->GetPositionX();
        length = kSlat0->GetPCB(0)->DX()*2.;
      }
      if ( motifPos1 ) {
        x = motifPos1->GetPositionX();
        length = kSlat1->GetPCB(0)->DX()*2.;
      }
      
      iPcb = Int_t(x/length + AliMpConstants::LengthTolerance());

      // check when going to next PCB
      if ( iPcb == iPcbPrev )
        manuPerPcb++;
      else if ( iPcbPrev != -1 ) {
        //vec.Set(vec.GetSize()+1);
        //vec[vec.GetSize()-1] = manuPerPcb+1;
        fNofManusPerModule.Add(manuPerPcb+1);
        manuPerPcb = 0;
      }
      iPcbPrev = iPcb;
    }
   
    // store last PCB
    //vec.Set(vec.GetSize()+1);
    //vec[vec.GetSize()-1] = manuPerPcb+1;
    fNofManusPerModule.Add(manuPerPcb+1);
    return true;  
  } 
  
  return false; 
}     

//______________________________________________________________________________
void  AliMpBusPatch::RevertReadout()
{
/// Revert order of manus

  fManus.Revert();
}

//______________________________________________________________________________
void  AliMpBusPatch::ResetReadout()
{
/// Revert order of manus

  fManus.Reset();
}

//______________________________________________________________________________
Int_t AliMpBusPatch::GetNofManus() const
{  
/// Return the number of detection elements connected to this DDL

  return fManus.GetSize(); 
}

//______________________________________________________________________________
Int_t  AliMpBusPatch::GetManuId(Int_t index) const
{  
/// Return the detection element by index (in loop)

  return fManus.GetValue(index); 
}

//______________________________________________________________________________
Bool_t  AliMpBusPatch::HasManu(Int_t manuId) const
{  
/// Return true if bus patch has manu with given manuId

  return fManus.HasValue(manuId); 
}

//______________________________________________________________________________
Int_t  AliMpBusPatch::GetNofPatchModules() const
{
/// Return the number of patch modules (PCB) connected to this bus patch.

  return fNofManusPerModule.GetSize();
}  
  
//______________________________________________________________________________
TString
AliMpBusPatch::GetFRTPosition() const
{
  /// Return CRXX-Y-Z where XX is the Crocus number, Y the FRT number
  /// and Z the local bus patch number.
  return Form("CR%2d-%d-%d",fDdlId,fFrtId+1,GetLocalBusID(fId,fDdlId));
}

//______________________________________________________________________________
Int_t  AliMpBusPatch::GetNofManusPerModule(Int_t patchModule) const
{
/// Return the number of manus per patch module (PCB)

  if ( patchModule < 0 || patchModule >= GetNofPatchModules() ) {
    AliErrorStream() << "Invalid patch module number = " << patchModule << endl;
    return 0;
  }
  
  return fNofManusPerModule.GetValue(patchModule);
}     

//______________________________________________________________________________
void 
AliMpBusPatch::Print(Option_t* opt) const
{
  /// Printout
  
  cout << Form("BusPatch %04d DDL %d : %s <> %s / %s",
               fId,
               AliDAQ::DdlID("MUONTRK",fDdlId),
               GetFRTPosition().Data(),
               fCableLabel.Data(),
               fTranslatorLabel.Data()) << endl;

  TString sopt(opt);
  sopt.ToUpper();
  
  if ( sopt.Contains("FULL") ) 
  {
    cout << Form("Nof of PCBs (i.e. patch modules) = %d",fNofManusPerModule.GetSize()) << endl;
    
    for ( Int_t i = 0; i < fNofManusPerModule.GetSize(); ++i ) 
    {
      cout << Form("\t\t %d manus in patch module %d",fNofManusPerModule.GetValue(i),i) << endl;
    }
    
    if ( sopt.Contains("MANU") )
    {
      cout << "Manus of that buspatch=" << endl;
      
      for ( Int_t i = 0; i < fManus.GetSize(); ++i ) 
      {
        cout << Form("%4d,",fManus.GetValue(i));
      }
      cout << endl;
    }
  }
  
//  Int_t        fId;     ///< Identifier (unique)
//  Int_t        fDEId;   ///< Detection element to which this bus patch is connected
//  Int_t        fDdlId;  ///< DDL to which this bus patch is connected
//  AliMpArrayI  fManus;  ///< Manu Ids connected to this bus patch
//  AliMpArrayI  fNofManusPerModule; ///< Nof Manus per patch modules (PCBs)
//  Float_t      fCableLength;       ///< length of the buspatch cable
//  TString      fCableLabel;        ///< label of the buspatch cable
//  TString      fTranslatorLabel;   ///< label of the translator board
//  Int_t        fFrtId;               ///< FRT Ids connected to this bus patch
  
}
 AliMpBusPatch.cxx:1
 AliMpBusPatch.cxx:2
 AliMpBusPatch.cxx:3
 AliMpBusPatch.cxx:4
 AliMpBusPatch.cxx:5
 AliMpBusPatch.cxx:6
 AliMpBusPatch.cxx:7
 AliMpBusPatch.cxx:8
 AliMpBusPatch.cxx:9
 AliMpBusPatch.cxx:10
 AliMpBusPatch.cxx:11
 AliMpBusPatch.cxx:12
 AliMpBusPatch.cxx:13
 AliMpBusPatch.cxx:14
 AliMpBusPatch.cxx:15
 AliMpBusPatch.cxx:16
 AliMpBusPatch.cxx:17
 AliMpBusPatch.cxx:18
 AliMpBusPatch.cxx:19
 AliMpBusPatch.cxx:20
 AliMpBusPatch.cxx:21
 AliMpBusPatch.cxx:22
 AliMpBusPatch.cxx:23
 AliMpBusPatch.cxx:24
 AliMpBusPatch.cxx:25
 AliMpBusPatch.cxx:26
 AliMpBusPatch.cxx:27
 AliMpBusPatch.cxx:28
 AliMpBusPatch.cxx:29
 AliMpBusPatch.cxx:30
 AliMpBusPatch.cxx:31
 AliMpBusPatch.cxx:32
 AliMpBusPatch.cxx:33
 AliMpBusPatch.cxx:34
 AliMpBusPatch.cxx:35
 AliMpBusPatch.cxx:36
 AliMpBusPatch.cxx:37
 AliMpBusPatch.cxx:38
 AliMpBusPatch.cxx:39
 AliMpBusPatch.cxx:40
 AliMpBusPatch.cxx:41
 AliMpBusPatch.cxx:42
 AliMpBusPatch.cxx:43
 AliMpBusPatch.cxx:44
 AliMpBusPatch.cxx:45
 AliMpBusPatch.cxx:46
 AliMpBusPatch.cxx:47
 AliMpBusPatch.cxx:48
 AliMpBusPatch.cxx:49
 AliMpBusPatch.cxx:50
 AliMpBusPatch.cxx:51
 AliMpBusPatch.cxx:52
 AliMpBusPatch.cxx:53
 AliMpBusPatch.cxx:54
 AliMpBusPatch.cxx:55
 AliMpBusPatch.cxx:56
 AliMpBusPatch.cxx:57
 AliMpBusPatch.cxx:58
 AliMpBusPatch.cxx:59
 AliMpBusPatch.cxx:60
 AliMpBusPatch.cxx:61
 AliMpBusPatch.cxx:62
 AliMpBusPatch.cxx:63
 AliMpBusPatch.cxx:64
 AliMpBusPatch.cxx:65
 AliMpBusPatch.cxx:66
 AliMpBusPatch.cxx:67
 AliMpBusPatch.cxx:68
 AliMpBusPatch.cxx:69
 AliMpBusPatch.cxx:70
 AliMpBusPatch.cxx:71
 AliMpBusPatch.cxx:72
 AliMpBusPatch.cxx:73
 AliMpBusPatch.cxx:74
 AliMpBusPatch.cxx:75
 AliMpBusPatch.cxx:76
 AliMpBusPatch.cxx:77
 AliMpBusPatch.cxx:78
 AliMpBusPatch.cxx:79
 AliMpBusPatch.cxx:80
 AliMpBusPatch.cxx:81
 AliMpBusPatch.cxx:82
 AliMpBusPatch.cxx:83
 AliMpBusPatch.cxx:84
 AliMpBusPatch.cxx:85
 AliMpBusPatch.cxx:86
 AliMpBusPatch.cxx:87
 AliMpBusPatch.cxx:88
 AliMpBusPatch.cxx:89
 AliMpBusPatch.cxx:90
 AliMpBusPatch.cxx:91
 AliMpBusPatch.cxx:92
 AliMpBusPatch.cxx:93
 AliMpBusPatch.cxx:94
 AliMpBusPatch.cxx:95
 AliMpBusPatch.cxx:96
 AliMpBusPatch.cxx:97
 AliMpBusPatch.cxx:98
 AliMpBusPatch.cxx:99
 AliMpBusPatch.cxx:100
 AliMpBusPatch.cxx:101
 AliMpBusPatch.cxx:102
 AliMpBusPatch.cxx:103
 AliMpBusPatch.cxx:104
 AliMpBusPatch.cxx:105
 AliMpBusPatch.cxx:106
 AliMpBusPatch.cxx:107
 AliMpBusPatch.cxx:108
 AliMpBusPatch.cxx:109
 AliMpBusPatch.cxx:110
 AliMpBusPatch.cxx:111
 AliMpBusPatch.cxx:112
 AliMpBusPatch.cxx:113
 AliMpBusPatch.cxx:114
 AliMpBusPatch.cxx:115
 AliMpBusPatch.cxx:116
 AliMpBusPatch.cxx:117
 AliMpBusPatch.cxx:118
 AliMpBusPatch.cxx:119
 AliMpBusPatch.cxx:120
 AliMpBusPatch.cxx:121
 AliMpBusPatch.cxx:122
 AliMpBusPatch.cxx:123
 AliMpBusPatch.cxx:124
 AliMpBusPatch.cxx:125
 AliMpBusPatch.cxx:126
 AliMpBusPatch.cxx:127
 AliMpBusPatch.cxx:128
 AliMpBusPatch.cxx:129
 AliMpBusPatch.cxx:130
 AliMpBusPatch.cxx:131
 AliMpBusPatch.cxx:132
 AliMpBusPatch.cxx:133
 AliMpBusPatch.cxx:134
 AliMpBusPatch.cxx:135
 AliMpBusPatch.cxx:136
 AliMpBusPatch.cxx:137
 AliMpBusPatch.cxx:138
 AliMpBusPatch.cxx:139
 AliMpBusPatch.cxx:140
 AliMpBusPatch.cxx:141
 AliMpBusPatch.cxx:142
 AliMpBusPatch.cxx:143
 AliMpBusPatch.cxx:144
 AliMpBusPatch.cxx:145
 AliMpBusPatch.cxx:146
 AliMpBusPatch.cxx:147
 AliMpBusPatch.cxx:148
 AliMpBusPatch.cxx:149
 AliMpBusPatch.cxx:150
 AliMpBusPatch.cxx:151
 AliMpBusPatch.cxx:152
 AliMpBusPatch.cxx:153
 AliMpBusPatch.cxx:154
 AliMpBusPatch.cxx:155
 AliMpBusPatch.cxx:156
 AliMpBusPatch.cxx:157
 AliMpBusPatch.cxx:158
 AliMpBusPatch.cxx:159
 AliMpBusPatch.cxx:160
 AliMpBusPatch.cxx:161
 AliMpBusPatch.cxx:162
 AliMpBusPatch.cxx:163
 AliMpBusPatch.cxx:164
 AliMpBusPatch.cxx:165
 AliMpBusPatch.cxx:166
 AliMpBusPatch.cxx:167
 AliMpBusPatch.cxx:168
 AliMpBusPatch.cxx:169
 AliMpBusPatch.cxx:170
 AliMpBusPatch.cxx:171
 AliMpBusPatch.cxx:172
 AliMpBusPatch.cxx:173
 AliMpBusPatch.cxx:174
 AliMpBusPatch.cxx:175
 AliMpBusPatch.cxx:176
 AliMpBusPatch.cxx:177
 AliMpBusPatch.cxx:178
 AliMpBusPatch.cxx:179
 AliMpBusPatch.cxx:180
 AliMpBusPatch.cxx:181
 AliMpBusPatch.cxx:182
 AliMpBusPatch.cxx:183
 AliMpBusPatch.cxx:184
 AliMpBusPatch.cxx:185
 AliMpBusPatch.cxx:186
 AliMpBusPatch.cxx:187
 AliMpBusPatch.cxx:188
 AliMpBusPatch.cxx:189
 AliMpBusPatch.cxx:190
 AliMpBusPatch.cxx:191
 AliMpBusPatch.cxx:192
 AliMpBusPatch.cxx:193
 AliMpBusPatch.cxx:194
 AliMpBusPatch.cxx:195
 AliMpBusPatch.cxx:196
 AliMpBusPatch.cxx:197
 AliMpBusPatch.cxx:198
 AliMpBusPatch.cxx:199
 AliMpBusPatch.cxx:200
 AliMpBusPatch.cxx:201
 AliMpBusPatch.cxx:202
 AliMpBusPatch.cxx:203
 AliMpBusPatch.cxx:204
 AliMpBusPatch.cxx:205
 AliMpBusPatch.cxx:206
 AliMpBusPatch.cxx:207
 AliMpBusPatch.cxx:208
 AliMpBusPatch.cxx:209
 AliMpBusPatch.cxx:210
 AliMpBusPatch.cxx:211
 AliMpBusPatch.cxx:212
 AliMpBusPatch.cxx:213
 AliMpBusPatch.cxx:214
 AliMpBusPatch.cxx:215
 AliMpBusPatch.cxx:216
 AliMpBusPatch.cxx:217
 AliMpBusPatch.cxx:218
 AliMpBusPatch.cxx:219
 AliMpBusPatch.cxx:220
 AliMpBusPatch.cxx:221
 AliMpBusPatch.cxx:222
 AliMpBusPatch.cxx:223
 AliMpBusPatch.cxx:224
 AliMpBusPatch.cxx:225
 AliMpBusPatch.cxx:226
 AliMpBusPatch.cxx:227
 AliMpBusPatch.cxx:228
 AliMpBusPatch.cxx:229
 AliMpBusPatch.cxx:230
 AliMpBusPatch.cxx:231
 AliMpBusPatch.cxx:232
 AliMpBusPatch.cxx:233
 AliMpBusPatch.cxx:234
 AliMpBusPatch.cxx:235
 AliMpBusPatch.cxx:236
 AliMpBusPatch.cxx:237
 AliMpBusPatch.cxx:238
 AliMpBusPatch.cxx:239
 AliMpBusPatch.cxx:240
 AliMpBusPatch.cxx:241
 AliMpBusPatch.cxx:242
 AliMpBusPatch.cxx:243
 AliMpBusPatch.cxx:244
 AliMpBusPatch.cxx:245
 AliMpBusPatch.cxx:246
 AliMpBusPatch.cxx:247
 AliMpBusPatch.cxx:248
 AliMpBusPatch.cxx:249
 AliMpBusPatch.cxx:250
 AliMpBusPatch.cxx:251
 AliMpBusPatch.cxx:252
 AliMpBusPatch.cxx:253
 AliMpBusPatch.cxx:254
 AliMpBusPatch.cxx:255
 AliMpBusPatch.cxx:256
 AliMpBusPatch.cxx:257
 AliMpBusPatch.cxx:258
 AliMpBusPatch.cxx:259
 AliMpBusPatch.cxx:260
 AliMpBusPatch.cxx:261
 AliMpBusPatch.cxx:262
 AliMpBusPatch.cxx:263
 AliMpBusPatch.cxx:264
 AliMpBusPatch.cxx:265
 AliMpBusPatch.cxx:266
 AliMpBusPatch.cxx:267
 AliMpBusPatch.cxx:268
 AliMpBusPatch.cxx:269
 AliMpBusPatch.cxx:270
 AliMpBusPatch.cxx:271
 AliMpBusPatch.cxx:272
 AliMpBusPatch.cxx:273
 AliMpBusPatch.cxx:274
 AliMpBusPatch.cxx:275
 AliMpBusPatch.cxx:276
 AliMpBusPatch.cxx:277
 AliMpBusPatch.cxx:278
 AliMpBusPatch.cxx:279
 AliMpBusPatch.cxx:280
 AliMpBusPatch.cxx:281
 AliMpBusPatch.cxx:282
 AliMpBusPatch.cxx:283
 AliMpBusPatch.cxx:284
 AliMpBusPatch.cxx:285
 AliMpBusPatch.cxx:286
 AliMpBusPatch.cxx:287
 AliMpBusPatch.cxx:288
 AliMpBusPatch.cxx:289
 AliMpBusPatch.cxx:290
 AliMpBusPatch.cxx:291
 AliMpBusPatch.cxx:292
 AliMpBusPatch.cxx:293
 AliMpBusPatch.cxx:294
 AliMpBusPatch.cxx:295
 AliMpBusPatch.cxx:296
 AliMpBusPatch.cxx:297
 AliMpBusPatch.cxx:298
 AliMpBusPatch.cxx:299
 AliMpBusPatch.cxx:300
 AliMpBusPatch.cxx:301
 AliMpBusPatch.cxx:302
 AliMpBusPatch.cxx:303
 AliMpBusPatch.cxx:304
 AliMpBusPatch.cxx:305
 AliMpBusPatch.cxx:306
 AliMpBusPatch.cxx:307
 AliMpBusPatch.cxx:308
 AliMpBusPatch.cxx:309
 AliMpBusPatch.cxx:310
 AliMpBusPatch.cxx:311
 AliMpBusPatch.cxx:312
 AliMpBusPatch.cxx:313
 AliMpBusPatch.cxx:314
 AliMpBusPatch.cxx:315
 AliMpBusPatch.cxx:316
 AliMpBusPatch.cxx:317
 AliMpBusPatch.cxx:318
 AliMpBusPatch.cxx:319
 AliMpBusPatch.cxx:320
 AliMpBusPatch.cxx:321
 AliMpBusPatch.cxx:322
 AliMpBusPatch.cxx:323
 AliMpBusPatch.cxx:324
 AliMpBusPatch.cxx:325
 AliMpBusPatch.cxx:326
 AliMpBusPatch.cxx:327
 AliMpBusPatch.cxx:328
 AliMpBusPatch.cxx:329
 AliMpBusPatch.cxx:330
 AliMpBusPatch.cxx:331
 AliMpBusPatch.cxx:332
 AliMpBusPatch.cxx:333