1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de> *
5 * for The ALICE Off-line Project. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 /** @file AliHLTTPCDisplayMain.cxx
17 @author Jochen Thaeder
19 @brief Interface class for ALICE HLT online Display
23 #if defined(HAVE_HOMERREADER)
24 #include HOMERREADER_HEADER
25 #endif // defined(HAVE_HOMERREADER)
27 #include "AliHLTTPCDisplayMain.h"
28 #include "AliHLTTPCDisplayCharge.h"
29 #include "AliHLTTPCDisplayPadRow.h"
30 #include "AliHLTTPCDisplayPad.h"
31 #include "AliHLTTPCDisplay3D.h"
32 #include "AliHLTTPCDisplayResiduals.h"
33 #include "AliHLTTPCDisplayFront.h"
35 #include "AliHLTStdIncludes.h"
36 #include "AliHLTTPCDefinitions.h"
37 #include "AliHLTDataTypes.h"
38 #include "AliHLTTPCSpacePointData.h"
39 #include "AliHLTTPCClusterDataFormat.h"
40 #include "AliHLTTPCTrackletDataFormat.h"
41 #include "AliHLTTPCDigitReader.h"
42 #include "AliHLTTPCDigitReaderDecoder.h"
43 #include "AliHLTTPCPad.h"
44 #include "AliHLT_C_Component_WrapperInterface.h"
45 #include "AliHLTTPCLogging.h"
47 #include "AliHLTTPCTransform.h"
48 #include "AliHLTTPCTrack.h"
49 #include "AliHLTTPCTrackArray.h"
50 #include "AliHLTTPCMemHandler.h"
51 #include "AliHLTTPCDigitReaderPacked.h"
54 #include <TClonesArray.h>
56 #include <AliSimDigits.h>
57 #include <AliTPCParam.h>
64 // -- input datatypes , reverse
65 const Char_t* spptID = "SRETSULC"; // CLUSTERS
66 const Char_t* trksegID = "SGESKART"; // TRAKSEGS
67 const Char_t* trkID = " SKCART"; // TRACKS
68 const Char_t* padrowID = "KPWR_LDD"; // DDL_RWPK
70 ClassImp(AliHLTTPCDisplayMain)
72 //____________________________________________________________________________________________________
73 AliHLTTPCDisplayMain::AliHLTTPCDisplayMain(void* pt2GUI, void (*pt2Function)(void*, Int_t)) :
75 fPadCallback(pt2Function),
80 fgNTimeBins(1024), // 446 or 1024
82 fZeroSuppressionThreshold (10),
88 fExistsRawData(kFALSE),
89 fExistsClusterData(kFALSE),
90 fExistsTrackData(kFALSE),
95 fDisplayResiduals(NULL),
101 fCanvasResiduals(NULL),
104 fCanvasQ_Track(NULL),
106 fCanvasPadRow_Pad(NULL),
116 fZeroSuppression( kTRUE ),
118 fNPads( AliHLTTPCTransform::GetNPads(0) ),
121 fSplitPadRow(kFALSE),
126 fSelectTrackSwitch(kFALSE),
128 fSelectTrackSlice(0),
140 fSwitch3DCluster(kFALSE),
141 fSwitch3DTracks(kFALSE),
142 fSwitch3DPadRow(kFALSE),
143 fSwitch3DGeometry(kTRUE),
147 AliHLTLogging::SetGlobalLoggingLevel(kHLTLogError);
149 fCanvasArray = new TCanvas* [nCanvasTypes];
150 fWorkerArray = new void* [nWorkerTypes];
152 memset(fClusters,0,36*6*sizeof(AliHLTTPCSpacePointData*));
153 memset(fNcl, 0, 36*6*sizeof(UInt_t));
157 fTimeBinMax = GetNTimeBins() -1;
161 fTrackParam.kappa = 0.;
162 fTrackParam.nHits = 0;
163 fTrackParam.charge = 0;
164 fTrackParam.radius = 0.;
165 fTrackParam.slice = 0;
166 fTrackParam.phi0 = 0.;
167 fTrackParam.psi = 0.;
168 fTrackParam.lambda = 0.;
171 fTrackParam.bfield = 0.;
175 //____________________________________________________________________________________________________
176 AliHLTTPCDisplayMain::~AliHLTTPCDisplayMain() {
178 if ( fTracks ) delete fTracks;
181 if ( fCanvasArray ) delete fTracks;
184 if ( fWorkerArray ) delete fWorkerArray;
187 #if defined(HAVE_HOMERREADER)
188 HOMERReader* reader= (HOMERReader*) fReader;
193 #endif // defined(HAVE_HOMERREADER)
195 if (fDisplayResiduals)
196 delete fDisplayResiduals;
197 fDisplayResiduals = NULL;
208 delete fDisplayPadRow;
209 fDisplayPadRow = NULL;
212 delete fDisplayFront;
213 fDisplayFront = NULL;
216 delete fDisplayCharge;
217 fDisplayCharge = NULL;
220 //____________________________________________________________________________________________________
221 Int_t AliHLTTPCDisplayMain::Connect( unsigned int cnt, const char** hostnames, unsigned short* ports, Char_t *gfile){
223 Char_t* defaultGeometry=NULL;
224 #if defined(DEFAULT_GEOMETRY)
225 defaultGeometry=DEFAULT_GEOMETRY;
228 HLTDebug("probing geometry file %s", gfile);
229 ifstream test(gfile);
231 HLTWarning("unable to find geometry file %s, using default file", gfile);
232 gfile=defaultGeometry;
236 HLTDebug("using default geometry file %s", gfile, defaultGeometry);
237 gfile=defaultGeometry;
240 HLTError("geometry file missing");
243 #if defined(HAVE_HOMERREADER)
249 // -- CONNECT to TCPDumpSubscriber via HOMER
250 // ---------------------------------------------
251 HOMERReader* reader = new HOMERReader( cnt, (const char**) hostnames, ports );
252 ret=reader->GetConnectionStatus();
255 Int_t ndx = reader->GetErrorConnectionNdx();
256 if ( ndx < (Int_t) cnt) HLTError("Error establishing connection to TCP source %s:%hu: %s (%d)\n", hostnames[ndx], ports[ndx], strerror(ret), ret );
257 else HLTError("Error establishing connection to unknown source with index %d: %s (%d)\n",ndx, strerror(ret), ret );
264 // -- ERROR HANDLING for HOMER (error codes and empty blocks)
265 // --------------------------------------------------------------
266 Int_t ret1 = reader->ReadNextEvent(3000000); // timeout in microseconds (3s)
269 Int_t ndx = reader->GetErrorConnectionNdx();
271 if ( ret1 == 111 || ret1 == 32 ) {
272 HLTError( "Error, No Connection to source %d: %s (%d)\n", ndx, strerror(ret1), ret1 );
279 else if (ret1 == 110){
280 HLTError( "Timout occured, reading event from source %d: %s (%d)\n", ndx, strerror(ret1), ret1 );
287 else if ( ret1 == 56 || ret1 == 6 ) {
288 HLTError( "Error reading event from source %d: %s (%d) -- RETRY\n", ndx, strerror(ret1), ret1 );
296 HLTError( "General Error reading event from source %d: %s (%d)\n", ndx, strerror(ret1), ret1 );
305 unsigned long blockCnt = reader->GetBlockCnt();
307 HLTDebug( "Event 0x%016LX (%Lu) with %lu blocks\n", (ULong64_t)reader->GetEventID(), (ULong64_t)reader->GetEventID(), blockCnt );
315 // SWITCH on the Display parts according what DATATAYPES are present
316 // ---------------------------------------------------------------------
317 for ( unsigned long i = 0; i < blockCnt; i++ ) {
319 memset( tmp1, 0, 9 );
321 ULong64_t* tmp12 = (ULong64_t*)tmp11;
322 *tmp12 = reader->GetBlockDataType( i );
324 if (!strcmp(tmp1,padrowID)) fExistsRawData = kTRUE;
325 else if (!strcmp(tmp1,spptID)) fExistsClusterData = kTRUE;
326 else if (!strcmp(tmp1,trksegID)) fExistsTrackData = kTRUE;
327 else if (!strcmp(tmp1,trkID)) fExistsTrackData = kTRUE;
330 // -- Set reader and eventID
331 // -------------------------------
332 fEventID = (ULong64_t)reader->GetEventID();
333 fReader = (void*) reader;
336 break; // leave while(1), if connected to source
340 // -- Initialize TPC Display Classes -- IMPORTANT... don't change the order of them
341 // Check if necessary data types are present
342 // ------------------------------------------------------------------------------------
343 fDisplay3D = new AliHLTTPCDisplay3D(this, gfile);
345 if (ExistsRawData()){
346 fDisplayPadRow = new AliHLTTPCDisplayPadRow(this);
347 fDisplayPad = new AliHLTTPCDisplayPad(this);
348 fDisplayFront = new AliHLTTPCDisplayFront(this);
351 if (ExistsClusterData()){
352 fDisplayCharge = new AliHLTTPCDisplayCharge(this);
355 if (ExistsTrackData() && ExistsClusterData() ){
356 fDisplayResiduals = new AliHLTTPCDisplayResiduals(this);
362 HLTFatal("HOMER reader not available");
363 #endif // defined(HAVE_HOMERREADER)
368 //____________________________________________________________________________________________________
369 Int_t AliHLTTPCDisplayMain::Disconnect(){
370 #if defined(HAVE_HOMERREADER)
371 // READ CLUSTER and TRACK data
372 HOMERReader* reader = (HOMERReader*)fReader;
379 HLTFatal("HOMER raeder not available");
380 #endif // defined(HAVE_HOMERREADER)
386 //____________________________________________________________________________________________________
387 Int_t AliHLTTPCDisplayMain::ReadData(Bool_t nextSwitch){
388 // READ CLUSTER and TRACK data
390 #if defined(HAVE_HOMERREADER)
391 HOMERReader* reader = (HOMERReader*)fReader;
393 // -- reset TracksPerSlice Array
394 for(Int_t ii=0;ii<36;ii++) fTracksPerSlice[ii] = 0;
399 // -- READ next event data and ERROR HANDLING for HOMER (error codes and empty blocks)
400 // ---------------------------------------------------------------------------------------
404 ret = reader->ReadNextEvent();
406 if ( ret == 111 || ret == 32 || ret == 6 ) {
407 Int_t ndx = reader->GetErrorConnectionNdx();
408 HLTError( "Error, No Connection to source %d: %s (%d)\n", ndx, strerror(ret), ret );
411 else if ( ret == 110 ) {
412 Int_t ndx = reader->GetErrorConnectionNdx();
413 HLTError( "Timout occured, reading event from source %d: %s (%d)\n", ndx, strerror(ret), ret );
416 else if ( ret == 56) {
417 Int_t ndx = reader->GetErrorConnectionNdx();
418 HLTError( "Error reading event from source %d: %s (%d) -- RETRY\n", ndx, strerror(ret), ret );
422 Int_t ndx = reader->GetErrorConnectionNdx();
423 HLTError( "General Error reading event from source %d: %s (%d)\n", ndx, strerror(ret), ret );
430 } // end if (nextSwitch)
432 // -- Get blockCnt and eventID
433 // -------------------------------
434 ULong_t blockCnt = reader->GetBlockCnt();
435 fEventID = (ULong64_t)reader->GetEventID();
437 HLTError( "Event 0x%016LX (%Lu) with %lu blocks\n", (ULong64_t)reader->GetEventID(), (ULong64_t)reader->GetEventID(), blockCnt );
439 // Loop for Debug only
440 for ( ULong_t i = 0; i < blockCnt; i++ ) {
441 Char_t tmp1[9], tmp2[5];
442 memset( tmp1, 0, 9 );
443 memset( tmp2, 0, 5 );
445 ULong64_t* tmp12 = (ULong64_t*)tmp11;
446 *tmp12 = reader->GetBlockDataType( i );
448 ULong_t* tmp22 = (ULong_t*)tmp21;
449 *tmp22 = reader->GetBlockDataOrigin( i );
451 HLTError( "Block %lu length: %lu - type: %s - origin: %s\n",i, reader->GetBlockDataLength( i ), tmp1, tmp2 );
452 } // end for ( ULong_t i = 0; i < blockCnt; i++ ) {
456 //---------------------
459 // -- READ CLUSTER DATA
460 //-------------------------
464 //-------------------
468 HLTFatal("HOMER raeder not available");
469 #endif // defined(HAVE_HOMERREADER)
474 //____________________________________________________________________________________________________
475 void AliHLTTPCDisplayMain::DisplayEvent(Bool_t newRawSlice){
476 #if defined(HAVE_HOMERREADER)
477 HOMERReader* reader = (HOMERReader*)fReader;
479 //--------------------------------------------------------------------------------------------
480 // READ RAW DATA for PADROW/PAD HISTOGRAM
481 //--------------------------------------------------------------------------------------------
482 if ( ExistsRawData() ){
483 fDisplayPadRow->Reset();
484 fDisplayPad->Reset();
485 fDisplayFront->Reset();
487 if (newRawSlice) ReadRawData();
491 fDisplayPadRow->Fill();
492 fDisplayFront->Fill();
496 fDisplayPadRow->Draw();
497 fDisplayFront->Draw();
500 //--------------------------------------------------------------------------------------------
502 //--------------------------------------------------------------------------------------------
503 if ( ExistsClusterData() && ExistsTrackData() ){
504 fDisplayResiduals->Reset();
505 fDisplayResiduals->Fill();
506 fDisplayResiduals->Draw();
509 //--------------------------------------------------------------------------------------------
511 //--------------------------------------------------------------------------------------------
512 if ( ExistsClusterData() ){
513 fDisplayCharge->Reset();
514 fDisplayCharge->Fill();
515 fDisplayCharge->Draw();
518 //--------------------------------------------------------------------------------------------
520 //--------------------------------------------------------------------------------------------
522 // TAKE CARE !!! EXISTSxxxData() HANDLING of 3D will be done IN this class !!!
525 cout << "afterdraw" << endl;
527 HLTFatal("HOMER raeder not available");
528 #endif // defined(HAVE_HOMERREADER)
532 //____________________________________________________________________________________________________
533 void AliHLTTPCDisplayMain::SaveHistograms(){
534 // Save histograms as eps
535 fDisplayCharge->Save();
536 fDisplayPadRow->Save();
539 fDisplayResiduals->Save();
540 fDisplayFront->Save();
541 fDisplayCharge->Save();
544 //----------------------------------------------------------------------------------------------------
546 //____________________________________________________________________________________________________
547 //____________________________________________________________________________________________________
548 void AliHLTTPCDisplayMain::ReadRawData(){
549 // -- READ raw data of one sector into 3D arrays fRawData and fRawDataZeroSuppressed
552 memset(fRawData, 0, 159*140*1024*sizeof(UInt_t));
553 memset(fRawDataZeroSuppressed, 0, 159*140*1024*sizeof(UInt_t));
555 #if defined(HAVE_HOMERREADER)
556 HOMERReader* reader = (HOMERReader*)fReader;
558 // -- read raw data blocks
559 // ---------------------------
561 Char_t* rawID = "KPWR_LDD";
562 blk = reader->FindBlockNdx( rawID, " CPT",0xFFFFFFFF );
564 while ( blk != ~(ULong_t)0 ) {
565 HLTDebug( "Found raw data block %lu\n", blk );
567 #if HOMER_VERSION >= 2
568 // -- Check for corrupt data
569 AliHLTUInt64_t corruptFlag = reader->GetBlockStatusFlags( blk );
570 if (corruptFlag & 0x00000001) {
571 HLTError( "Data block %lu is corrupt\n",blk );
572 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
577 void* rawDataBlock = (void*) reader->GetBlockData( blk );
578 unsigned long rawDataLen = reader->GetBlockDataLength( blk );
580 ULong_t spec = reader->GetBlockDataSpec( blk );
581 Int_t patch = AliHLTTPCDefinitions::GetMinPatchNr( spec );
582 Int_t slice = AliHLTTPCDefinitions::GetMinSliceNr( spec );
584 HLTDebug( "Raw data found for slice %u - patch %u\n", slice, patch );
586 // -- Wrong slice for raw data
587 if ( GetSlicePadRow() != slice) {
588 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
592 // -- Read data out of block
593 AliHLTTPCDigitReaderDecoder digitReader;
595 // Initialize RAW DATA
596 Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
597 Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
599 // Outer sector, patches 2, 3, 4, 5 - start counting in patch 2 with row 0
601 if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
603 // Initialize block for reading packed data
604 digitReader.InitBlock(rawDataBlock,rawDataLen,patch,slice);
606 Bool_t readValue = digitReader.Next();
609 HLTError ( "No value in data block %lu \n", blk);
610 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
614 // -- Fill Zero Suppressed Array
615 // ---------------------------------
618 UShort_t time=0,newTime=0;
619 UInt_t pad=0,newPad=0;
622 Int_t gatingGridOffset=50;
623 Int_t signalThreshold = GetZeroSuppressionThreshold();
624 AliHLTTPCPad baseline(gatingGridOffset, GetNTimeBins() );
626 // just to make later conversion to a list of objects easier
627 AliHLTTPCPad* pCurrentPad=NULL;
628 if ( signalThreshold >= 0) {
629 pCurrentPad=&baseline;
630 baseline.SetThreshold(signalThreshold);
633 while ( readValue ) { // Reads through all digits in block
635 while(1){ //Loop over time bins of current pad
636 // read all the values for one pad at once to calculate the base line
639 if (!pCurrentPad->IsStarted()) {
641 // HLTDebug("reading data for pad %d, padrow %d", digitReader.GetPad(), digitReader.GetRow()+rowOffset);
643 pCurrentPad->SetID(digitReader.GetRow()+rowOffset,digitReader.GetPad());
645 if ( (pCurrentPad->StartEvent()) >= 0) {
646 // loop over data of one pad and read it into AliHLTTPCPad class
648 if ( (digitReader.GetRow()+rowOffset) != pCurrentPad->GetRowNumber() ) break;
649 if ( digitReader.GetPad() != pCurrentPad->GetPadNumber() ) break;
650 pCurrentPad->SetRawData( digitReader.GetTime(), digitReader.GetSignal() );
652 // HLTDebug("set raw data to pad: bin %d charge %d", digitReader.GetTime(), digitReader.GetSignal());
654 } while ( (readValue = digitReader.Next()) != 0 );
657 // calculate baseline of pad
658 pCurrentPad->CalculateBaseLine( GetNTimeBins() / 2);
660 if ( pCurrentPad->Next(kTRUE/*do zero suppression*/) == 0 ) {
661 // HLTDebug("no data available after zero suppression");
663 pCurrentPad->StopEvent();
664 pCurrentPad->ResetHistory();
668 Int_t time = pCurrentPad->GetCurrentPosition();
669 if ( time > pCurrentPad->GetSize() ) {
670 HLTError("invalid time bin for pad");
673 } // end - if (!pCurrentPad->IsStarted()) {
674 } // end - if (pCurrentPad) {
677 Float_t occupancy=pCurrentPad->GetOccupancy();
678 if ( occupancy < GetOccupancyLimit() ) {
679 signal = pCurrentPad->GetCorrectedData();
683 HLTInfo("ignoring pad %d with occupancy level %f %%", pCurrentPad->GetPadNumber(), occupancy);
685 // signal = pCurrentPad->GetCorrectedData();
687 signal = digitReader.GetSignal();
690 fRawDataZeroSuppressed[ pCurrentPad->GetRowNumber() ][ pCurrentPad->GetPadNumber() ][ pCurrentPad->GetCurrentPosition() ] = (UInt_t)signal;
693 HLTDebug("get next charge value: position %d charge %d", time, signal);
695 if( time >= AliHLTTPCTransform::GetNTimeBins() ){
696 HLTWarning("Timebin (%d) out of range (%d)", time, AliHLTTPCTransform::GetNTimeBins());
702 if( (pCurrentPad->Next(kTRUE/*do zero suppression*/)) == 0 ) {
703 pCurrentPad->StopEvent();
704 pCurrentPad->ResetHistory();
707 newPad = digitReader.GetPad();
708 newTime = digitReader.GetTime();
709 newRow = digitReader.GetRow() + rowOffset;
714 newPad=pCurrentPad->GetPadNumber();
715 newTime=pCurrentPad->GetCurrentPosition();
716 newRow=pCurrentPad->GetRowNumber();
720 readValue = digitReader.Next();
722 //Check where to stop:
723 if(!readValue) break; //No more value
725 newPad = digitReader.GetPad();
726 newTime = digitReader.GetTime();
727 newRow = digitReader.GetRow() + rowOffset;
730 if(newPad != pad) break; //new pad
731 if(newTime != time+1) break; //end of sequence
735 } // end - while(1){ // Loop over time bins of current pad
737 if ( !readValue ) break;
739 } // end while ( readValue ) {
741 // -- END ZERO SUPPRESSION
743 // Rewind block for reading packed data
744 digitReader.InitBlock(rawDataBlock,rawDataLen,patch,slice);
747 // ---------------------
748 readValue = digitReader.Next();
750 // LOOP over raw data and fill arrays
753 Int_t row = digitReader.GetRow() + rowOffset;
754 Int_t pad = (Int_t) digitReader.GetPad();
755 Int_t time = (Int_t) digitReader.GetTime();
756 UInt_t signal = (UInt_t) digitReader.GetSignal();
758 fRawData[row][pad][time] = signal;
760 // -- read next value
761 readValue = digitReader.Next();
764 if(!readValue) break;
766 } // end while ( readValue ){
768 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
770 } // end while ( blk != ~(ULong_t)0 ) {
773 HLTFatal("HOMER raeder not available");
774 #endif // defined(HAVE_HOMERREADER)
778 //____________________________________________________________________________________________________
779 void AliHLTTPCDisplayMain::ReadClusterData(){
780 // -- READ cluster data
781 #if defined(HAVE_HOMERREADER)
782 HOMERReader* reader = (HOMERReader*)fReader;
785 blk = reader->FindBlockNdx( (char*)spptID, " CPT",0xFFFFFFFF );
787 while ( blk != ~(ULong_t)0 ) {
788 HLTDebug( "Found clusters block %lu\n", blk );
790 const AliHLTTPCClusterData* clusterData = (const AliHLTTPCClusterData*)reader->GetBlockData( blk );
791 if ( !clusterData ) {
792 HLTError( "No track data for block %lu\n", blk );
793 blk = reader->FindBlockNdx( (char*)spptID, " CPT", 0xFFFFFFFF, blk+1 );
797 ULong_t spec = reader->GetBlockDataSpec( blk );
798 Int_t patch = AliHLTTPCDefinitions::GetMinPatchNr( spec );
799 Int_t slice = AliHLTTPCDefinitions::GetMinSliceNr( spec );
801 HLTDebug( "%lu Clusters found for slice %u - patch %u\n", clusterData->fSpacePointCnt, slice, patch );
803 void* tmp30 = (void*)clusterData;
804 Byte_t* tmp31 = (Byte_t*)tmp30;
806 offset = sizeof(clusterData->fSpacePointCnt);
807 if ( offset <= reader->GetBlockTypeAlignment( blk, 1 ) ) offset = reader->GetBlockTypeAlignment( blk, 1 );
810 AliHLTTPCSpacePointData* tmp32 = (AliHLTTPCSpacePointData*)tmp30;
812 SetupCluster( slice, patch, clusterData->fSpacePointCnt, tmp32 );
814 blk = reader->FindBlockNdx( (char*)spptID, " CPT", 0xFFFFFFFF, blk+1 );
818 HLTFatal("HOMER raeder not available");
819 #endif // defined(HAVE_HOMERREADER)
821 //____________________________________________________________________________________________________
822 void AliHLTTPCDisplayMain::ReadTrackData(){
823 // -- READ track data
825 if ( fTracks ) delete fTracks;
826 fTracks = new AliHLTTPCTrackArray;
828 #if defined(HAVE_HOMERREADER)
829 HOMERReader* reader = (HOMERReader*)fReader;
831 ULong_t blk=~(ULong_t)0;
832 const Char_t* searchIDs[]={trksegID, trkID, NULL};
833 const Char_t** currentID=searchIDs;
835 blk = reader->FindBlockNdx( (char*)*currentID, " CPT", 0xFFFFFFFF );
836 } while (blk==~(ULong_t)0 && *(++currentID)!=NULL);
838 while ( blk != ~(ULong_t)0 || (*currentID!=NULL && *(++currentID)!=NULL )) {
839 if (blk == ~(ULong_t)0) {
840 blk = reader->FindBlockNdx( (char*)*currentID, " CPT", 0xFFFFFFFF );
844 HLTDebug( "Found tracks in block %lu type %s\n", blk, *currentID );
846 const AliHLTTPCTrackletData* trackData = (const AliHLTTPCTrackletData*)reader->GetBlockData( blk );
849 HLTError( "No track data for block %lu\n", blk );
850 blk = reader->FindBlockNdx( (char*)*currentID, " CPT", 0xFFFFFFFF, blk+1 );
854 ULong_t spec = reader->GetBlockDataSpec( blk );
855 Int_t slice = AliHLTTPCDefinitions::GetMinSliceNr( spec );
856 Int_t patchmin = AliHLTTPCDefinitions::GetMinPatchNr( spec );
857 Int_t patchmax = AliHLTTPCDefinitions::GetMaxPatchNr( spec );
859 HLTDebug( "%lu tracks found for slice %u - patch %u-%u\n", trackData->fTrackletCnt, slice, patchmin, patchmax );
861 fTracksPerSlice[slice] = trackData->fTrackletCnt; // Fill number if tracks per slice
863 AliHLTTPCTrackSegmentData* tmp42 = (AliHLTTPCTrackSegmentData*) &(trackData->fTracklets[0]);
864 fTracks->FillTracks( trackData->fTrackletCnt, tmp42, slice, (*currentID==trksegID?1:0) );
866 blk = reader->FindBlockNdx( (char*)*currentID, " CPT", 0xFFFFFFFF, blk+1 );
872 HLTFatal("HOMER raeder not available");
873 #endif // defined(HAVE_HOMERREADER)
876 //----------------------------------------------------------------------------------------------------
878 //____________________________________________________________________________________________________
879 void AliHLTTPCDisplayMain::SetupCluster(Int_t slice, Int_t patch, UInt_t nofClusters, AliHLTTPCSpacePointData* data) {
881 if (data && slice>=0 && slice<36 && patch>=0 && patch<AliHLTTPCTransform::GetNPatches()) {
882 if (fClusters[slice][patch]!=NULL) {
883 delete(fClusters[slice][patch]);
884 fClusters[slice][patch]=NULL;
886 Int_t arraysize=nofClusters*sizeof(AliHLTTPCSpacePointData);
887 fClusters[slice][patch] = (AliHLTTPCSpacePointData*)new Byte_t[arraysize];
888 if (fClusters[slice][patch]) {
889 memcpy(fClusters[slice][patch], data, arraysize);
890 fNcl[slice][patch]=nofClusters;
892 fNcl[slice][patch]=nofClusters;
893 HLTError ( "Memory allocation failed!" );
895 } else HLTError ( "Invalid argument!" );
898 //____________________________________________________________________________________________________
899 void AliHLTTPCDisplayMain::SetupTracks() {
902 Int_t ntracks = fTracks->GetNTracks();
904 for(Int_t j=0; j<ntracks; j++) {
905 AliHLTTPCTrack *gtrack = fTracks->GetCheckedTrack(j);
906 if(!gtrack) continue;
908 Int_t nHits = gtrack->GetNHits();
909 UInt_t *hitnum = gtrack->GetHitNumbers();
911 for(Int_t h=0; h<nHits; h++){
914 Int_t slice = (id>>25) & 0x7f;
915 Int_t patch = (id>>22) & 0x7;
916 UInt_t pos = id&0x3fffff;
918 AliHLTTPCSpacePointData *points = fClusters[slice][patch];
921 HLTError ( "No points at slice %d patch %d position %d!", slice, patch, pos );
925 if(pos>=fNcl[slice][patch]) {
926 HLTError ( "Pos is too large: pos %d ncl!", pos,fNcl[slice][patch] );
929 points[pos].fUsed = kTRUE;
930 points[pos].fTrackN = j;
935 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
936 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
937 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
938 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
939 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
940 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
941 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
942 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
943 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
944 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
945 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
946 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
949 //----------------------------------------------------------------------------------------------------
951 //____________________________________________________________________________________________________
953 //____________________________________________________________________________________________________
954 void AliHLTTPCDisplayMain::SetSliceArray() {
956 Int_t minSlice = fMinSlice;
957 Int_t maxSlice = fMaxSlice;
960 for (slice=0;slice< 36;slice++){
961 fSliceArray[slice] = kFALSE;
964 // Single Slice, or Range
965 if (minSlice > maxSlice) maxSlice += 17;
967 for (slice=minSlice;slice<=maxSlice;slice++){
968 realslice = slice % 18;
969 fSliceArray[realslice] = kTRUE;
970 fSliceArray[realslice+18] = kTRUE;
975 minSlice = fMinSlice + 9;
976 maxSlice = fMaxSlice + 9;
978 if (minSlice > maxSlice) maxSlice += 17;
980 for (slice=minSlice;slice<=maxSlice;slice++){
981 realslice = slice % 18;
982 fSliceArray[realslice] = kTRUE;
983 fSliceArray[realslice+18] = kTRUE;
989 //----------------------------------------------------------------------------------------------------
991 //____________________________________________________________________________________________________
992 Int_t AliHLTTPCDisplayMain::GetGlobalTrack(Int_t slice){
993 // get global track out of the "selectTrack" parameters
994 Int_t currenttrack= -1;
995 Int_t trackcounter = 0;
996 Int_t ntracks = fTracks->GetNTracks();
998 if ( slice == fSelectTrackSlice) {
999 for(Int_t j=0; j<ntracks; j++) {
1001 AliHLTTPCTrack *gtrack = fTracks->GetCheckedTrack(j);
1002 if(!gtrack) continue;
1004 // --- CHECK if track is should be drawn
1005 // select Single Track
1006 if(gtrack->GetSector() != fSelectTrackSlice) continue;
1008 if (trackcounter != fSelectTrack){
1014 //if((fPtThreshold > 0) && (gtrack->GetPt()< fPtThreshold)) continue;
1015 //if(gtrack->GetNHits() < fMinHits) continue;
1022 return currenttrack;
1025 //----------------------------------------------------------------------------------------------------
1027 //____________________________________________________________________________________________________
1028 void AliHLTTPCDisplayMain::ExecPadEvent(Int_t event, Int_t px, Int_t /*py*/, TObject *selected){
1029 TCanvas *c = (TCanvas *) gTQSender;
1031 if (event == 11 &&selected->InheritsFrom("TH2F")) {
1032 TH2F *hist = (TH2F*) selected;
1034 Int_t binx = hist->GetXaxis()->FindBin(c->AbsPixeltoX(px)) -1 ;
1035 // Int_t biny = hist->GetYaxis()->FindBin(c->AbsPixeltoY(py)) -1;
1037 fPadCallback(fPt2Gui, binx);