]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/PHOS/AliHLTPHOSClusterizerComponent.cxx
Selectiv readout and writing to FXS (oystein)
[u/mrichter/AliRoot.git] / HLT / PHOS / AliHLTPHOSClusterizerComponent.cxx
index c14610383121e2b8c93484aa4cfd021be88cfa3f..bfe4b7f6063fc7f364038773bedede331a723df0 100644 (file)
@@ -1,7 +1,7 @@
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
- * Authors: Øystein Djuvsland <oysteind@ift.uib.no>                       *
+ * Authors: Oystein Djuvsland <oysteind@ift.uib.no>                       *
  *                                                                        *
  * Permission to use, copy, modify and distribute this software and its   *
  * documentation strictly for non-commercial purposes is hereby granted   *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+#include <iostream>
 
 #include "AliHLTPHOSClusterizerComponent.h"
 #include "AliHLTPHOSClusterizer.h"
-#include "AliHLTPHOSPhysicsDefinitions.h"
-#include "AliHLTPHOSDefinitions.h"
 #include "AliHLTPHOSRecPointDataStruct.h"
-#include "AliHLTPHOSClusterDataStruct.h"
-#include "AliHLTPHOSRecPointListDataStruct.h"
+#include "AliHLTPHOSDigitContainerDataStruct.h"
 
-using namespace std;
 
 
-const AliHLTComponentDataType AliHLTPHOSClusterizerComponent::fgkInputDataTypes[]={kAliHLTVoidDataType,{0,"",""}};
+/** @file   AliHLTPHOSClusterizerComponent.cxx
+    @author Oystein Djuvsland
+    @date   
+    @brief  A clusterizer component for PHOS HLT
+*/
+
+// see header file for class documentation
+// or
+// refer to README to build package
+// or
+// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+#if __GNUC__>= 3
+using namespace std;
+#endif
+
+const AliHLTComponentDataType AliHLTPHOSClusterizerComponent::fgkInputDataTypes[]=
+  {
+    kAliHLTVoidDataType,{0,"",""}
+  };
 
 AliHLTPHOSClusterizerComponent gAliHLTPHOSClusterizerComponent;
 
-AliHLTPHOSClusterizerComponent::AliHLTPHOSClusterizerComponent():AliHLTProcessor(), fClusterizerPtr(0), fOutPtr(0), 
-                                                                fRecPointStructArrayPtr(0), fRecPointListPtr(0)
+
+AliHLTPHOSClusterizerComponent::AliHLTPHOSClusterizerComponent(): 
+  AliHLTPHOSProcessor(), 
+  fAllDigitsPtr(0),
+  fClusterizerPtr(0),
+  fRecPointStructArrayPtr(0),
+  fDigitCount(0),
+  fModuleClusterizationMode(false),
+  fNoCrazyness(0)
 {
-  //Constructor
+  //See headerfile for documentation
 }
 
 AliHLTPHOSClusterizerComponent::~AliHLTPHOSClusterizerComponent()
 {
-  //Destructor
+  //See headerfile for documentation
 
   if(fClusterizerPtr)
     {
       delete fClusterizerPtr;
       fClusterizerPtr = 0;
     }
-  
-  if(fRecPointListPtr)
-    {
-      delete fRecPointListPtr;
-      fRecPointListPtr = 0;
-    }
-
   if(fRecPointStructArrayPtr)
     {
-      for(int i = 0; i < 1000; i++) 
-       {
-         fRecPointStructArrayPtr[i].Del();
-       }
+      for (int i = 0; i < 1000; i++)
+        {
+          //     fRecPointStructArrayPtr[i].Del();
+        }
       delete fRecPointStructArrayPtr;
       fRecPointStructArrayPtr = 0;
     }
-  
+  if(fAllDigitsPtr)
+    {
+      delete fAllDigitsPtr;
+      fAllDigitsPtr = 0;
+    }
 }
 
