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