]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONDigitizerv2.cxx
Updated Foam, FR4 thickness:
[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 "AliMUON.h"
32 #include "AliMUONData.h"
33 #include "AliMUONLoader.h"
34 #include "AliMUONConstants.h"
35 #include "AliMUONChamber.h"
36 #include "AliMUONDigit.h"
37 #include "AliMUONDigitizerv2.h"
38 #include "AliMUONTransientDigit.h"
39 #include "AliMUONTriggerDecision.h"
40 #include "AliLog.h"
41
42 ClassImp(AliMUONDigitizerv2)
43
44 //___________________________________________
45 AliMUONDigitizerv2::AliMUONDigitizerv2() : AliMUONDigitizer()
46 {
47         // Default ctor - don't use it
48 }
49
50 //___________________________________________
51 AliMUONDigitizerv2::AliMUONDigitizerv2(AliRunDigitizer* manager) : AliMUONDigitizer(manager)
52 {
53         // ctor which should be used
54 }
55
56 //___________________________________________
57 AliMUONDigitizerv2::~AliMUONDigitizerv2()
58 {
59         // Destructor
60 }
61
62 //-----------------------------------------------------------------------
63 void AliMUONDigitizerv2::GenerateTransientDigits()
64 {
65 // Loop over all chambers and s-digits in the input stream and create 
66 // AliMUONTransientDigit objects from them. These are then added to fTDList.
67
68         AliDebug(2,"Generating transient digits using treeH = 0x%X");
69         //
70         // Loop over SDigits
71         Int_t ndig, k;
72         AliMUONDigit* sDigit;
73         TClonesArray* muonSDigits;
74         for (Int_t ich = 0; ich < AliMUONConstants::NCh(); ich++)  // loop over chamber
75         {
76                 fMUONData->ResetSDigits();
77                 fMUONData->GetSDigits();
78                 muonSDigits = fMUONData->SDigits(ich); 
79                 ndig = muonSDigits->GetEntriesFast();
80                 for (k = 0; k < ndig; k++)
81                 {
82                         sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k);
83                         MakeTransientDigitFromSDigit(ich,sDigit);
84                 }
85 //              fMUONData->ResetSDigits();
86 //              fMUONData->GetCathodeS(1);
87 //              muonSDigits = fMUONData->SDigits(ich); 
88 //              ndig=muonSDigits->GetEntriesFast();
89 //              for (k = 0; k < ndig; k++)
90 //              {
91 //                      sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k);
92 //                      MakeTransientDigitFromSDigit(ich,sDigit);
93 //              }
94         } // SDigits loop, end loop over chamber
95 }
96
97 //------------------------------------------------------------------------
98 void AliMUONDigitizerv2::MakeTransientDigitFromSDigit(Int_t iChamber, AliMUONDigit* sDigit)
99 {
100 // Makes a transient digit from the specified s-digit from the specified chamber. 
101 // Once the digit is created it is added to the fTDList.
102
103         AliDebug(4,Form("Making transient digit from s-digit for chamber %d.", iChamber));
104         Int_t digits[7];
105         //
106         // Creating a new TransientDigits from SDigit
107         digits[0] = sDigit->PadX();  // Padx of the Digit
108         digits[1] = sDigit->PadY();  // Pady of the Digit
109         digits[2] = sDigit->Cathode()+1;  // Cathode plane
110         digits[3] = sDigit->Signal();  // Induced charge in the Pad
111         if (fSignal)
112                 digits[4] = sDigit->Signal();
113         else
114                 digits[4] = 0;
115                 
116         digits[5] = sDigit->Hit();    // Hit number in the list
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 Int_t AliMUONDigitizerv2::GetSignalFrom(AliMUONTransientDigit* td)
145 {
146 // Derived to apply the chamber response model to the digit. 
147 // Using AliMUONChamber::ResponseModel() for this.
148
149         AliDebug(4, "Applying response of chamber to TransientDigit signal.");
150         //
151         //  Digit Response (noise, threshold, saturation, ...)
152         Int_t q = td->Signal(); 
153         AliMUONChamber& chamber = fMUON->Chamber(td->Chamber());
154         AliMUONResponse* response = chamber.ResponseModel();
155         q = response->DigitResponse(q, td);
156   if ( q >= response->Saturation() )
157   {
158     td->Saturated(kTRUE);
159   }
160         return q;
161 }
162
163 //------------------------------------------------------------------------
164 Bool_t AliMUONDigitizerv2::InitInputData(AliMUONLoader* muonloader)
165 {
166 // Overridden to initialize fMUONData to read from the s-digits tree TreeS. 
167 // If the s-digits are not loaded then the muon loader is used to load the
168 // s-digits into memory.
169
170         AliDebug(3,"Loading s-digits in READ mode and setting the tree address.");
171         fMUONData->SetLoader(muonloader);
172
173         if (muonloader->TreeS() == NULL)
174         {
175                 muonloader->LoadSDigits("READ");
176                 if (muonloader->TreeS() == NULL)
177                 {
178                         AliError("Can not load the s-digits tree.");
179                         return kFALSE;
180                 }
181         }
182
183         fMUONData->SetTreeAddress("S");
184         return kTRUE;
185 }
186
187 //------------------------------------------------------------------------
188 void AliMUONDigitizerv2::CleanupInputData(AliMUONLoader* muonloader)
189 {
190 // Overridden to release and unload s-digits from memory.
191
192         AliDebug(3,"Releasing loaded s-digits.");
193         fMUONData->ResetSDigits();
194         muonloader->UnloadSDigits();
195 }
196
197 //------------------------------------------------------------------------
198 Bool_t AliMUONDigitizerv2::InitOutputData(AliMUONLoader* muonloader)
199 {
200 // Derived to initialize the output digits tree TreeD, create it if necessary
201 // and sets the fMUONData tree address to treeD.
202
203         AliDebug(3, "Creating digits branch and setting the tree address.");
204
205         fMUONData->SetLoader(muonloader);
206
207         // New branch per chamber for MUON digit in the tree of digits
208         if (muonloader->TreeD() == NULL)
209         {
210                 muonloader->MakeDigitsContainer();
211                 if (muonloader->TreeD() == NULL)
212                 {
213                         AliError("Could not create TreeD.");
214                         return kFALSE;
215                 }
216         }
217
218         fMUONData->MakeBranch("D");
219         fMUONData->SetTreeAddress("D");
220         
221         return kTRUE;
222 }
223
224 //------------------------------------------------------------------------
225 void AliMUONDigitizerv2::FillOutputData()
226 {
227 // Derived to fill TreeD and resets the digit array in fMUONData.
228
229         AliDebug(3, "Filling trees with digits.");
230         fMUONData->Fill("D");
231         fMUONData->ResetDigits();
232 }
233
234 //------------------------------------------------------------------------
235 void AliMUONDigitizerv2::CleanupOutputData(AliMUONLoader* muonloader)
236 {
237 // Derived to write the digits tree and then unload the digits tree once written.
238
239         AliDebug(3, "Writing digits and releasing pointers.");
240         muonloader->WriteDigits("OVERWRITE");
241         muonloader->UnloadDigits();
242 }
243
244 //-----------------------------------------------------------------------
245
246 void AliMUONDigitizerv2::CleanupTriggerArrays()
247 {
248   fTrigDec->ClearDigits();
249 }
250
251 //------------------------------------------------------------------------
252 void AliMUONDigitizerv2::AddDigitTrigger(
253                 Int_t chamber, Int_t tracks[kMAXTRACKS],
254                 Int_t charges[kMAXTRACKS], Int_t digits[7],
255                 Int_t digitindex
256         )
257 {
258 // Derived to add digits to TreeD for trigger.
259   fTrigDec->AddDigit(chamber, tracks, charges, digits, digitindex); 
260 }
261
262 //------------------------------------------------------------------------
263 void AliMUONDigitizerv2::FillTriggerOutput()
264 {
265 // Derived to fill TreeD and resets the trigger array in fMUONData.
266
267         AliDebug(3,"Filling trees with trigger.");
268         fMUONData->Fill("GLT");
269         fMUONData->ResetTrigger();
270 }
271
272 //------------------------------------------------------------------------
273 void AliMUONDigitizerv2::CreateTrigger()
274 {
275   fMUONData->MakeBranch("GLT");
276   fMUONData->SetTreeAddress("GLT");
277   fTrigDec->Digits2Trigger(); 
278   FillTriggerOutput();  
279
280 }