2 // $Id: AliHLTHOMERManager.cxx $
\r
3 //**************************************************************************
\r
4 //* This file is property of and copyright by the ALICE HLT Project *
\r
5 //* ALICE Experiment at CERN, All rights reserved. *
\r
7 //* Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
\r
8 //* for The ALICE HLT Project. *
\r
10 //* Permission to use, copy, modify and distribute this software and its *
\r
11 //* documentation strictly for non-commercial purposes is hereby granted *
\r
12 //* without fee, provided that the above copyright notice appears in all *
\r
13 //* copies and that both the copyright notice and this permission notice *
\r
14 //* appear in the supporting documentation. The authors make no claims *
\r
15 //* about the suitability of this software for any purpose. It is *
\r
16 //* provided "as is" without express or implied warranty. *
\r
17 //**************************************************************************
\r
19 /** @file AliHLTHOMERManager.cxx
\r
20 @author Jochen Thaeder
\r
22 @brief Manger for HOMER in aliroot
\r
25 // see header file for class documentation
\r
27 // refer to README to build package
\r
29 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
\r
32 using namespace std;
\r
37 #include "AliHLTHOMERManager.h"
\r
38 // -- -- -- -- -- -- --
\r
39 #include "AliHLTHOMERLibManager.h"
\r
40 #include "AliHLTHOMERSourceDesc.h"
\r
41 #include "AliHLTHOMERBlockDesc.h"
\r
42 // -- -- -- -- -- -- --
\r
43 #include "AliHLTGlobalTriggerDecision.h"
\r
44 #include "AliHLTTriggerDecision.h"
\r
45 //---------------------------
\r
47 ClassImp(AliHLTHOMERManager)
\r
50 * ---------------------------------------------------------------------------------
\r
51 * Constructor / Destructor
\r
52 * ---------------------------------------------------------------------------------
\r
55 //##################################################################################
\r
56 AliHLTHOMERManager::AliHLTHOMERManager() :
\r
57 fLibManager(new AliHLTHOMERLibManager),
\r
58 fStateHasChanged(kTRUE),
\r
59 fProxyHandler(NULL),
\r
60 fCurrentReader(NULL),
\r
66 fAsyncBlockList(NULL),
\r
70 fCurrentBufferIdx(-1),
\r
71 fNavigateBufferIdx(-1),
\r
72 fConnected(kFALSE),
\r
73 fTriggerString("ALL"),
\r
74 fNEventsNotTriggered(0),
\r
75 fRetryNextEvent(kFALSE) {
\r
76 // see header file for class documentation
\r
78 // refer to README to build package
\r
80 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
\r
84 //##################################################################################
\r
85 AliHLTHOMERManager::~AliHLTHOMERManager() {
\r
86 // see header file for class documentation
\r
88 if ( fLibManager ) {
\r
90 if ( fReaderList ) {
\r
91 TIter next(fReaderList);
\r
92 TObject * object = NULL;
\r
93 while ( ( object = next()) )
\r
94 fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );
\r
96 fReaderList->Clear();
\r
99 fReaderList = NULL;
\r
101 delete fLibManager;
\r
103 fLibManager = NULL;
\r
105 if ( fProxyHandler != NULL )
\r
106 delete fProxyHandler;
\r
107 fProxyHandler = NULL;
\r
109 if ( fSourceList != NULL )
\r
110 delete fSourceList;
\r
111 fSourceList = NULL;
\r
113 if ( fEventBuffer ) {
\r
114 fEventBuffer->Clear();
\r
115 delete fEventBuffer;
\r
117 fEventBuffer = NULL;
\r
119 if ( fAsyncBlockList ) {
\r
120 fAsyncBlockList->Clear();
\r
121 delete fAsyncBlockList;
\r
123 fAsyncBlockList = NULL;
\r
126 //##################################################################################
\r
127 Int_t AliHLTHOMERManager::Initialize() {
\r
128 // see header file for class documentation
\r
132 // -- Initialize ProxyHandler
\r
133 if ( !fProxyHandler )
\r
134 fProxyHandler = new AliHLTHOMERProxyHandler();
\r
136 if ( fProxyHandler ) {
\r
137 iResult = fProxyHandler->Initialize();
\r
139 HLTError(Form("Initialize of ProxyHandler failed."));
\r
143 HLTError(Form("Creating of ProxyHandler failed."));
\r
146 // -- Initialize ReaderList
\r
147 // List ist not owner, as reader have to be created/deleted by the LibManager
\r
149 fReaderList = new TList();
\r
151 // -- Initialize asynchronous BlockList
\r
152 if( !fAsyncBlockList ) {
\r
153 fAsyncBlockList = new TList();
\r
154 fAsyncBlockList->SetOwner(kFALSE);
\r
157 // -- Initialize Event Buffer and EventID array
\r
158 if ( !fEventBuffer ) {
\r
159 fEventBuffer = new TClonesArray( "TList", BUFFERSIZE );
\r
162 for ( Int_t idx = 0; idx < BUFFERSIZE; ++idx ) {
\r
163 new ((*fEventBuffer)[idx]) TList( );
\r
164 (reinterpret_cast<TList*>((*fEventBuffer)[idx]))->SetOwner(kTRUE);
\r
173 * ---------------------------------------------------------------------------------
\r
175 * ---------------------------------------------------------------------------------
\r
178 //##################################################################################
\r
179 Int_t AliHLTHOMERManager::CreateSourcesList() {
\r
180 // see header file for class documentation
\r
184 if ( fSourceList != NULL )
\r
185 delete fSourceList;
\r
186 fSourceList = NULL;
\r
188 fSourceList = new TList();
\r
189 fSourceList->SetOwner( kTRUE );
\r
191 iResult = fProxyHandler->FillSourceList( fSourceList );
\r
192 if ( iResult < 0 ) {
\r
193 HLTWarning(Form("There have been errors, while creating the sources list."));
\r
195 else if ( iResult > 0 ) {
\r
196 HLTWarning(Form("No active services found."));
\r
198 else if ( fSourceList->IsEmpty() ) {
\r
199 HLTWarning(Form("No active services in the list."));
\r
203 HLTInfo(Form("New sources list created."));
\r
205 // -- New SourceList has been created
\r
206 // --> All Sources are new --> State has changed
\r
207 fStateHasChanged = kTRUE;
\r
213 //##################################################################################
\r
214 void AliHLTHOMERManager::SetSourceState( AliHLTHOMERSourceDesc * source, Bool_t state ) {
\r
215 // see header file for class documentation
\r
217 if ( source->IsSelected() != state ) {
\r
218 source->SetState( state );
\r
219 fStateHasChanged = kTRUE;
\r
226 * ---------------------------------------------------------------------------------
\r
227 * Connection Handling - public
\r
228 * ---------------------------------------------------------------------------------
\r
231 //##################################################################################
\r
232 Int_t AliHLTHOMERManager::ConnectHOMER( TString detector ){
\r
233 // see header file for class documentation
\r
237 // -- Check if LibManager is present
\r
238 if ( ! fLibManager ) {
\r
239 HLTError(Form("No LibManager present."));
\r
243 // -- Check if already connected and state has not changed
\r
244 if ( fStateHasChanged == kFALSE && IsConnected() ) {
\r
245 HLTInfo(Form("No need for reconnection."));
\r
249 // -- If already connected, disconnect before connect
\r
250 // or if ReaderList already filled
\r
251 if ( IsConnected() || fReaderList->GetSize() != 0 )
\r
254 // -- Create the Readoutlist
\r
255 UShort_t* sourcePorts = new UShort_t [fSourceList->GetEntries()];
\r
256 const Char_t ** sourceHostnames = new const Char_t* [fSourceList->GetEntries()];
\r
257 UInt_t sourceCount = 0;
\r
259 CreateReadoutList( sourceHostnames, sourcePorts, sourceCount, detector );
\r
260 if ( sourceCount == 0 ) {
\r
261 HLTError(Form("No sources selected, aborting."));
\r
266 // *** Connect to data sources
\r
269 for (UInt_t idx = 0; idx < sourceCount; idx++) {
\r
271 HLTInfo(Form("Adding source %d as %s : %d", idx, sourceHostnames[idx], sourcePorts[idx]));
\r
273 fReaderList->Add(dynamic_cast<TObject*>(fLibManager->OpenReader(sourceHostnames[idx], sourcePorts[idx])));
\r
274 AliHLTHOMERReader *reader = static_cast<AliHLTHOMERReader*>(fReaderList->Last());
\r
276 HLTError(Form("Adding reader failed, aborting"));
\r
280 if ( (iResult = reader->GetConnectionStatus()) ) {
\r
282 // -- Connection to source failed
\r
284 HLTError(Form("Error establishing connection to TCP source %s:%hu: %s (%d)",
\r
285 sourceHostnames[idx], sourcePorts[idx], strerror(iResult), iResult));
\r
287 if( !(TString(sourceHostnames[idx]).CompareTo("localhost")) ) {
\r
288 HLTInfo("The failed connection is on localhost. is SSH tunnel up????? ");
\r
289 HLTInfo(Form("Do: 'ssh -L %d:alihlt-vobox0.cern.ch:%d cernUser@lxplus.cern.ch -fN'",
\r
290 sourcePorts[idx], sourcePorts[idx]));
\r
293 // -- Remove reader
\r
294 fReaderList->RemoveLast();
\r
297 fLibManager->DeleteReader( reader );
\r
300 HLTInfo(Form("Removed source %d, %s : %d from sourceList", idx, sourceHostnames[idx], sourcePorts[idx]));
\r
304 // -- Connection succeded
\r
305 fConnected = kTRUE;
\r
307 HLTInfo(Form("Connection established to source %s on port %d", sourceHostnames[idx], sourcePorts[idx]));
\r
310 } // for (Int_t idx = 0; idx < sourceCount; idx++) {
\r
312 delete[] sourceHostnames;
\r
313 delete[] sourcePorts;
\r
319 //##################################################################################
\r
320 void AliHLTHOMERManager::DisconnectHOMER(){
\r
321 // see header file for class documentation
\r
323 if ( ! IsConnected() )
\r
326 if ( fReaderList && fLibManager ) {
\r
327 TIter next(fReaderList);
\r
328 TObject * object = NULL;
\r
329 while ( ( object = next()) )
\r
330 fLibManager->DeleteReader(static_cast<AliHLTHOMERReader*>(object) );
\r
332 fReaderList->Clear();
\r
333 delete fReaderList;
\r
334 fReaderList = NULL;
\r
337 fStateHasChanged = kTRUE;
\r
338 fConnected = kFALSE;
\r
340 HLTInfo(Form("Connection closed."));
\r
345 //##################################################################################
\r
346 Int_t AliHLTHOMERManager::ReconnectHOMER( TString detector="" ){
\r
347 // see header file for class documentation
\r
351 if ( IsConnected() )
\r
354 iResult = ConnectHOMER(detector);
\r
356 HLTError(Form("Error reconnecting."));
\r
363 * ---------------------------------------------------------------------------------
\r
364 * Event Handling - public
\r
365 * ---------------------------------------------------------------------------------
\r
368 //##################################################################################
\r
369 Int_t AliHLTHOMERManager::NextEvent(){
\r
371 // see header file for class documentation
\r
375 Int_t iRetryCount = 0;
\r
377 if ( !IsConnected() || fStateHasChanged )
\r
380 if ( !IsConnected() ) {
\r
381 HLTWarning(Form( "Not connected yet." ));
\r
385 // -- Reset asyncronous BlockList
\r
386 fAsyncBlockList->Clear();
\r
389 // *** Loop over all readers and get new event data
\r
392 TIter next(fReaderList);
\r
393 TObject * object = NULL;
\r
395 while( (object = next()) ) {
\r
397 fCurrentReader = static_cast<AliHLTHOMERReader*>(object);
\r
399 // -- Read next event data and error handling for HOMER (error codes and empty blocks)
\r
402 iResult = fCurrentReader->ReadNextEvent( 40000000 /*timeout in us*/);
\r
404 if ( iResult == 111 || iResult == 32 || iResult == 6 ) {
\r
405 HLTError(Form("No connection to source %d: %s (%d)",
\r
406 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
\r
409 else if ( iResult == 110 ) {
\r
410 HLTError(Form("Timeout occured, reading event from source %d: %s (%d)",
\r
411 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
\r
414 else if ( iResult == 56 ) {
\r
417 if ( iRetryCount >= 20 ) {
\r
418 HLTError(Form("Retry Failed: Error reading event from source %d: %s (%d), returning",
\r
419 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
\r
423 HLTError(Form("Retry: Error reading event from source %d: %s (%d), making another attempt (no %d out of 20)",
\r
424 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult, iRetryCount));
\r
429 else if ( iResult ) {
\r
430 HLTError(Form("General Error reading event from source %d: %s (%d), giving up",
\r
431 fCurrentReader->GetErrorConnectionNdx(), strerror(iResult), iResult));
\r
432 fConnected = kFALSE;
\r
442 // -- Check if event could be read
\r
446 // -- Handle Blocks from current reader
\r
447 iResult = HandleBlocks();
\r
449 HLTError(Form("Handling of blocks failed."));
\r
452 } // while( (object = next()) ) {
\r
454 // -- Check if NextEvent should be recalled,
\r
455 // to catch the next event with a trigger
\r
456 if ( fRetryNextEvent ) {
\r
458 fRetryNextEvent = kFALSE;
\r
460 HLTInfo(Form("Checked trigger of %d events, without triggering", fNEventsNotTriggered));
\r
461 return NextEvent();
\r
467 /* ---------------------------------------------------------------------------------
\r
468 * Buffer Handling - public
\r
469 * ---------------------------------------------------------------------------------
\r
472 //##################################################################################
\r
473 Int_t AliHLTHOMERManager::NavigateEventBufferBack() {
\r
474 // see header file for class documentation
\r
476 // -- reached the end of the buffer
\r
477 if ( fNavigateBufferIdx == fBufferLowIdx )
\r
480 Int_t newIdx = fNavigateBufferIdx - 1;
\r
481 if ( newIdx == -1 )
\r
482 newIdx = BUFFERSIZE-1;
\r
484 fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
\r
489 //##################################################################################
\r
490 Int_t AliHLTHOMERManager::NavigateEventBufferFwd() {
\r
491 // see header file for class documentation
\r
493 // -- reached the top of the buffer
\r
494 if ( fNavigateBufferIdx == fBufferTopIdx )
\r
497 Int_t newIdx = fNavigateBufferIdx + 1;
\r
498 if ( newIdx == BUFFERSIZE )
\r
501 fCurrentBufferIdx = fNavigateBufferIdx = newIdx;
\r
506 ///////////////////////////////////////////////////////////////////////////////////
\r
509 * ---------------------------------------------------------------------------------
\r
510 * Connection Handling - private
\r
511 * ---------------------------------------------------------------------------------
\r
514 //##################################################################################
\r
515 void AliHLTHOMERManager::CreateReadoutList( const char** sourceHostnames, UShort_t *sourcePorts,
\r
516 UInt_t &sourceCount, TString detector ){
\r
517 // see header file for class documentation
\r
519 AliHLTHOMERSourceDesc * source= NULL;
\r
521 // -- Read all sources and check if they should be read out
\r
522 TIter next( fSourceList );
\r
523 while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
\r
525 // -- If detector NO detector name given
\r
526 if ( ! detector.CompareTo("ALL") ) {
\r
527 // -- Continue if source is not selected
\r
528 if ( ! source->IsSelected() )
\r
531 // -- DetectorName given
\r
533 // -- Continue if detector name doesn't match
\r
534 if ( detector.CompareTo(source->GetDetector()) )
\r
540 Bool_t exists = kFALSE;
\r
542 // -- Loop over existing entries and check if entry is already in readout list
\r
543 for ( UInt_t ii = 0; ii < sourceCount; ii++ ){
\r
544 if ( !strcmp( sourceHostnames[ii], source->GetHostname().Data() )
\r
545 && sourcePorts[ii] == source->GetPort() ) {
\r
551 // -- Add new entires to readout list
\r
553 sourcePorts[sourceCount] = source->GetPort();
\r
554 sourceHostnames[sourceCount] = source->GetHostname().Data();
\r
558 } // while ( ( source = (AliHLTHOMERSourceDesc*)next() ) ) {
\r
560 fStateHasChanged = kFALSE;
\r
566 * ---------------------------------------------------------------------------------
\r
567 * Buffer Handling - private
\r
568 * ---------------------------------------------------------------------------------
\r
571 //##################################################################################
\r
572 void AliHLTHOMERManager::AddBlockListToBuffer() {
\r
573 // see header file for class documentation
\r
575 // -- Check if event is already in buffer
\r
576 ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());
\r
578 if ( fEventID[fBufferTopIdx] == eventID ) {
\r
579 HLTInfo(Form("Event 0x%016LX (%Lu) already in buffer.", eventID, eventID));
\r
583 // -- Check if event should be selected on basis of trigger string
\r
584 if( fTriggerString.CompareTo("ALL") ){
\r
585 if ( !CheckTriggerDecision() ) {
\r
586 HLTInfo(Form("Event 0x%016LX (%Lu) is not triggered by %s.",
\r
587 eventID, eventID, fTriggerString.Data()));
\r
592 HLTInfo("No trigger selection.");
\r
595 // -- Set Top mark
\r
597 if ( fBufferTopIdx == BUFFERSIZE )
\r
600 // -- Change the low mark if necessary
\r
601 if ( fBufferLowIdx == -1 )
\r
603 else if ( fBufferTopIdx == fBufferLowIdx ) {
\r
605 if ( fBufferLowIdx == BUFFERSIZE )
\r
609 fNavigateBufferIdx = fCurrentBufferIdx = fBufferTopIdx;
\r
612 fEventID[fBufferTopIdx] = eventID;
\r
614 // -- Clear Buffer slot
\r
615 (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Clear();
\r
620 // -- Fill block list
\r
623 // -- Create new block
\r
624 AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
\r
625 block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
\r
626 GetBlkType(), GetBlkSpecification() );
\r
628 // -- Check sources list if block is requested
\r
629 if ( CheckIfRequested( block ) ) {
\r
630 (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
\r
634 (reinterpret_cast<TList*>((*fEventBuffer)[fBufferTopIdx]))->Add( block );
\r
639 } while( GetNextBlk() );
\r
644 //##################################################################################
\r
645 void AliHLTHOMERManager::AddToAsyncBlockList() {
\r
646 // see header file for class documentation
\r
648 HLTInfo("Adding blocks to the asynchroneous block list");
\r
653 // -- Fill block list
\r
657 // -- Create new block
\r
658 AliHLTHOMERBlockDesc * block = new AliHLTHOMERBlockDesc();
\r
659 block->SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
\r
660 GetBlkType(), GetBlkSpecification() );
\r
662 // -- Check sources list if block is requested
\r
663 if ( CheckIfRequested( block ) )
\r
664 fAsyncBlockList->Add( block );
\r
667 fAsyncBlockList->Add( block );
\r
672 } while( GetNextBlk() );
\r
676 //##################################################################################
\r
677 TList* AliHLTHOMERManager::GetBlockListEventBuffer( Int_t idx ) {
\r
678 // see header file for class documentation
\r
683 return reinterpret_cast<TList*>((*fEventBuffer)[idx]);
\r
688 * ---------------------------------------------------------------------------------
\r
689 * Block Handling - private
\r
690 * ---------------------------------------------------------------------------------
\r
693 //##################################################################################
\r
694 Int_t AliHLTHOMERManager::HandleBlocks() {
\r
695 // see header file for class documentation
\r
699 // -- Get blockCnt and eventID
\r
700 fNBlks = static_cast<ULong_t>(fCurrentReader->GetBlockCnt());
\r
701 ULong_t eventID = static_cast<ULong64_t>(fCurrentReader->GetEventID());
\r
704 // -- Check if blocks present
\r
705 if ( fNBlks == 0 ) {
\r
706 HLTWarning(Form("Event 0x%016LX (%Lu) with no blocks", eventID, eventID));
\r
710 HLTInfo(Form("Event 0x%016LX (%Lu) with %lu blocks", eventID, eventID, fNBlks));
\r
713 // Loop for Debug only
\r
714 for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {
\r
715 Char_t tmp1[9], tmp2[5];
\r
716 memset( tmp1, 0, 9 );
\r
717 memset( tmp2, 0, 5 );
\r
718 void *tmp11 = tmp1;
\r
719 ULong64_t* tmp12 = static_cast<ULong64_t*>(tmp11);
\r
720 *tmp12 = fCurrentReader->GetBlockDataType(ii);
\r
721 void *tmp21 = tmp2;
\r
722 ULong_t* tmp22 = static_cast<ULong_t*>(tmp21);
\r
723 *tmp22 = fCurrentReader->GetBlockDataOrigin(ii);
\r
724 HLTInfo(Form( "Block %lu length: %lu - type: %s - origin: %s - spec 0x%08X",
\r
725 ii, fCurrentReader->GetBlockDataLength(ii), tmp1, tmp2, fCurrentReader->GetBlockDataSpec(ii) ));
\r
726 } // end for ( ULong_t ii = 0; ii < fNBlks; ii++ ) {
\r
729 // -- Check if blocks are from syncronous source
\r
731 if ( IsSyncBlocks() )
\r
732 AddBlockListToBuffer();
\r
734 AddToAsyncBlockList();
\r
739 //##################################################################################
\r
740 Bool_t AliHLTHOMERManager::IsSyncBlocks() {
\r
741 // see header file for class documentation
\r
743 Bool_t bResult = kFALSE;
\r
750 // if ( !GetBlkType().CompareTo("ALIESDV0") ||
\r
752 if ( !GetBlkType().CompareTo("ALIESDV0") ||
\r
753 !GetBlkType().CompareTo("CLUSTERS") ) {
\r
760 if ( !GetBlkType().CompareTo("ROOTTOBJ") ) {
\r
761 AliHLTHOMERBlockDesc blockDesc;
\r
763 blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
\r
764 GetBlkType(), GetBlkSpecification() );
\r
765 if ( !blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
\r
772 } while( GetNextBlk() );
\r
778 //##################################################################################
\r
779 void* AliHLTHOMERManager::GetBlk( Int_t ndx ) {
\r
780 // see header file for class documentation
\r
781 // Get pointer to current block in current event
\r
783 if ( !fCurrentReader || !IsConnected() ) {
\r
784 HLTError(Form("Not connected yet."));
\r
787 if ( ndx < static_cast<Int_t>(fNBlks) )
\r
788 return const_cast<void*> (fCurrentReader->GetBlockData(ndx));
\r
793 //##################################################################################
\r
794 ULong_t AliHLTHOMERManager::GetBlkSize( Int_t ndx ) {
\r
795 // see header file for class documentation
\r
797 if ( !fCurrentReader || !IsConnected() ) {
\r
798 HLTError(Form("Not connected yet."));
\r
802 if ( ndx < static_cast<Int_t>(fNBlks) )
\r
803 return static_cast<ULong_t> (fCurrentReader->GetBlockDataLength(ndx));
\r
808 //##################################################################################
\r
809 TString AliHLTHOMERManager::GetBlkOrigin( Int_t ndx ) {
\r
810 // see header file for class documentation
\r
812 TString origin = "";
\r
814 // -- Check for Connection
\r
815 if ( !fCurrentReader || ! IsConnected() ) {
\r
816 HLTError(Form("Not connected yet."));
\r
820 // -- Check block index
\r
821 if ( ndx >= static_cast<Int_t>(fNBlks) ) {
\r
822 HLTError(Form("Block index %d out of range.", ndx ));
\r
832 reverseOrigin.data = static_cast<UInt_t>(fCurrentReader->GetBlockDataOrigin(ndx));
\r
834 // -- Reverse the order
\r
835 for (Int_t ii = 3; ii >= 0; ii-- )
\r
836 if ( reverseOrigin.array[ii] != ' ')
\r
837 origin.Append( reverseOrigin.array[ii] );
\r
839 origin.Remove( TString::kTrailing, ' ' );
\r
844 //##################################################################################
\r
845 TString AliHLTHOMERManager::GetBlkType( Int_t ndx ) {
\r
846 // see header file for class documentation
\r
850 // -- Check for Connection
\r
851 if ( !fCurrentReader || ! IsConnected() ) {
\r
852 HLTError(Form("Not connected yet."));
\r
856 // -- Check block index
\r
857 if ( ndx >= static_cast<Int_t>(fNBlks) ) {
\r
858 HLTError(Form("Block index %d out of range.", ndx ));
\r
868 reverseType.data = static_cast<ULong64_t> (fCurrentReader->GetBlockDataType(ndx));
\r
870 // -- Reverse the order
\r
871 for (Int_t ii = 7; ii >= 0; ii-- )
\r
872 if ( reverseType.array[ii] != ' ')
\r
873 type.Append( reverseType.array[ii] );
\r
875 type.Remove( TString::kTrailing, ' ' );
\r
880 //##################################################################################
\r
881 ULong_t AliHLTHOMERManager::GetBlkSpecification( Int_t ndx ) {
\r
882 // see header file for class documentation
\r
884 // -- Check for Connection
\r
885 if ( !fCurrentReader || ! IsConnected() ) {
\r
886 HLTError(Form("Not connected yet."));
\r
890 // -- Check block index
\r
891 if ( ndx >= static_cast<Int_t>(fNBlks) ) {
\r
892 HLTError(Form("Block index %d out of range.", ndx ));
\r
896 return static_cast<ULong_t>(fCurrentReader->GetBlockDataSpec(ndx));
\r
899 //##################################################################################
\r
900 Bool_t AliHLTHOMERManager::CheckIfRequested( AliHLTHOMERBlockDesc * block ) {
\r
901 // see header file for class documentation
\r
903 Bool_t requested = kFALSE;
\r
905 AliHLTHOMERSourceDesc * source= NULL;
\r
907 // -- Read all sources and check if they should be read out
\r
908 TIter next( fSourceList );
\r
909 while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
\r
911 // -- Check if source is selected
\r
912 if ( ! source->IsSelected() )
\r
915 // -- Check if detector matches
\r
916 if ( source->GetSourceName().CompareTo( block->GetBlockName() ) )
\r
922 } // while ( ( source = dynamic_cast<AliHLTHOMERSourceDesc*>(next()) ) ) {
\r
926 HLTInfo(Form("Block requested : %s", block->GetBlockName().Data()));
\r
929 HLTInfo(Form("Block NOT requested : %s", block->GetBlockName().Data()));
\r
936 /* ---------------------------------------------------------------------------------
\r
937 * Trigger Handling - private
\r
938 * ---------------------------------------------------------------------------------
\r
941 //##################################################################################
\r
942 Bool_t AliHLTHOMERManager::CheckTriggerDecision() {
\r
943 // see header file for class documentation
\r
945 Bool_t triggered = kFALSE;
\r
947 if ( !fCurrentReader || !IsConnected() ) {
\r
948 HLTError(Form("Not connected yet."));
\r
952 AliHLTHOMERBlockDesc blockDesc;
\r
956 // -- Fill block list
\r
957 Bool_t foundTriggerBlock = kFALSE;
\r
960 if ( (GetBlkType().CompareTo("ROOTTOBJ") == 0) ) {
\r
961 blockDesc.SetBlock( GetBlk(), GetBlkSize(), GetBlkOrigin(),
\r
962 GetBlkType(), GetBlkSpecification() );
\r
964 if ( ! blockDesc.GetClassName().CompareTo("AliHLTGlobalTriggerDecision") ) {
\r
966 foundTriggerBlock = kTRUE;
\r
971 } while( GetNextBlk() );
\r
973 if ( !foundTriggerBlock ) {
\r
974 HLTError(Form("No trigger decision object found"));
\r
978 // -- Get the global decision object
\r
979 AliHLTGlobalTriggerDecision* globalDecision =
\r
980 static_cast<AliHLTGlobalTriggerDecision*>(blockDesc.GetTObject());
\r
982 if ( fTriggerString.CompareTo("HLTGlobalTrigger") == 0 ) {
\r
983 triggered = globalDecision->EventTriggered();
\r
987 for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {
\r
989 const AliHLTTriggerDecision* triggerDecision =
\r
990 reinterpret_cast<const AliHLTTriggerDecision*>(globalDecision->InputObject(idx));
\r
992 if ( !(fTriggerString.CompareTo(triggerDecision->Description())) ) {
\r
993 triggered = triggerDecision->EventTriggered();
\r
996 } // for (Int_t idx = 0; idx < globalDecision->NumberOfInputObjects(); idx++) {
\r
1001 if ( triggered ) {
\r
1002 fRetryNextEvent = kFALSE;
\r
1003 fNEventsNotTriggered = 0;
\r
1006 fRetryNextEvent = kTRUE;
\r
1007 ++fNEventsNotTriggered;
\r