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 // write clusters [cw]
60 SETFLG(fSteerParam, kWriteClusters);
61 // track seeding (stand alone tracking) [sa]
62 SETFLG(fSteerParam, kSeeding);
63 // PID method in reconstruction (NN) [nn]
64 SETFLG(fSteerParam, kSteerPID);
66 memset(fStreamLevel, 0, 5*sizeof(UChar_t));
67 memset(fDebugStream, 0, sizeof(TTreeSRedirector *) * 4);
68 // Xe tail cancellation parameters
69 fTCParams[0] = 1.156; // r1
70 fTCParams[1] = 0.130; // r2
71 fTCParams[2] = 0.114; // c1
72 fTCParams[3] = 0.624; // c2
73 // Ar tail cancellation parameters
74 fTCParams[4] = 6.; // r1
75 fTCParams[5] = 0.62; // r2
76 fTCParams[6] = 0.0087;// c1
77 fTCParams[7] = 0.07; // c2
78 SetBit(kOwner, kTRUE);
81 //_____________________________________________________________________________
82 AliTRDReconstructor::AliTRDReconstructor(const AliTRDReconstructor &r)
84 ,fSteerParam(r.fSteerParam)
86 memcpy(fStreamLevel, r.fStreamLevel, 5*sizeof(UChar_t));
87 memcpy(fTCParams, r.fTCParams, 8*sizeof(Double_t));
88 memcpy(fDebugStream, r.fDebugStream, sizeof(TTreeSRedirector *) *4);
89 SetBit(kOwner, kFALSE);
92 //_____________________________________________________________________________
93 AliTRDReconstructor::~AliTRDReconstructor()
96 fgClusters->Delete(); delete fgClusters;
99 for(Int_t itask = 0; itask < 4; itask++)
100 if(fDebugStream[itask]) delete fDebugStream[itask];
105 //_____________________________________________________________________________
106 void AliTRDReconstructor::Init(){
110 SetOption(GetOption());
112 AliInfo(Form("\tDigitsConversion [dc] : %s", fSteerParam&kDigitsConversion?"yes":"no"));
113 AliInfo(Form("\tWrite Clusters [cw] : %s", fSteerParam&kWriteClusters?"yes":"no"));
114 AliInfo(Form("\tWrite Online Tracklets [tw] : %s", fSteerParam&kWriteTracklets?"yes":"no"));
115 AliInfo(Form("\tDrift Gas Argon [ar] : %s", fSteerParam&kDriftGas?"yes":"no"));
116 AliInfo(Form("\tStand Alone Tracking [sa] : %s", fSteerParam&kSeeding?"yes":"no"));
117 AliInfo(Form("\tHLT Tracking [hlt] : %s", fSteerParam&kHLT?"yes":"no"));
118 AliInfo(Form("\tCosmic Reconstruction [cos] : %s", fSteerParam&kCosmic?"yes":"no"));
119 AliInfo(Form("\tNN PID [nn] : %s", fSteerParam&kSteerPID?"yes":"no"));
120 AliInfo(Form("\t8 dEdx slices in ESD [8s] : %s", fSteerParam&kEightSlices?"yes":"no"));
121 AliInfo(Form("\tStreaming Levels : Clusterizer[%d] Tracker[%d] PID[%d]", fStreamLevel[kClusterizer], fStreamLevel[kTracker], fStreamLevel[kPID]));
124 //_____________________________________________________________________________
125 void AliTRDReconstructor::ConvertDigits(AliRawReader *rawReader
126 , TTree *digitsTree) const
129 // Convert raw data digits into digit objects in a root tree
131 AliInfo("Feature not available for the moment."); return;
133 AliInfo("Convert raw data digits into digit objects [RawReader -> Digit TTree]");
135 AliTRDrawData rawData;
137 rawReader->Select("TRD");
138 AliTRDdigitsManager *manager = rawData.Raw2Digits(rawReader);
139 manager->MakeBranch(digitsTree);
140 manager->WriteDigits();
145 //_____________________________________________________________________________
146 void AliTRDReconstructor::Reconstruct(AliRawReader *rawReader
147 , TTree *clusterTree) const
150 // Reconstruct clusters
153 //AliInfo("Reconstruct TRD clusters from RAW data [RawReader -> Cluster TTree]");
157 rawReader->Select("TRD");
159 // New (fast) cluster finder
160 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
161 clusterer.SetReconstructor(this);
162 clusterer.OpenOutput(clusterTree);
163 clusterer.SetAddLabels(kFALSE);
164 clusterer.Raw2ClustersChamber(rawReader);
166 if(IsWritingClusters()) return;
168 // take over ownership of clusters
169 fgClusters = clusterer.RecPoints();
170 clusterer.SetClustersOwner(kFALSE);
173 //_____________________________________________________________________________
174 void AliTRDReconstructor::Reconstruct(TTree *digitsTree
175 , TTree *clusterTree) const
178 // Reconstruct clusters
181 //AliInfo("Reconstruct TRD clusters from Digits [Digit TTree -> Cluster TTree]");
183 AliTRDclusterizer clusterer("clusterer","TRD clusterizer");
184 clusterer.SetReconstructor(this);
185 clusterer.OpenOutput(clusterTree);
186 clusterer.ReadDigits(digitsTree);
187 clusterer.MakeClusters();
189 if(IsWritingClusters()) return;
191 // take over ownership of clusters
192 fgClusters = clusterer.RecPoints();
193 clusterer.SetClustersOwner(kFALSE);
196 //_____________________________________________________________________________
197 AliTracker *AliTRDReconstructor::CreateTracker() const
200 // Create a TRD tracker
203 //return new AliTRDtracker(NULL);
204 AliTRDtrackerV1 *tracker = new AliTRDtrackerV1();
205 tracker->SetReconstructor(this);
210 //_____________________________________________________________________________
211 void AliTRDReconstructor::FillESD(TTree* /*digitsTree*/
212 , TTree* /*clusterTree*/
213 , AliESDEvent* /*esd*/) const
222 //_____________________________________________________________________________
223 void AliTRDReconstructor::SetOption(Option_t *opt)
225 // Read option string into the steer param.
227 // Default steer param values
229 // digits conversion [dc] = false
230 // drift gas [ar] = false - do not update the number of exponentials in the TC !
231 // write clusters [cw] = true
232 // write online tracklets [tw] = false
233 // track seeding (stand alone tracking) [sa] = true
234 // PID method in reconstruction (NN) [nn] = true
235 // 8 dEdx slices in ESD [8s] = false
236 // HLT tracking [hlt] = false
237 // Cosmic Reconstruction [cos] = false
240 AliReconstructor::SetOption(opt);
243 TObjArray *opar = s.Tokenize(",");
244 for(Int_t ipar=0; ipar<opar->GetEntriesFast(); ipar++){
245 TString sopt(((TObjString*)(*opar)[ipar])->String());
246 if(sopt.Contains("dc")){
247 SETFLG(fSteerParam, kDigitsConversion);
248 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDigitsConversion);
250 } else if(sopt.Contains("cw")){
251 SETFLG(fSteerParam, kWriteClusters);
252 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteClusters);
254 } else if(sopt.Contains("sa")){
255 SETFLG(fSteerParam, kSeeding);
256 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSeeding);
258 } else if(sopt.Contains("nn")){
259 SETFLG(fSteerParam, kSteerPID);
260 if(sopt.Contains("!")) CLRFLG(fSteerParam, kSteerPID);
262 } else if(sopt.Contains("8s")){
263 SETFLG(fSteerParam, kEightSlices);
264 if(sopt.Contains("!")) CLRFLG(fSteerParam, kEightSlices);
266 } else if(sopt.Contains("tw")){
267 SETFLG(fSteerParam, kWriteTracklets);
268 if(sopt.Contains("!")) CLRFLG(fSteerParam, kWriteTracklets);
270 } else if(sopt.Contains("ar")){
271 SETFLG(fSteerParam, kDriftGas);
272 if(sopt.Contains("!")) CLRFLG(fSteerParam, kDriftGas);
274 } else if(sopt.Contains("hlt")){
275 SETFLG(fSteerParam, kHLT);
276 if(sopt.Contains("!")) CLRFLG(fSteerParam, kHLT);
278 } else if(sopt.Contains("cos")){
279 SETFLG(fSteerParam, kCosmic);
280 if(sopt.Contains("!")) CLRFLG(fSteerParam, kCosmic);
281 } else if(sopt.Contains("sl")){
282 TObjArray *stl = sopt.Tokenize("_");
283 if(stl->GetEntriesFast() < 3) continue;
284 TString taskstr(((TObjString*)(*stl)[1])->String());
285 TString levelstring(((TObjString*)(*stl)[2])->String());
286 // Set the stream Level
287 Int_t level = levelstring.Atoi();
288 AliTRDReconstructorTask task = kTracker;
289 if(taskstr.CompareTo("raw") == 0) task = kRawReader;
290 else if(taskstr.CompareTo("cl") == 0) task = kClusterizer;
291 else if(taskstr.CompareTo("tr") == 0) task = kTracker;
292 else if(taskstr.CompareTo("pi") == 0) task = kPID;
293 SetStreamLevel(level, task);
299 //_____________________________________________________________________________
300 void AliTRDReconstructor::SetStreamLevel(Int_t level, AliTRDReconstructorTask task){
302 // Set the Stream Level for one of the tasks Clusterizer, Tracker or PID
304 TString taskname[4] = {"RawReader", "Clusterizer", "Tracker", "PID"};
305 const Int_t minLevel[4] = {1, 1, 2, 1}; // the minimum debug level upon which a debug stream is created for different tasks
306 //AliInfo(Form("Setting Stream Level for Task %s to %d", taskname.Data(),level));
307 fStreamLevel[(Int_t)task] = level;
308 // Initialize DebugStreamer if not yet done
309 if(level >= minLevel[task] && !fDebugStream[task]){
310 TDirectory *savedir = gDirectory;
311 fDebugStream[task] = new TTreeSRedirector(Form("TRD.%sDebug.root", taskname[task].Data()));