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 **************************************************************************/
16 /// \class AliMUONDigitMaker
17 /// MUON Digit maker from rawdata.
20 /// Using real mapping for tracker
21 /// Indranil Das (Adapted for runloader: Ch. Finck) july 05
23 /// Implemented non-constant buspatch numbers for tracking
24 /// with correct DDL id.
25 /// (Ch. Finck, dec 05)
27 /// Add reader for scaler trigger events
28 /// Use memcpy instead of assignment elt by elt
29 /// (Ch. Finck, Jan 06)
31 /// Using new interface with AliMUONRawStreamTracker(Trigger)
32 /// (New interface of AliMUONRawReader class)
33 /// (further details could be found in Alice-note)
34 /// (Ch. Finck, March 06)
36 /// Add (S)Digit maker tracker (for free)
37 /// and for trigger. Create trigger inverse mapping.
38 /// (Ch. Finck, oct 06)
40 #include "AliMUONDigitMaker.h"
41 #include "AliMUONDigit.h"
43 #include "AliMUONConstants.h"
44 #include "AliMUONData.h"
46 #include "AliMUONRawStreamTracker.h"
47 #include "AliMUONDDLTracker.h"
48 #include "AliMUONDspHeader.h"
49 #include "AliMUONBlockHeader.h"
50 #include "AliMUONBusStruct.h"
52 #include "AliMUONRawStreamTrigger.h"
53 #include "AliMUONDDLTrigger.h"
54 #include "AliMUONDarcHeader.h"
55 #include "AliMUONRegHeader.h"
56 #include "AliMUONLocalStruct.h"
58 #include "AliMUONTriggerCrateStore.h"
59 #include "AliMUONTriggerCrate.h"
60 #include "AliMUONLocalTriggerBoard.h"
61 #include "AliMUONLocalTrigger.h"
62 #include "AliMUONGlobalTrigger.h"
63 #include "AliMUONTriggerCircuit.h"
65 #include "AliMpSegmentation.h"
66 #include "AliMpVSegmentation.h"
68 #include "AliMpDEManager.h"
69 #include "AliMpDDLStore.h"
70 #include "AliMpCathodType.h"
72 #include "AliRawReader.h"
73 #include "AliRawDataHeader.h"
81 ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context
84 //__________________________________________________________________________
85 AliMUONDigitMaker::AliMUONDigitMaker(Bool_t flag)
91 fRawStreamTracker(new AliMUONRawStreamTracker()),
92 fRawStreamTrigger(new AliMUONRawStreamTrigger()),
93 fDigit(new AliMUONDigit()),
94 fLocalTrigger(new AliMUONLocalTrigger()),
95 fGlobalTrigger(new AliMUONGlobalTrigger()),
101 /// ctor with AliMUONData as argument
102 /// for reconstruction
106 // Standard Constructor
108 fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop();
109 fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop();
110 fMappingTimer.Start(kTRUE); fMappingTimer.Stop();
114 //__________________________________________________________________________
115 AliMUONDigitMaker::~AliMUONDigitMaker()
118 /// and time processing measure
120 delete fRawStreamTracker;
121 delete fRawStreamTrigger;
124 delete fLocalTrigger;
125 delete fGlobalTrigger;
127 AliDebug(1, Form("Execution time for MUON tracker : R:%.2fs C:%.2fs",
128 fTrackerTimer.RealTime(),fTrackerTimer.CpuTime()));
129 AliDebug(1, Form(" Execution time for MUON tracker (mapping calls part) "
131 fMappingTimer.RealTime(),fMappingTimer.CpuTime()));
132 AliDebug(1, Form("Execution time for MUON trigger : R:%.2fs C:%.2fs",
133 fTriggerTimer.RealTime(),fTriggerTimer.CpuTime()));
138 //____________________________________________________________________
139 Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader)
141 /// Main method to creates digit
146 ReadTrackerDDL(rawReader);
150 ReadTriggerDDL(rawReader);
152 AliInfo("Reading trigger rawdata disable");
158 //____________________________________________________________________
159 Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
162 /// reading tracker DDL
163 /// filling the TClonesArray in MUONData
165 fTrackerTimer.Start(kFALSE);
177 AliMUONDDLTracker* ddlTracker = 0x0;
178 AliMUONBlockHeader* blkHeader = 0x0;
179 AliMUONDspHeader* dspHeader = 0x0;
180 AliMUONBusStruct* busStruct = 0x0;
183 fRawStreamTracker->SetReader(rawReader);
185 while(fRawStreamTracker->NextDDL()) {
187 ddlTracker = fRawStreamTracker->GetDDLTracker();
189 Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
190 for(Int_t iBlock = 0; iBlock < nBlock ;iBlock++){
192 blkHeader = ddlTracker->GetBlkHeaderEntry(iBlock);
194 Int_t nDsp = blkHeader->GetDspHeaderEntries();
196 for(Int_t iDsp = 0; iDsp < nDsp ;iDsp++){ //DSP loop
198 dspHeader = blkHeader->GetDspHeaderEntry(iDsp);
200 Int_t nBusPatch = dspHeader->GetBusPatchEntries();
202 for(Int_t iBusPatch = 0; iBusPatch < nBusPatch; iBusPatch++) {
204 busStruct = dspHeader->GetBusPatchEntry(iBusPatch);
206 dataSize = busStruct->GetLength();
207 buspatchId = busStruct->GetBusPatchId();
209 for (Int_t iData = 0; iData < dataSize; iData++) {
212 parity = busStruct->GetParity(iData); // test later for parity
213 manuId = busStruct->GetManuId(iData);
214 channelId = busStruct->GetChannelId(iData);
215 charge = busStruct->GetCharge(iData);
217 fDigit->SetSignal(charge);
218 fDigit->SetPhysicsSignal(charge);
219 fDigit->SetADC(charge);
221 // Get Back the hits at pads
222 Int_t error = GetMapping(buspatchId,manuId,channelId,fDigit);
224 AliWarning("Mapping Error\n");
228 if (AliLog::GetGlobalDebugLevel() == 3) {
229 Int_t padX = fDigit->PadX();
230 Int_t padY = fDigit->PadY();
231 Int_t iCath = fDigit->Cathode();
232 Int_t idDE = fDigit->DetElemId();
234 AliDebug(1,Form("output IdDE %d busPatchid %d PadX %d PadY %d iCath %d \n",
235 idDE, buspatchId, padX, padY, iCath));
237 AliDebug(3,Form("idDE %d Padx %d Pady %d, Cath %d, charge %d",
238 idDE, padX, padY, iCath, charge));
242 iChamber = AliMpDEManager::GetChamberId(fDigit->DetElemId());
245 fMUONData->AddDigit(iChamber, *fDigit);
247 fMUONData->AddSDigit(iChamber, *fDigit);
256 fTrackerTimer.Stop();
260 //____________________________________________________________________
261 Int_t AliMUONDigitMaker::GetMapping(Int_t busPatchId, UShort_t manuId,
262 UChar_t channelId, AliMUONDigit* digit )
264 /// mapping for tracker
266 fMappingTimer.Start(kFALSE);
268 // getting DE from buspatch
269 Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId);
270 AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, busPatchId));
272 const AliMpVSegmentation* seg
273 = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, manuId);
274 AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE);
278 AliWarning(Form("No pad for detElemId: %d, busPatchId %d, manuId: %d, channelId: %d\n",
279 detElemId, busPatchId, manuId, channelId));
280 fMappingTimer.Stop();
284 // Getting padX, padY and cathode number.
285 Int_t padX = pad.GetIndices().GetFirst();
286 Int_t padY = pad.GetIndices().GetSecond();
287 Int_t iCath = AliMpDEManager::GetCathod(detElemId,seg->PlaneType());
289 // storing into digits
290 digit->SetPadX(padX);
291 digit->SetPadY(padY);
292 digit->SetCathode(iCath);
293 digit->SetDetElemId(detElemId);
294 digit->SetElectronics(manuId,channelId);
296 AliDebug(3,Form("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n",
297 detElemId, busPatchId, manuId, channelId, padX, padY));
298 // StdoutToAliDebug(3,digit->Print(););
300 fMappingTimer.Stop();
304 //____________________________________________________________________
305 Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
307 /// reading tracker DDL
308 /// filling the TClonesArray in MUONData
310 AliMUONDDLTrigger* ddlTrigger = 0x0;
311 AliMUONDarcHeader* darcHeader = 0x0;
312 AliMUONRegHeader* regHeader = 0x0;
313 AliMUONLocalStruct* localStruct = 0x0;
319 fTriggerTimer.Start(kFALSE);
321 fRawStreamTrigger->SetReader(rawReader);
323 while(fRawStreamTrigger->NextDDL()) {
325 ddlTrigger = fRawStreamTrigger->GetDDLTrigger();
326 darcHeader = ddlTrigger->GetDarcHeader();
328 // fill global trigger information in Digit Tree
330 if (darcHeader->GetGlobalFlag()) {
331 fGlobalTrigger->SetFromGlobalResponse(darcHeader->GetGlobalOutput());
332 fMUONData->AddGlobalTrigger(*fGlobalTrigger);
336 Int_t nReg = darcHeader->GetRegHeaderEntries();
338 for(Int_t iReg = 0; iReg < nReg ;iReg++){ //reg loop
341 if (!fCrateManager) AliFatal("Crate Store not defined");
342 AliMUONTriggerCrate* crate = fCrateManager->Crate(fRawStreamTrigger->GetDDL(), iReg);
345 AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
347 TObjArray *boards = crate->Boards();
350 regHeader = darcHeader->GetRegHeaderEntry(iReg);
352 Int_t nLocal = regHeader->GetLocalEntries();
353 for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) {
355 localStruct = regHeader->GetLocalEntry(iLocal);
360 AliMUONLocalTriggerBoard* localBoard =
361 (AliMUONLocalTriggerBoard*)boards->At(localStruct->GetId()+1);
364 if( !(loCircuit = localBoard->GetNumber()) )
368 // fill local trigger
369 fLocalTrigger->SetLocalStruct(loCircuit, *localStruct);
371 fMUONData->AddLocalTrigger(*fLocalTrigger);
378 if( TriggerDigits(localBoard, localStruct, digitList) ) {
380 for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) {
382 AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry);
384 // filling S container
385 Int_t iChamber = AliMpDEManager::GetChamberId(digit->DetElemId());
386 fMUONData->AddSDigit(iChamber, *digit);
398 fTriggerTimer.Stop();
403 //____________________________________________________________________
404 void AliMUONDigitMaker::GetTriggerChamber(AliMUONLocalStruct* localStruct, Int_t& xyPattern,
405 Int_t& iChamber, Int_t& iCath, Int_t icase)
407 /// get chamber & cathode number, (chamber starts at 0 !)
411 xyPattern = localStruct->GetX1();
416 xyPattern = localStruct->GetX2();
421 xyPattern = localStruct->GetX3();
426 xyPattern = localStruct->GetX4();
431 xyPattern = localStruct->GetY1();
436 xyPattern = localStruct->GetY2();
441 xyPattern = localStruct->GetY3();
446 xyPattern = localStruct->GetY4();
452 //____________________________________________________________________
453 Int_t AliMUONDigitMaker::TriggerDigits(AliMUONLocalTriggerBoard* localBoard,
454 AliMUONLocalStruct* localStruct,
457 /// make (S)Digit for trigger
465 // loop over x1-4 and y1-4
466 for (Int_t icase = 0; icase < 8; icase++) {
468 // get chamber, cathode and associated trigger response pattern
469 GetTriggerChamber(localStruct, xyPattern, iChamber, iCath, icase);
471 if (!xyPattern) continue;
474 AliMUONTriggerCircuit triggerCircuit;
475 detElemId = triggerCircuit.DetElemId(iChamber, localBoard->GetName());
476 nBoard = localBoard->GetNumber();
478 const AliMpVSegmentation* seg
479 = AliMpSegmentation::Instance()
480 ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath));
482 // loop over the 16 bits of pattern
483 for (Int_t ibitxy = 0; ibitxy < 16; ibitxy++) {
485 if ((xyPattern >> ibitxy) & 0x1) {
487 // not quite sure about this
489 if (iCath && localBoard->GetSwitch(6)) offset = -8;
491 AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
493 AliMUONDigit* digit = new AliMUONDigit();
494 if (!pad.IsValid()) {
495 AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
496 detElemId, nBoard, ibitxy));
500 Int_t padX = pad.GetIndices().GetFirst();
501 Int_t padY = pad.GetIndices().GetSecond();
504 digit->SetPadX(padX);
505 digit->SetPadY(padY);
506 digit->SetCathode(iCath);
507 digit->SetDetElemId(detElemId);
508 digit->SetElectronics(nBoard, ibitxy);
509 digitList.Add(digit);
517 //____________________________________________________________________
518 void AliMUONDigitMaker::GetCrateName(Char_t* name, Int_t iDDL, Int_t iReg) const
520 /// set crate name from DDL & reg number
521 /// method same as in RawWriter, not so nice
522 /// should be put in AliMUONTriggerCrateStore
527 sprintf(name,"%d", iReg+1);
537 sprintf(name,"%d", iReg);
541 // crate Right for first DDL