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