]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/AliHLTTPCHistogramHandlerComponent.cxx
bugfix: handle arguments having only whitespaces
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCHistogramHandlerComponent.cxx
index a2cea39033b521b0337b07dfb23bcb030641fb99..8aa1ed20deb9322dc3b7ae5311102bee8e561b79 100644 (file)
@@ -1,5 +1,4 @@
 // $Id$
-
 //**************************************************************************
 //* This file is property of and copyright by the ALICE HLT Project        *
 //* ALICE Experiment at CERN, All rights reserved.                         *
@@ -43,16 +42,15 @@ using namespace std;
 #include "TLine.h"
 #include "TMath.h"
 
-
-AliHLTTPCHistogramHandlerComponent gAliHLTTPCHistogramHandlerComponent;
-
 ClassImp(AliHLTTPCHistogramHandlerComponent) //ROOT macro for the implementation of ROOT specific class methods
 
-AliHLTTPCHistogramHandlerComponent::AliHLTTPCHistogramHandlerComponent()
+  AliHLTTPCHistogramHandlerComponent::AliHLTTPCHistogramHandlerComponent()
     :    
     fSpecification(0),
     fNoiseHistograms(0),
     fKryptonHistograms(0),
+    fUseGeneral(kFALSE),
+    fIgnoreSpecification(kFALSE),
     fSlice(-99),
     
     fHistTH1Tmp(NULL),
@@ -63,8 +61,14 @@ AliHLTTPCHistogramHandlerComponent::AliHLTTPCHistogramHandlerComponent()
     fNumberOfClusters(NULL),
     
     fHistTH2Tmp(NULL),
-    fHistTPCSideA(NULL),  
-    fHistTPCSideC(NULL)    
+    fHistTPCSideAmax(NULL),  
+    fHistTPCSideCmax(NULL),   
+    fHistTPCSideAtot(NULL),  
+    fHistTPCSideCtot(NULL),   
+    fHistTPCSideArms(NULL),  
+    fHistTPCSideCrms(NULL),
+
+    fHistogramData()
 {
   // see header file for class documentation
   // or
@@ -74,7 +78,7 @@ AliHLTTPCHistogramHandlerComponent::AliHLTTPCHistogramHandlerComponent()
 }
 
 AliHLTTPCHistogramHandlerComponent::~AliHLTTPCHistogramHandlerComponent() { 
-// see header file for class documentation
+  // see header file for class documentation
 
 }
 
