/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Log$ */ #include "AliTPCMonitorAltro.h" #include "stdlib.h" #include ClassImp(AliTPCMonitorAltro) //_____________________________________________________________________________________________ AliTPCMonitorAltro::AliTPCMonitorAltro(UInt_t* memory, Int_t size, Int_t fformat) { // Constructor: Set different CDH offsets for root(0) and date format fmemory = memory; fsize = size; fallocate40BitArray = false; fallocate10BitArray = false; fwrite10bit = 0; if( fformat==0) foffset=7; // old CHD Format else if(fformat==1) foffset=8; // memory pointer form DATE (start CDH) else if(fformat==2) foffset=0; // memory pointer form ROOT (after CDH) fverb =0; fTrailerNWords =0; fTrailerHwAddress =0; fTrailerDataPos =0; fTrailerBlockPos =0; fTrailerPos =0; fNextPos =0; ffilename = new Char_t[256]; } //_____________________________________________________________________________________________ AliTPCMonitorAltro::~AliTPCMonitorAltro() { // Destructor if(fallocate40BitArray == true) delete[] f40BitArray; if(fallocate10BitArray == true) delete[] f10BitArray; delete[] ffilename; } //_____________________________________________________________________________________________ void AliTPCMonitorAltro::Allocate40BitArray() { // create array for 40 bit decoded data fallocate40BitArray = true; f40BitArray = new long long[Get40BitArraySize()]; } //_____________________________________________________________________________________________ void AliTPCMonitorAltro::Allocate10BitArray() { // Create array for 10 bit decoded data fallocate10BitArray = true; f10BitArray = new Short_t[Get10BitArraySize()]; } //_____________________________________________________________________________________________ long long *AliTPCMonitorAltro::Get40BitArray() { // Return pointer to array for 40 bit decoded data return f40BitArray; } //_____________________________________________________________________________________________ Short_t *AliTPCMonitorAltro::Get10BitArray() { // Return pointer to array for 10 bit decoded data return f10BitArray; } //_____________________________________________________________________________________________ Int_t AliTPCMonitorAltro::Get40BitArraySize() { // Return number of 40 bit words in payload return fmemory[fsize-1]; } //_____________________________________________________________________________________________ Int_t AliTPCMonitorAltro::Get10BitArraySize() { // Return number of 10 bit words in payload return fmemory[fsize-1]*4; } //_____________________________________________________________________________________________ void AliTPCMonitorAltro::Decodeto40Bit() { // Decode 32 bit words in fmemory to 40 bit words Long64_t blackbox = 0; Int_t rest; for(Int_t i = 0; i < Get40BitArraySize(); i++) { rest = i%4; switch(rest) { case 0: blackbox = (fmemory[foffset]) + (((Long64_t)(fmemory[foffset+1]&k08BitOn))<<32); foffset +=1; break; case 1: blackbox = (fmemory[foffset]>>8 ) + (((Long64_t)(fmemory[foffset+1]&k16BitOn))<<24); foffset +=1; break; case 2: blackbox = (fmemory[foffset]>>16) + (((Long64_t)(fmemory[foffset+1]&k24BitOn))<<16); foffset +=1; break; case 3: blackbox = (fmemory[foffset]>>24) + (((Long64_t)(fmemory[foffset+1] ))<< 8); foffset +=2; break; default: blackbox = 0; break; } f40BitArray[i] = blackbox; } } //_____________________________________________________________________________________________ void AliTPCMonitorAltro::Decodeto10Bit(Int_t equipment) { // Decode 32 bit words in fmemory to 10 bit words. // Write words to file if fwrite10bit ("Write 10 bit" in Monitor.C Gui ) is set Long64_t blackbox = 0; Int_t rest = 0; ofstream datout; if(fwrite10bit) { Char_t nameout[256] ; sprintf(nameout,"%s_PayloadEquipmentId_%03i.txt",ffilename,equipment); datout.open(nameout); AliInfo(Form("AliTPCMonitorAltro::decodeto10Bit : Write Data to %s",nameout)); if(foffset==0) datout << "Payload without CDH in 10bit words " << endl; else datout << "CDH in 32 bit hex words words (" << foffset << " lines ) followed by payload in 10 bit words " << endl; for(Int_t ih = 0; ih< foffset ; ih++) { datout << hex << fmemory[ih] << endl; } } for(Int_t ind = 0; ind < Get40BitArraySize(); ind++) { rest = ind%4; switch(rest) { case 0: blackbox = (fmemory[foffset]) + (((Long64_t)(fmemory[foffset+1]&k08BitOn))<<32); foffset +=1; break; case 1: blackbox = (fmemory[foffset]>>8 ) + (((Long64_t)(fmemory[foffset+1]&k16BitOn))<<24); foffset +=1; break; case 2: blackbox = (fmemory[foffset]>>16) + (((Long64_t)(fmemory[foffset+1]&k24BitOn))<<16); foffset +=1; break; case 3: blackbox = (fmemory[foffset]>>24) + (((Long64_t)(fmemory[foffset+1] ))<< 8); foffset +=2; break; default: blackbox = 0; break; } f10BitArray[ind*4+0] = (Short_t)( blackbox & kmask10 ) ; f10BitArray[ind*4+1] = (Short_t)((blackbox & kmask20)>>10); f10BitArray[ind*4+2] = (Short_t)((blackbox & kmask30)>>20); f10BitArray[ind*4+3] = (Short_t)((blackbox & kmask40)>>30); } if(fwrite10bit) { for(Int_t ind = 0; ind < Get40BitArraySize(); ind++) { datout << dec << f10BitArray[ind*4+0] << "\n"; datout << dec << f10BitArray[ind*4+1] << "\n"; datout << dec << f10BitArray[ind*4+2] << "\n"; datout << dec << f10BitArray[ind*4+3] << "\n"; } } if(fwrite10bit) datout.close(); } //_____________________________________________________________________________________________ Int_t AliTPCMonitorAltro::DecodeTrailer(Int_t pos) { // Decode the trailer word starting at position pos in fmemory // Check if information leads to proper next trailer position fTrailerPos = pos; if(pos<=4) return 0; Long64_t words = 0; Long64_t tail = 0; Long64_t trailer = 0; Long64_t carry = 0; Long64_t rest = 0 ; for(Long64_t iter = 0 ; iter<4;iter++) { carry = f10BitArray[pos-iter] ; carry = ( carry << (30- ((iter)*10))); trailer += carry ; } fTrailerHwAddress = (trailer & ((Long64_t )kTrailerMaskHardw) ); words = (Long64_t )( (trailer & ((Long64_t )kTrailerMaskNWords))>>16); tail = (Long64_t )( (trailer & ((Long64_t )kTrailerMaskTail ))>>26 ); if(words%4!=0) rest = 4-(words%4); fTrailerNWords = words+rest ; fTrailerDataPos = pos -4 -rest ; fTrailerBlockPos = pos -4 ; fNextPos = (pos -fTrailerNWords -4); if( tail!=kTrailerTail ) { AliError(Form("Could not read Trailer. \"Write 10bit\" for this event. Last Trailer line (2AA): %i. Supp.next Trailer line (2AA): %i ",pos,fNextPos)); return -1; } else if( fNextPos==-1 ) { /* was last channel */ return 0; } else if( fNextPos <0 ) { AliError("Next Trailer position < 0 "); return -1; } else if((f10BitArray[fNextPos]!=682)) { AliError(Form("Could not find tail (2AA) at next supposed position %i",fNextPos)); return -1; } else { return fNextPos;} }