Digits2Raw(): special workaround for digits with time out of range
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.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 /* $Id$ */
16 /* History of cvs commits:
17  *
18  * $Log$
19  * Revision 1.106  2007/01/17 17:28:56  kharlov
20  * Extract ALTRO sample generation to a separate class AliPHOSPulseGenerator
21  *
22  * Revision 1.105  2007/01/12 21:44:29  kharlov
23  * Simulate and reconstruct two gains simulaneouslsy
24  *
25  * Revision 1.104  2006/11/23 13:40:44  hristov
26  * Common class for raw data reading and ALTRO mappiing for PHOS and EMCAL (Gustavo, Cvetan)
27  *
28  * Revision 1.103  2006/11/14 17:11:15  hristov
29  * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
30  *
31  * Revision 1.102  2006/10/27 17:14:27  kharlov
32  * Introduce AliDebug and AliLog (B.Polichtchouk)
33  *
34  * Revision 1.101  2006/10/13 06:47:29  kharlov
35  * Simulation of RAW data applies real mapping (B.Polichtchouk)
36  *
37  * Revision 1.100  2006/08/11 12:36:26  cvetan
38  * Update of the PHOS code needed in order to read and reconstruct the beam test raw data (i.e. without an existing galice.root)
39  *
40  * Revision 1.99  2006/06/28 11:36:09  cvetan
41  * New detector numbering scheme (common for DAQ/HLT/Offline). All the subdetectors shall use the AliDAQ class for the sim and rec of the raw data. The AliDAQ and raw reader classes now provide all the necessary interfaces to write and select the detector specific raw-data payload. Look into the AliDAQ.h and AliRawReader.h for more details.
42  *
43  * Revision 1.98  2006/05/11 11:30:48  cvetan
44  * Major changes in AliAltroBuffer. Now it can be used only for writing of raw data. All the corresponding read method are removed. It is based now on AliFstream in order to avoid endianess problems. The altro raw data is written always with little endian
45  *
46  * Revision 1.97  2006/04/22 10:30:17  hristov
47  * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
48  *
49  * Revision 1.96  2006/04/07 08:41:59  hristov
50  * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
51  *
52  * Revision 1.95  2006/03/14 19:40:41  kharlov
53  * Remove De-digitizing of raw data and digitizing the raw data fit
54  *
55  * Revision 1.94  2006/03/07 18:56:25  kharlov
56  * CDB is passed via environment variable
57  *
58  * Revision 1.93  2005/11/22 08:45:11  kharlov
59  * Calibration is read from CDB if any (Boris Polichtchouk)
60  *
61  * Revision 1.92  2005/11/03 13:09:19  hristov
62  * Removing meaningless const declarations (linuxicc)
63  *
64  * Revision 1.91  2005/07/27 15:08:53  kharlov
65  * Mixture ArCO2 is corrected
66  *
67  * Revision 1.90  2005/06/17 07:39:07  hristov
68  * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
69  *
70  * Revision 1.89  2005/05/28 12:10:07  schutz
71  * Copy constructor is corrected (by T.P.)
72  *
73  */
74
75 //_________________________________________________________________________
76 // Base Class for PHOS description:
77 //   PHOS consists of a PbWO4 calorimeter (EMCA) and a gazeous charged 
78 //    particles detector (CPV or PPSD).
79 //   The only provided method here is CreateMaterials, 
80 //    which defines the materials common to all PHOS versions.   
81 // 
82 //*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) 
83 //////////////////////////////////////////////////////////////////////////////
84
85
86 // --- ROOT system ---
87 class TFile;
88 #include <TFolder.h> 
89 #include <TTree.h>
90 #include <TVirtualMC.h> 
91 #include <TH1F.h> 
92 #include <TF1.h> 
93 #include <TRandom.h> 
94
95 // --- Standard library ---
96
97 // --- AliRoot header files ---
98 #include "AliMagF.h"
99 #include "AliPHOS.h"
100 #include "AliPHOSGetter.h"
101 #include "AliRun.h"
102 #include "AliPHOSDigitizer.h"
103 #include "AliPHOSSDigitizer.h"
104 #include "AliPHOSDigit.h"
105 #include "AliAltroBuffer.h"
106 #include "AliAltroMapping.h"
107 #include "AliCaloAltroMapping.h"
108 #include "AliLog.h"
109 #include "AliCDBManager.h"
110 #include "AliCDBEntry.h"
111 #include "AliCDBStorage.h"
112 #include "AliPHOSCalibData.h"
113 #include "AliPHOSPulseGenerator.h"
114 #include "AliDAQ.h"
115
116 ClassImp(AliPHOS)
117
118 //____________________________________________________________________________
119   AliPHOS:: AliPHOS() : AliDetector()
120 {
121   // Default ctor
122   fName   = "PHOS" ;
123
124 }
125
126 //____________________________________________________________________________
127 AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
128 {
129   //   ctor : title is used to identify the layout
130 }
131
132 //____________________________________________________________________________
133 AliPHOS::~AliPHOS() 
134 {  
135 }
136
137 //____________________________________________________________________________
138 AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
139 {
140   return new AliPHOSDigitizer(manager);
141 }
142
143 //____________________________________________________________________________
144 void AliPHOS::CreateMaterials()
145 {
146   // Definitions of materials to build PHOS and associated tracking media.
147   // media number in idtmed are 699 to 798.
148
149   // --- The PbWO4 crystals ---
150   Float_t aX[3] = {207.19, 183.85, 16.0} ;
151   Float_t zX[3] = {82.0, 74.0, 8.0} ;
152   Float_t wX[3] = {1.0, 1.0, 4.0} ;
153   Float_t dX = 8.28 ;
154
155   AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
156
157
158   // --- The polysterene scintillator (CH) ---
159   Float_t aP[2] = {12.011, 1.00794} ;
160   Float_t zP[2] = {6.0, 1.0} ;
161   Float_t wP[2] = {1.0, 1.0} ;
162   Float_t dP = 1.032 ;
163
164   AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
165
166   // --- Aluminium ---
167   AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
168   // ---         Absorption length is ignored ^
169
170  // --- Tyvek (CnH2n) ---
171   Float_t aT[2] = {12.011, 1.00794} ;
172   Float_t zT[2] = {6.0, 1.0} ;
173   Float_t wT[2] = {1.0, 2.0} ;
174   Float_t dT = 0.331 ;
175
176   AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
177
178   // --- Polystyrene foam ---
179   Float_t aF[2] = {12.011, 1.00794} ;
180   Float_t zF[2] = {6.0, 1.0} ;
181   Float_t wF[2] = {1.0, 1.0} ;
182   Float_t dF = 0.12 ;
183
184   AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
185
186  // --- Titanium ---
187   Float_t aTIT[3] = {47.88, 26.98, 54.94} ;
188   Float_t zTIT[3] = {22.0, 13.0, 25.0} ;
189   Float_t wTIT[3] = {69.0, 6.0, 1.0} ;
190   Float_t dTIT = 4.5 ;
191
192   AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
193
194  // --- Silicon ---
195   AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
196
197
198
199   // --- Foam thermo insulation ---
200   Float_t aTI[2] = {12.011, 1.00794} ;
201   Float_t zTI[2] = {6.0, 1.0} ;
202   Float_t wTI[2] = {1.0, 1.0} ;
203   Float_t dTI = 0.04 ;
204
205   AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
206
207   // --- Textolith ---
208   Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794} ;
209   Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0} ;
210   Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0} ;
211   Float_t dTX    = 1.75 ;
212
213   AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
214
215   //--- FR4  ---
216   Float_t aFR[4] = {16.0, 28.09, 12.011, 1.00794} ;
217   Float_t zFR[4] = {8.0, 14.0, 6.0, 1.0} ;
218   Float_t wFR[4] = {292.0, 68.0, 462.0, 736.0} ;
219   Float_t dFR = 1.8 ; 
220
221   AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
222
223   // --- The Composite Material for  micromegas (so far polyetylene) ---                                       
224   Float_t aCM[2] = {12.01, 1.} ; 
225   Float_t zCM[2] = {6., 1.} ; 
226   Float_t wCM[2] = {1., 2.} ; 
227   Float_t dCM = 0.935 ; 
228
229   AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
230
231   // --- Copper ---                                                                    
232   AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
233  
234   // --- G10 : Printed Circuit material ---                                                  
235   Float_t aG10[4] = { 12., 1., 16., 28.} ;
236   Float_t zG10[4] = { 6., 1., 8., 14.} ;
237   Float_t wG10[4] = { .259, .288, .248, .205} ;
238   Float_t dG10  = 1.7 ;
239   
240   AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
241
242   // --- Lead ---                                                                     
243   AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
244
245  // --- The gas mixture ---                                                                
246  // Co2
247   Float_t aCO[2] = {12.0, 16.0} ; 
248   Float_t zCO[2] = {6.0, 8.0} ; 
249   Float_t wCO[2] = {1.0, 2.0} ; 
250   Float_t dCO = 0.001977 ; 
251
252   AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
253
254  // Ar
255   Float_t dAr = 0.001782 ; 
256   AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;   
257  
258   // Ar+CO2 Mixture (80% / 20%)
259   Float_t arContent = 0.80 ;  // Ar-content of the ArCO2-mixture
260   Float_t aArCO[3]  = {39.948, 12.0, 16.0} ;
261   Float_t zArCO[3]  = {18.0  ,  6.0,  8.0} ;
262   Float_t wArCO[3];
263   wArCO[0] = arContent;
264   wArCO[1] = (1-arContent)*1;
265   wArCO[2] = (1-arContent)*2;
266   Float_t dArCO = arContent*dAr + (1-arContent)*dCO ;
267   AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO,  -3, wArCO) ;
268
269   // --- Stainless steel (let it be pure iron) ---
270   AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
271
272
273   // --- Fiberglass ---
274   Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794} ;
275   Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0} ;
276   Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0} ;
277   Float_t dFG    = 1.9 ;
278
279   AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
280
281   // --- Cables in Air box  ---
282   // SERVICES
283
284   Float_t aCA[4] = { 1.,12.,55.8,63.5 };
285   Float_t zCA[4] = { 1.,6.,26.,29. }; 
286   Float_t wCA[4] = { .014,.086,.42,.48 };
287   Float_t dCA    = 0.8 ;  //this density is raw estimation, if you know better - correct
288
289   AliMixture(19, "Cables  $", aCA, zCA, dCA, -4, wCA) ;
290
291
292   // --- Air ---
293   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
294   Float_t zAir[4]={6.,7.,8.,18.};
295   Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
296   Float_t dAir = 1.20479E-3;
297  
298   AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
299
300   // DEFINITION OF THE TRACKING MEDIA
301
302   // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
303   Int_t * idtmed = fIdtmed->GetArray() - 699 ; 
304   Int_t   isxfld = gAlice->Field()->Integ() ;
305   Float_t sxmgmx = gAlice->Field()->Max() ;
306
307   // The scintillator of the calorimeter made of PBW04                              -> idtmed[699]
308   AliMedium(0, "PHOS Xtal    $", 0, 1,
309             isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
310
311   // The scintillator of the CPV made of Polystyrene scintillator                   -> idtmed[700]
312   AliMedium(1, "CPV scint.   $", 1, 1,
313             isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
314
315   // Various Aluminium parts made of Al                                             -> idtmed[701]
316   AliMedium(2, "Al parts     $", 2, 0,
317              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
318
319   // The Tywek which wraps the calorimeter crystals                                 -> idtmed[702]
320   AliMedium(3, "Tyvek wrapper$", 3, 0,
321              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
322
323   // The Polystyrene foam around the calorimeter module                             -> idtmed[703]
324   AliMedium(4, "Polyst. foam $", 4, 0,
325              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
326
327   // The Titanium around the calorimeter crystal                                    -> idtmed[704]
328   AliMedium(5, "Titan. cover $", 5, 0,
329              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0) ;
330
331   // The Silicon of the pin diode to read out the calorimeter crystal               -> idtmed[705] 
332  AliMedium(6, "Si PIN       $", 6, 0,
333              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0) ;
334
335  // The thermo insulating material of the box which contains the calorimeter module -> idtmed[706]
336   AliMedium(7, "Thermo Insul.$", 7, 0,
337              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
338
339   // The Textolit which makes up the box which contains the calorimeter module      -> idtmed[707]
340   AliMedium(8, "Textolit     $", 8, 0,
341              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
342
343   // FR4: The Plastic which makes up the frame of micromegas                        -> idtmed[708]
344   AliMedium(9, "FR4 $", 9, 0,
345              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ; 
346
347
348   // The Composite Material for  micromegas                                         -> idtmed[709]
349   AliMedium(10, "CompoMat   $", 10, 0,
350              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
351
352   // Copper                                                                         -> idtmed[710]
353   AliMedium(11, "Copper     $", 11, 0,
354              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
355
356   // G10: Printed Circuit material                                                  -> idtmed[711]
357  
358   AliMedium(12, "G10        $", 12, 0,
359              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
360
361   // The Lead                                                                       -> idtmed[712]
362  
363   AliMedium(13, "Lead      $", 13, 0,
364              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
365
366   // The gas mixture: ArCo2                                                         -> idtmed[715]
367  
368   AliMedium(16, "ArCo2      $", 16, 1,
369              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
370  
371   // Stainless steel                                                                -> idtmed[716]
372   AliMedium(17, "Steel     $", 17, 0,
373              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
374
375   // Fibergalss                                                                     -> idtmed[717]
376   AliMedium(18, "Fiberglass$", 18, 0,
377              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
378
379   // Cables in air                                                                  -> idtmed[718]
380   AliMedium(19, "Cables    $", 19, 0,
381              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
382
383   // Air                                                                            -> idtmed[798] 
384   AliMedium(99, "Air          $", 99, 0,
385              isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0) ;
386
387   // --- Set decent energy thresholds for gamma and electron tracking
388
389   // Tracking threshold for photons and electrons in the scintillator crystal 
390   gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ; 
391   gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ;
392  
393   // --- Generate explicitly delta rays in the titan cover ---
394   gMC->Gstpar(idtmed[704], "LOSS",3.) ;
395   gMC->Gstpar(idtmed[704], "DRAY",1.) ;
396   // --- and in aluminium parts ---
397   gMC->Gstpar(idtmed[701], "LOSS",3.) ;
398   gMC->Gstpar(idtmed[701], "DRAY",1.) ;
399   // --- and in PIN diode
400   gMC->Gstpar(idtmed[705], "LOSS",3) ;
401   gMC->Gstpar(idtmed[705], "DRAY",1) ;
402   // --- and in the passive convertor
403   gMC->Gstpar(idtmed[712], "LOSS",3) ;
404   gMC->Gstpar(idtmed[712], "DRAY",1) ;
405   // Tracking threshold for photons and electrons in the gas ArC02 
406   gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ; 
407   gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ;
408   gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ;
409   gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ;
410   gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ;
411   gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ;
412   gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ;
413   gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ;
414   gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ;
415   gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ;
416   gMC->Gstpar(idtmed[715], "LOSS",2.) ;
417   gMC->Gstpar(idtmed[715], "DRAY",0.) ;
418   gMC->Gstpar(idtmed[715], "STRA",2.) ;
419
420 }
421
422 //____________________________________________________________________________
423 void AliPHOS::Digits2Raw()
424 {
425 // convert digits of the current event to raw data
426   
427   AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ; 
428
429   // get the digits
430   loader->LoadDigits();
431   TClonesArray* digits = loader->Digits() ;
432
433   if (!digits) {
434     AliError(Form("No digits found !"));
435     return;
436   }
437
438   // get the geometry
439   AliPHOSGeometry* geom = GetGeometry();
440   if (!geom) {
441     AliError(Form("No geometry found !"));
442     return;
443   }
444
445   // some digitization constants
446   const Float_t    kThreshold = 0.001; // skip digits below 1 MeV
447   const Int_t      kAdcThreshold = 1;  // Lower ADC threshold to write to raw data
448
449   AliAltroBuffer* buffer = NULL;
450   Int_t prevDDL = -1;
451
452   // Create a shaper pulse object
453   AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
454
455   Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
456   Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
457
458   //!!!!for debug!!!
459   Int_t modMax=-111;
460   Int_t colMax=-111;
461   Int_t rowMax=-111;
462   Float_t eMax=-333;
463   //!!!for debug!!!
464
465   // loop over digits (assume ordered digits)
466   for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
467     AliPHOSDigit* digit = dynamic_cast<AliPHOSDigit *>(digits->At(iDigit)) ;
468     if (digit->GetEnergy() < kThreshold) 
469       continue;
470     Int_t relId[4];
471     geom->AbsToRelNumbering(digit->GetId(), relId);
472     Int_t module = relId[0];
473  
474     // Begin FIXME 
475     if (relId[1] != 0) 
476       continue;    // ignore digits from CPV
477     // End FIXME 
478
479     Int_t row = relId[2]-1;
480     Int_t col = relId[3]-1;
481
482     Int_t iRCU = -111;
483
484     //RCU0
485     if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0;
486
487     //RCU1
488     if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1;
489
490     //RCU2
491     if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2;
492
493     //RCU3
494     if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3;
495
496
497     // PHOS EMCA has 4 DDL per module. Splitting is based on the (row,column) numbers.
498     // PHOS internal convention: 1<module<5.
499     Int_t iDDL = 4 * (module - 1) + iRCU;
500
501     // new DDL
502     if (iDDL != prevDDL) {
503       // write real header and close previous file
504       if (buffer) {
505         buffer->Flush();
506         buffer->WriteDataHeader(kFALSE, kFALSE);
507         delete buffer;
508       }
509
510       // open new file and write dummy header
511       TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
512
513       TString path = gSystem->Getenv("ALICE_ROOT");
514       path += "/PHOS/mapping/RCU";
515       path += iRCU;
516       path += ".data";
517
518       AliAltroMapping* mapping = new AliCaloAltroMapping(path.Data());
519       buffer = new AliAltroBuffer(fileName.Data(),mapping);
520       buffer->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
521
522       prevDDL = iDDL;
523     }
524
525     AliDebug(2,Form("digit E=%.4f GeV, t=%g s, (mod,col,row)=(%d,%d,%d)\n",
526                     digit->GetEnergy(),digit->GetTimeR(),
527                     relId[0]-1,relId[3]-1,relId[2]-1));
528     // if a signal is out of time range, write only trailer
529     if (digit->GetTimeR() > pulse->GetRawFormatTimeMax()*0.5 ) {
530       AliInfo("Signal is out of time range.\n");
531       buffer->FillBuffer(0);
532       buffer->FillBuffer(pulse->GetRawFormatTimeBins() );  // time bin
533       buffer->FillBuffer(3);                               // bunch length
534       buffer->WriteTrailer(3, relId[3]-1, relId[2]-1, 0);  // trailer
535       
536     // calculate the time response function
537     } else {
538       Double_t energy = 0 ;
539       Int_t   module = relId[0];
540       if (digit->GetId() <= geom->GetNModules() * geom->GetNCristalsInModule()) {
541         energy=digit->GetEnergy();
542         if(energy>eMax) {eMax=energy; modMax=module; colMax=col; rowMax=row;}
543       }
544       else {
545         energy = 0; // CPV raw data format is now know yet
546       }
547       pulse->SetAmplitude(energy);
548       pulse->SetTZero(digit->GetTimeR());
549       pulse->MakeSamples();
550       pulse->GetSamples(adcValuesHigh, adcValuesLow) ; 
551       buffer->WriteChannel(relId[3]-1, relId[2]-1, 0, 
552                            pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
553       buffer->WriteChannel(relId[3]-1, relId[2]-1, 1, 
554                            pulse->GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
555     }
556   }
557   
558   // write real header and close last file
559   if (buffer) {
560     buffer->Flush();
561     buffer->WriteDataHeader(kFALSE, kFALSE);
562     delete buffer;
563   }
564   
565   AliDebug(1,Form("Digit with max. energy:  modMax %d colMax %d rowMax %d  eMax %f\n",
566          modMax,colMax,rowMax,eMax));
567
568   delete pulse;
569   loader->UnloadDigits();
570 }
571
572 //____________________________________________________________________________
573 void AliPHOS::Hits2SDigits()  
574
575 // create summable digits
576
577   AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
578   phosDigitizer.SetEventRange(0, -1) ; // do all the events
579   phosDigitizer.ExecuteTask("all") ; 
580 }
581
582 //____________________________________________________________________________
583 AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
584 {
585 //different behaviour than standard (singleton getter)
586 // --> to be discussed and made eventually coherent
587  fLoader = new AliPHOSLoader(GetName(),topfoldername);
588  return fLoader;
589 }
590
591 //____________________________________________________________________________
592 void AliPHOS::SetTreeAddress()
593
594   // Links Hits in the Tree to Hits array
595   TBranch *branch;
596   char branchname[20];
597   sprintf(branchname,"%s",GetName());
598   // Branch address for hit tree
599     TTree *treeH = TreeH();
600   if (treeH) {
601     branch = treeH->GetBranch(branchname);
602     if (branch) 
603      { 
604        if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
605        //AliInfo(Form("<%s> Setting Hits Address",GetName()));
606        branch->SetAddress(&fHits);
607      }
608   }
609 }
610