#include "TArrayC.h"
#include "TRandom.h"
#include "TDatime.h"
-#include "AliRawDataHeader.h"
+#include "AliRawDataHeaderV3.h"
#include "AliHLTAltroEncoder.h"
/** ROOT macro for the implementation of ROOT specific class methods */
int AliHLTAltroGenerator::Generate()
{
// see header file for class documentation
- int iResult=0;
-
if (!fpSimData) fpSimData=new TArrayS;
if (!fpSimData) {
return -ENOMEM;
}
repetitions=0;
int totalBunches=0;
- int bunchEndTime=fMaxTimebin;
+ int bunchEndTime=0;
+ int lastBunchEndTime=0;
HLTDebug("simulate channel %d: address %d", channel, channelAddress);
// save beginning of this channel for better navigation
- AliChannelPosition position={channelAddress, dataPos, 0};
+ AliChannelPosition position={static_cast<AliHLTUInt16_t>(channelAddress), dataPos, 0};
// add channel address and bunch count at the beginning
if (fpSimData->GetSize()<dataPos+2) fpSimData->Set(dataPos+2);
dataPos++; // placeholder for number of bunches
int bunch=0;
- for (bunch=0; bunch<nofBunches && bunchEndTime>0; bunch++) {
- bunchEndTime=GetRandom(0, bunchEndTime-1);
- int bunchLength=GetRandom(0, bunchEndTime<fMaxBunchLength?bunchEndTime:fMaxBunchLength);
+
+ // Matthias Oct 2008:
+ // Data was simulated in the wrong order: bunches for the higher timebins
+ // first. But real data is the other way round: bunches are written in the order
+ // of ascending timebins. A new consistency check was added to AliAltroDecoder
+ // (AliAltroBunch) in revision 29090. Now the channels are checked for overlapping
+ // bunches, the time of a bunch must be smaller than time of the previous one
+ // minus its length.
+ // Data is now simulated in the right order in order to fullfil this check.
+ for (bunch=0; bunch<nofBunches && bunchEndTime<fMaxTimebin-3; bunch++) {
+ while ((bunchEndTime+=GetRandom(0, fMaxTimebin-bunchEndTime))-lastBunchEndTime<3) {/*empty body*/};
+ int bunchLength=GetRandom(0, bunchEndTime-lastBunchEndTime<fMaxBunchLength?bunchEndTime-lastBunchEndTime:fMaxBunchLength);
if (bunchLength==0) continue;
totalBunches++;
(*fpSimData)[dataPos++]=bunchEndTime;
(*fpSimData)[dataPos++]=bunchLength;
fNof10BitWords+=bunchLength+2;
+ lastBunchEndTime=bunchEndTime;
+ bunchEndTime+=bunchLength;
}
if (totalBunches>0) {
(*fpSimData)[position.fPosition+1]=totalBunches;
}
assert(fNof10BitWords%4==0);
- if (iResult<0) {
- fpSimData->Set(0);
- return iResult;
- }
fpSimData->Set(dataPos);
return GetDataSize();
}
return dataPos;
}
-int AliHLTAltroGenerator::SetCDH(AliRawDataHeader* pCDH, int size)
+int AliHLTAltroGenerator::SetCDH(AliRawDataHeaderV3* pCDH, int size)
{
// see header file for class documentation
int iResult=0;
if (pCDH && size>0) {
if (fpCDH) delete[] fpCDH;
- fpCDH=new AliRawDataHeader;
+ fpCDH=new AliRawDataHeaderV3;
if (fpCDH) {
memcpy(fpCDH, pCDH, size);
fCDHSize=size;
int time=startTime;
for (; time<startTime+bunchLength; time++) {
iResult=encoder.AddSignal(fpSimData->At(dataPos++), time);
- //iResult=encoder.AddChannelSignal(fpSimData->At(dataPos++), time, channelAddress);
}
assert(time-1==fpSimData->At(dataPos));
dataPos++; // DO NOT PUT INTO ASSERT
}
encoder.SetChannel(channelAddress);
}
- if (iResult>=0 && channelAddress>=0) {
- //encoder.SetChannel(channelAddress);
- }
if (iResult>=0) {
iResult=(encoder.GetTotal40bitWords()*5)/4;
bool haveData=false;
if (!fpSimData) return false;
do {
- if (haveData=(fCurrentTimeOffset>=0 &&
- fCurrentBunch>0 &&
- ++fCurrentTimeOffset<GetBunchSize())) {
+ if ((haveData=(fCurrentTimeOffset>=0 &&
+ fCurrentBunch>0 &&
+ ++fCurrentTimeOffset<GetBunchSize()))) {
break;
}
- if (haveData=(NextBunch() && GetBunchSize()>0)) {
+ if ((haveData=(NextBunch()) && GetBunchSize()>0)) {
fCurrentTimeOffset=0;
break;
}
{
// see header file for class documentation
bool haveData=false;
- if (fpSimData && fChannelPositions.size()==0) return false;
+ if (!fpSimData || fChannelPositions.size()==0) return false;
fpSimData->GetArray();
if (fCurrentPosition==-1) {
if (fDirection==kForwards) fCurrentPosition=0;
if (fDirection==kBackwards) {
if (fCurrentBunch<0) {
// bunch count in channel end - 1
- if (haveData=(fpSimData->At(fChannelPositions[fCurrentPosition].fEnd-1))>0) {
+ if ((haveData=(fpSimData->At(fChannelPositions[fCurrentPosition].fEnd-1))>0)) {
// first bunch length at channel end - 2
fCurrentBunch=fChannelPositions[fCurrentPosition].fEnd-2;
}
} else if (fDirection==kForwards) {
if (fCurrentBunch<0) {
// bunch count in channel start + 1
- if (haveData=(fpSimData->At(fChannelPositions[fCurrentPosition].fPosition+1))>0) {
+ if ((haveData=(fpSimData->At(fChannelPositions[fCurrentPosition].fPosition+1))>0)) {
// first bunch length at channel start + 2
fCurrentBunch=fChannelPositions[fCurrentPosition].fPosition+2;
}