ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2003, 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$ */

// Storing digits in a binary file
// according to the DDL mapping
// To be used in Alice Data Challenges
// This class is used by AliVZERODDL.C macro
// Author: B. Cheynis

#include <Riostream.h>
#include <TObjArray.h>
#include <TMath.h>

#include "AliLog.h"
#include "AliRawDataHeaderSim.h"
#include "AliVZEROBuffer.h"
#include "AliVZEROdigit.h"

ClassImp(AliVZEROBuffer)

//_____________________________________________________________________________
AliVZEROBuffer::AliVZEROBuffer():TObject(),
    fRemainingWord(0),
    f()
{
  //
  // default constructor
  //
}
//_____________________________________________________________________________
AliVZEROBuffer::AliVZEROBuffer(const char* fileName):TObject(),
    fRemainingWord(0),
    f()
{
  // Constructor
  f = new AliFstream(fileName);
  // fout=new TFile(fileName,"recreate");
  // tree=new TTree("tree","Values");
  AliRawDataHeaderSim header;
  f->WriteBuffer((char*)(&header), sizeof(header));

}

//_____________________________________________________________________________
AliVZEROBuffer::~AliVZEROBuffer(){
  // Destructor, it closes the IO stream
  AliRawDataHeaderSim header;
  header.fSize = f->Tellp();
  header.SetAttribute(0);  // valid data
  f->Seekp(0);
  f->WriteBuffer((char*)(&header), sizeof(header));
  delete f;
  //delete tree;
  //delete fout;
}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteTriggerInfo(UInt_t trigger) {
  // The method writes VZERO trigger information
  // This info is contained in the first two
  // raw-data words following the raw-data header (CDH).

  f->WriteBuffer((char*)(&trigger),sizeof(trigger));

  // By default all the inputs are unmasked... Hopefully
  UInt_t triggerMask = 0xffff;
  f->WriteBuffer((char*)(&triggerMask),sizeof(triggerMask));
}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteTriggerScalers() {
  // The method writes the VZERO trigger scalers
  // For the moment there is no way to simulate
  // this, so we fill the necessary 16 words with 0

  // First the general trigger scalers (16 of them)
  for(Int_t i = 0; i < 16; i++) {
      UInt_t data = 0;
      f->WriteBuffer((char*)&data,sizeof(data));
  }
}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteBunchNumbers() {
  // The method writes the Bunch Numbers corresponding 
  // to the 10 Minimum Bias events
  // For the moment there is no way to simulate
  // this, so we fill the necessary 10 words with 0

  // First the bunch crossing numbers
  // for these 10 events
  
  for(Int_t i = 0; i < 10; i++) {
      UInt_t data = 0;
      f->WriteBuffer((char*)&data,sizeof(data));
  }

}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteChannel(Int_t channel, Short_t *adc, Bool_t integrator){
  // It writes VZERO charge information into a raw data file. 
  // Being called by Digits2Raw
  
  UInt_t data = 0;
  for(Int_t i = 0; i < AliVZEROdigit::kNClocks; ++i) {
    if (adc[i] > 1023) {
      AliWarning(Form("ADC (channel=%d) saturated: %d. Truncating to 1023",channel,adc[i]));
      adc[i] = 1023;
    }
  }
  
  if(channel%2 == 0) {
    for(Int_t i = 0; i < (AliVZEROdigit::kNClocks/2); ++i) {
      data =   (adc[2*i] & 0x3ff);
      data |= ((integrator & 0x1) << 10);

      data |= ((adc[2*i+1] & 0x3ff) << 16);
      data |= ((!integrator & 0x1) << 26);

      f->WriteBuffer((char*)&data,sizeof(data));
    }
    fRemainingWord = (adc[AliVZEROdigit::kNClocks-1] & 0x3ff);
    fRemainingWord |= ((integrator & 0x1) << 10);
  }
  else {
    data = fRemainingWord;
    data |= ((adc[0] & 0x3ff) << 16);
    data |= ((integrator & 0x1) << 26);
    f->WriteBuffer((char*)&data,sizeof(data));

    for(Int_t i = 1; i <= (AliVZEROdigit::kNClocks/2); ++i) {
      data =   (adc[2*i-1] & 0x3ff);
      data |= ((!integrator & 0x1) << 10);

      data |= ((adc[2*i] & 0x3ff) << 16);
      data |= ((integrator & 0x1) << 26);

      f->WriteBuffer((char*)&data,sizeof(data));
    }
  }
    
}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteBeamFlags(Bool_t *bbFlag, Bool_t *bgFlag) {
  // The method writes information about
  // the Beam-Beam and Beam-Gas flags i.e. 
  // 6  words for the 4 channels 
  // of half a CIU card

  // Beam-beam and beam-gas flags are available
  // only for the triggered event-of-interest (sample index = 10)
  // As soon as trigger simulation would become more complex
  // and would allow to simulate neighbouring samples, this code
  // should be extended in order to fill all (or fraction) of the
  // flags
  for(Int_t i = 0; i < 2; i++) {
    UInt_t data = 0;
    f->WriteBuffer((char*)&data,sizeof(data));
  }
  {
    UInt_t data = 0;
    for(Int_t iChannel = 0; iChannel < 4; ++iChannel) {
      if (bbFlag[iChannel]) data |= (1 << (2*iChannel + 16));
      if (bgFlag[iChannel]) data |= (1 << (2*iChannel + 17));
    }
    f->WriteBuffer((char*)&data,sizeof(data));
  }  
  for(Int_t i = 0; i < 3; i++) {
    UInt_t data = 0;
    f->WriteBuffer((char*)&data,sizeof(data));
  }

}


//_____________________________________________________________________________
void AliVZEROBuffer::WriteMBInfo() {
  // The method writes information about
  // the 10 previous minimum-bias events
  // i.e. channels charge for each of these
  // 10 events (20 words for the 4 channels 
  // of half a CIU card)
    
  for(Int_t i = 0; i < 20; i++) {
    UInt_t data = 0;
    f->WriteBuffer((char*)&data,sizeof(data));
  }
}


//_____________________________________________________________________________
void AliVZEROBuffer::WriteMBFlags() {
  // The method writes information about
  // the Minimum Bias flags
  // 3 32-bits words for the 4 channels 
  // of half a CIU card


  for(Int_t i = 0; i < 3; i++) {
    UInt_t data = 0;
    f->WriteBuffer((char*)&data,sizeof(data));
  }
}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteBeamScalers() {
  // The method writes the VZERO beam scalers
  // For the moment there is no way to simulate
  // this, so we fill the necessary words with 0

  // Beam-beam and beam-gas scalers for
  // 4 individual channel (4x4 words)
  
  for(Int_t i = 0; i < 16; i++) {
    UInt_t data = 0;
    f->WriteBuffer((char*)&data,sizeof(data));
  }
}

//_____________________________________________________________________________
void AliVZEROBuffer::WriteTiming(Float_t time, Float_t width) {
  // It writes the timing information into a raw data file. 
  // Being called by Digits2Raw

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