Pattern class for validation of electronics
authorphille <phille@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 6 May 2008 21:52:08 +0000 (21:52 +0000)
committerphille <phille@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 6 May 2008 21:52:08 +0000 (21:52 +0000)
HLT/PHOS/AliHLTPHOSPattern.cxx [new file with mode: 0644]
HLT/PHOS/AliHLTPHOSPattern.h [new file with mode: 0644]

diff --git a/HLT/PHOS/AliHLTPHOSPattern.cxx b/HLT/PHOS/AliHLTPHOSPattern.cxx
new file mode 100644 (file)
index 0000000..4eb6b90
--- /dev/null
@@ -0,0 +1,210 @@
+/**************************************************************************
+ * Copyright(c) 2006, ALICE Experiment at CERN, All rights reserved.      *
+ *                                                                        *
+ * Authors: Per Thomas Hille for the ALICE                                *
+ * offline/HLT 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.                  *
+ **************************************************************************/
+
+#include "AliHLTPHOSPattern.h"
+#include <iostream>
+
+
+using namespace std;
+
+
+AliHLTPHOSPattern::AliHLTPHOSPattern(const int *pattern, const int length) : AliHLTPHOSBase(),
+                                                                            fPatternLength(0), 
+                                                                            fN(0), 
+                                                                            fCnt(0), 
+                                                                            fPattern(0)
+{
+  SetPattern(pattern, length);
+}
+
+
+
+AliHLTPHOSPattern::~AliHLTPHOSPattern()
+{
+  //  cout << "AliHLTPHOSPattern::~AliHLTPHOSPattern()"  << endl;
+  delete  fPattern;
+  fPattern = 0;
+}
+
+
+
+/*
+ * Checks if the input pattern is equal to fPattern
+ * @param inputPattern the pattern to be compared to @ref fPattern
+ * @param length the number of samples to compare i.e starting at zero and comparing "length samples"
+ * @retrun the number of samples that mismatch, zero fo a complete macth, or -1 if the comparison
+ * could not be done due to an incorrect input (wrong number of samples and/or presamples)
+*/
+const int 
+AliHLTPHOSPattern::ValidatePattern(const int *readbackpattern, const int nSamples, const int nPresamples) const
+{
+  int iRet = 0;
+
+  if(CheckPatternLength(nSamples, nPresamples) == true)
+    {
+      // The presamples must be exluded from the comparison since they are not present in the altro pattern memeory
+      iRet =  DoComparePattern(&readbackpattern[nPresamples], fVal, nSamples);
+    }
+  else
+    {
+      iRet = -1;
+    }
+  
+  return iRet;
+}
+
+
+const int 
+AliHLTPHOSPattern::AddPattern(const int *readbackpattern,  const int nSamples, const int nPresamples)
+{
+  int iRet = ValidatePattern(readbackpattern, nSamples, nPresamples);
+  if(iRet == 0)
+    {
+      fN ++;
+    }
+  else if(iRet > 0)
+    {
+      if(fPattern != 0)
+       {
+         //      fPattern->ValidatePattern(readbackpattern, nSamples, nPresamples);
+         fPattern->AddPattern(readbackpattern, nSamples, nPresamples);
+       }
+      else
+       {
+         //      cout << "AliHLTPHOSPattern::AddPattern, creating new pattern"  << endl;
+         fPattern = new AliHLTPHOSPattern(readbackpattern, nSamples);
+       }
+    }
+  return iRet;
+}
+
+
+const bool 
+AliHLTPHOSPattern::CheckDoExistPattern(const int *readbackpattern,  const int nSamples, const int nPresamples)
+{
+  bool iRet = false;
+  
+  if(ValidatePattern(readbackpattern, nSamples, nPresamples) == 0)
+    {
+      iRet = true;
+    }
+  else if(fPattern !=0)
+    {
+      iRet = fPattern->CheckDoExistPattern(readbackpattern, nSamples, nPresamples);
+    }
+      
+  return iRet;
+}
+
+
+const int 
+AliHLTPHOSPattern::DoComparePattern(const int *pattern1, const int *pattern2, const int length) const
+{
+  int nomatch = 0;
+  
+  for(int i=0; i< length; i++)
+    {
+      if(pattern1[i] != pattern2[i])
+       {
+         nomatch ++;
+       }
+    }
+  return nomatch;
+}
+
+
+const bool 
+AliHLTPHOSPattern::CheckPatternLength(const int nSamples, const int nPresamples) const
+{
+  bool iRet = true;
+
+  if( nSamples  > ALTRO_MAX_SAMPLES)
+    {
+      cout << "Warning: attemp to set pattern array of length " << nSamples << " wich is out of range" <<endl;
+      cout <<"Max length of pattern array is " << ALTRO_MAX_SAMPLES  <<endl;
+      iRet = false;
+    }
+  else if(nPresamples >  ALTRO_MAX_PRESAMPLES)
+    {
+      cout << "ERROR: attemp to set teh number of  " << nPresamples << " wich is out of range" <<endl;
+      cout <<"Max length of pattern array is " << ALTRO_MAX_PRESAMPLES  <<endl;
+      iRet = false;
+    }
+
+  return iRet;
+}
+
+
+void 
+AliHLTPHOSPattern::SetPattern(const int *pattern, const int length)
+{
+  for(int i=0; i< ALTRO_MAX_SAMPLES; i++)
+     {
+       fVal[i] = 0;
+     }
+
+  for(int i = 0; i < length; i++)
+     {
+       fVal[i] = pattern[i];
+     }
+
+  if(length > ALTRO_MAX_SAMPLES)
+    {
+      fPatternLength = ALTRO_MAX_SAMPLES;
+    }
+  else
+    {
+      fPatternLength = length;
+    }
+}
+
+
+/*
+ * Returns the pattern integer array
+ * @param *pattern the pattern will be filleded in the array pointed to by this pointer
+ * @param maxlength the maximum number of samples to fill 
+ * @return the number of samples actually filled, retruns the smalles value of maxlength and
+ * and the length of the pattern array
+ */
+const int  
+AliHLTPHOSPattern::GetPattern(int *pattern,  const int maxlength) const
+{
+  int tmplength = 0;
+
+  if(maxlength > fPatternLength )
+    {
+      tmplength = fPatternLength;
+    }
+  else
+    {
+      tmplength = maxlength;
+    }
+
+  for(int i=0; i < tmplength; i++)
+    {
+      pattern[i] = fVal[i];
+    }
+  return  tmplength;
+}
+
+
+void 
+AliHLTPHOSPattern::PrintPattern(const int nPerLine)
+{
+  DumpData(fVal, fPatternLength  , nPerLine);
+}
+
+// void  DumpData(T *array, int N, int nPerLine)
diff --git a/HLT/PHOS/AliHLTPHOSPattern.h b/HLT/PHOS/AliHLTPHOSPattern.h
new file mode 100644 (file)
index 0000000..a5e5c37
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef ALIHLTPHOSPATTERN_H
+#define ALIHLTPHOSPATTERN_H 
+
+/* Copyright(c) 2006, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice  */ 
+
+
+//#include "AliHLTPHOSConstants.h"
+//using  namespace PhosHLTConst;
+#include "AliHLTPHOSBase.h"
+
+
+class AliHLTPHOSPattern : public AliHLTPHOSBase
+{
+ public:
+  AliHLTPHOSPattern(const int *pattern, const int length);
+  ~AliHLTPHOSPattern();
+  const int AddPattern(const int *readbackpattern,  const int nsamples =  ALTRO_MAX_SAMPLES, const int nPresamples = 0);
+  const bool CheckDoExistPattern(const int *readbackpattern,  const int nsamples =  ALTRO_MAX_SAMPLES, const int nPresamples = 0);
+  const AliHLTPHOSPattern *GetNextPtr() const {return fPattern;}; 
+  const int  GetPattern(int *pattern,  const int maxlengths =  ALTRO_MAX_SAMPLES) const;
+  const int GetPatternLength() const {return  fPatternLength;};
+  const int ValidatePattern(const int *readbackpattern,  const int nsamples =  ALTRO_MAX_SAMPLES, const int nPresamples = 0) const;
+  void PrintPattern(const int nPerLine = ALTRO_MAX_SAMPLES);
+ private:
+  AliHLTPHOSPattern(const AliHLTPHOSPattern &);
+  AliHLTPHOSPattern & operator = (const AliHLTPHOSPattern &); 
+  AliHLTPHOSPattern();
+
+  const int DoComparePattern(const int *inputPattern1, const int *inputPattern2, const int nsamples) const;
+  const bool CheckPatternLength(const int nsamples, const int nPresamples) const;
+  void SetPattern(const int *pattern, const int length);
+  int fVal[ALTRO_MAX_SAMPLES];
+  int fPatternLength;
+  int fN; /**<The number of detected patterns equal to fPattern*/ 
+  int fCnt; 
+  AliHLTPHOSPattern *fPattern;
+ };
+
+#endif
+