@@ -82,26 +86,26 @@ AliHLTTPCHistogramHandlerComponent::~AliHLTTPCHistogramHandlerComponent() {
 // These functions are required for the registration process
 
 const char* AliHLTTPCHistogramHandlerComponent::GetComponentID() { 
-// see header file for class documentation
+  // see header file for class documentation
 
   return "TPCHistogramHandler";
 }
 
 void AliHLTTPCHistogramHandlerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list) { 
-// see header file for class documentation
+  // see header file for class documentation
 
   list.clear(); 
   list.push_back( kAliHLTDataTypeHistogram );
 }
 
 AliHLTComponentDataType AliHLTTPCHistogramHandlerComponent::GetOutputDataType() { 
-// see header file for class documentation
+  // see header file for class documentation
 
   return kAliHLTDataTypeHistogram;
 }
 
 int AliHLTTPCHistogramHandlerComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList) { 
-// see header file for class documentation
+  // see header file for class documentation
 
   tgtList.clear();
   tgtList.push_back(kAliHLTDataTypeHistogram);
@@ -109,23 +113,23 @@ int AliHLTTPCHistogramHandlerComponent::GetOutputDataTypes(AliHLTComponentDataTy
 }
 
 void AliHLTTPCHistogramHandlerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier ) { 
-// see header file for class documentation
+  // see header file for class documentation
 
   constBase=0;
   inputMultiplier=2.0;
 }
 
 AliHLTComponent* AliHLTTPCHistogramHandlerComponent::Spawn() { 
-// see header file for class documentation
+  // see header file for class documentation
 
   return new AliHLTTPCHistogramHandlerComponent();
 }
        
 int AliHLTTPCHistogramHandlerComponent::DoInit( int argc, const char** argv ) { 
-// see header file for class documentation
+  // see header file for class documentation
 
-  Int_t i = 0;
-  Char_t* cpErr;
+  //Int_t i = 0;
+  //Char_t* cpErr;
   
   int iResult=0;
   
@@ -144,118 +148,117 @@ int AliHLTTPCHistogramHandlerComponent::DoInit( int argc, const char** argv ) {
     iResult=Reconfigure(NULL, NULL);
   }
 
-  while ( i < argc ) {      
-    if (!strcmp( argv[i], "-sum-noise-histograms")) {
-        fNoiseHistograms = strtoul( argv[i+1], &cpErr ,0);
-            
-    if ( *cpErr ) {
-        HLTError("Cannot convert sum-noise-histograms specifier '%s'.", argv[i+1]);
-        return EINVAL;
-    }
-      i+=2;
-      continue;
-    }
+  if(fUseGeneral == kFALSE){
+    fHistTPCSideAmax = new TH2F("fHistTPCSideAmax","TPC side A (max signal)",250,-250,250,250,-250,250);
+    fHistTPCSideAmax->SetXTitle("global X (cm)"); fHistTPCSideAmax->SetYTitle("global Y (cm)");
+    fHistTPCSideCmax = new TH2F("fHistTPCSideCmax","TPC side C (max signal)",250,-250,250,250,-250,250);
+    fHistTPCSideCmax->SetXTitle("global X (cm)"); fHistTPCSideCmax->SetYTitle("global Y (cm)");
     
-    if (!strcmp( argv[i], "-sum-krypton-histograms")) {
-        fKryptonHistograms = strtoul( argv[i+1], &cpErr ,0);
-            
-    if ( *cpErr ) {
-        HLTError("Cannot convert sum-krypton-histograms specifier '%s'.", argv[i+1]);
-        return EINVAL;
-    }
-      i+=2;
-      continue;
-    }    
-                  
-    Logging(kHLTLogError, "HLT::TPCHistogramHandler::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
-    return EINVAL;
-
-  } // end while
-  
+    fHistTPCSideAtot = new TH2F("fHistTPCSideAtot","TPC side A (total signal)",250,-250,250,250,-250,250);
+    fHistTPCSideAtot->SetXTitle("global X (cm)"); fHistTPCSideAtot->SetYTitle("global Y (cm)");
+    fHistTPCSideCtot = new TH2F("fHistTPCSideCtot","TPC side C (total signal)",250,-250,250,250,-250,250);
+    fHistTPCSideCtot->SetXTitle("global X (cm)"); fHistTPCSideCtot->SetYTitle("global Y (cm)");
+    
+    fHistTPCSideArms = new TH2F("fHistTPCSideArms","TPC side A (baseline RMS)",250,-250,250,250,-250,250);
+    fHistTPCSideArms->SetXTitle("global X (cm)"); fHistTPCSideArms->SetYTitle("global Y (cm)");
+    fHistTPCSideCrms = new TH2F("fHistTPCSideCrms","TPC side C (baseline RMS)",250,-250,250,250,-250,250);
+    fHistTPCSideCrms->SetXTitle("global X (cm)"); fHistTPCSideCrms->SetYTitle("global Y (cm)");
+  }
   return 0;
 } // end DoInit()
 
 int AliHLTTPCHistogramHandlerComponent::DoDeinit() { 
-// see header file for class documentation 
+  // see header file for class documentation 
+    
+  if(fHistTPCSideAmax){ delete fHistTPCSideAmax; fHistTPCSideAmax=NULL; }
+  if(fHistTPCSideCmax){ delete fHistTPCSideCmax; fHistTPCSideCmax=NULL; }
+   
+  if(fHistTPCSideAtot){ delete fHistTPCSideAtot; fHistTPCSideAtot=NULL; }
+  if(fHistTPCSideCtot){ delete fHistTPCSideCtot; fHistTPCSideCtot=NULL; }
    
-   return 0;
+  if(fHistTPCSideArms){ delete fHistTPCSideArms; fHistTPCSideArms=NULL; }
+  if(fHistTPCSideCrms){ delete fHistTPCSideCrms; fHistTPCSideCrms=NULL; }
+
+  return 0;
 }
 
 int AliHLTTPCHistogramHandlerComponent::DoEvent(const AliHLTComponentEventData&/* evtData*/, AliHLTComponentTriggerData& /*trigData*/){
-// see header file for class documentation
+  // see header file for class documentation
 
-  HLTInfo("--- Entering DoEvent() in TPCHistogramHandler ---");
+  //HLTInfo("--- Entering DoEvent() in TPCHistogramHandler ---");
   
   if(GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR )) return 0;
  
-  fTotalClusterChargeIROCAll = new TH1F("fTotalClusterChargeIROCAll","Total Charge of clusters in all IROC",4000,0,4000);  
-  fTotalClusterChargeOROCAll = new TH1F("fTotalClusterChargeOROCAll","Total Charge of clusters in all OROC",4000,0,4000);
-  fQMaxPartitionAll          = new TH1F("fQMaxPartitionAll",         "QMax for All Partitions",             216,0,216);
-  fPlotQmaxROCAll            = new TH1F("fQMaxROCAll",               "QMax for All ROC",                    72,0,72);
-  fNumberOfClusters          = new TH1F("fNumberOfClusters",         "Total Number of Clusters",            1,0,1);
-    
-  fHistTH2Tmp = new TH2F("fHistTH2Tmp","fHistTH2Tmp",250,-250,250,250,-250,250);    
-  fHistTPCSideA = new TH2F("fHistTPCSideA","TPC side A (max signal)",250,-250,250,250,-250,250);
-  fHistTPCSideA->SetXTitle("global X (cm)"); fHistTPCSideA->SetYTitle("global Y (cm)");
-  fHistTPCSideC = new TH2F("fHistTPCSideC","TPC side C (max signal)",250,-250,250,250,-250,250);
-  fHistTPCSideC->SetXTitle("global X (cm)"); fHistTPCSideC->SetYTitle("global Y (cm)");
-  
-  const TObject *iter = NULL;  
-        
+  if(fUseGeneral == kFALSE){
+    fTotalClusterChargeIROCAll = new TH1F("fTotalClusterChargeIROCAll","Total Charge of clusters in all IROC",4000,0,4000);  
+    fTotalClusterChargeOROCAll = new TH1F("fTotalClusterChargeOROCAll","Total Charge of clusters in all OROC",4000,0,4000);
+    fQMaxPartitionAll          = new TH1F("fQMaxPartitionAll",         "QMax for All Partitions",             216,0,216);
+    fPlotQmaxROCAll            = new TH1F("fQMaxROCAll",               "QMax for All ROC",                    72,0,72);
+    fNumberOfClusters          = new TH1F("fNumberOfClusters",         "Total Number of Clusters",            1,0,1);
+  }    
+
+  const TObject *iter = NULL;        
   for(iter = GetFirstInputObject(kAliHLTDataTypeHistogram|kAliHLTDataOriginTPC); iter != NULL; iter = GetNextInputObject()){
+  
+    //      HLTInfo("Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s", 
+    //               evtData.fEventID, evtData.fEventID,
+    //               DataType2Text(GetDataType(iter)).c_str(), 
+    //               DataType2Text(kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC).c_str());
    
-//      HLTInfo("Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s", 
-//               evtData.fEventID, evtData.fEventID,
-//               DataType2Text(GetDataType(iter)).c_str(), 
-//               DataType2Text(kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC).c_str());
-   
-//      if (GetDataType(iter) == (kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC) && GetEventCount()<2){
-//          HLTWarning("data type %s is depricated, use %s (kAliHLTDataTypeHistogram)!", 
-//      DataType2Text(kAliHLTDataTypeHistogram).c_str(),
-//          DataType2Text(kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC).c_str());
-//      }      
+    //      if (GetDataType(iter) == (kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC) && GetEventCount()<2){
+    //          HLTWarning("data type %s is depricated, use %s (kAliHLTDataTypeHistogram)!", 
+    //          DataType2Text(kAliHLTDataTypeHistogram).c_str(),
+    //          DataType2Text(kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC).c_str());
+    //      }      
      
-     if (GetDataType(iter) != (kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC)) continue;
+    if (GetDataType(iter) != (kAliHLTDataTypeHistogram | kAliHLTDataOriginTPC)) continue;
          
-     // Summing the output histograms of the AliHLTTPCNoiseMapComponent (from partition to TPC sides)
-     if(fNoiseHistograms){  
-       
-        fHistTH2Tmp = (TH2F*)iter;
-        UInt_t minSlice     = AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(iter)); 
-        UInt_t maxSlice     = AliHLTTPCDefinitions::GetMaxSliceNr(GetSpecification(iter)); 
-        UInt_t minPartition = AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(iter)); 
-        UInt_t maxPartition = AliHLTTPCDefinitions::GetMaxPatchNr(GetSpecification(iter)); 
-       
-        if((minSlice!=maxSlice) || (minPartition!=maxPartition)){
-            HLTWarning("TPCHistogramHandler::The Noise Map component is not running on partition level!");
-        }
+    // Summing the output histograms of the AliHLTTPCNoiseMapComponent (from partition to TPC sides)
 
-        // minSlice=maxSlice, when the Noise Map component runs on partition level (as it should)
-        if(minSlice<18) fHistTPCSideA->Add(fHistTPCSideA,fHistTH2Tmp,1,1);
-        else           fHistTPCSideC->Add(fHistTPCSideC,fHistTH2Tmp,1,1);
-     } // endif fNoiseHistograms==kTRUE   
-     
-     
-     // Summing the output of AliHLTTPCClusterHistoComponent
-     if(fKryptonHistograms){
-       Int_t thisrow=-1,thissector=-1,row=-1;
-       
-       AliHLTUInt8_t slice = AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(iter));
-       AliHLTUInt8_t patch = AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(iter));
-       row = AliHLTTPCTransform::GetFirstRow(patch); 
-       AliHLTTPCTransform::Slice2Sector(slice,row,thissector,thisrow);
-       
-       fHistTH1Tmp = (TH1F*)iter;      
-       //cout << fHistTH1Tmp->GetName() << "\t" << fHistTH1Tmp->GetEntries() << endl;
-       
+    if(fUseGeneral == kFALSE){
+      if(fNoiseHistograms == kTRUE){  
+        
+       fHistTH2Tmp = (TH2F*)iter;
+       TString histName = fHistTH2Tmp->GetName();
+        
+       UInt_t minSlice     = AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(iter)); 
+       UInt_t maxSlice     = AliHLTTPCDefinitions::GetMaxSliceNr(GetSpecification(iter)); 
+       UInt_t minPartition = AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(iter)); 
+       UInt_t maxPartition = AliHLTTPCDefinitions::GetMaxPatchNr(GetSpecification(iter)); 
+       
+       if((minSlice!=maxSlice) || (minPartition!=maxPartition)){
+         HLTWarning("TPCHistogramHandler::The Noise Map component is not running on partition level!");
+       }
+       
+       // minSlice=maxSlice, when the Noise Map component runs on partition level (as it should)
+        
+       if     (histName.Contains("fHistSideAMaxSignal")) fHistTPCSideAmax->Add(fHistTH2Tmp,1);
+       else if(histName.Contains("fHistSideATotSignal")) fHistTPCSideAtot->Add(fHistTH2Tmp,1);
+       else if(histName.Contains("fHistSideAPadRMS"))    fHistTPCSideArms->Add(fHistTH2Tmp,1);
+       else if(histName.Contains("fHistSideCMaxSignal")) fHistTPCSideCmax->Add(fHistTH2Tmp,1);
+       else if(histName.Contains("fHistSideCTotSignal")) fHistTPCSideCtot->Add(fHistTH2Tmp,1);
+       else if(histName.Contains("fHistSideCPadRMS"))    fHistTPCSideCrms->Add(fHistTH2Tmp,1);
+       else continue;
+       
+      } // endif fNoiseHistograms==kTRUE   
+            
+      // Summing the output of AliHLTTPCClusterHistoComponent
+      if(fKryptonHistograms){
+       Int_t thisrow=-1,thissector=-1,row=-1;
+       
+       AliHLTUInt8_t slice = AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(iter));
+       AliHLTUInt8_t patch = AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(iter));
+       row = AliHLTTPCTransform::GetFirstRow(patch); 
+       AliHLTTPCTransform::Slice2Sector(slice,row,thissector,thisrow);
+       
+       fHistTH1Tmp = (TH1F*)iter;              
        TString name = fHistTH1Tmp->GetName();
