]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - PHOS/AliPHOS.cxx
Digits2Raw(): special workaround for digits with time out of range
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.cxx
... / ...
CommitLineData
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 ---
87class 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
116ClassImp(AliPHOS)
117
118//____________________________________________________________________________
119 AliPHOS:: AliPHOS() : AliDetector()
120{
121 // Default ctor
122 fName = "PHOS" ;
123
124}
125
126//____________________________________________________________________________
127AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
128{
129 // ctor : title is used to identify the layout
130}
131
132//____________________________________________________________________________
133AliPHOS::~AliPHOS()
134{
135}
136
137//____________________________________________________________________________
138AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
139{
140 return new AliPHOSDigitizer(manager);
141}
142
143//____________________________________________________________________________
144void 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//____________________________________________________________________________
423void 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//____________________________________________________________________________
573void 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//____________________________________________________________________________
583AliLoader* 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//____________________________________________________________________________
592void 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