1 #include "AliMUONTrackerDDLDecoder.h"
2 #include "AliMUONTrackerDDLDecoderEventHandler.h"
4 #include "hlt_structs.C"
7 class DiMuonTrackerCustomHandler : public AliMUONTrackerDDLDecoderEventHandler
11 // void OnData(UInt_t data) // Old type
12 void OnNewBusPatch(const AliMUONBusPatchHeaderStruct* header, const void* data)
14 fBusPatchId = header->fBusPatchId;
17 void OnData(const UInt_t data, bool isTrue)
20 fData[fDataCount].fDataId &= 0x0;
21 fData[fDataCount].fDataId = (fData[fDataCount].fDataId|fBusPatchId)<<17;
22 fData[fDataCount].fDataId |= ((UInt_t)(data>>12) & 0x1FFFF) ;
24 fData[fDataCount].fADC = (UShort_t)(data) & 0xFFF;
27 if(fDataCount>(27000-1))
28 cerr<<"Running Out of memory "<<endl;
32 void OnError(ErrorCode code, const void* location)
35 printf("Errorcode : %d, %s, %s\n",
36 code,ErrorCodeToString(code),ErrorCodeToMessage(code));
39 void ResetDataCounter(){
43 Int_t GetDataSize(){return fDataCount;};
45 AliHLTMUONTrackerRawData GetData(Int_t iData){return fData[iData] ;};
51 AliHLTMUONTrackerRawData fData[27000];
54 class DiMuonTriggerDDLDecoder : public TObject
58 DiMuonTriggerDDLDecoder(){;}
59 virtual ~DiMuonTriggerDDLDecoder(void){;}
60 void SetTriggerMappingData(AliHLTMUONTriggerMappingData* mappingData){ fMapData = mappingData;}
61 bool Decode(int* rawData);
63 void ResetDataCounter(){
66 Int_t GetDataSize(){return fDataCount;}
68 AliHLTMUONTriggerPointData GetData(Int_t iData){return fData[iData] ;}
72 AliHLTMUONTriggerMappingData* fMapData;
75 AliHLTMUONTriggerPointData fData[27000];
78 bool DiMuonTriggerDDLDecoder::Decode(int* rawData)
83 int reg_output, reg_phys_trig_occur;
84 int iLocIndex,loc,locDec,triggY,sign,loDev,triggX;
85 short pattern[2][4]; // 2 stands for two cathode planes and 4 stands for 4 chambers
87 int phys_trig_occur = (rawData[index]>>30)&0x1; // 1 for physics trigger, 0 for software trigger
89 if (not phys_trig_occur) // for software trigger
90 index += 8 ;// corresponding to scalar words
92 index += 1 ; // To skip the separator 0xDEADFACE
94 index += 4 ; // corresponding to global input
96 index += 1 ; // reaches to global output
98 if (not phys_trig_occur) index += 10; // corresponds to scalar words
100 index += 1; // separator 0xDEADBEEF
102 for (int iReg = 0; iReg < 8; iReg++){
104 index += 1; // DARC Status Word
105 index += 1; // Regeional Word
106 reg_output = rawData[index] & 0xFF;
107 reg_phys_trig_occur = ( rawData[index] >> 31) & 0x1;
108 // cout<<" reg_phys_trig_occur : "<<reg_phys_trig_occur<<endl;
109 index += 2; // 2 words for regional input
111 index += 1; // L0 counter
113 if (not reg_phys_trig_occur) index += 10;
115 index += 1; // end of Regeonal header 0xBEEFFACE
117 for(int iLoc = 0; iLoc < 16 ; iLoc++){
121 loc = (rawData[index+5] >> 19) & 0xF ;
123 locDec = (rawData[index+5] >> 15) & 0xF;
124 triggY = (rawData[index+5] >> 14) & 0x1;
125 sign = (rawData[index+5] >> 9) & 0x1;
126 loDev = (rawData[index+5] >> 5) & 0xF ;
127 triggX = (loDev >> 4 & 0x1 ) && !(loDev & 0xF);
129 if( locDec != 0x9 ){ // check for Dec
132 pattern[0][0] = rawData[index] & 0xFFFF; // x-strip pattern for chamber 0
133 pattern[0][1] = (rawData[index] >> 16) & 0xFFFF; // x-strip pattern for chamber 1
135 pattern[0][2] = rawData[index] & 0xFFFF;
136 pattern[0][3] = (rawData[index] >> 16) & 0xFFFF;
139 pattern[1][0] = rawData[index] & 0xFFFF; // y-strip pattern for chamber 0
140 pattern[1][1] = (rawData[index] >> 16) & 0xFFFF; // y-strip pattern for chamber 0
142 pattern[1][2] = rawData[index] & 0xFFFF;
143 pattern[1][3] = (rawData[index] >> 16) & 0xFFFF;
146 if (pattern[0][0] || pattern[0][1] || pattern[0][2] || pattern[0][3]
147 || pattern[1][0] || pattern[1][1] || pattern[1][2] || pattern[1][3]
151 bool Xset[4] = {false, false, false, false};
152 bool Yset[4] = {false, false, false, false};
153 AliHLTMUONTriggerPointData fHit[4];
155 for (int iChamber = 0; iChamber < 4 ; iChamber++){ //4 chambers per DDL
156 for (int iPlane = 0; iPlane < 2 ; iPlane++){ // 2 cathode plane
157 for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy){
159 if (((pattern[iPlane][iChamber] >> ibitxy) & 0x1) != 0x1)
163 if((fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fX != 0){
165 fHit[iChamber].fX = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fX ;
166 fHit[iChamber].fDetElemId = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fDetElemId ;
168 Xset[iChamber] = true ;
172 if((fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fY != 0){
174 fHit[iChamber].fY = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fY ;
175 fHit[iChamber].fZ = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fZ ;
177 // cout<<"2: X : "<<fMapData[iReg][iLoc][iChamber][iPlane][ibitxy].fX<<endl;
178 // cout<<"2: Y : "<<fMapData[iReg][iLoc][iChamber][iPlane][ibitxy].fY<<endl;
179 // cout<<"2: Z : "<<fMapData[iReg][iLoc][iChamber][iPlane][ibitxy].fZ<<endl;
181 Yset[iChamber] = true ;
192 for (int iChamber = 0; iChamber < 4 ; iChamber++){ //4 chambers per DDL
193 if(Yset[iChamber] and Xset[iChamber]){
194 // cout<<"chamber : "<<iChamber
195 // <<", (X, Y, Z) : ("<<fHit[iChamber].fX
196 // <<", "<<fHit[iChamber].fY
197 // <<", "<<fHit[iChamber].fZ
199 fData[fDataCount].fDetElemId = fHit[iChamber].fDetElemId ;
200 fData[fDataCount].fX = fHit[iChamber].fX ;
201 fData[fDataCount].fY = fHit[iChamber].fY ;
202 fData[fDataCount].fZ = fHit[iChamber].fZ ;
205 if(fDataCount>(27000-1)){
206 cerr<<"Running Out of memory "<<endl;
208 }// if data overflow quit
216 }// if any non zero pattern found
218 index += 1 ; // the last word, important one
221 if (not reg_phys_trig_occur)
224 index += 1; // end of local Data 0xCAFEFADE
226 index = iLocIndex + 6; //important to reset the index counter for fake locids like 235