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 //-------------------------------------------------------------------------
17 // Implementation of the HLT ITS tracker class
18 // It reads AliITSclusterV2 clusters and HLT ESD tracks and creates
19 // AliITStrackV2 tracks. For details, see also RunHLTITS.C macro.
20 // Origin: Cvetan Cheshkov, CERN, Cvetan.Cheshkov@cern.ch
21 //-------------------------------------------------------------------------
24 #include "AliL3ITStrack.h"
25 #include "AliL3ITStracker.h"
27 ClassImp(AliL3ITStracker)
29 static Int_t CorrectForDeadZoneMaterial(AliITStrackV2 *t) {
30 //--------------------------------------------------------------------
31 // Correction for the material between the TPC and the ITS
32 // (should it belong to the TPC code ?)
33 //--------------------------------------------------------------------
34 Double_t riw=80., diw=0.0053, x0iw=30; // TPC inner wall ?
35 Double_t rcd=61., dcd=0.0053, x0cd=30; // TPC "central drum" ?
36 Double_t yr=12.8, dr=0.03; // rods ?
37 Double_t zm=0.2, dm=0.40; // membrane
38 //Double_t rr=52., dr=0.19, x0r=24., yyr=7.77; //rails
39 Double_t rs=50., ds=0.001; // something belonging to the ITS (screen ?)
41 if (t->GetX() > riw) {
42 if (!t->PropagateTo(riw,diw,x0iw)) return 1;
43 if (TMath::Abs(t->GetY())>yr) t->CorrectForMaterial(dr);
44 if (TMath::Abs(t->GetZ())<zm) t->CorrectForMaterial(dm);
45 if (!t->PropagateTo(rcd,dcd,x0cd)) return 1;
46 //Double_t x,y,z; t->GetGlobalXYZat(rr,x,y,z);
47 //if (TMath::Abs(y)<yyr) t->PropagateTo(rr,dr,x0r);
48 if (!t->PropagateTo(rs,ds)) return 1;
49 } else if (t->GetX() < rs) {
50 if (!t->PropagateTo(rs,-ds)) return 1;
51 //Double_t x,y,z; t->GetGlobalXYZat(rr,x,y,z);
52 //if (TMath::Abs(y)<yyr) t->PropagateTo(rr,-dr,x0r);
53 if (!t->PropagateTo(rcd,-dcd,x0cd)) return 1;
54 if (!t->PropagateTo(riw+0.001,-diw,x0iw)) return 1;
56 // ::Error("CorrectForDeadZoneMaterial","track is already in the dead zone !");
63 Int_t AliL3ITStracker::Clusters2Tracks(AliESD *event) {
64 //--------------------------------------------------------------------
65 // This functions reconstructs HLT ITS tracks
66 //--------------------------------------------------------------------
67 TObjArray itsTracks(15000);
69 {/* Read HLT ESD tracks */
71 nentr=event->GetNumberOfHLTHoughTracks();
72 Info("Clusters2Tracks", "Number of ESD HLT tracks: %d\n", nentr);
75 AliESDHLTtrack *esd=event->GetHLTHoughTrack(nentr);
76 if (esd->GetWeight() > 500) continue;
80 t=new AliL3ITStrack(*esd,GetZ());
81 } catch (const Char_t *msg) {
82 Warning("Clusters2Tracks",msg);
86 if (TMath::Abs(t->GetD())>5) {
91 if (CorrectForDeadZoneMaterial(t)!=0) {
92 Warning("Clusters2Tracks",
93 "failed to correct for the material in the dead zone !\n");
99 } /* End Read HLT ESD tracks */
102 Int_t nentr=itsTracks.GetEntriesFast();
103 Info("Clusters2Tracks", "Number of Selected for tracking HLT ESD tracks: %d\n", nentr);
106 for (fPass=0; fPass<2; fPass++) {
107 Int_t &constraint=fConstraint[fPass]; if (constraint<0) continue;
108 for (Int_t i=0; i<nentr; i++) {
109 // Info("Clusters2Tracks"," %d ",i);
110 AliL3ITStrack *t=(AliL3ITStrack*)itsTracks.UncheckedAt(i);
111 if (t==0) continue; //this track has been already tracked
112 Int_t tpcLabel=t->GetLabel(); //save the TPC track label
113 // Info("Clusters2Tracks","Pt:%f",1/t->Get1Pt());
114 ResetTrackToFollow(*t);
117 for (FollowProlongation(); fI<kMaxLayer; fI++) {
118 while (TakeNextProlongation()) FollowProlongation();
121 if (fBestTrack.GetNumberOfClusters() == 0) continue;
123 if (fConstraint[fPass]) {
124 ResetTrackToFollow(*t);
125 if (!RefitAt(3.7, &fTrackToFollow, &fBestTrack)) continue;
129 if (!fBestTrack.PropagateTo(3.,0.0028,65.19)) continue;
130 if (!fBestTrack.PropagateToVertex()) continue;
131 fBestTrack.SetLabel(tpcLabel);
132 fBestTrack.CookdEdx();
133 CookLabel(&fBestTrack,0.); //For comparison only
134 // Specific to the AliL3ITStracker
135 // fBestTrack.UpdateESDtrack(AliESDtrack::kITSin);
136 t->GetESDHLTtrack()->UpdateTrackParams(&fBestTrack);
138 UseClusters(&fBestTrack);
139 delete itsTracks.RemoveAt(i);
146 Info("Clusters2Tracks","Number of prolonged tracks: %d\n",ntrk);
151 Int_t AliL3ITStracker::PropagateBack(AliESD *event) {
152 //--------------------------------------------------------------------
153 // This functions propagates reconstructed ITS tracks back
154 //--------------------------------------------------------------------
155 Int_t nentr=event->GetNumberOfHLTHoughTracks();
156 Info("PropagateBack", "Number of HLT ESD tracks: %d\n", nentr);
159 for (Int_t i=0; i<nentr; i++) {
160 AliESDHLTtrack *esd=event->GetHLTHoughTrack(i);
161 if (esd->GetWeight() > 500) continue;
165 t=new AliL3ITStrack(*esd,GetZ());
166 } catch (const Char_t *msg) {
167 Warning("PropagateBack",msg);
172 ResetTrackToFollow(*t);
174 // propagete to vertex [SR, GSI 17.02.2003]
175 // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov
176 if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) {
177 if (fTrackToFollow.PropagateToVertex()) {
178 fTrackToFollow.StartTimeIntegral();
180 fTrackToFollow.PropagateTo(3.,-0.0028,65.19);
183 fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters();
184 if (RefitAt(49.,&fTrackToFollow,t)) {
185 if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) {
186 Warning("PropagateBack",
187 "failed to correct for the material in the dead zone !\n");
191 fTrackToFollow.SetLabel(t->GetLabel());
192 //fTrackToFollow.CookdEdx();
193 CookLabel(&fTrackToFollow,0.); //For comparison only
194 // cout<<" Backtrack "<<fTrackToFollow.GetLabel()<<" "<<fTrackToFollow.GetNumberOfClusters()<<" "<<fTrackToFollow.fFakeRatio<<endl;
195 fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSout);
196 //UseClusters(&fTrackToFollow);
202 Info("PropagateBack","Number of back propagated HLT ITS tracks: %d\n",ntrk);
207 Int_t AliL3ITStracker::RefitInward(AliESD *event) {
208 //--------------------------------------------------------------------
209 // This functions refits ITS tracks using the
210 // "inward propagated" TPC tracks
211 //--------------------------------------------------------------------
213 Int_t nentr=event->GetNumberOfHLTHoughTracks();
214 Info("RefitInward", "The method is not yet implemented! %d",nentr);