1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 /* History of cvs commits:
19 * Revision 1.106 2007/01/17 17:28:56 kharlov
20 * Extract ALTRO sample generation to a separate class AliPHOSPulseGenerator
22 * Revision 1.105 2007/01/12 21:44:29 kharlov
23 * Simulate and reconstruct two gains simulaneouslsy
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)
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
31 * Revision 1.102 2006/10/27 17:14:27 kharlov
32 * Introduce AliDebug and AliLog (B.Polichtchouk)
34 * Revision 1.101 2006/10/13 06:47:29 kharlov
35 * Simulation of RAW data applies real mapping (B.Polichtchouk)
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)
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.
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
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)
49 * Revision 1.96 2006/04/07 08:41:59 hristov
50 * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
52 * Revision 1.95 2006/03/14 19:40:41 kharlov
53 * Remove De-digitizing of raw data and digitizing the raw data fit
55 * Revision 1.94 2006/03/07 18:56:25 kharlov
56 * CDB is passed via environment variable
58 * Revision 1.93 2005/11/22 08:45:11 kharlov
59 * Calibration is read from CDB if any (Boris Polichtchouk)
61 * Revision 1.92 2005/11/03 13:09:19 hristov
62 * Removing meaningless const declarations (linuxicc)
64 * Revision 1.91 2005/07/27 15:08:53 kharlov
65 * Mixture ArCO2 is corrected
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
70 * Revision 1.89 2005/05/28 12:10:07 schutz
71 * Copy constructor is corrected (by T.P.)
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.
82 //*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH)
83 //////////////////////////////////////////////////////////////////////////////
86 // --- ROOT system ---
90 #include <TVirtualMC.h>
95 // --- Standard library ---
97 // --- AliRoot header files ---
100 #include "AliPHOSGetter.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"
109 #include "AliCDBManager.h"
110 #include "AliCDBEntry.h"
111 #include "AliCDBStorage.h"
112 #include "AliPHOSCalibData.h"
113 #include "AliPHOSPulseGenerator.h"
118 //____________________________________________________________________________
119 AliPHOS:: AliPHOS() : AliDetector()
126 //____________________________________________________________________________
127 AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
129 // ctor : title is used to identify the layout
132 //____________________________________________________________________________
137 //____________________________________________________________________________
138 AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
140 return new AliPHOSDigitizer(manager);
143 //____________________________________________________________________________
144 void AliPHOS::CreateMaterials()
146 // Definitions of materials to build PHOS and associated tracking media.
147 // media number in idtmed are 699 to 798.
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} ;
155 AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
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} ;
164 AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
167 AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
168 // --- Absorption length is ignored ^
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} ;
176 AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
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} ;
184 AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
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} ;
192 AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
195 AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
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} ;
205 AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
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} ;
213 AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
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} ;
221 AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
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 ;
229 AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
232 AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
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} ;
240 AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
243 AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
245 // --- The gas mixture ---
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 ;
252 AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
255 Float_t dAr = 0.001782 ;
256 AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;
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} ;
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) ;
269 // --- Stainless steel (let it be pure iron) ---
270 AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
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} ;
279 AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
281 // --- Cables in Air box ---
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
289 AliMixture(19, "Cables $", aCA, zCA, dCA, -4, wCA) ;
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;
298 AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
300 // DEFINITION OF THE TRACKING MEDIA
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() ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
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) ;
356 // G10: Printed Circuit material -> idtmed[711]
358 AliMedium(12, "G10 $", 12, 0,
359 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
361 // The Lead -> idtmed[712]
363 AliMedium(13, "Lead $", 13, 0,
364 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
366 // The gas mixture: ArCo2 -> idtmed[715]
368 AliMedium(16, "ArCo2 $", 16, 1,
369 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
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) ;
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) ;
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) ;
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) ;
387 // --- Set decent energy thresholds for gamma and electron tracking
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) ;
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.) ;
422 //____________________________________________________________________________
423 void AliPHOS::Digits2Raw()
425 // convert digits of the current event to raw data
427 AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ;
430 loader->LoadDigits();
431 TClonesArray* digits = loader->Digits() ;
434 AliError(Form("No digits found !"));
439 AliPHOSGeometry* geom = GetGeometry();
441 AliError(Form("No geometry found !"));
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
449 AliAltroBuffer* buffer = NULL;
452 // Create a shaper pulse object
453 AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
455 Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
456 Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
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)
471 geom->AbsToRelNumbering(digit->GetId(), relId);
472 Int_t module = relId[0];
476 continue; // ignore digits from CPV
479 Int_t row = relId[2]-1;
480 Int_t col = relId[3]-1;
485 if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0;
488 if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1;
491 if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2;
494 if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3;
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;
502 if (iDDL != prevDDL) {
503 // write real header and close previous file
506 buffer->WriteDataHeader(kFALSE, kFALSE);
510 // open new file and write dummy header
511 TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
513 TString path = gSystem->Getenv("ALICE_ROOT");
514 path += "/PHOS/mapping/RCU";
518 AliAltroMapping* mapping = new AliCaloAltroMapping(path.Data());
519 buffer = new AliAltroBuffer(fileName.Data(),mapping);
520 buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy;
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
536 // calculate the time response function
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;}
545 energy = 0; // CPV raw data format is now know yet
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);
558 // write real header and close last file
561 buffer->WriteDataHeader(kFALSE, kFALSE);
565 AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n",
566 modMax,colMax,rowMax,eMax));
569 loader->UnloadDigits();
572 //____________________________________________________________________________
573 void AliPHOS::Hits2SDigits()
575 // create summable digits
577 AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
578 phosDigitizer.SetEventRange(0, -1) ; // do all the events
579 phosDigitizer.ExecuteTask("all") ;
582 //____________________________________________________________________________
583 AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
585 //different behaviour than standard (singleton getter)
586 // --> to be discussed and made eventually coherent
587 fLoader = new AliPHOSLoader(GetName(),topfoldername);
591 //____________________________________________________________________________
592 void AliPHOS::SetTreeAddress()
594 // Links Hits in the Tree to Hits array
597 sprintf(branchname,"%s",GetName());
598 // Branch address for hit tree
599 TTree *treeH = TreeH();
601 branch = treeH->GetBranch(branchname);
604 if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
605 //AliInfo(Form("<%s> Setting Hits Address",GetName()));
606 branch->SetAddress(&fHits);