Use TList::Delete instead of TList::Clear()
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTHOMERManager.cxx
CommitLineData
1ad3c9f4 1//-*- Mode: C++ -*-
6fe8cb30 2// $Id$
1ad3c9f4 3//**************************************************************************
4//* This file is property of and copyright by the ALICE HLT Project *
5//* ALICE Experiment at CERN, All rights reserved. *
6//* *
7//* Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
8//* for The ALICE HLT Project. *
9//* *
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//**************************************************************************
18
19/** @file AliHLTHOMERManager.cxx
20 @author Jochen Thaeder
21 @date
22 @brief Manger for HOMER in aliroot
23*/
24
25// see header file for class documentation
26// or
27// refer to README to build package
28// or
29// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
30
31#if __GNUC__>= 3
32 using namespace std;
33#endif
34
35#define EVE_DEBUG 0
36
37#include "AliHLTHOMERManager.h"
38// -- -- -- -- -- -- --
39#include "AliHLTHOMERLibManager.h"
40#include "AliHLTHOMERSourceDesc.h"
41#include "AliHLTHOMERBlockDesc.h"
42// -- -- -- -- -- -- --
43#include "AliHLTGlobalTriggerDecision.h"
44#include "AliHLTTriggerDecision.h"
45//---------------------------
46
47ClassImp(AliHLTHOMERManager)
48
49/*
50 * ---------------------------------------------------------------------------------
51 * Constructor / Destructor
52 * ---------------------------------------------------------------------------------
53 */
54
55//##################################################################################
56 AliHLTHOMERManager::AliHLTHOMERManager() :
57 fLibManager(new AliHLTHOMERLibManager),
58 fStateHasChanged(kTRUE),
59 fProxyHandler(NULL),
60 fCurrentReader(NULL),
61 fReaderList(NULL),
62 fSourceList(NULL),
63 fNBlks(0),
64 fEventID(),
71453f7e 65 fEventId(-1),
1ad3c9f4 66 fCurrentBlk(0),
67 fAsyncBlockList(NULL),
fd2adb88 68 fBlockList(NULL),
69 fEventBuffer(NULL),
1ad3c9f4 70 fBufferTopIdx(-1),
71 fBufferLowIdx(-1),
72 fCurrentBufferIdx(-1),
73 fNavigateBufferIdx(-1),
fd2adb88 74 fNEventsAvailable(0),
1ad3c9f4 75 fConnected(kFALSE),
76 fTriggerString("ALL"),
77 fNEventsNotTriggered(0),
fd2adb88 78 fRetryNextEvent(kFALSE),
79 fIsBlockOwner(kTRUE)
80{
1ad3c9f4 81 // see header file for class documentation
82 // or
83 // refer to README to build package
84 // or
85 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
86
87}
88
89//##################################################################################
90AliHLTHOMERManager::~AliHLTHOMERManager() {
91 // see header file for class documentation
92
93 if ( fLibManager ) {
94
95 if ( fReaderList ) {
96 TIter next(fReaderList);
97 TObject * object = NULL;
98 while ( ( object = next()) )
99 fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );
100
101 fReaderList->Clear();
102 delete fReaderList;
103 }
104 fReaderList = NULL;
105
106 delete fLibManager;
107 }
108 fLibManager = NULL;
109
110 if ( fProxyHandler != NULL )
111 delete fProxyHandler;
112 fProxyHandler = NULL;
113
114 if ( fSourceList != NULL )
115 delete fSourceList;
116 fSourceList = NULL;
117
118 if ( fEventBuffer ) {
119 fEventBuffer->Clear();
120 delete fEventBuffer;
121 }
122 fEventBuffer = NULL;
123
fd2adb88 124 if(fBlockList) {
125 fBlockList->Clear();
126 delete fBlockList;
127 }
128 fBlockList = NULL;
129
1ad3c9f4 130 if ( fAsyncBlockList ) {
3186f991 131 fAsyncBlockList->Delete();
1ad3c9f4 132 delete fAsyncBlockList;
133 }
134 fAsyncBlockList = NULL;
135}
136
137//##################################################################################
138Int_t AliHLTHOMERManager::Initialize() {
139 // see header file for class documentation
140
fd2adb88 141 HLTInfo("Initializing");
142
1ad3c9f4 143 Int_t iResult = 0;
144
145 // -- Initialize ProxyHandler
146 if ( !fProxyHandler )
147 fProxyHandler = new AliHLTHOMERProxyHandler();
148
149 if ( fProxyHandler ) {
150 iResult = fProxyHandler->Initialize();
151 if (iResult)
152 HLTError(Form("Initialize of ProxyHandler failed."));
fd2adb88 153
154 } else {
1ad3c9f4 155 iResult = -1;
156 HLTError(Form("Creating of ProxyHandler failed."));
157 }
158
159 // -- Initialize ReaderList
160 // List ist not owner, as reader have to be created/deleted by the LibManager
161 if( !fReaderList )
162 fReaderList = new TList();
163
164 // -- Initialize asynchronous BlockList
165 if( !fAsyncBlockList ) {
166 fAsyncBlockList = new TList();
6c1e30ef 167 fAsyncBlockList->SetOwner(kTRUE);
1ad3c9f4 168 }
169
fd2adb88 170 //initialize normal block list
171 if( !fBlockList ) {
172 fBlockList = new TList();
173 fBlockList->SetOwner(kFALSE);
174 }
175
1ad3c9f4 176 // -- Initialize Event Buffer and EventID array
177 if ( !fEventBuffer ) {
178 fEventBuffer = new TClonesArray( "TList", BUFFERSIZE );
179 }
180
181 for ( Int_t idx = 0; idx < BUFFERSIZE; ++idx ) {
182 new ((*fEventBuffer)[idx]) TList( );
183 (reinterpret_cast<TList*>((*fEventBuffer)[idx]))->SetOwner(kTRUE);
184
185 fEventID[idx] = 0;
186 }
187
188 return iResult;
189}
190
191/*
192 * ---------------------------------------------------------------------------------
193 * Source Handling
194 * ---------------------------------------------------------------------------------
195 */
196
197//##################################################################################
198Int_t AliHLTHOMERManager::CreateSourcesList() {
199 // see header file for class documentation
200
201 Int_t iResult = 0;
fd2adb88 202
1ad3c9f4 203 if ( fSourceList != NULL )
204 delete fSourceList;
205 fSourceList = NULL;
206
207 fSourceList = new TList();
208 fSourceList->SetOwner( kTRUE );
209
210 iResult = fProxyHandler->FillSourceList( fSourceList );
211 if ( iResult < 0 ) {
212 HLTWarning(Form("There have been errors, while creating the sources list."));
213 }
214 else if ( iResult > 0 ) {
215 HLTWarning(Form("No active services found."));
216 }
217 else if ( fSourceList->IsEmpty() ) {
218 HLTWarning(Form("No active services in the list."));
219 iResult = 2;
220 }
221 else {
222 HLTInfo(Form("New sources list created."));
223
224 // -- New SourceList has been created
225 // --> All Sources are new --> State has changed
226 fStateHasChanged = kTRUE;
227 }
228
229 return iResult;
230}
231
232//##################################################################################
233void AliHLTHOMERManager::SetSourceState( AliHLTHOMERSourceDesc * source, Bool_t state ) {
234 // see header file for class documentation
235
236 if ( source->IsSelected() != state ) {
237 source->SetState( state );
238 fStateHasChanged = kTRUE;
239 }
240
241 return;
242}
243
244/*
245 * ---------------------------------------------------------------------------------
246 * Connection Handling - public
247 * ---------------------------------------------------------------------------------
248 */
249
250//##################################################################################
251Int_t AliHLTHOMERManager::ConnectHOMER( TString detector ){
252 // see header file for class documentation
253
254 Int_t iResult = 0;
255
ed45b754 256 // HAck Jochen
257 //----
258 detector="ALL";
259
1ad3c9f4 260 // -- Check if LibManager is present
261 if ( ! fLibManager ) {
262 HLTError(Form("No LibManager present."));
263 return -1;
264 }
265
266 // -- Check if already connected and state has not changed
267 if ( fStateHasChanged == kFALSE && IsConnected() ) {
268 HLTInfo(Form("No need for reconnection."));
269 return 0;
270 }
271
272 // -- If already connected, disconnect before connect
273 // or if ReaderList already filled
33791895 274 if ( IsConnected() || fReaderList->GetSize() != 0 ) {
275 HLTInfo(Form("IsConnected: %d fReaderList.Size: %d", IsConnected(), fReaderList->GetSize()));
1ad3c9f4 276 DisconnectHOMER();
33791895 277 }
1ad3c9f4 278 // -- Create the Readoutlist
279 UShort_t* sourcePorts = new UShort_t [fSourceList->GetEntries()];
280 const Char_t ** sourceHostnames = new const Char_t* [fSourceList->GetEntries()];
281 UInt_t sourceCount = 0;
282
283 CreateReadoutList( sourceHostnames, sourcePorts, sourceCount, detector );
284 if ( sourceCount == 0 ) {
285 HLTError(Form("No sources selected, aborting."));
286 return -2;
287 }
288
289 // ***
290 // *** Connect to data sources
291 // ***
292
293 for (UInt_t idx = 0; idx < sourceCount; idx++) {
294
fd2adb88 295 if (sourcePorts[idx] > 60000)
296 continue;
297
1ad3c9f4 298 HLTInfo(Form("Adding source %d as %s : %d", idx, sourceHostnames[idx], sourcePorts[idx]));
299
300 fReaderList->Add(dynamic_cast<TObject*>(fLibManager->OpenReader(sourceHostnames[idx], sourcePorts[idx])));
301 AliHLTHOMERReader *reader = static_cast<AliHLTHOMERReader*>(fReaderList->Last());
302 if ( !reader ) {
303 HLTError(Form("Adding reader failed, aborting"));
304 return -3;
305 }
306
307 if ( (iResult = reader->GetConnectionStatus()) ) {
308
309 // -- Connection to source failed
310
311 HLTError(Form("Error establishing connection to TCP source %s:%hu: %s (%d)",
312 sourceHostnames[idx], sourcePorts[idx], strerror(iResult), iResult));
313
314 if( !(TString(sourceHostnames[idx]).CompareTo("localhost")) ) {
315 HLTInfo("The failed connection is on localhost. is SSH tunnel up????? ");
316 HLTInfo(Form("Do: 'ssh -L %d:alihlt-vobox0.cern.ch:%d cernUser@lxplus.cern.ch -fN'",
317 sourcePorts[idx], sourcePorts[idx]));
318 }
319
320 // -- Remove reader
321 fReaderList->RemoveLast();
322
323 if ( reader )
324 fLibManager->DeleteReader( reader );
325 reader = NULL;
326
327 HLTInfo(Form("Removed source %d, %s : %d from sourceList", idx, sourceHostnames[idx], sourcePorts[idx]));
328
329 }
330 else {
331 // -- Connection succeded
332 fConnected = kTRUE;
333
334 HLTInfo(Form("Connection established to source %s on port %d", sourceHostnames[idx], sourcePorts[idx]));
335 }
336
337 } // for (Int_t idx = 0; idx < sourceCount; idx++) {
338
339 delete[] sourceHostnames;
340 delete[] sourcePorts;
341
342 return iResult;
343
344}
345
346//##################################################################################
347void AliHLTHOMERManager::DisconnectHOMER(){
348 // see header file for class documentation
349
33791895 350 HLTInfo("Disconnecting");
1ad3c9f4 351
352 if ( fReaderList && fLibManager ) {
33791895 353 HLTInfo("Deleting readerlist and libmanager");
1ad3c9f4 354 TIter next(fReaderList);
355 TObject * object = NULL;
356 while ( ( object = next()) )
357 fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );
358
33791895 359
360 HLTInfo(Form("fReaderList size %d", fReaderList->GetSize()));
1ad3c9f4 361 fReaderList->Clear();
33791895 362 HLTInfo(Form("fReaderList size %d", fReaderList->GetSize()));
1ad3c9f4 363 delete fReaderList;
33791895 364 fReaderList = new TList ();
365 HLTInfo(Form("fReaderList size %d", fReaderList->GetSize()));
1ad3c9f4 366 }
367
368 fStateHasChanged = kTRUE;
369 fConnected = kFALSE;
33791895 370
1ad3c9f4 371 HLTInfo(Form("Connection closed."));
372
373 return;
374}
375
376//##################################################################################
377Int_t AliHLTHOMERManager::ReconnectHOMER( TString detector="" ){
378 // see header file for class documentation
379
380 Int_t iResult = 0;
381
382 if ( IsConnected() )
383 DisconnectHOMER();
384
385 iResult = ConnectHOMER(detector);
386 if ( iResult ) {
387 HLTError(Form("Error reconnecting."));
388 }
389
390 return iResult;
391}
392
393/*
394 * ---------------------------------------------------------------------------------
395 * Event Handling - public
396 * ---------------------------------------------------------------------------------
397 */
398
399//##################################################################################
400Int_t AliHLTHOMERManager::NextEvent(){
401
402 // see header file for class documentation
403
1ad3c9f4 404 Int_t iResult = 0;
405 Int_t iRetryCount = 0;
406
33791895 407 if ( !IsConnected() || fStateHasChanged ) {
408 HLTInfo("Not connected or state has changed, returning to AliEveHOMERManager, which will deal with this situation");
409 // cout << "connectecd " << IsConnected() << "haschanged "<<fStateHasChanged << endl;
410 return 55;//ConnectHOMER();
411 }
1ad3c9f4 412 if ( !IsConnected() ) {
413 HLTWarning(Form( "Not connected yet." ));
414 return -1;
415 }
416
417 // -- Reset asyncronous BlockList
3186f991 418 fAsyncBlockList->Delete();
1ad3c9f4 419
420 // ***
421 // *** Loop over all readers and get new event data
422 // ***
423
424 TIter next(fReaderList);
425 TObject * object = NULL;
426
427 while( (object = next()) ) {
428
429 fCurrentReader = static_cast<AliHLTHOMERReader*>(object);
430
431 // -- Read next event data and error handling for HOMER (error codes and empty blocks)
432 while ( 1 ) {
433
434 iResult = fCurrentReader->ReadNextEvent( 40000000 /*timeout in us*/);
435
436 if ( iResult == 111 || iResult == 32 || iResult == 6 ) {
437 HLTError(Form("No connection to source %d: %s (%d)",
438 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
439 break;
440 }
441 else if ( iResult == 110 ) {
442 HLTError(Form("Timeout occured, reading event from source %d: %s (%d)",
443 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
444 break;
445 }
446 else if ( iResult == 56 ) {
447 ++iRetryCount;
448
449 if ( iRetryCount >= 20 ) {
450 HLTError(Form("Retry Failed: Error reading event from source %d: %s (%d), returning",
451 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
452 break;
453 }
454 else {
455 HLTError(Form("Retry: Error reading event from source %d: %s (%d), making another attempt (no %d out of 20)",
456 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult, iRetryCount));
457 //break;
458 continue;
459 }
460 }
461 else if ( iResult ) {
462 HLTError(Form("General Error reading event from source %d: %s (%d), giving up",
463 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
464 fConnected = kFALSE;
465 break;
466 }
467 else {
33791895 468 HLTDebug("Successfully read out event from source");
1ad3c9f4 469 break;
470 }
471
472 } // while( 1 ) {
473
1ad3c9f4 474 // -- Check if event could be read
33791895 475 if ( iResult ) {
476 HLTInfo("Reading event from source failed");
1ad3c9f4 477 continue;
33791895 478 }
479
1ad3c9f4 480 // -- Handle Blocks from current reader
481 iResult = HandleBlocks();
482 if ( iResult ) {
483 HLTError(Form("Handling of blocks failed."));
484 }
485
486 } // while( (object = next()) ) {
487
fd2adb88 488 return 0;
1ad3c9f4 489}
490
491/* ---------------------------------------------------------------------------------
492 * Buffer Handling - public
493 * ---------------------------------------------------------------------------------
494 */
495
496//##################################################################################
497Int_t AliHLTHOMERManager::NavigateEventBufferBack() {
498 // see header file for class documentation
499
500 // -- reached the end of the buffer
501 if ( fNavigateBufferIdx == fBufferLowIdx )
502 return -1;
503
504 Int_t newIdx = fNavigateBufferIdx - 1;
505 if ( newIdx == -1 )
506 newIdx = BUFFERSIZE-1;
507
508 fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
509
510 return newIdx;
511}
512
513//##################################################################################
514Int_t AliHLTHOMERManager::NavigateEventBufferFwd() {
515 // see header file for class documentation
516
fd2adb88 517 HLTInfo(Form("fNavigateBufferIdx: %d, fCurrentBufferIdx %d, fBufferTopIdx %d", fNavigateBufferIdx, fCurrentBufferIdx, fBufferTopIdx));
518
1ad3c9f4 519 // -- reached the top of the buffer
520 if ( fNavigateBufferIdx == fBufferTopIdx )
521 return -1;
522
523 Int_t newIdx = fNavigateBufferIdx + 1;
524 if ( newIdx == BUFFERSIZE )
525 newIdx = 0;
526
527 fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
fd2adb88 528 fNEventsAvailable -= 1;
1ad3c9f4 529
fd2adb88 530 HLTInfo(Form("fNavigateBufferIdx: %d, fCurrentBufferIdx %d, fBufferTopIdx %d", fNavigateBufferIdx, fCurrentBufferIdx, fBufferTopIdx));
531
532
533 return 0;
1ad3c9f4 534}
535
536 ///////////////////////////////////////////////////////////////////////////////////
537
538/*
539 * ---------------------------------------------------------------------------------
540 * Connection Handling - private
541 * ---------------------------------------------------------------------------------
542 */
543
544//##################################################################################
545void AliHLTHOMERManager::CreateReadoutList( const char** sourceHostnames, UShort_t *sourcePorts,
546 UInt_t &sourceCount, TString detector ){
547 // see header file for class documentation
548
549 AliHLTHOMERSourceDesc * source= NULL;
550
551 // -- Read all sources and check if they should be read out
552 TIter next( fSourceList );
553 while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
554
fd2adb88 555 ///Don't use sources from dev cluster
556 if(source->GetPort() > 60000) continue;
557
1ad3c9f4 558 // -- If detector NO detector name given
559 if ( ! detector.CompareTo("ALL") ) {
560 // -- Continue if source is not selected
ed45b754 561 // HACK Jochen
562 //if ( ! source->IsSelected() )
563 // continue;
1ad3c9f4 564 }
565 // -- DetectorName given
566 else {
567 // -- Continue if detector name doesn't match
568 if ( detector.CompareTo(source->GetDetector()) )
569 continue;
570 else
571 source->Select();
572 }
573
574 Bool_t exists = kFALSE;
575
576 // -- Loop over existing entries and check if entry is already in readout list
577 for ( UInt_t ii = 0; ii < sourceCount; ii++ ){
578 if ( !strcmp( sourceHostnames[ii], source->GetHostname().Data() )
579 && sourcePorts[ii] == source->GetPort() ) {
580 exists = kTRUE;
581 break;
582 }
583 }
584
585 // -- Add new entires to readout list
586 if ( ! exists ) {
587 sourcePorts[sourceCount] = source->GetPort();
588 sourceHostnames[sourceCount] = source->GetHostname().Data();
589 sourceCount++;
590 }
591
592 } // while ( ( source = (AliHLTHOMERSourceDesc*)next() ) ) {
593
594 fStateHasChanged = kFALSE;
595
596 return;
597}
598
599/*
600 * ---------------------------------------------------------------------------------
601 * Buffer Handling - private
602 * ---------------------------------------------------------------------------------
603 */
604
605//##################################################################################
606void AliHLTHOMERManager::AddBlockListToBuffer() {
607 // see header file for class documentation
1ad3c9f4 608 // -- Check if event is already in buffer
609 ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());
610
611 if ( fEventID[fBufferTopIdx] == eventID ) {
6fe8cb30 612 HLTInfo(Form("Event 0x%016lX (%lu) already in buffer.", eventID, eventID));
1ad3c9f4 613 return;
614 }
615
616 // -- Check if event should be selected on basis of trigger string
617 if( fTriggerString.CompareTo("ALL") ){
618 if ( !CheckTriggerDecision() ) {
a7d9e86f 619 HLTInfo("Event not triggered");
1ad3c9f4 620 return;
a7d9e86f 621 } else {
622 HLTInfo("Event triggered");
1ad3c9f4 623 }
624 }
625 else {
33791895 626 HLTDebug("No trigger selection.");
1ad3c9f4 627 }
628
629 // -- Set Top mark
630 ++fBufferTopIdx;
631 if ( fBufferTopIdx == BUFFERSIZE )
632 fBufferTopIdx = 0;
633
634 // -- Change the low mark if necessary
635 if ( fBufferLowIdx == -1 )
636 fBufferLowIdx = 0;
637 else if ( fBufferTopIdx == fBufferLowIdx ) {
638 ++fBufferLowIdx;
639 if ( fBufferLowIdx == BUFFERSIZE )
640 fBufferLowIdx = 0;
641 }
642
1ad3c9f4 643
644 // -- Fill EventID
645 fEventID[fBufferTopIdx] = eventID;
646
647 // -- Clear Buffer slot
648 (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Clear();
fd2adb88 649 if(fBlockList->IsOwner()) HLTWarning("block list is owner!!");
650 HLTInfo(Form("fBlockList size %d", fBlockList->GetSize()));
651 //fBlockList->Clear();
652 fBlockList = new TList();
653 HLTInfo(Form("fBlockList size %d", fBlockList->GetSize()));
1ad3c9f4 654
655 GetFirstBlk();
656
657 // -- Fill block list
658 do {
659
660 // -- Create new block
661 AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
662 block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
663 GetBlkType(), GetBlkSpecification() );
664
665 // -- Check sources list if block is requested
666 if ( CheckIfRequested( block ) ) {
667 (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
fd2adb88 668 fBlockList->Add(block);
1ad3c9f4 669 }
670 else {
671 // XXX HACK Jochen
672 (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
fd2adb88 673 fBlockList->Add(block);
1ad3c9f4 674 // delete block;
675 // block = NULL;
676 }
677
678 } while( GetNextBlk() );
679
fd2adb88 680 //We have one more event available
681 fNEventsAvailable++;
682 HLTInfo(Form("fNEventsAvailable %d", fNEventsAvailable));
1ad3c9f4 683 return;
684}
685
686//##################################################################################
687void AliHLTHOMERManager::AddToAsyncBlockList() {
688 // see header file for class documentation
689
690 HLTInfo("Adding blocks to the asynchroneous block list");
691
1ad3c9f4 692 GetFirstBlk();
693
1ad3c9f4 694 do {
695
1ad3c9f4 696 AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
697 block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
698 GetBlkType(), GetBlkSpecification() );
699
fd2adb88 700
701 fAsyncBlockList->Add( block );
1ad3c9f4 702
703 } while( GetNextBlk() );
704
705 return;
706}
fd2adb88 707//__________________________________________________________________________________
708void AliHLTHOMERManager::AddToBlockList() {
709 // see header file for class documentation
710 HLTInfo("Adding blocks to the synchroneous block list");
711
71453f7e 712 ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());
fd2adb88 713
71453f7e 714 if ( fEventId == eventID ) {
715 HLTInfo(Form("Event 0x%016lX (%lu) already in buffer.", eventID, eventID));
716 return;
717 }
718
719 fEventId = eventID;
720
fd2adb88 721 GetFirstBlk();
722 do {
723
724 AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
725 block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
726 GetBlkType(), GetBlkSpecification() );
727 fBlockList->Add( block );
728
729 } while( GetNextBlk() );
730}
731
732//__________________________________________________________________________________
1ad3c9f4 733TList* AliHLTHOMERManager::GetBlockListEventBuffer( Int_t idx ) {
734 // see header file for class documentation
735
fd2adb88 736 if(fBlockList)
737 return fBlockList;
738 else
1ad3c9f4 739 return NULL;
740
fd2adb88 741 if ( idx == -1 )
742 return NULL;
743
1ad3c9f4 744 return reinterpret_cast<TList*>((*fEventBuffer)[idx]);
745
746}
747
1ad3c9f4 748
fd2adb88 749//__________________________________________________________________________________
1ad3c9f4 750Int_t AliHLTHOMERManager::HandleBlocks() {
751 // see header file for class documentation
752
753 Int_t iResult = 0;
754
755 // -- Get blockCnt and eventID
756 fNBlks = static_cast<ULong_t>(fCurrentReader->GetBlockCnt());
757 ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());
758 fCurrentBlk = 0;
759
760 // -- Check if blocks present
761 if ( fNBlks == 0 ) {
6fe8cb30 762 HLTWarning(Form("Event 0x%016lX (%lu) with no blocks", eventID, eventID));
1ad3c9f4 763 return -1;
764 }
765
6fe8cb30 766 HLTInfo(Form("Event 0x%016lX (%lu) with %lu blocks", eventID, eventID, fNBlks));
1ad3c9f4 767
fd2adb88 768 if ( IsSyncBlocks() ) {
769 //AddBlockListToBuffer();
c8fc4838 770 fBlockList->Clear();
fd2adb88 771 AddToBlockList();
772 } else {
773 AddToAsyncBlockList();
774 }
1ad3c9f4 775
1ad3c9f4 776 return iResult;
777}
778
fd2adb88 779//__________________________________________________________________________________
1ad3c9f4 780Bool_t AliHLTHOMERManager::IsSyncBlocks() {
781 // see header file for class documentation
782
783 Bool_t bResult = kFALSE;
784
785 GetFirstBlk();
786
6c1e30ef 787 do {
788
789 if ( !GetBlkType().CompareTo("ALIESDV0")) {
1ad3c9f4 790 bResult = kTRUE;
791 break;
1ad3c9f4 792 }
c8fc4838 793
794 if ( !GetBlkType().CompareTo("GLOBTRIG")) {
795 bResult = kTRUE;
796 break;
797 }
1ad3c9f4 798
799 if ( !GetBlkType().CompareTo("ROOTTOBJ") ) {
800 AliHLTHOMERBlockDesc blockDesc;
801
802 blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
803 GetBlkType(), GetBlkSpecification() );
804 if ( !blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
805
806 bResult = kTRUE;
807 break;
808 }
809 }
810
811 } while( GetNextBlk() );
812
813
814 return bResult;
815}
816
817//##################################################################################
818void* AliHLTHOMERManager::GetBlk( Int_t ndx ) {
819 // see header file for class documentation
820 // Get pointer to current block in current event
821
822 if ( !fCurrentReader || !IsConnected() ) {
823 HLTError(Form("Not connected yet."));
824 return NULL;
825 }
826 if ( ndx < static_cast<Int_t>(fNBlks) )
827 return const_cast<void*> (fCurrentReader->GetBlockData(ndx));
828 else
829 return NULL;
830}
831
832//##################################################################################
833ULong_t AliHLTHOMERManager::GetBlkSize( Int_t ndx ) {
834 // see header file for class documentation
835
836 if ( !fCurrentReader || !IsConnected() ) {
837 HLTError(Form("Not connected yet."));
838 return 0;
839 }
840
841 if ( ndx < static_cast<Int_t>(fNBlks) )
842 return static_cast<ULong_t> (fCurrentReader->GetBlockDataLength(ndx));
843 else
844 return 0;
845}
846
847//##################################################################################
848TString AliHLTHOMERManager::GetBlkOrigin( Int_t ndx ) {
849 // see header file for class documentation
850
851 TString origin = "";
852
853 // -- Check for Connection
854 if ( !fCurrentReader || ! IsConnected() ) {
855 HLTError(Form("Not connected yet."));
856 return origin;
857 }
858
859 // -- Check block index
860 if ( ndx >= static_cast<Int_t>(fNBlks) ) {
861 HLTError(Form("Block index %d out of range.", ndx ));
862 return origin;
863 }
864
865 // -- Get origin
866 union{
867 UInt_t data;
868 Char_t array[4];
869 } reverseOrigin;
870
871 reverseOrigin.data = static_cast<UInt_t>(fCurrentReader->GetBlockDataOrigin(ndx));
872
873 // -- Reverse the order
874 for (Int_t ii = 3; ii >= 0; ii-- )
875 if ( reverseOrigin.array[ii] != ' ')
876 origin.Append( reverseOrigin.array[ii] );
877
878 origin.Remove( TString::kTrailing, ' ' );
879
880 return origin;
881}
882
883//##################################################################################
884TString AliHLTHOMERManager::GetBlkType( Int_t ndx ) {
885 // see header file for class documentation
886
887 TString type = "";
888
889 // -- Check for Connection
890 if ( !fCurrentReader || ! IsConnected() ) {
891 HLTError(Form("Not connected yet."));
892 return type;
893 }
894
895 // -- Check block index
896 if ( ndx >= static_cast<Int_t>(fNBlks) ) {
897 HLTError(Form("Block index %d out of range.", ndx ));
898 return type;
899 }
900
901 // -- Get type
902 union{
903 ULong64_t data;
904 Char_t array[8];
905 } reverseType;
906
907 reverseType.data = static_cast<ULong64_t> (fCurrentReader->GetBlockDataType(ndx));
908
909 // -- Reverse the order
910 for (Int_t ii = 7; ii >= 0; ii-- )
911 if ( reverseType.array[ii] != ' ')
912 type.Append( reverseType.array[ii] );
913
914 type.Remove( TString::kTrailing, ' ' );
915
916 return type;
917}
918
919//##################################################################################
920ULong_t AliHLTHOMERManager::GetBlkSpecification( Int_t ndx ) {
921 // see header file for class documentation
922
923 // -- Check for Connection
924 if ( !fCurrentReader || ! IsConnected() ) {
925 HLTError(Form("Not connected yet."));
926 return 0;
927 }
928
929 // -- Check block index
930 if ( ndx >= static_cast<Int_t>(fNBlks) ) {
931 HLTError(Form("Block index %d out of range.", ndx ));
932 return 0;
933 }
934
935 return static_cast<ULong_t>(fCurrentReader->GetBlockDataSpec(ndx));
936}
937
938//##################################################################################
939Bool_t AliHLTHOMERManager::CheckIfRequested( AliHLTHOMERBlockDesc * block ) {
940 // see header file for class documentation
941
942 Bool_t requested = kFALSE;
943
944 AliHLTHOMERSourceDesc * source= NULL;
945
946 // -- Read all sources and check if they should be read out
947 TIter next( fSourceList );
948 while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
949
950 // -- Check if source is selected
951 if ( ! source->IsSelected() )
952 continue;
953
954 // -- Check if detector matches
955 if ( source->GetSourceName().CompareTo( block->GetBlockName() ) )
956 continue;
957
958 requested = kTRUE;
959 break;
960
961 } // while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
962
963#if EVE_DEBUG
964 if ( requested ) {
965 HLTInfo(Form("Block requested : %s", block->GetBlockName().Data()));
966 }
967 else {
968 HLTInfo(Form("Block NOT requested : %s", block->GetBlockName().Data()));
969 }
970#endif
971
972 return requested;
973}
974
975/* ---------------------------------------------------------------------------------
976 * Trigger Handling - private
977 * ---------------------------------------------------------------------------------
978 */
979
980//##################################################################################
981Bool_t AliHLTHOMERManager::CheckTriggerDecision() {
982 // see header file for class documentation
983
984 Bool_t triggered = kFALSE;
985
986 if ( !fCurrentReader || !IsConnected() ) {
987 HLTError(Form("Not connected yet."));
dc466800 988 return kFALSE;
1ad3c9f4 989 }
990
991 AliHLTHOMERBlockDesc blockDesc;
992
993 GetFirstBlk();
994
995 // -- Fill block list
996 Bool_t foundTriggerBlock = kFALSE;
997
998 do {
999 if ( (GetBlkType().CompareTo("ROOTTOBJ") == 0) ) {
1000 blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
1001 GetBlkType(), GetBlkSpecification() );
1002
1003 if ( ! blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
1004
1005 foundTriggerBlock = kTRUE;
1006 break;
1007 }
1008
1009 }
1010 } while( GetNextBlk() );
1011
1012 if ( !foundTriggerBlock ) {
1013 HLTError(Form("No trigger decision object found"));
1014 return kFALSE;
1015 }
1016
1017 // -- Get the global decision object
1018 AliHLTGlobalTriggerDecision* globalDecision =
1019 static_cast<AliHLTGlobalTriggerDecision*>(blockDesc.GetTObject());
1020
1021 if ( fTriggerString.CompareTo("HLTGlobalTrigger") == 0 ) {
1022 triggered = globalDecision->EventTriggered();
1023 }
1024 else {
1025
1026 for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {
1027
1028 const AliHLTTriggerDecision* triggerDecision =
1029 reinterpret_cast<const AliHLTTriggerDecision*>(globalDecision->InputObject(idx));
1030
1031 if ( !(fTriggerString.CompareTo(triggerDecision->Description())) ) {
1032 triggered = triggerDecision->EventTriggered();
1033 break;
1034 }
1035 } // for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {
1036 }
1037
1038
1039
1040 if ( triggered ) {
1041 fRetryNextEvent = kFALSE;
1042 fNEventsNotTriggered = 0;
1043 }
1044 else {
1045 fRetryNextEvent = kTRUE;
1046 ++fNEventsNotTriggered;
1047 }
1048
1049 return triggered;
1050}