1 /**************************************************************************
2 * Copyright(c) 2007-2009, 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 **************************************************************************/
15 /* $Id: AliITStrackerHLT.cxx 32466 2009-05-20 07:51:56Z hristov $ */
17 //-------------------------------------------------------------------------
18 // Implementation of the ITS tracker class
19 // It reads AliITSRecPoint clusters and creates AliHLTITSTrack tracks
20 // and fills with them the ESD
21 // Origin: Marian Ivanov, CERN, Marian.Ivanov@cern.ch
22 // Current support and development:
23 // Andrea Dainese, andrea.dainese@lnl.infn.it
24 // dE/dx analysis by: Boris Batyunya, JINR, Boris.Batiounia@cern.ch
25 // Params moved to AliITSRecoParam by: Andrea Dainese, INFN
26 // Material budget from TGeo by: Ludovic Gaudichet & Andrea Dainese, INFN
27 //-------------------------------------------------------------------------
29 //#include <TMatrixD.h>
31 #include <TDatabasePDG.h>
34 #include <TTreeStream.h>
38 #include "AliITSCalibrationSPD.h"
39 #include "AliITSCalibrationSDD.h"
40 #include "AliITSCalibrationSSD.h"
41 #include "AliCDBEntry.h"
42 #include "AliCDBManager.h"
43 #include "AliAlignObj.h"
44 #include "AliTrackPointArray.h"
45 #include "AliESDVertex.h"
46 #include "AliESDEvent.h"
47 #include "AliESDtrack.h"
50 #include "AliITSChannelStatus.h"
51 #include "AliITSRecPoint.h"
52 #include "AliITSgeomTGeo.h"
53 #include "AliITSReconstructor.h"
54 #include "AliITSClusterParam.h"
55 #include "AliITSsegmentation.h"
56 #include "AliITSCalibration.h"
57 #include "AliITSV0Finder.h"
58 #include "AliITStrackerHLT.h"
59 #include "TStopwatch.h"
60 //#include "AliHLTTPCCATrackParam.h"
61 //#include "AliHLTVertexer.h"
64 ClassImp(AliITStrackerHLT)
66 Bool_t AliITStrackerHLT::TransportToX( AliExternalTrackParam *t, double x ) const
68 return t->PropagateTo( x, t->GetBz() );
71 Bool_t AliITStrackerHLT::TransportToPhiX( AliExternalTrackParam *t, double phi, double x ) const
73 return t->Propagate( phi, x, t->GetBz() );
78 AliITStrackerHLT::AliITStrackerHLT()
81 fLayers(new AliHLTITSLayer[AliITSgeomTGeo::kNLayers]),
97 for(i=0;i<4;i++) fSPDdetzcentre[i]=0.;
98 for(i=0;i<2;i++) {fxOverX0Shield[i]=-1.;fxTimesRhoShield[i]=-1.;}
99 for(i=0;i<6;i++) {fxOverX0Layer[i]=-1.;fxTimesRhoLayer[i]=-1.;}
101 //------------------------------------------------------------------------
102 AliITStrackerHLT::AliITStrackerHLT(const Char_t *geom)
105 fLayers(new AliHLTITSLayer[AliITSgeomTGeo::kNLayers]),
111 fITSChannelStatus(0),
119 //--------------------------------------------------------------------
120 //This is the AliITStrackerHLT constructor
121 //--------------------------------------------------------------------
123 AliWarning("\"geom\" is actually a dummy argument !");
126 if(AliGeomManager::GetGeometry()==NULL){
127 AliGeomManager::LoadGeometry();
130 fRecoParam = AliITSReconstructor::GetRecoParam();
132 AliITSReconstructor *tmp = new AliITSReconstructor();
134 fRecoParam = AliITSRecoParam::GetLowFluxParam();
135 tmp->AliReconstructor::SetRecoParam(fRecoParam);
137 for (Int_t i=1; i<AliITSgeomTGeo::GetNLayers()+1; i++) {
138 Int_t nlad=AliITSgeomTGeo::GetNLadders(i);
139 Int_t ndet=AliITSgeomTGeo::GetNDetectors(i);
141 Double_t xyz[3], &x=xyz[0], &y=xyz[1], &z=xyz[2];
142 AliITSgeomTGeo::GetOrigTranslation(i,1,1,xyz);
143 Double_t poff=TMath::ATan2(y,x);
145 Double_t r=TMath::Sqrt(x*x + y*y);
147 AliITSgeomTGeo::GetOrigTranslation(i,1,2,xyz);
148 r += TMath::Sqrt(x*x + y*y);
149 AliITSgeomTGeo::GetOrigTranslation(i,2,1,xyz);
150 r += TMath::Sqrt(x*x + y*y);
151 AliITSgeomTGeo::GetOrigTranslation(i,2,2,xyz);
152 r += TMath::Sqrt(x*x + y*y);
155 new (fLayers+i-1) AliHLTITSLayer(r,poff,zoff,nlad,ndet);
157 for (Int_t j=1; j<nlad+1; j++) {
158 for (Int_t k=1; k<ndet+1; k++) { //Fill this layer with detectors
159 TGeoHMatrix m; AliITSgeomTGeo::GetOrigMatrix(i,j,k,m);
160 const TGeoHMatrix *tm=AliITSgeomTGeo::GetTracking2LocalMatrix(i,j,k);
162 Double_t txyz[3]={0.};
163 xyz[0]=0.;xyz[1]=0.;xyz[2]=0.;
164 m.LocalToMaster(txyz,xyz);
165 r=TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]);
166 Double_t phi=TMath::ATan2(xyz[1],xyz[0]);
168 if (phi<0) phi+=TMath::TwoPi();
169 else if (phi>=TMath::TwoPi()) phi-=TMath::TwoPi();
171 AliHLTITSDetector &det=fLayers[i-1].GetDetector((j-1)*ndet + k-1);
172 new(&det) AliHLTITSDetector(r,phi);
173 // compute the real radius (with misalignment)
174 TGeoHMatrix mmisal(*(AliITSgeomTGeo::GetMatrix(i,j,k)));
176 xyz[0]=0.;xyz[1]=0.;xyz[2]=0.;
177 mmisal.LocalToMaster(txyz,xyz);
178 Double_t rmisal=TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]);
179 det.SetRmisal(rmisal);
181 } // end loop on detectors
182 } // end loop on ladders
183 } // end loop on layers
186 Double_t xyzVtx[]={ fRecoParam->GetXVdef(),
187 fRecoParam->GetYVdef(),
188 fRecoParam->GetZVdef()};
189 Double_t ersVtx[]={ fRecoParam->GetSigmaXVdef(),
190 fRecoParam->GetSigmaYVdef(),
191 fRecoParam->GetSigmaZVdef()};
193 SetVertex(xyzVtx,ersVtx);
195 // store positions of centre of SPD modules (in z)
197 AliITSgeomTGeo::GetTranslation(1,1,1,tr);
198 fSPDdetzcentre[0] = tr[2];
199 AliITSgeomTGeo::GetTranslation(1,1,2,tr);
200 fSPDdetzcentre[1] = tr[2];
201 AliITSgeomTGeo::GetTranslation(1,1,3,tr);
202 fSPDdetzcentre[2] = tr[2];
203 AliITSgeomTGeo::GetTranslation(1,1,4,tr);
204 fSPDdetzcentre[3] = tr[2];
206 //fUseTGeo = fRecoParam->GetUseTGeoInTracker();
207 //if(fRecoParam->GetExtendedEtaAcceptance() && fUseTGeo!=1 && fUseTGeo!=3) {
208 //AliWarning("fUseTGeo changed to 3 because fExtendedEtaAcceptance is kTRUE");
212 for(Int_t i=0;i<2;i++) {fxOverX0Shield[i]=-1.;fxTimesRhoShield[i]=-1.;}
213 for(Int_t i=0;i<6;i++) {fxOverX0Layer[i]=-1.;fxTimesRhoLayer[i]=-1.;}
215 fDebugStreamer = new TTreeSRedirector("ITSdebug.root");
218 //------------------------------------------------------------------------
219 AliITStrackerHLT::AliITStrackerHLT(const AliITStrackerHLT &tracker)
220 :AliTracker(tracker),
221 fRecoParam( tracker.fRecoParam),
222 fLayers(new AliHLTITSLayer[AliITSgeomTGeo::kNLayers]),
224 fUseTGeo(tracker.fUseTGeo),
225 fxOverX0Pipe(tracker.fxOverX0Pipe),
226 fxTimesRhoPipe(tracker.fxTimesRhoPipe),
227 fDebugStreamer(tracker.fDebugStreamer),
228 fITSChannelStatus(tracker.fITSChannelStatus),
239 fSPDdetzcentre[i]=tracker.fSPDdetzcentre[i];
242 fxOverX0Layer[i]=tracker.fxOverX0Layer[i];
243 fxTimesRhoLayer[i]=tracker.fxTimesRhoLayer[i];
246 fxOverX0Shield[i]=tracker.fxOverX0Shield[i];
247 fxTimesRhoShield[i]=tracker.fxTimesRhoShield[i];
251 //------------------------------------------------------------------------
252 AliITStrackerHLT & AliITStrackerHLT::operator=(const AliITStrackerHLT &tracker){
253 //Assignment operator
254 this->~AliITStrackerHLT();
255 new(this) AliITStrackerHLT(tracker);
258 //------------------------------------------------------------------------
259 AliITStrackerHLT::~AliITStrackerHLT()
264 if (fDebugStreamer) {
265 //fDebugStreamer->Close();
266 delete fDebugStreamer;
268 if(fITSChannelStatus) delete fITSChannelStatus;
272 void AliITStrackerHLT::Init()
274 BuildMaterialLUT("Layers");
275 BuildMaterialLUT("Pipe");
276 BuildMaterialLUT("Shields");
280 void AliITStrackerHLT::StartLoadClusters( Int_t guessForNClusters )
284 fClusters.reserve( guessForNClusters );
287 void AliITStrackerHLT::LoadCluster( const AliITSRecPoint &cluster)
289 fClusters.push_back( cluster );
294 //------------------------------------------------------------------------
295 Int_t AliITStrackerHLT::LoadClusters(TTree *cTree) {
296 //--------------------------------------------------------------------
297 //This function loads ITS clusters
298 //--------------------------------------------------------------------
302 TBranch *branch=cTree->GetBranch("ITSRecPoints");
304 Error("LoadClusters"," can't get the branch !\n");
308 static TClonesArray dummy("AliITSRecPoint",10000), *clusters=&dummy;
309 branch->SetAddress(&clusters);
311 Int_t i=0,j=0,ndet=0;
312 for (i=0; i<AliITSgeomTGeo::GetNLayers(); i++) {
313 ndet=fLayers[i].GetNdetectors();
314 Int_t jmax = j + fLayers[i].GetNladders()*ndet;
315 for (; j<jmax; j++) {
316 if (!cTree->GetEvent(j)) continue;
317 Int_t ncl=clusters->GetEntriesFast();
319 LoadCluster( *( (AliITSRecPoint*)clusters->UncheckedAt(ncl)));
330 //------------------------------------------------------------------------
331 void AliITStrackerHLT::UnloadClusters() {
332 //--------------------------------------------------------------------
333 //This function unloads ITS clusters
334 //--------------------------------------------------------------------
335 for (Int_t i=0; i<AliITSgeomTGeo::GetNLayers(); i++) fLayers[i].ResetClusters();
342 void AliITStrackerHLT::Reconstruct( std::vector<AliExternalTrackParam> tracksTPC )
345 //--------------------------------------------------------------------
346 // This functions reconstructs ITS tracks
347 //--------------------------------------------------------------------
353 TStopwatch timerInit;
355 for( int i=0; i<AliITSgeomTGeo::GetNLayers(); i++ ){
356 fLayers[i].ResetClusters();
359 for( unsigned int icl=0; icl<fClusters.size(); icl++ ){
360 AliITSRecPoint &cl = fClusters[icl];
361 if (!cl.Misalign()) AliWarning("Can't misalign this cluster !");
362 fLayers[cl.GetLayer()].InsertCluster(&cl);
365 for( int i=0; i<AliITSgeomTGeo::GetNLayers(); i++ ){
366 fLayers[i].ResetRoad(); //road defined by the cluster density
367 fLayers[i].SortClusters();
370 fLoadTime+=timerInit.RealTime();
375 Double_t pimass = TDatabasePDG::Instance()->GetParticle(211)->Mass();
377 fITSOutTracks.clear();
379 for( unsigned int itr=0; itr<tracksTPC.size(); itr++ ){
381 AliHLTITSTrack tMI( tracksTPC[itr] );
382 AliHLTITSTrack *t = &tMI;
383 t->SetTPCtrackId( itr );
387 //if (!CorrectForTPCtoITSDeadZoneMaterial(t)) continue;
389 //Int_t tpcLabel=t->GetLabel(); //save the TPC track label
391 FollowProlongationTree(t);
393 for(Int_t i=0; i<6; i++) {
394 if( t->GetClusterIndex(i)>=0 ) nclu++;
396 //cout<<"N assigned ITS clusters = "<<nclu<<std::endl;
399 t->SetLabel(-1);//tpcLabel);
401 CookLabel(t,.99); //For comparison only
402 //cout<<"label = "<<t->GetLabel()<<" / "<<tpcLabel<<endl;
405 //CorrectForPipeMaterial(t);
408 fTracks.push_back( *t );
409 if( nclu>0 ){ // construct ITSOut track
410 AliHLTITSTrack tOut(*t);
411 if( FitOutward( &tOut ) ){
412 fITSOutTracks.push_back( *t );
418 fRecoTime+=timer.RealTime();
423 //------------------------------------------------------------------------
424 Int_t AliITStrackerHLT::Clusters2Tracks(AliESDEvent *event) {
425 //--------------------------------------------------------------------
426 // This functions reconstructs ITS tracks
427 // The clusters must be already loaded !
428 //--------------------------------------------------------------------
431 fEsd = event; // store pointer to the esd
432 std::vector<AliExternalTrackParam> tracksTPC;
433 tracksTPC.reserve(event->GetNumberOfTracks());
434 fTracks.reserve(event->GetNumberOfTracks());
436 for( int itr=0; itr<event->GetNumberOfTracks(); itr++ ){
438 AliESDtrack *esdTrack = event->GetTrack(itr);
439 //esdTrack->myITS = esdTrack->myTPC;
440 if ((esdTrack->GetStatus()&AliESDtrack::kTPCin)==0) continue;
441 //if (esdTrack->GetStatus()&AliESDtrack::kTPCout) continue;
442 if (esdTrack->GetStatus()&AliESDtrack::kITSin) continue;
443 if (esdTrack->GetKinkIndex(0)>0) continue; //kink daughter
445 AliHLTITSTrack t(*esdTrack);
446 t.SetTPCtrackId( itr );
447 tracksTPC.push_back( t );
449 //for( int iter=0; iter<100; iter++){
450 Reconstruct( tracksTPC );
453 for( unsigned int itr=0; itr<fTracks.size(); itr++ ){
454 AliHLTITSTrack &t = fTracks[itr];
455 UpdateESDtrack(event->GetTrack(t.TPCtrackId()), &t, AliESDtrack::kITSin);
456 //event->GetTrack(t.TPCtrackId())->myITS = t;
460 int hz = ( int ) ( (fRecoTime+fLoadTime) > 1.e-4 ? fNEvents / (fRecoTime+fLoadTime) : 0 );
461 int hz1 = ( int ) ( fRecoTime > 1.e-4 ? fNEvents / fRecoTime : 0 );
462 int hz2 = ( int ) ( fLoadTime > 1.e-4 ? fNEvents / fLoadTime : 0 );
464 std::cout<<"\n\n ITS tracker time = "<<hz2<<" Hz load / "<<hz1<<" Hz reco ="
467 <<fLoadTime/fNEvents*1000<<"+"<<fRecoTime/fNEvents*1000.
468 <<" = "<<(fLoadTime + fRecoTime)/fNEvents*1000.
469 <<" ms/ev), "<<fNEvents<<" events processed\n\n "<<std::endl;
474 AliCluster *AliITStrackerHLT::GetCluster(Int_t index) const
476 // Return pointer to a given cluster
477 Int_t l=(index & 0xf0000000) >> 28;
478 Int_t c=(index & 0x0fffffff) >> 00;
479 return fLayers[l].GetCluster(c);
485 //------------------------------------------------------------------------
486 void AliITStrackerHLT::FollowProlongationTree(AliHLTITSTrack * track )
488 for (Int_t ilayer=5; ilayer>=0; ilayer--) {
490 AliHLTITSLayer &layer=fLayers[ilayer];
492 // material between SSD and SDD, SDD and SPD
493 //if (ilayer==3 && !CorrectForShieldMaterial(track,1)) continue;
494 //if (ilayer==1 && !CorrectForShieldMaterial(track,0)) continue;
499 Double_t xloc, phi,z;
500 if( !track->GetLocalXPhiZat( layer.GetR(), xloc, phi, z ) ) return;
501 idet = layer.FindDetectorIndex(phi,z);
504 // track outside layer acceptance in z
506 if( idet<0 ) continue;
508 // propagate to the intersection with the detector plane
510 const AliHLTITSDetector &det=layer.GetDetector( idet );
511 if (!TransportToPhiX( track, det.GetPhi(), det.GetR() ) ) return;
512 CorrectForLayerMaterial(track,ilayer);
515 // DEFINITION OF SEARCH ROAD AND CLUSTERS SELECTION
517 // road in global (rphi,z) [i.e. in tracking ref. system]
519 Double_t zmin,zmax,ymin,ymax;
521 if (!ComputeRoad(track,ilayer,idet,zmin,zmax,ymin,ymax)) continue;
523 layer.SelectClusters(zmin,zmax,ymin,ymax);
525 // Define criteria for track-cluster association
527 Double_t msz = track->GetSigmaZ2() +
528 fRecoParam->GetNSigmaZLayerForRoadZ()*
529 fRecoParam->GetNSigmaZLayerForRoadZ()*
530 fRecoParam->GetSigmaZ2(ilayer);
532 Double_t msy = track->GetSigmaY2() +
533 fRecoParam->GetNSigmaYLayerForRoadY()*
534 fRecoParam->GetNSigmaYLayerForRoadY()*
535 fRecoParam->GetSigmaY2(ilayer);
537 msz *= fRecoParam->GetNSigma2RoadZNonC();
538 msy *= fRecoParam->GetNSigma2RoadYNonC();
540 msz = 1./msz; // 1/RoadZ^2
541 msy = 1./msy; // 1/RoadY^2
543 const AliITSRecPoint *cl=0;
546 // loop over clusters in the road
548 const AliITSRecPoint *bestCluster=0;
549 double bestChi2 = 1.e10;
550 AliHLTITSTrack bestTrack( *track );
553 while( (cl=layer.GetNextCluster(clidx)) ){
554 Int_t idetc=cl->GetDetectorIndex();
555 if ( idet !=idetc ) { // new cluster's detector
556 const AliHLTITSDetector &detc=layer.GetDetector(idetc);
557 if (!TransportToPhiX( track, detc.GetPhi(),detc.GetR()) ) continue;
561 //if (! track->GetLocalYZat( layer.GetDetector(idetc).GetR() + cl->GetX(),y,z ) ) continue;
562 double dz = track->GetZ() - cl->GetZ();
563 double dy = track->GetY() - cl->GetY();
564 double chi2 = dz*dz*msz + dy*dy*msy ;
565 if ( chi2 < bestChi2 ){
574 if( !bestCluster || bestChi2 >2*10. ) continue;
576 if (!TransportToX( &bestTrack, layer.GetDetector(bestCluster->GetDetectorIndex()).GetR() + bestCluster->GetX() ) ) continue;
578 Double_t par[2]={ bestCluster->GetY(), bestCluster->GetZ()};
579 Double_t cov[3]={ bestCluster->GetSigmaY2(), 0., bestCluster->GetSigmaZ2()};
580 if( !bestTrack.AliExternalTrackParam::Update(par,cov) ) continue;
583 track->SetClusterIndex(track->GetNumberOfClusters(), (ilayer<<28)+bestIdx);
584 track->SetNumberOfClusters(track->GetNumberOfClusters()+1);
590 Int_t AliITStrackerHLT::FitOutward(AliHLTITSTrack * track )
593 track->ResetCovariance(100);
595 for (Int_t iTrCl=track->GetNumberOfClusters()-1; iTrCl>=0; iTrCl--) {
597 Int_t index = track->GetClusterIndex(iTrCl);
598 Int_t ilayer=(index & 0xf0000000) >> 28;
599 Int_t ic=(index & 0x0fffffff) >> 00;
600 const AliHLTITSLayer &layer=fLayers[ilayer];
601 AliITSRecPoint *cl = layer.GetCluster(ic);
602 int idet = cl->GetDetectorIndex();
603 const AliHLTITSDetector &det=layer.GetDetector( idet );
605 // material between SSD and SDD, SDD and SPD
606 //if (ilayer==4 && !CorrectForShieldMaterial(track,1)) continue;
607 //if (ilayer==2 && !CorrectForShieldMaterial(track,0)) continue;
610 // propagate to the intersection with the detector plane
612 if (!TransportToPhiX( track, det.GetPhi(), det.GetR()+ cl->GetX() ) ) return 0;
613 CorrectForLayerMaterial(track,ilayer);
616 Double_t par[2]={ cl->GetY(), cl->GetZ()};
617 Double_t cov[3]={ cl->GetSigmaY2(), 0., cl->GetSigmaZ2()};
618 if( !track->AliExternalTrackParam::Update(par,cov) ) return 0;
624 //------------------------------------------------------------------------
625 AliHLTITSLayer & AliITStrackerHLT::GetLayer(Int_t layer) const
627 //--------------------------------------------------------------------
630 return fLayers[layer];
635 //------------------------------------------------------------------------
636 void AliITStrackerHLT::CookLabel(AliHLTITSTrack *track,Float_t wrong) const
638 // get MC label for the track
643 Int_t nClusters = track->GetNumberOfClusters();
645 for (Int_t i=0; i<nClusters; i++){
646 Int_t cindex = track->GetClusterIndex(i);
647 //Int_t l=(cindex & 0xf0000000) >> 28;
648 AliITSRecPoint *cl = (AliITSRecPoint*)GetCluster(cindex);
649 if ( cl->GetLabel(0) >= 0 ) labels.push_back(cl->GetLabel(0)) ;
650 if ( cl->GetLabel(1) >= 0 ) labels.push_back(cl->GetLabel(1)) ;
651 if ( cl->GetLabel(2) >= 0 ) labels.push_back(cl->GetLabel(2)) ;
653 std::sort( labels.begin(), labels.end() );
654 labels.push_back( -1 ); // put -1 to the end
655 int labelMax = -1, labelCur = -1, nLabelsMax = 0, nLabelsCurr = 0;
656 for ( unsigned int iLab = 0; iLab < labels.size(); iLab++ ) {
657 if ( labels[iLab] != labelCur ) {
658 if ( labelCur >= 0 && nLabelsMax< nLabelsCurr ) {
659 nLabelsMax = nLabelsCurr;
662 labelCur = labels[iLab];
668 if( labelMax>=0 && nLabelsMax < wrong * nClusters ) labelMax = -labelMax;
672 track->SetLabel( mcLabel );
683 //------------------------------------------------------------------------
684 void AliITStrackerHLT::UpdateESDtrack(AliESDtrack *tESD, AliHLTITSTrack* track, ULong_t flags) const
689 tESD->UpdateTrackParams(track,flags);
690 AliHLTITSTrack * oldtrack = (AliHLTITSTrack*)(tESD->GetITStrack());
691 if (oldtrack) delete oldtrack;
692 tESD->SetITStrack(new AliHLTITSTrack(*track));
698 //------------------------------------------------------------------------
699 void AliITStrackerHLT::BuildMaterialLUT(TString material) {
700 //--------------------------------------------------------------------
701 // Fill a look-up table with mean material
702 //--------------------------------------------------------------------
706 Double_t point1[3],point2[3];
707 Double_t phi,cosphi,sinphi,z;
708 // 0-5 layers, 6 pipe, 7-8 shields
709 Double_t rmin[9]={ 3.5, 5.5,13.0,22.0,35.0,41.0, 2.0, 8.0,25.0};
710 Double_t rmax[9]={ 5.5, 8.0,17.0,26.0,41.0,47.0, 3.0,10.5,30.0};
712 Int_t ifirst=0,ilast=0;
713 if(material.Contains("Pipe")) {
715 } else if(material.Contains("Shields")) {
717 } else if(material.Contains("Layers")) {
720 Error("BuildMaterialLUT","Wrong layer name\n");
723 for(Int_t imat=ifirst; imat<=ilast; imat++) {
724 Double_t param[5]={0.,0.,0.,0.,0.};
725 for (Int_t i=0; i<n; i++) {
726 phi = 2.*TMath::Pi()*gRandom->Rndm();
727 cosphi = TMath::Cos(phi); sinphi = TMath::Sin(phi);
728 z = 14.*(-1.+2.*gRandom->Rndm()); // SPD barrel
729 point1[0] = rmin[imat]*cosphi;
730 point1[1] = rmin[imat]*sinphi;
732 point2[0] = rmax[imat]*cosphi;
733 point2[1] = rmax[imat]*sinphi;
735 AliTracker::MeanMaterialBudget(point1,point2,mparam);
736 for(Int_t j=0;j<5;j++) param[j]+=mparam[j];
738 for(Int_t j=0;j<5;j++) param[j]/=(Float_t)n;
740 fxOverX0Layer[imat] = param[1];
741 fxTimesRhoLayer[imat] = param[0]*param[4];
743 fxOverX0Pipe = param[1];
744 fxTimesRhoPipe = param[0]*param[4];
746 fxOverX0Shield[0] = param[1];
747 fxTimesRhoShield[0] = param[0]*param[4];
749 fxOverX0Shield[1] = param[1];
750 fxTimesRhoShield[1] = param[0]*param[4];
754 printf("%s\n",material.Data());
755 printf("%f %f\n",fxOverX0Pipe,fxTimesRhoPipe);
756 printf("%f %f\n",fxOverX0Shield[0],fxTimesRhoShield[0]);
757 printf("%f %f\n",fxOverX0Shield[1],fxTimesRhoShield[1]);
758 printf("%f %f\n",fxOverX0Layer[0],fxTimesRhoLayer[0]);
759 printf("%f %f\n",fxOverX0Layer[1],fxTimesRhoLayer[1]);
760 printf("%f %f\n",fxOverX0Layer[2],fxTimesRhoLayer[2]);
761 printf("%f %f\n",fxOverX0Layer[3],fxTimesRhoLayer[3]);
762 printf("%f %f\n",fxOverX0Layer[4],fxTimesRhoLayer[4]);
763 printf("%f %f\n",fxOverX0Layer[5],fxTimesRhoLayer[5]);
771 //------------------------------------------------------------------------
772 Int_t AliITStrackerHLT::CorrectForTPCtoITSDeadZoneMaterial(AliHLTITSTrack *t) {
773 //--------------------------------------------------------------------
774 // Correction for the material between the TPC and the ITS
775 //--------------------------------------------------------------------
776 if (t->GetX() > AliITSRecoParam::Getriw()) { // inward direction
777 if (!t->PropagateToTGeo(AliITSRecoParam::Getriw(),1)) return 0;// TPC inner wall
778 if (!t->PropagateToTGeo(AliITSRecoParam::Getrcd(),1)) return 0;// TPC central drum
779 if (!t->PropagateToTGeo(AliITSRecoParam::Getrs(),1)) return 0;// ITS screen
780 } else if (t->GetX() < AliITSRecoParam::Getrs()) { // outward direction
781 if (!t->PropagateToTGeo(AliITSRecoParam::Getrs(),1)) return 0;// ITS screen
782 if (!t->PropagateToTGeo(AliITSRecoParam::Getrcd(),1)) return 0;// TPC central drum
783 if (!t->PropagateToTGeo(AliITSRecoParam::Getriw()+0.001,1)) return 0;// TPC inner wall
785 printf("CorrectForTPCtoITSDeadZoneMaterial: Track is already in the dead zone !\n");
793 //------------------------------------------------------------------------
794 Int_t AliITStrackerHLT::CorrectForPipeMaterial(AliHLTITSTrack *t,
795 bool InwardDirection) {
796 //-------------------------------------------------------------------
797 // Propagate beyond beam pipe and correct for material
798 // (material budget in different ways according to fUseTGeo value)
799 // Add time if going outward (PropagateTo or PropagateToTGeo)
800 //-------------------------------------------------------------------
802 // Define budget mode:
803 // 0: material from AliITSRecoParam (hard coded)
804 // 1: material from TGeo in one step (on the fly)
805 // 2: material from lut
806 // 3: material from TGeo in one step (same for all hypotheses)
829 Float_t dir = (InwardDirection ? 1. : -1.);
830 Double_t rToGo= ( InwardDirection ? AliITSRecoParam::GetrInsidePipe() : AliITSRecoParam::GetrOutsidePipe());
831 Double_t xToGo, phi,z;
833 if (!t->GetLocalXPhiZat(rToGo,xToGo,phi,z)) return 0;
835 Double_t xOverX0,x0,lengthTimesMeanDensity;
839 xOverX0 = AliITSRecoParam::GetdPipe();
840 x0 = AliITSRecoParam::GetX0Be();
841 lengthTimesMeanDensity = xOverX0*x0;
842 lengthTimesMeanDensity *= dir;
843 if (!t->PropagateTo(xToGo,xOverX0,lengthTimesMeanDensity/xOverX0)) return 0;
846 if (!t->PropagateToTGeo(xToGo,1)) return 0;
849 if(fxOverX0Pipe<0) BuildMaterialLUT("Pipe");
850 xOverX0 = fxOverX0Pipe;
851 lengthTimesMeanDensity = fxTimesRhoPipe;
852 lengthTimesMeanDensity *= dir;
853 if (!t->PropagateTo(xToGo,xOverX0,lengthTimesMeanDensity/xOverX0)) return 0;
856 double xOverX0PipeTrks, xTimesRhoPipeTrks;
857 if (!t->PropagateToTGeo(xToGo,1,xOverX0,lengthTimesMeanDensity)) return 0;
858 Double_t angle=TMath::Sqrt((1.+t->GetTgl()*t->GetTgl())/
859 ((1.-t->GetSnp())*(1.+t->GetSnp())));
860 xOverX0PipeTrks = TMath::Abs(xOverX0)/angle;
861 xTimesRhoPipeTrks = TMath::Abs(lengthTimesMeanDensity)/angle;
862 xOverX0 = xOverX0PipeTrks;
863 lengthTimesMeanDensity = xTimesRhoPipeTrks;
864 lengthTimesMeanDensity *= dir;
865 if (!t->PropagateTo(xToGo,xOverX0,lengthTimesMeanDensity/xOverX0)) return 0;
871 //------------------------------------------------------------------------
872 Int_t AliITStrackerHLT::CorrectForShieldMaterial(AliHLTITSTrack *t,
874 bool InwardDirection) {
875 //-------------------------------------------------------------------
876 // Propagate beyond SPD or SDD shield and correct for material
877 // (material budget in different ways according to fUseTGeo value)
878 // Add time if going outward (PropagateTo or PropagateToTGeo)
879 //-------------------------------------------------------------------
881 // Define budget mode:
882 // 0: material from AliITSRecoParam (hard coded)
883 // 1: material from TGeo in steps of X cm (on the fly)
884 // X = AliITSRecoParam::GetStepSizeTGeo()
885 // 2: material from lut
886 // 3: material from TGeo in one step (same for all hypotheses)
910 Float_t dir = (InwardDirection ? 1. : -1.);
913 if (shieldindex==1 ) { // SDDouter
914 rToGo=(InwardDirection ? AliITSRecoParam::GetrInsideShield(1) : AliITSRecoParam::GetrOutsideShield(1));
915 } else if (shieldindex==0 ) { // SPDouter
916 rToGo=(InwardDirection ? AliITSRecoParam::GetrInsideShield(0) : AliITSRecoParam::GetrOutsideShield(0));
918 Error("CorrectForShieldMaterial"," Wrong shield name\n");
921 Double_t xToGo, phi,z;
923 if (!t->GetLocalXPhiZat(rToGo,xToGo,phi,z)) return 0;
925 Double_t xOverX0,x0,lengthTimesMeanDensity;
930 xOverX0 = AliITSRecoParam::Getdshield(shieldindex);
931 x0 = AliITSRecoParam::GetX0shield(shieldindex);
932 lengthTimesMeanDensity = xOverX0*x0;
933 lengthTimesMeanDensity *= dir;
934 if (!t->PropagateTo(xToGo,xOverX0,lengthTimesMeanDensity/xOverX0)) return 0;
937 nsteps= (Int_t)(TMath::Abs(t->GetX()-xToGo)/fRecoParam->GetStepSizeTGeo())+1;
938 if (!t->PropagateToTGeo(xToGo,nsteps)) return 0; // cross the material and apply correction
941 if(fxOverX0Shield[shieldindex]<0) BuildMaterialLUT("Shields");
942 xOverX0 = fxOverX0Shield[shieldindex];
943 lengthTimesMeanDensity = fxTimesRhoShield[shieldindex];
944 lengthTimesMeanDensity *= dir;
945 if (!t->PropagateTo(xToGo,xOverX0,lengthTimesMeanDensity/xOverX0)) return 0;
948 if (!t->PropagateToTGeo(xToGo,1,xOverX0,lengthTimesMeanDensity)) return 0;
949 Double_t angle=TMath::Sqrt((1.+t->GetTgl()*t->GetTgl())/
950 ((1.-t->GetSnp())*(1.+t->GetSnp())));
951 double xOverX0ShieldTrks = TMath::Abs(xOverX0)/angle;
952 double xTimesRhoShieldTrks = TMath::Abs(lengthTimesMeanDensity)/angle;
953 xOverX0 = xOverX0ShieldTrks;
954 lengthTimesMeanDensity = xTimesRhoShieldTrks;
955 lengthTimesMeanDensity *= dir;
956 if (!t->PropagateTo(xToGo,xOverX0,lengthTimesMeanDensity/xOverX0)) return 0;
962 //------------------------------------------------------------------------
963 Int_t AliITStrackerHLT::CorrectForLayerMaterial(AliHLTITSTrack *t,
965 bool InwardDirection ){
966 //-------------------------------------------------------------------
967 // Propagate beyond layer and correct for material
968 // (material budget in different ways according to fUseTGeo value)
969 // Add time if going outward (PropagateTo or PropagateToTGeo)
970 //-------------------------------------------------------------------
973 Double_t r=fLayers[layerindex].GetR();
974 Double_t deltar=(layerindex<2 ? 0.10*r : 0.05*r);
975 Double_t rToGo=TMath::Sqrt(t->GetX()*t->GetX()+t->GetY()*t->GetY());
976 rToGo+= InwardDirection ?-deltar :deltar;
978 if (!t->GetLocalXat(rToGo,xToGo)) return 0;
981 if(fxOverX0Layer[layerindex]<0) BuildMaterialLUT("Layers");
983 Double_t lengthTimesMeanDensity = fxTimesRhoLayer[layerindex];
984 if( !InwardDirection ) lengthTimesMeanDensity = -lengthTimesMeanDensity;
986 return t->CorrectForMeanMaterial(fxOverX0Layer[layerindex],lengthTimesMeanDensity,kTRUE);
990 //------------------------------------------------------------------------
991 Bool_t AliITStrackerHLT::LocalModuleCoord(Int_t ilayer,Int_t idet,
992 const AliHLTITSTrack *track,
993 Float_t &xloc,Float_t &zloc) const {
994 //-----------------------------------------------------------------
995 // Gives position of track in local module ref. frame
996 //-----------------------------------------------------------------
1001 if(idet<0) return kFALSE;
1003 Int_t ndet=AliITSgeomTGeo::GetNDetectors(ilayer+1); // layers from 1 to 6
1005 Int_t lad = Int_t(idet/ndet) + 1;
1007 Int_t det = idet - (lad-1)*ndet + 1;
1009 Double_t xyzGlob[3],xyzLoc[3];
1011 AliHLTITSDetector &detector = fLayers[ilayer].GetDetector(idet);
1012 // take into account the misalignment: xyz at real detector plane
1013 if(!track->GetXYZAt(detector.GetRmisal(),GetBz(),xyzGlob)) return kFALSE;
1015 if(!AliITSgeomTGeo::GlobalToLocal(ilayer+1,lad,det,xyzGlob,xyzLoc)) return kFALSE;
1017 xloc = (Float_t)xyzLoc[0];
1018 zloc = (Float_t)xyzLoc[2];
1023 //------------------------------------------------------------------------
1024 Bool_t AliITStrackerHLT::ComputeRoad(AliHLTITSTrack* track,Int_t ilayer,Int_t idet,Double_t &zmin,Double_t &zmax,Double_t &ymin,Double_t &ymax) const {
1025 //--------------------------------------------------------------------
1026 // This function computes the rectangular road for this track
1027 //--------------------------------------------------------------------
1030 AliHLTITSDetector &det = fLayers[ilayer].GetDetector(idet);
1031 // take into account the misalignment: propagate track to misaligned detector plane
1033 double y,z,snp,cov[3];
1034 if( !track->GetYZAtPhiX( det.GetPhi(),det.GetRmisal(), y, z, snp, cov))return 0;
1037 Double_t dz=fRecoParam->GetNSigmaRoadZ()*
1038 TMath::Sqrt(cov[2] +
1039 fRecoParam->GetNSigmaZLayerForRoadZ()*
1040 fRecoParam->GetNSigmaZLayerForRoadZ()*
1041 fRecoParam->GetSigmaZ2(ilayer));
1042 Double_t dy=fRecoParam->GetNSigmaRoadY()*
1043 TMath::Sqrt(cov[0] +
1044 fRecoParam->GetNSigmaYLayerForRoadY()*
1045 fRecoParam->GetNSigmaYLayerForRoadY()*
1046 fRecoParam->GetSigmaY2(ilayer));
1048 // track at boundary between detectors, enlarge road
1049 Double_t boundaryWidth=AliITSRecoParam::GetBoundaryWidth();
1050 if ( (y-dy < det.GetYmin()+boundaryWidth) ||
1051 (y+dy > det.GetYmax()-boundaryWidth) ||
1052 (z-dz < det.GetZmin()+boundaryWidth) ||
1053 (z+dz > det.GetZmax()-boundaryWidth) ) {
1054 Float_t tgl = TMath::Abs(track->GetTgl());
1055 if (tgl > 1.) tgl=1.;
1056 Double_t deltaXNeighbDets=AliITSRecoParam::GetDeltaXNeighbDets();
1057 dz = TMath::Sqrt(dz*dz+deltaXNeighbDets*deltaXNeighbDets*tgl*tgl);
1058 if (snp > fRecoParam->GetMaxSnp()) return kFALSE;
1059 dy = TMath::Sqrt(dy*dy+deltaXNeighbDets*deltaXNeighbDets*snp*snp);
1062 // add to the road a term (up to 2-3 mm) to deal with misalignments
1063 dy = TMath::Sqrt(dy*dy + fRecoParam->GetRoadMisal()*fRecoParam->GetRoadMisal());
1064 dz = TMath::Sqrt(dz*dz + fRecoParam->GetRoadMisal()*fRecoParam->GetRoadMisal());
1066 Double_t r = fLayers[ilayer].GetR();
1069 ymin = y + r*det.GetPhi() - dy;
1070 ymax = y + r*det.GetPhi() + dy;
1077 Int_t AliITStrackerHLT::PropagateBack(AliESDEvent * /*event*/)
1083 Int_t AliITStrackerHLT::RefitInward(AliESDEvent * /*event*/ )
1090 Bool_t AliITStrackerHLT::GetTrackPoint(Int_t /*index*/, AliTrackPoint& /*p*/) const
1096 Bool_t AliITStrackerHLT::GetTrackPointTrackingError(Int_t /*index*/,
1097 AliTrackPoint& /*p*/, const AliESDtrack */*t*/)