- moved AliHLTDisplay files from TPCLib to TPCLib/OnlineDisplay
[u/mrichter/AliRoot.git] / HLT / TPCLib / OnlineDisplay / AliHLTTPCDisplayFront.cxx
1 // $Id$
2
3 /** \class AliHLTTPCDisplayFront
4 <pre>
5 //_____________________________________________________________
6 // AliHLTTPCDisplayFront
7 //
8 // Display class for the HLT TPC-Pad events.
9 </pre>
10 */
11 // Author: Jochen Thaeder <mailto:thaeder@kip.uni-heidelberg.de>
12 //*-- Copyright &copy ALICE HLT Group 
13
14 #include <TH2.h>
15 #include <TFile.h>
16 #include <TStyle.h>
17 #include <TAttText.h>
18 #include <TAxis.h>
19 #include <TCanvas.h>
20
21 #ifdef use_aliroot
22 #include <TClonesArray.h>
23 #include <AliRun.h>
24 #include <AliSimDigits.h>
25 #include <AliTPCParam.h>
26 #endif
27
28 #include "AliHLTStdIncludes.h"
29 #include "AliHLTTPCDefinitions.h"
30 #include "AliHLTDataTypes.h"
31 #include "AliHLTTPCSpacePointData.h"
32 #include "AliHLTTPCClusterDataFormat.h"
33 #include "AliHLTTPCLogging.h"
34 #include "AliHLTTPCTransform.h"
35 #include "AliHLTTPCDigitReaderPacked.h"
36 #include "AliHLTTPCDigitReaderRaw.h"
37
38 #include "AliHLTTPCDisplayMain.h"
39 #include "AliHLTTPCDisplayFront.h"
40
41 #if __GNUC__ >= 3
42 using namespace std;
43 #endif
44
45 ClassImp(AliHLTTPCDisplayFront)
46
47 //____________________________________________________________________________________________________
48 AliHLTTPCDisplayFront::AliHLTTPCDisplayFront(AliHLTTPCDisplayMain* display) {
49     // constructor
50     fDisplay = display;
51
52     fNTimes = AliHLTTPCTransform::GetNTimeBins();
53
54     fBinY[0] = 0;
55     fBinY[1] = AliHLTTPCTransform::GetNRows() - 1;
56     fBinX[0] = 0;      
57     fBinX[1] = AliHLTTPCTransform::GetNPads(fBinY[1]);
58     fTmpEvent = 0;    
59
60     fHistfront = new TH2F("fHistfront","FrontView of selected slice;Pad #;Padrow #",fBinX[1]+1,fBinX[0],fBinX[1],fBinY[1]+1,fBinY[0],fBinY[1]);
61
62     fHistfront->SetOption("COLZ");  
63     fHistfront->SetTitleSize(0.03);
64     fHistfront->GetXaxis()->SetLabelSize(0.03);
65     fHistfront->GetXaxis()->SetTitleSize(0.03);
66     fHistfront->GetYaxis()->SetLabelSize(0.03);
67     fHistfront->GetYaxis()->SetTitleSize(0.03);
68 }
69
70 //____________________________________________________________________________________________________
71 AliHLTTPCDisplayFront::~AliHLTTPCDisplayFront() {
72     // destructor   
73     if ( fHistfront ){
74         delete fHistfront;
75         fHistfront = NULL;
76     }
77 }
78
79 //____________________________________________________________________________________________________
80 void AliHLTTPCDisplayFront::Reset(){  
81     fHistfront->Reset(); 
82 }
83
84 //____________________________________________________________________________________________________
85 void AliHLTTPCDisplayFront::Save(){  
86     fCanvas->SaveAs("HLT-FrontView.eps"); 
87 }
88
89 //____________________________________________________________________________________________________
90 void AliHLTTPCDisplayFront::Fill(Int_t patch, ULong_t dataBlock, ULong_t dataLen){
91     // Fill Pad Histogram
92
93 #if defined(HAVE_TPC_MAPPING)
94     AliHLTTPCDigitReaderRaw digitReader(0);
95
96     bool readValue = true;
97     Int_t rowOffset = 0;
98     
99     Int_t timebin = fDisplay->GetTimebin();
100     Bool_t allTimebins = fDisplay->GetAllTimebins();
101     Int_t slice = fDisplay->GetSlicePadRow();
102
103     // Initialize RAW DATA
104     Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
105     Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
106
107     // Outer sector, patches 2, 3, 4, 5 -  start counting in patch 2 with row 0
108     if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
109
110     // Initialize block for reading packed data
111     void* tmpdataBlock = (void*) dataBlock;
112     digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
113
114     readValue = digitReader.Next();
115
116     if (!readValue){    
117         LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplayFrontRow::Fill","Read first value") << "No value in data block" << ENDLOG;
118         return;
119     }
120
121     // -- Fill Raw Data
122     while ( readValue ){ 
123
124         UShort_t time = digitReader.GetTime();
125
126         // check if all timebins or just one
127         if (allTimebins || time == timebin ) 
128             fHistfront->Fill(digitReader.GetPad(),(digitReader.GetRow() + rowOffset),digitReader.GetSignal());
129         
130         // read next value
131         readValue = digitReader.Next();
132       
133         //Check where to stop:
134         if(!readValue) break; //No more value
135     } 
136 #else //! defined(HAVE_TPC_MAPPING)
137       HLTFatal("DigitReaderRaw not available - check your build");
138 #endif //defined(HAVE_TPC_MAPPING)
139 }
140
141 //____________________________________________________________________________________________________
142 void AliHLTTPCDisplayFront::Draw(){
143     fDisplay->GetCanvasFront()->cd();
144     fDisplay->GetCanvasFront()->Clear();
145
146     Char_t title[256];
147     sprintf(title,"FrontView of selected slice%d",fDisplay->GetSlicePadRow());
148
149     // Keep Zoom
150     if (!fDisplay->GetKeepView() ){
151         fBinY[0] = 0;
152         fBinY[1] = AliHLTTPCTransform::GetNRows() - 1;
153         fBinX[0] = 0;      
154         fBinX[1] = AliHLTTPCTransform::GetNPads(fBinY[1]);
155     }
156
157     fHistfront->SetAxisRange(fBinX[0],fBinX[1]);
158     fHistfront->SetAxisRange(fBinY[0],fBinY[1],"Y");
159
160     fHistfront->SetTitle(title);
161     fHistfront->SetStats(kFALSE);
162     fHistfront->Draw("COLZ");
163
164     fDisplay->GetCanvasFront()->Modified();
165     fDisplay->GetCanvasFront()->Update();
166
167     // Select Pad
168     // fCanvas->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayFront",(void*) fDisplay,"ExecPadEvent(Int_t,Int_t,Int_t,TObject*)");
169
170     // Keep Zoom
171     fDisplay->GetCanvasFront()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayFront",(void*) this,"ExecEvent(Int_t,Int_t,Int_t,TObject*)");
172 }
173
174 //____________________________________________________________________________________________________
175 void AliHLTTPCDisplayFront::ExecEvent(Int_t event, Int_t px, Int_t py, TObject *selected){
176    // Saves the Zoom Position of the Histogram 
177
178    // - Mouse down on Axis : StartPoint of Range
179    if (event == 1 && selected->InheritsFrom("TAxis"))
180        fTmpEvent = 1;
181
182    // - Mouse pressed on Axis : Real Zoom process not only click
183    else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 1)
184        fTmpEvent = 21;
185
186    // - Mouse pressed on Axis : Still pressed
187    else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 21) 
188        return;
189
190     // - Mouse up on Axis : End Point of Rangex
191    else if (event == 11 && selected->InheritsFrom("TAxis") && fTmpEvent == 21){
192        TAxis * axis = (TAxis*) selected;
193        
194        if (selected == fHistfront->GetXaxis() || selected == fHistfront->GetXaxis()){ 
195            fBinX[0] = axis->GetFirst() -1;
196            fBinX[1] = axis->GetLast() -1;
197        }
198        else {
199            fBinY[0] = axis->GetFirst() -1;
200            fBinY[1] = axis->GetLast() -1;
201        }
202
203        fTmpEvent = 0; 
204    }
205    else fTmpEvent = 0;
206 }