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 /* $Id: AliTRDgtuParam.cxx 28397 2008-09-02 09:33:00Z cblume $ */
18 ////////////////////////////////////////////////////////////////////////////
20 // Parameters for GTU simulation //
22 // Author: J. Klein (Jochen.Klein@cern.ch) //
24 ////////////////////////////////////////////////////////////////////////////
28 #include "TDecompLU.h"
29 #include "TGraphAsymmErrors.h"
33 #include "AliTRDgtuParam.h"
34 #include "AliTRDgeometry.h"
35 #include "AliTRDpadPlane.h"
37 ClassImp(AliTRDgtuParam)
39 AliTRDgtuParam *AliTRDgtuParam::fgInstance = 0;
41 // ----- Bin widths (granularity) -----
42 const Float_t AliTRDgtuParam::fgkBinWidthY = 160e-4;
43 const Float_t AliTRDgtuParam::fgkBinWidthdY = 140e-4;
45 // ----- Bit widths (used for internal representation) -----
46 const Int_t AliTRDgtuParam::fgkBitWidthY = 13;
47 const Int_t AliTRDgtuParam::fgkBitWidthdY = 7;
48 const Int_t AliTRDgtuParam::fgkBitWidthYProj = 10;
49 const Int_t AliTRDgtuParam::fgkBitExcessY = 4;
50 const Int_t AliTRDgtuParam::fgkBitExcessAlpha = 10;
51 const Int_t AliTRDgtuParam::fgkBitExcessYProj = 2;
53 // ----- Tracking parameters -----
55 const Int_t AliTRDgtuParam::fgkNZChannels = 3; // No. of z-channels
56 const Int_t AliTRDgtuParam::fgkNLinks = 12; // No. of links
57 const Int_t AliTRDgtuParam::fgkFixLayer = 2; // which layer is fixed for the generation of the z-channel map
58 const Int_t AliTRDgtuParam::fgkDeltaY = 39; // accepted deviation in y_proj, default: 9
59 const Int_t AliTRDgtuParam::fgkDeltaAlpha = 31; // accepted deviation in alpha, default: 11
60 const Int_t AliTRDgtuParam::fgkNRefLayers = 3; // no. of reference layers
63 AliTRDgtuParam::AliTRDgtuParam() :
70 fGeo = new AliTRDgeometry();
71 fRefLayers = new Int_t[fgkNRefLayers];
75 GenerateZChannelMap();
78 AliTRDgtuParam::~AliTRDgtuParam()
86 AliTRDgtuParam* AliTRDgtuParam::Instance()
88 // get (or create) the single instance
91 fgInstance = new AliTRDgtuParam();
96 void AliTRDgtuParam::Terminate()
98 // destruct the instance
100 if (fgInstance != 0) {
106 Bool_t AliTRDgtuParam::IsInZChannel(Int_t stack, Int_t layer, Int_t zchannel, Int_t zpos) const
108 return (fZSubChannel[stack][zchannel][layer][zpos] != 0);
111 Int_t AliTRDgtuParam::GetZSubchannel(Int_t stack, Int_t layer, Int_t zchannel, Int_t zpos) const
113 return fZSubChannel[stack][zchannel][layer][zpos];
116 Int_t AliTRDgtuParam::GetRefLayer(Int_t refLayerIdx) const
118 // returns the reference layer indexed by refLayerIdx
120 if (refLayerIdx >= 0 && refLayerIdx < fgkNRefLayers)
121 return fRefLayers[refLayerIdx];
126 Int_t AliTRDgtuParam::GenerateZChannelMap()
128 // generate the z-channel map
129 // assuming that the tracks come from the vertex
130 // +/- fVertexSize in z-direction
132 Int_t iSec = 0; // sector is irrelevant
133 Bool_t collision = kFALSE;
135 for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
137 Float_t x[6] = { 0 };
138 Float_t z[6][16] = {{ 0 }};
139 Float_t dZ[6][16] = {{ 0 }};
141 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
142 AliTRDpadPlane *pp = fGeo->GetPadPlane(iLayer, iStack);
143 x[iLayer] = fGeo->GetTime0(iLayer) - fGeo->CdrHght(); // ???
144 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
145 z[iLayer][iRow] = pp->GetRowPos(iRow); // this is the right (pos. z-direction) border of the pad
146 dZ[iLayer][iRow] = pp->GetRowSize(iRow); // length of the pad in z-direction
147 for (Int_t i = 0; i < fgkNZChannels; i++)
148 fZSubChannel[iStack][i][iLayer][iRow] = 0;
152 for (Int_t fixRow = 0; fixRow < fGeo->GetRowMax(fgkFixLayer, iStack, iSec); fixRow++) {
154 Double_t fixZmin = z[fgkFixLayer][fixRow] - dZ[fgkFixLayer][fixRow];
155 Double_t fixZmax = z[fgkFixLayer][fixRow];
156 Double_t fixX = x[fgkFixLayer] + 1.5; // ??? 1.5 from where?
158 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
159 Double_t leftZ, rightZ;
161 if (iLayer <= fgkFixLayer) {
162 leftZ = (fixZmin + fVertexSize) * (x[iLayer] + 1.5) / fixX - fVertexSize;
163 rightZ = (fixZmax - fVertexSize) * (x[iLayer] + 1.5) / fixX + fVertexSize;
166 leftZ = (fixZmin - fVertexSize) * (x[iLayer] + 1.5) / fixX + fVertexSize;
167 rightZ = (fixZmax + fVertexSize) * (x[iLayer] + 1.5) / fixX - fVertexSize;
170 Double_t epsilon = 0.001;
171 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, iSec); iRow++) {
172 if ( (z[iLayer][iRow] ) > (leftZ + epsilon) &&
173 (z[iLayer][iRow] - dZ[iLayer][iRow] ) < (rightZ - epsilon) ) {
174 fZChannelMap[iStack][fixRow][iLayer][iRow] = 1;
175 if (fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] != 0) {
176 AliError("Collision in Z-Channel assignment occured! No reliable tracking!!!");
180 fZSubChannel[iStack][fixRow % fgkNZChannels][iLayer][iRow] = fixRow / fgkNZChannels + 1;
191 Bool_t AliTRDgtuParam::DisplayZChannelMap(Int_t zchannel, Int_t subchannel) const
193 // display the z-channel map
195 if (zchannel > fgkNZChannels) {
196 AliError("Invalid Z channel!");
200 Int_t zchmin = zchannel >= 0 ? zchannel : 0;
201 Int_t zchmax = zchannel >= 0 ? zchannel + 1 : fgkNZChannels;
204 TCanvas *c = new TCanvas("zchmap", "Z-Chhannel Mapping");
206 TGraph **graphz = new TGraph*[fgkNZChannels];
207 for (Int_t zch = zchmin; zch < zchmax; zch++)
208 graphz[zch] = new TGraph;
209 TGraphAsymmErrors *graph = new TGraphAsymmErrors();
210 graph->SetTitle("Z-Channel Map");
211 graph->SetPoint(i, 0, 0); // vertex
212 graph->SetPointError(i++, 20, 20, 0, 0);
213 // graph->SetRange //????
214 for (Int_t iLayer = 0; iLayer < fGeo->Nlayer(); iLayer++) {
215 for (Int_t iStack = 0; iStack < fGeo->Nstack(); iStack++) {
216 AliTRDpadPlane *pp = fGeo->GetPadPlane(iLayer, iStack);
217 for (Int_t iRow = 0; iRow < fGeo->GetRowMax(iLayer, iStack, 0); iRow++) {
218 graph->SetPoint(i, pp->GetRowPos(iRow), fGeo->GetTime0(iLayer) - fGeo->CdrHght());
219 graph->SetPointError(i++, pp->GetRowSize(iRow), 0, 0, 0);
220 for (Int_t zch = zchmin; zch < zchmax; zch++)
221 if (fZSubChannel[iStack][zch][iLayer][iRow] != 0)
222 if (subchannel == 0 || fZSubChannel[iStack][zch][iLayer][iRow] == subchannel)
223 graphz[zch]->SetPoint(j++, pp->GetRowPos(iRow) - pp->GetRowSize(iRow)/2, fGeo->GetTime0(iLayer) - fGeo->CdrHght());
227 graph->SetMarkerStyle(kDot);
229 for (Int_t zch = zchmin; zch < zchmax; zch++) {
230 graphz[zch]->SetMarkerStyle(kCircle);
231 graphz[zch]->SetMarkerColor(zch+2);
232 graphz[zch]->SetMarkerSize(0.3 + zch*0.2);
233 graphz[zch]->Draw("P");
238 Int_t AliTRDgtuParam::GetCiAlpha(Int_t layer) const
240 // get the constant for the calculation of alpha
242 Int_t ci = (Int_t) (GetChamberThickness() / fGeo->GetTime0(layer) * GetBinWidthY() / GetBinWidthdY() * (1 << (GetBitExcessAlpha() + GetBitExcessY() + 1)) );
246 Int_t AliTRDgtuParam::GetCiYProj(Int_t layer) const
248 // get the constant for the calculation of y_proj
250 Float_t xmid = (fGeo->GetTime0(0) + fGeo->GetTime0(fGeo->Nlayer()-1)) / 2.;
251 Int_t ci = (Int_t) (- (fGeo->GetTime0(layer) - xmid) / GetChamberThickness() * GetBinWidthdY() / GetBinWidthY() * (1 << GetBitExcessYProj()) );
255 Int_t AliTRDgtuParam::GetYt(Int_t stack, Int_t layer, Int_t zrow) const
257 return (Int_t) (- ( (layer % 2 ? 1 : -1) *
258 (GetGeo()->GetPadPlane(layer, stack)->GetRowPos(zrow) - GetGeo()->GetPadPlane(layer, stack)->GetRowSize(zrow) / 2) *
259 TMath::Tan(- 2.0 / 180.0 * TMath::Pi()) ) / 0.016 );
262 Bool_t AliTRDgtuParam::GenerateRecoCoefficients(Int_t trackletMask)
264 // calculate the coefficients for the straight line fit
265 // depending on the mask of contributing tracklets
267 fCurrTrackletMask = trackletMask;
269 TMatrix a(GetNLayers(), 3);
270 TMatrix b(3, GetNLayers());
273 for (Int_t layer = 0; layer < GetNLayers(); layer++) {
274 if ( (trackletMask & (1 << layer)) == 0) {
281 a(layer, 1) = fGeo->GetTime0(layer);
282 a(layer, 2) = (layer % 2 ? 1 : -1) * fGeo->GetTime0(layer);
291 for (Int_t layer = 0; layer < GetNLayers(); layer++) {
292 fAki[layer] = b.GetMatrixArray()[layer];
293 fBki[layer] = b.GetMatrixArray()[GetNLayers() + layer];
294 fCki[layer] = b.GetMatrixArray()[2 * GetNLayers() + layer];
299 Float_t AliTRDgtuParam::GetAki(Int_t k, Int_t i)
301 // get A_ki for the calculation of the tracking parameters
302 if (fCurrTrackletMask != k)
303 GenerateRecoCoefficients(k);
308 Float_t AliTRDgtuParam::GetBki(Int_t k, Int_t i)
310 // get B_ki for the calculation of the tracking parameters
312 if (fCurrTrackletMask != k)
313 GenerateRecoCoefficients(k);
318 Float_t AliTRDgtuParam::GetCki(Int_t k, Int_t i)
320 // get B_ki for the calculation of the tracking parameters
322 if (fCurrTrackletMask != k)
323 GenerateRecoCoefficients(k);
329 Float_t AliTRDgtuParam::GetD(Int_t k) const
331 // get the determinant for the calculation of the tracking parameters
334 for (Int_t i = 0; i < GetNLayers(); i++) {
335 if ( !((k >> i) & 0x1) )
337 Float_t xi = fGeo->GetTime0(i);
340 t(2,0) += TMath::Power(-1, i) * xi;
342 t(1,1) += TMath::Power(xi, 2);
343 t(2,1) += TMath::Power(-1, i) * TMath::Power(xi, 2);
344 t(0,2) += TMath::Power(-1, i) * xi;
345 t(1,2) += TMath::Power(-1, i) * TMath::Power(xi, 2);
346 t(2,2) += TMath::Power(xi, 2);
348 return t.Determinant();
351 Bool_t AliTRDgtuParam::GetFitParams(TVectorD& rhs, Int_t k)
353 // calculate the fitting parameters
357 for (Int_t i = 0; i < GetNLayers(); i++) {
358 if ( !((k >> i) & 0x1) )
360 Float_t xi = fGeo->GetTime0(i);
363 t(2,0) += TMath::Power(-1, i) * xi;
365 t(1,1) += TMath::Power(xi, 2);
366 t(2,1) += TMath::Power(-1, i) * TMath::Power(xi, 2);
367 t(0,2) -= TMath::Power(-1, i) * xi;
368 t(1,2) -= TMath::Power(-1, i) * TMath::Power(xi, 2);
369 t(2,2) -= TMath::Power(xi, 2);
373 return lr.Decompose();
377 Bool_t AliTRDgtuParam::GetIntersectionPoints(Int_t k, Float_t &x1, Float_t &x2)
379 // get the x-coord. of the assumed circle/straight line intersection points
384 for (Int_t layer = 0; layer < GetNLayers(); layer++) {
385 if ( (k >> layer) & 0x1 ) {
393 x1 = fGeo->GetTime0(l1) + 10./6 * (nHits -1);
394 x2 = fGeo->GetTime0(l2) - 10./6 * (nHits -1);
396 return ( (l1 >= 0) && (l2 >= 0) );
399 Float_t AliTRDgtuParam::GetRadius(Int_t a, Float_t b, Float_t x1, Float_t x2) const
401 // get the radius for the track
402 Float_t d = (1 + b * b /2 ) * (x2 - x1);
403 Float_t c1 = x1 * x2 / 2;
404 // Float_t c2 = (x1 + x2) / (x1 * x2);
405 // printf("c1: %f\n", c1);
408 r = (375. / 10000.) * c1 * 256 / (a >> 1);
411 Float_t y1 = a + b*x1;
412 Float_t y2 = a + b*x2;
413 Float_t alpha = TMath::Abs( TMath::ATan(y2/x2) - TMath::ATan(y1/x1) );
414 d = TMath::Sqrt( TMath::Power(x2-x1, 2) + TMath::Power(y2-y1, 2) );
415 r = d / 2. / TMath::Sin(alpha);