-               
+       
        if(name=="fTotalClusterChargeIROCAll"){
-          fTotalClusterChargeIROCAll->Add(fTotalClusterChargeIROCAll,fHistTH1Tmp,1,1);
+         fTotalClusterChargeIROCAll->Add(fTotalClusterChargeIROCAll,fHistTH1Tmp,1,1);
        } 
        else if(name=="fTotalClusterChargeOROCAll"){
-          fTotalClusterChargeOROCAll->Add(fTotalClusterChargeOROCAll,fHistTH1Tmp,1,1);
+         fTotalClusterChargeOROCAll->Add(fTotalClusterChargeOROCAll,fHistTH1Tmp,1,1);
        } 
        else if(name=="fQMaxPartitionAll"){
          for(Int_t t=0;t<216;t++){
@@ -278,86 +281,133 @@ int AliHLTTPCHistogramHandlerComponent::DoEvent(const AliHLTComponentEventData&/
          HLTWarning("No histogram names match. %s",name.Data());
          continue;
        }     
-     } //endif fKryptonHistograms==kTRUE                        
+      } //endif fKryptonHistograms==kTRUE
+    }
+    
+    else { // means fUseGeneral ==kTRUE
+
+      TH1 * tmp = (TH1*)iter;
+      TString histName = tmp->GetName();
+      UInt_t minSlice     = AliHLTTPCDefinitions::GetMinSliceNr(GetSpecification(iter)); 
+      UInt_t maxSlice     = AliHLTTPCDefinitions::GetMaxSliceNr(GetSpecification(iter)); 
+      UInt_t minPartition = AliHLTTPCDefinitions::GetMinPatchNr(GetSpecification(iter)); 
+      UInt_t maxPartition = AliHLTTPCDefinitions::GetMaxPatchNr(GetSpecification(iter)); 
+      
+      Bool_t histogramNotAdded = kTRUE;
+
+      for(UInt_t i=0;i<fHistogramData.size();i++){
+        if(fIgnoreSpecification == kTRUE){
+       
+         /*
+           if(histName.Contains(Form("_Slice_%.2d%.2d_Partition_%.2d%.2d", minSlice, maxSlice, minPartition, maxPartition))){
+           cout << "HistogramContains the given string." << endl;         
+           } 
+         */
+          histName.ReplaceAll(Form("_Slice_%.2d%.2d_Partition_%.2d%.2d", minSlice, maxSlice, minPartition, maxPartition),"");
+       } 
+       
+       if(histName.CompareTo(fHistogramData.at(i).fHistogram->GetName())==0){
+         if((minSlice==fHistogramData.at(i).fMinSlice && maxSlice == fHistogramData.at(i).fMaxSlice) || fIgnoreSpecification == kTRUE){
+           if((minPartition==fHistogramData.at(i).fMinPartition && maxPartition == fHistogramData.at(i).fMaxPartition) || fIgnoreSpecification == kTRUE){
+             fHistogramData.at(i).fHistogram->Add(tmp);
+             histogramNotAdded = kFALSE;
+             break;
+           }
+           else{
+             HLTWarning("Histogram with same name does not have the same partition specification");
+           }
+         }
+         else{
+           HLTWarning("Histogram with same name does not have the same slice specification");
+         }
+       }
+      }
+      
+      if(fHistogramData.size()==0){       
+        if(fIgnoreSpecification == kTRUE){
+          if(histName.Contains(Form("_Slice_%.2d%.2d_Partition_%.2d%.2d", minSlice, maxSlice, minPartition, maxPartition))){
+             cout << "HistogramContains the given string." << endl;
+          } 
+           histName.ReplaceAll(Form("_Slice_%.2d%.2d_Partition_%.2d%.2d", minSlice, maxSlice, minPartition, maxPartition),"");   
+        }
+      }
+
+      if(histogramNotAdded == kTRUE){
+         tmp->SetName(histName);
+        AliHLTHistogramData  histogramData;
+        histogramData.fHistogram = tmp;
+        histogramData.fMinSlice = minSlice;
+        histogramData.fMaxSlice = maxSlice;
+        histogramData.fMinPartition = minPartition;
+        histogramData.fMaxPartition = maxPartition;
+        fHistogramData.push_back(histogramData);
+      }
+    }    
   } // end for loop over histogram blocks
   
   MakeHistosPublic();
   return 0;
 } // end DoEvent()
