Some problems with the HP compiler fixed.
[u/mrichter/AliRoot.git] / MUON / AliMUONpoints.cxx
CommitLineData
4c039060 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/*
17$Log$
18*/
19
fe4da5cc 20///////////////////////////////////////////////////////////////////////////////
21// //
22// This class contains the points for the ALICE event display //
23// //
24//Begin_Html
25/*
a897a37a 26<img src="gif/AliMUONpointsClass.gif">
fe4da5cc 27*/
28//End_Html
29// //
30// //
31///////////////////////////////////////////////////////////////////////////////
a897a37a 32
fe4da5cc 33#include "AliMUONpoints.h"
a897a37a 34#include "AliMUONdisplay.h"
fe4da5cc 35#include "AliRun.h"
36#include "TPad.h"
a897a37a 37#include "TVirtualPad.h"
38#include "TPolyLine3D.h"
39#include "TPaveText.h"
fe4da5cc 40#include "TView.h"
41#include "TMath.h"
42
a897a37a 43//const Int_t MAX_Nipx=1026, MAX_Nipy=1026;
fe4da5cc 44const Int_t MAX_Nipx=400, MAX_Nipy=800;
45
46ClassImp(AliMUONpoints)
47
48//_____________________________________________________________________________
49AliMUONpoints::AliMUONpoints()
50{
51 //
52 // Default constructor
53 //
54 fHitIndex = 0;
55 fTrackIndex = 0;
56 fDigitIndex = 0;
a897a37a 57 fMarker[0] = fMarker[1] = fMarker[2]=0;
58 fMatrix = 0;
fe4da5cc 59}
60
61//_____________________________________________________________________________
62AliMUONpoints::AliMUONpoints(Int_t npoints)
63 :AliPoints(npoints)
64{
65 //
66 // Standard constructor
67 //
68 fHitIndex = 0;
69 fTrackIndex = 0;
70 fDigitIndex = 0;
a897a37a 71 fMarker[0] = fMarker[1] = fMarker[2]=0;
72 fMatrix = 0;
fe4da5cc 73}
74
75//_____________________________________________________________________________
76AliMUONpoints::~AliMUONpoints()
77{
78 //
79 // Default destructor
80 //
81 fHitIndex = 0;
82 fTrackIndex = 0;
83 fDigitIndex = 0;
a897a37a 84 for (Int_t i=0;i<3;i++){
8eb67615 85 if (fMarker[i]) delete fMarker[i];
a897a37a 86 }
87 fMatrix = 0;
fe4da5cc 88}
89
90//_____________________________________________________________________________
a897a37a 91//void AliMUONpoints::ExecuteEvent(Int_t event, Int_t px, Int_t py)
92//{
93 //
94 //*-*-*-*-*-*-*-*-*-*Execute action corresponding to one event*-*-*-*-*-*-*-*
95 //*-* =========================================
96 //*-*
97 //*-* This member function must be implemented to realize the action
98 //*-* corresponding to the mouse click on the object in the window
99 //*-*
100 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
101// gPad->SetCursor(kCross);
102
103//}
104//_____________________________________________________________________________
fe4da5cc 105void AliMUONpoints::DumpHit()
106{
107 //
108 // Dump hit corresponding to this point
109 //
110 AliMUONhit *hit = GetHit();
111 if (hit) hit->Dump();
112}
113
114//_____________________________________________________________________________
115void AliMUONpoints::DumpDigit()
116{
117 //
118 // Dump digit corresponding to this point
119 //
120 AliMUONdigit *digit = GetDigit();
121 if (digit) digit->Dump();
122}
123
124//_____________________________________________________________________________
125void AliMUONpoints::InspectHit()
126{
127 //
128 // Inspect hit corresponding to this point
129 //
a897a37a 130
131 if (fHitIndex < 0 ) return;
132 TVirtualPad *padsav = gPad;
fe4da5cc 133 AliMUONhit *hit = GetHit();
134 if (hit) hit->Inspect();
a897a37a 135 TVirtualPad *padinspect = (TVirtualPad*)(gROOT->GetListOfCanvases())->FindObject("inspect");
136 padinspect->cd();
137 Float_t xmin = gPad->GetX1();
138 Float_t xmax = gPad->GetX2();
139 Float_t ymin = gPad->GetY1();
140 Float_t ymax = gPad->GetY2();
141 Float_t dy = ymax-ymin;
142
143 TPaveText *pad = new TPaveText(xmin, ymin+0.1*dy, xmax, ymin+0.15*dy);
144 pad->SetBit(kCanDelete);
145 pad->SetFillColor(42);
146 pad->Draw();
147 char ptitle[100];
148 sprintf(ptitle," %s , fTrack: %d fTrackIndex: %d ",GetName(),fIndex,fTrackIndex);
149 pad->AddText(ptitle);
150 padinspect->cd();
151 padinspect->Update();
152 if (padsav) padsav->cd();
153
fe4da5cc 154}
155
156//_____________________________________________________________________________
157void AliMUONpoints::InspectDigit()
158{
159 //
160 // Inspect digit corresponding to this point
161 //
a897a37a 162 if (fDigitIndex < 0) return;
163 TVirtualPad *padsav = gPad;
fe4da5cc 164 AliMUONdigit *digit = GetDigit();
165 if (digit) digit->Inspect();
a897a37a 166 TVirtualPad *padinspect = (TVirtualPad*)(gROOT->GetListOfCanvases())->FindObject("inspect");
167 padinspect->cd();
168 Float_t xmin = gPad->GetX1();
169 Float_t xmax = gPad->GetX2();
170 Float_t ymin = gPad->GetY1();
171 Float_t ymax = gPad->GetY2();
172 Float_t dy = ymax-ymin;
173
174 TPaveText *pad = new TPaveText(xmin, ymin+0.1*dy, xmax, ymin+0.25*dy);
175 pad->SetBit(kCanDelete);
176 pad->SetFillColor(42);
177 pad->Draw();
178 char ptitle[11][100];
179 // sprintf(ptitle[11],"Tracks making this digit");
180 // pad->AddText(ptitle[11]);
181 for (int i=0;i<10;i++) {
182 if (digit->fTracks[i] == 0) continue;
183 sprintf(ptitle[i],"fTrackIndex: %d Charge: %d",digit->fTracks[i],digit->fTcharges[i]);
184 pad->AddText(ptitle[i]);
185 }
186 padinspect->cd();
187 padinspect->Update();
188 if (padsav) padsav->cd();
189
fe4da5cc 190}
191
192//_____________________________________________________________________________
193Int_t AliMUONpoints::GetTrackIndex()
194{
195 //
196 // Dump digit corresponding to this point
197 //
8eb67615 198
fe4da5cc 199 this->Inspect();
a897a37a 200 /*
201 if (fDigitIndex != 0) {
202 Int_t ncol=this->fMatrix->GetNcols();
203 for (int i=0;i<ncol;i++) {
204 printf(" track charge %f %f \n",(*(this->fMatrix))(0,i),(*(this->fMatrix))(1,i));
205 }
206 }
207 */
fe4da5cc 208 return fTrackIndex;
209}
210
211//_____________________________________________________________________________
212AliMUONhit *AliMUONpoints::GetHit() const
213{
214 //
215 // Returns pointer to hit index in AliRun::fParticles
216 //
0f439796 217 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
fe4da5cc 218 gAlice->TreeH()->GetEvent(fTrackIndex);
219 TClonesArray *MUONhits = MUON->Hits();
220 Int_t nhits = MUONhits->GetEntriesFast();
221 if (fHitIndex < 0 || fHitIndex >= nhits) return 0;
222 return (AliMUONhit*)MUONhits->UncheckedAt(fHitIndex);
223}
224
225//_____________________________________________________________________________
226AliMUONdigit *AliMUONpoints::GetDigit() const
227{
228 //
229 // Returns pointer to digit index in AliRun::fParticles
230 //
231
232 AliMUONdisplay *display=(AliMUONdisplay*)gAlice->Display();
233 Int_t chamber=display->GetChamber();
234 Int_t cathode=display->GetCathode();
235
0f439796 236 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
fe4da5cc 237 TClonesArray *MUONdigits = MUON->DigitsAddress(chamber-1);
a897a37a 238 Int_t nent=(Int_t)gAlice->TreeD()->GetEntries();
239 gAlice->TreeD()->GetEvent(nent-2+cathode-1);
240 //gAlice->TreeD()->GetEvent(cathode);
fe4da5cc 241 Int_t ndigits = MUONdigits->GetEntriesFast();
242 if (fDigitIndex < 0 || fDigitIndex >= ndigits) return 0;
243 return (AliMUONdigit*)MUONdigits->UncheckedAt(fDigitIndex);
244}
245//_____________________________________________________________________________
246struct Bin {
247 const AliMUONdigit *dig;
248 int idx;
249 Bin() {dig=0; idx=-1;}
250};
251
252struct PreCluster : public AliMUONreccluster {
253 const AliMUONdigit* summit;
254 int idx;
255 int cut;
256 int npeaks;
a897a37a 257 int npoly;
258 float xpoly[100];
259 float ypoly[100];
260 float zpoly[100];
261 PreCluster() : AliMUONreccluster() {cut=npeaks=npoly=0;
262 for (int k=0;k<100;k++) {
263 xpoly[k]=ypoly[k]=zpoly[k]=0;
264 }
265 }
266
fe4da5cc 267};
268//_____________________________________________________________________________
269
a897a37a 270static void FindCluster(AliMUONchamber *iChamber, AliMUONsegmentation *segmentation, int i, int j, Bin bins[][MAX_Nipy], PreCluster &c)
fe4da5cc 271
272{
273
274 //
275 // Find clusters
276 //
277
fe4da5cc 278
279 Bin& b=bins[i][j];
280 Int_t q=b.dig->fSignal;
281
fe4da5cc 282 if (q<0) {
283 q=-q;
284 c.cut=1;
285 }
a897a37a 286 // if (b.idx >= 0 && b.idx != c.idx) {
287 if (b.idx >= 0 && b.idx > c.idx) {
fe4da5cc 288 c.idx=b.idx;
289 c.npeaks++;
290 }
291
292 if (q > TMath::Abs(c.summit->fSignal)) c.summit=b.dig;
293
8eb67615 294 Float_t zpos=iChamber->ZPosition();
a897a37a 295
fe4da5cc 296 Int_t npx = segmentation->Npx();
297 Int_t npy = segmentation->Npy();
a897a37a 298
fe4da5cc 299
a897a37a 300 // get pad coordinates and prepare the up and down steps
8eb67615 301 Int_t jup =(j-npy > 0) ? j+1 : j-1;
302 Int_t jdown=(j-npy > 0) ? j-1 : j+1;
303
a897a37a 304 Float_t x, y;
305 segmentation->GetPadCxy(i-npx, j-npy,x, y);
306 Int_t isec0=segmentation->Sector(i-npx,j-npy);
a897a37a 307
308 Float_t dpy = segmentation->Dpy(isec0);
309 Float_t dpx = segmentation->Dpx(isec0)/16;
310 Int_t ixx, iyy;
311 Float_t absx=TMath::Abs(x);
312 // iup
313 (y >0) ? segmentation->GetPadIxy(absx+dpx,y+dpy,ixx,iyy) : segmentation->GetPadIxy(absx+dpx,y-dpy,ixx,iyy);
8eb67615 314
315 // Int_t jtest=TMath::Abs(iyy)-npy-1;
316
a897a37a 317 Int_t iup=(x >0) ? ixx+npx : -ixx+npx;
318 // idown
319 (y >0) ? segmentation->GetPadIxy(absx+dpx,y-dpy,ixx,iyy) : segmentation->GetPadIxy(absx+dpx,y+dpy,ixx,iyy);
8eb67615 320
a897a37a 321 Int_t idown=(x >0) ? ixx+npx : -ixx+npx;
322 if (bins[idown][jdown].dig == 0) {
323 (y >0) ? segmentation->GetPadIxy(absx-dpx,y-dpy,ixx,iyy) : segmentation->GetPadIxy(absx-dpx,y+dpy,ixx,iyy);
a897a37a 324 idown=(x >0) ? ixx+npx : -ixx+npx;
325 }
326
a897a37a 327
328 // calculate center of gravity
329 c.npoly++;
330 if (c.npoly > 100 ) {
331 printf("FindCluster - npoly >100, npoly %d \n",c.npoly);
332 c.npoly=100;
333 }
334 c.xpoly[c.npoly-1]=x;
335 c.ypoly[c.npoly-1]=y;
336 c.zpoly[c.npoly-1]=zpos;
fe4da5cc 337
338 c.fX += q*x;
339 c.fY += q*y;
340 c.fQ += q;
341
342 b.dig = 0; b.idx = c.idx;
a897a37a 343
344 // left and right
fe4da5cc 345 if (bins[i-1][j].dig) FindCluster(iChamber,segmentation,i-1,j,bins,c);
fe4da5cc 346 if (bins[i+1][j].dig) FindCluster(iChamber,segmentation,i+1,j,bins,c);
a897a37a 347 // up and down
348 if (bins[iup][jup].dig) FindCluster(iChamber,segmentation,iup,jup,bins,c);
349 if (bins[idown][jdown].dig) FindCluster(iChamber,segmentation,idown,jdown,bins,c);
fe4da5cc 350
351}
352
353//_____________________________________________________________________________
354
355void AliMUONpoints::GetCenterOfGravity()
356{
357 //
358 // simple MUON cluster finder from digits -- finds neighbours and
359 // calculates center of gravity for the cluster
360 //
a897a37a 361
362 // const Int_t MAX_Nipx=1026, MAX_Nipy=1026;
363
364 Bin bins[MAX_Nipx][MAX_Nipy];
365
fe4da5cc 366 AliMUONdisplay *display=(AliMUONdisplay*)gAlice->Display();
367 Int_t chamber=display->GetChamber();
368 Int_t cathode=display->GetCathode();
369
0f439796 370 AliMUON *MUON = (AliMUON*)gAlice->GetModule("MUON");
fe4da5cc 371 AliMUONchamber *iChamber;
372 AliMUONsegmentation *segmentation;
373 iChamber =&(MUON->Chamber(chamber-1));
374 segmentation=iChamber->GetSegmentationModel(cathode);
375 Int_t npx = segmentation->Npx();
376 Int_t npy = segmentation->Npy();
377 Float_t zpos=iChamber->ZPosition();
a897a37a 378
fe4da5cc 379 TClonesArray *MUONdigits = MUON->DigitsAddress(chamber-1);
a897a37a 380 Int_t nent=(Int_t)gAlice->TreeD()->GetEntries();
381 gAlice->TreeD()->GetEvent(nent-2+cathode-1);
382 //gAlice->TreeD()->GetEvent(cathode);
fe4da5cc 383 Int_t ndigits = MUONdigits->GetEntriesFast();
384 if (fDigitIndex < 0 || fDigitIndex >= ndigits) return;
385
386 AliMUONdigit *dig;
387 dig=(AliMUONdigit*)MUONdigits->UncheckedAt(fDigitIndex);
388 Int_t ipx=dig->fPadX;
389 Int_t ipy=dig->fPadY;
fe4da5cc 390 bins[ipx+npx][ipy+npy].dig=dig;
391
392 int ndig;
393 int ncls=0;
a897a37a 394 for (ndig=0;ndig<ndigits;ndig++) {
395 dig = (AliMUONdigit*)MUONdigits->UncheckedAt(ndig);
396 int i=dig->fPadX, j=dig->fPadY;
397 bins[i+npx][j+npy].dig=dig;
fe4da5cc 398 }
a897a37a 399 PreCluster c; c.summit=bins[ipx+npx][ipy+npy].dig; c.idx=ncls;
400 FindCluster(iChamber,segmentation,ipx+npx, ipy+npy, bins, c);
a897a37a 401
402 if (c.npeaks>1) {
fe4da5cc 403 printf("GetCenterOfGravity -- more than one peak");
a897a37a 404 }
405 c.fX /= c.fQ;
406 c.fY /= c.fQ;
8eb67615 407
a897a37a 408 c.fTracks[0]=c.summit->fTracks[0];
409 c.fTracks[1]=c.summit->fTracks[1];
410 c.fTracks[2]=c.summit->fTracks[2];
411 ncls++;
412 AliMUONpoints *points = 0;
413 points = new AliMUONpoints(1);
414 points->SetMarkerColor(kYellow);
415 points->SetMarkerStyle(5);
416 points->SetMarkerSize(1.);
417 points->SetPoint(0,c.fX,c.fY,zpos);
418 points->SetParticle(-1);
419 points->Draw();
fe4da5cc 420
a897a37a 421 TPolyLine3D *pline=0;
422 /*
423 pline=new TPolyLine3D(c.npoly);
424 Int_t np=c.npoly;
425 TVector *xp=new TVector(c.npoly);
426 TVector *yp=new TVector(c.npoly);
427 TVector *zp=new TVector(c.npoly);
428 for (int i=0;i<np;i++) {
429 (*xp)(i)=c.xpoly[i];
430 (*yp)(i)=c.ypoly[i];
431 (*zp)(i)=c.zpoly[i];
432 pline->SetPoint(i,(*xp)(i),(*yp)(i),(*zp)(i));
433 //printf("np, i, xp, yp, zp %d %d %f %f %f \n",np,i,(*xp)(i),(*yp)(i),(*zp)(i));
434 }
435 */
436 pline=new TPolyLine3D(c.npoly,c.xpoly,c.ypoly,c.zpoly);
437 pline->SetLineColor(kWhite);
438 pline->Draw();
439 /*
440 delete xp;
441 delete yp;
442 delete zp;
443 */
444 for (int k=0;k<c.npoly;k++) {
445 c.xpoly[k]=c.ypoly[k]=c.zpoly[k]=0;
446 }
447 c.npoly=0;
fe4da5cc 448
449
a897a37a 450}
fe4da5cc 451