1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.9 2000/11/20 21:44:17 pcrochet
19 some modifications to account for the new class AliMUONResponseTriggerV1
21 Revision 1.8 2000/11/12 17:17:03 pcrochet
22 BuildGeometry of AliMUON for trigger chambers delegated to AliMUONSegmentationTriggerX (same strategy as for tracking chambers)
24 Revision 1.7 2000/10/03 21:48:07 morsch
25 Adopt to const declaration of some of the methods in AliSegmentation.
27 Revision 1.6 2000/10/02 16:58:29 egangler
28 Cleaning of the code :
31 -> some useless includes removed or replaced by "class" statement
33 Revision 1.5 2000/07/03 11:54:57 morsch
34 AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
35 The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
37 Revision 1.4 2000/06/29 12:34:09 morsch
38 AliMUONSegmentation class has been made independent of AliMUONChamber. This makes
39 it usable with any other geometry class. The link to the object to which it belongs is
40 established via an index. This assumes that there exists a global geometry manager
41 from which the pointer to the parent object can be obtained (in our case gAlice).
43 Revision 1.3 2000/06/26 10:01:26 pcrochet
44 global variables removed
46 Revision 1.2 2000/06/15 07:58:48 morsch
47 Code from MUON-dev joined
49 Revision 1.1.2.1 2000/06/09 21:51:03 morsch
50 Code from AliMUONSegResTrigger.cxx
58 Revision 1.1.2.4 2000/04/26 12:33:25 morsch
59 Minor changes in some methods (CP)
61 Revision 1.1.2.3 2000/03/20 18:14:16 morsch
64 Revision 1.1.2.2 2000/02/20 07:50:49 morsch
65 Bugs in Dpx, Dpy and ISector methods corrected (P.C.)
67 Revision 1.1.2.1 2000/02/17 14:33:49 morsch
68 Draft version from P. Crochet
75 #include <TGeometry.h>
78 #include "AliMUONSegmentationTriggerX.h"
79 #include "AliMUONTriggerConstants.h"
83 #include "AliMUONChamber.h"
84 #include "AliRun.h" // gAlice
86 ClassImp(AliMUONSegmentationTriggerX)
88 //------------------------------------------------------------------
89 void AliMUONSegmentationTriggerX::Init(Int_t chamber)
91 // intialize X segmentation
92 cout << "Initialize Trigger Chamber Geometry X " << "\n";
93 AliMUONSegmentationTrigger::Init(chamber);
95 // calculate x & y position of X strips
96 Int_t nModule=AliMUONTriggerConstants::Nmodule();
97 for (Int_t imodule=0; imodule<nModule; imodule++) {
98 Float_t width=StripSizeX(AliMUONTriggerConstants::ModuleId(imodule));
99 Int_t nStrip=AliMUONTriggerConstants::NstripX(imodule);
100 for (Int_t istrip=0; istrip<nStrip; istrip++){
101 fXofxsmin[imodule][istrip] = AliMUONTriggerConstants::XcMin(imodule)*fZscale;
102 fXofxsmax[imodule][istrip] = AliMUONTriggerConstants::XcMax(imodule)*fZscale;
104 fYofxsmin[imodule][istrip] = (fYcmin[imodule]+width*(istrip))*fZscale;
105 fYofxsmax[imodule][istrip] = (fYcmin[imodule]+width*(istrip+1))*fZscale;
110 //------------------------------------------------------------------
111 void AliMUONSegmentationTriggerX::GetPadI(Float_t x,Float_t y,Int_t &ix,Int_t &iy)
113 // Returns pad coordinates (ix,iy) for given real coordinates (x,y)
114 // x,y = real coordinates; ix = module number , iy = strip number
117 Int_t nModule=AliMUONTriggerConstants::Nmodule();
118 for (Int_t imodule=0; imodule<nModule; imodule++) {
119 Int_t nStrip=AliMUONTriggerConstants::NstripX(imodule);
120 for (Int_t istrip=0; istrip<nStrip; istrip++){
121 if (x>fXofxsmin[imodule][istrip]&&x<fXofxsmax[imodule][istrip]&&
122 y>fYofxsmin[imodule][istrip]&&y<fYofxsmax[imodule][istrip]){
123 ix = AliMUONTriggerConstants::ModuleId(imodule);
130 //------------------------------------------------------------------
131 void AliMUONSegmentationTriggerX::GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
133 // Returns real coordinates (x,y) for given pad coordinates (ix,iy)
134 // ix = module number , iy = strip number; x,y = center of strip
137 Int_t nModule=AliMUONTriggerConstants::Nmodule();
139 for (Int_t imodule=0; imodule<nModule; imodule++) {
140 if (AliMUONTriggerConstants::ModuleId(imodule)==ix){
141 x=fXofxsmin[imodule][iy]+(fXofxsmax[imodule][iy]-fXofxsmin[imodule][iy])/2.;
142 y=fYofxsmin[imodule][iy]+(fYofxsmax[imodule][iy]-fYofxsmin[imodule][iy])/2.;
147 //------------------------------------------------------------------
148 void AliMUONSegmentationTriggerX::SetPadSize(Float_t p1, Float_t p2)
156 //------------------------------------------------------------------
157 void AliMUONSegmentationTriggerX::
158 Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10]){
159 // Returns list of 10 next neighbours for given X strip (ix, iy)
160 // neighbour number 4 in the list -
161 // neighbour number 3 in the list |
162 // neighbour number 2 in the list |_ Upper part
163 // neighbour number 1 in the list |
164 // neighbour number 0 in the list -
166 // neighbour number 5 in the list -
167 // neighbour number 6 in the list | _ Lower part
168 // neighbour number 7 in the list |
169 // neighbour number 8 in the list |
170 // neighbour number 9 in the list -
172 Int_t absiX = TMath::Abs(iX);
173 Int_t numModule = ModuleNumber(absiX); // module number Id.
174 Int_t nStrip = AliMUONTriggerConstants::NstripX(numModule); //numb of strips
175 Int_t iCandidateUp, iCandidateDo;
179 for (Int_t i=0; i<10; i++) Xlist[i]=Ylist[i]=0;
183 for (Int_t i=0; i<5; i++) {
185 iCandidateUp = iY + (i + 1);
186 iCandidateDo = iY - (i + 1);
187 if (iCandidateUp < nStrip) {
189 Ylist[i] = iCandidateUp;
191 if (iCandidateDo >= 0) {
193 Ylist[j] = iCandidateDo;
200 //------------------------------------------------------------------
201 void AliMUONSegmentationTriggerX::SetPad(Int_t ix, Int_t iy)
203 // Sets virtual pad coordinates, needed for evaluating pad response
204 // outside the tracking program
205 GetPadC(ix,iy,fX,fY);
206 GetPadI(fX,fY,fIx,fIy);
207 fSector=Sector(ix,iy);
210 //------------------------------------------------------------------
211 Int_t AliMUONSegmentationTriggerX::ISector()
214 //------------------------------------------------------------------
215 Int_t AliMUONSegmentationTriggerX::Ix()
218 //------------------------------------------------------------------
220 Int_t AliMUONSegmentationTriggerX::Iy()
223 //------------------------------------------------------------------
224 Float_t AliMUONSegmentationTriggerX::Dpx(Int_t isec) const
226 // returns x size of x strips for sector isec
230 } else if (isec==2) {
232 } else if (isec==3) {
234 } else if (isec==4) {
236 } else if (isec==5) {
238 } else if (isec==6) {
245 //------------------------------------------------------------------
246 Float_t AliMUONSegmentationTriggerX::Dpy(Int_t isec) const
248 // returns y size of x strips for sector isec
251 return 1.0625*fZscale;
252 } else if (isec==2) {
253 return 1.0625*fZscale;
254 } else if (isec==3) {
255 return 1.0625*fZscale;
256 } else if (isec==4) {
257 return 2.125*fZscale;
258 } else if (isec==5) {
260 } else if (isec==6) {
267 //------------------------------------------------------------------
268 void AliMUONSegmentationTriggerX::SetHit(Float_t xhit, Float_t yhit)
270 // set hit during disIntegration
271 AliMUONSegmentationTrigger::SetHit(xhit,yhit);
274 //------------------------------------------------------------------
275 Int_t AliMUONSegmentationTriggerX::Sector(Int_t ix, Int_t iy)
277 // Returns sector number for given module
280 Int_t absix=TMath::Abs(ix);
281 Int_t iwidth=Int_t(StripSizeX(absix));
285 } else if (absix==41||absix==61) {
287 } else if (iwidth==1) {
289 } else if (iwidth==2) {
291 } else if ((absix>=11&&absix<17)||(absix>=91&&absix<97)) {
293 } else if (iwidth==4) {
300 //------------------------------------------------------------------
301 void AliMUONSegmentationTriggerX::
302 IntegrationLimits(Float_t& x1, Float_t& x2, Float_t& x3, Float_t& x4)
304 // returns quantities needed to evaluate neighbour strip response
307 Float_t xstrip,ystrip;
308 GetPadI(fXhit,fYhit,ix,iy);
309 GetPadC(ix,iy,xstrip,ystrip);
310 x1=fYhit; // hit y position
311 x2=ystrip; // y coordinate of the main strip
312 x3=fY; // current strip real y coordinate
313 // width=StripSizeX(ix); // width of the main strip
315 // find the position of the 2 borders of the current strip
316 Float_t ymin = fYofxsmin[ModuleNumber(fIx)][fIy];
317 Float_t ymax = fYofxsmax[ModuleNumber(fIx)][fIy];
319 // dist. between the hit and the closest border of the current strip
320 x4 = (TMath::Abs(ymax-x1) > TMath::Abs(ymin-x1)) ?
321 TMath::Abs(ymin-x1):TMath::Abs(ymax-x1);
325 //------------------------------------------------------------------
326 void AliMUONSegmentationTriggerX::Draw(const char* opt) const
328 // Draw method for event display
329 if (!strcmp(opt,"eventdisplay")) {
331 char nameChamber[10], nameNode[10];
332 char nameSense1[10], nameSense2[10], nameSense3[10], nameSense4[10];
334 TNode* top=gAlice->GetGeometry()->GetNode("alice");
335 sprintf(nameChamber,"C_MUON%d",fId+1);
336 new TBRIK(nameChamber,"Mother","void",340.,340.,0.25);
338 sprintf(nameNode,"MUON%d",100+fId+1);
339 node = new TNode(nameNode,"Chambernode",nameChamber,0,0,fChamber->Z(),"");
340 node->SetLineColor(kBlack);
341 AliMUON *pMUON = (AliMUON *) gAlice->GetModule("MUON");
342 (pMUON->Nodes())->Add(node);
344 sprintf(nameSense1,"S1_MUON%d",fId+1);
345 sprintf(nameSense2,"S2_MUON%d",fId+1);
346 sprintf(nameSense3,"S3_MUON%d",fId+1);
347 sprintf(nameSense4,"S4_MUON%d",fId+1);
349 for (Int_t imodule=0; imodule<AliMUONTriggerConstants::Nmodule(); imodule++) {
350 Int_t idModule=AliMUONTriggerConstants::ModuleId(imodule);
352 if (TMath::Abs(idModule)!=51) {
354 Int_t nStripX=AliMUONTriggerConstants::NstripX(imodule);
355 Float_t xmin=fXofxsmin[imodule][0];
356 Float_t xmax=fXofxsmax[imodule][nStripX-1];
357 Float_t ymin=fYofxsmin[imodule][0];
358 Float_t ymax=fYofxsmax[imodule][nStripX-1];
359 Float_t xpos=xmin+(xmax-xmin)/2.;
360 Float_t ypos=ymin+(ymax-ymin)/2.;
361 Float_t halfx=(xmax-xmin)/2.;
362 Float_t halfy=(ymax-ymin)/2.;
365 new TBRIK(nameSense1,"Module","void",halfx,halfy,0.25);
367 new TBRIK(nameSense2,"Module","void",halfx,halfy,0.25);
369 new TBRIK(nameSense3,"Module","void",halfx,halfy,0.25);
371 new TBRIK(nameSense4,"Module","void",halfx,halfy,0.25);
373 sprintf(nameNode,"S_MUON%d",1000*fId+1+imodule);
375 if (TMath::Abs(idModule)==41||TMath::Abs(idModule)==61) {
376 nodeS = new TNode(nameNode,"Module",nameSense3,xpos,ypos,0,"");
377 } else if (TMath::Abs(idModule)==52) {
378 nodeS = new TNode(nameNode,"Module",nameSense4,xpos,ypos,0,"");
379 } else if (TMath::Abs((idModule-Int_t(idModule/10)*10.))!=7) {
380 nodeS = new TNode(nameNode,"Module",nameSense1,xpos,ypos,0,"");
382 // } else if (TMath::Abs((idModule-Int_t(idModule/10)*10.))==7) {
383 nodeS = new TNode(nameNode,"Module",nameSense2,xpos,ypos,0,"");
385 nodeS->SetLineColor(kBlue);