-
+  
 void AliHLTTPCHistogramHandlerComponent::MakeHistosPublic() {
-// see header file for class documentation
-  if(fNoiseHistograms){ 
-    PushBack((TObject*)fHistTPCSideA,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification( 0,17,0,5));
-    PushBack((TObject*)fHistTPCSideC,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(18,35,0,5));
+  // see header file for class documentation
 
-    if(fHistTH2Tmp){
-      delete fHistTH2Tmp;
-    }
-    if(fHistTPCSideA){
-      delete fHistTPCSideA;
+  if(fUseGeneral == kFALSE){
+    if(fNoiseHistograms){ 
+      PushBack((TObject*)fHistTPCSideAmax,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification( 0,17,0,5));
+      PushBack((TObject*)fHistTPCSideCmax,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(18,35,0,5));
+      
+      PushBack((TObject*)fHistTPCSideAtot,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification( 0,17,0,5));
+      PushBack((TObject*)fHistTPCSideCtot,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(18,35,0,5));
+      
+      PushBack((TObject*)fHistTPCSideArms,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification( 0,17,0,5));
+      PushBack((TObject*)fHistTPCSideCrms,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(18,35,0,5));
+      
+      //if(fHistTH2Tmp)  { delete fHistTH2Tmp;   fHistTH2Tmp=NULL;   }
+      //     if(fHistTPCSideA){ delete fHistTPCSideA; fHistTPCSideA=NULL; }
+      //     if(fHistTPCSideC){ delete fHistTPCSideC; fHistTPCSideC=NULL; }
+    }  
+    
+    if(fKryptonHistograms){
+      PushBack((TObject*)fTotalClusterChargeIROCAll,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,17,0,1));
+      PushBack((TObject*)fTotalClusterChargeOROCAll,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,17,2,5));
+      PushBack((TObject*)fQMaxPartitionAll,       kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,35,0,5));
+      PushBack((TObject*)fPlotQmaxROCAll,         kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,35,0,5));
+      PushBack((TObject*)fNumberOfClusters,       kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,35,0,5));
+      
+      if(fTotalClusterChargeIROCAll){ delete fTotalClusterChargeIROCAll; fTotalClusterChargeIROCAll=NULL; }
+      if(fTotalClusterChargeOROCAll){ delete fTotalClusterChargeOROCAll; fTotalClusterChargeOROCAll=NULL; }
+      if(fQMaxPartitionAll)         { delete fQMaxPartitionAll;          fQMaxPartitionAll=NULL;          }
+      if(fPlotQmaxROCAll)           { delete fPlotQmaxROCAll;            fPlotQmaxROCAll=NULL;            }
+      if(fNumberOfClusters)         { delete fNumberOfClusters;          fNumberOfClusters=NULL;          }
+      if(fHistTH1Tmp)               { delete fHistTH1Tmp;                fHistTH1Tmp=NULL;                }
     }
