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 "AliMUONBusStruct.h"

#include "AliLog.h"
#include <Riostream.h>
#include <string.h>

//-----------------------------------------------------------------------------
/// \class AliMUONBusStruct
/// Bus patch structure for tracker raw data
/// each Dsp contains at most 5 bus patch structure
/// Beside the total length and length of the below data
/// the header of the block contains the bus patch id, trigger words 
/// and data structure itself (11bits for manu id, 6 bits for channel id and
/// 12 bits for charge)
///
/// \author Christian Finck
//-----------------------------------------------------------------------------

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

const Int_t  AliMUONBusStruct::fgkHeaderLength = 4;
const UInt_t AliMUONBusStruct::fgkDefaultDataKey = 0xB000000B;
const Int_t  AliMUONBusStruct::fgkManuNofChannels(64);

//___________________________________________
AliMUONBusStruct::AliMUONBusStruct()
  :  TObject(),
     fDataKey(0),
     fTotalLength(0),
     fLength(0),
     fBusPatchId(0),
fBufSize(43*fgkManuNofChannels), 
  /* assuming 43 manus max per bustpatch.
  Anyway fData is resized where needed (though it makes it slower) */
     fData(new UInt_t[fBufSize]),
     fDspId(0),
     fBlkId(0)
{
  ///
  /// ctor
  /// 

}
//___________________________________________
AliMUONBusStruct::~AliMUONBusStruct()
{
  ///
  /// dtor
  ///
  delete[] fData;
}

//___________________________________________
void AliMUONBusStruct::SetAlloc(Int_t size)
{
  ///
  /// Allocate size 
  /// return if size < fBufSize 
  ///
  if (size < fBufSize) 
    return;
  else 
    ResizeData(size);
}
//___________________________________________
void AliMUONBusStruct::AddData(UInt_t data)
{
  /// could have used class from ROOT
  /// but the structure must be as simple as possible
  /// to be written on disc blockwise, not so sure ?
  if (fLength == fBufSize) 
    ResizeData();
  fData[fLength++] = data;
  fTotalLength = fLength + fgkHeaderLength;
}

//___________________________________________
void AliMUONBusStruct::ResizeData(Int_t size)
{
  /// In case of resizing the vector
  /// the most simplest way to do it
  ///
  if (size == 0)
    fBufSize *= 2;
  else
    fBufSize = size;
  UInt_t* newData = new UInt_t[fBufSize];
  for (Int_t i = 0; i < fLength; i++)
    newData[i] = fData[i];
  delete[] fData;
  fData = newData;
}
//___________________________________________
AliMUONBusStruct::
AliMUONBusStruct(const AliMUONBusStruct& event)
  : TObject(event),
    fDataKey(event.fDataKey),
    fTotalLength(event.fTotalLength),
    fLength(event.fLength),
    fBusPatchId(event.fBusPatchId),
    fBufSize(event.fBufSize),
    fData(new UInt_t[event.fBufSize]),
    fDspId(event.fDspId),
    fBlkId(event.fBlkId)
{
  ///
  /// copy ctor
  ///

  for (int i = 0; i < event.fBufSize; i++)
    fData[i] = event.fData[i];
}
//___________________________________________
AliMUONBusStruct&
AliMUONBusStruct::operator=(const AliMUONBusStruct& event)
{
  ///
  /// assignment operator
  ///
  if (this == &event) return *this;
  fDataKey     = event.fDataKey;
  fTotalLength = event.fTotalLength;
  fLength      = event.fLength;
  fBusPatchId  = event.fBusPatchId;
  fBufSize     = event.fBufSize;

  fBlkId = event.fBlkId;
  fDspId = event.fDspId;

  delete [] fData;  
  fData =  new UInt_t[event.fBufSize];
  for (int i = 0; i < event.fLength; i++)
    fData[i] = event.fData[i];

  return *this;
}
//___________________________________________
Int_t AliMUONBusStruct::Compare(const TObject *obj) const
{
  /// 
  /// sort bus patch by bus patch number
  /// important for AliMUONRawWriter
  ///
  AliMUONBusStruct* event = (AliMUONBusStruct*) obj;
  return (fBusPatchId > event->GetBusPatchId()) ? 1 : -1;
}

//___________________________________________
void AliMUONBusStruct::Clear(Option_t *)
{
  /// clear
  /// delete the allocated memory 
  ///
  delete[] fData;
}
//___________________________________________
UInt_t AliMUONBusStruct::GetData(Int_t n) const 
{
  ///
  /// get data
  ///
  if ( n>=0 && n<fLength ) return fData[n];

  AliError("Index outside limits."); 
  return 0; 
}

