4 // GetTrackerMapping = AliMUONDigitMaker::GetMapping
5 // GetTriggerMapping = AliMUONDigitMaker::TriggerDigits
6 // GetTriggerChamber = AliMUONDigitMaker::GetTriggerChamber
7 // LoadRawTracker = MUONRawStreamTracker.C
8 // LoadRawTrigger = MUONRawStreamTrigger.C
13 #include <Alieve/MUONChamberData.h>
14 #include <Alieve/EventAlieve.h>
16 #include <AliRawReader.h>
17 #include <AliRawReaderFile.h>
18 #include <AliRawReaderDate.h>
19 #include <AliRawReaderRoot.h>
23 #include <AliMUONDigit.h>
24 #include <AliMUONRawStreamTracker.h>
25 #include <AliMUONRawStreamTrigger.h>
26 #include <AliMUONDDLTracker.h>
27 #include <AliMUONBlockHeader.h>
28 #include <AliMUONDspHeader.h>
29 #include <AliMUONBusStruct.h>
30 #include <AliMUONDDLTrigger.h>
31 #include <AliMUONDarcHeader.h>
32 #include <AliMUONRegHeader.h>
33 #include <AliMUONLocalStruct.h>
34 #include <AliMUONTriggerCrateStore.h>
35 #include <AliMUONTriggerCrate.h>
36 #include <AliMUONLocalTriggerBoard.h>
37 #include <AliMUONTriggerCircuit.h>
38 #include <mapping/AliMpDDLStore.h>
39 #include <mapping/AliMpVSegmentation.h>
40 #include <mapping/AliMpSegmentation.h>
41 #include <mapping/AliMpPad.h>
42 #include <mapping/AliMpDEManager.h>
46 #include "TClonesArray.h"
49 using namespace Alieve;
51 //______________________________________________________________________
57 AliRawReader* MUONData::fgRawReader = 0;
58 AliMUONRawStreamTracker* MUONData::fgRawStreamTracker = 0;
59 AliMUONRawStreamTrigger* MUONData::fgRawStreamTrigger = 0;
60 AliMpDDLStore* MUONData::fgBusPatchManager = 0;
62 //______________________________________________________________________
63 MUONData::MUONData() :
74 //______________________________________________________________________
85 //______________________________________________________________________
86 MUONData::MUONData(const MUONData &mdata) :
88 Reve::ReferenceCount()
96 //______________________________________________________________________
97 MUONData& MUONData::operator=(const MUONData &mdata)
100 // Assignment operator
103 if (this != &mdata) {
111 //______________________________________________________________________
112 void MUONData::CreateChamber(Int_t chamber)
115 // create data for the chamber with id=chamber (0 to 13)
118 if (fChambers[chamber] == 0)
119 fChambers[chamber] = new MUONChamberData(chamber);
123 //______________________________________________________________________
124 void MUONData::CreateAllChambers()
127 // create all 14 chambers data
130 for (Int_t c = 0; c < 14; ++c)
135 //______________________________________________________________________
136 void MUONData::DropAllChambers()
139 // release data from all chambers
142 for (Int_t c = 0; c < 14; ++c) {
144 if (fChambers[c] != 0)
145 fChambers[c]->DropData();
151 //______________________________________________________________________
152 void MUONData::DeleteAllChambers()
155 // delete all chambers data
158 for (Int_t c = 0; c < 14; ++c) {
167 //______________________________________________________________________
168 void MUONData::LoadDigits(TTree* tree)
171 // load digits from the TreeD
174 Char_t branchname[30];
175 TClonesArray *digits = 0;
178 Int_t cathode, detElemId, ix, iy, charge;
180 for (Int_t c = 0; c < 14; ++c) {
182 if (fChambers[c] == 0) continue;
183 sprintf(branchname,"MUONDigits%d",c+1);
184 tree->SetBranchAddress(branchname,&digits);
187 ndigits = digits->GetEntriesFast();
189 for (Int_t id = 0; id < ndigits; id++) {
190 mdig = (AliMUONDigit*)digits->UncheckedAt(id);
192 cathode = mdig->Cathode();
195 detElemId = mdig->DetElemId();
196 charge = (Int_t)mdig->Signal();
199 //printf("cha %d deid %d cath %1d ix %d iy %d q %d \n",c,detElemId,cathode,ix,iy,charge);
202 fChambers[c]->RegisterDigit(detElemId,cathode,ix,iy,charge);
210 //______________________________________________________________________
211 void MUONData::LoadRecPoints(TTree* /*tree*/)
214 // load reconstructed points from the TreeR
215 // load local trigger information
220 //______________________________________________________________________
221 void MUONData::LoadRaw(TString fileName)
224 // load raw data from fileName; tracker and trigger data
227 if (fgRawReader == 0) {
228 // check extention to choose the rawdata file format
229 if (fileName.EndsWith("/")) {
230 fgRawReader = new AliRawReaderFile(fileName); // DDL files
231 } else if (fileName.EndsWith(".root")) {
232 fgRawReader = new AliRawReaderRoot(fileName); // ROOT file
233 } else if (!fileName.IsNull()) {
234 fgRawReader = new AliRawReaderDate(fileName); // DATE file
236 fgRawStreamTracker = new AliMUONRawStreamTracker(fgRawReader);
237 fgRawStreamTrigger = new AliMUONRawStreamTrigger(fgRawReader);
238 fgBusPatchManager = AliMpDDLStore::Instance();
246 //______________________________________________________________________
247 void MUONData::LoadRawTracker()
250 // load raw data for the tracking chambers
253 fgRawReader->RewindEvents();
255 AliMUONDigit* digit = new AliMUONDigit();
257 Int_t maxEvent = 1000;
258 Int_t minDDL = 0, maxDDL = 19;
259 Int_t cathode, detElemId, ix, iy, iChamber;
261 AliMUONDDLTracker* ddlTracker = 0x0;
262 AliMUONBlockHeader* blkHeader = 0x0;
263 AliMUONDspHeader* dspHeader = 0x0;
264 AliMUONBusStruct* busStruct = 0x0;
267 Int_t dataSize, buspatchId;
269 Event* aevent = Alieve::gEvent;
271 while (fgRawReader->NextEvent()) {
273 if (iEvent != aevent->GetEventId()) {
278 if (iEvent == maxEvent)
281 // read DDL while < 20 DDL
282 while(fgRawStreamTracker->NextDDL()) {
284 if (fgRawStreamTracker->GetDDL() < minDDL ||
285 fgRawStreamTracker->GetDDL() > maxDDL)
288 //printf("\niDDL %d\n", fgRawStreamTracker->GetDDL());
290 ddlTracker = fgRawStreamTracker->GetDDLTracker();
292 // loop over block structure
293 Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
294 for(Int_t iBlock = 0; iBlock < nBlock ;iBlock++){
296 blkHeader = ddlTracker->GetBlkHeaderEntry(iBlock);
297 //printf("Block Total length %d\n",blkHeader->GetTotalLength());
299 // loop over DSP structure
300 Int_t nDsp = blkHeader->GetDspHeaderEntries();
301 for(Int_t iDsp = 0; iDsp < nDsp ;iDsp++){ //DSP loop
303 dspHeader = blkHeader->GetDspHeaderEntry(iDsp);
304 // printf("Dsp length %d even word %d\n",dspHeader->GetTotalLength(), dspHeader->GetEventWord());
306 // loop over BusPatch structure
307 Int_t nBusPatch = dspHeader->GetBusPatchEntries();
308 for(Int_t iBusPatch = 0; iBusPatch < nBusPatch; iBusPatch++) {
310 busStruct = dspHeader->GetBusPatchEntry(iBusPatch);
312 //printf("busPatchId %d", busStruct->GetBusPatchId());
313 //printf(" BlockId %d", busStruct->GetBlockId());
314 //printf(" DspId %d\n", busStruct->GetDspId());
317 dataSize = busStruct->GetLength();
318 buspatchId = busStruct->GetBusPatchId();
319 for (Int_t iData = 0; iData < dataSize; iData++) {
321 Int_t manuId = busStruct->GetManuId(iData);
322 Int_t channelId = busStruct->GetChannelId(iData);
323 Int_t charge = busStruct->GetCharge(iData);
324 //printf("manuId: %d, channelId: %d charge: %d\n", manuId, channelId, charge);
326 digit->SetSignal(charge);
327 digit->SetPhysicsSignal(charge);
328 digit->SetADC(charge);
329 // Get Back the hits at pads
331 error = GetTrackerMapping(buspatchId,manuId,channelId,digit);
333 printf("Mapping Error\n");
337 cathode = digit->Cathode();
340 detElemId = digit->DetElemId();
341 charge = (Int_t)digit->Signal();
342 iChamber = detElemId/100 - 1;
344 fChambers[iChamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
360 //______________________________________________________________________
361 void MUONData::LoadRawTrigger()
364 // load raw data for the trigger chambers
367 fgRawReader->RewindEvents();
369 Int_t maxEvent = 1000;
370 Int_t minDDL = 0, maxDDL = 1;
371 Int_t detElemId, iChamber, cathode, charge, ix, iy;
373 AliMUONDDLTrigger* ddlTrigger = 0x0;
374 AliMUONDarcHeader* darcHeader = 0x0;
375 AliMUONRegHeader* regHeader = 0x0;
376 AliMUONLocalStruct* localStruct = 0x0;
379 AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();
380 crateManager->ReadFromFile();
386 Event* aevent = Alieve::gEvent;
388 while (fgRawReader->NextEvent()) {
390 if (iEvent != aevent->GetEventId()) {
395 if (iEvent == maxEvent)
398 // read DDL while < 2 DDL
399 while(fgRawStreamTrigger->NextDDL()) {
401 if (fgRawStreamTrigger->GetDDL() < minDDL ||
402 fgRawStreamTrigger->GetDDL() > maxDDL)
405 //printf("\niDDL %d\n", fgRawStreamTrigger->GetDDL());
407 ddlTrigger = fgRawStreamTrigger->GetDDLTrigger();
408 darcHeader = ddlTrigger->GetDarcHeader();
410 //printf("Global output %x\n", (Int_t)darcHeader->GetGlobalOutput());
412 // loop over regional structures
413 Int_t nReg = darcHeader->GetRegHeaderEntries();
414 for(Int_t iReg = 0; iReg < nReg ;iReg++){ //REG loop
416 //printf("RegionalId %d\n", iReg);
418 regHeader = darcHeader->GetRegHeaderEntry(iReg);
419 // printf("Reg length %d\n",regHeader->GetHeaderLength());
422 AliMUONTriggerCrate* crate = crateManager->Crate(fgRawStreamTrigger->GetDDL(), iReg);
423 TObjArray *boards = crate->Boards();
425 // loop over local structures
426 Int_t nLocal = regHeader->GetLocalEntries();
427 for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) {
429 localStruct = regHeader->GetLocalEntry(iLocal);
432 if (localStruct->GetTriggerY() == 0) { // no empty data
434 // local trigger circuit number
435 AliMUONLocalTriggerBoard* localBoard = (AliMUONLocalTriggerBoard*)boards->At(iLocal+1);
437 //printf("LocalId %d\n", localStruct->GetId());
439 Int_t iLocCard = localBoard->GetNumber();
440 Int_t loStripX = (Int_t)localStruct->GetXPos();
441 Int_t loStripY = (Int_t)localStruct->GetYPos();
442 Int_t loDev = (Int_t)localStruct->GetXDev();
444 //printf("iLocCard: %d, XPos: %d, YPos: %d Dev: %d\n", iLocCard, loStripX, loStripY, loDev);
447 if ( GetTriggerMapping(localBoard, localStruct, digitList) ) {
448 for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) {
450 AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry);
451 cathode = digit->Cathode();
454 detElemId = digit->DetElemId();
455 charge = (Int_t)digit->Signal();
456 iChamber = detElemId/100 - 1;
458 //printf("cha %d deid %d cath %1d ix %d iy %d q %d \n",iChamber,detElemId,cathode,ix,iy,charge);
460 fChambers[iChamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
479 //______________________________________________________________________
480 Int_t MUONData::GetTrackerMapping(Int_t buspatchId, UShort_t manuId, UChar_t channelId, AliMUONDigit* digit)
483 // decode digits mapping for the tracking chambers
486 // getting DE from buspatch
487 Int_t detElemId = fgBusPatchManager->GetDEfromBus(buspatchId);
488 //AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, buspatchId));
490 const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, manuId);
491 AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE);
495 printf("No pad for detElemId: %d, busPatchId %d, manuId: %d, channelId: %d\n",detElemId, buspatchId, manuId, channelId);
500 // Getting padX, padY and cathode number.
501 Int_t padX = pad.GetIndices().GetFirst();
502 Int_t padY = pad.GetIndices().GetSecond();
503 Int_t iCath = AliMpDEManager::GetCathod(detElemId,seg->PlaneType());
505 // storing into digits
506 digit->SetPadX(padX);
507 digit->SetPadY(padY);
508 digit->SetCathode(iCath);
509 digit->SetDetElemId(detElemId);
510 digit->SetElectronics(manuId,channelId);
512 //printf("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n",detElemId, buspatchId, manuId, channelId, padX, padY);
518 //______________________________________________________________________
519 Int_t MUONData::GetTriggerMapping(AliMUONLocalTriggerBoard* localBoard,
520 AliMUONLocalStruct* localStruct,
524 // decode digits mapping for the trigger chambers
533 // loop over x1-4 and y1-4
534 for (Int_t icase = 0; icase < 8; icase++) {
536 // get chamber, cathode and associated trigger response pattern
537 GetTriggerChamber(localStruct, xyPattern, iChamber, iCath, icase);
539 if (!xyPattern) continue;
542 AliMUONTriggerCircuit triggerCircuit;
543 detElemId = triggerCircuit.DetElemId(iChamber, localBoard->GetName());
544 nBoard = localBoard->GetNumber();
546 const AliMpVSegmentation* seg
547 = AliMpSegmentation::Instance()
548 ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath));
550 // loop over the 16 bits of pattern
551 for (Int_t ibitxy = 0; ibitxy < 16; ibitxy++) {
553 if ((xyPattern >> ibitxy) & 0x1) {
555 // not quite sure about this
557 if (iCath && localBoard->GetSwitch(6)) offset = -8;
559 AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
561 AliMUONDigit* digit = new AliMUONDigit();
562 if (!pad.IsValid()) {
563 AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
564 detElemId, nBoard, ibitxy));
568 Int_t padX = pad.GetIndices().GetFirst();
569 Int_t padY = pad.GetIndices().GetSecond();
573 digit->SetPadX(padX);
574 digit->SetPadY(padY);
575 digit->SetCathode(iCath);
576 digit->SetDetElemId(detElemId);
577 digit->SetElectronics(nBoard, ibitxy);
578 digitList.Add(digit);
588 //____________________________________________________________________
589 void MUONData::GetTriggerChamber(AliMUONLocalStruct* localStruct, Int_t& xyPattern, Int_t& iChamber, Int_t& iCath, Int_t icase)
592 // extract digits pattern
595 // get chamber & cathode number, (chamber starts at 0 !)
598 xyPattern = localStruct->GetX1();
603 xyPattern = localStruct->GetX2();
608 xyPattern = localStruct->GetX3();
613 xyPattern = localStruct->GetX4();
618 xyPattern = localStruct->GetY1();
623 xyPattern = localStruct->GetY2();
628 xyPattern = localStruct->GetY3();
633 xyPattern = localStruct->GetY4();
641 //______________________________________________________________________
642 MUONChamberData* MUONData::GetChamberData(Int_t chamber)
645 // return chamber data
648 if (chamber < 0 || chamber > 13) return 0;
650 //if (fChambers[chamber] == 0) CreateChamber(chamber);
652 return fChambers[chamber];