ROOT logo
#include "AliMUONTrackerDDLDecoder.h"
#include "AliMUONTrackerDDLDecoderEventHandler.h"

#include "hlt_structs.C"


class DiMuonTrackerCustomHandler : public AliMUONTrackerDDLDecoderEventHandler
{
public:

//   void OnData(UInt_t data) // Old type
  void OnNewBusPatch(const AliMUONBusPatchHeaderStruct* header, const void* data)
  {
    fBusPatchId = header->fBusPatchId;
  }

  void OnData(const UInt_t data, bool isTrue)
  {

    fData[fDataCount].fDataId &= 0x0;
    fData[fDataCount].fDataId = (fData[fDataCount].fDataId|fBusPatchId)<<17;  
    fData[fDataCount].fDataId |= ((UInt_t)(data>>12) & 0x1FFFF) ;

    fData[fDataCount].fADC = (UShort_t)(data) & 0xFFF;
    
    fDataCount++;
    if(fDataCount>(27000-1))
      cerr<<"Running Out of memory "<<endl;

  };
  
  void OnError(ErrorCode code, const void* location)
  {
    
    printf("Errorcode : %d, %s, %s\n",
	   code,ErrorCodeToString(code),ErrorCodeToMessage(code));
  };
  
  void ResetDataCounter(){
    fDataCount = 0;
  }

  Int_t GetDataSize(){return fDataCount;};

  AliHLTMUONTrackerRawData GetData(Int_t iData){return fData[iData] ;};

private:
  Int_t fDataCount;
  Int_t fMaxDataCount;
  UInt_t fBusPatchId;
  AliHLTMUONTrackerRawData fData[27000];
};

class DiMuonTriggerDDLDecoder : public TObject
{
public : 

  DiMuonTriggerDDLDecoder(){;}
  virtual ~DiMuonTriggerDDLDecoder(void){;}
  void SetTriggerMappingData(AliHLTMUONTriggerMappingData* mappingData){ fMapData = mappingData;}
  bool Decode(int* rawData);

  void ResetDataCounter(){
    fDataCount = 0;
  }
  Int_t GetDataSize(){return fDataCount;}

  AliHLTMUONTriggerPointData  GetData(Int_t iData){return fData[iData] ;}
  
  
private:
  AliHLTMUONTriggerMappingData* fMapData;
  Int_t fDataCount;
  Int_t fMaxDataCount;
  AliHLTMUONTriggerPointData fData[27000];
};