//___________________________________________
Char_t AliMUONBusStruct::GetParity(Int_t n) const   
{
  ///
  /// get parity
  ///
  if ( n>=0 && n<fLength ) return (Char_t)(fData[n] >> 31) &  0x1;

  AliError("Index outside limits."); 
  return 0; 
}

//___________________________________________
UShort_t AliMUONBusStruct::GetManuId(Int_t n) const     
{
  ///
  /// get manu Id
  ///
  if ( n>=0 && n<fLength ) return (UShort_t)(fData[n] >> 18) &  0x7FF;

  AliError("Index outside limits."); 
  return 0; 
}

//___________________________________________
UChar_t AliMUONBusStruct::GetChannelId(Int_t n) const  
{
  /// 
  /// get channel Id
  ///
  if ( n>=0 && n<fLength ) return (Char_t)(fData[n] >> 12) & 0x3F;

  AliError("Index outside limits."); 
  return 0; 
}

//___________________________________________
UShort_t AliMUONBusStruct::GetCharge(Int_t n) const     
{
  ///
  /// get charge (in ADC)
  ///
  if ( n>=0 && n<fLength ) return (UShort_t)(fData[n] & 0xFFF);

  AliError("Index outside limits."); 
  return 0; 
}

//___________________________________________
void AliMUONBusStruct::Print(Option_t* opt) const
{
  /// print out

  cout << "Bus patch info" << endl;
  cout << "DataKey: "      << fDataKey << endl;
  cout << "fTotalLength: " << fTotalLength << endl;
  cout << "fLength: "      << fLength << endl;
  cout << "fBusPatchId: "  << fBusPatchId << endl;
  cout << "fBufSize: "     << fBufSize << endl;

  if (strstr(opt, "all")) {
  for (Int_t i = 0; i <fLength; ++i)
      cout << "Data["<< i << "] = " << fData[i] << endl;
  }
}


 AliMUONBusStruct.cxx:1
 AliMUONBusStruct.cxx:2
 AliMUONBusStruct.cxx:3
 AliMUONBusStruct.cxx:4
 AliMUONBusStruct.cxx:5
 AliMUONBusStruct.cxx:6
 AliMUONBusStruct.cxx:7
 AliMUONBusStruct.cxx:8
 AliMUONBusStruct.cxx:9
 AliMUONBusStruct.cxx:10
 AliMUONBusStruct.cxx:11
 AliMUONBusStruct.cxx:12
 AliMUONBusStruct.cxx:13
 AliMUONBusStruct.cxx:14
 AliMUONBusStruct.cxx:15
 AliMUONBusStruct.cxx:16
 AliMUONBusStruct.cxx:17
 AliMUONBusStruct.cxx:18
 AliMUONBusStruct.cxx:19
 AliMUONBusStruct.cxx:20
 AliMUONBusStruct.cxx:21
 AliMUONBusStruct.cxx:22
 AliMUONBusStruct.cxx:23
 AliMUONBusStruct.cxx:24
 AliMUONBusStruct.cxx:25
 AliMUONBusStruct.cxx:26
 AliMUONBusStruct.cxx:27
 AliMUONBusStruct.cxx:28
 AliMUONBusStruct.cxx:29
 AliMUONBusStruct.cxx:30
 AliMUONBusStruct.cxx:31
 AliMUONBusStruct.cxx:32
 AliMUONBusStruct.cxx:33
 AliMUONBusStruct.cxx:34
 AliMUONBusStruct.cxx:35
 AliMUONBusStruct.cxx:36
 AliMUONBusStruct.cxx:37
 AliMUONBusStruct.cxx:38
 AliMUONBusStruct.cxx:39
 AliMUONBusStruct.cxx:40
 AliMUONBusStruct.cxx:41
 AliMUONBusStruct.cxx:42
 AliMUONBusStruct.cxx:43
 AliMUONBusStruct.cxx:44
 AliMUONBusStruct.cxx:45
 AliMUONBusStruct.cxx:46
 AliMUONBusStruct.cxx:47
 AliMUONBusStruct.cxx:48
 AliMUONBusStruct.cxx:49
 AliMUONBusStruct.cxx:50
 AliMUONBusStruct.cxx:51
 AliMUONBusStruct.cxx:52
 AliMUONBusStruct.cxx:53
 AliMUONBusStruct.cxx:54
 AliMUONBusStruct.cxx:55
 AliMUONBusStruct.cxx:56
 AliMUONBusStruct.cxx:57
 AliMUONBusStruct.cxx:58
 AliMUONBusStruct.cxx:59
 AliMUONBusStruct.cxx:60
 AliMUONBusStruct.cxx:61
 AliMUONBusStruct.cxx:62
 AliMUONBusStruct.cxx:63
 AliMUONBusStruct.cxx:64
 AliMUONBusStruct.cxx:65
 AliMUONBusStruct.cxx:66
 AliMUONBusStruct.cxx:67
 AliMUONBusStruct.cxx:68
 AliMUONBusStruct.cxx:69
 AliMUONBusStruct.cxx:70
 AliMUONBusStruct.cxx:71
 AliMUONBusStruct.cxx:72
 AliMUONBusStruct.cxx:73
 AliMUONBusStruct.cxx:74
 AliMUONBusStruct.cxx:75
 AliMUONBusStruct.cxx:76
 AliMUONBusStruct.cxx:77
 AliMUONBusStruct.cxx:78
 AliMUONBusStruct.cxx:79
 AliMUONBusStruct.cxx:80
 AliMUONBusStruct.cxx:81
 AliMUONBusStruct.cxx:82
 AliMUONBusStruct.cxx:83
 AliMUONBusStruct.cxx:84
 AliMUONBusStruct.cxx:85
 AliMUONBusStruct.cxx:86
 AliMUONBusStruct.cxx:87
 AliMUONBusStruct.cxx:88
 AliMUONBusStruct.cxx:89
 AliMUONBusStruct.cxx:90
 AliMUONBusStruct.cxx:91
 AliMUONBusStruct.cxx:92
 AliMUONBusStruct.cxx:93
 AliMUONBusStruct.cxx:94
 AliMUONBusStruct.cxx:95
 AliMUONBusStruct.cxx:96
 AliMUONBusStruct.cxx:97
 AliMUONBusStruct.cxx:98
 AliMUONBusStruct.cxx:99
 AliMUONBusStruct.cxx:100
 AliMUONBusStruct.cxx:101
 AliMUONBusStruct.cxx:102
 AliMUONBusStruct.cxx:103
 AliMUONBusStruct.cxx:104
 AliMUONBusStruct.cxx:105
 AliMUONBusStruct.cxx:106
 AliMUONBusStruct.cxx:107
 AliMUONBusStruct.cxx:108
 AliMUONBusStruct.cxx:109
 AliMUONBusStruct.cxx:110
 AliMUONBusStruct.cxx:111
 AliMUONBusStruct.cxx:112
 AliMUONBusStruct.cxx:113
 AliMUONBusStruct.cxx:114
 AliMUONBusStruct.cxx:115
 AliMUONBusStruct.cxx:116
 AliMUONBusStruct.cxx:117
 AliMUONBusStruct.cxx:118
 AliMUONBusStruct.cxx:119
 AliMUONBusStruct.cxx:120
 AliMUONBusStruct.cxx:121
 AliMUONBusStruct.cxx:122
 AliMUONBusStruct.cxx:123
 AliMUONBusStruct.cxx:124
 AliMUONBusStruct.cxx:125
 AliMUONBusStruct.cxx:126
 AliMUONBusStruct.cxx:127
 AliMUONBusStruct.cxx:128
 AliMUONBusStruct.cxx:129
 AliMUONBusStruct.cxx:130
 AliMUONBusStruct.cxx:131
 AliMUONBusStruct.cxx:132
 AliMUONBusStruct.cxx:133
 AliMUONBusStruct.cxx:134
 AliMUONBusStruct.cxx:135
 AliMUONBusStruct.cxx:136
 AliMUONBusStruct.cxx:137
 AliMUONBusStruct.cxx:138
 AliMUONBusStruct.cxx:139
 AliMUONBusStruct.cxx:140
 AliMUONBusStruct.cxx:141
 AliMUONBusStruct.cxx:142
 AliMUONBusStruct.cxx:143
 AliMUONBusStruct.cxx:144
 AliMUONBusStruct.cxx:145
 AliMUONBusStruct.cxx:146
 AliMUONBusStruct.cxx:147
 AliMUONBusStruct.cxx:148
 AliMUONBusStruct.cxx:149
 AliMUONBusStruct.cxx:150
 AliMUONBusStruct.cxx:151
 AliMUONBusStruct.cxx:152
 AliMUONBusStruct.cxx:153
 AliMUONBusStruct.cxx:154
 AliMUONBusStruct.cxx:155
 AliMUONBusStruct.cxx:156
 AliMUONBusStruct.cxx:157
 AliMUONBusStruct.cxx:158
 AliMUONBusStruct.cxx:159
 AliMUONBusStruct.cxx:160
 AliMUONBusStruct.cxx:161
 AliMUONBusStruct.cxx:162
 AliMUONBusStruct.cxx:163
 AliMUONBusStruct.cxx:164
 AliMUONBusStruct.cxx:165
 AliMUONBusStruct.cxx:166
 AliMUONBusStruct.cxx:167
 AliMUONBusStruct.cxx:168
 AliMUONBusStruct.cxx:169
 AliMUONBusStruct.cxx:170
 AliMUONBusStruct.cxx:171
 AliMUONBusStruct.cxx:172
 AliMUONBusStruct.cxx:173
 AliMUONBusStruct.cxx:174
 AliMUONBusStruct.cxx:175
 AliMUONBusStruct.cxx:176
 AliMUONBusStruct.cxx:177
 AliMUONBusStruct.cxx:178
 AliMUONBusStruct.cxx:179
 AliMUONBusStruct.cxx:180
 AliMUONBusStruct.cxx:181
 AliMUONBusStruct.cxx:182
 AliMUONBusStruct.cxx:183
 AliMUONBusStruct.cxx:184
 AliMUONBusStruct.cxx:185
 AliMUONBusStruct.cxx:186
 AliMUONBusStruct.cxx:187
 AliMUONBusStruct.cxx:188
 AliMUONBusStruct.cxx:189
 AliMUONBusStruct.cxx:190
 AliMUONBusStruct.cxx:191
 AliMUONBusStruct.cxx:192
 AliMUONBusStruct.cxx:193
 AliMUONBusStruct.cxx:194
 AliMUONBusStruct.cxx:195
 AliMUONBusStruct.cxx:196
 AliMUONBusStruct.cxx:197
 AliMUONBusStruct.cxx:198
 AliMUONBusStruct.cxx:199
 AliMUONBusStruct.cxx:200
 AliMUONBusStruct.cxx:201
 AliMUONBusStruct.cxx:202
 AliMUONBusStruct.cxx:203
 AliMUONBusStruct.cxx:204
 AliMUONBusStruct.cxx:205
 AliMUONBusStruct.cxx:206
 AliMUONBusStruct.cxx:207
 AliMUONBusStruct.cxx:208
 AliMUONBusStruct.cxx:209
 AliMUONBusStruct.cxx:210
 AliMUONBusStruct.cxx:211
 AliMUONBusStruct.cxx:212
 AliMUONBusStruct.cxx:213
 AliMUONBusStruct.cxx:214
 AliMUONBusStruct.cxx:215
 AliMUONBusStruct.cxx:216
 AliMUONBusStruct.cxx:217
 AliMUONBusStruct.cxx:218
 AliMUONBusStruct.cxx:219
 AliMUONBusStruct.cxx:220
 AliMUONBusStruct.cxx:221
 AliMUONBusStruct.cxx:222
 AliMUONBusStruct.cxx:223
 AliMUONBusStruct.cxx:224
 AliMUONBusStruct.cxx:225
 AliMUONBusStruct.cxx:226
 AliMUONBusStruct.cxx:227
 AliMUONBusStruct.cxx:228
 AliMUONBusStruct.cxx:229
 AliMUONBusStruct.cxx:230
 AliMUONBusStruct.cxx:231
 AliMUONBusStruct.cxx:232
 AliMUONBusStruct.cxx:233
 AliMUONBusStruct.cxx:234
 AliMUONBusStruct.cxx:235
 AliMUONBusStruct.cxx:236
 AliMUONBusStruct.cxx:237
 AliMUONBusStruct.cxx:238
 AliMUONBusStruct.cxx:239
 AliMUONBusStruct.cxx:240
 AliMUONBusStruct.cxx:241
 AliMUONBusStruct.cxx:242
 AliMUONBusStruct.cxx:243
 AliMUONBusStruct.cxx:244
 AliMUONBusStruct.cxx:245
 AliMUONBusStruct.cxx:246
 AliMUONBusStruct.cxx:247
 AliMUONBusStruct.cxx:248
 AliMUONBusStruct.cxx:249
 AliMUONBusStruct.cxx:250
 AliMUONBusStruct.cxx:251
 AliMUONBusStruct.cxx:252
 AliMUONBusStruct.cxx:253
 AliMUONBusStruct.cxx:254
 AliMUONBusStruct.cxx:255