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 AliHLTMonitoringRelay.cxx
20 /// @author Matthias Richter
22 /// @brief Relay components for monitoring objects.
27 #include "AliHLTMonitoringRelay.h"
28 #include "AliHLTMessage.h"
33 /** ROOT macro for the implementation of ROOT specific class methods */
34 ClassImp(AliHLTMonitoringRelay)
36 AliHLTMonitoringRelay::AliHLTMonitoringRelay()
42 // see header file for class documentation
44 // refer to README to build package
46 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
49 AliHLTMonitoringRelay::~AliHLTMonitoringRelay()
51 // see header file for class documentation
54 void AliHLTMonitoringRelay::GetInputDataTypes(AliHLTComponentDataTypeList& list)
56 // see header file for class documentation
58 list.push_back(kAliHLTAnyDataType);
61 AliHLTComponentDataType AliHLTMonitoringRelay::GetOutputDataType()
63 // see header file for class documentation
64 return kAliHLTAnyDataType;
67 void AliHLTMonitoringRelay::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
69 // see header file for class documentation
70 constBase=fOutputSize;
74 int AliHLTMonitoringRelay::DoInit( int argc, const char** argv )
76 // see header file for class documentation
80 iResult=ConfigureFromArgumentString(argc, argv);
85 int AliHLTMonitoringRelay::ScanConfigurationArgument(int argc, const char** argv)
87 // see header file for class documentation
88 if (argc<=0) return 0;
90 TString argument=argv[i];
93 if (argument.CompareTo("-verbose")==0) {
96 } else if (argument.CompareTo("-check-object")==0) { // check the objects in the blocks
97 SetFlag(kCheckObject);
104 int AliHLTMonitoringRelay::DoDeinit()
106 // see header file for class documentation
108 AliHLTMonitoringItemPList::iterator element=fItems.begin();
109 while (element!=fItems.end()) {
110 AliHLTMonitoringItem* pItem=*element;
111 element=fItems.erase(element);
119 int AliHLTMonitoringRelay::DoEvent(const AliHLTComponentEventData& /*evtData*/,
120 AliHLTComponentTriggerData& /*trigData*/)
122 // see header file for class documentation
124 for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock();
126 pBlock=GetNextInputBlock()) {
127 // ignore private blocks
128 if (pBlock->fDataType==(kAliHLTAnyDataType|kAliHLTDataOriginPrivate)) continue;
129 TObject* pObject=NULL;
130 if (CheckFlag(kCheckObject)) pObject=AliHLTMessage::Extract(pBlock->fPtr, pBlock->fSize);
132 AliHLTMonitoringItem* pItem=FindItem(pBlock, pObject);
134 HLTInfo("found block %s 0x%0lx %s %s", DataType2Text(pItem->GetDataType()).c_str(), pItem->GetSpecification(), pObject?pObject->GetName():"", pObject?pObject->GetName():"");
135 if (pItem->GetSize()<pBlock->fSize) {
136 // update with the new maximum
137 assert(fOutputSize>=pItem->GetSize());
138 fOutputSize-=pItem->GetSize();
139 fOutputSize+=pBlock->fSize;
141 pItem->SetData(pBlock->fPtr, pBlock->fSize);
142 HLTInfo("setting item size %d, total size %d", pItem->GetSize(), fOutputSize);
144 pItem=new AliHLTMonitoringItem(pBlock, pObject);
145 fItems.push_back(pItem);
146 fOutputSize+=pBlock->fSize;
147 HLTInfo("new item size %d (%d), %s 0x%0lx %s %s", pItem->GetSize(), fOutputSize, DataType2Text(pItem->GetDataType()).c_str(), pItem->GetSpecification(), pObject?pObject->GetName():"", pObject?pObject->GetName():"");
149 if (pObject) delete pObject;
153 for (AliHLTMonitoringItemPList::iterator element=fItems.begin();
154 element!=fItems.end(); element++) {
155 AliHLTMonitoringItem* pItem=*element;
157 HLTInfo("push back item size %d (%d), %s 0x%0lx", pItem->GetSize(), fOutputSize, DataType2Text(pItem->GetDataType()).c_str(), pItem->GetSpecification());
158 PushBack(pItem->GetBuffer(), pItem->GetSize(), pItem->GetDataType(), pItem->GetSpecification());
159 if (!pItem->GetObjectName().IsNull()) nofObjects++;
162 // info output once every 5 seconds
164 static UInt_t lastTime=0;
165 if (time.Get()-lastTime>5) {
167 HLTBenchmark("accumulated %d items containing %d TObjects", fItems.size(), nofObjects);
173 AliHLTMonitoringRelay::AliHLTMonitoringItem* AliHLTMonitoringRelay::FindItem(const AliHLTComponentBlockData* pBlock, const TObject* pObject) const
175 // find an item by data type, specification, name and title
176 for (unsigned i=0; i<fItems.size(); i++) {
177 AliHLTMonitoringItem* pItem=fItems[i];
179 (*pItem)==(*pBlock) &&
180 (pObject==NULL || (*pItem)==(*pObject))) {
187 AliHLTMonitoringRelay::AliHLTMonitoringItem::AliHLTMonitoringItem()
188 : fDt(kAliHLTVoidDataType)
189 , fSpecification(kAliHLTVoidDataSpec)
195 // standard constructor
198 AliHLTMonitoringRelay::AliHLTMonitoringItem::AliHLTMonitoringItem(const AliHLTComponentBlockData* pBlock, const TObject* pObject)
199 : fDt(kAliHLTVoidDataType)
200 , fSpecification(kAliHLTVoidDataSpec)
208 fDt=pBlock->fDataType;
209 fSpecification=pBlock->fSpecification;
211 fData->Set(pBlock->fSize, reinterpret_cast<const Char_t*>(pBlock->fPtr));
212 fDataSize=pBlock->fSize;
216 fName=pObject->GetName();
217 fTitle=pObject->GetTitle();
221 AliHLTMonitoringRelay::AliHLTMonitoringItem::~AliHLTMonitoringItem()
224 if (fData) delete fData;
227 int AliHLTMonitoringRelay::AliHLTMonitoringItem::SetData(void* pBuffer, int size)
229 // copy the data buffer
231 fData=new TArrayC(size, reinterpret_cast<const Char_t*>(pBuffer));
237 if (fData->GetSize()<size) {
238 fData->Set(size, reinterpret_cast<const Char_t*>(pBuffer));
240 memcpy(fData->GetArray(), pBuffer, size);
248 void* AliHLTMonitoringRelay::AliHLTMonitoringItem::GetBuffer() const
250 // get buffer pointer of the current data
251 return fData!=NULL?fData->GetArray():NULL;
254 unsigned AliHLTMonitoringRelay::AliHLTMonitoringItem::GetSize() const
256 // get size of the current data
260 const AliHLTComponentDataType& AliHLTMonitoringRelay::AliHLTMonitoringItem::GetDataType() const
266 AliHLTUInt32_t AliHLTMonitoringRelay::AliHLTMonitoringItem::GetSpecification() const
269 return fSpecification;
272 bool AliHLTMonitoringRelay::AliHLTMonitoringItem::operator==(const AliHLTComponentBlockData& bd) const
274 // equal to data type and specification
275 if (bd.fDataType!=fDt) return false;
276 if (bd.fSpecification!=fSpecification) return false;
280 bool AliHLTMonitoringRelay::AliHLTMonitoringItem::operator!=(const AliHLTComponentBlockData& bd) const
282 // not equal to data type and specification
283 return not operator==(bd);
286 bool AliHLTMonitoringRelay::AliHLTMonitoringItem::operator==(const TObject& object) const
288 // equal to name and title
289 if (fName.CompareTo(object.GetName())!=0) return false;
290 if (!fTitle.IsNull() && fTitle.CompareTo(object.GetTitle())!=0) return false;
294 bool AliHLTMonitoringRelay::AliHLTMonitoringItem::operator!=(const TObject& object) const
296 // not equal to name and title
297 return not operator==(object);