bool DiMuonTriggerDDLDecoder::Decode(int* rawData)
{

  int nofTrigRec = 0;
  int index = 0;
  int reg_output, reg_phys_trig_occur;
  int iLocIndex,loc,locDec,triggY,sign,loDev,triggX;
  short pattern[2][4]; // 2 stands for two cathode planes and 4 stands for 4 chambers
	
  int phys_trig_occur = (rawData[index]>>30)&0x1; // 1 for physics trigger, 0 for software trigger
	
  if (not phys_trig_occur) // for software trigger
    index += 8 ;// corresponding to scalar words
	
  index += 1 ; // To skip the separator 0xDEADFACE
  
  index += 4 ; // corresponding to global input
  
  index += 1 ; // reaches to global output
  
  if (not phys_trig_occur) index += 10; // corresponds to scalar words
	
  index += 1; // separator 0xDEADBEEF 
	
  for (int iReg = 0; iReg < 8; iReg++){

    index += 1; // DARC Status Word
    index += 1; // Regeional Word
    reg_output = rawData[index] & 0xFF;
    reg_phys_trig_occur = ( rawData[index] >> 31) & 0x1;
//     cout<<" reg_phys_trig_occur : "<<reg_phys_trig_occur<<endl;
    index += 2; // 2 words for regional input
    
    index += 1; // L0 counter
    
    if (not reg_phys_trig_occur) index += 10;
    
    index += 1; // end of Regeonal header 0xBEEFFACE
    
    for(int iLoc = 0; iLoc < 16 ; iLoc++){
      
      iLocIndex = index;
      
      loc = (rawData[index+5] >> 19) &  0xF ;

      locDec = (rawData[index+5] >> 15) & 0xF;
      triggY = (rawData[index+5] >> 14) & 0x1;
      sign = (rawData[index+5] >> 9) & 0x1;
      loDev = (rawData[index+5] >> 5) & 0xF ;
      triggX = (loDev >> 4 & 0x1 ) && !(loDev & 0xF);
      
      if( locDec != 0x9 ){ // check for Dec
	  
	index += 1;
	pattern[0][0] = rawData[index] & 0xFFFF; // x-strip pattern for chamber 0 
	pattern[0][1] = (rawData[index] >> 16) & 0xFFFF; // x-strip pattern for chamber 1
	index += 1; 
	pattern[0][2] = rawData[index] & 0xFFFF; 
	pattern[0][3] = (rawData[index] >> 16) & 0xFFFF; 
	
	index += 1;
	pattern[1][0] = rawData[index] & 0xFFFF; // y-strip pattern for chamber 0
	pattern[1][1] = (rawData[index] >> 16) & 0xFFFF; // y-strip pattern for chamber 0 
	index += 1; 
	pattern[1][2] = rawData[index] & 0xFFFF; 
	pattern[1][3] = (rawData[index] >> 16) & 0xFFFF; 
	

	if (pattern[0][0] || pattern[0][1] || pattern[0][2] || pattern[0][3]
	    || pattern[1][0] || pattern[1][1] || pattern[1][2] || pattern[1][3]
	    ){
	      

	  bool Xset[4] = {false, false, false, false};
	  bool Yset[4] = {false, false, false, false};
	  AliHLTMUONTriggerPointData fHit[4];

	  for (int iChamber = 0; iChamber < 4 ; iChamber++){ //4 chambers per DDL 
	    for (int iPlane = 0; iPlane < 2 ; iPlane++){ // 2 cathode plane
	      for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy){
		
		if (((pattern[iPlane][iChamber] >> ibitxy) & 0x1) != 0x1)
		  continue;
			
		if (iPlane == 1){
		  if((fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fX != 0){

		    fHit[iChamber].fX = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fX ;
		    fHit[iChamber].fDetElemId = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fDetElemId ;
		    
		    Xset[iChamber] = true ;
		  }
		}
		else{
		  if((fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fY != 0){
		    
		    fHit[iChamber].fY = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fY ;
		    fHit[iChamber].fZ = (fMapData->fLut[iReg][iLoc][iChamber][iPlane][ibitxy]).fZ ;
		    
// 		    cout<<"2: X : "<<fMapData[iReg][iLoc][iChamber][iPlane][ibitxy].fX<<endl;
// 		    cout<<"2: Y : "<<fMapData[iReg][iLoc][iChamber][iPlane][ibitxy].fY<<endl;
// 		    cout<<"2: Z : "<<fMapData[iReg][iLoc][iChamber][iPlane][ibitxy].fZ<<endl;
		    
		    Yset[iChamber] = true ;
		  }
		}

	      }// loop of ibitxy
	    }// iplane
	    
// 	    cout<<endl;
	      
	    }// ichamber
	  
	  for (int iChamber = 0; iChamber < 4 ; iChamber++){ //4 chambers per DDL 
	    if(Yset[iChamber] and Xset[iChamber]){
// 	      cout<<"chamber : "<<iChamber
// 		  <<", (X, Y, Z) : ("<<fHit[iChamber].fX
// 		  <<", "<<fHit[iChamber].fY
// 		  <<", "<<fHit[iChamber].fZ
// 		  <<") "<<endl;
	      fData[fDataCount].fDetElemId = fHit[iChamber].fDetElemId ;
	      fData[fDataCount].fX = fHit[iChamber].fX ;
	      fData[fDataCount].fY = fHit[iChamber].fY ;
	      fData[fDataCount].fZ = fHit[iChamber].fZ ;
	      fDataCount++;

	      if(fDataCount>(27000-1)){
		cerr<<"Running Out of memory "<<endl;
		return false;
	      }// if data overflow quit
	      
	    }// of both chamber
	  }// chamber loop
	      
	  nofTrigRec++;
	      
	      
	}// if any non zero pattern found
	
	index += 1 ; // the last word, important one
      }// Dec Condn
      
      if (not reg_phys_trig_occur)
	index += 45;
      
      index += 1; // end of local Data 0xCAFEFADE
      
      index = iLocIndex + 6; //important to reset the index counter for fake locids like 235 
    }// iLoc loop
  }// iReg Loop

  return true;
}
 DIMUONRawReader.C:1
 DIMUONRawReader.C:2
 DIMUONRawReader.C:3
 DIMUONRawReader.C:4
 DIMUONRawReader.C:5
 DIMUONRawReader.C:6
 DIMUONRawReader.C:7
 DIMUONRawReader.C:8
 DIMUONRawReader.C:9
 DIMUONRawReader.C:10
 DIMUONRawReader.C:11
 DIMUONRawReader.C:12
 DIMUONRawReader.C:13
 DIMUONRawReader.C:14
 DIMUONRawReader.C:15
 DIMUONRawReader.C:16
 DIMUONRawReader.C:17
 DIMUONRawReader.C:18
 DIMUONRawReader.C:19
 DIMUONRawReader.C:20
 DIMUONRawReader.C:21
 DIMUONRawReader.C:22
 DIMUONRawReader.C:23
 DIMUONRawReader.C:24
 DIMUONRawReader.C:25
 DIMUONRawReader.C:26
 DIMUONRawReader.C:27
 DIMUONRawReader.C:28
 DIMUONRawReader.C:29
 DIMUONRawReader.C:30
 DIMUONRawReader.C:31
 DIMUONRawReader.C:32
 DIMUONRawReader.C:33
 DIMUONRawReader.C:34
 DIMUONRawReader.C:35
 DIMUONRawReader.C:36
 DIMUONRawReader.C:37
 DIMUONRawReader.C:38
 DIMUONRawReader.C:39
 DIMUONRawReader.C:40
 DIMUONRawReader.C:41
 DIMUONRawReader.C:42
 DIMUONRawReader.C:43
 DIMUONRawReader.C:44
 DIMUONRawReader.C:45
 DIMUONRawReader.C:46
 DIMUONRawReader.C:47
 DIMUONRawReader.C:48
 DIMUONRawReader.C:49
 DIMUONRawReader.C:50
 DIMUONRawReader.C:51
 DIMUONRawReader.C:52
 DIMUONRawReader.C:53
 DIMUONRawReader.C:54
 DIMUONRawReader.C:55
 DIMUONRawReader.C:56
 DIMUONRawReader.C:57
 DIMUONRawReader.C:58
 DIMUONRawReader.C:59
 DIMUONRawReader.C:60
 DIMUONRawReader.C:61
 DIMUONRawReader.C:62
 DIMUONRawReader.C:63
 DIMUONRawReader.C:64
 DIMUONRawReader.C:65
 DIMUONRawReader.C:66
 DIMUONRawReader.C:67
 DIMUONRawReader.C:68
 DIMUONRawReader.C:69
 DIMUONRawReader.C:70
 DIMUONRawReader.C:71
 DIMUONRawReader.C:72
 DIMUONRawReader.C:73
 DIMUONRawReader.C:74
 DIMUONRawReader.C:75
 DIMUONRawReader.C:76
 DIMUONRawReader.C:77
 DIMUONRawReader.C:78
 DIMUONRawReader.C:79
 DIMUONRawReader.C:80
 DIMUONRawReader.C:81
 DIMUONRawReader.C:82
 DIMUONRawReader.C:83
 DIMUONRawReader.C:84
 DIMUONRawReader.C:85
 DIMUONRawReader.C:86
 DIMUONRawReader.C:87
 DIMUONRawReader.C:88
 DIMUONRawReader.C:89
 DIMUONRawReader.C:90
 DIMUONRawReader.C:91
 DIMUONRawReader.C:92
 DIMUONRawReader.C:93
 DIMUONRawReader.C:94
 DIMUONRawReader.C:95
 DIMUONRawReader.C:96
 DIMUONRawReader.C:97
 DIMUONRawReader.C:98
 DIMUONRawReader.C:99
 DIMUONRawReader.C:100
 DIMUONRawReader.C:101
 DIMUONRawReader.C:102
 DIMUONRawReader.C:103
 DIMUONRawReader.C:104
 DIMUONRawReader.C:105
 DIMUONRawReader.C:106
 DIMUONRawReader.C:107
 DIMUONRawReader.C:108
 DIMUONRawReader.C:109
 DIMUONRawReader.C:110
 DIMUONRawReader.C:111
 DIMUONRawReader.C:112
 DIMUONRawReader.C:113
 DIMUONRawReader.C:114
 DIMUONRawReader.C:115
 DIMUONRawReader.C:116
 DIMUONRawReader.C:117
 DIMUONRawReader.C:118
 DIMUONRawReader.C:119
 DIMUONRawReader.C:120
 DIMUONRawReader.C:121
 DIMUONRawReader.C:122
 DIMUONRawReader.C:123
 DIMUONRawReader.C:124
 DIMUONRawReader.C:125
 DIMUONRawReader.C:126
 DIMUONRawReader.C:127
 DIMUONRawReader.C:128
 DIMUONRawReader.C:129
 DIMUONRawReader.C:130
 DIMUONRawReader.C:131
 DIMUONRawReader.C:132
 DIMUONRawReader.C:133
 DIMUONRawReader.C:134
 DIMUONRawReader.C:135
 DIMUONRawReader.C:136
 DIMUONRawReader.C:137
 DIMUONRawReader.C:138
 DIMUONRawReader.C:139
 DIMUONRawReader.C:140
 DIMUONRawReader.C:141
 DIMUONRawReader.C:142
 DIMUONRawReader.C:143
 DIMUONRawReader.C:144
 DIMUONRawReader.C:145
 DIMUONRawReader.C:146
 DIMUONRawReader.C:147
 DIMUONRawReader.C:148
 DIMUONRawReader.C:149
 DIMUONRawReader.C:150
 DIMUONRawReader.C:151
 DIMUONRawReader.C:152
 DIMUONRawReader.C:153
 DIMUONRawReader.C:154
 DIMUONRawReader.C:155
 DIMUONRawReader.C:156
 DIMUONRawReader.C:157
 DIMUONRawReader.C:158
 DIMUONRawReader.C:159
 DIMUONRawReader.C:160
 DIMUONRawReader.C:161
 DIMUONRawReader.C:162
 DIMUONRawReader.C:163
 DIMUONRawReader.C:164
 DIMUONRawReader.C:165
 DIMUONRawReader.C:166
 DIMUONRawReader.C:167
 DIMUONRawReader.C:168
 DIMUONRawReader.C:169
 DIMUONRawReader.C:170
 DIMUONRawReader.C:171
 DIMUONRawReader.C:172
 DIMUONRawReader.C:173
 DIMUONRawReader.C:174
 DIMUONRawReader.C:175
 DIMUONRawReader.C:176
 DIMUONRawReader.C:177
 DIMUONRawReader.C:178
 DIMUONRawReader.C:179
 DIMUONRawReader.C:180
 DIMUONRawReader.C:181
 DIMUONRawReader.C:182
 DIMUONRawReader.C:183
 DIMUONRawReader.C:184
 DIMUONRawReader.C:185
 DIMUONRawReader.C:186
 DIMUONRawReader.C:187
 DIMUONRawReader.C:188
 DIMUONRawReader.C:189
 DIMUONRawReader.C:190
 DIMUONRawReader.C:191
 DIMUONRawReader.C:192
 DIMUONRawReader.C:193
 DIMUONRawReader.C:194
 DIMUONRawReader.C:195
 DIMUONRawReader.C:196
 DIMUONRawReader.C:197
 DIMUONRawReader.C:198
 DIMUONRawReader.C:199
 DIMUONRawReader.C:200
 DIMUONRawReader.C:201
 DIMUONRawReader.C:202
 DIMUONRawReader.C:203
 DIMUONRawReader.C:204
 DIMUONRawReader.C:205
 DIMUONRawReader.C:206
 DIMUONRawReader.C:207
 DIMUONRawReader.C:208
 DIMUONRawReader.C:209
 DIMUONRawReader.C:210
 DIMUONRawReader.C:211
 DIMUONRawReader.C:212
 DIMUONRawReader.C:213
 DIMUONRawReader.C:214
 DIMUONRawReader.C:215
 DIMUONRawReader.C:216
 DIMUONRawReader.C:217
 DIMUONRawReader.C:218
 DIMUONRawReader.C:219
 DIMUONRawReader.C:220
 DIMUONRawReader.C:221
 DIMUONRawReader.C:222
 DIMUONRawReader.C:223
 DIMUONRawReader.C:224
 DIMUONRawReader.C:225
 DIMUONRawReader.C:226
 DIMUONRawReader.C:227
 DIMUONRawReader.C:228
 DIMUONRawReader.C:229
 DIMUONRawReader.C:230
 DIMUONRawReader.C:231
 DIMUONRawReader.C:232