#include "AliVZERORawStream.h"
#include "AliRawReader.h"
#include "AliLog.h"
#include "AliDAQ.h"
#include "AliVZEROCalibData.h"
#include "AliVZEROTriggerData.h"
ClassImp(AliVZERORawStream)
AliVZERORawStream::AliVZERORawStream(AliRawReader* rawReader) :
fTrigger(0),
fTriggerMask(0),
fPosition(-1),
fRawReader(rawReader),
fData(NULL)
{
fRawReader->Reset();
AliDebug(1,Form("Selecting raw data for detector %d",AliDAQ::DetectorID("VZERO")));
fRawReader->Select("VZERO");
for(Int_t i = 0; i < kNChannels; i++) {
fTime[i] = fWidth[i] = 0;
for(Int_t j = 0; j < kNEvOfInt; j++) {
fADC[i][j] = 0;
fIsInt[i][j] = fIsBB[i][j] = fIsBG[i][j] = kFALSE;
}
fBBScalers[i] = fBGScalers[i] = 0;
for(Int_t j = 0; j < kNBunches; j++) {
fChargeMB[i][j] = 0;
fIsIntMB[i][j] = fIsBBMB[i][j] = fIsBGMB[i][j] = kFALSE;
}
}
for(Int_t i = 0; i < kNScalers; i++) fScalers[i] = 0;
for(Int_t i = 0; i < kNBunches; i++) fBunchNumbers[i] = 0;
}
AliVZERORawStream::~AliVZERORawStream()
{
}
void AliVZERORawStream::Reset()
{
for(Int_t i = 0; i < kNChannels; i++) {
fTime[i] = fWidth[i] = 0;
for(Int_t j = 0; j < kNEvOfInt; j++) {
fADC[i][j] = 0;
fIsInt[i][j] = fIsBB[i][j] = fIsBG[i][j] = kFALSE;
}
fBBScalers[i] = fBGScalers[i] = 0;
for(Int_t j = 0; j < kNBunches; j++) {
fChargeMB[i][j] = 0;
fIsIntMB[i][j] = fIsBBMB[i][j] = fIsBGMB[i][j] = kFALSE;
}
}
for(Int_t i = 0; i < kNScalers; i++) fScalers[i] = 0;
for(Int_t i = 0; i < kNBunches; i++) fBunchNumbers[i] = 0;
fTrigger = fTriggerMask = 0;
fPosition = -1;
fData = NULL;
if (fRawReader) fRawReader->Reset();
}
Bool_t AliVZERORawStream::Next()
{
if (fPosition >= 0) return kFALSE;
if (!fRawReader->ReadNextData(fData)) return kFALSE;
if (fRawReader->GetDataSize() == 0) return kFALSE;
if (fRawReader->GetDataSize() != 5936) {
fRawReader->AddFatalErrorLog(kRawDataSizeErr,Form("size %d != 5936",fRawReader->GetDataSize()));
AliWarning(Form("Wrong VZERO raw data size: %d, expected 5936 bytes!",fRawReader->GetDataSize()));
return kFALSE;
}
fPosition = 0;
fTrigger = GetNextWord() & 0xffff;
fTriggerMask = GetNextWord() & 0xffff;
for(Int_t iScaler = 0; iScaler < kNScalers; iScaler++)
fScalers[iScaler] = GetNextWord();
for(Int_t iBunch = 0; iBunch < kNBunches; iBunch++)
fBunchNumbers[iBunch] = GetNextWord();
for (Int_t iCIU = 0; iCIU < 8; iCIU++) {
for (Int_t iChannel_Offset = iCIU*8; iChannel_Offset < (iCIU*8)+8; iChannel_Offset=iChannel_Offset+4) {
for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
for(Int_t iEvOfInt = 0; iEvOfInt < kNEvOfInt; iEvOfInt++) {
UShort_t data = GetNextShort();
fADC[iChannel][iEvOfInt] = data & 0x3ff;
fIsInt[iChannel][iEvOfInt] = (data >> 10) & 0x1;
}
}
for(Int_t iEvOfInt = 0; iEvOfInt < kNEvOfInt; iEvOfInt=iEvOfInt+2) {
UShort_t data = GetNextShort();
for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
fIsBB[iChannel][iEvOfInt] = (data >> 2*(iChannel-iChannel_Offset)) & 0x1;
fIsBG[iChannel][iEvOfInt] = (data >> (2*(iChannel-iChannel_Offset)+1)) & 0x1;
if(iEvOfInt < (kNEvOfInt - 1)) {
fIsBB[iChannel][iEvOfInt+1] = (data >> (8+ 2*(iChannel-iChannel_Offset))) & 0x1;
fIsBG[iChannel][iEvOfInt+1] = (data >> (8+ 2*(iChannel-iChannel_Offset)+1)) & 0x1;
}
}
}
GetNextShort();
for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
for(Int_t iBunch = 0; iBunch < kNBunches; iBunch++) {
UShort_t data = GetNextShort();
fChargeMB[iChannel][iBunch] = data & 0x3ff;
fIsIntMB[iChannel][iBunch] = (data >> 10) & 0x1;
}
}
for(Int_t iBunch = 0; iBunch < kNBunches; iBunch=iBunch+2) {
UShort_t data = GetNextShort();
for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
fIsBBMB[iChannel][iBunch] = (data >> 2*iBunch) & 0x1;
fIsBGMB[iChannel][iBunch] = (data >> (2*iBunch+1)) & 0x1;
if(iBunch < (kNBunches - 1)) {
fIsBBMB[iChannel][iBunch+1] = (data >> (8+2*iBunch)) & 0x1;
fIsBGMB[iChannel][iBunch+1] = (data >> (8+2*iBunch+1)) & 0x1;
}
}
}
GetNextShort();
for(Int_t iChannel = iChannel_Offset; iChannel < iChannel_Offset+4; iChannel++) {
fBBScalers[iChannel] = ((ULong64_t)GetNextWord()) << 32;
fBBScalers[iChannel] |= GetNextWord();
fBGScalers[iChannel] = ((ULong64_t)GetNextWord()) << 32;
fBGScalers[iChannel] |= GetNextWord();
}
}
for(Int_t iChannel = (iCIU*8) + 7; iChannel >= iCIU*8; iChannel--) {
UInt_t time = GetNextWord();
fTime[iChannel] = time & 0xfff;
fWidth[iChannel] = ((time >> 12) & 0x7f);
}
}
return kTRUE;
}
UInt_t AliVZERORawStream::GetNextWord()
{
if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");
UInt_t word = 0;
word |= fData[fPosition++];
word |= fData[fPosition++] << 8;
word |= fData[fPosition++] << 16;
word |= fData[fPosition++] << 24;
return word;
}
UShort_t AliVZERORawStream::GetNextShort()
{
if (!fData || fPosition < 0) AliFatal("Raw data payload buffer is not yet initialized !");
UShort_t word = 0;
word |= fData[fPosition++];
word |= fData[fPosition++] << 8;
return word;
}
void AliVZERORawStream::CalculateChargeForCentrTriggers(AliVZEROTriggerData *triggerData,
UShort_t &chargeA, UShort_t &chargeC) const
{
if (!triggerData) {
AliFatal("Trigger configuration data is not provided. Exiting...");
return;
}
chargeA = chargeC = 0;
for(Int_t iChannel=0; iChannel<64; iChannel++) {
Int_t offlineCh = GetOfflineChannel(iChannel);
Int_t board = AliVZEROCalibData::GetBoardNumber(offlineCh);
Int_t feeChannel = AliVZEROCalibData::GetFEEChannelNumber(offlineCh);
if (triggerData->GetEnableCharge(board,feeChannel)) {
Bool_t integ10 = GetIntegratorFlag(iChannel,10);
UShort_t ch10 = (UShort_t)GetPedestal(iChannel,10);
UShort_t trPed = (integ10 == kFALSE) ? triggerData->GetPedestal(0,board,feeChannel) : triggerData->GetPedestal(1,board,feeChannel);
UShort_t trPedCut = (integ10 == kFALSE) ? triggerData->GetPedestalCut(0,board,feeChannel) : triggerData->GetPedestalCut(1,board,feeChannel);
if (!triggerData->GetPedestalSubtraction(board)) trPed = trPedCut = 0;
if (ch10 > trPedCut) {
if (offlineCh < 32) {
chargeC += (ch10 - trPed);
}
else {
chargeA += (ch10 - trPed);
}
}
}
}
}
void AliVZERORawStream::CalculateBBandBGFlags(AliVZEROTriggerData *triggerData,
UChar_t &nBBA, UChar_t &nBBC,
UChar_t &nBGA, UChar_t &nBGC) const
{
if (!triggerData) {
AliFatal("Trigger configuration data is not provided. Exiting...");
return;
}
nBBA = nBBC = nBGA = nBGC = 0;
for(Int_t iChannel=0; iChannel<64; iChannel++) {
Int_t offlineCh = GetOfflineChannel(iChannel);
Int_t board = AliVZEROCalibData::GetBoardNumber(offlineCh);
Int_t feeChannel = AliVZEROCalibData::GetFEEChannelNumber(offlineCh);
if (triggerData->GetEnableTiming(board,feeChannel)) {
if (offlineCh < 32) {
if (GetBBFlag(iChannel,10)) nBBC++;
if (GetBGFlag(iChannel,10)) nBGC++;
}
else {
if (GetBBFlag(iChannel,10)) nBBA++;
if (GetBGFlag(iChannel,10)) nBGA++;
}
}
}
}
void AliVZERORawStream::FillTriggerBits(AliVZEROTriggerData *triggerData)
{
UShort_t chargeA,chargeC;
CalculateChargeForCentrTriggers(triggerData,chargeA,chargeC);
UChar_t nBBA,nBBC,nBGA,nBGC;
CalculateBBandBGFlags(triggerData,
nBBA,nBBC,
nBGA,nBGC);
fTrigger = 0;
if((nBBC >= triggerData->GetBBCThreshold()) && (nBBA >= triggerData->GetBBAThreshold())) fTrigger |= 1;
if((nBBC >= triggerData->GetBBCThreshold()) || (nBBA >= triggerData->GetBBAThreshold())) fTrigger |= (1<<1);
if((nBBC >= triggerData->GetBBCForBGThreshold()) && (nBGA >= triggerData->GetBGAThreshold())) fTrigger |= (1<<2);
if((nBGA >= triggerData->GetBGAThreshold())) fTrigger |= (1<<3);
if((nBGC >= triggerData->GetBGCThreshold()) && (nBBA >= triggerData->GetBBAForBGThreshold())) fTrigger |= (1<<4);
if((nBGC >= triggerData->GetBGCThreshold())) fTrigger |= (1<<5);
if((chargeC >= triggerData->GetCentralityV0CThrLow()) && (chargeA >= triggerData->GetCentralityV0AThrLow())) fTrigger |= (1<<6);
if((chargeC >= triggerData->GetCentralityV0CThrLow()) || (chargeA >= triggerData->GetCentralityV0AThrLow())) fTrigger |= (1<<7);
if((chargeC >= triggerData->GetCentralityV0CThrHigh()) && (chargeA >= triggerData->GetCentralityV0AThrHigh())) fTrigger |= (1<<8);
if((chargeC >= triggerData->GetCentralityV0CThrHigh()) || (chargeA >= triggerData->GetCentralityV0AThrHigh())) fTrigger |= (1<<9);
if(((nBBC >= triggerData->GetMultV0CThrLow()) && (nBBC <= triggerData->GetMultV0CThrHigh())) &&
((nBBA >= triggerData->GetMultV0AThrLow()) && (nBBA <= triggerData->GetMultV0AThrHigh())))
fTrigger |= (1<<10);
if(((nBBC >= triggerData->GetMultV0CThrLow()) && (nBBC <= triggerData->GetMultV0CThrHigh())) ||
((nBBA >= triggerData->GetMultV0AThrLow()) && (nBBA <= triggerData->GetMultV0AThrHigh())))
fTrigger |= (1<<11);
if((nBBA >= triggerData->GetBBAThreshold())) fTrigger |= (1<<12);
if((nBBC >= triggerData->GetBBCThreshold())) fTrigger |= (1<<13);
if((nBGC >= triggerData->GetBGCThreshold()) || (nBGA >= triggerData->GetBGAThreshold())) fTrigger |= (1<<14);
if(((nBBC >= triggerData->GetBBCForBGThreshold()) && (nBGA >= triggerData->GetBGAThreshold())) ||
((nBGC >= triggerData->GetBGCThreshold()) && (nBBA >= triggerData->GetBBAForBGThreshold()))) fTrigger |= (1<<15);
}
AliVZERORawStream.cxx:100 AliVZERORawStream.cxx:101 AliVZERORawStream.cxx:102 AliVZERORawStream.cxx:103 AliVZERORawStream.cxx:104 AliVZERORawStream.cxx:105 AliVZERORawStream.cxx:106 AliVZERORawStream.cxx:107 AliVZERORawStream.cxx:108 AliVZERORawStream.cxx:109 AliVZERORawStream.cxx:110 AliVZERORawStream.cxx:111 AliVZERORawStream.cxx:112 AliVZERORawStream.cxx:113 AliVZERORawStream.cxx:114 AliVZERORawStream.cxx:115 AliVZERORawStream.cxx:116 AliVZERORawStream.cxx:117 AliVZERORawStream.cxx:118 AliVZERORawStream.cxx:119 AliVZERORawStream.cxx:120 AliVZERORawStream.cxx:121 AliVZERORawStream.cxx:122 AliVZERORawStream.cxx:123 AliVZERORawStream.cxx:124 AliVZERORawStream.cxx:125 AliVZERORawStream.cxx:126 AliVZERORawStream.cxx:127 AliVZERORawStream.cxx:128 AliVZERORawStream.cxx:129 AliVZERORawStream.cxx:130 AliVZERORawStream.cxx:131 AliVZERORawStream.cxx:132 AliVZERORawStream.cxx:133 AliVZERORawStream.cxx:134 AliVZERORawStream.cxx:135 AliVZERORawStream.cxx:136 AliVZERORawStream.cxx:137 AliVZERORawStream.cxx:138 AliVZERORawStream.cxx:139 AliVZERORawStream.cxx:140 AliVZERORawStream.cxx:141 AliVZERORawStream.cxx:142 AliVZERORawStream.cxx:143 AliVZERORawStream.cxx:144 AliVZERORawStream.cxx:145 AliVZERORawStream.cxx:146 AliVZERORawStream.cxx:147 AliVZERORawStream.cxx:148 AliVZERORawStream.cxx:149 AliVZERORawStream.cxx:150 AliVZERORawStream.cxx:151 AliVZERORawStream.cxx:152 AliVZERORawStream.cxx:153 AliVZERORawStream.cxx:154 AliVZERORawStream.cxx:155 AliVZERORawStream.cxx:156 AliVZERORawStream.cxx:157 AliVZERORawStream.cxx:158 AliVZERORawStream.cxx:159 AliVZERORawStream.cxx:160 AliVZERORawStream.cxx:161 AliVZERORawStream.cxx:162 AliVZERORawStream.cxx:163 AliVZERORawStream.cxx:164 AliVZERORawStream.cxx:165 AliVZERORawStream.cxx:166 AliVZERORawStream.cxx:167 AliVZERORawStream.cxx:168 AliVZERORawStream.cxx:169 AliVZERORawStream.cxx:170 AliVZERORawStream.cxx:171 AliVZERORawStream.cxx:172 AliVZERORawStream.cxx:173 AliVZERORawStream.cxx:174 AliVZERORawStream.cxx:175 AliVZERORawStream.cxx:176 AliVZERORawStream.cxx:177 AliVZERORawStream.cxx:178 AliVZERORawStream.cxx:179 AliVZERORawStream.cxx:180 AliVZERORawStream.cxx:181 AliVZERORawStream.cxx:182 AliVZERORawStream.cxx:183 AliVZERORawStream.cxx:184 AliVZERORawStream.cxx:185 AliVZERORawStream.cxx:186 AliVZERORawStream.cxx:187 AliVZERORawStream.cxx:188 AliVZERORawStream.cxx:189 AliVZERORawStream.cxx:190 AliVZERORawStream.cxx:191 AliVZERORawStream.cxx:192 AliVZERORawStream.cxx:193 AliVZERORawStream.cxx:194 AliVZERORawStream.cxx:195 AliVZERORawStream.cxx:196 AliVZERORawStream.cxx:197 AliVZERORawStream.cxx:198 AliVZERORawStream.cxx:199 AliVZERORawStream.cxx:200 AliVZERORawStream.cxx:201 AliVZERORawStream.cxx:202 AliVZERORawStream.cxx:203 AliVZERORawStream.cxx:204 AliVZERORawStream.cxx:205 AliVZERORawStream.cxx:206 AliVZERORawStream.cxx:207 AliVZERORawStream.cxx:208 AliVZERORawStream.cxx:209 AliVZERORawStream.cxx:210 AliVZERORawStream.cxx:211 AliVZERORawStream.cxx:212 AliVZERORawStream.cxx:213 AliVZERORawStream.cxx:214 AliVZERORawStream.cxx:215 AliVZERORawStream.cxx:216 AliVZERORawStream.cxx:217 AliVZERORawStream.cxx:218 AliVZERORawStream.cxx:219 AliVZERORawStream.cxx:220 AliVZERORawStream.cxx:221 AliVZERORawStream.cxx:222 AliVZERORawStream.cxx:223 AliVZERORawStream.cxx:224 AliVZERORawStream.cxx:225 AliVZERORawStream.cxx:226 AliVZERORawStream.cxx:227 AliVZERORawStream.cxx:228 AliVZERORawStream.cxx:229 AliVZERORawStream.cxx:230 AliVZERORawStream.cxx:231 AliVZERORawStream.cxx:232 AliVZERORawStream.cxx:233 AliVZERORawStream.cxx:234 AliVZERORawStream.cxx:235 AliVZERORawStream.cxx:236 AliVZERORawStream.cxx:237 AliVZERORawStream.cxx:238 AliVZERORawStream.cxx:239 AliVZERORawStream.cxx:240 AliVZERORawStream.cxx:241 AliVZERORawStream.cxx:242 AliVZERORawStream.cxx:243 AliVZERORawStream.cxx:244 AliVZERORawStream.cxx:245 AliVZERORawStream.cxx:246 AliVZERORawStream.cxx:247 AliVZERORawStream.cxx:248 AliVZERORawStream.cxx:249 AliVZERORawStream.cxx:250 AliVZERORawStream.cxx:251 AliVZERORawStream.cxx:252 AliVZERORawStream.cxx:253 AliVZERORawStream.cxx:254 AliVZERORawStream.cxx:255 AliVZERORawStream.cxx:256 AliVZERORawStream.cxx:257 AliVZERORawStream.cxx:258 AliVZERORawStream.cxx:259 AliVZERORawStream.cxx:260 AliVZERORawStream.cxx:261 AliVZERORawStream.cxx:262 AliVZERORawStream.cxx:263 AliVZERORawStream.cxx:264 AliVZERORawStream.cxx:265 AliVZERORawStream.cxx:266 AliVZERORawStream.cxx:267 AliVZERORawStream.cxx:268 AliVZERORawStream.cxx:269 AliVZERORawStream.cxx:270 AliVZERORawStream.cxx:271 AliVZERORawStream.cxx:272 AliVZERORawStream.cxx:273 AliVZERORawStream.cxx:274 AliVZERORawStream.cxx:275 AliVZERORawStream.cxx:276 AliVZERORawStream.cxx:277 AliVZERORawStream.cxx:278 AliVZERORawStream.cxx:279 AliVZERORawStream.cxx:280 AliVZERORawStream.cxx:281 AliVZERORawStream.cxx:282 AliVZERORawStream.cxx:283 AliVZERORawStream.cxx:284 AliVZERORawStream.cxx:285 AliVZERORawStream.cxx:286 AliVZERORawStream.cxx:287 AliVZERORawStream.cxx:288 AliVZERORawStream.cxx:289 AliVZERORawStream.cxx:290 AliVZERORawStream.cxx:291 AliVZERORawStream.cxx:292 AliVZERORawStream.cxx:293 AliVZERORawStream.cxx:294 AliVZERORawStream.cxx:295 AliVZERORawStream.cxx:296 AliVZERORawStream.cxx:297 AliVZERORawStream.cxx:298 AliVZERORawStream.cxx:299 AliVZERORawStream.cxx:300 AliVZERORawStream.cxx:301 AliVZERORawStream.cxx:302 AliVZERORawStream.cxx:303 AliVZERORawStream.cxx:304 AliVZERORawStream.cxx:305 AliVZERORawStream.cxx:306 AliVZERORawStream.cxx:307 AliVZERORawStream.cxx:308 AliVZERORawStream.cxx:309 AliVZERORawStream.cxx:310 AliVZERORawStream.cxx:311 AliVZERORawStream.cxx:312 AliVZERORawStream.cxx:313 AliVZERORawStream.cxx:314 AliVZERORawStream.cxx:315 AliVZERORawStream.cxx:316 AliVZERORawStream.cxx:317 AliVZERORawStream.cxx:318 AliVZERORawStream.cxx:319 AliVZERORawStream.cxx:320 AliVZERORawStream.cxx:321 AliVZERORawStream.cxx:322 AliVZERORawStream.cxx:323 AliVZERORawStream.cxx:324 AliVZERORawStream.cxx:325 AliVZERORawStream.cxx:326 AliVZERORawStream.cxx:327 AliVZERORawStream.cxx:328 AliVZERORawStream.cxx:329 AliVZERORawStream.cxx:330 AliVZERORawStream.cxx:331 AliVZERORawStream.cxx:332 AliVZERORawStream.cxx:333 AliVZERORawStream.cxx:334 AliVZERORawStream.cxx:335 AliVZERORawStream.cxx:336 AliVZERORawStream.cxx:337 AliVZERORawStream.cxx:338 AliVZERORawStream.cxx:339 AliVZERORawStream.cxx:340 AliVZERORawStream.cxx:341 AliVZERORawStream.cxx:342 AliVZERORawStream.cxx:343 AliVZERORawStream.cxx:344 AliVZERORawStream.cxx:345 AliVZERORawStream.cxx:346 AliVZERORawStream.cxx:347 AliVZERORawStream.cxx:348 AliVZERORawStream.cxx:349 AliVZERORawStream.cxx:350 AliVZERORawStream.cxx:351 AliVZERORawStream.cxx:352 AliVZERORawStream.cxx:353