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
25 #if defined(HAVE_HOMERREADER)
26 #include "HOMERReader.h"
27 #endif // defined(HAVE_HOMERREADER)
29 #include "AliHLTTPCDisplayMain.h"
30 #include "AliHLTTPCDisplayCharge.h"
31 #include "AliHLTTPCDisplayPadRow.h"
32 #include "AliHLTTPCDisplayPad.h"
33 #include "AliHLTTPCDisplay3D.h"
34 #include "AliHLTTPCDisplayResiduals.h"
35 #include "AliHLTTPCDisplayFront.h"
37 #include "AliHLTStdIncludes.h"
38 #include "AliHLTTPCDefinitions.h"
39 #include "AliHLTDataTypes.h"
40 #include "AliHLTTPCSpacePointData.h"
41 #include "AliHLTTPCClusterDataFormat.h"
42 #include "AliHLTTPCTrackletDataFormat.h"
43 #include "AliHLTTPCDigitReader.h"
44 #include "AliHLTTPCDigitReaderRaw.h"
45 #include "AliHLTTPCPad.h"
46 #include "AliHLT_C_Component_WrapperInterface.h"
47 #include "AliHLTTPCLogging.h"
49 #include "AliHLTTPCTransform.h"
50 #include "AliHLTTPCTrack.h"
51 #include "AliHLTTPCTrackArray.h"
52 #include "AliHLTTPCMemHandler.h"
53 #include "AliHLTTPCDigitReaderPacked.h"
56 #include <TClonesArray.h>
58 #include <AliSimDigits.h>
59 #include <AliTPCParam.h>
66 ClassImp(AliHLTTPCDisplayMain)
68 //____________________________________________________________________________________________________
69 AliHLTTPCDisplayMain::AliHLTTPCDisplayMain(void* pt2GUI, void (*pt2Function)(void*, Int_t)) {
72 AliHLTLogging::SetGlobalLogLevel(kHLTLogError);
74 fCanvasArray = new TCanvas* [nCanvasTypes];
75 fWorkerArray = new void* [nWorkerTypes];
78 fgNTimeBins = 1024; // 446 or 1024
81 fZeroSuppressionThreshold = 10;
82 fOccupancyLimit = 1.0;
88 fPadCallback = pt2Function;
95 fDisplayCharge = NULL;
96 fDisplayPadRow = NULL;
99 fDisplayResiduals = NULL;
100 fDisplayFront = NULL;
102 fCanvasCharge = NULL;
103 fCanvasPadRow = NULL;
106 fCanvasResiduals = NULL;
108 fCanvasHits_S = NULL;
109 fCanvasQ_Track = NULL;
111 fCanvasPadRow_Pad = NULL;
114 fExistsRawData = kFALSE;
115 fExistsClusterData = kFALSE;
116 fExistsTrackData = kFALSE;
118 memset(fClusters,0,36*6*sizeof(AliHLTTPCSpacePointData*));
119 memset(fNcl, 0, 36*6*sizeof(UInt_t));
123 fZeroSuppression = kTRUE;
124 fNPads = AliHLTTPCTransform::GetNPads(0);
128 fSplitPadRow = kFALSE;
130 fFrontDataSwitch = 2;
132 fTimeBinMax = GetNTimeBins() -1;
133 fSplitFront = kFALSE;
136 fSelectTrackSlice = 0;
137 fSelectTrackSwitch = kFALSE;
154 fSwitch3DCluster = kFALSE;
155 fSwitch3DTracks = kFALSE;
156 fSwitch3DPadRow = kFALSE;
157 fSwitch3DGeometry = kTRUE;
168 fTrackParam.kappa = 0.;
169 fTrackParam.nHits = 0;
170 fTrackParam.charge = 0;
171 fTrackParam.radius = 0.;
172 fTrackParam.slice = 0;
173 fTrackParam.phi0 = 0.;
174 fTrackParam.psi = 0.;
175 fTrackParam.lambda = 0.;
178 fTrackParam.bfield = 0.;
182 //____________________________________________________________________________________________________
183 AliHLTTPCDisplayMain::~AliHLTTPCDisplayMain() {
185 if ( fTracks ) delete fTracks;
188 if ( fCanvasArray ) delete fTracks;
191 if ( fWorkerArray ) delete fWorkerArray;
194 #if defined(HAVE_HOMERREADER)
195 HOMERReader* reader= (HOMERReader*) fReader;
200 #endif // defined(HAVE_HOMERREADER)
202 if (fDisplayResiduals)
203 delete fDisplayResiduals;
204 fDisplayResiduals = NULL;
215 delete fDisplayPadRow;
216 fDisplayPadRow = NULL;
219 delete fDisplayFront;
220 fDisplayFront = NULL;
223 delete fDisplayCharge;
224 fDisplayCharge = NULL;
227 //____________________________________________________________________________________________________
228 Int_t AliHLTTPCDisplayMain::Connect( unsigned int cnt, const char** hostnames, unsigned short* ports, Char_t *gfile){
230 Char_t* defaultGeometry=NULL;
231 #if defined(DEFAULT_GEOMETRY)
232 defaultGeometry=DEFAULT_GEOMETRY;
235 HLTDebug("probing geometry file %s", gfile);
236 ifstream test(gfile);
238 HLTWarning("unable to find geometry file %s, using default file", gfile);
239 gfile=defaultGeometry;
243 HLTDebug("using default geometry file %s", gfile, defaultGeometry);
244 gfile=defaultGeometry;
247 HLTError("geometry file missing");
250 #if defined(HAVE_HOMERREADER)
251 // -- input datatypes , reverse
252 Char_t* spptID="SRETSULC"; // CLUSTERS
253 Char_t* trkID = "SGESKART"; // TRAKSEGS
254 Char_t* padrowID = "KPWR_LDD"; // DDL_RWPK
260 // -- CONNECT to TCPDumpSubscriber via HOMER
261 // ---------------------------------------------
262 HOMERReader* reader = new HOMERReader( cnt, (const char**) hostnames, ports );
263 ret=reader->GetConnectionStatus();
266 Int_t ndx = reader->GetErrorConnectionNdx();
267 if ( ndx < (Int_t) cnt) HLTError("Error establishing connection to TCP source %s:%hu: %s (%d)\n", hostnames[ndx], ports[ndx], strerror(ret), ret );
268 else HLTError("Error establishing connection to unknown source with index %d: %s (%d)\n",ndx, strerror(ret), ret );
275 // -- ERROR HANDLING for HOMER (error codes and empty blocks)
276 // --------------------------------------------------------------
277 Int_t ret1 = reader->ReadNextEvent(3000000); // timeout in microseconds (3s)
280 Int_t ndx = reader->GetErrorConnectionNdx();
282 if ( ret1 == 111 || ret1 == 32 ) {
283 HLTError( "Error, No Connection to source %d: %s (%d)\n", ndx, strerror(ret1), ret1 );
290 else if (ret1 == 110){
291 HLTError( "Timout occured, reading event from source %d: %s (%d)\n", ndx, strerror(ret1), ret1 );
298 else if ( ret1 == 56 || ret1 == 6 ) {
299 HLTError( "Error reading event from source %d: %s (%d) -- RETRY\n", ndx, strerror(ret1), ret1 );
307 HLTError( "General Error reading event from source %d: %s (%d)\n", ndx, strerror(ret1), ret1 );
316 unsigned long blockCnt = reader->GetBlockCnt();
318 HLTDebug( "Event 0x%016LX (%Lu) with %lu blocks\n", (ULong64_t)reader->GetEventID(), (ULong64_t)reader->GetEventID(), blockCnt );
326 // SWITCH on the Display parts according what DATATAYPES are present
327 // ---------------------------------------------------------------------
328 for ( unsigned long i = 0; i < blockCnt; i++ ) {
330 memset( tmp1, 0, 9 );
332 ULong64_t* tmp12 = (ULong64_t*)tmp11;
333 *tmp12 = reader->GetBlockDataType( i );
335 if (!strcmp(tmp1,padrowID)) fExistsRawData = kTRUE;
336 else if (!strcmp(tmp1,spptID)) fExistsClusterData = kTRUE;
337 else if (!strcmp(tmp1,trkID)) fExistsTrackData = kTRUE;
340 // -- Set reader and eventID
341 // -------------------------------
342 fEventID = (ULong64_t)reader->GetEventID();
343 fReader = (void*) reader;
346 break; // leave while(1), if connected to source
350 // -- Initialize TPC Display Classes -- IMPORTANT... don't change the order of them
351 // Check if necessary data types are present
352 // ------------------------------------------------------------------------------------
353 fDisplay3D = new AliHLTTPCDisplay3D(this, gfile);
355 if (ExistsRawData()){
356 fDisplayPadRow = new AliHLTTPCDisplayPadRow(this);
357 fDisplayPad = new AliHLTTPCDisplayPad(this);
358 fDisplayFront = new AliHLTTPCDisplayFront(this);
361 if (ExistsClusterData()){
362 fDisplayCharge = new AliHLTTPCDisplayCharge(this);
365 if (ExistsTrackData() && ExistsClusterData() ){
366 fDisplayResiduals = new AliHLTTPCDisplayResiduals(this);
372 HLTFatal("HOMER reader not available");
373 #endif // defined(HAVE_HOMERREADER)
378 //____________________________________________________________________________________________________
379 Int_t AliHLTTPCDisplayMain::Disconnect(){
380 #if defined(HAVE_HOMERREADER)
381 // READ CLUSTER and TRACK data
382 HOMERReader* reader = (HOMERReader*)fReader;
389 HLTFatal("HOMER raeder not available");
390 #endif // defined(HAVE_HOMERREADER)
396 //____________________________________________________________________________________________________
397 Int_t AliHLTTPCDisplayMain::ReadData(Bool_t nextSwitch){
398 // READ CLUSTER and TRACK data
400 #if defined(HAVE_HOMERREADER)
401 HOMERReader* reader = (HOMERReader*)fReader;
403 Char_t* spptID="SRETSULC"; // CLUSTERS
404 Char_t* trkID = "SGESKART"; // TRAKSEGS
406 // -- reset TracksPerSlice Array
407 for(Int_t ii=0;ii<36;ii++) fTracksPerSlice[ii] = 0;
412 // -- READ next event data and ERROR HANDLING for HOMER (error codes and empty blocks)
413 // ---------------------------------------------------------------------------------------
417 ret = reader->ReadNextEvent();
419 if ( ret == 111 || ret == 32 || ret == 6 ) {
420 Int_t ndx = reader->GetErrorConnectionNdx();
421 HLTError( "Error, No Connection to source %d: %s (%d)\n", ndx, strerror(ret), ret );
424 else if ( ret == 110 ) {
425 Int_t ndx = reader->GetErrorConnectionNdx();
426 HLTError( "Timout occured, reading event from source %d: %s (%d)\n", ndx, strerror(ret), ret );
429 else if ( ret == 56) {
430 Int_t ndx = reader->GetErrorConnectionNdx();
431 HLTError( "Error reading event from source %d: %s (%d) -- RETRY\n", ndx, strerror(ret), ret );
435 Int_t ndx = reader->GetErrorConnectionNdx();
436 HLTError( "General Error reading event from source %d: %s (%d)\n", ndx, strerror(ret), ret );
443 } // end if (nextSwitch)
445 // -- Get blockCnt and eventID
446 // -------------------------------
447 ULong_t blockCnt = reader->GetBlockCnt();
448 fEventID = (ULong64_t)reader->GetEventID();
450 HLTError( "Event 0x%016LX (%Lu) with %lu blocks\n", (ULong64_t)reader->GetEventID(), (ULong64_t)reader->GetEventID(), blockCnt );
452 // Loop for Debug only
453 for ( ULong_t i = 0; i < blockCnt; i++ ) {
454 Char_t tmp1[9], tmp2[5];
455 memset( tmp1, 0, 9 );
456 memset( tmp2, 0, 5 );
458 ULong64_t* tmp12 = (ULong64_t*)tmp11;
459 *tmp12 = reader->GetBlockDataType( i );
461 ULong_t* tmp22 = (ULong_t*)tmp21;
462 *tmp22 = reader->GetBlockDataOrigin( i );
464 HLTError( "Block %lu length: %lu - type: %s - origin: %s\n",i, reader->GetBlockDataLength( i ), tmp1, tmp2 );
465 } // end for ( ULong_t i = 0; i < blockCnt; i++ ) {
469 //---------------------
472 // -- READ CLUSTER DATA
473 //-------------------------
477 //-------------------
481 HLTFatal("HOMER raeder not available");
482 #endif // defined(HAVE_HOMERREADER)
487 //____________________________________________________________________________________________________
488 void AliHLTTPCDisplayMain::DisplayEvent(Bool_t newRawSlice){
489 #if defined(HAVE_HOMERREADER)
490 HOMERReader* reader = (HOMERReader*)fReader;
492 //--------------------------------------------------------------------------------------------
493 // READ RAW DATA for PADROW/PAD HISTOGRAM
494 //--------------------------------------------------------------------------------------------
495 if ( ExistsRawData() ){
496 fDisplayPadRow->Reset();
497 fDisplayPad->Reset();
498 fDisplayFront->Reset();
500 if (newRawSlice) ReadRawData();
504 fDisplayPadRow->Fill();
505 fDisplayFront->Fill();
509 fDisplayPadRow->Draw();
510 fDisplayFront->Draw();
513 //--------------------------------------------------------------------------------------------
515 //--------------------------------------------------------------------------------------------
516 if ( ExistsClusterData() && ExistsTrackData() ){
517 fDisplayResiduals->Reset();
518 fDisplayResiduals->Fill();
519 fDisplayResiduals->Draw();
522 //--------------------------------------------------------------------------------------------
524 //--------------------------------------------------------------------------------------------
525 if ( ExistsClusterData() ){
526 fDisplayCharge->Reset();
527 fDisplayCharge->Fill();
528 fDisplayCharge->Draw();
531 //--------------------------------------------------------------------------------------------
533 //--------------------------------------------------------------------------------------------
535 // TAKE CARE !!! EXISTSxxxData() HANDLING of 3D will be done IN this class !!!
538 cout << "afterdraw" << endl;
540 HLTFatal("HOMER raeder not available");
541 #endif // defined(HAVE_HOMERREADER)
545 //____________________________________________________________________________________________________
546 void AliHLTTPCDisplayMain::SaveHistograms(){
547 // Save histograms as eps
548 fDisplayCharge->Save();
549 fDisplayPadRow->Save();
552 fDisplayResiduals->Save();
553 fDisplayFront->Save();
554 fDisplayCharge->Save();
557 //----------------------------------------------------------------------------------------------------
559 //____________________________________________________________________________________________________
560 //____________________________________________________________________________________________________
561 void AliHLTTPCDisplayMain::ReadRawData(){
562 // -- READ raw data of one sector into 3D arrays fRawData and fRawDataZeroSuppressed
565 memset(fRawData, 0, 159*140*1024*sizeof(UInt_t));
566 memset(fRawDataZeroSuppressed, 0, 159*140*1024*sizeof(UInt_t));
568 #if defined(HAVE_HOMERREADER)
569 HOMERReader* reader = (HOMERReader*)fReader;
571 // -- read raw data blocks
572 // ---------------------------
574 Char_t* rawID = "KPWR_LDD";
575 blk = reader->FindBlockNdx( rawID, " CPT",0xFFFFFFFF );
577 while ( blk != ~(ULong_t)0 ) {
578 HLTDebug( "Found raw data block %lu\n", blk );
580 // -- Check for corrupt data
581 AliHLTUInt64_t corruptFlag = reader->GetBlockStatusFlags( blk );
582 if (corruptFlag & 0x00000001) {
583 HLTError( "Data block %lu is corrupt\n",blk );
584 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
588 void* rawDataBlock = (void*) reader->GetBlockData( blk );
589 unsigned long rawDataLen = reader->GetBlockDataLength( blk );
591 ULong_t spec = reader->GetBlockDataSpec( blk );
592 Int_t patch = AliHLTTPCDefinitions::GetMinPatchNr( spec );
593 Int_t slice = AliHLTTPCDefinitions::GetMinSliceNr( spec );
595 HLTDebug( "Raw data found for slice %u - patch %u\n", slice, patch );
597 // -- Wrong slice for raw data
598 if ( GetSlicePadRow() != slice) {
599 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
603 #if defined(HAVE_TPC_MAPPING)
605 // -- Read data out of block
606 AliHLTTPCDigitReaderRaw digitReader( GetRawReaderMode() );
608 // Initialize RAW DATA
609 Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
610 Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
612 // Outer sector, patches 2, 3, 4, 5 - start counting in patch 2 with row 0
614 if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
616 // Initialize block for reading packed data
617 digitReader.InitBlock(rawDataBlock,rawDataLen,firstRow,lastRow,patch,slice);
619 Bool_t readValue = digitReader.Next();
622 HLTError ( "No value in data block %lu \n", blk);
623 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
627 // -- Fill Zero Suppressed Array
628 // ---------------------------------
631 UShort_t time=0,newTime=0;
632 UInt_t pad=0,newPad=0;
635 Int_t gatingGridOffset=50;
636 Int_t signalThreshold = GetZeroSuppressionThreshold();
637 AliHLTTPCPad baseline(gatingGridOffset, GetNTimeBins() );
639 // just to make later conversion to a list of objects easier
640 AliHLTTPCPad* pCurrentPad=NULL;
641 if ( signalThreshold >= 0) {
642 pCurrentPad=&baseline;
643 baseline.SetThreshold(signalThreshold);
646 while ( readValue ) { // Reads through all digits in block
648 while(1){ //Loop over time bins of current pad
649 // read all the values for one pad at once to calculate the base line
652 if (!pCurrentPad->IsStarted()) {
654 // HLTDebug("reading data for pad %d, padrow %d", digitReader.GetPad(), digitReader.GetRow()+rowOffset);
656 pCurrentPad->SetID(digitReader.GetRow()+rowOffset,digitReader.GetPad());
658 if ( (pCurrentPad->StartEvent()) >= 0) {
659 // loop over data of one pad and read it into AliHLTTPCPad class
661 if ( (digitReader.GetRow()+rowOffset) != pCurrentPad->GetRowNumber() ) break;
662 if ( digitReader.GetPad() != pCurrentPad->GetPadNumber() ) break;
663 pCurrentPad->SetRawData( digitReader.GetTime(), digitReader.GetSignal() );
665 // HLTDebug("set raw data to pad: bin %d charge %d", digitReader.GetTime(), digitReader.GetSignal());
667 } while ( (readValue = digitReader.Next()) != 0 );
670 // calculate baseline of pad
671 pCurrentPad->CalculateBaseLine( GetNTimeBins() / 2);
673 if ( pCurrentPad->Next(kTRUE/*do zero suppression*/) == 0 ) {
674 // HLTDebug("no data available after zero suppression");
676 pCurrentPad->StopEvent();
677 pCurrentPad->ResetHistory();
681 Int_t time = pCurrentPad->GetCurrentPosition();
682 if ( time > pCurrentPad->GetSize() ) {
683 HLTError("invalid time bin for pad");
686 } // end - if (!pCurrentPad->IsStarted()) {
687 } // end - if (pCurrentPad) {
690 Float_t occupancy=pCurrentPad->GetOccupancy();
691 if ( occupancy < GetOccupancyLimit() ) {
692 signal = pCurrentPad->GetCorrectedData();
696 HLTInfo("ignoring pad %d with occupancy level %f %%", pCurrentPad->GetPadNumber(), occupancy);
698 // signal = pCurrentPad->GetCorrectedData();
700 signal = digitReader.GetSignal();
703 fRawDataZeroSuppressed[ pCurrentPad->GetRowNumber() ][ pCurrentPad->GetPadNumber() ][ pCurrentPad->GetCurrentPosition() ] = (UInt_t)signal;
706 HLTDebug("get next charge value: position %d charge %d", time, signal);
708 if( time >= AliHLTTPCTransform::GetNTimeBins() ){
709 HLTWarning("Timebin (%d) out of range (%d)", time, AliHLTTPCTransform::GetNTimeBins());
715 if( (pCurrentPad->Next(kTRUE/*do zero suppression*/)) == 0 ) {
716 pCurrentPad->StopEvent();
717 pCurrentPad->ResetHistory();
720 newPad = digitReader.GetPad();
721 newTime = digitReader.GetTime();
722 newRow = digitReader.GetRow() + rowOffset;
727 newPad=pCurrentPad->GetPadNumber();
728 newTime=pCurrentPad->GetCurrentPosition();
729 newRow=pCurrentPad->GetRowNumber();
733 readValue = digitReader.Next();
735 //Check where to stop:
736 if(!readValue) break; //No more value
738 newPad = digitReader.GetPad();
739 newTime = digitReader.GetTime();
740 newRow = digitReader.GetRow() + rowOffset;
743 if(newPad != pad) break; //new pad
744 if(newTime != time+1) break; //end of sequence
748 } // end - while(1){ // Loop over time bins of current pad
750 if ( !readValue ) break;
752 } // end while ( readValue ) {
754 // -- END ZERO SUPPRESSION
756 // Rewind block for reading packed data
757 digitReader.InitBlock(rawDataBlock,rawDataLen,firstRow,lastRow,patch,slice);
760 // ---------------------
761 readValue = digitReader.Next();
763 // LOOP over raw data and fill arrays
766 Int_t row = digitReader.GetRow() + rowOffset;
767 Int_t pad = (Int_t) digitReader.GetPad();
768 Int_t time = (Int_t) digitReader.GetTime();
769 UInt_t signal = (UInt_t) digitReader.GetSignal();
771 fRawData[row][pad][time] = signal;
773 // -- read next value
774 readValue = digitReader.Next();
777 if(!readValue) break;
779 } // end while ( readValue ){
781 #else //! defined(HAVE_TPC_MAPPING)
782 HLTFatal("DigitReaderRaw not available - check your build");
783 #endif //defined(HAVE_TPC_MAPPING)
785 blk = reader->FindBlockNdx( rawID, " CPT", 0xFFFFFFFF, blk+1 );
787 } // end while ( blk != ~(ULong_t)0 ) {
790 HLTFatal("HOMER raeder not available");
791 #endif // defined(HAVE_HOMERREADER)
795 //____________________________________________________________________________________________________
796 void AliHLTTPCDisplayMain::ReadClusterData(){
797 // -- READ cluster data
798 #if defined(HAVE_HOMERREADER)
799 HOMERReader* reader = (HOMERReader*)fReader;
802 Char_t* spptID="SRETSULC"; // CLUSTERS
803 blk = reader->FindBlockNdx( spptID, " CPT",0xFFFFFFFF );
805 while ( blk != ~(ULong_t)0 ) {
806 HLTDebug( "Found clusters block %lu\n", blk );
808 const AliHLTTPCClusterData* clusterData = (const AliHLTTPCClusterData*)reader->GetBlockData( blk );
809 if ( !clusterData ) {
810 HLTError( "No track data for block %lu\n", blk );
811 blk = reader->FindBlockNdx( spptID, " CPT", 0xFFFFFFFF, blk+1 );
815 ULong_t spec = reader->GetBlockDataSpec( blk );
816 Int_t patch = AliHLTTPCDefinitions::GetMinPatchNr( spec );
817 Int_t slice = AliHLTTPCDefinitions::GetMinSliceNr( spec );
819 HLTDebug( "%lu Clusters found for slice %u - patch %u\n", clusterData->fSpacePointCnt, slice, patch );
821 void* tmp30 = (void*)clusterData;
822 Byte_t* tmp31 = (Byte_t*)tmp30;
824 offset = sizeof(clusterData->fSpacePointCnt);
825 if ( offset <= reader->GetBlockTypeAlignment( blk, 1 ) ) offset = reader->GetBlockTypeAlignment( blk, 1 );
828 AliHLTTPCSpacePointData* tmp32 = (AliHLTTPCSpacePointData*)tmp30;
830 SetupCluster( slice, patch, clusterData->fSpacePointCnt, tmp32 );
832 blk = reader->FindBlockNdx( spptID, " CPT", 0xFFFFFFFF, blk+1 );
836 HLTFatal("HOMER raeder not available");
837 #endif // defined(HAVE_HOMERREADER)
839 //____________________________________________________________________________________________________
840 void AliHLTTPCDisplayMain::ReadTrackData(){
841 // -- READ track data
843 if ( fTracks ) delete fTracks;
844 fTracks = new AliHLTTPCTrackArray;
846 #if defined(HAVE_HOMERREADER)
847 HOMERReader* reader = (HOMERReader*)fReader;
850 Char_t* trkID = "SGESKART"; // TRAKSEGS
851 blk = reader->FindBlockNdx( trkID, " CPT", 0xFFFFFFFF );
853 while ( blk != ~(ULong_t)0 ) {
855 HLTDebug( "Found tracks in block %lu\n", blk );
857 const AliHLTTPCTrackletData* trackData = (const AliHLTTPCTrackletData*)reader->GetBlockData( blk );
860 HLTError( "No track data for block %lu\n", blk );
861 blk = reader->FindBlockNdx( trkID, " CPT", 0xFFFFFFFF, blk+1 );
865 ULong_t spec = reader->GetBlockDataSpec( blk );
866 Int_t slice = AliHLTTPCDefinitions::GetMinSliceNr( spec );
867 Int_t patchmin = AliHLTTPCDefinitions::GetMinPatchNr( spec );
868 Int_t patchmax = AliHLTTPCDefinitions::GetMaxPatchNr( spec );
870 HLTDebug( "%lu tracks found for slice %u - patch %u-%u\n", trackData->fTrackletCnt, slice, patchmin, patchmax );
872 fTracksPerSlice[slice] = trackData->fTrackletCnt; // Fill number if tracks per slice
874 AliHLTTPCTrackSegmentData* tmp42 = (AliHLTTPCTrackSegmentData*) &(trackData->fTracklets[0]);
875 fTracks->FillTracks( trackData->fTrackletCnt, tmp42, slice );
877 blk = reader->FindBlockNdx( trkID, " CPT", 0xFFFFFFFF, blk+1 );
883 HLTFatal("HOMER raeder not available");
884 #endif // defined(HAVE_HOMERREADER)
887 //----------------------------------------------------------------------------------------------------
889 //____________________________________________________________________________________________________
890 void AliHLTTPCDisplayMain::SetupCluster(Int_t slice, Int_t patch, UInt_t nofClusters, AliHLTTPCSpacePointData* data) {
892 if (data && slice>=0 && slice<36 && patch>=0 && patch<AliHLTTPCTransform::GetNPatches()) {
893 if (fClusters[slice][patch]!=NULL) {
894 delete(fClusters[slice][patch]);
895 fClusters[slice][patch]=NULL;
897 Int_t arraysize=nofClusters*sizeof(AliHLTTPCSpacePointData);
898 fClusters[slice][patch] = (AliHLTTPCSpacePointData*)new Byte_t[arraysize];
899 if (fClusters[slice][patch]) {
900 memcpy(fClusters[slice][patch], data, arraysize);
901 fNcl[slice][patch]=nofClusters;
903 fNcl[slice][patch]=nofClusters;
904 HLTError ( "Memory allocation failed!" );
906 } else HLTError ( "Invalid argument!" );
909 //____________________________________________________________________________________________________
910 void AliHLTTPCDisplayMain::SetupTracks() {
913 Int_t ntracks = fTracks->GetNTracks();
915 for(Int_t j=0; j<ntracks; j++) {
916 AliHLTTPCTrack *gtrack = fTracks->GetCheckedTrack(j);
917 if(!gtrack) continue;
919 Int_t nHits = gtrack->GetNHits();
920 UInt_t *hitnum = gtrack->GetHitNumbers();
922 for(Int_t h=0; h<nHits; h++){
925 Int_t slice = (id>>25) & 0x7f;
926 Int_t patch = (id>>22) & 0x7;
927 UInt_t pos = id&0x3fffff;
929 AliHLTTPCSpacePointData *points = fClusters[slice][patch];
932 HLTError ( "No points at slice %d patch %d position %d!", slice, patch, pos );
936 if(pos>=fNcl[slice][patch]) {
937 HLTError ( "Pos is too large: pos %d ncl!", pos,fNcl[slice][patch] );
940 points[pos].fUsed = kTRUE;
941 points[pos].fTrackN = j;
946 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
947 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
948 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
949 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
950 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
951 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
952 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
953 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
954 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
955 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
956 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
957 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
960 //----------------------------------------------------------------------------------------------------
962 //____________________________________________________________________________________________________
964 //____________________________________________________________________________________________________
965 void AliHLTTPCDisplayMain::SetSliceArray() {
967 Int_t minSlice = fMinSlice;
968 Int_t maxSlice = fMaxSlice;
971 for (slice=0;slice< 36;slice++){
972 fSliceArray[slice] = kFALSE;
975 // Single Slice, or Range
976 if (minSlice > maxSlice) maxSlice += 17;
978 for (slice=minSlice;slice<=maxSlice;slice++){
979 realslice = slice % 18;
980 fSliceArray[realslice] = kTRUE;
981 fSliceArray[realslice+18] = kTRUE;
986 minSlice = fMinSlice + 9;
987 maxSlice = fMaxSlice + 9;
989 if (minSlice > maxSlice) maxSlice += 17;
991 for (slice=minSlice;slice<=maxSlice;slice++){
992 realslice = slice % 18;
993 fSliceArray[realslice] = kTRUE;
994 fSliceArray[realslice+18] = kTRUE;
1000 //----------------------------------------------------------------------------------------------------
1002 //____________________________________________________________________________________________________
1003 Int_t AliHLTTPCDisplayMain::GetGlobalTrack(Int_t slice){
1004 // get global track out of the "selectTrack" parameters
1005 Int_t currenttrack= -1;
1006 Int_t trackcounter = 0;
1007 Int_t ntracks = fTracks->GetNTracks();
1009 if ( slice == fSelectTrackSlice) {
1010 for(Int_t j=0; j<ntracks; j++) {
1012 AliHLTTPCTrack *gtrack = fTracks->GetCheckedTrack(j);
1013 if(!gtrack) continue;
1015 // --- CHECK if track is should be drawn
1016 // select Single Track
1017 if(gtrack->GetSector() != fSelectTrackSlice) continue;
1019 if (trackcounter != fSelectTrack){
1025 //if((fPtThreshold > 0) && (gtrack->GetPt()< fPtThreshold)) continue;
1026 //if(gtrack->GetNHits() < fMinHits) continue;
1033 return currenttrack;
1036 //----------------------------------------------------------------------------------------------------
1038 //____________________________________________________________________________________________________
1039 void AliHLTTPCDisplayMain::ExecPadEvent(Int_t event, Int_t px, Int_t py, TObject *selected){
1040 TCanvas *c = (TCanvas *) gTQSender;
1042 if (event == 11 &&selected->InheritsFrom("TH2F")) {
1043 TH2F *hist = (TH2F*) selected;
1045 Int_t binx = hist->GetXaxis()->FindBin(c->AbsPixeltoX(px)) -1 ;
1046 // Int_t biny = hist->GetYaxis()->FindBin(c->AbsPixeltoY(py)) -1;
1048 fPadCallback(fPt2Gui, binx);