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 **************************************************************************/
17 //-------------------------------------------------------
18 // Implementation of the TPC tracker helper clasess
20 // AliTPCtrackerSector
22 // Origin: Marian Ivanov Marian.Ivanov@cern.ch
24 // AliTPCtrakerMI - parallel tracker helper clases
27 /* $Id: AliTPCtrackerSector.cxx 25837 2008-05-16 16:39:00Z marian $ */
29 #include "Riostream.h"
30 #include <TClonesArray.h>
32 #include "AliComplexCluster.h"
33 #include "AliTPCcluster.h"
34 #include "AliTPCclusterMI.h"
35 #include "AliTPCClustersRow.h"
36 #include "AliTPCParam.h"
37 #include "AliTPCReconstructor.h"
38 #include "AliTPCreco.h"
40 #include "AliTPCtrackerSector.h"
41 #include "TStopwatch.h"
42 #include "TTreeStream.h"
46 ClassImp(AliTPCtrackerRow)
47 ClassImp(AliTPCtrackerSector)
51 AliTPCtrackerRow::AliTPCtrackerRow():
64 // default constructor
68 AliTPCtrackerRow::~AliTPCtrackerRow(){
76 //_________________________________________________________________________
78 AliTPCtrackerRow::InsertCluster(const AliTPCclusterMI* c, UInt_t index) {
79 //-----------------------------------------------------------------------
80 // Insert a cluster into this pad row in accordence with its y-coordinate
81 //-----------------------------------------------------------------------
83 AliError("Inserting Zerro cluster pointer");
86 if (fN==kMaxClusterPerRow) {
87 //AliInfo("AliTPCtrackerRow::InsertCluster(): Too many clusters");
91 //AliInfo("AliTPCtrackerRow::InsertCluster(): Too many clusters !");
94 if (fN==0) {fIndex[0]=index; fClusters[fN++]=c; return;}
95 Int_t i=Find(c->GetZ());
96 if (i>=0 && i<=kMaxClusterPerRow-2) {
97 memmove(fClusters+i+1 ,fClusters+i,(fN-i)*sizeof(AliTPCclusterMI*));
98 memmove(fIndex +i+1 ,fIndex +i,(fN-i)*sizeof(UInt_t));
100 fIndex[i]=index; fClusters[i]=c; fN++;
103 void AliTPCtrackerRow::ResetClusters() {
106 // MvL: Need to call destructors for AliTPCclusterMI, to delete fInfo
107 if (fClusters1) fClusters1->Clear("C");
108 if (fClusters2) fClusters2->Clear("C");
113 //delete[] fClusterArray;
119 //___________________________________________________________________
120 Int_t AliTPCtrackerRow::Find(Double_t z) const {
121 //-----------------------------------------------------------------------
122 // Return the index of the nearest cluster
123 //-----------------------------------------------------------------------
125 if (z <= fClusters[0]->GetZ()) return 0;
126 if (z > fClusters[fN-1]->GetZ()) return fN;
127 Int_t b=0, e=fN-1, m=(b+e)/2;
128 for (; b<e; m=(b+e)/2) {
129 if (z > fClusters[m]->GetZ()) b=m+1;
137 //___________________________________________________________________
138 AliTPCclusterMI * AliTPCtrackerRow::FindNearest(Double_t y, Double_t z, Double_t roady, Double_t roadz) const {
139 //-----------------------------------------------------------------------
140 // Return the index of the nearest cluster in z y
141 //-----------------------------------------------------------------------
142 Float_t maxdistance = roady*roady + roadz*roadz;
144 AliTPCclusterMI *cl =0;
145 for (Int_t i=Find(z-roadz); i<fN; i++) {
146 AliTPCclusterMI *c=(AliTPCclusterMI*)(fClusters[i]);
147 if (c->GetZ() > z+roadz) break;
148 if ( (c->GetY()-y) > roady ) continue;
149 Float_t distance = (c->GetZ()-z)*(c->GetZ()-z)+(c->GetY()-y)*(c->GetY()-y);
150 if (maxdistance>distance) {
151 maxdistance = distance;
158 AliTPCclusterMI * AliTPCtrackerRow::FindNearest2(Double_t y, Double_t z, Double_t roady, Double_t roadz,UInt_t & index) const
160 //-----------------------------------------------------------------------
161 // Return the index of the nearest cluster in z y
162 //-----------------------------------------------------------------------
163 Float_t maxdistance = roady*roady + roadz*roadz;
164 AliTPCclusterMI *cl =0;
166 //PH Check boundaries. 510 is the size of fFastCluster
167 Int_t iz1 = Int_t(z-roadz+254.5);
168 if (iz1<0 || iz1>=510) return cl;
169 iz1 = TMath::Max(GetFastCluster(iz1)-1,0);
170 Int_t iz2 = Int_t(z+roadz+255.5);
171 if (iz2<0 || iz2>=510) return cl;
172 iz2 = TMath::Min(GetFastCluster(iz2)+1,fN);
173 Bool_t skipUsed = !(AliTPCReconstructor::GetRecoParam()->GetClusterSharing());
174 //FindNearest3(y,z,roady,roadz,index);
175 // for (Int_t i=Find(z-roadz); i<fN; i++) {
176 for (Int_t i=iz1; i<iz2; i++) {
177 AliTPCclusterMI *c=(AliTPCclusterMI*)(fClusters[i]);
178 if (c->GetZ() > z+roadz) break;
179 if ( c->GetY()-y > roady ) continue;
180 if ( y-c->GetY() > roady ) continue;
181 if (skipUsed && c->IsUsed(11)) continue;
182 Float_t distance = (c->GetZ()-z)*(c->GetZ()-z)+(c->GetY()-y)*(c->GetY()-y);
183 if (maxdistance>distance) {
184 maxdistance = distance;
187 //roady = TMath::Sqrt(maxdistance);
194 void AliTPCtrackerRow::SetFastCluster(Int_t i, Short_t cl){
196 // Set cluster info for fast navigation
205 Int_t AliTPCtrackerSector::GetRowNumber(Double_t x) const
207 //return pad row number for this x
211 if (x > r) return fN;
213 if (x < r) return -1;
214 return Int_t((x-r)/fPadPitchLength + 0.5);}
217 if (x > r) return fN;
219 if (x < r) return -1;
220 Double_t r1=fRow[64].GetX();
222 return Int_t((x-r)/f1PadPitchLength + 0.5);}
224 return (Int_t((x-r1)/f2PadPitchLength + 0.5)+64);}
229 void AliTPCtrackerRow::SetCluster1(Int_t i, const AliTPCclusterMI &cl)
232 if (!fClusters1) fClusters1 = new TClonesArray("AliTPCclusterMI",1000);
233 if (i<=fClusters1->GetLast() && fClusters1->UncheckedAt(i)) fClusters1->RemoveAt(i);
234 new( (*fClusters1)[fClusters1->GetEntriesFast()] ) AliTPCclusterMI(cl);
238 void AliTPCtrackerRow::SetCluster2(Int_t i, const AliTPCclusterMI &cl)
241 if (!fClusters2) fClusters2 = new TClonesArray("AliTPCclusterMI",1000);
242 if (i<=fClusters2->GetLast() && fClusters2->UncheckedAt(i)) fClusters2->RemoveAt(i);
243 new( (*fClusters2)[fClusters2->GetEntriesFast()] ) AliTPCclusterMI(cl);
248 //_________________________________________________________________________
249 void AliTPCtrackerSector::Setup(const AliTPCParam *par, Int_t f) {
250 //-----------------------------------------------------------------------
251 // Setup inner sector
252 //-----------------------------------------------------------------------
254 fAlpha=par->GetInnerAngle();
255 fAlphaShift=par->GetInnerAngleShift();
256 fPadPitchWidth=par->GetInnerPadPitchWidth();
257 fPadPitchLength=par->GetInnerPadPitchLength();
258 fN=par->GetNRowLow();
259 if(fRow)delete [] fRow;fRow = 0;
260 fRow=new AliTPCtrackerRow[fN];
261 for (Int_t i=0; i<fN; i++) {
262 fRow[i].SetX(par->GetPadRowRadiiLow(i));
263 fRow[i].SetDeadZone(1.5); //1.5 cm of dead zone
266 fAlpha=par->GetOuterAngle();
267 fAlphaShift=par->GetOuterAngleShift();
268 fPadPitchWidth = par->GetOuterPadPitchWidth();
269 fPadPitchLength = par->GetOuter1PadPitchLength();
270 f1PadPitchLength = par->GetOuter1PadPitchLength();
271 f2PadPitchLength = par->GetOuter2PadPitchLength();
273 if(fRow)delete [] fRow;fRow = 0;
274 fRow=new AliTPCtrackerRow[fN];
275 for (Int_t i=0; i<fN; i++) {
276 fRow[i].SetX(par->GetPadRowRadiiUp(i));
277 fRow[i].SetDeadZone(1.5); // 1.5 cm of dead zone
282 //_________________________________________________________________________
283 void AliTPCtrackerSector::InsertCluster(AliTPCclusterMI *cl, Int_t size, const AliTPCParam *par) {
284 //-----------------------------------------------------------------------
285 // Insert cluster to the sector
286 //-----------------------------------------------------------------------
290 const Int_t fkNIS = par->GetNInnerSector()/2;
291 const Int_t fkNOS = par->GetNOuterSector()/2;
292 Int_t row = cl->GetRow();
293 Int_t sec = cl->GetDetector();
295 // add cluster to the corresponding pad row
296 AliTPCtrackerRow *tpcrow = 0x0;
303 left = (sec-fkNIS*2)/fkNOS;
308 if(!tpcrow->GetClusters1()) {
311 if(size < kMaxClusterPerRow) {
312 tpcrow->SetCluster1(tpcrow->GetN1(), *cl);
313 //printf("inner: size %d, tpcrow->GetN1() %d sec %d row %d tpcrow %p cl %p\n", size, tpcrow->GetN1(), sec, row, tpcrow, cl);
315 tpcrow->IncrementN1();
320 if(!tpcrow->GetClusters2()) {
323 if(size < kMaxClusterPerRow) {
324 tpcrow->SetCluster2(tpcrow->GetN2(), *cl);
325 //printf("outer: size %d, tpcrow->GetN2() %d sec %d row %d tpcrow %p cl %p\n", size, tpcrow->GetN2(), sec, row, tpcrow, cl);
327 tpcrow->IncrementN2();