-    if(fHistTPCSideC){
-      delete fHistTPCSideC;
+  }
+  else{ // means fUseGeneral == kTRUE
+    for(UInt_t i=0;i<fHistogramData.size();i++){
+      PushBack((TObject*)fHistogramData.at(i).fHistogram,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification( 
+                                                                                                                               fHistogramData.at(i).fMinSlice,fHistogramData.at(i).fMaxSlice,fHistogramData.at(i).fMinPartition,fHistogramData.at(i).fMaxPartition));
     }
-    
-    fHistTH2Tmp=NULL;
-    fHistTPCSideA=NULL;
-    fHistTPCSideC=NULL;
-  }  
-  
-  if(fKryptonHistograms){
-     PushBack((TObject*)fTotalClusterChargeIROCAll,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,17,0,1));
-     PushBack((TObject*)fTotalClusterChargeOROCAll,kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,17,2,5));
-     PushBack((TObject*)fQMaxPartitionAll,        kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,35,0,5));
-     PushBack((TObject*)fPlotQmaxROCAll,          kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,35,0,5));
-     PushBack((TObject*)fNumberOfClusters,        kAliHLTDataTypeHistogram,AliHLTTPCDefinitions::EncodeDataSpecification(0,35,0,5));
-          
-     if(fTotalClusterChargeIROCAll){
-       delete fTotalClusterChargeIROCAll;
-       fTotalClusterChargeIROCAll=NULL;
-     }
-     if(fTotalClusterChargeOROCAll){
-       delete fTotalClusterChargeOROCAll;
-       fTotalClusterChargeOROCAll=NULL;
-     }
-     if(fQMaxPartitionAll){
-       delete fQMaxPartitionAll;
-       fQMaxPartitionAll=NULL;
-     }
-     if(fPlotQmaxROCAll){
-       delete fPlotQmaxROCAll;
-       fPlotQmaxROCAll=NULL;
-     }
-     if(fNumberOfClusters){
-       delete fNumberOfClusters;
-       fNumberOfClusters=NULL;
-     }
-     if(fHistTH1Tmp){
-       delete fHistTH1Tmp;
-       fHistTH1Tmp=NULL;
-     }
+    fHistogramData.clear();
   }
