- moved AliHLTDisplay files from TPCLib to TPCLib/OnlineDisplay
[u/mrichter/AliRoot.git] / HLT / TPCLib / OnlineDisplay / AliHLTTPCDisplayPadRow.cxx
1 // $Id$
2
3 /** \class AliHLTTPCDisplayPadRow
4 <pre>
5 //_____________________________________________________________
6 // AliHLTTPCDisplayPadRow
7 //
8 // Display class for the HLT TPC-PadRow 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 #include <TPolyMarker3D.h>
21
22 #ifdef use_aliroot
23 #include <TClonesArray.h>
24 #include <AliRun.h>
25 #include <AliSimDigits.h>
26 #include <AliTPCParam.h>
27 #endif
28
29 #include "AliHLTStdIncludes.h"
30 #include "AliHLTTPCDefinitions.h"
31 #include "AliHLTDataTypes.h"
32 #include "AliHLTTPCSpacePointData.h"
33 #include "AliHLTTPCClusterDataFormat.h"
34 #include "AliHLTTPCLogging.h"
35 #include "AliHLTTPCTransform.h"
36 #include "AliHLTTPCDigitReaderPacked.h"
37 #include "AliHLTTPCDigitReaderRaw.h"
38
39
40 #include "AliHLTTPCDisplayMain.h"
41 #include "AliHLTTPCDisplayPadRow.h"
42 #include "AliHLTTPCDisplayPad.h"
43
44 #if __GNUC__ >= 3
45 using namespace std;
46 #endif
47
48 ClassImp(AliHLTTPCDisplayPadRow)
49
50 //____________________________________________________________________________________________________
51 AliHLTTPCDisplayPadRow::AliHLTTPCDisplayPadRow(AliHLTTPCDisplayMain* display) {
52     // constructor
53     fDisplay = display;
54
55     fNTimes = AliHLTTPCTransform::GetNTimeBins();
56     
57     fBinX[0] = 0;      
58     fBinX[1] = fDisplay->GetNPads(); 
59     fBinY[0] = 0;
60     fBinY[1] = fNTimes -1;
61     fTmpEvent = 0;         
62
63     for (Int_t ii = 0;ii < 20; ii++)
64       fpmarr[ii] = 0;
65
66     Int_t maxpads = 150;
67     Int_t padbinning = maxpads*10;
68
69     fHistraw = new TH2F("fHistraw","Selected PadRow with found Clusters;Pad #;Timebin #",maxpads,0,maxpads-1,fNTimes,0,fNTimes-1);
70     fHistrawcl = new TH1F("fHistrawcl","cvcv;ddd;kkk",padbinning,0,maxpads-1);
71
72     fHistraw->SetOption("COLZ");    
73     fHistraw->SetTitleSize(0.03);
74     fHistraw->GetXaxis()->SetLabelSize(0.03);
75     fHistraw->GetXaxis()->SetTitleSize(0.03);
76     fHistraw->GetYaxis()->SetLabelSize(0.03);
77     fHistraw->GetYaxis()->SetTitleSize(0.03);
78
79     gStyle->SetPalette(1);
80 }
81
82 //____________________________________________________________________________________________________
83 AliHLTTPCDisplayPadRow::~AliHLTTPCDisplayPadRow() {
84     // destructor     
85     if ( fHistraw ){
86         delete fHistraw;
87         fHistraw = NULL;
88     }
89     if ( fHistrawcl ){
90         delete fHistrawcl;
91         fHistrawcl = NULL;
92     }
93     for (Int_t ii=19; ii <= 0; ii--){ // try fwd
94       if ( fpmarr[ii] ){
95         delete [] fpmarr[ii];
96         fpmarr[ii] = NULL;
97       }
98     }
99 }
100
101 //____________________________________________________________________________________________________
102 void AliHLTTPCDisplayPadRow::Reset(){  
103   fHistraw->Reset();   
104   fHistrawcl->Reset(); 
105 }
106
107 //____________________________________________________________________________________________________
108 void AliHLTTPCDisplayPadRow::Save(){  
109   fDisplay->GetCanvasCharge()->SaveAs("HLT-PadRowView.eps"); 
110 }
111
112 //____________________________________________________________________________________________________
113 void AliHLTTPCDisplayPadRow::Fill(Int_t patch, ULong_t dataBlock, ULong_t dataLen){
114     // Fill PadRow Histogram
115     
116 #if defined(HAVE_TPC_MAPPING)
117     AliHLTTPCDigitReaderRaw digitReader(0);
118
119     bool readValue = true;
120     Int_t rowOffset = 0;
121     
122     Int_t padRow = fDisplay->GetPadRow();
123     Int_t slice = fDisplay->GetSlicePadRow();
124
125     // Initialize RAW DATA
126     Int_t firstRow = AliHLTTPCTransform::GetFirstRow(patch);
127     Int_t lastRow = AliHLTTPCTransform::GetLastRow(patch);
128
129     // Outer sector, patches 2, 3, 4, 5 -  start counting in patch 2 with row 0
130     if ( patch >= 2 ) rowOffset = AliHLTTPCTransform::GetFirstRow( 2 );
131
132     // Initialize block for reading packed data
133     void* tmpdataBlock = (void*) dataBlock;
134     digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
135
136     readValue = digitReader.Next();
137
138     if (!readValue){    
139         LOG(AliHLTTPCLog::kError,"AliHLTTPCDisplayPadRow::Fill","Read first value") << "No value in data block" << ENDLOG;
140         return;
141     }
142
143     // FILL PADROW 3D --- Initialize the colorbins
144     if ( fDisplay->Get3DSwitchPadRow() ){
145         for (UInt_t ii=0;ii < 20;ii++){
146             fbinct[ii] = 0;
147             fcolorbin[ii] = 0;
148         }
149
150         // read number of entries in colorbin
151         while ( readValue ){ 
152             
153             Int_t row = digitReader.GetRow() + rowOffset;
154             
155             if (row == padRow){    
156                 UInt_t charge = digitReader.GetSignal();
157                 
158                 for (UInt_t ii=0;ii < 19;ii++){
159                     if ( charge > (ii*15) && charge <= ((ii*15) + 15) ) fcolorbin[ii]++;
160                 }
161                 // larger than 19 * 15  
162                 if (charge > 285 ) fcolorbin[19]++;
163             }
164
165             // read next value
166             readValue = digitReader.Next();
167       
168             if(!readValue) break; //No more value
169         } 
170
171         // Initialize fpmarr[color][3*colorbin[ii]] 
172         for (Int_t ii = 0; ii < 20; ii++) {
173           if ( fpmarr[ii] ) delete[] fpmarr[ii];
174           fpmarr[ii] = new Float_t[fcolorbin[ii]*3]; 
175         }
176
177         // Rewind the raw reader and fill the polymarker3D
178         digitReader.InitBlock(tmpdataBlock,dataLen,firstRow,lastRow,patch,slice);
179         
180         readValue = digitReader.Next();
181     } // END if (fDisplay->Get3DSwitchPadRow())
182
183     // -- Fill Raw Data
184     while ( readValue ){ 
185
186         Int_t row = digitReader.GetRow() + rowOffset;
187
188         // select padrow to fill in histogramm
189         if (row == padRow){    
190             UChar_t pad = digitReader.GetPad();
191             UShort_t time = digitReader.GetTime();
192             UInt_t charge = digitReader.GetSignal();
193             Float_t xyz[3];
194             fHistraw->Fill(pad,time,charge);
195
196             if ( fDisplay->Get3DSwitchPadRow() ) {
197                 // Transform raw coordinates to local coordinates
198                 AliHLTTPCTransform::RawHLT2Global(xyz, slice, padRow, pad, time);
199
200                 for (UInt_t ii=0;ii < 19;ii++){
201                     if ( charge > (ii*15) && charge <= ((ii*15) + 15) ){
202                         fpmarr[ii][fbinct[ii]] = xyz[0];
203                         fpmarr[ii][fbinct[ii]+1] = xyz[1];
204                         fpmarr[ii][fbinct[ii]+2] = xyz[2];
205                         fbinct[ii] += 3;
206                     }
207                 }
208                 // larger than 19 * 15
209                 if (charge > 285 ) {
210                     fpmarr[19][fbinct[19]] = xyz[0];
211                     fpmarr[19][fbinct[19]+1] = xyz[1];
212                     fpmarr[19][fbinct[19]+2] = xyz[2];
213                     fbinct[19] += 3;
214                 }
215             } // END if (fSwitch3DPadRow)
216         
217         } // END if (row == padRow){ 
218         
219         // read next value
220         readValue = digitReader.Next();
221       
222         //Check where to stop:
223         if(!readValue) break; //No more value
224     } 
225     
226      if (fDisplay->ExistsClusterData()){
227         AliHLTTPCSpacePointData *points = fDisplay->GetSpacePointDataPointer(slice,patch);
228         if(!points) return;
229         
230         Float_t xyz[3];
231         for(Int_t i=0; i< fDisplay->GetNumberSpacePoints(slice,patch); i++){
232             xyz[0] = points[i].fX;
233             xyz[1] = points[i].fY;
234             xyz[2] = points[i].fZ;
235         
236             // select padrow to fill in histogramm
237             if (padRow == AliHLTTPCTransform::GetPadRow(xyz[0])){
238                 AliHLTTPCTransform::LocHLT2Raw(xyz, slice, padRow);
239                 fHistrawcl->Fill(xyz[1],xyz[2]);
240             }
241         }
242      } // END if (fDisplay->ExistsClusterData()){
243 #else //! defined(HAVE_TPC_MAPPING)
244       HLTFatal("DigitReaderRaw not available - check your build");
245 #endif //defined(HAVE_TPC_MAPPING)
246  
247 }
248
249 //____________________________________________________________________________________________________
250 void AliHLTTPCDisplayPadRow::Draw(){
251
252     fDisplay->GetCanvasPadRow()->cd();
253     fDisplay->GetCanvasPadRow()->Clear();
254
255     if (fDisplay->GetSplitPadRow()){
256         fDisplay->GetCanvasPadRow()->Divide(1,2);
257         fDisplay->GetCanvasPadRow()->cd(1);
258     }
259   
260     Char_t title[256];
261     sprintf(title,"Selected PadRow %d with found Clusters",fDisplay->GetPadRow());
262   
263     // Keep Zoom
264     if (!fDisplay->GetKeepView() || (fBinX[1]>fDisplay->GetNPads()) || (fBinY[1]>fNTimes)){
265         fBinX[0] = 0;
266         fBinX[1] = fDisplay->GetNPads();
267         fBinY[0] = 0;
268         fBinY[1] = fNTimes - 1;
269     }
270     
271     fHistraw->SetAxisRange(fBinX[0],fBinX[1]); 
272     fHistraw->SetAxisRange(fBinY[0],fBinY[1],"Y");
273     fHistraw->SetTitle(title);
274     fHistraw->SetStats(kFALSE);
275     fHistraw->Draw("COLZ");
276     
277     if ( fDisplay->ExistsClusterData() ){
278         cout << "XX" <<  endl;
279         fHistrawcl->SetAxisRange(fBinX[0],fBinX[1]);
280         fHistrawcl->SetAxisRange(fBinY[0],fBinY[1],"Y");
281         fHistrawcl->SetStats(kFALSE);
282         fHistrawcl->SetMarkerStyle(28);
283         fHistrawcl->SetMarkerSize(2);
284         fHistrawcl->SetMarkerColor(1);
285         fHistrawcl->Draw("psame");
286     }
287     
288     if (fDisplay->GetSplitPadRow()){
289         fDisplay->GetCanvasPadRow()->cd(2);
290         fDisplay->GetPadPointer()->fHistpad2->Draw();
291     }
292     
293     fDisplay->GetCanvasPadRow()->Modified();
294     fDisplay->GetCanvasPadRow()->Update();
295     
296     // Select Pad
297     fDisplay->GetCanvasPadRow()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayMain",(void*) fDisplay,"ExecPadEvent(Int_t,Int_t,Int_t,TObject*)");
298     // Keep Zoom
299     fDisplay->GetCanvasPadRow()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","AliHLTTPCDisplayPadRow",(void*) this,"ExecEvent(Int_t,Int_t,Int_t,TObject*)");
300 }
301
302 //____________________________________________________________________________________________________
303 void AliHLTTPCDisplayPadRow::Draw3D(){
304     Int_t markercolor = 51;
305     
306     for (UInt_t ii=0;ii < 20;ii++){
307         if (fcolorbin[ii]> 0){
308             
309             TPolyMarker3D* pm = new  TPolyMarker3D(fcolorbin[ii], fpmarr[ii], 7 );
310             pm->SetBit(kCanDelete);
311
312             pm->SetMarkerColor(markercolor); 
313             pm->Draw(""); 
314         }
315
316         // in order to have the SetPalette(1), so called "pretty"
317         if (ii % 2 == 0 ) markercolor += 2;
318         else  markercolor += 3;
319     }
320 }
321
322 //____________________________________________________________________________________________________
323 void AliHLTTPCDisplayPadRow::ExecEvent(Int_t event, Int_t px, Int_t py, TObject *selected){
324    // Saves the Zoom Position of the Histogram 
325
326    // - Mouse down on Axis : StartPoint of Range
327    if (event == 1 && selected->InheritsFrom("TAxis"))
328        fTmpEvent = 1;
329
330    // - Mouse pressed on Axis : Real Zoom process not only click
331    else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 1)
332        fTmpEvent = 21;
333
334    // - Mouse pressed on Axis : Still pressed
335    else if (event == 21 && selected->InheritsFrom("TAxis") && fTmpEvent == 21) 
336        return;
337
338     // - Mouse up on Axis : End Point of Rangex
339    else if (event == 11 && selected->InheritsFrom("TAxis") && fTmpEvent == 21){
340        TAxis * axis = (TAxis*) selected;
341        
342        if (selected == fHistraw->GetXaxis() || selected == fHistrawcl->GetXaxis()){ 
343            fBinX[0] = axis->GetFirst() -1;
344            fBinX[1] = axis->GetLast() -1;
345        }
346        else {
347            fBinY[0] = axis->GetFirst() -1;
348            fBinY[1] = axis->GetLast() -1;
349        }
350
351        
352        //    Reset();
353 //     Fill();
354        //   Draw();
355
356        fTmpEvent = 0; 
357    }
358    else fTmpEvent = 0;
359 }