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