Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / TRD / AliTRD.cxx
1 /**************************************************************************
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  **************************************************************************/
15
16 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 //  Transition Radiation Detector                                            //
21 //  This class contains the basic functions for the Transition Radiation     //
22 //  Detector.                                                                //
23 //                                                                           //
24 ///////////////////////////////////////////////////////////////////////////////
25
26 #include <TGeoGlobalMagField.h>
27 #include <TVirtualMC.h>
28 #include <TGeoManager.h>
29  
30 #include "AliMC.h"
31 #include "AliMagF.h"
32 #include "AliRun.h"
33 #include "AliLoader.h"
34
35 #include "AliTRD.h"
36 #include "AliTRDdigitizer.h"
37 #include "AliTRDdigitsManager.h"
38 #include "AliTRDgeometry.h"
39 #include "AliTRDhit.h"
40 #include "AliTRDrawData.h"
41 #include "AliTRDCommonParam.h"
42
43 ClassImp(AliTRD)
44  
45 //_____________________________________________________________________________
46 AliTRD::AliTRD()
47   :AliDetector()
48   ,fGeometry(0)
49   ,fGasDensity(0)
50   ,fFoilDensity(0)
51   ,fGasNobleFraction(0)
52   ,fPrimaryIonisation(0)
53 {
54   //
55   // Default constructor
56   //
57  
58 }
59  
60 //_____________________________________________________________________________
61 AliTRD::AliTRD(const char *name, const char *title)
62   :AliDetector(name,title)
63   ,fGeometry(0)
64   ,fGasDensity(0)
65   ,fFoilDensity(0)
66   ,fGasNobleFraction(0)
67   ,fPrimaryIonisation(0)
68 {
69   //
70   // Standard constructor for the TRD
71   //
72
73   // Check that FRAME is there otherwise we have no place where to put TRD
74   AliModule *frame = gAlice->GetModule("FRAME");
75   if (!frame) {
76     AliError("TRD needs FRAME to be present\n");
77     exit(1);
78   } 
79
80   // Define the TRD geometry
81   if ((frame->IsVersion() == 0) ||
82       (frame->IsVersion() == 1)) {
83     fGeometry = new AliTRDgeometry();
84   }
85   else {
86     AliError("Could not find valid FRAME version\n");
87     exit(1);
88   }
89
90   // Allocate the hit array
91   fHits = new TClonesArray("AliTRDhit",405);
92   gAlice->GetMCApp()->AddHitList(fHits);
93
94 }
95
96 //_____________________________________________________________________________
97 AliTRD::~AliTRD()
98 {
99   //
100   // TRD destructor
101   //
102
103   if (fGeometry) {
104     delete fGeometry;
105     fGeometry = 0;
106   }
107
108   if (fHits) {
109     delete fHits;
110     fHits     = 0;
111   }
112
113 }
114
115 //_____________________________________________________________________________
116 void AliTRD::Hits2Digits()
117 {
118   //
119   // Create digits
120   //
121
122   AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
123   AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
124
125   // Initialization
126   digitizer.InitDetector();
127     
128   if (!fLoader->TreeH()) {
129     fLoader->LoadHits("read");
130   }
131   fLoader->LoadDigits("recreate");
132
133   AliRunLoader *runLoader = fLoader->GetRunLoader(); 
134
135   for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
136     runLoader->GetEvent(iEvent);
137     digitizer.Open(runLoader,iEvent);
138     digitizer.MakeDigits();
139     digitizer.WriteDigits();
140   }
141
142   fLoader->UnloadHits();
143   fLoader->UnloadDigits();
144
145 }
146
147 //_____________________________________________________________________________
148 void AliTRD::Hits2SDigits()
149 {
150   //
151   // Create summable digits
152   //
153
154   AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
155   // For the summable digits
156   digitizer.SetSDigits(kTRUE);
157   AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
158
159   // Initialization
160   digitizer.InitDetector();
161     
162   if (!fLoader->TreeH()) {
163     fLoader->LoadHits("read");
164   }
165   fLoader->LoadSDigits("recreate");
166
167   AliRunLoader *runLoader = fLoader->GetRunLoader(); 
168
169   for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
170     runLoader->GetEvent(iEvent);
171     digitizer.Open(runLoader,iEvent);
172     digitizer.MakeDigits();
173     digitizer.WriteDigits();
174   }
175
176   fLoader->UnloadHits();
177   fLoader->UnloadSDigits();
178   
179 }
180
181 //_____________________________________________________________________________
182 AliDigitizer *AliTRD::CreateDigitizer(AliDigitizationInput* digInput) const
183 {
184   //
185   // Creates a new digitizer object
186   //
187
188   return new AliTRDdigitizer(digInput);
189
190 }
191
192 //_____________________________________________________________________________
193 void AliTRD::SDigits2Digits()
194 {
195   //
196   // Create final digits from summable digits
197   //
198
199   // Create the TRD digitizer
200   AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");  
201   AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
202
203   // Set the parameter
204   digitizer.SetEvent(gAlice->GetEvNumber());
205
206   // Initialization
207   digitizer.InitDetector();
208
209   // Read the s-digits via digits manager
210   AliTRDdigitsManager sdigitsManager;
211  
212   AliLog::SetClassDebugLevel("TRDdigitisManager",AliDebugLevel());
213   sdigitsManager.SetSDigits(kTRUE);
214   sdigitsManager.CreateArrays();
215   
216   if (!fLoader->TreeS()) { 
217     if (fLoader->LoadSDigits("read")) {
218       return;
219     }
220   }
221   if (!fLoader->TreeS()) {
222     AliError(Form("Error while reading SDigits for event %d",gAlice->GetEvNumber()));
223     return;
224   }
225   
226   sdigitsManager.ReadDigits(fLoader->TreeS());
227
228   // Add the s-digits to the input list 
229   digitizer.AddSDigitsManager(&sdigitsManager);
230
231   // Convert the s-digits to normal digits
232   digitizer.SDigits2Digits();
233
234   // Store the digits
235   if (!fLoader->TreeD()) {
236     fLoader->MakeTree("D");
237   }
238   if (digitizer.MakeBranch(fLoader->TreeD())){
239     digitizer.WriteDigits();
240   }
241
242 }
243
244 //_____________________________________________________________________________
245 void AliTRD::Digits2Raw() 
246 {
247   //
248   // Convert digits of the current event to raw data
249   //
250
251   fLoader->LoadDigits();
252   TTree *digits = fLoader->TreeD();
253   if (!digits) {
254     AliError("No digits tree");
255     return;
256   }
257
258   AliTRDrawData rawWriter;
259   if (!rawWriter.Digits2Raw(digits)) {
260     AliError("The raw writer could not load the digits tree");
261   }
262
263   fLoader->UnloadDigits();
264
265 }
266
267 //_____________________________________________________________________________
268 void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
269                   , Float_t time, Bool_t inDrift)
270 {
271   //
272   // Add a hit for the TRD
273   // 
274
275   TClonesArray &lhits = *fHits;
276   AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt
277                                                  ,track
278                                                  ,det
279                                                  ,hits
280                                                  ,q
281                                                  ,time);
282
283   if (inDrift) {
284     hit->SetDrift();
285   }
286   else {
287     hit->SetAmplification();
288   }
289
290   if (q < 0) {
291     hit->SetTRphoton();
292   }
293
294 }
295  
296 //_____________________________________________________________________________
297 void AliTRD::CreateGeometry()
298 {
299   //
300   // Creates the volumes for the TRD chambers
301   //
302
303   // Check that FRAME is there otherwise we have no place where to put the TRD
304   AliModule *frame = gAlice->GetModule("FRAME");
305   if (!frame) {
306     AliFatal("The TRD needs the FRAME to be defined first");
307   }
308
309   fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
310
311 }
312
313 //_____________________________________________________________________________
314 void AliTRD::CreateMaterials()
315 {
316   //
317   // Create the materials for the TRD
318   //
319
320   Int_t   isxfld = ((AliMagF *) TGeoGlobalMagField::Instance()->GetField())->Integ();
321   Float_t sxmgmx = ((AliMagF *) TGeoGlobalMagField::Instance()->GetField())->Max();
322   
323   //////////////////////////////////////////////////////////////////////////
324   //     Define Materials 
325   //////////////////////////////////////////////////////////////////////////
326
327   // Aluminum
328   AliMaterial( 1,"Al",  26.98, 13.0, 2.7,    8.9,  37.2);
329   // Copper
330   AliMaterial( 2,"Cu",  63.54, 29.0, 8.96,   1.43, 14.8);
331   // Carbon
332   AliMaterial( 3,"C" ,  12.01,  6.0, 2.265, 18.8,  74.4);
333   // Carbon for fiber mats
334   AliMaterial( 4,"C2",  12.01,  6.0, 1.75,  18.8,  74.4);
335   // Zinc
336   AliMaterial( 5,"Sn", 118.71, 50.0, 7.31,   1.21, 14.8);
337   // Silicon
338   AliMaterial( 6,"Si",  28.09, 14.0, 2.33,   9.36, 37.2);
339   // Iron
340   AliMaterial( 7,"Fe",  55.85, 26.0, 7.87,   1.76, 14.8);
341
342   // Air  
343   Float_t aAir[4]   = { 12.011   , 14.0     , 15.9994  , 36.0      };
344   Float_t zAir[4]   = {  6.0     ,  7.0     ,  8.0     , 18.0      };
345   Float_t wAir[4]   = {  0.000124,  0.755267,  0.231781,  0.012827 };
346   Float_t dAir      = 1.20479e-03;
347   AliMixture(51,"Air",          aAir,   zAir,   dAir,    4, wAir  );
348   // Polyethilene (CH2) 
349   Float_t ape[2]    = { 12.011 ,  1.0079 };
350   Float_t zpe[2]    = {  6.0   ,  1.0    };
351   Float_t wpe[2]    = {  1.0   ,  2.0    };
352   Float_t dpe       = 0.95;
353   AliMixture(52,"Polyethilene", ape,    zpe,    dpe,    -2, wpe   );
354   // Gas mixtures
355   // Xe/CO2-gas-mixture (85% / 15%) 
356   Float_t aXeCO2[3] = { 131.29   ,  12.0107 ,  15.9994  };
357   Float_t zXeCO2[3] = {  54.0    ,   6.0    ,   8.0     };
358   Float_t wXeCO2[3] = {   8.5    ,   1.5    ,   3.0     }; 
359   Float_t fxc       = 0.85;
360   Float_t dxe       = 0.00549; // at 20C
361   Float_t dco       = 0.00186; // at 20C
362   Float_t dgmXe     = fxc * dxe + (1.0 - fxc) * dco;
363   // Ar/CO2-gas-mixture
364   Float_t aArCO2[3] = {  39.948  ,  12.0107 ,  15.9994  };
365   Float_t zArCO2[3] = {  18.0    ,   6.0    ,   8.0     };
366   Float_t wArCO2[3] = {   8.2    ,   1.8    ,   3.6     }; 
367   Float_t fac       = 0.82;
368   Float_t dar       = 0.00166; // at 20C
369   Float_t dgmAr     = fac * dar + (1.0 - fac) * dco;
370   if      (AliTRDCommonParam::Instance()->IsXenon()) {
371     AliMixture(53,"XeCO2",        aXeCO2, zXeCO2, dgmXe,  -3, wXeCO2);
372   }
373   else if (AliTRDCommonParam::Instance()->IsArgon()) {
374     AliInfo("Gas mixture: Ar C02 (80/20)");
375     AliMixture(53,"ArCO2",        aArCO2, zArCO2, dgmAr,  -3, wArCO2);
376   }
377   else {
378     AliFatal("Wrong gas mixture");
379     exit(1);
380   }
381   // G10
382   Float_t aG10[4]   = {  1.0079, 12.011 , 15.9994, 28.086  };
383   Float_t zG10[4]   = {  1.0   ,  6.0   ,  8.0   , 14.0    };
384   Float_t wG10[4]   = {  0.023 ,  0.194 ,  0.443 ,  0.340  };
385   Float_t dG10      = 2.0;
386   AliMixture(54,"G10",          aG10,  zG10,  dG10,   4,wG10  );
387   // Water
388   Float_t awa[2]    = {  1.0079, 15.9994 };
389   Float_t zwa[2]    = {  1.0   ,  8.0    };
390   Float_t wwa[2]    = {  2.0   ,  1.0    };
391   Float_t dwa       = 1.0;
392   AliMixture(55,"Water",        awa,   zwa,   dwa,   -2,wwa   );
393   // Rohacell (C5H8O2), X0 = 535.005cm
394   Float_t arh[3]    = { 12.011 ,  1.0079, 15.9994 };
395   Float_t zrh[3]    = {  6.0   ,  1.0   ,  8.0    };
396   Float_t wrh[3]    = {  5.0   ,  8.0   ,  2.0    };
397   Float_t drh       = 0.075;   
398   AliMixture(56,"Rohacell",     arh,   zrh,   drh,   -3,wrh   );
399   // Epoxy (C18H19O3)
400   Float_t aEpoxy[3] = { 15.9994,  1.0079, 12.011  }; 
401   Float_t zEpoxy[3] = {  8.0   ,  1.0   ,  6.0    }; 
402   Float_t wEpoxy[3] = {  3.0   , 19.0   , 18.0    }; 
403   Float_t dEpoxy    = 1.8 ; 
404   AliMixture(57,"Epoxy",        aEpoxy,zEpoxy,dEpoxy,-3,wEpoxy);
405   // Araldite, low density epoxy (C18H19O3)
406   Float_t aAral[3]  = { 15.9994,  1.0079, 12.011  }; 
407   Float_t zAral[3]  = {  8.0   ,  1.0   ,  6.0    }; 
408   Float_t wAral[3]  = {  3.0   , 19.0   , 18.0    }; 
409   Float_t dAral     = 1.12; // Hardener: 1.15, epoxy: 1.1, mixture: 1/2
410   AliMixture(58,"Araldite",     aAral, zAral, dAral, -3,wAral );
411   // Mylar
412   Float_t aMy[3]    = { 12.011 ,   1.0  , 15.9994 };
413   Float_t zMy[3]    = {  6.0   ,   1.0  ,  8.0    };
414   Float_t wMy[3]    = {  5.0   ,   4.0  ,  2.0    };
415   Float_t dMy       = 1.39;
416   AliMixture(59,"Mylar",        aMy,   zMy,   dMy,   -3,wMy   );
417   // Polypropylene (C3H6) for radiator fibers
418   Float_t app[2]    = { 12.011 ,  1.0079 };
419   Float_t zpp[2]    = {  6.0   ,  1.0    };
420   Float_t wpp[2]    = {  3.0   ,  6.0    };
421   Float_t dpp       = 0.068;
422   AliMixture(60,"Polypropylene",app,   zpp,   dpp,   -2,wpp   );
423   // Aramide for honeycomb
424   Float_t aAra[4]   = {  1.0079, 12.011 , 15.9994, 14.0067 };
425   Float_t zAra[4]   = {  1.0   ,  6.0   ,  8.0   ,  7.0    };
426   Float_t wAra[4]   = {  3.0   ,  1.0   ,  1.0   ,  1.0    };
427   Float_t dAra      = 0.032;
428   AliMixture(61,"Aramide",      aAra,  zAra,  dAra,  -4,wAra  );
429   // GFK for Wacosit (Epoxy + Si)
430   Float_t aGFK[4]   = {  1.0079, 12.011 , 15.9994, 28.086  };
431   Float_t zGFK[4]   = {  1.0   ,  6.0   ,  8.0   , 14.0    };
432   Float_t wGFK[4]   = {  0.0445,  0.5031,  0.1118,  0.340  };
433   Float_t dGFK      = 2.0;
434   AliMixture(62,"GFK",          aGFK,  zGFK,  dGFK,   4,wGFK  );
435
436   //////////////////////////////////////////////////////////////////////////
437   //     Tracking Media Parameters 
438   //////////////////////////////////////////////////////////////////////////
439
440   // General tracking parameter
441   Float_t tmaxfd    = -10.0;
442   Float_t stemax    = -1.0e10;
443   Float_t deemax    = -0.1;
444   Float_t epsil     =  1.0e-4;
445   Float_t stmin     = -0.001;
446
447   // Al Frame 
448   AliMedium( 1,"Al Frame"   , 1,0,isxfld,sxmgmx
449               ,tmaxfd,stemax,deemax,epsil,stmin);
450   // Air 
451   AliMedium( 2,"Air"        ,51,0,isxfld,sxmgmx
452               ,tmaxfd,stemax,deemax,epsil,stmin);
453   // Wires
454   AliMedium( 3,"Wires"      , 2,0,isxfld,sxmgmx
455               ,tmaxfd,stemax,deemax,epsil,stmin);
456   // All other ROB materials (caps, etc.)
457   AliMedium( 4,"ROB Other"  , 2,0,isxfld,sxmgmx
458               ,tmaxfd,stemax,deemax,epsil,stmin);
459   // Cu pads 
460   AliMedium( 5,"Padplane"   , 2,1,isxfld,sxmgmx
461               ,tmaxfd,stemax,deemax,epsil,stmin);
462   // Fee + cables 
463   AliMedium( 6,"Readout"    , 2,0,isxfld,sxmgmx
464               ,tmaxfd,stemax,deemax,epsil,stmin);
465   // C frame (Wacosit) 
466   AliMedium( 7,"Wacosit"    ,62,0,isxfld,sxmgmx
467               ,tmaxfd,stemax,deemax,epsil,stmin);
468   // INOX of cooling bus bars
469   AliMedium( 8,"Cooling bus", 7,0,isxfld,sxmgmx
470               ,tmaxfd,stemax,deemax,epsil,stmin);
471   // Gas-mixture (Xe/CO2) 
472   AliMedium( 9,"Gas-mix"    ,53,1,isxfld,sxmgmx
473               ,tmaxfd,stemax,deemax,epsil,stmin);
474   // Honeycomb
475   AliMedium(10,"Honeycomb"  ,61,0,isxfld,sxmgmx
476               ,tmaxfd,stemax,deemax,epsil,stmin);
477   // Araldite glue
478   AliMedium(11,"Glue"       ,58,0,isxfld,sxmgmx
479               ,tmaxfd,stemax,deemax,epsil,stmin);
480   // G10-plates
481   AliMedium(13,"G10-plates" ,54,0,isxfld,sxmgmx
482               ,tmaxfd,stemax,deemax,epsil,stmin);
483   // Cooling water
484   AliMedium(14,"Water"      ,55,0,isxfld,sxmgmx
485               ,tmaxfd,stemax,deemax,epsil,stmin);
486   // Rohacell for the radiator
487   AliMedium(15,"Rohacell"   ,56,0,isxfld,sxmgmx
488               ,tmaxfd,stemax,deemax,epsil,stmin);
489   // Al layer in MCMs
490   AliMedium(16,"MCM-Al"     , 1,0,isxfld,sxmgmx
491               ,tmaxfd,stemax,deemax,epsil,stmin);
492   // Sn layer in MCMs
493   AliMedium(17,"MCM-Sn"     , 5,0,isxfld,sxmgmx
494               ,tmaxfd,stemax,deemax,epsil,stmin);
495   // Cu layer in MCMs
496   AliMedium(18,"MCM-Cu"     , 2,0,isxfld,sxmgmx
497               ,tmaxfd,stemax,deemax,epsil,stmin);
498   // G10 layer in MCMs
499   AliMedium(19,"MCM-G10"    ,54,0,isxfld,sxmgmx
500               ,tmaxfd,stemax,deemax,epsil,stmin);
501   // Si in readout chips
502   AliMedium(20,"Chip-Si"    , 6,0,isxfld,sxmgmx
503               ,tmaxfd,stemax,deemax,epsil,stmin);
504   // Epoxy in readout chips
505   AliMedium(21,"Chip-Ep"    ,57,0,isxfld,sxmgmx
506               ,tmaxfd,stemax,deemax,epsil,stmin);
507   // PE in connectors
508   AliMedium(22,"Conn-PE"    ,52,0,isxfld,sxmgmx
509               ,tmaxfd,stemax,deemax,epsil,stmin);
510   // Cu in connectors
511   AliMedium(23,"Chip-Cu"    , 2,0,isxfld,sxmgmx
512               ,tmaxfd,stemax,deemax,epsil,stmin);
513   // Al of cooling pipes
514   AliMedium(24,"Cooling"    , 1,0,isxfld,sxmgmx
515               ,tmaxfd,stemax,deemax,epsil,stmin);
516   // Cu in services
517   AliMedium(25,"Serv-Cu"    , 2,0,isxfld,sxmgmx
518               ,tmaxfd,stemax,deemax,epsil,stmin);
519   // Carbon fiber mat
520   AliMedium(26,"Carbon"     , 4,0,isxfld,sxmgmx
521               ,tmaxfd,stemax,deemax,epsil,stmin);
522   // Mylar foil
523   AliMedium(27,"Mylar"      ,59,0,isxfld,sxmgmx
524               ,tmaxfd,stemax,deemax,epsil,stmin);
525   // Polypropylene fibers
526   AliMedium(28,"Fiber"      ,60,0,isxfld,sxmgmx
527               ,tmaxfd,stemax,deemax,epsil,stmin);
528
529   // Save the density values for the TRD absorbtion
530   Float_t dmy  = 1.39;
531   fFoilDensity = dmy;
532   if      (AliTRDCommonParam::Instance()->IsXenon()) {
533     fGasDensity       = dgmXe;
534     fGasNobleFraction = fxc;
535   }
536   else if (AliTRDCommonParam::Instance()->IsArgon()) {
537     fGasDensity       = dgmAr;
538     fGasNobleFraction = fac;
539   }
540
541 }
542  
543 //_____________________________________________________________________________
544 void AliTRD::Init()
545 {
546   //
547   // Initialize the TRD detector after the geometry has been created
548   //
549
550   AliDebug(1,"++++++++++++++++++++++++++++++++++++++++++++++");
551
552   if (fGeometry->IsVersion() != 1) {
553     AliError("Not a valid geometry");
554   }
555
556 }
557
558 //_____________________________________________________________________________
559 void AliTRD::ResetDigits()
560 {
561   //
562   // Reset number of digits and the digits array for this detector
563   //
564
565   fNdigits = 0;
566
567   if (fDigits) {
568     fDigits->Clear();
569   }
570
571 }
572
573 //_____________________________________________________________________________
574 void AliTRD::SetTreeAddress()
575 {
576   //
577   // Set the branch addresses for the trees.
578   //
579
580   if (fLoader->TreeH() && 
581       (fHits == 0x0)) {
582     fHits = new TClonesArray("AliTRDhit",405);
583   }
584   AliDetector::SetTreeAddress();
585
586 }
587
588 //_____________________________________________________________________________
589 Bool_t AliTRD::Raw2SDigits(AliRawReader *rawReader)
590 {
591   //
592   // Converts RAW data to SDigits
593   //
594
595   AliLoader *loader = fRunLoader->GetLoader("TRDLoader");
596   if (!loader) {
597     AliError("Can not get TRD loader from Run Loader");
598     return kFALSE;
599   }
600     
601   TTree *tree = 0;
602   tree = loader->TreeS();
603   if (!tree) {
604     loader->MakeTree("S");
605     tree = loader->TreeS();
606   }
607
608   AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");  
609
610   AliTRDrawData       *rawdata        = new AliTRDrawData();
611   AliTRDdigitsManager *digitsManager  = rawdata->Raw2Digits(rawReader);
612
613   // Create the s-digits manager
614   AliTRDdigitsManager *sdigitsManager = new AliTRDdigitsManager();
615
616   if (sdigitsManager) {
617
618     sdigitsManager->SetSDigits(kTRUE);
619     sdigitsManager->CreateArrays();
620
621     // Convert the digits into s-digits
622     digitizer.Digits2SDigits(digitsManager,sdigitsManager);
623
624     sdigitsManager->MakeBranch(tree);
625     sdigitsManager->WriteDigits();
626
627     delete digitsManager;
628
629     return kTRUE;
630
631   } 
632   else {
633
634     return kFALSE;
635
636   }
637
638 }
639
640 //_____________________________________________________________________________
641 AliLoader *AliTRD::MakeLoader(const Char_t *topfoldername)
642 {
643   //
644   // Create a loader for the TRD tracklets
645   //
646
647  fLoader = new AliLoader(GetName(),topfoldername);
648
649  AliInfo("Adding Tracklets-loader");
650
651  AliDataLoader *dl = new AliDataLoader("TRD.Tracklets.root"
652                                       ,"tracklets"
653                                       ,"tracklets");
654  fLoader->AddDataLoader(dl);
655
656                 dl = new AliDataLoader("TRD.GtuTracks.root"
657                                       ,"gtutracks"
658                                       ,"gtutracks");
659  fLoader->AddDataLoader(dl);
660
661  return fLoader;
662
663 }
664
665 //_____________________________________________________________________________
666 AliTRD &AliTRD::operator=(const AliTRD &trd)
667 {
668   //
669   // Assignment operator
670   //
671
672   if (this != &trd) {
673     ((AliTRD &) trd).Copy(*this);
674   }
675
676   return *this;
677
678 }