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 ////////////////////////////////////
18 /// MUON Digit maker from rawdata.
21 /// Using real mapping for tracker
22 /// Indranil Das (Adapted for runloader: Ch. Finck) july 05
24 /// Implemented non-constant buspatch numbers for tracking
25 /// with correct DDL id.
26 /// (Ch. Finck, dec 05)
28 /// Add reader for scaler trigger events
29 /// Use memcpy instead of assignment elt by elt
30 /// (Ch. Finck, Jan 06)
32 /// Using new interface with AliMUONRawStreamTracker(Trigger)
33 /// (New interface of AliMUONRawReader class)
34 /// (further details could be found in Alice-note)
35 /// (Ch. Finck, March 06)
37 /// Add (S)Digit maker tracker (for free)
38 /// and for trigger. Create trigger inverse mapping.
39 /// (Ch. Finck, oct 06)
40 ////////////////////////////////////
45 #include <TClonesArray.h>
48 #include "AliRawReader.h"
49 #include "AliRawDataHeader.h"
53 #include "AliMpBusPatch.h"
55 #include "AliMUONDigitMaker.h"
56 #include "AliMUONDigit.h"
58 #include "AliMUONConstants.h"
59 #include "AliMUONData.h"
61 #include "AliMUONRawStreamTracker.h"
62 #include "AliMUONDDLTracker.h"
63 #include "AliMUONDspHeader.h"
64 #include "AliMUONBlockHeader.h"
65 #include "AliMUONBusStruct.h"
67 #include "AliMUONRawStreamTrigger.h"
68 #include "AliMUONDDLTrigger.h"
69 #include "AliMUONDarcHeader.h"
70 #include "AliMUONRegHeader.h"
71 #include "AliMUONLocalStruct.h"
73 #include "AliMUONTriggerCrateStore.h"
74 #include "AliMUONTriggerCrate.h"
75 #include "AliMUONLocalTriggerBoard.h"
76 #include "AliMUONLocalTrigger.h"
77 #include "AliMUONGlobalTrigger.h"
78 #include "AliMUONTriggerCircuitNew.h"
79 #include "AliMpSegFactory.h"
80 #include "AliMpVSegmentation.h"
82 #include "AliMpDEManager.h"
84 ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context
85 //__________________________________________________________________________
86 AliMUONDigitMaker::AliMUONDigitMaker(Bool_t flag)
89 fSegFactory(new AliMpSegFactory()),
90 fBusPatchManager(new AliMpBusPatch()),
93 fRawStreamTracker(new AliMUONRawStreamTracker()),
94 fRawStreamTrigger(new AliMUONRawStreamTrigger()),
95 fDigit(new AliMUONDigit()),
96 fLocalTrigger(new AliMUONLocalTrigger()),
97 fGlobalTrigger(new AliMUONGlobalTrigger()),
98 fCrateManager(new AliMUONTriggerCrateStore()),
104 // ctor with AliMUONData as argument
105 // for reconstruction
110 // Standard Constructor
113 fBusPatchManager->ReadBusPatchFile();
116 fCrateManager->ReadFromFile();
118 fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop();
119 fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop();
120 fMappingTimer.Start(kTRUE); fMappingTimer.Stop();
124 //__________________________________________________________________________
125 AliMUONDigitMaker::~AliMUONDigitMaker()
129 // and time processing measure
133 delete fRawStreamTracker;
134 delete fRawStreamTrigger;
137 delete fLocalTrigger;
138 delete fGlobalTrigger;
140 delete fCrateManager;
142 delete fBusPatchManager;
144 AliInfo(Form("Execution time for MUON tracker : R:%.2fs C:%.2fs",
145 fTrackerTimer.RealTime(),fTrackerTimer.CpuTime()));
146 AliInfo(Form(" Execution time for MUON tracker (mapping calls part) "
148 fMappingTimer.RealTime(),fMappingTimer.CpuTime()));
149 AliInfo(Form("Execution time for MUON trigger : R:%.2fs C:%.2fs",
150 fTriggerTimer.RealTime(),fTriggerTimer.CpuTime()));
155 //____________________________________________________________________
156 Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader)
158 // Main method to creates digit
163 ReadTrackerDDL(rawReader);
166 ReadTriggerDDL(rawReader);
172 //____________________________________________________________________
173 Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
176 // reading tracker DDL
177 // filling the TClonesArray in MUONData
179 fTrackerTimer.Start(kFALSE);
191 AliMUONDDLTracker* ddlTracker = 0x0;
192 AliMUONBlockHeader* blkHeader = 0x0;
193 AliMUONDspHeader* dspHeader = 0x0;
194 AliMUONBusStruct* busStruct = 0x0;
197 fRawStreamTracker->SetReader(rawReader);
199 while(fRawStreamTracker->NextDDL()) {
201 ddlTracker = fRawStreamTracker->GetDDLTracker();
203 Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
204 for(Int_t iBlock = 0; iBlock < nBlock ;iBlock++){
206 blkHeader = ddlTracker->GetBlkHeaderEntry(iBlock);
208 Int_t nDsp = blkHeader->GetDspHeaderEntries();
210 for(Int_t iDsp = 0; iDsp < nDsp ;iDsp++){ //DSP loop
212 dspHeader = blkHeader->GetDspHeaderEntry(iDsp);
214 Int_t nBusPatch = dspHeader->GetBusPatchEntries();
216 for(Int_t iBusPatch = 0; iBusPatch < nBusPatch; iBusPatch++) {
218 busStruct = dspHeader->GetBusPatchEntry(iBusPatch);
220 dataSize = busStruct->GetLength();
221 buspatchId = busStruct->GetBusPatchId();
223 for (Int_t iData = 0; iData < dataSize; iData++) {
226 parity = busStruct->GetParity(iData); // test later for parity
227 manuId = busStruct->GetManuId(iData);
228 channelId = busStruct->GetChannelId(iData);
229 charge = busStruct->GetCharge(iData);
231 fDigit->SetSignal(charge);
232 fDigit->SetPhysicsSignal(charge);
233 fDigit->SetADC(charge);
235 // Get Back the hits at pads
236 Int_t error = GetMapping(buspatchId,manuId,channelId,fDigit);
238 AliWarning("Mapping Error\n");
242 if (AliLog::GetGlobalDebugLevel() == 3) {
243 Int_t padX = fDigit->PadX();
244 Int_t padY = fDigit->PadY();
245 Int_t iCath = fDigit->Cathode();
246 Int_t idDE = fDigit->DetElemId();
248 AliDebug(1,Form("output IdDE %d busPatchid %d PadX %d PadY %d iCath %d \n",
249 idDE, buspatchId, padX, padY, iCath));
251 AliDebug(3,Form("idDE %d Padx %d Pady %d, Cath %d, charge %d",
252 idDE, padX, padY, iCath, charge));
256 iChamber = fDigit->DetElemId()/100 - 1;
259 fMUONData->AddDigit(iChamber, *fDigit);
261 fMUONData->AddSDigit(iChamber, *fDigit);
270 fTrackerTimer.Stop();
274 //____________________________________________________________________
275 Int_t AliMUONDigitMaker::GetMapping(Int_t busPatchId, UShort_t manuId,
276 UChar_t channelId, AliMUONDigit* digit )
279 // mapping for tracker
281 fMappingTimer.Start(kFALSE);
283 // getting DE from buspatch
284 Int_t detElemId = fBusPatchManager->GetDEfromBus(busPatchId);
285 AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, busPatchId));
287 AliMpVSegmentation* seg = fSegFactory->CreateMpSegmentationByElectronics(detElemId, manuId);
288 AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE);
292 AliWarning(Form("No pad for detElemId: %d, busPatchId %d, manuId: %d, channelId: %d\n",
293 detElemId, busPatchId, manuId, channelId));
294 fMappingTimer.Stop();
298 // Getting padX, padY and cathode number.
299 Int_t padX = pad.GetIndices().GetFirst();
300 Int_t padY = pad.GetIndices().GetSecond();
301 Int_t iCath = AliMpDEManager::GetCathod(detElemId,seg->PlaneType());
303 // storing into digits
304 digit->SetPadX(padX);
305 digit->SetPadY(padY);
306 digit->SetCathode(iCath);
307 digit->SetDetElemId(detElemId);
308 digit->SetElectronics(manuId,channelId);
310 AliDebug(3,Form("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n",
311 detElemId, busPatchId, manuId, channelId, padX, padY));
312 StdoutToAliDebug(3,digit->Print(););
314 fMappingTimer.Stop();
318 //____________________________________________________________________
319 Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
321 // reading tracker DDL
322 // filling the TClonesArray in MUONData
325 AliMUONDDLTrigger* ddlTrigger = 0x0;
326 AliMUONDarcHeader* darcHeader = 0x0;
327 AliMUONRegHeader* regHeader = 0x0;
328 AliMUONLocalStruct* localStruct = 0x0;
334 fTriggerTimer.Start(kFALSE);
336 fRawStreamTrigger->SetReader(rawReader);
338 while(fRawStreamTrigger->NextDDL()) {
340 ddlTrigger = fRawStreamTrigger->GetDDLTrigger();
341 darcHeader = ddlTrigger->GetDarcHeader();
343 // fill global trigger information in Digit Tree
345 if (darcHeader->GetGlobalFlag()) {
346 fGlobalTrigger->SetFromGlobalResponse(darcHeader->GetGlobalOutput());
347 fMUONData->AddGlobalTrigger(*fGlobalTrigger);
351 Int_t nReg = darcHeader->GetRegHeaderEntries();
353 for(Int_t iReg = 0; iReg < nReg ;iReg++){ //reg loop
356 AliMUONTriggerCrate* crate = fCrateManager->Crate(fRawStreamTrigger->GetDDL(), iReg);
359 AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
361 TObjArray *boards = crate->Boards();
364 regHeader = darcHeader->GetRegHeaderEntry(iReg);
366 Int_t nLocal = regHeader->GetLocalEntries();
367 for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) {
369 localStruct = regHeader->GetLocalEntry(iLocal);
371 // if card has triggered
372 if (localStruct->GetTriggerY() == 0) {
375 AliMUONLocalTriggerBoard* localBoard =
376 (AliMUONLocalTriggerBoard*)boards->At(localStruct->GetId()+1);
378 loCircuit = localBoard->GetNumber();
381 // fill local trigger
382 fLocalTrigger->SetLocalStruct(loCircuit, *localStruct);
384 fMUONData->AddLocalTrigger(*fLocalTrigger);
391 if( TriggerDigits(localBoard, localStruct, digitList) ) {
393 for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) {
395 AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry);
397 // filling S container
398 Int_t iChamber = digit->DetElemId()/100 - 1;
399 fMUONData->AddSDigit(iChamber, *digit);
411 fTriggerTimer.Stop();
416 //____________________________________________________________________
417 void AliMUONDigitMaker::GetTriggerChamber(AliMUONLocalStruct* localStruct, Int_t& xyPattern,
418 Int_t& iChamber, Int_t& iCath, Int_t icase)
421 // get chamber & cathode number, (chamber starts at 0 !)
424 xyPattern = localStruct->GetX1();
429 xyPattern = localStruct->GetX2();
434 xyPattern = localStruct->GetX3();
439 xyPattern = localStruct->GetX4();
444 xyPattern = localStruct->GetY1();
449 xyPattern = localStruct->GetY2();
454 xyPattern = localStruct->GetY3();
459 xyPattern = localStruct->GetY4();
465 //____________________________________________________________________
466 Int_t AliMUONDigitMaker::TriggerDigits(AliMUONLocalTriggerBoard* localBoard,
467 AliMUONLocalStruct* localStruct,
471 // make (S)Digit for trigger
479 // loop over x1-4 and y1-4
480 for (Int_t icase = 0; icase < 8; icase++) {
482 // get chamber, cathode and associated trigger response pattern
483 GetTriggerChamber(localStruct, xyPattern, iChamber, iCath, icase);
485 if (!xyPattern) continue;
488 AliMUONTriggerCircuitNew triggerCircuit;
489 detElemId = triggerCircuit.DetElemId(iChamber, localBoard->GetName());
490 nBoard = localBoard->GetNumber();
492 AliMpVSegmentation* seg = fSegFactory->CreateMpSegmentation(detElemId, iCath);
494 // loop over the 16 bits of pattern
495 for (Int_t ibitxy = 0; ibitxy < 16; ibitxy++) {
497 if ((xyPattern >> ibitxy) & 0x1) {
499 // not quite sure about this
501 if (iCath && localBoard->GetSwitch(6)) offset = -8;
503 AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
505 AliMUONDigit* digit = new AliMUONDigit();
506 if (!pad.IsValid()) {
507 AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
508 detElemId, nBoard, ibitxy));
512 Int_t padX = pad.GetIndices().GetFirst();
513 Int_t padY = pad.GetIndices().GetSecond();
516 digit->SetPadX(padX);
517 digit->SetPadY(padY);
518 digit->SetCathode(iCath);
519 digit->SetDetElemId(detElemId);
520 digit->SetElectronics(nBoard, ibitxy);
521 digitList.Add(digit);
529 //____________________________________________________________________
530 void AliMUONDigitMaker::GetCrateName(Char_t* name, Int_t iDDL, Int_t iReg)
532 // set crate name from DDL & reg number
533 // method same as in RawWriter, not so nice
534 // should be put in AliMUONTriggerCrateStore
539 sprintf(name,"%d", iReg+1);
549 sprintf(name,"%d", iReg);
553 // crate Right for first DDL