3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
6 * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
8 * See cxx source for full Copyright notice
11 @author Christian Holm Christensen <cholm@nbi.dk>
12 @date Sun Mar 26 17:59:37 2006
13 @brief Declaration of AliFMD detector driver
15 /** @mainpage ALICE FMD Off-line code
20 - @ref base (see also @ref FMD_base)
21 - @ref sim (see also @ref FMD_sim)
22 - @ref rec (see also @ref FMD_rec)
23 - @ref flow (see also @ref FMD_flow)
24 - @ref ana (see also @ref FMD_ana)
25 - @ref util (see also @ref FMD_util)
26 - @ref script (see also @ref FMD_script)
30 @section intro Introduction:
32 This file contains a short overview of the FMD code. It is by no
33 means authoritative - only the code is good for that. However,
34 I'll try to explain things a bit here.
36 @section structure Structure:
38 There are 4 libraries build for the FMD. These are
40 - libFMDbase: This contains the basic stuff, like data classes and
42 - libFMDsim: This contains code used by the simulation only. That
43 includes the detector class AliFMD and it's derivatives. It
44 also contains the code for building the geometry, as well as the
45 digitisers and raw data writer.
46 - libFMDrec: Code needed for the reconstruction. This include the
47 reconstruction code itself, as well as a raw data reader.
48 - libFMDutil: This is a special library that contains various
49 utility classes for the FMD expert/developer/tester. It
50 includes code to read all data produced by the FMD, a simple
51 event display, and code to make fake calibration and alignment
52 data. This library is @e not loaded by aliroot
53 automatically. The user has to load it herself:
55 gSystem->Load("libFMDutil.so");
57 The content of these libraries is detailed more below.
59 @subsection base libFMDbase:
61 This currently (18th or March 2006) contains the classes
63 - AliFMDBaseDigit, AliFMDDigit, AliFMDSDigit: Base class for
64 digits, real digits, and summable digits. The are all data
65 classes that holds the ADC value(s) for a single strip.
66 - AliFMDBoolMap: A map of booleans, one for each strip.
67 - AliFMDUShortMap: A map of unsigned short integers, one for each
69 - AliFMDDetector, AliFMD1, AliFMD2, AliFMD3: 3 classes that holds
70 the parameters for each of the 3 FMD sub-detectors. These
71 derive from AliFMDDetector, and are managed by AliFMDGeometry.
72 Each of these also contains the translation from sensor
73 reference frame to global reference frame.
74 - AliFMDRing: Parameters for the FMD rings (inner and outer type).
75 These are managed by AliFMDGeometry.
76 - AliFMDGeometry: Manager of FMD geometry data. All code queries
77 this manager for geometry parameters, so that the data is always
79 - AliFMDParameters: Manager of FMD parameters, like calibration
80 parameters. This class fetches data from CDB if necessary.
81 All code queries this manager for parameters, so that the data
83 - AliFMDCalibPedestal, AliFMDCalibGain, AliFMDCalibSampleRate,
84 AliFMDAltroMapping: Containers of calibration parameters. These
85 correspond to the pedestal and its width, the gain of each
86 strip, the oversampling rate used in read-out, and the map from
87 hardware address to detector.
88 - AliFMDAltroIO, AliFMDAltroReader, AliFMDAltroWriter: Low-level
89 classes to do input/output on ALTRO formated buffers.
93 @subsection sim libFMDsim:
95 This currently (18th or March 2006) contains the classes
97 - AliFMDEdepMap: Cache of energy deposited and total number of
98 hits for each strip. The digitiser AliFMDDigitizer uses this to
99 store simulation data before making digits.
100 - AliFMDHit: A hit in the FMD active elements, as described by the
101 simulation back-end during transport.
102 - AliFMD, AliFMDv0, AliFMDv1: Simulation drivers for the FMD.
103 AliFMD is the base class. AliFMDv0 corresponds to a simulation
104 where no hits are created, but the material distribution is
105 right. AliFMDv1 is like AliFMDv0, except that hits are
107 - AliFMDGeometryBuilder: Build the FMD geometry in terms of TGeo
108 objects. The information for building the geometry is retrieved
110 - AliFMDBaseDigitizer, AliFMDDigitizer, AliFMDSDigitizer: Base
111 class for the digitisers. AliFMDDigitizer makes `real' digits
112 (AliFMDDigit) from hits, and AliFMDSDigitizer makes summable
114 - AliFMDRawWriter: Writes a pseudo raw data file from the digits
115 created by the digitisers. It uses the AliFMDAltroMapping from
116 AliFMDParameters to make the mapping from detector coordinates
117 to hardware addresses.
119 @subsection rec libFMDrec:
121 This currently (18th or March 2006) contains the classes
123 - AliFMDReconstructor: Reconstruct (in a naiive way) the charged
124 particle multiplicity in the FMD strips. This also writes an
125 AliESDFMD object to the ESD files (that class is in libESD).
127 - AliFMDRecPoint: Reconstructed point in the FMD. These objects
128 are made AliFMDReconstructor.
130 - AliFMDRawReader: Classes to read raw data files.
132 @subsection flow libFMDflow:
134 This library contains flow analysis code that works similar to
137 @subsection ana libFMDanalysis:
139 This library contains analysis code.
142 @subsection util libFMDutil:
144 This currently (18th or March 2006) contains the classes
146 - AliFMDInput, AliFMDInputHits, AliFMDInputDigits,
147 AliFMDInputSDigits, AliFMDInputRecPoints: Base class, and
148 concrete classes to read in FMD generated data. These provide a
149 simple and unified way of getting the data. Hooks are defined
150 to process hits, tracks, digits, and reconstructed points, as
151 well as geometry and ESD data. See for example the scripts
152 @c DrawHits.C, @c DrawHitsDigits.C, @c DrawHitsRecs.C, @c
153 DrawDigitsRecs.C in the @c FMD/scripts sub-directory.
155 - AliFMDDisplay: Simple event display for FMD data, including
156 hits, digits, reconstructed points and ESD data.
158 - AliFMDCalibFaker, AliFMDAlignFaker: Classes to write fake (or
159 dummy) calibration and alignment data. These derive from
162 @section script Scripts
164 Most scripts live in @c FMD/scripts. The notiable exceptions are
165 @ref Simulate.C, @ref Reconstruct.C, and @ref Config.C
167 @section quick Quick start
169 First, install ROOT. Then Install TGeant3:
174 > cvs -d :pserver:cvs@root.cern.ch:/user/cvs login
176 > cvs -d :pserver:cvs@root.cern.ch:/user/cvs co geant3
181 Now you can install AliRoot
184 > cvs -d :pserver:cvs@alisoft.cern.ch:/soft/cvsroot login
186 > cvs -d :pserver:cvs@alisoft.cern.ch:/soft/cvsroot co AliRoot
188 > export ALICE_TARGET=`root-config --arch`
189 > export ALICE=${HOME}/alice
190 > export ALICE_ROOT=${ALICE}/AliRoot
191 > export ALICE_LEVEL=new
192 > export LD_LIBRARY_PATH=${ALICE_ROOT}/lib/tgt_${ALICE_TERGET}:${LD_LIBRARY_PATH}
193 > export PATH=${ALICE_ROOT}/bin/tgt_${ALICE_TERGET}:${PATH}
194 > export G3SYS=${ALICE}/geant3
198 To simulate one event, do something like
201 > aliroot ${ALICE_ROOT}/FMD/Simulate.C
204 To reconstruct the generated event, do
206 > aliroot ${ALICE_ROOT}/FMD/Reconstruct.C
209 Now, open the file `AliESDs.root' in AliRoot, and browse through that.
211 @section authors Authors:
213 - Alla Maevskaya <Alla.Maevskaia@cern.ch>
214 - Christian Holm Christensen <cholm@nbi.dk>
216 /** @defgroup FMD_sim Simulation */
218 //____________________________________________________________________
220 // Manager class for the FMD - Base class.
221 // AliFMDv1, AliFMDv0, and AliFMDAlla
222 // provides concrete implementations.
223 // This class is sooooo crowded
225 #ifndef ALIDETECTOR_H
226 # include <AliDetector.h>
229 # include <TArrayI.h>
239 //____________________________________________________________________
240 /** @class AliFMD AliFMD.h <FMD/AliFMD.h>
241 @brief Forward Multiplicity Detector based on Silicon wafers.
242 This class is the driver for especially simulation.
244 The Forward Multiplicity Detector consists of 3 sub-detectors FMD1,
245 FMD2, and FMD3, each of which has 1 or 2 rings of silicon sensors.
247 This is the base class for all FMD manager classes.
249 The actual code is done by various separate classes. Below is
250 diagram showing the relationship between the various FMD classes
251 that handles the simulation
254 +----------+ +----------+
255 | AliFMDv1 | | AliFMDv0 |
256 +----------+ +----------+
257 | | +-----------------+
258 +----+--------------+ +--| AliFMDDigitizer |
259 | | +-----------------+
260 | +---------------------+ |
261 | +--| AliFMDBaseDigitizer |<--+
262 V 1 | +---------------------+ |
263 +--------+<>--+ | +------------------+
264 | AliFMD | +--| AliFMDSDigitizer |
265 +--------+<>--+ +------------------+
266 1 | +---------------------+
267 +--| AliFMDReconstructor |
268 +---------------------+
272 This defines the interface for the various parts of AliROOT that
273 uses the FMD, like AliFMDSimulator, AliFMDDigitizer,
274 AliFMDReconstructor, and so on.
276 This is a concrete implementation of the AliFMD interface.
277 It is the responsibility of this class to create the FMD
280 This is a concrete implementation of the AliFMD interface.
281 It is the responsibility of this class to create the FMD
282 geometry, process hits in the FMD, and serve hits and digits to
285 This is the base class for the FMD simulation tasks. The
286 simulator tasks are responsible to implment the geoemtry, and
288 - AliFMDReconstructor
289 This is a concrete implementation of the AliReconstructor that
290 reconstructs pseudo-inclusive-multiplicities from digits (raw or
293 Calibration and geometry parameters are managed by separate
294 singleton managers. These are AliFMDGeometry and
295 AliFMDParameters. Please refer to these classes for more
296 information on these.
298 class AliFMD : public AliDetector
301 /** Default constructor. Do not use. */
303 /** Normal constructor
304 @param name Name of object.
305 @param title Title of object. */
306 AliFMD(const char *name, const char *title);
309 /** Wheter to make a detailed geometry
310 @param use If true, make detailed geometry */
311 void UseDetailed(Bool_t use=kTRUE) { fDetailed = use; }
314 /** @name GEometry ANd Tracking (GEANT :-) */
315 /** Define the geometry. This is done by asking the manager
316 AliFMDGeometry to construct the geometry. This in turn calls
317 AliFMDGeometryBuilder. */
318 virtual void CreateGeometry();
319 /** Create entries for alignable volumes associating the symbolic volume
320 name with the corresponding volume path. Needs to be syncronized with
321 eventual changes in the geometry. */
322 virtual void AddAlignableVolumes() const;
323 /** Create the tracking mediums used by the FMD. This associates
324 the tracking mediums defined with the FMD in the
325 TVirtualMCApplication (AliMC).
327 The defined mediums are
328 - @c FMD @c Si$ Silicon (active medium in sensors)
329 - @c FMD @c C$ Carbon fibre (support cone for FMD3 and vacuum pipe)
330 - @c FMD @c Al$ Aluminium (honeycomb support plates)
331 - @c FMD @c PCB$ Printed Circuit Board (FEE board with VA1_3)
332 - @c FMD @c Chip$ Electronics chips (currently not used)
333 - @c FMD @c Air$ Air (Air in the FMD)
334 - @c FMD @c Plastic$ Plastic (Support legs for the hybrid cards)
336 virtual void CreateMaterials();
338 * Declare tracking parameters for a medium
340 * Cut offs are in GeV.
341 * @param imed Medium identifier
342 * @param gamma Cut off for tracking photons
343 * @param electron Cut off for tracking electrons
344 * @param neutral_hadron Cut off for tracking neutral hadrons
345 * @param charged_hadron Cut off for tracking charged hadrons
346 * @param muon Cut off for tracking muons
347 * @param electron_bremstrahlung Cut off for tracking electron brehmstralung
348 * @param muon__bremstrahlung Cut off for tracking muon brehmstralung
349 * @param electron_delta Cut off for tracking delta electrons
350 * @param muon_delta Cut off for tracking delta muons
351 * @param muon_pair Cut off for muon->ee pair production
352 * @param annihilation Enable annihilation
353 * @param bremstrahlung Enable brehmstralung
354 * @param compton_scattering Enable Compton scattering
355 * @param decay Enable decays
356 * @param delta_ray Enable delta rays
357 * @param hadronic Enable hadronic interactions
358 * @param energy_loss Enable energy loss
359 * @param multiple_scattering Enable multiple scattering
360 * @param pair_production Enable pair production
361 * @param photon_production Enable cherenkov photon production
362 * @param rayleigh_scattering Enable rayleigh scattering
364 void SetTrackingParameters(Int_t imed,
367 Float_t neutral_hadron,
368 Float_t charged_hadron,
370 Float_t electron_bremstrahlung,
371 Float_t muon__bremstrahlung,
372 Float_t electron_delta,
377 Int_t compton_scattering,
382 Int_t multiple_scattering,
383 Int_t pair_production,
384 Int_t photon_production,
385 Int_t rayleigh_scattering);
386 /** Initialize this detector */
388 /** This member function is called when ever a track deposites
389 energy (or similar) in an FMD tracking medium. In this base
390 class this member function is pure abstract. In concrete
391 sub-classes, the member function may make hits or other
393 virtual void StepManager() = 0;
394 /** Called at the end of each simulation event. If the debug level
395 is high enough a list of @e bad hits is printed. */
396 virtual void FinishEvent();
400 /** @name Graphics and event display */
401 /** Draw a shaded view of the Forward multiplicity detector. This
402 isn't really useful anymore. */
403 virtual void DrawDetector() {}
407 /** @name Hit and digit management */
408 /* Create Tree branches for the FMD.
410 - @c H Make a branch of TClonesArray of AliFMDHit's
411 - @c D Make a branch of TClonesArray of AliFMDDigit's
412 - @c S Make a branch of TClonesArray of AliFMDSDigit's */
413 virtual void MakeBranch(Option_t *opt=" ");
414 /** Set the TClonesArray to read hits into.
415 @param b The branch to containn the hits */
416 virtual void SetHitsAddressBranch(TBranch *b);
417 /** Set the TClonesArray to read sdigits into.
418 @param b The branch to containn the sdigits */
419 virtual void SetSDigitsAddressBranch(TBranch *b);
420 /** Set branch address for the Hits, Digits, and SDigits Tree. */
421 virtual void SetTreeAddress();
422 /** Get the array of summable digits
423 @return summable digits */
424 virtual TClonesArray* SDigits() { return fSDigits; }
425 /** Reset the array of summable digits */
426 virtual void ResetSDigits();
427 /** Add a hit to the hits tree
429 @param vol Volume parameters, interpreted as
430 - ivol[0] [UShort_t ] Detector #
431 - ivol[1] [Char_t ] Ring ID
432 - ivol[2] [UShort_t ] Sector #
433 - ivol[3] [UShort_t ] Strip #
434 @param hits Hit information
435 - hits[0] [Float_t ] Track's X-coordinate at hit
436 - hits[1] [Float_t ] Track's Y-coordinate at hit
437 - hits[3] [Float_t ] Track's Z-coordinate at hit
438 - hits[4] [Float_t ] X-component of track's momentum
439 - hits[5] [Float_t ] Y-component of track's momentum
440 - hits[6] [Float_t ] Z-component of track's momentum
441 - hits[7] [Float_t ] Energy deposited by track
442 - hits[8] [Int_t ] Track's particle Id #
443 - hits[9] [Float_t ] Time when the track hit */
444 virtual void AddHit(Int_t track, Int_t *vol, Float_t *hits);
445 /** Add a hit to the list
447 @param detector Detector # (1, 2, or 3)
448 @param ring Ring ID ('I' or 'O')
449 @param sector Sector # (For inner/outer rings: 0-19/0-39)
450 @param strip Strip # (For inner/outer rings: 0-511/0-255)
451 @param x Track's X-coordinate at hit
452 @param y Track's Y-coordinate at hit
453 @param z Track's Z-coordinate at hit
454 @param px X-component of track's momentum
455 @param py Y-component of track's momentum
456 @param pz Z-component of track's momentum
457 @param edep Energy deposited by track
458 @param pdg Track's particle Id #
459 @param t Time when the track hit
460 @param len Track length through the material.
461 @param stopped Whether track was stopped or disappeared */
462 virtual AliFMDHit* AddHitByFields(Int_t track,
477 Bool_t stopped=kFALSE);
478 /** Add a digit to the Digit tree
480 - digits[0] [UShort_t] Detector #
481 - digits[1] [Char_t] Ring ID
482 - digits[2] [UShort_t] Sector #
483 - digits[3] [UShort_t] Strip #
484 - digits[4] [UShort_t] ADC Count
485 - digits[5] [Short_t] ADC Count, -1 if not used
486 - digits[6] [Short_t] ADC Count, -1 if not used
487 @param notused Not used */
488 virtual void AddDigit(Int_t *digits, Int_t* notused=0);
490 @param detector Detector # (1, 2, or 3)
491 @param ring Ring ID ('I' or 'O')
492 @param sector Sector # (For inner/outer rings: 0-19/0-39)
493 @param strip Strip # (For inner/outer rings: 0-511/0-255)
494 @param count1 ADC count (a 10-bit word)
495 @param count2 ADC count (a 10-bit word), or -1 if not used
496 @param count3 ADC count (a 10-bit word), or -1 if not used */
497 virtual void AddDigitByFields(UShort_t detector=0,
507 /** Add a digit to the Digit tree
509 - digits[0] [UShort_t] Detector #
510 - digits[1] [Char_t] Ring ID
511 - digits[2] [UShort_t] Sector #
512 - digits[3] [UShort_t] Strip #
513 - digits[4] [Float_t] Edep
514 - digits[5] [UShort_t] ADC Count
515 - digits[6] [Short_t] ADC Count, -1 if not used
516 - digits[7] [Short_t] ADC Count, -1 if not used
517 - digits[8] [Short_t] ADC Count, -1 if not used
518 - digits[9] [UShort_t] N total particles
519 - digits[10] [UShort_t] N total primary particles
521 virtual void AddSDigit(Int_t *digits);
522 /** add a summable digit - as coming from data
523 @param detector Detector # (1, 2, or 3)
524 @param ring Ring ID ('I' or 'O')
525 @param sector Sector # (For inner/outer rings: 0-19/0-39)
526 @param strip Strip # (For inner/outer rings: 0-511/0-255)
527 @param edep Energy deposited
528 @param count1 ADC count (a 10-bit word)
529 @param count2 ADC count (a 10-bit word), or -1 if not used
530 @param count3 ADC count (a 10-bit word), or -1 if not used */
531 virtual void AddSDigitByFields(UShort_t detector=0,
546 /** @name Digitisation */
547 /** Create a digitizer object
548 @param manager Digitization manager
549 @return a newly allocated AliFMDDigitizer */
550 virtual AliDigitizer* CreateDigitizer(AliRunDigitizer* manager) const;
551 /** Create AliFMDDigit's from AliFMDHit's. This is done by creating
552 an AliFMDDigitizer object, and executing it. */
553 virtual void Hits2Digits();
554 /** Create AliFMDSDigit's from AliFMDHit's. This is done by creating
555 an AliFMDSDigitizer object, and executing it. */
556 virtual void Hits2SDigits();
560 /** @name Raw data */
562 * Turn digits into raw data. This uses the class AliFMDRawWriter to
563 * do the job. Please refer to that class for more information.
565 virtual void Digits2Raw();
567 * Convert raw data to sdigits
569 * @param reader Raw reader
571 * @return @c true on success
573 virtual Bool_t Raw2SDigits(AliRawReader* reader);
583 * @param b Browser to show this object in
585 void Browse(TBrowser* b);
588 /** Initialize hit array if not already done, and return pointert.
590 TClonesArray* HitsArray();
591 /** Initialize digit array if not already done, and return pointert.
592 @return Digit array */
593 TClonesArray* DigitsArray();
594 /** Initialize summable digit array if not already done, and return
596 @return Summable digit array */
597 TClonesArray* SDigitsArray();
599 TClonesArray* fSDigits; // Summable digits
600 Int_t fNsdigits; // Number of digits
601 Bool_t fDetailed; // Use detailed geometry
602 Bool_t fUseOld; // Use old approx geometry
603 Bool_t fUseAssembly; // Use divided volumes
606 kSiId, // ID index of Si medium
607 kAirId, // ID index of Air medium
608 kPlasticId, // ID index of Plastic medium
609 kPcbId, // ID index of PCB medium
610 kSiChipId, // ID index of Si Chip medium
611 kAlId, // ID index of Al medium
612 kCarbonId, // ID index of Carbon medium
613 kCopperId, // ID index of Copper Medium
614 kKaptonId, // ID index of Kapton Medium
615 kSteelId // ID index of Steel medium
618 TObjArray* fBad; //! debugging - bad hits
622 @param other Object to copy from */
623 AliFMD(const AliFMD& other);
624 /** Assignment operator
625 @param other Object to assign from
626 @return Reference to this object */
627 AliFMD& operator=(const AliFMD& other);
629 ClassDef(AliFMD,11) // Base class FMD entry point
633 //____________________________________________________________________