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