1 ///////////////////////////////////////////////////////////////////////////////
3 // This class contains the points for the ALICE event display //
7 <img src="gif/AliMUONpointsClass.gif">
12 ///////////////////////////////////////////////////////////////////////////////
13 #include "AliMUONdisplay.h"
14 #include "AliMUONpoints.h"
20 const Int_t MAX_Nipx=400, MAX_Nipy=800;
22 ClassImp(AliMUONpoints)
24 //_____________________________________________________________________________
25 AliMUONpoints::AliMUONpoints()
28 // Default constructor
35 //_____________________________________________________________________________
36 AliMUONpoints::AliMUONpoints(Int_t npoints)
40 // Standard constructor
47 //_____________________________________________________________________________
48 AliMUONpoints::~AliMUONpoints()
58 //_____________________________________________________________________________
59 void AliMUONpoints::DumpHit()
62 // Dump hit corresponding to this point
64 AliMUONhit *hit = GetHit();
68 //_____________________________________________________________________________
69 void AliMUONpoints::DumpDigit()
72 // Dump digit corresponding to this point
74 AliMUONdigit *digit = GetDigit();
75 if (digit) digit->Dump();
78 //_____________________________________________________________________________
79 void AliMUONpoints::InspectHit()
82 // Inspect hit corresponding to this point
84 AliMUONhit *hit = GetHit();
85 if (hit) hit->Inspect();
88 //_____________________________________________________________________________
89 void AliMUONpoints::InspectDigit()
92 // Inspect digit corresponding to this point
94 AliMUONdigit *digit = GetDigit();
95 if (digit) digit->Inspect();
98 //_____________________________________________________________________________
99 Int_t AliMUONpoints::GetTrackIndex()
102 // Dump digit corresponding to this point
104 printf("GetTrackIndex - fTrackIndex %d \n",fTrackIndex);
109 //_____________________________________________________________________________
110 AliMUONhit *AliMUONpoints::GetHit() const
113 // Returns pointer to hit index in AliRun::fParticles
115 AliMUON *MUON = (AliMUON*)gAlice->GetDetector("MUON");
116 gAlice->TreeH()->GetEvent(fTrackIndex);
117 TClonesArray *MUONhits = MUON->Hits();
118 Int_t nhits = MUONhits->GetEntriesFast();
119 if (fHitIndex < 0 || fHitIndex >= nhits) return 0;
120 return (AliMUONhit*)MUONhits->UncheckedAt(fHitIndex);
123 //_____________________________________________________________________________
124 AliMUONdigit *AliMUONpoints::GetDigit() const
127 // Returns pointer to digit index in AliRun::fParticles
130 AliMUONdisplay *display=(AliMUONdisplay*)gAlice->Display();
131 Int_t chamber=display->GetChamber();
132 Int_t cathode=display->GetCathode();
134 AliMUON *MUON = (AliMUON*)gAlice->GetDetector("MUON");
135 TClonesArray *MUONdigits = MUON->DigitsAddress(chamber-1);
136 gAlice->TreeD()->GetEvent(cathode);
137 Int_t ndigits = MUONdigits->GetEntriesFast();
138 if (fDigitIndex < 0 || fDigitIndex >= ndigits) return 0;
139 return (AliMUONdigit*)MUONdigits->UncheckedAt(fDigitIndex);
141 //_____________________________________________________________________________
143 const AliMUONdigit *dig;
145 Bin() {dig=0; idx=-1;}
148 struct PreCluster : public AliMUONreccluster {
149 const AliMUONdigit* summit;
153 PreCluster() : AliMUONreccluster() {cut=npeaks=0;}
155 //_____________________________________________________________________________
157 static void FindCluster(AliMUONchamber *iChamber, AliMUONsegmentation *segmentation, int i, int j, Bin bins[MAX_Nipx][MAX_Nipy], PreCluster &c)
165 printf("I'm in FindCluster \n");
168 Int_t q=b.dig->fSignal;
170 printf("FindCluster - i j q %d %d %d\n",i,j,q);
176 if (b.idx >= 0 && b.idx != c.idx) {
181 if (q > TMath::Abs(c.summit->fSignal)) c.summit=b.dig;
183 Int_t npx = segmentation->Npx();
184 Int_t npy = segmentation->Npy();
186 segmentation->GetPadCxy(i-npx, j-npy, x,y);
187 printf("FindCluster - x y %f %f \n",x,y);
194 b.dig = 0; b.idx = c.idx;
196 if (bins[i-1][j].dig) FindCluster(iChamber,segmentation,i-1,j,bins,c);
197 if (bins[i][j-1].dig) FindCluster(iChamber,segmentation,i,j-1,bins,c);
198 if (bins[i+1][j].dig) FindCluster(iChamber,segmentation,i+1,j,bins,c);
199 if (bins[i][j+1].dig) FindCluster(iChamber,segmentation,i,j+1,bins,c);
203 //_____________________________________________________________________________
205 void AliMUONpoints::GetCenterOfGravity()
208 // simple MUON cluster finder from digits -- finds neighbours and
209 // calculates center of gravity for the cluster
211 const Int_t MAX_Nipx=400, MAX_Nipy=800;
212 printf("\n Hallo world");
213 AliMUONdisplay *display=(AliMUONdisplay*)gAlice->Display();
214 Int_t chamber=display->GetChamber();
215 Int_t cathode=display->GetCathode();
217 AliMUON *MUON = (AliMUON*)gAlice->GetDetector("MUON");
218 AliMUONchamber *iChamber;
219 AliMUONsegmentation *segmentation;
220 iChamber =&(MUON->Chamber(chamber-1));
221 segmentation=iChamber->GetSegmentationModel(cathode);
222 Int_t npx = segmentation->Npx();
223 Int_t npy = segmentation->Npy();
224 Float_t zpos=iChamber->ZPosition();
226 TClonesArray *MUONdigits = MUON->DigitsAddress(chamber-1);
227 gAlice->TreeD()->GetEvent(cathode);
228 Int_t ndigits = MUONdigits->GetEntriesFast();
229 if (fDigitIndex < 0 || fDigitIndex >= ndigits) return;
232 dig=(AliMUONdigit*)MUONdigits->UncheckedAt(fDigitIndex);
233 Int_t ipx=dig->fPadX;
234 Int_t ipy=dig->fPadY;
235 Bin bins[MAX_Nipx][MAX_Nipy];
236 bins[ipx+npx][ipy+npy].dig=dig;
240 for (ndig=0; ndig<ndigits; ndig++) {
241 dig = (AliMUONdigit*)MUONdigits->UncheckedAt(ndig);
242 int i=dig->fPadX, j=dig->fPadY;
243 bins[i+npx][j+npy].dig=dig;
246 PreCluster c; c.summit=bins[ipx+npx][ipy+npy].dig; c.idx=ncls;
247 FindCluster(iChamber,segmentation,ipx+npx, ipy+npy, bins, c);
249 printf("GetCenterOfGravity -- more than one peak");
253 printf("GetCenterOfGravity - c.fX c.fY c.fQ %f %f %d \n",c.fX,c.fY,c.fQ);
255 c.fTracks[0]=c.summit->fTracks[0];
256 c.fTracks[1]=c.summit->fTracks[1];
257 c.fTracks[2]=c.summit->fTracks[2];
259 AliMUONpoints *points = 0;
260 points = new AliMUONpoints(1);
261 points->SetMarkerColor(kYellow);
262 points->SetMarkerStyle(5);
263 points->SetMarkerSize(1.);
264 points->SetPoint(0,c.fX,c.fY,zpos);
267 printf("GetCenterOfGravity -- ncls %d \n",ncls);