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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Class for TRD reconstruction //
22 ///////////////////////////////////////////////////////////////////////////////
25 #include <TObjString.h>
26 #include <TObjArray.h>
27 #include <TClonesArray.h>
29 #include "AliRunLoader.h"
30 #include "AliRawReader.h"
32 #include "AliESDTrdTrack.h"
33 #include "AliESDEvent.h"
35 #include "AliTRDReconstructor.h"
36 #include "AliTRDclusterizer.h"
37 #include "AliTRDtracker.h"
38 #include "AliTRDpidESD.h"
39 #include "AliTRDgtuTrack.h"
40 #include "AliTRDrawData.h"
41 #include "AliTRDdigitsManager.h"
42 #include "AliTRDtrackerV1.h"
43 #include "AliTRDrecoParam.h"
45 #include "TTreeStream.h"
47 #define SETFLG(n,f) ((n) |= f)
48 #define CLRFLG(n,f) ((n) &= ~f)
50 ClassImp(AliTRDReconstructor)
52 TClonesArray *AliTRDReconstructor::fgClusters = 0x0;
53 //_____________________________________________________________________________
54 AliTRDReconstructor::AliTRDReconstructor()
58 // setting default "ON" steering parameters
59 // owner of debug streamers
60 SETFLG(fSteerParam, kOwner);
61 // write clusters [cw]
62 SETFLG(fSteerParam, kWriteClusters);
63 // track seeding (stand alone tracking) [sa]
64 SETFLG(fSteerParam, kSeeding);
65 // PID method in reconstruction (NN) [nn]
66 SETFLG(fSteerParam, kSteerPID);
67 // number of dEdx slices in the ESD track [8s]
68 //SETFLG(fSteerParam, kEightSlices);
70 memset(fStreamLevel, 0, kNtasks*sizeof(UChar_t));
71 memset(fDebugStream, 0, sizeof(TTreeSRedirector *) * kNtasks);
72 // Xe tail cancellation parameters
73 fTCParams[0] = 1.156; // r1
74 fTCParams[1] = 0.130; // r2
75 fTCParams[2] = 0.114; // c1
76 fTCParams[3] = 0.624; // c2
77 // Ar tail cancellation parameters
78 fTCParams[4] = 6.; // r1
79 fTCParams[5] = 0.62; // r2
80 fTCParams[6] = 0.0087;// c1
81 fTCParams[7] = 0.07; // c2
84 //_____________________________________________________________________________
85 AliTRDReconstructor::AliTRDReconstructor(const AliTRDReconstructor &r)
87 ,fSteerParam(r.fSteerParam)
89 memcpy(fStreamLevel, r.fStreamLevel, kNtasks*sizeof(UChar_t));
90 memcpy(fTCParams, r.fTCParams, 8*sizeof(Double_t));
91 memcpy(fDebugStream, r.fDebugStream, sizeof(TTreeSRedirector *) *kNtasks);
92 // ownership of debug streamers is not taken
93 CLRFLG(fSteerParam, kOwner);
96 //_____________________________________________________________________________
97 AliTRDReconstructor::~AliTRDReconstructor()
100 fgClusters->Delete(); delete fgClusters;
102 if(fSteerParam&kOwner){
103 for(Int_t itask = 0; itask < kNtasks; itask++)
104 if(fDebugStream[itask]) delete fDebugStream[itask];
109 //_____________________________________________________________________________
110 void AliTRDReconstructor::Init(){
114 SetOption(GetOption());
116 AliInfo(Form("\tDigitsConversion [dc] : %s", fSteerParam&kDigitsConversion?"yes":"no"));
117 AliInfo(Form("\tWrite Clusters [cw] : %s", fSteerParam&kWriteClusters?"yes":"no"));
118 AliInfo(Form("\tWrite Online Tracklets [tw] : %s", fSteerParam&kWriteTracklets?"yes":"no"));
119 AliInfo(Form("\tDrift Gas Argon [ar] : %s", fSteerParam&kDriftGas?"yes":"no"));
120 AliInfo(Form("\tStand Alone Tracking [sa] : %s", fSteerParam&kSeeding?"yes":"no"));
121 AliInfo(Form("\tHLT Tracking [hlt] : %s", fSteerParam&kHLT?"yes":"no"));
122 AliInfo(Form("\tCosmic Reconstruction [cos] : %s", fSteerParam&kCosmic?"yes":"no"));
123 AliInfo(Form("\tNN PID [nn] : %s", fSteerParam&kSteerPID?"yes":"no"));
124 AliInfo(Form("\t8 dEdx slices in ESD [8s] : %s", fSteerParam&kEightSlices?"yes":"no"));
125 AliInfo(Form("\tStreaming Levels : Clusterizer[%d] Tracker[%d] PID[%d]", fStreamLevel[kClusterizer], fStreamLevel[kTracker], fStreamLevel[kPID]));
128 //_____________________________________________________________________________
129 void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader
130 , TTree *digitsTree) const
133 // Convert raw data digits into digit objects in a root tree
135 AliInfo("Feature not available for the moment."); return;
137 AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]");
139 AliTRDrawData rawData;
141 rawReader->Select("TRD");
142 AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader);
143 manager->MakeBranch(digitsTree);
144 manager->WriteDigits();
149 //_____________________________________________________________________________
150 void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader
151 , TTree *clusterTree) const
154 // Reconstruct clusters
157 //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]");
161 rawReader->Select("TRD");
163 // New (fast) cluster finder
164 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
165 clusterer.SetReconstructor(this);
166 clusterer.OpenOutput(clusterTree);
167 clusterer.SetAddLabels(kFALSE);
168 clusterer.Raw2ClustersChamber(rawReader);
170 if(IsWritingClusters()) return;
172 // take over ownership of clusters
173 fgClusters = clusterer.RecPoints();
174 clusterer.SetClustersOwner(kFALSE);
177 //_____________________________________________________________________________
178 void AliTRDReconstructor::Reconstruct(TTree *digitsTree
179 , TTree *clusterTree) const
182 // Reconstruct clusters
185 //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]");
187 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
188 clusterer.SetReconstructor(this);
189 clusterer.OpenOutput(clusterTree);
190 clusterer.ReadDigits(digitsTree);
191 clusterer.MakeClusters();
193 if(IsWritingClusters()) return;
195 // take over ownership of clusters
196 fgClusters = clusterer.RecPoints();
197 clusterer.SetClustersOwner(kFALSE);
200 //_____________________________________________________________________________
201 AliTracker *AliTRDReconstructor::CreateTracker() const
204 // Create a TRD tracker
207 //return new AliTRDtracker(NULL);
208 AliTRDtrackerV1 *tracker = new AliTRDtrackerV1();
209 tracker->SetReconstructor(this);
214 //_____________________________________________________________________________
215 void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/
216 , TTree* /*clusterTree*/
217 , AliESDEvent* /*esd*/) const
226 //_____________________________________________________________________________
227 void AliTRDReconstructor::SetOption(Option_t *opt)
229 // Read option string into the steer param.
231 // Default steer param values
233 // digits conversion [dc] = false
234 // drift gas [ar] = false - do not update the number of exponentials in the TC !
235 // write clusters [cw] = true
236 // write online tracklets [tw] = false
237 // track seeding (stand alone tracking) [sa] = true
238 // PID method in reconstruction (NN) [nn] = true
239 // 8 dEdx slices in ESD [8s] = false
240 // HLT tracking [hlt] = false
241 // Cosmic Reconstruction [cos] = false
244 AliReconstructor::SetOption(opt);
247 TObjArray *opar = s.Tokenize(",");
248 for(Int_t ipar=0; ipar<opar->GetEntriesFast(); ipar++){
249 TString sopt(((TObjString*)(*opar)[ipar])->String());
250 if(sopt.Contains("dc")){
251 SETFLG(fSteerParam, kDigitsConversion);
252 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDigitsConversion);
254 } else if(sopt.Contains("cw")){
255 SETFLG(fSteerParam, kWriteClusters);
256 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteClusters);
258 } else if(sopt.Contains("sa")){
259 SETFLG(fSteerParam, kSeeding);
260 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSeeding);
262 } else if(sopt.Contains("nn")){
263 SETFLG(fSteerParam, kSteerPID);
264 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSteerPID);
266 } else if(sopt.Contains("8s")){
267 SETFLG(fSteerParam, kEightSlices);
268 if(sopt.Contains("!")) CLRFLG(fSteerParam, kEightSlices);
270 } else if(sopt.Contains("tw")){
271 SETFLG(fSteerParam, kWriteTracklets);
272 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteTracklets);
274 } else if(sopt.Contains("ar")){
275 SETFLG(fSteerParam, kDriftGas);
276 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDriftGas);
278 } else if(sopt.Contains("hlt")){
279 SETFLG(fSteerParam, kHLT);
280 if(sopt.Contains("!")) CLRFLG(fSteerParam, kHLT);
282 } else if(sopt.Contains("cos")){
283 SETFLG(fSteerParam, kCosmic);
284 if(sopt.Contains("!")) CLRFLG(fSteerParam, kCosmic);
285 } else if(sopt.Contains("sl")){
286 TObjArray *stl = sopt.Tokenize("_");
287 if(stl->GetEntriesFast() < 3) continue;
288 TString taskstr(((TObjString*)(*stl)[1])->String());
289 TString levelstring(((TObjString*)(*stl)[2])->String());
290 // Set the stream Level
291 Int_t level = levelstring.Atoi();
292 ETRDReconstructorTask task = kTracker;
293 if(taskstr.CompareTo("raw") == 0) task = kRawReader;
294 else if(taskstr.CompareTo("cl") == 0) task = kClusterizer;
295 else if(taskstr.CompareTo("tr") == 0) task = kTracker;
296 else if(taskstr.CompareTo("pi") == 0) task = kPID;
297 SetStreamLevel(level, task);
303 //_____________________________________________________________________________
304 void AliTRDReconstructor::SetStreamLevel(Int_t level, ETRDReconstructorTask task){
306 // Set the Stream Level for one of the tasks Clusterizer, Tracker or PID
308 TString taskname[4] = {"RawReader", "Clusterizer", "Tracker", "PID"};
309 const Int_t minLevel[4] = {1, 1, 2, 1}; // the minimum debug level upon which a debug stream is created for different tasks
310 //AliInfo(Form("Setting Stream Level for Task %s to %d", taskname.Data(),level));
311 fStreamLevel[(Int_t)task] = level;
312 // Initialize DebugStreamer if not yet done
313 if(level >= minLevel[task] && !fDebugStream[task]){
314 TDirectory *savedir = gDirectory;
315 fDebugStream[task] = new TTreeSRedirector(Form("TRD.%sDebug.root", taskname[task].Data()));
317 SETFLG(fSteerParam, kOwner);