]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCMonitorAltro.cxx
fix for mem leak
[u/mrichter/AliRoot.git] / TPC / AliTPCMonitorAltro.cxx
index 9e74513f23511c8db2859f7c812a793032228ab0..8c9344b06217fde60283c72b49e3610ab39a259d 100755 (executable)
@@ -15,6 +15,9 @@
 
 /*
 $Log$
+Revision 1.2  2007/10/12 13:36:27  cvetan
+Coding convention fixes from Stefan
+
 Revision 1.1  2007/09/17 10:23:31  cvetan
 New TPC monitoring package from Stefan Kniege. The monitoring package can be started by running TPCMonitor.C macro located in macros folder.
 
@@ -39,7 +42,7 @@ New TPC monitoring package from Stefan Kniege. The monitoring package can be sta
 #include "AliTPCMonitorAltro.h"
 #include "AliLog.h" 
 #include <Riostream.h>
-
+using namespace std;
 ClassImp(AliTPCMonitorAltro)  
 
 //_____________________________________________________________________________________________
@@ -60,7 +63,7 @@ AliTPCMonitorAltro::AliTPCMonitorAltro(UInt_t* memory, Int_t size, Int_t fformat
   fTrailerBlockPos(0),
   fTrailerPos(0),
   fNextPos(0),
-  ffilename(new Char_t[256])
+  ffilename()
 {
   // Constructor: Set different CDH offsets for ROOT (0) and date format
   // Data offset can be changed via SetDataOffset(Int_t val)
@@ -90,10 +93,9 @@ AliTPCMonitorAltro::AliTPCMonitorAltro(const AliTPCMonitorAltro &altro) :
   fTrailerBlockPos(altro.fTrailerBlockPos),
   fTrailerPos(altro.fTrailerPos),
   fNextPos(altro.fNextPos),
-  ffilename(new Char_t[strlen(altro.ffilename)+1])
+  ffilename(altro.ffilename)
 {
   // copy constructor
-  strcpy(ffilename,altro.ffilename);
 
 }
 
@@ -120,8 +122,7 @@ AliTPCMonitorAltro &AliTPCMonitorAltro::operator =(const AliTPCMonitorAltro& alt
     fTrailerBlockPos=altro.fTrailerBlockPos;
     fTrailerPos=altro.fTrailerPos; 
     fNextPos=altro.fNextPos;
-    ffilename = new Char_t[strlen(altro.ffilename)+1]; 
-    strcpy(ffilename,altro.ffilename);
+    ffilename = altro.ffilename;
   }
   return *this;
 }
@@ -132,7 +133,6 @@ AliTPCMonitorAltro::~AliTPCMonitorAltro() {
   // Destructor
   if(fallocate40BitArray == true) delete[] f40BitArray;
   if(fallocate10BitArray == true) delete[] f10BitArray;
-  delete[] ffilename;
  }
 
 //_____________________________________________________________________________________________
@@ -149,7 +149,7 @@ void AliTPCMonitorAltro::Allocate10BitArray()
   // Create array for 10 bit decoded data
   fallocate10BitArray = true;
   f10BitArray = new Short_t[Get10BitArraySize()];
-}
+} 
 
 //_____________________________________________________________________________________________
 long long *AliTPCMonitorAltro::Get40BitArray() 
@@ -165,19 +165,19 @@ Short_t *AliTPCMonitorAltro::Get10BitArray()
   return f10BitArray;
 }
 
-//_____________________________________________________________________________________________
-Int_t AliTPCMonitorAltro::Get40BitArraySize() 
-{
-  // Return number of 40 bit words in payload 
-  return fmemory[fsize-1];
-}
+// //_____________________________________________________________________________________________
+// 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;
-}
+// //_____________________________________________________________________________________________
+// Int_t AliTPCMonitorAltro::Get10BitArraySize() 
+// 
+//   // Return number of 10 bit words in payload 
+//   return fmemory[fsize-1]*4;
+// }
 
 //_____________________________________________________________________________________________
 void AliTPCMonitorAltro::Decodeto40Bit() 
@@ -225,58 +225,58 @@ void AliTPCMonitorAltro::Decodeto10Bit(Int_t equipment)
   
   ofstream datout;
   if(fwrite10bit)
+  {
+    TString nameout=Form("%s_PayloadEquipmentId_%03i.txt",ffilename.Data(),equipment);
+    datout.open(nameout.Data());
+    AliInfo(Form("AliTPCMonitorAltro::decodeto10Bit :  Write Data to %s",nameout.Data()));
+    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++)
     {
-      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;
-       }
+      datout << hex << fmemory[ih] << endl;
     }
+  }
   
-  for(Int_t ind = 0; ind < Get40BitArraySize(); ind++) 
+  for(Int_t ind = 0; ind < Get40BitArraySize(); ind++)
+  {
+    rest = ind%4;
+    switch(rest)
     {
-      rest = ind%4; 
-      switch(rest) 
-       {
-       case 0:
-         blackbox = (fmemory[foffset])     + (((Long64_t)(fmemory[foffset+1]&fgk08BitOn))<<32);
-         foffset +=1;
-         break;
-       case 1:
-         blackbox = (fmemory[foffset]>>8 ) + (((Long64_t)(fmemory[foffset+1]&fgk16BitOn))<<24);
-         foffset +=1;
-         break;
-       case 2:
-         blackbox = (fmemory[foffset]>>16) + (((Long64_t)(fmemory[foffset+1]&fgk24BitOn))<<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 & fgkmask10 )    ;
-      f10BitArray[ind*4+1] = (Short_t)((blackbox & fgkmask20)>>10); 
-      f10BitArray[ind*4+2] = (Short_t)((blackbox & fgkmask30)>>20);
-      f10BitArray[ind*4+3] = (Short_t)((blackbox & fgkmask40)>>30);
+    case 0:
+      blackbox = (fmemory[foffset])     + (((Long64_t)(fmemory[foffset+1]&fgk08BitOn))<<32);
+      foffset +=1;
+      break;
+    case 1:
+      blackbox = (fmemory[foffset]>>8 ) + (((Long64_t)(fmemory[foffset+1]&fgk16BitOn))<<24);
+      foffset +=1;
+      break;
+    case 2:
+      blackbox = (fmemory[foffset]>>16) + (((Long64_t)(fmemory[foffset+1]&fgk24BitOn))<<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 & fgkmask10 )    ;
+    f10BitArray[ind*4+1] = (Short_t)((blackbox & fgkmask20)>>10);
+    f10BitArray[ind*4+2] = (Short_t)((blackbox & fgkmask30)>>20);
+    f10BitArray[ind*4+3] = (Short_t)((blackbox & fgkmask40)>>30);
+  }
   if(fwrite10bit)
+  {
+    for(Int_t ind = 0; ind < Get40BitArraySize(); ind++)
     {
-      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";
-       }
+      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();
 }
@@ -286,7 +286,7 @@ 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
-
+  if (GetAltroVersion()==0xaabb) return DecodeTrailerVbb(pos);
   fTrailerPos = pos;
   if(pos<=4) return 0;
   
@@ -321,5 +321,60 @@ Int_t AliTPCMonitorAltro::DecodeTrailer(Int_t pos)
   
 }
 
+//_____________________________________________________________________________________________
+Int_t AliTPCMonitorAltro::DecodeTrailerVbb(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>Get10BitArraySize()-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 )fgkTrailerMaskHardw)  );
+  words             = (Long64_t )( (trailer & ((Long64_t )fgkTrailerMaskNWords))>>16);
+  tail           = (Long64_t )( (trailer & ((Long64_t )fgkTrailerMaskTail   ))>>26 );
+
+    //Decide on read direction (sign) from the RCU trailer information
+  Int_t sign=-1;
+  if (GetAltroVersion()==0xaabb) sign=1;
+  
+  if(words%4!=0) rest =  4-(words%4);
+  fTrailerNWords      = words+rest ;
+  fTrailerDataPos     = pos +sign*(4+rest) ;
+  fTrailerBlockPos    = pos +sign*4 ;
+  fNextPos            = (pos +sign*(fTrailerNWords+4));
+  
+  if(       tail==fgkTrailerTailErr        ) {
+    AliError(Form("Found Altro header with error marker (2AEE)[%0llx]: %i. Supp.next Trailer line (2AA)[%0x]: %i ",
+                  tail,pos,f10BitArray[fNextPos],fNextPos));
+    return -fNextPos;
+  } else if ( tail!=fgkTrailerTail        ) {
+    AliError(Form("Could not read Trailer. \"Write 10bit\" for this event. Last Trailer line (2AA)[%0llx]: %i. Supp.next Trailer line (2AA)[%0x]: %i ",
+                  tail,pos,f10BitArray[fNextPos],fNextPos));    return -1;
+  } else if(     fNextPos==Get10BitArraySize()+3           ) { /* was last channel  */
+    return  0;
+  }  else if(     fNextPos >=Get10BitArraySize()            ) {
+    AliError(Form("Next Trailer position < 0 %i", fNextPos));
+    return -1;
+  } else if((f10BitArray[fNextPos]!=682)&&(f10BitArray[fNextPos]!=686)) {
+    AliError(Form("Could not find tail (2AA) at next supposed position %i",fNextPos));
+    return -1;
+  } else {
+    return fNextPos;
+  }
+  
+}