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 **************************************************************************/
18 // Do the Digitization (Digit) from summable Digits (SDigit)
19 // Allow the merging of signal file with background file(s).
21 /////////////////////////////////////////////////////////////////////////////////
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
27 // Chamber response is applied to the digits identically to AliMUONDigitizerv1.
29 /////////////////////////////////////////////////////////////////////////////////
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"
42 ClassImp(AliMUONDigitizerv2)
44 //___________________________________________
45 AliMUONDigitizerv2::AliMUONDigitizerv2() : AliMUONDigitizer()
47 // Default ctor - don't use it
50 //___________________________________________
51 AliMUONDigitizerv2::AliMUONDigitizerv2(AliRunDigitizer* manager) : AliMUONDigitizer(manager)
53 // ctor which should be used
56 //___________________________________________
57 AliMUONDigitizerv2::~AliMUONDigitizerv2()
62 //-----------------------------------------------------------------------
63 void AliMUONDigitizerv2::GenerateTransientDigits()
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.
68 AliDebug(2,"Generating transient digits using treeH = 0x%X");
73 TClonesArray* muonSDigits;
74 for (Int_t ich = 0; ich < AliMUONConstants::NCh(); ich++) // loop over chamber
76 fMUONData->ResetSDigits();
77 fMUONData->GetCathodeS(0);
78 muonSDigits = fMUONData->SDigits(ich);
79 ndig = muonSDigits->GetEntriesFast();
80 for (k = 0; k < ndig; k++)
82 sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k);
83 MakeTransientDigitFromSDigit(ich,sDigit);
85 fMUONData->ResetSDigits();
86 fMUONData->GetCathodeS(1);
87 muonSDigits = fMUONData->SDigits(ich);
88 ndig=muonSDigits->GetEntriesFast();
89 for (k = 0; k < ndig; k++)
91 sDigit = (AliMUONDigit*) muonSDigits->UncheckedAt(k);
92 MakeTransientDigitFromSDigit(ich,sDigit);
94 } // SDigits loop, end loop over chamber
97 //------------------------------------------------------------------------
98 void AliMUONDigitizerv2::MakeTransientDigitFromSDigit(Int_t iChamber, AliMUONDigit* sDigit)
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.
103 AliDebug(4,Form("Making transient digit from s-digit for chamber %d.", iChamber));
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
112 digits[4] = sDigit->Signal();
116 digits[5] = sDigit->Hit(); // Hit number in the list
117 if (GetSegmentation() == 1)
120 digits[6] = sDigit->DetElemId();
122 AliDebug(5,Form("Made digit from sDigit 0x%X: PadX %d\tPadY %d\tPlane %d\tCharge %d\tHit %d\tidDE %d",
123 (void*)sDigit, digits[0], digits[1], digits[2], digits[3], digits[5], digits[6]));
126 AliMUONTransientDigit* mTD = new AliMUONTransientDigit(iChamber, digits);
127 // Copy list of tracks and trackcharge
128 for(Int_t itrack = 0; itrack < kMAXTRACKS; itrack++)
130 Int_t track = sDigit->Track(itrack);
131 if (track < 0) break; // Check if we reached the end of the track list.
132 mTD->AddToTrackList( track + fMask, sDigit->TrackCharge(itrack) );
135 OnCreateTransientDigit(mTD, sDigit);
136 AddOrUpdateTransientDigit(mTD);
139 //------------------------------------------------------------------------
140 void AliMUONDigitizerv2::AddDigit(Int_t chamber, Int_t tracks[kMAXTRACKS], Int_t charges[kMAXTRACKS], Int_t digits[7])
142 // Override to add new digits to the digits tree TreeD.
143 fMUONData->AddDigit(chamber, tracks, charges, digits);
146 //------------------------------------------------------------------------
147 Int_t AliMUONDigitizerv2::GetSignalFrom(AliMUONTransientDigit* td)
149 // Derived to apply the chamber response model to the digit.
150 // Using AliMUONChamber::ResponseModel() for this.
152 AliDebug(4, "Applying response of chamber to TransientDigit signal.");
154 // Digit Response (noise, threshold, saturation, ...)
155 Int_t q = td->Signal();
156 AliMUONChamber& chamber = fMUON->Chamber(td->Chamber());
157 AliMUONResponse* response = chamber.ResponseModel();
158 q = response->DigitResponse(q, td);
162 //------------------------------------------------------------------------
163 Bool_t AliMUONDigitizerv2::InitInputData(AliMUONLoader* muonloader)
165 // Overridden to initialize fMUONData to read from the s-digits tree TreeS.
166 // If the s-digits are not loaded then the muon loader is used to load the
167 // s-digits into memory.
169 AliDebug(3,"Loading s-digits in READ mode and setting the tree address.");
170 fMUONData->SetLoader(muonloader);
172 if (muonloader->TreeS() == NULL)
174 muonloader->LoadSDigits("READ");
175 if (muonloader->TreeS() == NULL)
177 AliError("Can not load the s-digits tree.");
182 fMUONData->SetTreeAddress("S");
186 //------------------------------------------------------------------------
187 void AliMUONDigitizerv2::CleanupInputData(AliMUONLoader* muonloader)
189 // Overridden to release and unload s-digits from memory.
191 AliDebug(3,"Releasing loaded s-digits.");
192 fMUONData->ResetSDigits();
193 muonloader->UnloadSDigits();
196 //------------------------------------------------------------------------
197 Bool_t AliMUONDigitizerv2::InitOutputData(AliMUONLoader* muonloader)
199 // Derived to initialize the output digits tree TreeD, create it if necessary
200 // and sets the fMUONData tree address to treeD.
202 AliDebug(3, "Creating digits branch and setting the tree address.");
204 fMUONData->SetLoader(muonloader);
206 // New branch per chamber for MUON digit in the tree of digits
207 if (muonloader->TreeD() == NULL)
209 muonloader->MakeDigitsContainer();
210 if (muonloader->TreeD() == NULL)
212 AliError("Could not create TreeD.");
217 fMUONData->MakeBranch("D");
218 fMUONData->SetTreeAddress("D");
223 //------------------------------------------------------------------------
224 void AliMUONDigitizerv2::FillOutputData()
226 // Derived to fill TreeD and resets the digit array in fMUONData.
228 AliDebug(3, "Filling trees with digits.");
229 fMUONData->Fill("D");
230 fMUONData->ResetDigits();
233 //------------------------------------------------------------------------
234 void AliMUONDigitizerv2::CleanupOutputData(AliMUONLoader* muonloader)
236 // Derived to write the digits tree and then unload the digits tree once written.
238 AliDebug(3, "Writing digits and releasing pointers.");
239 muonloader->WriteDigits("OVERWRITE");
240 muonloader->UnloadDigits();
243 //-----------------------------------------------------------------------
245 void AliMUONDigitizerv2::CleanupTriggerArrays()
247 fTrigDec->ClearDigits();
250 //------------------------------------------------------------------------
251 void AliMUONDigitizerv2::AddDigitTrigger(Int_t chamber, Int_t tracks[kMAXTRACKS], Int_t charges[kMAXTRACKS], Int_t digits[7])
253 // Derived to add digits to TreeD for trigger.
254 fTrigDec->AddDigit(chamber, tracks, charges, digits);
257 //------------------------------------------------------------------------
258 void AliMUONDigitizerv2::FillTriggerOutput()
260 // Derived to fill TreeD and resets the trigger array in fMUONData.
262 AliDebug(3,"Filling trees with trigger.");
263 fMUONData->Fill("GLT");
264 fMUONData->ResetTrigger();
267 //------------------------------------------------------------------------
268 void AliMUONDigitizerv2::CreateTrigger()
270 fMUONData->MakeBranch("GLT");
271 fMUONData->SetTreeAddress("GLT");
272 fTrigDec->Digits2Trigger();