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.                  *
 **************************************************************************/

///////////////////////////////////////////////////////////////////////////////
//
// This class which defines the trigger bunch-crossing mask
//
//
///////////////////////////////////////////////////////////////////////////////
#include <Riostream.h>
#include <TObjArray.h>
#include <TObjString.h>

#include "AliTriggerBCMask.h"
#include "AliLog.h"

using std::endl;
using std::cout;
ClassImp(AliTriggerBCMask)

//_____________________________________________________________________________
AliTriggerBCMask::AliTriggerBCMask():
  TNamed()
{
  // Default constructor
  for (Int_t i = 0; i < kNBytesPerBCMask; i++) fBCMask[i] = 0;
}

//_____________________________________________________________________________
AliTriggerBCMask::AliTriggerBCMask( TString & name ):
  TNamed( name, name )
{
  // Constructor
  for (Int_t i = 0; i < kNBytesPerBCMask; i++) fBCMask[i] = 255;
}

//_____________________________________________________________________________
AliTriggerBCMask::AliTriggerBCMask( TString & name, TString & mask ):
  TNamed( name, mask )
{
  // Constructor
  CreateMask(mask);
}

//_____________________________________________________________________________
AliTriggerBCMask::AliTriggerBCMask( const char* name, const char* mask ):
  TNamed( name, mask )
{
  // Constructor
  SetMask(mask);
}

//_____________________________________________________________________________
AliTriggerBCMask::~AliTriggerBCMask() 
{ 
  // Destructor
}
//_____________________________________________________________________________
AliTriggerBCMask::AliTriggerBCMask( const AliTriggerBCMask& mask ):
  TNamed( mask )
{
   // Copy constructor
  for (Int_t i = 0; i < kNBytesPerBCMask; i++) fBCMask[i] = mask.fBCMask[i];
}

//______________________________________________________________________________
AliTriggerBCMask& AliTriggerBCMask::operator=(const AliTriggerBCMask& mask)
{
   // AliTriggerBCMask assignment operator.

   if (this != &mask) {
      TNamed::operator=(mask);
      for (Int_t i = 0; i < kNBytesPerBCMask; i++) fBCMask[i] = mask.fBCMask[i];
   }
   return *this;
}

//_____________________________________________________________________________
Bool_t AliTriggerBCMask::GetMask( UShort_t index) const
{
  // Return true or false whenever the mask is active
  // for the bunch-crossing # = index
  UShort_t position = index/8;
  if (position >= kNBytesPerBCMask) return kFALSE;
  UChar_t offset = index%8;
  return (fBCMask[position] & (0x1 << offset));
}

//_____________________________________________________________________________
void AliTriggerBCMask::Print( const Option_t* opt) const
{
   // Print
  cout << "Trigger bunch-crossing mask:" << endl;
  cout << "  Name:                      " << GetName() << endl;
  cout << "  Mask:                      " << GetTitle() << endl;

  if (strcmp(opt,"bits") == 0) {
    cout << "  Bits:                      " << endl;
    for (UShort_t i = 0; i < kNBits; i++) {
      if (GetMask(i)) {
	cout << "1";
      }
      else {
	cout << "0";
      }
    }
    cout << endl;
  }
}

Bool_t AliTriggerBCMask::SetMask (const char *mask)
{
  // Wrapper used in pileup generators
  // Call directly CreateMask method.
  SetTitle(mask);
  return CreateMask(fTitle);
}

//_____________________________________________________________________________
Bool_t AliTriggerBCMask::CreateMask(TString &mask)
{
  // (re)creates the bc mask bit pattern
  // according to the bc string.
  // The string has the following syntax:
  //   "25L 25(2H2LH 3(23HL))"
  //        - H/h -> 1  L/l -> 0
  //        - spaces, new lines are white characters
  // The method returns kTRUE in case of successful
  // parsing and kFALSE otherwise.

  for (Int_t i = 0; i < kNBytesPerBCMask; i++) fBCMask[i] = 255;

  mask.ReplaceAll("("," ( ");
  mask.ReplaceAll(")"," ) ");
  mask.ReplaceAll("H"," H ");
  mask.ReplaceAll("h"," H ");
  mask.ReplaceAll("L"," L ");
  mask.ReplaceAll("l"," L ");
  TObjArray *tokens = mask.Tokenize(" \t");
  if (tokens->GetEntriesFast() == 0) {
    delete tokens;
    return kTRUE;
  }

  TBits bits(kNBits);
  Int_t index = 0, ibit = 0, level = 0;
  if ((!Bcm2Bits(tokens,index,bits,ibit,level)) ||
      (index != tokens->GetEntriesFast())) {
    AliError("Invalid bunch-crossing mask syntax. Empty mask produced.");
    delete tokens;
    return kFALSE;
  }

  delete tokens;

  if (ibit != kNBits) {
    AliError(Form("Incomplete bunch-crossing mask. Only the first %d bits are filled.",ibit));
    return kFALSE;
  }

  bits.Get(fBCMask);

  return kTRUE;
}

Bool_t AliTriggerBCMask::Bcm2Bits(TObjArray *tokens, Int_t &index, TBits &bits, Int_t &ibit, Int_t &level) const
{

  level++;
  Int_t repetion = 1;

  while(1) {
    if (index == tokens->GetEntriesFast()) {
      if (level > 1) {
	AliError("Missing )");
	return kFALSE;
      }
      break;
    }
    TString st = ((TObjString*)tokens->At(index))->String();
    if (st.CompareTo("H") == 0) {
      for (Int_t i = 0; i < repetion; i++) bits.SetBitNumber(ibit++,kTRUE);
      repetion = 1;
      index++;
    }
    else if (st.CompareTo("L") == 0) {
      for (Int_t i = 0; i < repetion; i++) bits.SetBitNumber(ibit++,kFALSE);
      repetion = 1;
      index++;
    }
    else if (st.IsDigit()) {
      repetion = st.Atoi();
      index++;
    }
    else if (st.CompareTo("(") == 0) {
      index++;
      Int_t ibit1 = ibit;
      if (!Bcm2Bits(tokens,index,bits,ibit,level)) {
	return kFALSE;
      }
      Int_t ibit2 = ibit;
      for (Int_t i = 0; i < (repetion-1); i++) {
	for (Int_t j = ibit1; j < ibit2; j++) {
	  bits.SetBitNumber(ibit++,bits.TestBitNumber(j));
	}
      }
      repetion = 1;
    }
    else if (st.CompareTo(")") == 0) {
      index++;
      if (level <= 1) {
	AliError("Incorrectly placed )");
	return kFALSE;
      }
      break;
    }
    else {
      AliError(Form("Incorrect BC mask field: %s",st.Data()));
      return kFALSE;
    }
  }
  level--;
  return kTRUE;

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