25 #include "THnSparse.h" 26 #include "TClonesArray.h" 58 fZCenterActiveFront(0),
59 fZCenterActiveBack(0),
60 fEquivalentSilicon(0),
61 fEquivalentSiliconBeforeFront(0),
62 fEquivalentSiliconBeforeBack(0),
66 fHasPixelRectangularPatternAlongY(kFALSE),
88 fZCenterActiveFront(0),
89 fZCenterActiveBack(0),
90 fEquivalentSilicon(0),
91 fEquivalentSiliconBeforeFront(0),
92 fEquivalentSiliconBeforeBack(0),
96 fHasPixelRectangularPatternAlongY(kFALSE),
182 if (
this != &plane) {
185 TNamed::operator=(plane);
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()));
270 Double_t minPosition[3]={0}, maxPosition[3]={0};
274 Double_t lowEdgeActive = -1.*
fRMax;
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))));
288 Double_t extLimitDetElem = TMath::Max(extLimitAtLowEdgeActive, extLimitAtSupEdgeActive);
290 if (supEdgeActive<-1.*fRMinSupport+0.01 || lowEdgeActive>1.*
fRMinSupport-0.01) {
292 nBins[0] = TMath::Nint(2.*extLimitDetElem/
fPixelSizeX);
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;
311 3, nBins, minPosition, maxPosition);
314 maxPosition[1] = lowEdgeActive;
318 3, nBins, minPosition, maxPosition);
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;
337 3, nBins, minPosition, maxPosition);
339 minPosition[1] = -1.*lowEdgeActive;
344 3, nBins, minPosition, maxPosition);
350 Double_t intLimitAtLowEdge = 0., intLimitAtSupEdge = 0.;
353 Double_t intLimitDetElem = TMath::Max(intLimitAtLowEdge, intLimitAtSupEdge);
355 nBins[0] = TMath::Nint((extLimitDetElem-intLimitDetElem)/
fPixelSizeX);
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;
374 3, nBins, minPosition, maxPosition);
377 maxPosition[1] = lowEdgeActive;
381 3, nBins, minPosition, maxPosition);
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;
402 3, nBins, minPosition, maxPosition);
404 minPosition[1] = -1.*lowEdgeActive;
409 3, nBins, minPosition, maxPosition);
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;
428 3, nBins, minPosition, maxPosition);
431 maxPosition[1] = lowEdgeActive;
435 3, nBins, minPosition, maxPosition);
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;
456 3, nBins, minPosition, maxPosition);
458 minPosition[1] = -1.*lowEdgeActive;
463 3, nBins, minPosition, maxPosition);
491 3, nBins, minPosition, maxPosition);
495 AliDebug(1, Form(
"Structure completed for MFT plane %s", GetName()));
534 if (!strcmp(opt,
"front")) {
536 TCanvas *cnv =
new TCanvas(
"cnv", GetName(), 900, 900);
539 TH2D *h =
new TH2D(
"tmp", GetName(),
542 h->SetXTitle(
"x [cm]");
543 h->SetYTitle(
"y [cm]");
550 supportExt->SetFillColor(kCyan-10);
551 supportExt ->
Draw(
"same");
552 supportInt ->
Draw(
"same");
560 pave -> SetFillColor(kGreen);
561 pave ->
Draw(
"same");
570 pave -> SetFillColor(kRed);
571 pave ->
Draw(
"same");
578 else if (!strcmp(opt,
"back")) {
580 TCanvas *cnv =
new TCanvas(
"cnv", GetName(), 900, 900);
583 TH2D *h =
new TH2D(
"tmp", GetName(),
586 h->SetXTitle(
"x [cm]");
587 h->SetYTitle(
"y [cm]");
592 supportExt -> SetFillColor(kCyan-10);
593 supportExt ->
Draw(
"same");
594 supportInt ->
Draw(
"same");
602 pave -> SetFillColor(kGreen);
603 pave ->
Draw(
"same");
612 pave -> SetFillColor(kRed);
613 pave ->
Draw(
"same");
620 else if (!strcmp(opt,
"both")) {
622 TCanvas *cnv =
new TCanvas(
"cnv", GetName(), 900, 900);
625 TH2D *h =
new TH2D(
"tmp", GetName(),
628 h->SetXTitle(
"x [cm]");
629 h->SetYTitle(
"y [cm]");
634 supportExt -> SetFillColor(kCyan-10);
635 supportExt ->
Draw(
"same");
636 supportInt ->
Draw(
"same");
644 pave -> SetFillColor(kGreen);
645 pave ->
Draw(
"same");
648 TPave *pave =
new TPave(TMath::Max(
GetActiveElement(iEl)->GetAxis(0)->GetXmin(), 0.),
652 pave -> SetFillColor(kGreen);
653 pave ->
Draw(
"same");
663 pave -> SetFillColor(kRed);
664 pave ->
Draw(
"same");
667 TPave *pave =
new TPave(TMath::Max(
GetReadoutElement(iEl)->GetAxis(0)->GetXmin(), 0.),
671 pave -> SetFillColor(kRed);
672 pave ->
Draw(
"same");
680 else if (!strcmp(opt,
"profile")) {
682 TCanvas *cnv =
new TCanvas(
"cnv", GetName(), 300, 900);
685 TH2D *h =
new TH2D(
"tmp", GetName(),
688 h->SetXTitle(
"z [cm]");
689 h->SetYTitle(
"y [cm]");
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");
719 pave -> SetFillColor(kGreen);
720 pave ->
Draw(
"same");
739 pave -> SetFillColor(kRed);
740 pave ->
Draw(
"same");
753 if (!strcmp(opt,
"front")) {
761 else if (!strcmp(opt,
"back")) {
Int_t GetNReadoutElements() const
Double_t fEquivalentSiliconBeforeBack
Bool_t IsFront(THnSparseC *element) const
Double_t fThicknessActive
Double_t fEquivalentSilicon
TClonesArray * fReadoutElements
Int_t GetNSupportElements() const
void DrawPlane(Option_t *opt="")
Double_t fThicknessSupport
Bool_t Init(Int_t planeNumber, Double_t zCenter, Double_t rMin, Double_t rMax, Double_t pixelSizeX, Double_t pixelSizeY, Double_t thicknessActive, Double_t thicknessSupport, Double_t thicknessReadout, Bool_t hasPixelRectangularPatternAlongY)
Double_t fZCenterActiveFront
static const Double_t fHeightActive
height of the active elements
static const Double_t fActiveSuperposition
Int_t GetNActiveElements() const
THnSparseC * GetSupportElement(Int_t id)
static const Double_t fSupportExtMargin
THnSparseC * GetReadoutElement(Int_t id)
virtual void Clear(const Option_t *)
AliMFTPlane & operator=(const AliMFTPlane &source)
Double_t fThicknessReadout
static const Double_t fHeightReadout
height of the readout elements attached to the active ones
TClonesArray * fActiveElements
#define AliDebug(logLevel, message)
Bool_t fHasPixelRectangularPatternAlongY
Int_t GetNumberOfChips(Option_t *opt)
Double_t fEquivalentSiliconBeforeFront
static const Double_t fActiveSuperposition
static const Double_t fHeightActive
static const Double_t fHeightReadout
static const Double_t fSupportExtMargin
TClonesArray * fSupportElements
static const Double_t fWidthChip
expressed in cm
Double_t fZCenterActiveBack
THnSparseC * GetActiveElement(Int_t id)