ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTSPACEPOINTCONTAINER_H
#define ALIHLTSPACEPOINTCONTAINER_H
//* This file is property of and copyright by the ALICE HLT Project        * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//* See cxx source for full Copyright notice                               *

/// @file   AliHLTSpacePointContainer.h
/// @author Matthias Richter
/// @date   2011-04-29
/// @brief  Base helper class for handling of HLT space point data blocks
///

#include <vector>
#include <cmath>
#include <TObject.h>
#include "AliHLTLogging.h"
#include "AliHLTDataTypes.h"
#include "AliHLTStdIncludes.h"
#include "AliHLTIndexGrid.h"

class AliHLTDataDeflater;
class TArrayC;
class TH1;
class TTree;

/**
 * @class AliHLTSpacePointContainer
 * Base class of helper classes for space point data blocks.
 * The class implements a couple of interface methods to be commonly used
 * for space point data blocks.
 *
 * @ingroup alihlt_base
 */
class AliHLTSpacePointContainer : public TObject, public AliHLTLogging
{
 public:
  /// standard constructor
  AliHLTSpacePointContainer();
  /// copy constructor
  AliHLTSpacePointContainer(const AliHLTSpacePointContainer&);
  /// assignment operator
  AliHLTSpacePointContainer& operator=(const AliHLTSpacePointContainer&);

  /// destructor
  ~AliHLTSpacePointContainer();

  struct AliHLTSpacePointProperties {
    AliHLTSpacePointProperties(AliHLTUInt32_t id=~(AliHLTUInt32_t)0, int trackid=-1) : fId(id), fTrackId(trackid) {}
    AliHLTUInt32_t fId;      //! the id of the spacepoint
    int            fTrackId; //! track the spacepoint is assigned to
  };
  typedef AliHLTIndexGrid<float, AliHLTSpacePointProperties> AliHLTSpacePointPropertyGrid;
  typedef AliHLTIndexGrid<float, AliHLTUInt32_t> AliHLTSpacePointGrid;

  //////////////////////////////////////////////////////////////////////////
  //
  // interface functions
  //

  /// add input block to the collection
  virtual int AddInputBlock(const AliHLTComponentBlockData* pDesc)=0;
  virtual int PopulateAccessGrid(AliHLTSpacePointPropertyGrid* /*pGrid*/, AliHLTUInt32_t /*mask*/) const {return -ENOSYS;}
  virtual const AliHLTSpacePointPropertyGrid* GetSpacePointPropertyGrid(AliHLTUInt32_t /*mask*/) const {return NULL;}
  virtual int SetSpacePointPropertyGrid(AliHLTUInt32_t /*mask*/, AliHLTSpacePointPropertyGrid* /*pGrid*/) {return -ENOSYS;}

  // for backward compatibility
  virtual int PopulateAccessGrid(AliHLTSpacePointGrid* /*pGrid*/, AliHLTUInt32_t /*mask*/) const {return -ENOSYS;}
  virtual const AliHLTSpacePointGrid* GetAccessGrid(AliHLTUInt32_t /*mask*/) const {return NULL;}
  virtual int SetAccessGrid(AliHLTUInt32_t /*mask*/, AliHLTSpacePointGrid* /*pGrid*/) {return -ENOSYS;}

