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 <AliMUONHit.h>
24 #include <AliMUONRawCluster.h>
25 #include <AliMUONDigit.h>
26 #include <AliMUONRawStreamTracker.h>
27 #include <AliMUONRawStreamTrigger.h>
28 #include <AliMUONDDLTracker.h>
29 #include <AliMUONBlockHeader.h>
30 #include <AliMUONDspHeader.h>
31 #include <AliMUONBusStruct.h>
32 #include <AliMUONDDLTrigger.h>
33 #include <AliMUONDarcHeader.h>
34 #include <AliMUONRegHeader.h>
35 #include <AliMUONLocalStruct.h>
36 #include <AliMUONTriggerCrateStore.h>
37 #include <AliMUONTriggerCrate.h>
38 #include <AliMUONLocalTriggerBoard.h>
39 #include <AliMUONTriggerCircuit.h>
40 #include <mapping/AliMpDDLStore.h>
41 #include <mapping/AliMpVSegmentation.h>
42 #include <mapping/AliMpSegmentation.h>
43 #include <mapping/AliMpPad.h>
44 #include <mapping/AliMpDEManager.h>
48 #include "TClonesArray.h"
51 using namespace Alieve;
53 //______________________________________________________________________
59 AliRawReader* MUONData::fgRawReader = 0;
60 AliMUONRawStreamTracker* MUONData::fgRawStreamTracker = 0;
61 AliMUONRawStreamTrigger* MUONData::fgRawStreamTrigger = 0;
62 AliMpDDLStore* MUONData::fgBusPatchManager = 0;
64 //______________________________________________________________________
65 MUONData::MUONData() :
73 for (Int_t i = 0; i < 100; i++) {
81 //______________________________________________________________________
92 //______________________________________________________________________
93 void MUONData::Reset()
102 for (Int_t i = 0; i < 100; i++) {
108 //______________________________________________________________________
109 MUONData::MUONData(const MUONData &mdata) :
111 Reve::ReferenceCount()
119 //______________________________________________________________________
120 MUONData& MUONData::operator=(const MUONData &mdata)
123 // Assignment operator
126 if (this != &mdata) {
134 //______________________________________________________________________
135 void MUONData::CreateChamber(Int_t chamber)
138 // create data for the chamber with id=chamber (0 to 13)
141 if (fChambers[chamber] == 0)
142 fChambers[chamber] = new MUONChamberData(chamber);
146 //______________________________________________________________________
147 void MUONData::CreateAllChambers()
150 // create all 14 chambers data
153 for (Int_t c = 0; c < 14; ++c)
158 //______________________________________________________________________
159 void MUONData::DropAllChambers()
162 // release data from all chambers
165 for (Int_t c = 0; c < 14; ++c) {
167 if (fChambers[c] != 0)
168 fChambers[c]->DropData();
174 //______________________________________________________________________
175 void MUONData::DeleteAllChambers()
178 // delete all chambers data
181 for (Int_t c = 0; c < 14; ++c) {
190 //______________________________________________________________________
191 void MUONData::RegisterTrack(Int_t track)
194 // register (in a list) a track with hits in the chambers
197 if (fNTrackList >= 100) {
198 cout << "Maximum of registered tracks reached..." << endl;
202 Bool_t inList = kFALSE;
203 for (Int_t i = 0; i < fNTrackList; i++) {
204 if (track == fTrackList[i]) {
210 fTrackList[fNTrackList] = track;
216 //______________________________________________________________________
217 void MUONData::LoadDigits(TTree* tree)
220 // load digits from the TreeD
223 Char_t branchname[30];
224 TClonesArray *digits = 0;
227 Int_t cathode, detElemId, ix, iy, charge;
229 for (Int_t c = 0; c < 14; ++c) {
231 if (fChambers[c] == 0) continue;
232 sprintf(branchname,"MUONDigits%d",c+1);
233 tree->SetBranchAddress(branchname,&digits);
236 ndigits = digits->GetEntriesFast();
238 for (Int_t id = 0; id < ndigits; id++) {
239 mdig = (AliMUONDigit*)digits->UncheckedAt(id);
241 cathode = mdig->Cathode();
244 detElemId = mdig->DetElemId();
245 charge = (Int_t)mdig->Signal();
247 fChambers[c]->RegisterDigit(detElemId,cathode,ix,iy,charge);
255 //______________________________________________________________________
256 void MUONData::LoadRecPoints(TTree* tree)
259 // load reconstructed points from the TreeR
260 // load local trigger information
263 Char_t branchname[30];
264 TClonesArray *clusters = 0;
266 AliMUONRawCluster *mcls;
268 Float_t clsX, clsY, clsZ, charge;
270 for (Int_t c = 0; c < 10; ++c) {
272 if (fChambers[c] == 0) continue;
273 sprintf(branchname,"MUONRawClusters%d",c+1);
274 tree->SetBranchAddress(branchname,&clusters);
277 nclusters = clusters->GetEntriesFast();
279 for (Int_t ic = 0; ic < nclusters; ic++) {
280 mcls = (AliMUONRawCluster*)clusters->UncheckedAt(ic);
282 detElemId = mcls->GetDetElemId();
283 for (Int_t icath = 0; icath < 2; icath++) {
284 clsX = mcls->GetX(icath);
285 clsY = mcls->GetY(icath);
286 clsZ = mcls->GetZ(icath);
287 charge = mcls->GetCharge(icath);
289 fChambers[c]->RegisterCluster(detElemId,icath,clsX,clsY,clsZ,charge);
298 //______________________________________________________________________
299 void MUONData::LoadHits(TTree* tree)
302 // load simulation hits from the TreeH
305 TClonesArray *hits = 0;
307 Int_t cha, detElemId, nhits, ntracks;
308 Float_t hitX, hitY, hitZ;
310 ntracks = tree->GetEntries();
311 tree->SetBranchAddress("MUONHits",&hits);
313 for (Int_t it = 0; it < ntracks; it++) {
316 nhits = hits->GetEntriesFast();
318 for (Int_t ih = 0; ih < nhits; ih++) {
320 mhit = (AliMUONHit*)hits->UncheckedAt(ih);
324 detElemId = mhit->DetElemId();
325 cha = mhit->Chamber();
327 RegisterTrack(mhit->GetTrack());
329 fChambers[cha-1]->RegisterHit(detElemId,hitX,hitY,hitZ);
336 //______________________________________________________________________
337 void MUONData::LoadRaw(TString fileName)
340 // load raw data from fileName; tracker and trigger data
343 if (fgRawReader == 0) {
344 // check extention to choose the rawdata file format
345 if (fileName.EndsWith("/")) {
346 fgRawReader = new AliRawReaderFile(fileName); // DDL files
347 } else if (fileName.EndsWith(".root")) {
348 fgRawReader = new AliRawReaderRoot(fileName); // ROOT file
349 } else if (!fileName.IsNull()) {
350 fgRawReader = new AliRawReaderDate(fileName); // DATE file
352 fgRawStreamTracker = new AliMUONRawStreamTracker(fgRawReader);
353 fgRawStreamTrigger = new AliMUONRawStreamTrigger(fgRawReader);
354 fgBusPatchManager = AliMpDDLStore::Instance();
362 //______________________________________________________________________
363 void MUONData::LoadRawTracker()
366 // load raw data for the tracking chambers
369 fgRawReader->RewindEvents();
371 AliMUONDigit* digit = new AliMUONDigit();
373 Int_t maxEvent = 1000;
374 Int_t minDDL = 0, maxDDL = 19;
375 Int_t cathode, detElemId, ix, iy, iChamber;
377 AliMUONDDLTracker* ddlTracker = 0x0;
378 AliMUONBlockHeader* blkHeader = 0x0;
379 AliMUONDspHeader* dspHeader = 0x0;
380 AliMUONBusStruct* busStruct = 0x0;
383 Int_t dataSize, buspatchId;
385 Event* aevent = Alieve::gEvent;
387 while (fgRawReader->NextEvent()) {
389 if (iEvent != aevent->GetEventId()) {
394 if (iEvent == maxEvent)
397 // read DDL while < 20 DDL
398 while(fgRawStreamTracker->NextDDL()) {
400 if (fgRawStreamTracker->GetDDL() < minDDL ||
401 fgRawStreamTracker->GetDDL() > maxDDL)
404 //printf("\niDDL %d\n", fgRawStreamTracker->GetDDL());
406 ddlTracker = fgRawStreamTracker->GetDDLTracker();
408 // loop over block structure
409 Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
410 for(Int_t iBlock = 0; iBlock < nBlock ;iBlock++){
412 blkHeader = ddlTracker->GetBlkHeaderEntry(iBlock);
413 //printf("Block Total length %d\n",blkHeader->GetTotalLength());
415 // loop over DSP structure
416 Int_t nDsp = blkHeader->GetDspHeaderEntries();
417 for(Int_t iDsp = 0; iDsp < nDsp ;iDsp++){ //DSP loop
419 dspHeader = blkHeader->GetDspHeaderEntry(iDsp);
420 // printf("Dsp length %d even word %d\n",dspHeader->GetTotalLength(), dspHeader->GetEventWord());
422 // loop over BusPatch structure
423 Int_t nBusPatch = dspHeader->GetBusPatchEntries();
424 for(Int_t iBusPatch = 0; iBusPatch < nBusPatch; iBusPatch++) {
426 busStruct = dspHeader->GetBusPatchEntry(iBusPatch);
428 //printf("busPatchId %d", busStruct->GetBusPatchId());
429 //printf(" BlockId %d", busStruct->GetBlockId());
430 //printf(" DspId %d\n", busStruct->GetDspId());
433 dataSize = busStruct->GetLength();
434 buspatchId = busStruct->GetBusPatchId();
435 for (Int_t iData = 0; iData < dataSize; iData++) {
437 Int_t manuId = busStruct->GetManuId(iData);
438 Int_t channelId = busStruct->GetChannelId(iData);
439 Int_t charge = busStruct->GetCharge(iData);
440 //printf("manuId: %d, channelId: %d charge: %d\n", manuId, channelId, charge);
442 digit->SetSignal(charge);
443 digit->SetPhysicsSignal(charge);
444 digit->SetADC(charge);
445 // Get Back the hits at pads
447 error = GetTrackerMapping(buspatchId,manuId,channelId,digit);
449 printf("Mapping Error\n");
453 cathode = digit->Cathode();
456 detElemId = digit->DetElemId();
457 charge = (Int_t)digit->Signal();
458 iChamber = detElemId/100 - 1;
460 fChambers[iChamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
476 //______________________________________________________________________
477 void MUONData::LoadRawTrigger()
480 // load raw data for the trigger chambers
483 fgRawReader->RewindEvents();
485 Int_t maxEvent = 1000;
486 Int_t minDDL = 0, maxDDL = 1;
487 Int_t detElemId, iChamber, cathode, charge, ix, iy;
489 AliMUONDDLTrigger* ddlTrigger = 0x0;
490 AliMUONDarcHeader* darcHeader = 0x0;
491 AliMUONRegHeader* regHeader = 0x0;
492 AliMUONLocalStruct* localStruct = 0x0;
495 AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();
496 crateManager->ReadFromFile();
502 Event* aevent = Alieve::gEvent;
504 while (fgRawReader->NextEvent()) {
506 if (iEvent != aevent->GetEventId()) {
511 if (iEvent == maxEvent)
514 // read DDL while < 2 DDL
515 while(fgRawStreamTrigger->NextDDL()) {
517 if (fgRawStreamTrigger->GetDDL() < minDDL ||
518 fgRawStreamTrigger->GetDDL() > maxDDL)
521 //printf("\niDDL %d\n", fgRawStreamTrigger->GetDDL());
523 ddlTrigger = fgRawStreamTrigger->GetDDLTrigger();
524 darcHeader = ddlTrigger->GetDarcHeader();
526 //printf("Global output %x\n", (Int_t)darcHeader->GetGlobalOutput());
528 // loop over regional structures
529 Int_t nReg = darcHeader->GetRegHeaderEntries();
530 for(Int_t iReg = 0; iReg < nReg ;iReg++){ //REG loop
532 //printf("RegionalId %d\n", iReg);
534 regHeader = darcHeader->GetRegHeaderEntry(iReg);
535 // printf("Reg length %d\n",regHeader->GetHeaderLength());
538 AliMUONTriggerCrate* crate = crateManager->Crate(fgRawStreamTrigger->GetDDL(), iReg);
539 TObjArray *boards = crate->Boards();
541 // loop over local structures
542 Int_t nLocal = regHeader->GetLocalEntries();
543 for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) {
545 localStruct = regHeader->GetLocalEntry(iLocal);
548 if (localStruct->GetTriggerY() == 0) { // no empty data
550 // local trigger circuit number
551 AliMUONLocalTriggerBoard* localBoard = (AliMUONLocalTriggerBoard*)boards->At(iLocal+1);
553 //printf("LocalId %d\n", localStruct->GetId());
555 Int_t iLocCard = localBoard->GetNumber();
556 Int_t loStripX = (Int_t)localStruct->GetXPos();
557 Int_t loStripY = (Int_t)localStruct->GetYPos();
558 Int_t loDev = (Int_t)localStruct->GetXDev();
560 //printf("iLocCard: %d, XPos: %d, YPos: %d Dev: %d\n", iLocCard, loStripX, loStripY, loDev);
563 if ( GetTriggerMapping(localBoard, localStruct, digitList) ) {
564 for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) {
566 AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry);
567 cathode = digit->Cathode();
570 detElemId = digit->DetElemId();
571 charge = (Int_t)digit->Signal();
572 iChamber = detElemId/100 - 1;
574 //printf("cha %d deid %d cath %1d ix %d iy %d q %d \n",iChamber,detElemId,cathode,ix,iy,charge);
576 fChambers[iChamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
595 //______________________________________________________________________
596 Int_t MUONData::GetTrackerMapping(Int_t buspatchId, UShort_t manuId, UChar_t channelId, AliMUONDigit* digit)
599 // decode digits mapping for the tracking chambers
602 // getting DE from buspatch
603 Int_t detElemId = fgBusPatchManager->GetDEfromBus(buspatchId);
604 //AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, buspatchId));
606 const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, manuId);
607 AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE);
611 printf("No pad for detElemId: %d, busPatchId %d, manuId: %d, channelId: %d\n",detElemId, buspatchId, manuId, channelId);
616 // Getting padX, padY and cathode number.
617 Int_t padX = pad.GetIndices().GetFirst();
618 Int_t padY = pad.GetIndices().GetSecond();
619 Int_t iCath = AliMpDEManager::GetCathod(detElemId,seg->PlaneType());
621 // storing into digits
622 digit->SetPadX(padX);
623 digit->SetPadY(padY);
624 digit->SetCathode(iCath);
625 digit->SetDetElemId(detElemId);
626 digit->SetElectronics(manuId,channelId);
628 //printf("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n",detElemId, buspatchId, manuId, channelId, padX, padY);
634 //______________________________________________________________________
635 Int_t MUONData::GetTriggerMapping(AliMUONLocalTriggerBoard* localBoard,
636 AliMUONLocalStruct* localStruct,
640 // decode digits mapping for the trigger chambers
649 // loop over x1-4 and y1-4
650 for (Int_t icase = 0; icase < 8; icase++) {
652 // get chamber, cathode and associated trigger response pattern
653 GetTriggerChamber(localStruct, xyPattern, iChamber, iCath, icase);
655 if (!xyPattern) continue;
658 AliMUONTriggerCircuit triggerCircuit;
659 detElemId = triggerCircuit.DetElemId(iChamber, localBoard->GetName());
660 nBoard = localBoard->GetNumber();
662 const AliMpVSegmentation* seg
663 = AliMpSegmentation::Instance()
664 ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath));
666 // loop over the 16 bits of pattern
667 for (Int_t ibitxy = 0; ibitxy < 16; ibitxy++) {
669 if ((xyPattern >> ibitxy) & 0x1) {
671 // not quite sure about this
673 if (iCath && localBoard->GetSwitch(6)) offset = -8;
675 AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
677 AliMUONDigit* digit = new AliMUONDigit();
678 if (!pad.IsValid()) {
679 AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
680 detElemId, nBoard, ibitxy));
684 Int_t padX = pad.GetIndices().GetFirst();
685 Int_t padY = pad.GetIndices().GetSecond();
689 digit->SetPadX(padX);
690 digit->SetPadY(padY);
691 digit->SetCathode(iCath);
692 digit->SetDetElemId(detElemId);
693 digit->SetElectronics(nBoard, ibitxy);
694 digitList.Add(digit);
704 //____________________________________________________________________
705 void MUONData::GetTriggerChamber(AliMUONLocalStruct* localStruct, Int_t& xyPattern, Int_t& iChamber, Int_t& iCath, Int_t icase)
708 // extract digits pattern
711 // get chamber & cathode number, (chamber starts at 0 !)
714 xyPattern = localStruct->GetX1();
719 xyPattern = localStruct->GetX2();
724 xyPattern = localStruct->GetX3();
729 xyPattern = localStruct->GetX4();
734 xyPattern = localStruct->GetY1();
739 xyPattern = localStruct->GetY2();
744 xyPattern = localStruct->GetY3();
749 xyPattern = localStruct->GetY4();
757 //______________________________________________________________________
758 Int_t MUONData::GetTrack(Int_t index)
761 // return track stack number for "index"-th track with hits in the chambers
765 return fTrackList[index];
772 //______________________________________________________________________
773 MUONChamberData* MUONData::GetChamberData(Int_t chamber)
776 // return chamber data
779 if (chamber < 0 || chamber > 13) return 0;
781 //if (fChambers[chamber] == 0) CreateChamber(chamber);
783 return fChambers[chamber];