return new AliHLTTPCDataCompressionComponent;
}
+void AliHLTTPCDataCompressionComponent::GetOCDBObjectDescription(TMap* const targetMap)
+{
+ /// Get a list of OCDB object needed for the particular component
+ if (!targetMap) return;
+
+ targetMap->Add(new TObjString("HLT/ConfigTPC/TPCDataCompressor"),
+ new TObjString("component arguments"));
+ if (fDeflaterMode==2) {
+ targetMap->Add(new TObjString("HLT/ConfigTPC/TPCDataCompressorHuffmanTables"),
+ new TObjString("huffman tables for deflater mode 2"));
+ }
+}
+
int AliHLTTPCDataCompressionComponent::DoEvent( const AliHLTComponentEventData& /*evtData*/,
const AliHLTComponentBlockData* /*inputBlocks*/,
AliHLTComponentTriggerData& /*trigData*/,
AliHLTUInt32_t outputDataSize=0;
int allClusters=0;
int associatedClusters=0;
+ float bz=GetBz();
/// input track array
vector<AliHLTGlobalBarrelTrack> inputTrackArray;
vector<int> trackindexmap; // stores index for every track id
// track data input
- if (fMode==2) {
+ if (fMode==2 || fMode==4) {
for (pDesc=GetFirstInputBlock(kAliHLTDataTypeTrack|kAliHLTDataOriginTPC);
pDesc!=NULL; pDesc=GetNextInputBlock()) {
if (GetBenchmarkInstance()) {
AliHLTTPCTrackGeometry* trackpoints=new AliHLTTPCTrackGeometry;
if (!trackpoints) continue;
HLTDebug("track %d id %d:", trackindex, trackID);
+
+ // in order to avoid rounding errors the track points are
+ // calculated in exactly the same way as in the decoding
+ // Thats why the track instance can not be used directly
+ // but a new instance is created from the values in the
+ // storage format.
+ // think about moving that to some common code used by
+ // both compression and decoding
+ AliHLTExternalTrackParam param;
+ memset(¶m, 0, sizeof(param));
+ float alpha=track->GetAlpha();
+ while (alpha<0.) alpha+=TMath::TwoPi();
+ while (alpha>TMath::TwoPi()) alpha-=TMath::TwoPi();
+ AliHLTUInt8_t tSlice=AliHLTUInt8_t(9*alpha/TMath::Pi());
+ param.fAlpha =( tSlice + 0.5 ) * TMath::Pi() / 9.0;
+ if (param.fAlpha>TMath::TwoPi()) param.fAlpha-=TMath::TwoPi();
+ param.fX = track->GetX();
+ param.fY = track->GetY();
+ param.fZ = track->GetZ();
+ param.fSinPsi = track->GetSnp();
+ param.fTgl = track->GetTgl();
+ param.fq1Pt = track->GetSigned1Pt();
+ AliHLTGlobalBarrelTrack ctrack(param);
+ ctrack.CalculateHelixParams(bz);
trackpoints->InitDriftTimeTransformation(fDriftTimeFactorA, fDriftTimeOffsetA, fDriftTimeFactorC, fDriftTimeOffsetC);
trackpoints->SetTrackId(trackID);
- trackpoints->CalculateTrackPoints(*track);
+ trackpoints->CalculateTrackPoints(ctrack);
trackpoints->RegisterTrackPoints(fTrackGrid);
track->SetTrackGeometry(trackpoints);
}
assignedInThisPartition=iResult;
associatedClusters+=iResult;
}
- iResult=ProcessRemainingClusters(&inputTrackArray[0], inputTrackArray.size(), fTrackGrid, fSpacePointGrid, fRawInputClusters, slice, patch);
+ iResult=ProcessRemainingClusters(&inputTrackArray[0], inputTrackArray.size(), fTrackGrid, trackindexmap, fSpacePointGrid, fRawInputClusters, slice, patch);
if (iResult>=0) {
if (fSpacePointGrid->GetNumberOfSpacePoints()>0) {
if (fVerbosity>0) HLTInfo("associated %d (%d) of %d clusters in slice %d partition %d", iResult+assignedInThisPartition, assignedInThisPartition, fSpacePointGrid->GetNumberOfSpacePoints(), slice, patch);
}
AliHLTUInt32_t parameterIndex=0;
- trackModelBlock->fGlobalParameters[parameterIndex++]=GetBz();
+ trackModelBlock->fGlobalParameters[parameterIndex++]=bz;
trackModelBlock->fGlobalParameters[parameterIndex++]=fDriftTimeFactorA;
trackModelBlock->fGlobalParameters[parameterIndex++]=fDriftTimeOffsetA;
trackModelBlock->fGlobalParameters[parameterIndex++]=fDriftTimeFactorC;
break;
}
- if (fMode==2) {
+ if (trackindexmap.size()>0) {// condition for track model compression
iResult=WriteTrackClusters(inputTrackArray, fRawInputClusters, fpDataDeflater, outputPtr+size+tracksBufferOffset, capacity-size-tracksBufferOffset);
if (iResult>=0) {
AliHLTComponent_BlockData bd;
int AliHLTTPCDataCompressionComponent::ProcessRemainingClusters(AliHLTGlobalBarrelTrack* pTracks, unsigned nofTracks,
AliHLTTrackGeometry::AliHLTTrackGrid* pTrackIndex,
+ const vector<int>& trackIndexMap,
AliHLTSpacePointContainer::AliHLTSpacePointPropertyGrid* pClusterIndex,
AliHLTSpacePointContainer* pClusters,
int slice, int partition) const
for (int padrow=0; padrow<AliHLTTPCTransform::GetNRows(partition); padrow++) {
for (AliHLTTrackGeometry::AliHLTTrackGrid::iterator& trackId=pTrackIndex->begin(slice, partition, padrow);
trackId!=pTrackIndex->end(); trackId++) {
- unsigned i=0;
- for (; i<nofTracks; i++) {
- if ((unsigned)pTracks[i].GetID()==trackId.Data()) break;
+ if (trackId.Data()>=trackIndexMap.size()) {
+ HLTError("can not find track id %d in index map of size %d", trackId.Data(), trackIndexMap.size());
+ continue;
}
- if (i>=nofTracks) {
- HLTError("can not find track of id %d", trackId.Data());
+ int trackindex=trackIndexMap[trackId.Data()];
+ if (trackindex<0 || trackindex>=(int)nofTracks) {
+ HLTError("invalid index %d found for track id %d", trackindex, trackId.Data());
continue;
}
- AliHLTGlobalBarrelTrack& track=pTracks[i];
+ AliHLTGlobalBarrelTrack& track=pTracks[trackindex];
if (!track.GetTrackGeometry()) {
HLTError("can not find track geometry for track %d", trackId.Data());
continue;
return -ENOMEM;
}
- unsigned spacePointContainerMode=(fMode==2)?AliHLTTPCHWCFSpacePointContainer::kModeCreateMap:0;
+ unsigned spacePointContainerMode=0;
+ if (fMode==2 || fMode==4) {
+ // initialize map data for cluster access in the track association loop
+ spacePointContainerMode|=AliHLTTPCHWCFSpacePointContainer::kModeCreateMap;
+ }
+ if (fMode==3 || fMode==4) {
+ // optimized storage format: differential pad and time storage
+ spacePointContainerMode|=AliHLTTPCHWCFSpacePointContainer::kModeDifferentialPadTime;
+ }
std::auto_ptr<AliHLTTPCHWCFSpacePointContainer> rawInputClusters(new AliHLTTPCHWCFSpacePointContainer(spacePointContainerMode));
std::auto_ptr<AliHLTTPCSpacePointContainer> inputClusters(new AliHLTTPCSpacePointContainer);