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 **************************************************************************/
16 //====================================================================================================================================================
18 // Class for the description of the structure for the planes of the ALICE Muon Forward Tracker
20 // Contact author: antonio.uras@cern.ch
22 //====================================================================================================================================================
25 #include "THnSparse.h"
26 #include "TClonesArray.h"
34 #include "AliMFTConstants.h"
35 #include "AliMFTPlane.h"
37 const Double_t AliMFTPlane::fActiveSuperposition = AliMFTConstants::fActiveSuperposition;
38 const Double_t AliMFTPlane::fHeightActive = AliMFTConstants::fHeightActive;
39 const Double_t AliMFTPlane::fHeightReadout = AliMFTConstants::fHeightReadout;
40 const Double_t AliMFTPlane::fSupportExtMargin = AliMFTConstants::fSupportExtMargin;
44 //====================================================================================================================================================
46 AliMFTPlane::AliMFTPlane():
58 fZCenterActiveFront(0),
59 fZCenterActiveBack(0),
60 fEquivalentSilicon(0),
61 fEquivalentSiliconBeforeFront(0),
62 fEquivalentSiliconBeforeBack(0),
66 fHasPixelRectangularPatternAlongY(kFALSE),
70 // default constructor
74 //====================================================================================================================================================
76 AliMFTPlane::AliMFTPlane(const Char_t *name, const Char_t *title):
88 fZCenterActiveFront(0),
89 fZCenterActiveBack(0),
90 fEquivalentSilicon(0),
91 fEquivalentSiliconBeforeFront(0),
92 fEquivalentSiliconBeforeBack(0),
96 fHasPixelRectangularPatternAlongY(kFALSE),
101 fActiveElements = new TClonesArray("THnSparseC");
102 fReadoutElements = new TClonesArray("THnSparseC");
103 fSupportElements = new TClonesArray("THnSparseC");
104 fActiveElements->SetOwner(kTRUE);
105 fReadoutElements->SetOwner(kTRUE);
106 fSupportElements->SetOwner(kTRUE);
110 //====================================================================================================================================================
112 AliMFTPlane::AliMFTPlane(const AliMFTPlane& plane):
114 fPlaneNumber(plane.fPlaneNumber),
115 fZCenter(plane.fZCenter),
116 fRMinSupport(plane.fRMinSupport),
118 fRMaxSupport(plane.fRMaxSupport),
119 fPixelSizeX(plane.fPixelSizeX),
120 fPixelSizeY(plane.fPixelSizeY),
121 fThicknessActive(plane.fThicknessActive),
122 fThicknessSupport(plane.fThicknessSupport),
123 fThicknessReadout(plane.fThicknessReadout),
124 fZCenterActiveFront(plane.fZCenterActiveFront),
125 fZCenterActiveBack(plane.fZCenterActiveBack),
126 fEquivalentSilicon(plane.fEquivalentSilicon),
127 fEquivalentSiliconBeforeFront(plane.fEquivalentSiliconBeforeFront),
128 fEquivalentSiliconBeforeBack(plane.fEquivalentSiliconBeforeBack),
132 fHasPixelRectangularPatternAlongY(plane.fHasPixelRectangularPatternAlongY),
133 fPlaneIsOdd(plane.fPlaneIsOdd)
137 fActiveElements = new TClonesArray(*(plane.fActiveElements));
138 fActiveElements -> SetOwner(kTRUE);
139 fReadoutElements = new TClonesArray(*(plane.fReadoutElements));
140 fReadoutElements -> SetOwner(kTRUE);
141 fSupportElements = new TClonesArray(*(plane.fSupportElements));
142 fSupportElements -> SetOwner(kTRUE);
147 //====================================================================================================================================================
149 AliMFTPlane::~AliMFTPlane() {
151 AliInfo("Delete AliMFTPlane");
152 if(fActiveElements) fActiveElements->Delete();
153 delete fActiveElements;
154 if(fReadoutElements) fReadoutElements->Delete();
155 delete fReadoutElements;
156 if(fSupportElements) fSupportElements->Delete();
157 delete fSupportElements;
161 //====================================================================================================================================================
163 void AliMFTPlane::Clear(const Option_t* /*opt*/) {
165 AliInfo("Clear AliMFTPlane");
166 if(fActiveElements) fActiveElements->Delete();
167 delete fActiveElements; fActiveElements=NULL;
168 if(fReadoutElements) fReadoutElements->Delete();
169 delete fReadoutElements; fReadoutElements=NULL;
170 if(fSupportElements) fSupportElements->Delete();
171 delete fSupportElements; fSupportElements=NULL;
175 //====================================================================================================================================================
177 AliMFTPlane& AliMFTPlane::operator=(const AliMFTPlane& plane) {
179 // Assignment operator
181 // check assignement to self
182 if (this != &plane) {
184 // base class assignement
185 TNamed::operator=(plane);
190 fPlaneNumber = plane.fPlaneNumber;
191 fZCenter = plane.fZCenter;
192 fRMinSupport = plane.fRMinSupport;
194 fRMaxSupport = plane.fRMaxSupport;
195 fPixelSizeX = plane.fPixelSizeX;
196 fPixelSizeY = plane.fPixelSizeY;
197 fThicknessActive = plane.fThicknessActive;
198 fThicknessSupport = plane.fThicknessSupport;
199 fThicknessReadout = plane.fThicknessReadout;
200 fZCenterActiveFront = plane.fZCenterActiveFront;
201 fZCenterActiveBack = plane.fZCenterActiveBack;
202 fEquivalentSilicon = plane.fEquivalentSilicon;
203 fEquivalentSiliconBeforeFront = plane.fEquivalentSiliconBeforeFront;
204 fEquivalentSiliconBeforeBack = plane.fEquivalentSiliconBeforeBack;
205 fActiveElements = new TClonesArray(*(plane.fActiveElements));
206 fActiveElements -> SetOwner(kTRUE);
207 fReadoutElements = new TClonesArray(*(plane.fReadoutElements));
208 fReadoutElements -> SetOwner(kTRUE);
209 fSupportElements = new TClonesArray(*(plane.fSupportElements));
210 fSupportElements -> SetOwner(kTRUE);
211 fHasPixelRectangularPatternAlongY = plane.fHasPixelRectangularPatternAlongY;
212 fPlaneIsOdd = plane.fPlaneIsOdd;
220 //====================================================================================================================================================
222 Bool_t AliMFTPlane::Init(Int_t planeNumber,
228 Double_t thicknessActive,
229 Double_t thicknessSupport,
230 Double_t thicknessReadout,
231 Bool_t hasPixelRectangularPatternAlongY) {
233 AliDebug(1, Form("Initializing Plane Structure for Plane %s", GetName()));
235 fPlaneNumber = planeNumber;
239 fPixelSizeX = pixelSizeX;
240 fPixelSizeY = pixelSizeY;
241 fThicknessActive = thicknessActive;
242 fThicknessSupport = thicknessSupport;
243 fThicknessReadout = thicknessReadout;
245 fHasPixelRectangularPatternAlongY = hasPixelRectangularPatternAlongY;
247 fZCenterActiveFront = fZCenter - 0.5*fThicknessSupport - 0.5*fThicknessActive;
248 fZCenterActiveBack = fZCenter + 0.5*fThicknessSupport + 0.5*fThicknessActive;
250 if (fRMax < fRMinSupport+fHeightActive) fRMax = fRMinSupport + fHeightActive;
252 Int_t nLaddersWithinPipe = Int_t(fRMinSupport/(fHeightActive-fActiveSuperposition));
253 if (fRMinSupport-nLaddersWithinPipe*(fHeightActive-fActiveSuperposition) > 0.5*(fHeightActive-2*fActiveSuperposition)) fPlaneIsOdd = kTRUE;
254 else fPlaneIsOdd = kFALSE;
256 fRMax = fRMinSupport + (fHeightActive-fActiveSuperposition) *
257 (Int_t((fRMax-fRMinSupport-fHeightActive)/(fHeightActive-fActiveSuperposition))+1) + fHeightActive;
259 fRMaxSupport = TMath::Sqrt(fHeightActive*(2.*rMax-fHeightActive) + fRMax*fRMax) + fSupportExtMargin;
265 //====================================================================================================================================================
267 Bool_t AliMFTPlane::CreateStructure() {
270 Double_t minPosition[3]={0}, maxPosition[3]={0};
272 // ------------------- det elements: active + readout ----------------------------------
274 Double_t lowEdgeActive = -1.*fRMax;
275 Double_t supEdgeActive = lowEdgeActive + fHeightActive;
276 Double_t zMinFront = fZCenter - 0.5*fThicknessSupport - fThicknessActive;
277 Double_t zMinBack = fZCenter + 0.5*fThicknessSupport;
279 Bool_t isFront = kTRUE;
281 while (lowEdgeActive < 0) {
283 Double_t extLimitAtLowEdgeActive = TMath::Sqrt((fRMax-TMath::Abs(lowEdgeActive)) * TMath::Abs(2*fRMax - (fRMax-TMath::Abs(lowEdgeActive))));
284 Double_t extLimitAtSupEdgeActive = TMath::Sqrt((fRMax-TMath::Abs(supEdgeActive)) * TMath::Abs(2*fRMax - (fRMax-TMath::Abs(supEdgeActive))));
286 // creating new det element: active + readout
288 Double_t extLimitDetElem = TMath::Max(extLimitAtLowEdgeActive, extLimitAtSupEdgeActive);
290 if (supEdgeActive<-1.*fRMinSupport+0.01 || lowEdgeActive>1.*fRMinSupport-0.01) { // single element covering the row
292 nBins[0] = TMath::Nint(2.*extLimitDetElem/fPixelSizeX);
293 nBins[1] = TMath::Nint(fHeightActive/fPixelSizeY);
296 // element below the pipe
298 if (isFront) zMin = zMinFront;
299 else zMin = zMinBack;
301 minPosition[0] = -1.*extLimitDetElem;
302 minPosition[1] = lowEdgeActive;
303 minPosition[2] = zMin;
305 maxPosition[0] = +1.*extLimitDetElem;
306 maxPosition[1] = supEdgeActive;
307 maxPosition[2] = zMin+fThicknessActive;
309 new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
310 Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
311 3, nBins, minPosition, maxPosition);
313 minPosition[1] = lowEdgeActive-fHeightReadout;
314 maxPosition[1] = lowEdgeActive;
316 new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
317 Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
318 3, nBins, minPosition, maxPosition);
320 // specular element above the pipe
323 if (isFront) zMin = zMinBack;
324 else zMin = zMinFront;
327 minPosition[0] = -1.*extLimitDetElem;
328 minPosition[1] = -1.*supEdgeActive;
329 minPosition[2] = zMin;
331 maxPosition[0] = +1.*extLimitDetElem;
332 maxPosition[1] = -1.*lowEdgeActive;
333 maxPosition[2] = zMin+fThicknessActive;
335 new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
336 Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
337 3, nBins, minPosition, maxPosition);
339 minPosition[1] = -1.*lowEdgeActive;
340 maxPosition[1] = -1.*(lowEdgeActive-fHeightReadout);
342 new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
343 Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
344 3, nBins, minPosition, maxPosition);
348 else { // two elements covering the row
350 Double_t intLimitAtLowEdge = 0., intLimitAtSupEdge = 0.;
351 if (fRMinSupport-TMath::Abs(lowEdgeActive)>0.) intLimitAtLowEdge = TMath::Sqrt((fRMinSupport-TMath::Abs(lowEdgeActive)) * TMath::Abs(2*fRMinSupport - (fRMinSupport-TMath::Abs(lowEdgeActive))));
352 if (fRMinSupport-TMath::Abs(supEdgeActive)>0.) intLimitAtSupEdge = TMath::Sqrt((fRMinSupport-TMath::Abs(supEdgeActive)) * TMath::Abs(2*fRMinSupport - (fRMinSupport-TMath::Abs(supEdgeActive))));
353 Double_t intLimitDetElem = TMath::Max(intLimitAtLowEdge, intLimitAtSupEdge);
355 nBins[0] = TMath::Nint((extLimitDetElem-intLimitDetElem)/fPixelSizeX);
356 nBins[1] = TMath::Nint(fHeightActive/fPixelSizeY);
359 // left element: y < 0
361 if (isFront) zMin = zMinFront;
362 else zMin = zMinBack;
364 minPosition[0] = -1.*extLimitDetElem;
365 minPosition[1] = lowEdgeActive;
366 minPosition[2] = zMin;
368 maxPosition[0] = -1.*intLimitDetElem;
369 maxPosition[1] = supEdgeActive;
370 maxPosition[2] = zMin+fThicknessActive;
372 new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
373 Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
374 3, nBins, minPosition, maxPosition);
376 minPosition[1] = lowEdgeActive-fHeightReadout;
377 maxPosition[1] = lowEdgeActive;
379 new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
380 Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
381 3, nBins, minPosition, maxPosition);
383 // left element: y > 0
385 if (supEdgeActive < 0.5*fHeightActive) {
388 if (isFront) zMin = zMinBack;
389 else zMin = zMinFront;
392 minPosition[0] = -1.*extLimitDetElem;
393 minPosition[1] = -1.*supEdgeActive;
394 minPosition[2] = zMin;
396 maxPosition[0] = -1.*intLimitDetElem;
397 maxPosition[1] = -1.*lowEdgeActive;
398 maxPosition[2] = zMin+fThicknessActive;
400 new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
401 Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
402 3, nBins, minPosition, maxPosition);
404 minPosition[1] = -1.*lowEdgeActive;
405 maxPosition[1] = -1.*(lowEdgeActive-fHeightReadout);
407 new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
408 Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
409 3, nBins, minPosition, maxPosition);
413 // right element: y < 0
415 if (isFront) zMin = zMinFront;
416 else zMin = zMinBack;
418 minPosition[0] = +1.*intLimitDetElem;
419 minPosition[1] = lowEdgeActive;
420 minPosition[2] = zMin;
422 maxPosition[0] = +1.*extLimitDetElem;
423 maxPosition[1] = supEdgeActive;
424 maxPosition[2] = zMin+fThicknessActive;
426 new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
427 Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
428 3, nBins, minPosition, maxPosition);
430 minPosition[1] = lowEdgeActive-fHeightReadout;
431 maxPosition[1] = lowEdgeActive;
433 new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
434 Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
435 3, nBins, minPosition, maxPosition);
437 // right element: y > 0
439 if (supEdgeActive < 0.5*fHeightActive) {
442 if (isFront) zMin = zMinBack;
443 else zMin = zMinFront;
446 minPosition[0] = +1.*intLimitDetElem;
447 minPosition[1] = -1.*supEdgeActive;
448 minPosition[2] = zMin;
450 maxPosition[0] = +1.*extLimitDetElem;
451 maxPosition[1] = -1.*lowEdgeActive;
452 maxPosition[2] = zMin+fThicknessActive;
454 new ((*fActiveElements)[fActiveElements->GetEntries()]) THnSparseC(Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
455 Form("MFTActiveElemHist_%02d%03d", fPlaneNumber, fActiveElements->GetEntries()),
456 3, nBins, minPosition, maxPosition);
458 minPosition[1] = -1.*lowEdgeActive;
459 maxPosition[1] = -1.*(lowEdgeActive-fHeightReadout);
461 new ((*fReadoutElements)[fReadoutElements->GetEntries()]) THnSparseC(Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
462 Form("MFTReadoutElemHist_%02d%03d", fPlaneNumber, fReadoutElements->GetEntries()),
463 3, nBins, minPosition, maxPosition);
469 lowEdgeActive += fHeightActive - fActiveSuperposition;
470 supEdgeActive = lowEdgeActive + fHeightActive;
475 // ------------------- support element -------------------------------------------------
481 minPosition[0] = -1.*fRMaxSupport;
482 minPosition[1] = -1.*fRMaxSupport;
483 minPosition[2] = fZCenter - 0.5*fThicknessSupport;
485 maxPosition[0] = +1.*fRMaxSupport;
486 maxPosition[1] = +1.*fRMaxSupport;
487 maxPosition[2] = fZCenter + 0.5*fThicknessSupport;
489 new ((*fSupportElements)[fSupportElements->GetEntries()]) THnSparseC(Form("MFTSupportElemHist_%02d%03d", fPlaneNumber, fSupportElements->GetEntries()),
490 Form("MFTSupportElemHist_%02d%03d", fPlaneNumber, fSupportElements->GetEntries()),
491 3, nBins, minPosition, maxPosition);
493 // --------------------------------------------------------------------------------------
495 AliDebug(1, Form("Structure completed for MFT plane %s", GetName()));
501 //====================================================================================================================================================
503 THnSparseC* AliMFTPlane::GetActiveElement(Int_t id) {
505 if (id<0 || id>=GetNActiveElements()) return NULL;
506 else return (THnSparseC*) fActiveElements->At(id);
510 //====================================================================================================================================================
512 THnSparseC* AliMFTPlane::GetReadoutElement(Int_t id) {
514 if (id<0 || id>=GetNReadoutElements()) return NULL;
515 else return (THnSparseC*) fReadoutElements->At(id);
519 //====================================================================================================================================================
521 THnSparseC* AliMFTPlane::GetSupportElement(Int_t id) {
523 if (id<0 || id>=GetNSupportElements()) return NULL;
524 else return (THnSparseC*) fSupportElements->At(id);
528 //====================================================================================================================================================
530 void AliMFTPlane::DrawPlane(Option_t *opt) {
532 // ------------------- "FRONT" option ------------------
534 if (!strcmp(opt, "front")) {
536 TCanvas *cnv = new TCanvas("cnv", GetName(), 900, 900);
539 TH2D *h = new TH2D("tmp", GetName(),
540 1, 1.1*GetSupportElement(0)->GetAxis(0)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(0)->GetXmax(),
541 1, 1.1*GetSupportElement(0)->GetAxis(1)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(1)->GetXmax());
542 h->SetXTitle("x [cm]");
543 h->SetYTitle("y [cm]");
546 AliInfo("Created hist");
548 TEllipse *supportExt = new TEllipse(0.0, 0.0, fRMaxSupport, fRMaxSupport);
549 TEllipse *supportInt = new TEllipse(0.0, 0.0, fRMinSupport, fRMinSupport);
550 supportExt->SetFillColor(kCyan-10);
551 supportExt -> Draw("same");
552 supportInt -> Draw("same");
554 for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
555 if (!IsFront(GetActiveElement(iEl))) continue;
556 TPave *pave = new TPave(GetActiveElement(iEl)->GetAxis(0)->GetXmin(),
557 GetActiveElement(iEl)->GetAxis(1)->GetXmin(),
558 GetActiveElement(iEl)->GetAxis(0)->GetXmax(),
559 GetActiveElement(iEl)->GetAxis(1)->GetXmax(), 1);
560 pave -> SetFillColor(kGreen);
561 pave -> Draw("same");
564 for (Int_t iEl=0; iEl<GetNReadoutElements(); iEl++) {
565 if (!IsFront(GetReadoutElement(iEl))) continue;
566 TPave *pave = new TPave(GetReadoutElement(iEl)->GetAxis(0)->GetXmin(),
567 GetReadoutElement(iEl)->GetAxis(1)->GetXmin(),
568 GetReadoutElement(iEl)->GetAxis(0)->GetXmax(),
569 GetReadoutElement(iEl)->GetAxis(1)->GetXmax(), 1);
570 pave -> SetFillColor(kRed);
571 pave -> Draw("same");
576 // ------------------- "BACK" option ------------------
578 else if (!strcmp(opt, "back")) {
580 TCanvas *cnv = new TCanvas("cnv", GetName(), 900, 900);
583 TH2D *h = new TH2D("tmp", GetName(),
584 1, 1.1*GetSupportElement(0)->GetAxis(0)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(0)->GetXmax(),
585 1, 1.1*GetSupportElement(0)->GetAxis(1)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(1)->GetXmax());
586 h->SetXTitle("x [cm]");
587 h->SetYTitle("y [cm]");
590 TEllipse *supportExt = new TEllipse(0.0, 0.0, fRMaxSupport, fRMaxSupport);
591 TEllipse *supportInt = new TEllipse(0.0, 0.0, fRMinSupport, fRMinSupport);
592 supportExt -> SetFillColor(kCyan-10);
593 supportExt -> Draw("same");
594 supportInt -> Draw("same");
596 for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
597 if (IsFront(GetActiveElement(iEl))) continue;
598 TPave *pave = new TPave(GetActiveElement(iEl)->GetAxis(0)->GetXmin(),
599 GetActiveElement(iEl)->GetAxis(1)->GetXmin(),
600 GetActiveElement(iEl)->GetAxis(0)->GetXmax(),
601 GetActiveElement(iEl)->GetAxis(1)->GetXmax(), 1);
602 pave -> SetFillColor(kGreen);
603 pave -> Draw("same");
606 for (Int_t iEl=0; iEl<GetNReadoutElements(); iEl++) {
607 if (IsFront(GetReadoutElement(iEl))) continue;
608 TPave *pave = new TPave(GetReadoutElement(iEl)->GetAxis(0)->GetXmin(),
609 GetReadoutElement(iEl)->GetAxis(1)->GetXmin(),
610 GetReadoutElement(iEl)->GetAxis(0)->GetXmax(),
611 GetReadoutElement(iEl)->GetAxis(1)->GetXmax(), 1);
612 pave -> SetFillColor(kRed);
613 pave -> Draw("same");
618 // ------------------- "BOTH" option ------------------
620 else if (!strcmp(opt, "both")) {
622 TCanvas *cnv = new TCanvas("cnv", GetName(), 900, 900);
625 TH2D *h = new TH2D("tmp", GetName(),
626 1, 1.1*GetSupportElement(0)->GetAxis(0)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(0)->GetXmax(),
627 1, 1.1*GetSupportElement(0)->GetAxis(1)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(1)->GetXmax());
628 h->SetXTitle("x [cm]");
629 h->SetYTitle("y [cm]");
632 TEllipse *supportExt = new TEllipse(0.0, 0.0, fRMaxSupport, fRMaxSupport);
633 TEllipse *supportInt = new TEllipse(0.0, 0.0, fRMinSupport, fRMinSupport);
634 supportExt -> SetFillColor(kCyan-10);
635 supportExt -> Draw("same");
636 supportInt -> Draw("same");
638 for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
639 if (IsFront(GetActiveElement(iEl)) && GetActiveElement(iEl)->GetAxis(0)->GetXmin()<0.) {
640 TPave *pave = new TPave(GetActiveElement(iEl)->GetAxis(0)->GetXmin(),
641 GetActiveElement(iEl)->GetAxis(1)->GetXmin(),
642 TMath::Min(GetActiveElement(iEl)->GetAxis(0)->GetXmax(), 0.),
643 GetActiveElement(iEl)->GetAxis(1)->GetXmax(), 1);
644 pave -> SetFillColor(kGreen);
645 pave -> Draw("same");
647 else if (!IsFront(GetActiveElement(iEl)) && GetActiveElement(iEl)->GetAxis(0)->GetXmax()>0.) {
648 TPave *pave = new TPave(TMath::Max(GetActiveElement(iEl)->GetAxis(0)->GetXmin(), 0.),
649 GetActiveElement(iEl)->GetAxis(1)->GetXmin(),
650 GetActiveElement(iEl)->GetAxis(0)->GetXmax(),
651 GetActiveElement(iEl)->GetAxis(1)->GetXmax(), 1);
652 pave -> SetFillColor(kGreen);
653 pave -> Draw("same");
657 for (Int_t iEl=0; iEl<GetNReadoutElements(); iEl++) {
658 if (IsFront(GetReadoutElement(iEl)) && GetReadoutElement(iEl)->GetAxis(0)->GetXmin()<0.) {
659 TPave *pave = new TPave(GetReadoutElement(iEl)->GetAxis(0)->GetXmin(),
660 GetReadoutElement(iEl)->GetAxis(1)->GetXmin(),
661 TMath::Min(GetReadoutElement(iEl)->GetAxis(0)->GetXmax(), 0.),
662 GetReadoutElement(iEl)->GetAxis(1)->GetXmax(), 1);
663 pave -> SetFillColor(kRed);
664 pave -> Draw("same");
666 else if (!IsFront(GetReadoutElement(iEl)) && GetReadoutElement(iEl)->GetAxis(0)->GetXmax()>0.) {
667 TPave *pave = new TPave(TMath::Max(GetReadoutElement(iEl)->GetAxis(0)->GetXmin(), 0.),
668 GetReadoutElement(iEl)->GetAxis(1)->GetXmin(),
669 GetReadoutElement(iEl)->GetAxis(0)->GetXmax(),
670 GetReadoutElement(iEl)->GetAxis(1)->GetXmax(), 1);
671 pave -> SetFillColor(kRed);
672 pave -> Draw("same");
678 // ------------------- "PROFILE" option ------------------
680 else if (!strcmp(opt, "profile")) {
682 TCanvas *cnv = new TCanvas("cnv", GetName(), 300, 900);
685 TH2D *h = new TH2D("tmp", GetName(),
686 1, fZCenter-0.5, fZCenter+0.5,
687 1, 1.1*GetSupportElement(0)->GetAxis(1)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(1)->GetXmax());
688 h->SetXTitle("z [cm]");
689 h->SetYTitle("y [cm]");
692 TPave *supportExt = new TPave(GetSupportElement(0)->GetAxis(2)->GetXmin(), -fRMaxSupport,
693 GetSupportElement(0)->GetAxis(2)->GetXmax(), fRMaxSupport);
694 TPave *supportInt = new TPave(GetSupportElement(0)->GetAxis(2)->GetXmin(), -fRMinSupport,
695 GetSupportElement(0)->GetAxis(2)->GetXmax(), fRMinSupport);
696 supportExt -> SetFillColor(kCyan-10);
697 supportInt -> SetFillColor(kCyan-10);
698 supportExt -> SetBorderSize(1);
699 supportInt -> SetBorderSize(1);
700 supportExt -> Draw("same");
701 supportInt -> Draw("same");
703 for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
705 if (IsFront(GetActiveElement(iEl))) {
706 pave = new TPave(GetActiveElement(iEl)->GetAxis(2)->GetXmax() -
707 5*(GetActiveElement(iEl)->GetAxis(2)->GetXmax()-GetActiveElement(iEl)->GetAxis(2)->GetXmin()),
708 GetActiveElement(iEl)->GetAxis(1)->GetXmin(),
709 GetActiveElement(iEl)->GetAxis(2)->GetXmax(),
710 GetActiveElement(iEl)->GetAxis(1)->GetXmax(), 1);
713 pave = new TPave(GetActiveElement(iEl)->GetAxis(2)->GetXmin(),
714 GetActiveElement(iEl)->GetAxis(1)->GetXmin(),
715 GetActiveElement(iEl)->GetAxis(2)->GetXmin() +
716 5*(GetActiveElement(iEl)->GetAxis(2)->GetXmax()-GetActiveElement(iEl)->GetAxis(2)->GetXmin()),
717 GetActiveElement(iEl)->GetAxis(1)->GetXmax(), 1);
719 pave -> SetFillColor(kGreen);
720 pave -> Draw("same");
723 for (Int_t iEl=0; iEl<GetNReadoutElements(); iEl++) {
725 if (IsFront(GetReadoutElement(iEl))) {
726 pave = new TPave(GetReadoutElement(iEl)->GetAxis(2)->GetXmax() -
727 5*(GetReadoutElement(iEl)->GetAxis(2)->GetXmax()-GetReadoutElement(iEl)->GetAxis(2)->GetXmin()),
728 GetReadoutElement(iEl)->GetAxis(1)->GetXmin(),
729 GetReadoutElement(iEl)->GetAxis(2)->GetXmax(),
730 GetReadoutElement(iEl)->GetAxis(1)->GetXmax(), 1);
733 pave = new TPave(GetReadoutElement(iEl)->GetAxis(2)->GetXmin(),
734 GetReadoutElement(iEl)->GetAxis(1)->GetXmin(),
735 GetReadoutElement(iEl)->GetAxis(2)->GetXmin() +
736 5*(GetReadoutElement(iEl)->GetAxis(2)->GetXmax()-GetReadoutElement(iEl)->GetAxis(2)->GetXmin()),
737 GetReadoutElement(iEl)->GetAxis(1)->GetXmax(), 1);
739 pave -> SetFillColor(kRed);
740 pave -> Draw("same");
747 //====================================================================================================================================================
749 Int_t AliMFTPlane::GetNumberOfChips(Option_t *opt) {
753 if (!strcmp(opt, "front")) {
754 for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
755 if (!IsFront(GetActiveElement(iEl))) continue;
756 Double_t length = GetActiveElement(iEl)->GetAxis(0)->GetXmax() - GetActiveElement(iEl)->GetAxis(0)->GetXmin();
757 nChips += Int_t (length/AliMFTConstants::fWidthChip) + 1;
761 else if (!strcmp(opt, "back")) {
762 for (Int_t iEl=0; iEl<GetNActiveElements(); iEl++) {
763 if (IsFront(GetActiveElement(iEl))) continue;
764 Double_t length = GetActiveElement(iEl)->GetAxis(0)->GetXmax() - GetActiveElement(iEl)->GetAxis(0)->GetXmin();
765 nChips += Int_t (length/AliMFTConstants::fWidthChip) + 1;
773 //====================================================================================================================================================