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>
21 #include <AliTracker.h>
22 #include <AliMagFMaps.h>
24 #include <AliMUONTrack.h>
25 #include <AliMUONTrackParam.h>
26 #include <AliMUONDigit.h>
27 #include <AliMUONRawStreamTracker.h>
28 #include <AliMUONRawStreamTrigger.h>
29 #include <AliMUONDDLTracker.h>
30 #include <AliMUONBlockHeader.h>
31 #include <AliMUONDspHeader.h>
32 #include <AliMUONBusStruct.h>
33 #include <AliMUONDDLTrigger.h>
34 #include <AliMUONDarcHeader.h>
35 #include <AliMUONRegHeader.h>
36 #include <AliMUONLocalStruct.h>
37 #include <AliMUONTriggerCrateStore.h>
38 #include <AliMUONTriggerCrate.h>
39 #include <AliMUONLocalTriggerBoard.h>
40 #include <AliMUONTriggerCircuit.h>
41 #include <mapping/AliMpBusPatch.h>
42 #include <mapping/AliMpVSegmentation.h>
43 #include <mapping/AliMpSegmentation.h>
44 #include <mapping/AliMpPad.h>
45 #include <mapping/AliMpDEManager.h>
50 #include "TClonesArray.h"
53 using namespace Alieve;
55 //______________________________________________________________________
61 AliRawReader* MUONData::fgRawReader = 0;
62 AliMUONRawStreamTracker* MUONData::fgRawStreamTracker = 0;
63 AliMUONRawStreamTrigger* MUONData::fgRawStreamTrigger = 0;
64 AliMpBusPatch* MUONData::fgBusPatchManager = 0;
66 //______________________________________________________________________
67 MUONData::MUONData() :
81 //______________________________________________________________________
90 delete [] fTrackPoints;
96 //______________________________________________________________________
97 MUONData::MUONData(const MUONData &mdata) :
99 Reve::ReferenceCount()
107 //______________________________________________________________________
108 MUONData& MUONData::operator=(const MUONData &mdata)
111 // Assignment operator
114 if (this != &mdata) {
122 //______________________________________________________________________
123 void MUONData::CreateChamber(Int_t chamber)
126 // create data for the chamber with id=chamber (0 to 13)
129 if (fChambers[chamber] == 0)
130 fChambers[chamber] = new MUONChamberData(chamber);
134 //______________________________________________________________________
135 void MUONData::CreateAllChambers()
138 // create all 14 chambers data
141 for (Int_t c = 0; c < 14; ++c)
146 //______________________________________________________________________
147 void MUONData::DropAllChambers()
150 // release data from all chambers
153 for (Int_t c = 0; c < 14; ++c) {
155 if (fChambers[c] != 0)
156 fChambers[c]->DropData();
162 //______________________________________________________________________
163 void MUONData::DeleteAllChambers()
166 // delete all chambers data
169 for (Int_t c = 0; c < 14; ++c) {
178 //______________________________________________________________________
179 void MUONData::LoadTracks(TTree* tree)
182 // load tracks from the TreeT and creates the track points array
183 // the structure of fTrackPoints:
184 // 0, 0, 0, - new track
185 // px, py, pz - from track param at vertex
186 // x, y, z - track param at vertex
187 // x, y, z - track param at hits
190 // 0, 0, 0 - new track
194 Int_t maxTrackHits = 1+2*10+4;
196 TClonesArray *tracks = 0;
197 tree->SetBranchAddress("MUONTrack",&tracks);
200 Int_t ntracks = tracks->GetEntriesFast();
201 printf("Found %d tracks. \n",ntracks);
205 Int_t maxTrackPoints = (3+3+3*maxTrackHits)*ntracks;
206 fTrackPoints = new Float_t [maxTrackPoints];
208 TMatrixD smatrix(2,2);
215 Float_t px0, py0, pz0;
217 Float_t zg[4] = { -1603.5, -1620.5, -1703.5, -1720.5 };
221 for (Int_t n = 0; n < ntracks; n++) {
223 if (count >= maxTrackPoints) continue;
224 fTrackPoints[3*count ] = 0.0;
225 fTrackPoints[3*count+1] = 0.0;
226 fTrackPoints[3*count+2] = 0.0;
229 mt = (AliMUONTrack*) tracks->At(n);
231 printf("Match trigger %d \n",mt->GetMatchTrigger());
233 AliMUONTrackParam *trackParam = mt->GetTrackParamAtVertex();
234 xRec0 = trackParam->GetNonBendingCoor();
235 yRec0 = trackParam->GetBendingCoor();
236 zRec0 = trackParam->GetZ();
238 px0 = trackParam->Px();
239 py0 = trackParam->Py();
240 pz0 = trackParam->Pz();
242 if (count >= maxTrackPoints) continue;
243 fTrackPoints[3*count ] = px0;
244 fTrackPoints[3*count+1] = py0;
245 fTrackPoints[3*count+2] = pz0;
248 if (count >= maxTrackPoints) continue;
249 fTrackPoints[3*count ] = xRec0;
250 fTrackPoints[3*count+1] = yRec0;
251 fTrackPoints[3*count+2] = zRec0;
254 Float_t xr[20], yr[20], zr[20];
255 for (Int_t i = 0; i < 10; i++) xr[i]=yr[i]=zr[i]=0.0;
257 Int_t nTrackHits = mt->GetNTrackHits();
258 printf("Nhits = %d \n",nTrackHits);
259 TClonesArray* trackParamAtHit;
260 for (Int_t iHit = 0; iHit < nTrackHits; iHit++){
261 trackParamAtHit = mt->GetTrackParamAtHit();
262 trackParam = (AliMUONTrackParam*) trackParamAtHit->At(iHit);
263 xRec = trackParam->GetNonBendingCoor();
264 yRec = trackParam->GetBendingCoor();
265 zRec = trackParam->GetZ();
267 //printf("Hit %d x %f y %f z %f \n",iHit,xRec,yRec,zRec);
273 if (count >= maxTrackPoints) continue;
274 fTrackPoints[3*count ] = xRec;
275 fTrackPoints[3*count+1] = yRec;
276 fTrackPoints[3*count+2] = zRec;
281 Float_t xrc[20], yrc[20], zrc[20];
283 if (mt->GetMatchTrigger() && 1) {
285 for (Int_t i = 0; i < nTrackHits; i++) {
286 if (TMath::Abs(zr[i]) > 1000.0) {
287 //printf("Hit %d x %f y %f z %f \n",iHit,xr[i],yr[i],zr[i]);
295 if (nrc < 2) continue;
298 Float_t ax, bx, ay, by;
303 for (Int_t i = 0; i < nrc; i++) {
304 xv = (Double_t)zrc[i];
305 yv = (Double_t)xrc[i];
306 //printf("x-z: xv %f yv %f \n",xv,yv);
308 smatrix(1,1) += xv*xv;
314 res = smatrix.Invert() * sums;
321 for (Int_t i = 0; i < nrc; i++) {
322 xv = (Double_t)zrc[i];
323 yv = (Double_t)yrc[i];
324 //printf("y-z: xv %f yv %f \n",xv,yv);
326 smatrix(1,1) += xv*xv;
332 res = smatrix.Invert() * sums;
336 Float_t xtc, ytc, ztc;
337 for (Int_t ii = 0; ii < 4; ii++) {
343 //printf("tc: x %f y %f z %f \n",xtc,ytc,ztc);
345 if (count >= maxTrackPoints) continue;
346 fTrackPoints[3*count ] = xtc;
347 fTrackPoints[3*count+1] = ytc;
348 fTrackPoints[3*count+2] = ztc;
353 } // end match trigger
359 printf("MUONData found %d track points. \n",fNPoints);
363 //______________________________________________________________________
364 void MUONData::LoadDigits(TTree* tree)
367 // load digits from the TreeD
370 Char_t branchname[30];
371 TClonesArray *digits = 0;
374 Int_t cathode, detElemId, ix, iy, charge;
376 for (Int_t c = 0; c < 14; ++c) {
378 if (fChambers[c] == 0) continue;
379 sprintf(branchname,"MUONDigits%d",c+1);
380 tree->SetBranchAddress(branchname,&digits);
383 ndigits = digits->GetEntriesFast();
385 for (Int_t id = 0; id < ndigits; id++) {
386 mdig = (AliMUONDigit*)digits->UncheckedAt(id);
388 cathode = mdig->Cathode();
391 detElemId = mdig->DetElemId();
392 charge = (Int_t)mdig->Signal();
395 //printf("cha %d deid %d cath %1d ix %d iy %d q %d \n",c,detElemId,cathode,ix,iy,charge);
398 fChambers[c]->RegisterDigit(detElemId,cathode,ix,iy,charge);
406 //______________________________________________________________________
407 void MUONData::LoadRaw(TString fileName)
410 // load raw data from fileName; tracker and trigger data
413 if (fgRawReader == 0) {
414 // check extention to choose the rawdata file format
415 if (fileName.EndsWith("/")) {
416 fgRawReader = new AliRawReaderFile(fileName); // DDL files
417 } else if (fileName.EndsWith(".root")) {
418 fgRawReader = new AliRawReaderRoot(fileName); // ROOT file
419 } else if (!fileName.IsNull()) {
420 fgRawReader = new AliRawReaderDate(fileName); // DATE file
422 fgRawStreamTracker = new AliMUONRawStreamTracker(fgRawReader);
423 fgRawStreamTrigger = new AliMUONRawStreamTrigger(fgRawReader);
424 fgBusPatchManager = new AliMpBusPatch();
425 fgBusPatchManager->ReadBusPatchFile();
433 //______________________________________________________________________
434 void MUONData::LoadRawTracker()
437 // load raw data for the tracking chambers
440 fgRawReader->RewindEvents();
442 AliMUONDigit* digit = new AliMUONDigit();
444 Int_t maxEvent = 1000;
445 Int_t minDDL = 0, maxDDL = 19;
446 Int_t cathode, detElemId, ix, iy, iChamber;
448 AliMUONDDLTracker* ddlTracker = 0x0;
449 AliMUONBlockHeader* blkHeader = 0x0;
450 AliMUONDspHeader* dspHeader = 0x0;
451 AliMUONBusStruct* busStruct = 0x0;
454 Int_t dataSize, buspatchId;
456 Event* aevent = Alieve::gEvent;
458 while (fgRawReader->NextEvent()) {
460 if (iEvent != aevent->GetEventId()) {
465 if (iEvent == maxEvent)
468 // read DDL while < 20 DDL
469 while(fgRawStreamTracker->NextDDL()) {
471 if (fgRawStreamTracker->GetDDL() < minDDL ||
472 fgRawStreamTracker->GetDDL() > maxDDL)
475 //printf("\niDDL %d\n", fgRawStreamTracker->GetDDL());
477 ddlTracker = fgRawStreamTracker->GetDDLTracker();
479 // loop over block structure
480 Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
481 for(Int_t iBlock = 0; iBlock < nBlock ;iBlock++){
483 blkHeader = ddlTracker->GetBlkHeaderEntry(iBlock);
484 //printf("Block Total length %d\n",blkHeader->GetTotalLength());
486 // loop over DSP structure
487 Int_t nDsp = blkHeader->GetDspHeaderEntries();
488 for(Int_t iDsp = 0; iDsp < nDsp ;iDsp++){ //DSP loop
490 dspHeader = blkHeader->GetDspHeaderEntry(iDsp);
491 // printf("Dsp length %d even word %d\n",dspHeader->GetTotalLength(), dspHeader->GetEventWord());
493 // loop over BusPatch structure
494 Int_t nBusPatch = dspHeader->GetBusPatchEntries();
495 for(Int_t iBusPatch = 0; iBusPatch < nBusPatch; iBusPatch++) {
497 busStruct = dspHeader->GetBusPatchEntry(iBusPatch);
499 //printf("busPatchId %d", busStruct->GetBusPatchId());
500 //printf(" BlockId %d", busStruct->GetBlockId());
501 //printf(" DspId %d\n", busStruct->GetDspId());
504 dataSize = busStruct->GetLength();
505 buspatchId = busStruct->GetBusPatchId();
506 for (Int_t iData = 0; iData < dataSize; iData++) {
508 Int_t manuId = busStruct->GetManuId(iData);
509 Int_t channelId = busStruct->GetChannelId(iData);
510 Int_t charge = busStruct->GetCharge(iData);
511 //printf("manuId: %d, channelId: %d charge: %d\n", manuId, channelId, charge);
513 digit->SetSignal(charge);
514 digit->SetPhysicsSignal(charge);
515 digit->SetADC(charge);
516 // Get Back the hits at pads
518 error = GetTrackerMapping(buspatchId,manuId,channelId,digit);
520 printf("Mapping Error\n");
524 cathode = digit->Cathode();
527 detElemId = digit->DetElemId();
528 charge = (Int_t)digit->Signal();
529 iChamber = detElemId/100 - 1;
531 fChambers[iChamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
547 //______________________________________________________________________
548 void MUONData::LoadRawTrigger()
551 // load raw data for the trigger chambers
554 fgRawReader->RewindEvents();
556 Int_t maxEvent = 1000;
557 Int_t minDDL = 0, maxDDL = 1;
558 Int_t detElemId, iChamber, cathode, charge, ix, iy;
560 AliMUONDDLTrigger* ddlTrigger = 0x0;
561 AliMUONDarcHeader* darcHeader = 0x0;
562 AliMUONRegHeader* regHeader = 0x0;
563 AliMUONLocalStruct* localStruct = 0x0;
566 AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();
567 crateManager->ReadFromFile();
573 Event* aevent = Alieve::gEvent;
575 while (fgRawReader->NextEvent()) {
577 if (iEvent != aevent->GetEventId()) {
582 if (iEvent == maxEvent)
585 // read DDL while < 2 DDL
586 while(fgRawStreamTrigger->NextDDL()) {
588 if (fgRawStreamTrigger->GetDDL() < minDDL ||
589 fgRawStreamTrigger->GetDDL() > maxDDL)
592 //printf("\niDDL %d\n", fgRawStreamTrigger->GetDDL());
594 ddlTrigger = fgRawStreamTrigger->GetDDLTrigger();
595 darcHeader = ddlTrigger->GetDarcHeader();
597 //printf("Global output %x\n", (Int_t)darcHeader->GetGlobalOutput());
599 // loop over regional structures
600 Int_t nReg = darcHeader->GetRegHeaderEntries();
601 for(Int_t iReg = 0; iReg < nReg ;iReg++){ //REG loop
603 //printf("RegionalId %d\n", iReg);
605 regHeader = darcHeader->GetRegHeaderEntry(iReg);
606 // printf("Reg length %d\n",regHeader->GetHeaderLength());
609 AliMUONTriggerCrate* crate = crateManager->Crate(fgRawStreamTrigger->GetDDL(), iReg);
610 TObjArray *boards = crate->Boards();
612 // loop over local structures
613 Int_t nLocal = regHeader->GetLocalEntries();
614 for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) {
616 localStruct = regHeader->GetLocalEntry(iLocal);
619 if (localStruct->GetTriggerY() == 0) { // no empty data
621 // local trigger circuit number
622 AliMUONLocalTriggerBoard* localBoard = (AliMUONLocalTriggerBoard*)boards->At(iLocal+1);
624 //printf("LocalId %d\n", localStruct->GetId());
626 Int_t iLocCard = localBoard->GetNumber();
627 Int_t loStripX = (Int_t)localStruct->GetXPos();
628 Int_t loStripY = (Int_t)localStruct->GetYPos();
629 Int_t loDev = (Int_t)localStruct->GetXDev();
631 //printf("iLocCard: %d, XPos: %d, YPos: %d Dev: %d\n", iLocCard, loStripX, loStripY, loDev);
634 if ( GetTriggerMapping(localBoard, localStruct, digitList) ) {
635 for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) {
637 AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry);
638 cathode = digit->Cathode();
641 detElemId = digit->DetElemId();
642 charge = (Int_t)digit->Signal();
643 iChamber = detElemId/100 - 1;
645 //printf("cha %d deid %d cath %1d ix %d iy %d q %d \n",iChamber,detElemId,cathode,ix,iy,charge);
647 fChambers[iChamber]->RegisterDigit(detElemId,cathode,ix,iy,charge);
666 //______________________________________________________________________
667 Int_t MUONData::GetTrackerMapping(Int_t buspatchId, UShort_t manuId, UChar_t channelId, AliMUONDigit* digit)
670 // decode digits mapping for the tracking chambers
673 // getting DE from buspatch
674 Int_t detElemId = fgBusPatchManager->GetDEfromBus(buspatchId);
675 //AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, buspatchId));
677 const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, manuId);
678 AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE);
682 printf("No pad for detElemId: %d, busPatchId %d, manuId: %d, channelId: %d\n",detElemId, buspatchId, manuId, channelId);
687 // Getting padX, padY and cathode number.
688 Int_t padX = pad.GetIndices().GetFirst();
689 Int_t padY = pad.GetIndices().GetSecond();
690 Int_t iCath = AliMpDEManager::GetCathod(detElemId,seg->PlaneType());
692 // storing into digits
693 digit->SetPadX(padX);
694 digit->SetPadY(padY);
695 digit->SetCathode(iCath);
696 digit->SetDetElemId(detElemId);
697 digit->SetElectronics(manuId,channelId);
699 //printf("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n",detElemId, buspatchId, manuId, channelId, padX, padY);
705 //______________________________________________________________________
706 Int_t MUONData::GetTriggerMapping(AliMUONLocalTriggerBoard* localBoard,
707 AliMUONLocalStruct* localStruct,
711 // decode digits mapping for the trigger chambers
720 // loop over x1-4 and y1-4
721 for (Int_t icase = 0; icase < 8; icase++) {
723 // get chamber, cathode and associated trigger response pattern
724 GetTriggerChamber(localStruct, xyPattern, iChamber, iCath, icase);
726 if (!xyPattern) continue;
729 AliMUONTriggerCircuit triggerCircuit;
730 detElemId = triggerCircuit.DetElemId(iChamber, localBoard->GetName());
731 nBoard = localBoard->GetNumber();
733 const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, iCath);
735 // loop over the 16 bits of pattern
736 for (Int_t ibitxy = 0; ibitxy < 16; ibitxy++) {
738 if ((xyPattern >> ibitxy) & 0x1) {
740 // not quite sure about this
742 if (iCath && localBoard->GetSwitch(6)) offset = -8;
744 AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
746 AliMUONDigit* digit = new AliMUONDigit();
747 if (!pad.IsValid()) {
748 AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
749 detElemId, nBoard, ibitxy));
753 Int_t padX = pad.GetIndices().GetFirst();
754 Int_t padY = pad.GetIndices().GetSecond();
758 digit->SetPadX(padX);
759 digit->SetPadY(padY);
760 digit->SetCathode(iCath);
761 digit->SetDetElemId(detElemId);
762 digit->SetElectronics(nBoard, ibitxy);
763 digitList.Add(digit);
773 //____________________________________________________________________
774 void MUONData::GetTriggerChamber(AliMUONLocalStruct* localStruct, Int_t& xyPattern, Int_t& iChamber, Int_t& iCath, Int_t icase)
777 // extract digits pattern
780 // get chamber & cathode number, (chamber starts at 0 !)
783 xyPattern = localStruct->GetX1();
788 xyPattern = localStruct->GetX2();
793 xyPattern = localStruct->GetX3();
798 xyPattern = localStruct->GetX4();
803 xyPattern = localStruct->GetY1();
808 xyPattern = localStruct->GetY2();
813 xyPattern = localStruct->GetY3();
818 xyPattern = localStruct->GetY4();
826 //______________________________________________________________________
827 MUONChamberData* MUONData::GetChamberData(Int_t chamber)
830 // return chamber data
833 if (chamber < 0 || chamber > 13) return 0;
835 //if (fChambers[chamber] == 0) CreateChamber(chamber);
837 return fChambers[chamber];