]>
Commit | Line | Data |
---|---|---|
30178c30 | 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$ */ | |
d1775029 | 17 | |
18 | // Do the Digitization (Digit) from summable Digits (SDigit) | |
19 | // Allow the merging of signal file with background file(s). | |
20 | ||
cf286af7 | 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 | ||
38169520 | 31 | #include "AliMUON.h" |
30178c30 | 32 | #include "AliMUONData.h" |
33 | #include "AliMUONLoader.h" | |
34 | #include "AliMUONConstants.h" | |
38169520 | 35 | #include "AliMUONChamber.h" |
30178c30 | 36 | #include "AliMUONDigit.h" |
37 | #include "AliMUONDigitizerv2.h" | |
38 | #include "AliMUONTransientDigit.h" | |
38169520 | 39 | #include "AliMUONTriggerDecision.h" |
8c343c7c | 40 | #include "AliLog.h" |
30178c30 | 41 | |
d1775029 | 42 | ClassImp(AliMUONDigitizerv2) |
43 | ||
44 | //___________________________________________ | |
38169520 | 45 | AliMUONDigitizerv2::AliMUONDigitizerv2() : AliMUONDigitizer() |
d1775029 | 46 | { |
cf286af7 | 47 | // Default ctor - don't use it |
d1775029 | 48 | } |
49 | ||
50 | //___________________________________________ | |
38169520 | 51 | AliMUONDigitizerv2::AliMUONDigitizerv2(AliRunDigitizer* manager) : AliMUONDigitizer(manager) |
d1775029 | 52 | { |
cf286af7 | 53 | // ctor which should be used |
d1775029 | 54 | } |
55 | ||
8789635b | 56 | //___________________________________________ |
57 | AliMUONDigitizerv2::~AliMUONDigitizerv2() | |
58 | { | |
59 | // Destructor | |
60 | } | |
61 | ||
cf286af7 | 62 | //----------------------------------------------------------------------- |
63 | void AliMUONDigitizerv2::GenerateTransientDigits() | |
d1775029 | 64 | { |
cf286af7 | 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. | |
d1775029 | 67 | |
8c343c7c | 68 | AliDebug(2,"Generating transient digits using treeH = 0x%X"); |
cf286af7 | 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 | { | |
30178c30 | 76 | fMUONData->ResetSDigits(); |
77 | fMUONData->GetCathodeS(0); | |
78 | muonSDigits = fMUONData->SDigits(ich); | |
cf286af7 | 79 | ndig = muonSDigits->GetEntriesFast(); |
80 | for (k = 0; k < ndig; k++) | |
81 | { | |
82 | sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k); | |
83 | MakeTransientDigitFromSDigit(ich,sDigit); | |
84 | } | |
30178c30 | 85 | fMUONData->ResetSDigits(); |
86 | fMUONData->GetCathodeS(1); | |
87 | muonSDigits = fMUONData->SDigits(ich); | |
cf286af7 | 88 | ndig=muonSDigits->GetEntriesFast(); |
89 | for (k = 0; k < ndig; k++) | |
90 | { | |
91 | sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k); | |
92 | MakeTransientDigitFromSDigit(ich,sDigit); | |
925e6570 | 93 | } |
cf286af7 | 94 | } // SDigits loop, end loop over chamber |
925e6570 | 95 | } |
d1775029 | 96 | |
97 | //------------------------------------------------------------------------ | |
cf286af7 | 98 | void AliMUONDigitizerv2::MakeTransientDigitFromSDigit(Int_t iChamber, AliMUONDigit* sDigit) |
d1775029 | 99 | { |
cf286af7 | 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. | |
d1775029 | 102 | |
8c343c7c | 103 | AliDebug(4,Form("Making transient digit from s-digit for chamber %d.", iChamber)); |
a713db22 | 104 | Int_t digits[7]; |
cf286af7 | 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 | |
002920d1 | 117 | digits[6] = sDigit->DetElemId(); |
a713db22 | 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])); | |
cf286af7 | 121 | |
cf286af7 | 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) ); | |
925e6570 | 130 | } |
cf286af7 | 131 | |
132 | OnCreateTransientDigit(mTD, sDigit); | |
133 | AddOrUpdateTransientDigit(mTD); | |
925e6570 | 134 | } |
d1775029 | 135 | |
136 | //------------------------------------------------------------------------ | |
a713db22 | 137 | void AliMUONDigitizerv2::AddDigit(Int_t chamber, Int_t tracks[kMAXTRACKS], Int_t charges[kMAXTRACKS], Int_t digits[7]) |
d1775029 | 138 | { |
cf286af7 | 139 | // Override to add new digits to the digits tree TreeD. |
30178c30 | 140 | fMUONData->AddDigit(chamber, tracks, charges, digits); |
925e6570 | 141 | } |
d1775029 | 142 | |
38169520 | 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 | return q; | |
157 | } | |
158 | ||
cf286af7 | 159 | //------------------------------------------------------------------------ |
160 | Bool_t AliMUONDigitizerv2::InitInputData(AliMUONLoader* muonloader) | |
d1775029 | 161 | { |
30178c30 | 162 | // Overridden to initialize fMUONData to read from the s-digits tree TreeS. |
cf286af7 | 163 | // If the s-digits are not loaded then the muon loader is used to load the |
164 | // s-digits into memory. | |
d1775029 | 165 | |
8c343c7c | 166 | AliDebug(3,"Loading s-digits in READ mode and setting the tree address."); |
30178c30 | 167 | fMUONData->SetLoader(muonloader); |
d1775029 | 168 | |
cf286af7 | 169 | if (muonloader->TreeS() == NULL) |
170 | { | |
171 | muonloader->LoadSDigits("READ"); | |
172 | if (muonloader->TreeS() == NULL) | |
173 | { | |
8c343c7c | 174 | AliError("Can not load the s-digits tree."); |
cf286af7 | 175 | return kFALSE; |
925e6570 | 176 | } |
177 | } | |
be42eafc | 178 | |
30178c30 | 179 | fMUONData->SetTreeAddress("S"); |
cf286af7 | 180 | return kTRUE; |
925e6570 | 181 | } |
cf286af7 | 182 | |
d1775029 | 183 | //------------------------------------------------------------------------ |
cf286af7 | 184 | void AliMUONDigitizerv2::CleanupInputData(AliMUONLoader* muonloader) |
d1775029 | 185 | { |
cf286af7 | 186 | // Overridden to release and unload s-digits from memory. |
187 | ||
8c343c7c | 188 | AliDebug(3,"Releasing loaded s-digits."); |
30178c30 | 189 | fMUONData->ResetSDigits(); |
cf286af7 | 190 | muonloader->UnloadSDigits(); |
925e6570 | 191 | } |
38169520 | 192 | |
193 | //------------------------------------------------------------------------ | |
194 | Bool_t AliMUONDigitizerv2::InitOutputData(AliMUONLoader* muonloader) | |
195 | { | |
196 | // Derived to initialize the output digits tree TreeD, create it if necessary | |
197 | // and sets the fMUONData tree address to treeD. | |
198 | ||
199 | AliDebug(3, "Creating digits branch and setting the tree address."); | |
200 | ||
201 | fMUONData->SetLoader(muonloader); | |
202 | ||
203 | // New branch per chamber for MUON digit in the tree of digits | |
204 | if (muonloader->TreeD() == NULL) | |
205 | { | |
206 | muonloader->MakeDigitsContainer(); | |
207 | if (muonloader->TreeD() == NULL) | |
208 | { | |
209 | AliError("Could not create TreeD."); | |
210 | return kFALSE; | |
211 | } | |
212 | } | |
213 | ||
214 | fMUONData->MakeBranch("D"); | |
215 | fMUONData->SetTreeAddress("D"); | |
216 | ||
217 | return kTRUE; | |
218 | } | |
219 | ||
220 | //------------------------------------------------------------------------ | |
221 | void AliMUONDigitizerv2::FillOutputData() | |
222 | { | |
223 | // Derived to fill TreeD and resets the digit array in fMUONData. | |
224 | ||
225 | AliDebug(3, "Filling trees with digits."); | |
226 | fMUONData->Fill("D"); | |
227 | fMUONData->ResetDigits(); | |
228 | } | |
229 | ||
230 | //------------------------------------------------------------------------ | |
231 | void AliMUONDigitizerv2::CleanupOutputData(AliMUONLoader* muonloader) | |
232 | { | |
233 | // Derived to write the digits tree and then unload the digits tree once written. | |
234 | ||
235 | AliDebug(3, "Writing digits and releasing pointers."); | |
236 | muonloader->WriteDigits("OVERWRITE"); | |
237 | muonloader->UnloadDigits(); | |
238 | } | |
239 | ||
240 | //----------------------------------------------------------------------- | |
241 | ||
242 | void AliMUONDigitizerv2::CleanupTriggerArrays() | |
243 | { | |
244 | fTrigDec->ClearDigits(); | |
245 | } | |
246 | ||
247 | //------------------------------------------------------------------------ | |
2be06f1e | 248 | void AliMUONDigitizerv2::AddDigitTrigger( |
249 | Int_t chamber, Int_t tracks[kMAXTRACKS], | |
250 | Int_t charges[kMAXTRACKS], Int_t digits[7], | |
251 | const Int_t digitindex | |
252 | ) | |
38169520 | 253 | { |
254 | // Derived to add digits to TreeD for trigger. | |
2be06f1e | 255 | fTrigDec->AddDigit(chamber, tracks, charges, digits, digitindex); |
38169520 | 256 | } |
257 | ||
258 | //------------------------------------------------------------------------ | |
259 | void AliMUONDigitizerv2::FillTriggerOutput() | |
260 | { | |
261 | // Derived to fill TreeD and resets the trigger array in fMUONData. | |
262 | ||
263 | AliDebug(3,"Filling trees with trigger."); | |
264 | fMUONData->Fill("GLT"); | |
265 | fMUONData->ResetTrigger(); | |
266 | } | |
267 | ||
268 | //------------------------------------------------------------------------ | |
269 | void AliMUONDigitizerv2::CreateTrigger() | |
270 | { | |
271 | fMUONData->MakeBranch("GLT"); | |
272 | fMUONData->SetTreeAddress("GLT"); | |
273 | fTrigDec->Digits2Trigger(); | |
274 | FillTriggerOutput(); | |
275 | ||
276 | } |