  virtual int GetNumberOfSpacePoints() const;
  virtual bool Check(AliHLTUInt32_t clusterID) const;
  virtual int GetClusterIDs(vector<AliHLTUInt32_t>& tgt) const = 0;
  virtual const vector<AliHLTUInt32_t>* GetClusterIDs(AliHLTUInt32_t /*mask*/) {return NULL;}
  virtual float GetX(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetXWidth(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetY(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetYWidth(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetZ(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetZWidth(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetCharge(AliHLTUInt32_t clusterID) const = 0;
  virtual float GetMaxSignal(AliHLTUInt32_t /*clusterID*/) const {return 0.0;}
  virtual float GetPhi(AliHLTUInt32_t /*clusterID*/) const {return 0.0;}

  /// create a collection of clusters for a space point mask
  virtual AliHLTSpacePointContainer* SelectByMask(AliHLTUInt32_t mask, bool bAlloc=false) const;

  /// create a collection of clusters for a specific track
  virtual AliHLTSpacePointContainer* SelectByTrack(int trackId, bool bAlloc=false) const;

  /// create a collection of clusters for a specific MC track
  virtual AliHLTSpacePointContainer* SelectByMC(int mcId, bool bAlloc=false) const;

  /// create a collection of all used clusters
  virtual AliHLTSpacePointContainer* UsedClusters(bool bAlloc=false) const;

  /// create a collection of all unused clusters
  virtual AliHLTSpacePointContainer* UnusedClusters(bool bAlloc=false) const;

  int MarkUsed(AliHLTUInt32_t clusterID) {return MarkUsed(&clusterID, sizeof(clusterID));}
  virtual int MarkUsed(const AliHLTUInt32_t* clusterIDs, int arraySize);

  int SetTrackID(int trackID, AliHLTUInt32_t clusterID) {
    return SetTrackID(trackID, &clusterID, sizeof(clusterID));
  }
  virtual int SetTrackID(int trackID, const AliHLTUInt32_t* clusterIDs, int arraySize);

  virtual int GetTrackID(AliHLTUInt32_t /*clusterID*/) const {return -1;}

  int SetMCID(int mcID, AliHLTUInt32_t clusterID) {
    return SetMCID(mcID, &clusterID, sizeof(clusterID));
  }
  virtual int SetMCID(int clusterID, const AliHLTUInt32_t* clusterIDs, int arraySize);

  /// write blocks to HLT component output
  virtual int Write(AliHLTUInt8_t* outputPtr, AliHLTUInt32_t size,
		    vector<AliHLTComponentBlockData>& outputBlocks,
		    AliHLTDataDeflater* /*pDeflater*/,
		    const char* option="") const {
    return Write(outputPtr, size, outputBlocks, option);
  }

  /// write blocks to HLT component output: old function definition for backward compatibility
  virtual int Write(AliHLTUInt8_t* /*outputPtr*/, AliHLTUInt32_t /*size*/,
		    vector<AliHLTComponentBlockData>& /*outputBlocks*/,
		    const char* /*option*/="") const {return 0;}

  /// add input block from file to collection
  int AddInputBlock(const char* filename, AliHLTComponentDataType dt, unsigned specification);

  /// add input block from list of blank separated files to collection
  int AddInputBlocks(const char* filenames, AliHLTComponentDataType dt);

  /// alloc memory for a space point data block
  AliHLTUInt8_t* Alloc(int size);

  /// inherited from TObject: clear the object and reset pointer references
  virtual void Clear(Option_t * /*option*/ ="");

  /// inherited from TObject
  virtual void Print(Option_t *option="") const;

  virtual void Print(ostream& out, Option_t *option="") const;

  void Draw(Option_t *option);

  TH1* DrawProjection(const char* plane) const {
    vector<AliHLTUInt32_t> selection; // empty list -> no selection
    return DrawProjection(plane, selection);
  }

  TH1* DrawProjection(const char* plane, AliHLTUInt32_t specification) const {
    vector<AliHLTUInt32_t> selection; selection.push_back(specification);
    return DrawProjection(plane, selection);
  }

  TH1* DrawProjection(const char* plane, const vector<AliHLTUInt32_t>& selection) const;

  TTree* FillTree(const char* name, const char* title="");

 protected:

 private:
  vector<TArrayC*> fBuffers; //! buffers of loaded files

  ClassDef(AliHLTSpacePointContainer, 0)
};

ostream& operator<<(ostream &out, const AliHLTSpacePointContainer& c);

ostream& operator<<(ostream &out, const AliHLTSpacePointContainer::AliHLTSpacePointProperties& p);

bool operator==(const AliHLTSpacePointContainer::AliHLTSpacePointProperties& a,
		const AliHLTSpacePointContainer::AliHLTSpacePointProperties& b);
#endif
 AliHLTSpacePointContainer.h:1
 AliHLTSpacePointContainer.h:2
 AliHLTSpacePointContainer.h:3
 AliHLTSpacePointContainer.h:4
 AliHLTSpacePointContainer.h:5
 AliHLTSpacePointContainer.h:6
 AliHLTSpacePointContainer.h:7
 AliHLTSpacePointContainer.h:8
 AliHLTSpacePointContainer.h:9
 AliHLTSpacePointContainer.h:10
 AliHLTSpacePointContainer.h:11
 AliHLTSpacePointContainer.h:12
 AliHLTSpacePointContainer.h:13
 AliHLTSpacePointContainer.h:14
 AliHLTSpacePointContainer.h:15
 AliHLTSpacePointContainer.h:16
 AliHLTSpacePointContainer.h:17
 AliHLTSpacePointContainer.h:18
 AliHLTSpacePointContainer.h:19
 AliHLTSpacePointContainer.h:20
 AliHLTSpacePointContainer.h:21
 AliHLTSpacePointContainer.h:22
 AliHLTSpacePointContainer.h:23
 AliHLTSpacePointContainer.h:24
 AliHLTSpacePointContainer.h:25
 AliHLTSpacePointContainer.h:26
 AliHLTSpacePointContainer.h:27
 AliHLTSpacePointContainer.h:28
 AliHLTSpacePointContainer.h:29
 AliHLTSpacePointContainer.h:30
 AliHLTSpacePointContainer.h:31
 AliHLTSpacePointContainer.h:32
 AliHLTSpacePointContainer.h:33
 AliHLTSpacePointContainer.h:34
 AliHLTSpacePointContainer.h:35
 AliHLTSpacePointContainer.h:36
 AliHLTSpacePointContainer.h:37
 AliHLTSpacePointContainer.h:38
 AliHLTSpacePointContainer.h:39
 AliHLTSpacePointContainer.h:40
 AliHLTSpacePointContainer.h:41
 AliHLTSpacePointContainer.h:42
 AliHLTSpacePointContainer.h:43
 AliHLTSpacePointContainer.h:44
 AliHLTSpacePointContainer.h:45
 AliHLTSpacePointContainer.h:46
 AliHLTSpacePointContainer.h:47
 AliHLTSpacePointContainer.h:48
 AliHLTSpacePointContainer.h:49
 AliHLTSpacePointContainer.h:50
 AliHLTSpacePointContainer.h:51
 AliHLTSpacePointContainer.h:52
 AliHLTSpacePointContainer.h:53
 AliHLTSpacePointContainer.h:54
 AliHLTSpacePointContainer.h:55
 AliHLTSpacePointContainer.h:56
 AliHLTSpacePointContainer.h:57
 AliHLTSpacePointContainer.h:58
 AliHLTSpacePointContainer.h:59
 AliHLTSpacePointContainer.h:60
 AliHLTSpacePointContainer.h:61
 AliHLTSpacePointContainer.h:62
 AliHLTSpacePointContainer.h:63
 AliHLTSpacePointContainer.h:64
 AliHLTSpacePointContainer.h:65
 AliHLTSpacePointContainer.h:66
 AliHLTSpacePointContainer.h:67
 AliHLTSpacePointContainer.h:68
 AliHLTSpacePointContainer.h:69
 AliHLTSpacePointContainer.h:70
 AliHLTSpacePointContainer.h:71
 AliHLTSpacePointContainer.h:72
 AliHLTSpacePointContainer.h:73
 AliHLTSpacePointContainer.h:74
 AliHLTSpacePointContainer.h:75
 AliHLTSpacePointContainer.h:76
 AliHLTSpacePointContainer.h:77
 AliHLTSpacePointContainer.h:78
 AliHLTSpacePointContainer.h:79
 AliHLTSpacePointContainer.h:80
 AliHLTSpacePointContainer.h:81
 AliHLTSpacePointContainer.h:82
 AliHLTSpacePointContainer.h:83
 AliHLTSpacePointContainer.h:84
 AliHLTSpacePointContainer.h:85
 AliHLTSpacePointContainer.h:86
 AliHLTSpacePointContainer.h:87
 AliHLTSpacePointContainer.h:88
 AliHLTSpacePointContainer.h:89
 AliHLTSpacePointContainer.h:90
 AliHLTSpacePointContainer.h:91
 AliHLTSpacePointContainer.h:92
 AliHLTSpacePointContainer.h:93
 AliHLTSpacePointContainer.h:94
 AliHLTSpacePointContainer.h:95
 AliHLTSpacePointContainer.h:96
 AliHLTSpacePointContainer.h:97
 AliHLTSpacePointContainer.h:98
 AliHLTSpacePointContainer.h:99
 AliHLTSpacePointContainer.h:100
 AliHLTSpacePointContainer.h:101
 AliHLTSpacePointContainer.h:102
 AliHLTSpacePointContainer.h:103
 AliHLTSpacePointContainer.h:104
 AliHLTSpacePointContainer.h:105
 AliHLTSpacePointContainer.h:106
 AliHLTSpacePointContainer.h:107
 AliHLTSpacePointContainer.h:108
 AliHLTSpacePointContainer.h:109
 AliHLTSpacePointContainer.h:110
 AliHLTSpacePointContainer.h:111
 AliHLTSpacePointContainer.h:112
 AliHLTSpacePointContainer.h:113
 AliHLTSpacePointContainer.h:114
 AliHLTSpacePointContainer.h:115
 AliHLTSpacePointContainer.h:116
 AliHLTSpacePointContainer.h:117
 AliHLTSpacePointContainer.h:118
 AliHLTSpacePointContainer.h:119
 AliHLTSpacePointContainer.h:120
 AliHLTSpacePointContainer.h:121
 AliHLTSpacePointContainer.h:122
 AliHLTSpacePointContainer.h:123
 AliHLTSpacePointContainer.h:124
 AliHLTSpacePointContainer.h:125
 AliHLTSpacePointContainer.h:126
 AliHLTSpacePointContainer.h:127
 AliHLTSpacePointContainer.h:128
 AliHLTSpacePointContainer.h:129
 AliHLTSpacePointContainer.h:130
 AliHLTSpacePointContainer.h:131
 AliHLTSpacePointContainer.h:132
 AliHLTSpacePointContainer.h:133
 AliHLTSpacePointContainer.h:134
 AliHLTSpacePointContainer.h:135
 AliHLTSpacePointContainer.h:136
 AliHLTSpacePointContainer.h:137
 AliHLTSpacePointContainer.h:138
 AliHLTSpacePointContainer.h:139
 AliHLTSpacePointContainer.h:140
 AliHLTSpacePointContainer.h:141
 AliHLTSpacePointContainer.h:142
 AliHLTSpacePointContainer.h:143
 AliHLTSpacePointContainer.h:144
 AliHLTSpacePointContainer.h:145
 AliHLTSpacePointContainer.h:146
 AliHLTSpacePointContainer.h:147
 AliHLTSpacePointContainer.h:148
 AliHLTSpacePointContainer.h:149
 AliHLTSpacePointContainer.h:150
 AliHLTSpacePointContainer.h:151
 AliHLTSpacePointContainer.h:152
 AliHLTSpacePointContainer.h:153
 AliHLTSpacePointContainer.h:154
 AliHLTSpacePointContainer.h:155
 AliHLTSpacePointContainer.h:156
 AliHLTSpacePointContainer.h:157
 AliHLTSpacePointContainer.h:158
 AliHLTSpacePointContainer.h:159
 AliHLTSpacePointContainer.h:160
 AliHLTSpacePointContainer.h:161
 AliHLTSpacePointContainer.h:162
 AliHLTSpacePointContainer.h:163
 AliHLTSpacePointContainer.h:164
 AliHLTSpacePointContainer.h:165
 AliHLTSpacePointContainer.h:166
 AliHLTSpacePointContainer.h:167
 AliHLTSpacePointContainer.h:168
 AliHLTSpacePointContainer.h:169
 AliHLTSpacePointContainer.h:170
 AliHLTSpacePointContainer.h:171
 AliHLTSpacePointContainer.h:172
 AliHLTSpacePointContainer.h:173
 AliHLTSpacePointContainer.h:174
 AliHLTSpacePointContainer.h:175
 AliHLTSpacePointContainer.h:176
 AliHLTSpacePointContainer.h:177