-//  TObjArray histos;
+  //  TObjArray histos;
    
-//   if(fPlotSideA) histos.Add(fHistSideA);
-//   if(fPlotSideC) histos.Add(fHistSideC);
-//   if(fApplyNoiseMap) histos.Add(fHistCDBMap);
-//   
-//   TIter iterator(&histos);
-//   while(TObject *pObj=iterator.Next()){
-//   
-//         PushBack(pObj, kAliHLTDataTypeHistogram|kAliHLTDataOriginTPC, fSpecification);
-//   }
-//   
-//   
-//   //PushBack( (TObject*) &histos, kAliHLTDataTypeHistogram, fSpecification);    
+  //   if(fPlotSideA) histos.Add(fHistSideA);
+  //   if(fPlotSideC) histos.Add(fHistSideC);
+  //   if(fApplyNoiseMap) histos.Add(fHistCDBMap);
+  //   
+  //   TIter iterator(&histos);
+  //   while(TObject *pObj=iterator.Next()){
+  //   
+  //         PushBack(pObj, kAliHLTDataTypeHistogram|kAliHLTDataOriginTPC, fSpecification);
+  //   }
+  //   
+  //   
+  //   //PushBack( (TObject*) &histos, kAliHLTDataTypeHistogram, fSpecification);    
 }
 
 int AliHLTTPCHistogramHandlerComponent::Configure(const char* arguments) { 
-// see header file for class documentation
+  // see header file for class documentation
   
   int iResult=0;
   if (!arguments) return iResult;
@@ -373,6 +423,33 @@ int AliHLTTPCHistogramHandlerComponent::Configure(const char* arguments) {
       argument=((TObjString*)pTokens->At(i))->GetString();
       if (argument.IsNull()) continue;
      
+      if (argument.CompareTo("-sum-noise-histograms")==0) {
+       fNoiseHistograms = kTRUE;
+       HLTInfo("got \'-sum-noise-histograms\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       
+      } else if (argument.CompareTo("-sum-krypton-histograms")==0) {
+       fKryptonHistograms = kTRUE;
+       HLTInfo("got \'-sum-krypton-histograms\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       
+      } else if (argument.CompareTo("-use-general")==0) {
+       fUseGeneral = kTRUE;
+       HLTInfo("got \'-use-general\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       
+      } else if (argument.CompareTo("-ignore-specification")==0) {
+       fIgnoreSpecification = kTRUE;
+       HLTInfo("got \'-ignore-specification\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+      }
+      else {
+       HLTError("unknown argument %s", argument.Data());
+       iResult=-EINVAL;
+       break;
+      }
+    } // end for
+    
+    /*for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
+      argument=((TObjString*)pTokens->At(i))->GetString();
+      if (argument.IsNull()) continue;
+     
       if (argument.CompareTo("-sum-noise-histograms")==0) {
        if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
        HLTInfo("got \'-sum-noise-histograms\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
@@ -381,13 +458,20 @@ int AliHLTTPCHistogramHandlerComponent::Configure(const char* arguments) {
        if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
        HLTInfo("got \'-sum-krypton-histograms\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
        
-      } 
+      } else if (argument.CompareTo("-use-general")==0) {
+       fUseGeneral = kTRUE;
+       HLTInfo("got \'-use-general\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       
+      } else if (argument.CompareTo("-ignore-specification")==0) {
+       fIgnoreSpecification = kTRUE;
+       HLTInfo("got \'-ignore-specification\': %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+      }
       else {
        HLTError("unknown argument %s", argument.Data());
        iResult=-EINVAL;
        break;
       }
-    } // end for
+    } // end for*/
   
     delete pTokens;
   
@@ -401,14 +485,14 @@ int AliHLTTPCHistogramHandlerComponent::Configure(const char* arguments) {
 }
 
 int AliHLTTPCHistogramHandlerComponent::Reconfigure(const char* cdbEntry, const char* chainId) { 
-// see header file for class documentation
+  // see header file for class documentation
 
   int iResult=0;
   const char* path="HLT/ConfigTPC/TPCHistogramHandlerComponent";
   const char* defaultNotify="";
   if (cdbEntry) {
-      path=cdbEntry;
-      defaultNotify=" (default)";
+    path=cdbEntry;
+    defaultNotify=" (default)";
   }
   
   if (path) {