-AliHLTPHOSClusterizerComponent::AliHLTPHOSClusterizerComponent(const AliHLTPHOSClusterizerComponent &):AliHLTProcessor(), 
-                                                                                                      fClusterizerPtr(0), 
-                                                                                                      fOutPtr(0),
-                                                                                                      fRecPointStructArrayPtr(0),
-                                                                                                      fRecPointListPtr(0)
-{
-  //Copy constructor, not implemented
-}
 
 int
 AliHLTPHOSClusterizerComponent::Deinit()
 {
-  //Deinitialization
+  //See headerfile for documentation
 
-  if(fClusterizerPtr)
+  if (fClusterizerPtr)
     {
       delete fClusterizerPtr;
       fClusterizerPtr = 0;
     }
-  
-  if(fRecPointListPtr)
-    {
-      delete fRecPointListPtr;
-      fRecPointListPtr = 0;
-    }
-  
-  for(int i = 0; i < 1000; i++) 
+  for (int i = 0; i < 1000; i++)
     {
-      fRecPointStructArrayPtr[i].Del();
+      //    fRecPointStructArrayPtr[i].Del();
     }
-  
-  if(fRecPointStructArrayPtr)
+
+  if (fRecPointStructArrayPtr)
     {
-      for(int i = 0; i < 1000; i++) 
-       {
-         fRecPointStructArrayPtr[i].Del();
-       }
+      for (int i = 0; i < 1000; i++)
+        {
+          //     fRecPointStructArrayPtr[i].Del();
+        }
       delete fRecPointStructArrayPtr;
       fRecPointStructArrayPtr = 0;
     }
 
-
-
-
-
   return 0;
 }
 
-int
-AliHLTPHOSClusterizerComponent::DoDeinit()
-{
-  //Do deinitialization
-  Logging(kHLTLogInfo, "HLT", "PHOS", ",AliHLTPHOSClusterizerComponent DoDeinit");
-
-  return 0;
-}
-
-
-const Char_t* 
+const Char_t*
 AliHLTPHOSClusterizerComponent::GetComponentID()
 {
-  return "AliHltPhosClusterizer";
+  //See headerfile for documentation
+
+  return "PhosClusterizer";
 }
 
 void
 AliHLTPHOSClusterizerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
 {
-  //Get datatypes for input
-  const AliHLTComponentDataType* pType=fgkInputDataTypes;
-  while (pType->fID!=0) {
-    list.push_back(*pType);
-    pType++;
-  }
+  list.clear();
+  list.push_back(AliHLTPHOSDefinitions::fgkDigitDataType);
 }
 
-AliHLTComponentDataType 
+AliHLTComponentDataType
 AliHLTPHOSClusterizerComponent::GetOutputDataType()
 {
-  return AliHLTPHOSPhysicsDefinitions::fgkAliHLTClusterDataType;
+  //See headerfile for documentation
+  return AliHLTPHOSDefinitions::fgkClusterDataType;
 }
 
 void
 AliHLTPHOSClusterizerComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier )
 
 {
+  //See headerfile for documentation
   constBase = 30;
-  inputMultiplier = 0.2;
+  inputMultiplier = 1;
 }
 
