]>
Commit | Line | Data |
---|---|---|
121a60bd | 1 | /************************************************************************** |
91834b8d | 2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
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 | **************************************************************************/ | |
121a60bd | 15 | |
16 | /* $Id$ */ | |
17 | ||
18 | /////////////////////////////////////////////////////////////////////////////// | |
19 | // // | |
4fad09c9 | 20 | // Class for TRD reconstruction // |
954135b1 | 21 | // // |
22 | // For the special options which can be used during reconstruction and their // | |
23 | // default values pls. see function SetOption(). // | |
121a60bd | 24 | // // |
25 | /////////////////////////////////////////////////////////////////////////////// | |
26 | ||
3a039a31 | 27 | #include <TObjString.h> |
28 | #include <TObjArray.h> | |
d39401ad | 29 | #include <TTreeStream.h> |
30 | #include <TDirectory.h> | |
121a60bd | 31 | |
3bc9d03e | 32 | #include "AliRawReader.h" |
3bc9d03e | 33 | |
34 | #include "AliTRDReconstructor.h" | |
3fe61b77 | 35 | #include "AliTRDclusterizer.h" |
a8fbb161 | 36 | #include "AliTRDrawData.h" |
a2fbb6ec | 37 | #include "AliTRDrawStreamBase.h" |
a8fbb161 | 38 | #include "AliTRDdigitsManager.h" |
e4f2f73d | 39 | #include "AliTRDtrackerV1.h" |
29f95561 | 40 | |
97b6dfac | 41 | #define SETFLG(n,f) ((n) |= f) |
42 | #define CLRFLG(n,f) ((n) &= ~f) | |
43 | ||
121a60bd | 44 | ClassImp(AliTRDReconstructor) |
45 | ||
828c6f80 | 46 | TClonesArray *AliTRDReconstructor::fgClusters = NULL; |
47 | TClonesArray *AliTRDReconstructor::fgTracklets = NULL; | |
828c6f80 | 48 | Char_t const * AliTRDReconstructor::fgSteerNames[kNsteer] = { |
b72f4eaf | 49 | "DigitsConversion " |
b72f4eaf | 50 | ,"Write Clusters " |
51 | ,"Write Online Tracklets " | |
b72f4eaf | 52 | ,"Stand Alone Tracking " |
8fc736d7 | 53 | ,"HLT Mode " |
54 | ,"Process Online Trklts " | |
55 | ,"Debug Streaming " | |
56 | ,"Cl. Radial Correction " | |
b72f4eaf | 57 | }; |
828c6f80 | 58 | Char_t const * AliTRDReconstructor::fgSteerFlags[kNsteer] = { |
b72f4eaf | 59 | "dc"// digits conversion [false] |
b72f4eaf | 60 | ,"cw"// write clusters [true] |
61 | ,"tw"// write online tracklets [false] | |
b72f4eaf | 62 | ,"sa"// track seeding (stand alone tracking) [true] |
b72f4eaf | 63 | ,"hlt"// HLT reconstruction [false] |
a5b99acd | 64 | ,"tp"// also use online tracklets for reconstruction [false] |
a2fbb6ec | 65 | ,"deb"// Write debug stream [false] |
b30d8c09 | 66 | ,"cc" // Cluster radial correction during reconstruction [false] |
b72f4eaf | 67 | }; |
828c6f80 | 68 | Char_t const * AliTRDReconstructor::fgTaskNames[AliTRDrecoParam::kTRDreconstructionTasks] = { |
a2fbb6ec | 69 | "Clusterizer" |
b72f4eaf | 70 | ,"Tracker" |
71 | ,"PID" | |
72 | }; | |
828c6f80 | 73 | Char_t const * AliTRDReconstructor::fgTaskFlags[AliTRDrecoParam::kTRDreconstructionTasks] = { |
a2fbb6ec | 74 | "cl" |
b72f4eaf | 75 | ,"tr" |
76 | ,"pd" | |
77 | }; | |
c6f7c6cb | 78 | Int_t AliTRDReconstructor::fgNTimeBins = -1; |
952051c5 | 79 | const Float_t AliTRDReconstructor::fgkMinClustersInTrack = 0.5; // |
80 | const Float_t AliTRDReconstructor::fgkLabelFraction = 0.8; // | |
81 | const Double_t AliTRDReconstructor::fgkMaxChi2 = 12.0; // | |
82 | const Double_t AliTRDReconstructor::fgkMaxSnp = 0.95; // Maximum local sine of the azimuthal angle | |
83 | const Double_t AliTRDReconstructor::fgkMaxStep = 2.0; // Maximal step size in propagation | |
84 | const Double_t AliTRDReconstructor::fgkEpsilon = 1.e-5; // Precision of radial coordinate | |
b72f4eaf | 85 | |
eb38ed55 | 86 | //_____________________________________________________________________________ |
3a039a31 | 87 | AliTRDReconstructor::AliTRDReconstructor() |
88 | :AliReconstructor() | |
97b6dfac | 89 | ,fSteerParam(0) |
5127281e | 90 | ,fClusterizer(NULL) |
3a039a31 | 91 | { |
97b6dfac | 92 | // setting default "ON" steering parameters |
89971837 | 93 | // owner of debug streamers |
94 | SETFLG(fSteerParam, kOwner); | |
97b6dfac | 95 | // write clusters [cw] |
96 | SETFLG(fSteerParam, kWriteClusters); | |
97 | // track seeding (stand alone tracking) [sa] | |
98 | SETFLG(fSteerParam, kSeeding); | |
8fc736d7 | 99 | // Cluster radial correction during reconstruction [cc] |
b30d8c09 | 100 | //SETFLG(fSteerParam, kClRadialCorr); |
a2fbb6ec | 101 | memset(fDebugStream, 0, sizeof(TTreeSRedirector *) * AliTRDrecoParam::kTRDreconstructionTasks); |
eb38ed55 | 102 | } |
103 | ||
48f8adf3 | 104 | //_____________________________________________________________________________ |
105 | AliTRDReconstructor::~AliTRDReconstructor() | |
106 | { | |
d39401ad | 107 | // |
108 | // Destructor | |
109 | // | |
110 | ||
48f8adf3 | 111 | if(fgClusters) { |
6d54fcbf | 112 | fgClusters->Delete(); |
113 | delete fgClusters; | |
114 | fgClusters = NULL; | |
48f8adf3 | 115 | } |
a5b99acd | 116 | if(fgTracklets) { |
6d54fcbf | 117 | fgTracklets->Delete(); |
118 | delete fgTracklets; | |
119 | fgTracklets = NULL; | |
a5b99acd | 120 | } |
f29f13a6 | 121 | if(fSteerParam&kOwner){ |
a2fbb6ec | 122 | for(Int_t itask = 0; itask < AliTRDrecoParam::kTRDreconstructionTasks; itask++) |
29f95561 | 123 | if(fDebugStream[itask]) delete fDebugStream[itask]; |
124 | } | |
5127281e | 125 | if(fClusterizer){ |
126 | delete fClusterizer; | |
127 | fClusterizer = NULL; | |
128 | } | |
18c05eb3 | 129 | } |
48f8adf3 | 130 | |
91834b8d | 131 | |
acd241e9 | 132 | //_____________________________________________________________________________ |
91834b8d | 133 | void AliTRDReconstructor::Init(){ |
18c05eb3 | 134 | // |
135 | // Init Options | |
136 | // | |
18c05eb3 | 137 | SetOption(GetOption()); |
a2fbb6ec | 138 | Options(fSteerParam); |
139 | ||
5127281e | 140 | if(!fClusterizer){ |
141 | fClusterizer = new AliTRDclusterizer(fgTaskNames[AliTRDrecoParam::kClusterizer], fgTaskNames[AliTRDrecoParam::kClusterizer]); | |
142 | fClusterizer->SetReconstructor(this); | |
143 | } | |
144 | ||
a2fbb6ec | 145 | // Make Debug Streams when Debug Streaming |
146 | if(IsDebugStreaming()){ | |
147 | for(Int_t task = 0; task < AliTRDrecoParam::kTRDreconstructionTasks; task++){ | |
148 | TDirectory *savedir = gDirectory; | |
149 | fDebugStream[task] = new TTreeSRedirector(Form("TRD.Debug%s.root", fgTaskNames[task])); | |
150 | savedir->cd(); | |
151 | SETFLG(fSteerParam, kOwner); | |
152 | } | |
153 | } | |
acd241e9 | 154 | } |
0397ce53 | 155 | |
121a60bd | 156 | //_____________________________________________________________________________ |
a8fbb161 | 157 | void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader |
91834b8d | 158 | , TTree *digitsTree) const |
121a60bd | 159 | { |
3bc9d03e | 160 | // |
25ca55ce | 161 | // Convert raw data digits into digit objects in a root tree |
3bc9d03e | 162 | // |
121a60bd | 163 | |
ad5dd6ec | 164 | //AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]"); |
91834b8d | 165 | |
a8fbb161 | 166 | AliTRDrawData rawData; |
3a0f6479 | 167 | rawReader->Reset(); |
168 | rawReader->Select("TRD"); | |
a2fbb6ec | 169 | AliTRDrawStreamBase::SetRawStreamVersion(GetRecoParam()->GetRawStreamVersion()->Data()); |
a8fbb161 | 170 | AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader); |
171 | manager->MakeBranch(digitsTree); | |
172 | manager->WriteDigits(); | |
c0ab62ff | 173 | delete manager; |
0ee00e25 | 174 | |
121a60bd | 175 | } |
176 | ||
25ca55ce | 177 | //_____________________________________________________________________________ |
178 | void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader | |
179 | , TTree *clusterTree) const | |
180 | { | |
181 | // | |
182 | // Reconstruct clusters | |
183 | // | |
184 | ||
91834b8d | 185 | //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]"); |
186 | ||
187 | ||
3a0f6479 | 188 | rawReader->Reset(); |
189 | rawReader->Select("TRD"); | |
a2fbb6ec | 190 | AliTRDrawStreamBase::SetRawStreamVersion(GetRecoParam()->GetRawStreamVersion()->Data()); |
3a0f6479 | 191 | |
5127281e | 192 | if(!fClusterizer){ |
193 | AliFatal("Clusterizer not available!"); | |
194 | return; | |
195 | } | |
196 | ||
da0a4b87 | 197 | fClusterizer->ResetRecPoints(); |
198 | ||
5127281e | 199 | fClusterizer->OpenOutput(clusterTree); |
5127281e | 200 | fClusterizer->SetUseLabels(kFALSE); |
201 | fClusterizer->Raw2ClustersChamber(rawReader); | |
66f6bfd9 | 202 | |
3e1f6592 | 203 | fgNTimeBins = fClusterizer->GetNTimeBins(); |
204 | ||
66f6bfd9 | 205 | if(IsWritingClusters()) return; |
d6e36038 | 206 | |
66f6bfd9 | 207 | // take over ownership of clusters |
5127281e | 208 | fgClusters = fClusterizer->RecPoints(); |
209 | fClusterizer->SetClustersOwner(kFALSE); | |
a5b99acd | 210 | |
211 | // take over ownership of online tracklets | |
5127281e | 212 | fgTracklets = fClusterizer->TrackletsArray(); |
213 | fClusterizer->SetTrackletsOwner(kFALSE); | |
25ca55ce | 214 | } |
215 | ||
216 | //_____________________________________________________________________________ | |
a8fbb161 | 217 | void AliTRDReconstructor::Reconstruct(TTree *digitsTree |
218 | , TTree *clusterTree) const | |
25ca55ce | 219 | { |
220 | // | |
221 | // Reconstruct clusters | |
222 | // | |
e4f2f73d | 223 | |
91834b8d | 224 | //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]"); |
a2fbb6ec | 225 | |
c665eaa7 | 226 | AliTRDclusterizer clusterer(fgTaskNames[AliTRDrecoParam::kClusterizer], fgTaskNames[AliTRDrecoParam::kClusterizer]); |
227 | clusterer.SetReconstructor(this); | |
228 | clusterer.OpenOutput(clusterTree); | |
229 | clusterer.ReadDigits(digitsTree); | |
230 | clusterer.MakeClusters(); | |
d6e36038 | 231 | |
3e1f6592 | 232 | fgNTimeBins = clusterer.GetNTimeBins(); |
233 | ||
66f6bfd9 | 234 | if(IsWritingClusters()) return; |
235 | ||
236 | // take over ownership of clusters | |
c665eaa7 | 237 | fgClusters = clusterer.RecPoints(); |
238 | clusterer.SetClustersOwner(kFALSE); | |
a5b99acd | 239 | |
240 | // take over ownership of online tracklets | |
c665eaa7 | 241 | fgTracklets = clusterer.TrackletsArray(); |
242 | clusterer.SetTrackletsOwner(kFALSE); | |
243 | ||
25ca55ce | 244 | } |
245 | ||
246 | //_____________________________________________________________________________ | |
44dbae42 | 247 | AliTracker *AliTRDReconstructor::CreateTracker() const |
121a60bd | 248 | { |
3bc9d03e | 249 | // |
250 | // Create a TRD tracker | |
251 | // | |
121a60bd | 252 | |
e4f2f73d | 253 | //return new AliTRDtracker(NULL); |
3a039a31 | 254 | AliTRDtrackerV1 *tracker = new AliTRDtrackerV1(); |
255 | tracker->SetReconstructor(this); | |
256 | return tracker; | |
25ca55ce | 257 | |
25ca55ce | 258 | } |
259 | ||
260 | //_____________________________________________________________________________ | |
261 | void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/ | |
91834b8d | 262 | , TTree* /*clusterTree*/ |
263 | , AliESDEvent* /*esd*/) const | |
25ca55ce | 264 | { |
265 | // | |
af26ce80 | 266 | // Fill ESD |
25ca55ce | 267 | // |
268 | ||
25ca55ce | 269 | } |
3a039a31 | 270 | |
3a039a31 | 271 | //_____________________________________________________________________________ |
272 | void AliTRDReconstructor::SetOption(Option_t *opt) | |
273 | { | |
d39401ad | 274 | // |
275 | // Read option string into the steer param. | |
276 | // | |
954135b1 | 277 | // The following string options are available during reconstruction. |
278 | // In square brackets the default values are given. | |
279 | // "dc" : digits conversion [false] | |
280 | // "cw" : write clusters [true] | |
281 | // "tw" : write online tracklets [false] | |
282 | // "sa" : track seeding (stand alone tracking) [true] | |
283 | // "hlt" : HLT reconstruction [false] | |
284 | // "tp" : also use online tracklets for reconstruction [false] | |
285 | // "deb" : Write debug stream [false] | |
286 | // "cc" : Cluster radial correction during reconstruction [false] | |
287 | // | |
288 | // To check the actual options used during reconstruction include the following line in your rec.C script | |
289 | // AliLog::SetClassDebugLevel("AliTRDReconstructor", 1); | |
97b6dfac | 290 | |
291 | AliReconstructor::SetOption(opt); | |
3a039a31 | 292 | |
293 | TString s(opt); | |
294 | TObjArray *opar = s.Tokenize(","); | |
295 | for(Int_t ipar=0; ipar<opar->GetEntriesFast(); ipar++){ | |
d39401ad | 296 | Bool_t processed = kFALSE; |
3a039a31 | 297 | TString sopt(((TObjString*)(*opar)[ipar])->String()); |
b72f4eaf | 298 | for(Int_t iopt=0; iopt<kNsteer; iopt++){ |
299 | if(!sopt.Contains(fgSteerFlags[iopt])) continue; | |
300 | SETFLG(fSteerParam, BIT(iopt)); | |
301 | if(sopt.Contains("!")) CLRFLG(fSteerParam, BIT(iopt)); | |
d39401ad | 302 | processed = kTRUE; |
b72f4eaf | 303 | break; |
304 | } | |
d39401ad | 305 | if(processed) continue; |
b72f4eaf | 306 | |
307 | AliWarning(Form("Unknown option flag %s.", sopt.Data())); | |
3a039a31 | 308 | } |
309 | } | |
310 | ||
acd241e9 | 311 | //_____________________________________________________________________________ |
a2fbb6ec | 312 | void AliTRDReconstructor::Options(UInt_t steer) |
b72f4eaf | 313 | { |
d39401ad | 314 | // |
315 | // Print the options | |
316 | // | |
317 | ||
b72f4eaf | 318 | for(Int_t iopt=0; iopt<kNsteer; iopt++){ |
9e8fdff4 | 319 | AliDebugGeneral("AliTRDReconstructor", 1, Form(" %s[%s]%s", fgSteerNames[iopt], fgSteerFlags[iopt], steer ?(((steer>>iopt)&1)?" : ON":" : OFF"):"")); |
b72f4eaf | 320 | } |
b72f4eaf | 321 | } |
322 |