3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 //* for The ALICE HLT Project. *
10 //* Permission to use, copy, modify and distribute this software and its *
11 //* documentation strictly for non-commercial purposes is hereby granted *
12 //* without fee, provided that the above copyright notice appears in all *
13 //* copies and that both the copyright notice and this permission notice *
14 //* appear in the supporting documentation. The authors make no claims *
15 //* about the suitability of this software for any purpose. It is *
16 //* provided "as is" without express or implied warranty. *
17 //**************************************************************************
19 /** @file AliHLTOUTHomerCollection.cxx
20 @author Matthias Richter
22 @brief General HLTOUT data collection.
25 #include "AliHLTOUTHomerCollection.h"
26 #include "AliHLTHOMERLibManager.h"
27 #include "AliHLTHOMERReader.h"
28 #include "AliRawDataHeader.h"
29 #include "AliHLTEsdManager.h"
31 /** ROOT macro for the implementation of ROOT specific class methods */
32 ClassImp(AliHLTOUTHomerCollection)
34 AliHLTOUTHomerCollection::AliHLTOUTHomerCollection(int event, AliHLTEsdManager* pEsdManager)
36 AliHLTOUTHomerBuffer(NULL, 0),
39 fpEsdManager(pEsdManager)
41 // see header file for class documentation
43 // refer to README to build package
45 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
48 const int AliHLTOUTHomerCollection::fgkIdShift=16;
50 AliHLTOUTHomerCollection::~AliHLTOUTHomerCollection()
52 // see header file for class documentation
54 if (fpCurrent) fpManager->DeleteReader(fpCurrent);
59 int AliHLTOUTHomerCollection::GenerateIndex()
61 // see header file for class documentation
62 // step through all HLT ddls, create HOMER readers and
67 // there was a bug in AliDAQ returning the wrong equipment id
68 // for the HLT links. It has been fixed in the trunk on Feb 5th 2008
69 // and from v4-10-Release (Rev-02). For the moment we select directly
70 // to support older AliRoot versions
72 SelectEquipment(0,7680, 7689);
74 while (ReadNextData(pSrc) && pSrc!=NULL && iResult>=0) {
75 AliHLTUInt32_t id=(GetEquipmentId());
76 unsigned int size=GetDataSize();
78 AliHLTHOMERReader* pReader=OpenReader(pSrc, size);
80 // we use the equipment id to identify the different homer blocks
83 iResult=ScanReader(pReader, id);
84 fpManager->DeleteReader(pReader);
93 int AliHLTOUTHomerCollection::GetDataBuffer(AliHLTUInt32_t index, const AliHLTUInt8_t* &pBuffer,
96 // see header file for class documentation
101 Int_t id = Int_t(index>>fgkIdShift);
102 AliHLTUInt32_t blockNo=index&((0x1<<fgkIdShift)-1);
104 // block from the same ddl requested?
105 if (fpCurrent && GetEquipmentId()!=id) {
106 fpManager->DeleteReader(fpCurrent);
110 // open ddl for equipment id and create HOMER reader
113 SelectEquipment(-1, id, id);
115 if (ReadNextData(pSrc) && pSrc!=NULL) {
116 int srcSize=GetDataSize();
117 fpCurrent=OpenReader(pSrc, srcSize);
118 if (fpCurrent && fpCurrent->ReadNextEvent()!=0) {
128 AliHLTMonitoringReader* pReader=fpCurrent;
129 if ((pBuffer=static_cast<const AliHLTUInt8_t*>(pReader->GetBlockData(blockNo)))!=NULL) {
130 size=pReader->GetBlockDataLength(blockNo);
141 AliHLTHOMERReader* AliHLTOUTHomerCollection::OpenReader(UChar_t* pSrc, unsigned int size)
143 // see header file for class documentation
144 unsigned int offset=sizeof(AliHLTOUTEventHeader);
145 const AliRawDataHeader* pCDH=GetDataHeader();
146 AliHLTUInt32_t id=(GetEquipmentId());
147 AliHLTUInt32_t statusFlags=pCDH->GetStatus();
148 AliHLTOUTEventHeader* pHLTHeader=reinterpret_cast<AliHLTOUTEventHeader*>(pSrc);
150 // consistency check for the block size
151 if (pHLTHeader->fLength!=size) {
152 HLTWarning("can not treat HLT data block %d: size mismatch, header %d, but buffer is %d", id, pHLTHeader->fLength, size);
156 // determine the offset of the homer block
157 // the HLT header is mandatory, HLT decision and HLT
158 // payload are optional. HLT decision is always before HLT
159 // payload if existent.
160 if (statusFlags&(0x1<<kCDHFlagsHLTDecision)) {
161 // the block contains HLT decision data, this is just
163 AliHLTUInt32_t* pDecisionLen=reinterpret_cast<AliHLTUInt32_t*>(pSrc+offset);
164 if ((*pDecisionLen)*sizeof(AliHLTUInt32_t)+offset<size) {
165 // the first 32bit word specifies the number of 32bit words in the
166 // decision block -> +1 for this length word
167 offset+=((*pDecisionLen)+1)*sizeof(AliHLTUInt32_t);
169 HLTWarning("size mismatch: HLT decision block bigger than total block length, skipping ...");
174 // check if there is payload
175 if (!(statusFlags&(0x1<<kCDHFlagsHLTPayload))) return NULL;
177 // continue if there is no data left in the buffer
179 HLTWarning("no HLT payload available, but bit is set, skipping ...");
183 // check for the HOME descriptor type id
184 AliHLTUInt64_t* pHomerDesc=reinterpret_cast<AliHLTUInt64_t*>(pSrc+offset);
185 if (*(pHomerDesc+kID_64b_Offset) != HOMER_BLOCK_DESCRIPTOR_TYPEID &&
186 ByteSwap64(*(pHomerDesc+kID_64b_Offset)) != HOMER_BLOCK_DESCRIPTOR_TYPEID) {
187 HLTWarning("format error: can not find HOMER block descriptor typid, skipping this data block");
191 return fpManager->OpenReaderBuffer(pSrc+offset, size-offset);
194 int AliHLTOUTHomerCollection::WriteESD(const AliHLTUInt8_t* pBuffer, AliHLTUInt32_t size, AliHLTComponentDataType dt, AliESDEvent* tgtesd) const
196 // see header file for class documentation
197 if (!pBuffer && size<=0) return -EINVAL;
200 fpEsdManager->WriteESD(pBuffer, size, dt, tgtesd, GetCurrentEventNo());