-int 
+int
 AliHLTPHOSClusterizerComponent::DoEvent(const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
-                                       AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size,
-                                       std::vector<AliHLTComponentBlockData>& outputBlocks)
+                                        AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size,
+                                        std::vector<AliHLTComponentBlockData>& outputBlocks)
 {
-  //Do event
-   
+  //See headerfile for documentation
+
   UInt_t tSize            = 0;
-  UInt_t offset           = 0; 
+  UInt_t offset           = 0;
   UInt_t mysize           = 0;
   Int_t nRecPoints        = 0;
-  Int_t index             = 0;
+  Int_t j =0;
 
   AliHLTUInt8_t* outBPtr;
   outBPtr = outputPtr;
-  const AliHLTComponentBlockData* iter = 0; 
-  unsigned long ndx; 
+  const AliHLTComponentBlockData* iter = 0;
+  unsigned long ndx;
 
-  for( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
+  UInt_t specification = 0;
+
+  AliHLTPHOSDigitContainerDataStruct *digitContainerPtr = 0;
+  fClusterizerPtr->SetRecPointContainer((AliHLTPHOSRecPointContainerStruct*)outBPtr);
+  
+  for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
     {
       iter = blocks+ndx;
-      
-      if(iter->fDataType != AliHLTPHOSDefinitions::fgkCellEnergyDataType)
-       {
-         cout << "Warning: data type is not fgkCellEnergyDataType " << endl;
-         continue;
+      if (iter->fDataType == AliHLTPHOSDefinitions::fgkDigitDataType)
+        {
+         specification = specification|iter->fSpecification;
+         digitContainerPtr = reinterpret_cast<AliHLTPHOSDigitContainerDataStruct*>(iter->fPtr);
+         if(fModuleClusterizationMode)
+           {
+             for (UInt_t i = 0; i < digitContainerPtr->fNDigits; i++)
+               {
+                 fAllDigitsPtr->fDigitDataStruct[j].fX = digitContainerPtr->fDigitDataStruct[i].fX;
+                 fAllDigitsPtr->fDigitDataStruct[j].fZ = digitContainerPtr->fDigitDataStruct[i].fZ;
+                 fAllDigitsPtr->fDigitDataStruct[j].fAmplitude = digitContainerPtr->fDigitDataStruct[i].fAmplitude;
+                 fAllDigitsPtr->fDigitDataStruct[j].fTime = digitContainerPtr->fDigitDataStruct[i].fTime;
+                 fAllDigitsPtr->fDigitDataStruct[j].fCrazyness = digitContainerPtr->fDigitDataStruct[i].fCrazyness;
+                 j++;
+               }
+         
+           }
        }
-      index = fClusterizerPtr->BuildCellEnergyArray( reinterpret_cast<AliHLTPHOSRcuCellEnergyDataStruct*>(iter->fPtr),
-                                                    fRecPointListPtr);
-      
     }
-  nRecPoints = fClusterizerPtr->CreateRecPointStructArray(fRecPointStructArrayPtr, fRecPointListPtr, index);
-  
-  cout << "Number of clusters found: " << nRecPoints << endl;
-  
-  for(Int_t i = 0; i < nRecPoints; i++)
+  if(fModuleClusterizationMode && fAllDigitsPtr != 0)
     {
+      fClusterizerPtr->SetDigitContainer(fAllDigitsPtr);
+    }
+  else if(digitContainerPtr != 0)
+    {
+      fClusterizerPtr->SetDigitContainer(digitContainerPtr);
+    }      
+  if(digitContainerPtr != 0)
+    {
+      nRecPoints = fClusterizerPtr->ClusterizeEvent();
+      
       mysize = 0;
       offset = tSize;
-      
-      fOutPtr =  (AliHLTPHOSClusterDataStruct*)outBPtr;
-      fClusterizerPtr->CalculateCenterOfGravity(&fRecPointStructArrayPtr[i]);
-      //      fClusterizerPtr->CalculateMoments(&fRecPointStructArrayPtr[i], 0);
-      //     fClusterizerPtr->ClusterizeStruct(&fRecPointStructArrayPtr[i], fOutPtr);
 
-      mysize += sizeof(AliHLTPHOSClusterDataStruct);
+      mysize += sizeof(AliHLTPHOSRecPointContainerStruct);
       
       AliHLTComponentBlockData bd;
       FillBlockData( bd );
       bd.fOffset = offset;
       bd.fSize = mysize;
-      bd.fDataType = AliHLTPHOSPhysicsDefinitions::fgkAliHLTClusterDataType;
-      bd.fSpecification = 0xFFFFFFFF;
+      bd.fDataType = AliHLTPHOSDefinitions::fgkClusterDataType;
+      bd.fSpecification = specification;
       outputBlocks.push_back( bd );
-       
       tSize += mysize;
       outBPtr += mysize;
-      
-      if( tSize > size )
-       {
-         Logging( kHLTLogFatal, "HLT::AliHLTPHOSClusterizerComponent::DoEvent", "Too much data",
-                  "Data written over allowed buffer. Amount written: %lu, allowed amount: %lu."
-                  , tSize, size );
-         return EMSGSIZE;
-       }
+  
     }
-
-  size = tSize;
-  fClusterizerPtr->ResetCellEnergyArray();
-
+  
+  if ( tSize > size )
+    {
+      Logging( kHLTLogFatal, "HLT::AliHLTPHOSClusterizerComponent::DoEvent", "Too much data",
+               "Data written over allowed buffer. Amount written: %lu, allowed amount: %lu."
+               , tSize, size );
+      return EMSGSIZE;
+    }
+  
   return 0;
 
+
 }
 
 int
 AliHLTPHOSClusterizerComponent::DoInit(int argc, const char** argv )
 {
-  //Do initialization
+  //See headerfile for documentation
+
+  fAllDigitsPtr = new AliHLTPHOSDigitContainerDataStruct();
   fClusterizerPtr = new AliHLTPHOSClusterizer();
-  for(int i = 0; i < argc; i++)
-    {
-      if(!strcmp("-threshold", argv[i]))
-       fClusterizerPtr->SetThreshold(atof(argv[i+1]));
-      if(!strcmp("-clusterthreshold", argv[i]))
-       fClusterizerPtr->SetClusterThreshold(atof(argv[i+1]));
-      if(!strcmp("-highgain", argv[i]))
-       fClusterizerPtr->SetHighGainFactor(atof(argv[i+1]));
-      if(!strcmp("-lowgain", argv[i]))
-       fClusterizerPtr->SetLowGainFactor(atof(argv[i+1]));
-      if(!strcmp("-arraysize", argv[i]))
-       fClusterizerPtr->SetArraySize(atoi(argv[i+1]));
-    }
-  fClusterizerPtr->ResetCellEnergyArray();
-  fRecPointListPtr = new AliHLTPHOSRecPointListDataStruct[N_ROWS_MOD*N_COLUMNS_MOD];
-  fRecPointStructArrayPtr = new AliHLTPHOSRecPointDataStruct[1000];
-  for(int i = 0; i < 1000; i++) 
+  fClusterizerPtr->SetDigitContainer(fAllDigitsPtr);
+  fNoCrazyness = false;
+  //
+
+  ScanArguments(argc, argv);
+  for (int i = 0; i < argc; i++)
     {
-      fRecPointStructArrayPtr[i].fMultiplicity = atoi(argv[4])* atoi(argv[4]);
-      fRecPointStructArrayPtr[i].New();
+      if(!strcmp("-digitthreshold", argv[i]))
+       {
+         fClusterizerPtr->SetEmcMinEnergyThreshold(atof(argv[i+1]));
+       }
+      if(!strcmp("-recpointthreshold", argv[i]))
+       {
+         fClusterizerPtr->SetEmcClusteringThreshold(atof(argv[i+1]));
+       }
+      if(!strcmp("-modulemode", argv[i]))
+       {
+         fModuleClusterizationMode = true;
+       }
     }
-  printf("Clusterizer component started with:\n");
-  printf(" Cell threshold:     %f\n", fClusterizerPtr->GetThreshold());
-  printf(" Cluster threshold:  %f\n", fClusterizerPtr->GetClusterThreshold());
-  printf(" High gain factor:   %f\n", fClusterizerPtr->GetHighGainFactor());
-  printf(" Low gain factor:    %f\n", fClusterizerPtr->GetLowGainFactor());
-  printf(" Cluster array size: %d\n\n", fClusterizerPtr->GetArraySize());
 
   return 0;
 }
@@ -265,6 +263,7 @@ AliHLTPHOSClusterizerComponent::DoInit(int argc, const char** argv )
 AliHLTComponent*
 AliHLTPHOSClusterizerComponent::Spawn()
 {
-  //Spawn a new AliHLTPHOSClusterizerComponent, for HLT framework
+  //See headerfile for documentation
+
   return new AliHLTPHOSClusterizerComponent();
 }