]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONDigitizerv2.cxx
New segmentation with switch between old and new (Ch. Finck)
[u/mrichter/AliRoot.git] / MUON / AliMUONDigitizerv2.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
16 /* $Id$ */
17
18 //  Do the Digitization (Digit) from summable Digits (SDigit)
19 //  Allow the merging of signal file with background file(s).
20
21 /////////////////////////////////////////////////////////////////////////////////
22 //
23 // AliMUONDigitizerv2 digitizes digits from s-digits. 
24 // Merging is allowed from multiple input streams. The first input stream is 
25 // assumed to be the signal and all other input streams as assumed to be 
26 // background.
27 // Chamber response is applied to the digits identically to AliMUONDigitizerv1.
28 //
29 /////////////////////////////////////////////////////////////////////////////////
30
31 #include "AliMUONData.h"
32 #include "AliMUONLoader.h"
33 #include "AliMUONConstants.h"
34 #include "AliMUONDigit.h"
35 #include "AliMUONDigitizerv2.h"
36 #include "AliMUONTransientDigit.h"
37 #include "AliLog.h"
38
39 ClassImp(AliMUONDigitizerv2)
40
41 //___________________________________________
42 AliMUONDigitizerv2::AliMUONDigitizerv2() : AliMUONDigitizerv1()
43 {
44         // Default ctor - don't use it
45 }
46
47 //___________________________________________
48 AliMUONDigitizerv2::AliMUONDigitizerv2(AliRunDigitizer* manager) : AliMUONDigitizerv1(manager)
49 {
50         // ctor which should be used
51 }
52
53 //___________________________________________
54 AliMUONDigitizerv2::~AliMUONDigitizerv2()
55 {
56         // Destructor
57 }
58
59 //-----------------------------------------------------------------------
60 void AliMUONDigitizerv2::GenerateTransientDigits()
61 {
62 // Loop over all chambers and s-digits in the input stream and create 
63 // AliMUONTransientDigit objects from them. These are then added to fTDList.
64
65         AliDebug(2,"Generating transient digits using treeH = 0x%X");
66         //
67         // Loop over SDigits
68         Int_t ndig, k;
69         AliMUONDigit* sDigit;
70         TClonesArray* muonSDigits;
71         for (Int_t ich = 0; ich < AliMUONConstants::NCh(); ich++)  // loop over chamber
72         {
73                 fMUONData->ResetSDigits();
74                 fMUONData->GetCathodeS(0);
75                 muonSDigits = fMUONData->SDigits(ich); 
76                 ndig = muonSDigits->GetEntriesFast();
77                 for (k = 0; k < ndig; k++)
78                 {
79                         sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k);
80                         MakeTransientDigitFromSDigit(ich,sDigit);
81                 }
82                 fMUONData->ResetSDigits();
83                 fMUONData->GetCathodeS(1);
84                 muonSDigits = fMUONData->SDigits(ich); 
85                 ndig=muonSDigits->GetEntriesFast();
86                 for (k = 0; k < ndig; k++)
87                 {
88                         sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k);
89                         MakeTransientDigitFromSDigit(ich,sDigit);
90                 }
91         } // SDigits loop, end loop over chamber
92 }
93
94 //------------------------------------------------------------------------
95 void AliMUONDigitizerv2::MakeTransientDigitFromSDigit(Int_t iChamber, AliMUONDigit* sDigit)
96 {
97 // Makes a transient digit from the specified s-digit from the specified chamber. 
98 // Once the digit is created it is added to the fTDList.
99
100         AliDebug(4,Form("Making transient digit from s-digit for chamber %d.", iChamber));
101         Int_t digits[7];
102         //
103         // Creating a new TransientDigits from SDigit
104         digits[0] = sDigit->PadX();  // Padx of the Digit
105         digits[1] = sDigit->PadY();  // Pady of the Digit
106         digits[2] = sDigit->Cathode()+1;  // Cathode plane
107         digits[3] = sDigit->Signal();  // Induced charge in the Pad
108         if (fSignal)
109                 digits[4] = sDigit->Signal();
110         else
111                 digits[4] = 0;
112                 
113         digits[5] = sDigit->Hit();    // Hit number in the list
114         if (GetSegmentation() == 1)
115           digits[6] = 0;
116         else
117           digits[6] = sDigit->DetElemId();
118
119         AliDebug(5,Form("Made digit from sDigit 0x%X: PadX %d\tPadY %d\tPlane %d\tCharge %d\tHit %d\tidDE %d",
120                         (void*)sDigit, digits[0], digits[1], digits[2], digits[3], digits[5], digits[6]));
121
122         
123         AliMUONTransientDigit* mTD = new AliMUONTransientDigit(iChamber, digits);
124         // Copy list of tracks and trackcharge
125         for(Int_t itrack = 0; itrack < kMAXTRACKS; itrack++)
126         {
127                 Int_t track = sDigit->Track(itrack);
128                 if (track < 0) break;  // Check if we reached the end of the track list.
129                 mTD->AddToTrackList( track + fMask, sDigit->TrackCharge(itrack) );
130         }
131
132         OnCreateTransientDigit(mTD, sDigit);
133         AddOrUpdateTransientDigit(mTD);
134 }
135
136 //------------------------------------------------------------------------
137 void AliMUONDigitizerv2::AddDigit(Int_t chamber, Int_t tracks[kMAXTRACKS], Int_t charges[kMAXTRACKS], Int_t digits[7])
138 {
139 // Override to add new digits to the digits tree TreeD.
140         fMUONData->AddDigit(chamber, tracks, charges, digits);   
141 }
142
143 //------------------------------------------------------------------------
144 Bool_t AliMUONDigitizerv2::InitInputData(AliMUONLoader* muonloader)
145 {
146 // Overridden to initialize fMUONData to read from the s-digits tree TreeS. 
147 // If the s-digits are not loaded then the muon loader is used to load the
148 // s-digits into memory.
149
150         AliDebug(3,"Loading s-digits in READ mode and setting the tree address.");
151         fMUONData->SetLoader(muonloader);
152
153         if (muonloader->TreeS() == NULL)
154         {
155                 muonloader->LoadSDigits("READ");
156                 if (muonloader->TreeS() == NULL)
157                 {
158                         AliError("Can not load the s-digits tree.");
159                         return kFALSE;
160                 }
161         }
162
163         fMUONData->SetTreeAddress("S");
164         return kTRUE;
165 }
166
167 //------------------------------------------------------------------------
168 void AliMUONDigitizerv2::CleanupInputData(AliMUONLoader* muonloader)
169 {
170 // Overridden to release and unload s-digits from memory.
171
172         AliDebug(3,"Releasing loaded s-digits.");
173         fMUONData->ResetSDigits();
174         muonloader->UnloadSDigits();
175 }