Adding ROOT classes to be able to store dHLT internal data in ROOT files.
authorszostak <szostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 29 Sep 2007 12:55:01 +0000 (12:55 +0000)
committerszostak <szostak@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 29 Sep 2007 12:55:01 +0000 (12:55 +0000)
HLT/MUON/AliHLTMUONMansoTrack.cxx [new file with mode: 0644]
HLT/MUON/AliHLTMUONMansoTrack.h [new file with mode: 0644]
HLT/MUON/AliHLTMUONRecHit.cxx [new file with mode: 0644]
HLT/MUON/AliHLTMUONRecHit.h [new file with mode: 0644]
HLT/MUON/AliHLTMUONTriggerRecord.cxx [new file with mode: 0644]
HLT/MUON/AliHLTMUONTriggerRecord.h [new file with mode: 0644]

diff --git a/HLT/MUON/AliHLTMUONMansoTrack.cxx b/HLT/MUON/AliHLTMUONMansoTrack.cxx
new file mode 100644 (file)
index 0000000..f9e6d26
--- /dev/null
@@ -0,0 +1,226 @@
+/**************************************************************************
+ * This file is property of and copyright by the ALICE HLT Project        * 
+ * All rights reserved.                                                   *
+ *                                                                        *
+ * Primary Authors:                                                       *
+ *   Artur Szostak <artursz@iafrica.com>                                  *
+ *                                                                        *
+ * 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.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/**
+ * @file   AliHLTMUONMansoTrack.cxx
+ * @author Artur Szostak <artursz@iafrica.com>
+ * @date   
+ * @brief  Implementation of the AliHLTMUONMansoTrack class.
+ */
+
+#include "AliHLTMUONMansoTrack.h"
+#include "AliLog.h"
+#include "mapping/AliMpDEManager.h"
+#include <cstring>
+#include <iostream>
+#include <iomanip>
+using namespace std;
+
+ClassImp(AliHLTMUONMansoTrack);
+
+
+std::ostream& operator << (
+               std::ostream& stream,
+               const AliHLTMUONMansoTrack& track
+       )
+{
+// Stream operator.
+
+       stream  << "ID: " << track.fId
+               << "; sign: " << track.fSign
+               << "; p = (" << track.Px()
+               << ", " << track.Py()
+               << ", " << track.Pz()
+               << "); chi^2: " << track.fChi2;
+       return stream;
+}
+
+
+AliHLTMUONMansoTrack::AliHLTMUONMansoTrack(
+               Int_t id, Int_t sign,
+               Float_t px, Float_t py, Float_t pz,
+               Float_t chi2,
+               const AliHLTMUONTriggerRecord* trigrec,
+               const AliHLTMUONRecHit* hit7,
+               const AliHLTMUONRecHit* hit8,
+               const AliHLTMUONRecHit* hit9,
+               const AliHLTMUONRecHit* hit10,
+               Float_t zf, Float_t qbl
+       ) :
+       fId(id), fSign(sign), fMomentum(px, py, pz),
+       fChi2(chi2), fTrigRec(trigrec), fZmiddle(zf), fQBL(qbl)
+{
+       if (sign < -1 or 1 < sign)
+       {
+               AliError(Form("Trying to set the sign to %d. This is outside the"
+                       " valid range of [-1..1]", sign
+               ));
+               fSign = 0;
+       }
+       
+       fHit[0] = hit7;
+       fHit[1] = hit8;
+       fHit[2] = hit9;
+       fHit[3] = hit10;
+}
+
+
+const AliHLTMUONRecHit* AliHLTMUONMansoTrack::Hit(Int_t chamber) const
+{
+// Returns the hit on the specified chamber.
+
+       if (7 <= chamber and chamber <= 10) return fHit[chamber - 7];
+       
+       AliError(Form(
+               "Chamber number %d is not in the valid range [7..10].",
+               int(chamber)
+       ));
+       return NULL;
+}
+
+
+void AliHLTMUONMansoTrack::Print(Option_t* option) const
+{
+// Prints the track information to standard output (screen).
+
+       if (    option == NULL or strcmp(option, "") == 0 or
+               strcmp(option, "compact") == 0
+          )
+       {
+               cout << *this << endl;
+       }
+       else if (strcmp(option, "detail") == 0)
+       {
+               cout << "Track ID = " << fId << "; sign = ";
+               if (fSign != 0)
+                       cout << fSign;
+               else
+                       cout << "unknown";
+               cout << "; momentum: (px = " << Px()
+                       << " GeV/c, py = " << Py()
+                       << " GeV/c, pz = " << Pz()
+                       << " GeV/c); chi^2 = " << fChi2 << endl;
+               cout << "Used Zmiddle = " << fZmiddle << " cm and QBL = "
+                       << fQBL << " T.m for the momentum calculation." << endl;
+               
+               streamsize w = cout.width();
+               ios::fmtflags f = cout.flags();
+               cout << setw(9) << "Chamber" << setw(0) << "  Hit:"
+                       << setw(8) << "X (cm)"
+                       << setw(12) << "Y (cm)"
+                       << setw(12) << "Z (cm)" << endl;
+               for (int i = 0; i < 4; i++)
+               {
+                       cout << setw(9) << i+11;
+                       if (fHit[i] != NULL)
+                       {
+                               cout << setw(14) << fHit[i]->X()
+                                       << setw(12) << fHit[i]->Y()
+                                       << setw(12) << fHit[i]->Z();
+                       }
+                       else
+                       {
+                               cout << setw(14) << "-"
+                                       << setw(12) << "-"
+                                       << setw(12) << "-";
+                       }
+                       cout << endl;
+               }
+               cout.width(w); // reset the field width to previous value.
+               cout.flags(f); // reset the flags to previous values.
+       }
+       else if (strcmp(option, "all") == 0)
+       {
+               cout << "Track ID = " << fId << "; sign = ";
+               if (fSign != 0)
+                       cout << fSign;
+               else
+                       cout << "unknown";
+               cout << "; momentum: (px = " << Px()
+                       << " GeV/c, py = " << Py()
+                       << " GeV/c, pz = " << Pz()
+                       << " GeV/c); chi^2 = " << fChi2 << endl;
+               cout << "Used Zmiddle = " << fZmiddle << " cm and QBL = "
+                       << fQBL << " T.m for the momentum calculation." << endl;
+               
+               for (int i = 0; i < 4; i++)
+               {
+                       cout << "===== Hit on chamber: " << i+7 << " =====" << endl;
+                       if (fHit[i] != NULL)
+                               fHit[i]->Print("all");
+                       else
+                               cout << "No hit found." << endl;
+               }
+               
+               cout << "===== Trigger Record =====" << endl;
+               if (fTrigRec != NULL)
+                       fTrigRec->Print("all");
+               else
+                       cout << "No trigger record associated with track." << endl;
+       }
+       else
+       {
+               AliError("Unknown option specified. Can only be one of 'compact',"
+                       " 'detail' or 'all'."
+               );
+       }
+}
+
+
+Int_t AliHLTMUONMansoTrack::Compare(const TObject* obj) const
+{
+// We compare this object with 'obj' first by track ID, then by sign, then
+// by momentum and finally by chi2.
+
+       if (obj->IsA() == AliHLTMUONMansoTrack::Class())
+       {
+               const AliHLTMUONMansoTrack* t =
+                       static_cast<const AliHLTMUONMansoTrack*>(obj);
+               if (fId < t->fId) return -1;
+               if (fId > t->fId) return 1;
+               if (fSign < t->fSign) return -1;
+               if (fSign > t->fSign) return 1;
+               if (Px() < t->Px()) return -1;
+               if (Px() > t->Px()) return 1;
+               if (Py() < t->Py()) return -1;
+               if (Py() > t->Py()) return 1;
+               if (Pz() < t->Pz()) return -1;
+               if (Pz() > t->Pz()) return 1;
+               if (fChi2 < t->fChi2) return -1;
+               if (fChi2 > t->fChi2) return 1;
+               return 0;
+       }
+       else
+       {
+               AliError(Form("Do not know how to compare %s to %s.",
+                       this->ClassName(),
+                       obj->ClassName()
+               ));
+               return -999;
+       }
+}
+
+
+bool AliHLTMUONMansoTrack::operator == (const AliHLTMUONMansoTrack& track) const
+{
+       return  fId == track.fId and fSign == track.fSign
+               and fMomentum == track.fMomentum
+               and fChi2 == track.fChi2 and fTrigRec == track.fTrigRec
+               and fHit[0] == track.fHit[0] and fHit[1] == track.fHit[1]
+               and fHit[2] == track.fHit[2] and fHit[3] == track.fHit[3];
+}
diff --git a/HLT/MUON/AliHLTMUONMansoTrack.h b/HLT/MUON/AliHLTMUONMansoTrack.h
new file mode 100644 (file)
index 0000000..f357e60
--- /dev/null
@@ -0,0 +1,190 @@
+#ifndef ALIHLTMUONMANSOTRACK_H
+#define ALIHLTMUONMANSOTRACK_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                               */
+
+/* $Id$ */
+
+/**
+ * @file   AliHLTMUONMansoTrack.h
+ * @author Artur Szostak <artursz@iafrica.com>
+ * @date   
+ * @brief  Declaration of the Manso track class used to store converted track
+ *         data from dHLT raw internal data blocks.
+ */
+
+#include "AliHLTMUONRecHit.h"
+#include "AliHLTMUONTriggerRecord.h"
+
+/**
+ * AliHLTMUONMansoTrack stores converted dHLT raw track data as a ROOT object.
+ */
+class AliHLTMUONMansoTrack : public TObject
+{
+       /**
+        * Stream operator for usage with std::ostream classes.
+        * Allows usage such as:
+        *   AliHLTMUONMansoTrack t; std::cout << t;
+        */
+       friend std::ostream& operator << (
+                       std::ostream& stream,
+                       const AliHLTMUONMansoTrack& track
+               );
+
+public:
+
+       /**
+        * Constructor for creating a track object with none, some or all 4 hits
+        * specified. Note: this class does not take ownership of the hit or trigger
+        * record objects and will not attempt to delete them.
+        * @param id       The track ID number which must be unique for any event.
+        * @param sign     The particle's sign: -1, 1 or 0 if unknown.
+        * @param px       X component of the particle's momentum (GeV/c).
+        * @param py       Y component of the particle's momentum (GeV/c).
+        * @param pz       Z component of the particle's momentum (GeV/c).
+        * @param chi2     The chi squared of the track fit.
+        * @param trigrec  Corresponding trigger record used as a seed to find
+        *                 this track.
+        * @param hit7     Hit on chamber 7, tracking station 4.
+        * @param hit8     Hit on chamber 8, tracking station 4.
+        * @param hit9     Hit on chamber 9, tracking station 5.
+        * @param hit10    Hit on chamber 10, tracking station 5.
+        * @param zf    The Z coordinate of the middle of the magnetic field assumed
+        *              during momentum calculation.
+        * @param qbl   The integrated magnetic field strength assumed during momentum
+        *              calculation.
+        */
+       AliHLTMUONMansoTrack(
+                       Int_t id = -1, Int_t sign = 0,
+                       Float_t px = 0, Float_t py = 0, Float_t pz = 0,
+                       Float_t chi2 = -1,
+                       const AliHLTMUONTriggerRecord* trigrec = NULL,
+                       const AliHLTMUONRecHit* hit7 = NULL,
+                       const AliHLTMUONRecHit* hit8 = NULL,
+                       const AliHLTMUONRecHit* hit9 = NULL,
+                       const AliHLTMUONRecHit* hit10 = NULL,
+                       Float_t zf = 0, Float_t qbl = 0
+               );
+       
+       virtual ~AliHLTMUONMansoTrack() {}
+
+       /**
+        * Returns the track ID number, which is unique for an event.
+        */
+       Int_t Id() const { return fId; }
+       
+       /**
+        * Returns the sign of the particle: -1, 1 or 0 if the sign is unknown.
+        */
+       Int_t Sign() const { return fSign; }
+
+       /**
+        * Returns the momentum vector with components in GeV/c.
+        */
+       const TVector3& Momentum() const { return fMomentum; }
+
+       /**
+        * Returns the X component of the particle's momentum in GeV/c.
+        */
+       Double_t Px() const { return fMomentum.Px(); }
+
+       /**
+        * Returns the Y component of the particle's momentum in GeV/c.
+        */
+       Double_t Py() const { return fMomentum.Py(); }
+
+       /**
+        * Returns the Z component of the particle's momentum in GeV/c.
+        */
+       Double_t Pz() const { return fMomentum.Pz(); }
+
+       /**
+        * Returns the momentum magnitude of the particle in GeV/c.
+        */
+       Double_t P() const { return fMomentum.Mag(); }
+
+       /**
+        * Returns the transverse momentum of the particle in GeV/c.
+        */
+       Double_t Pt() const { return fMomentum.Pt(); }
+
+       /**
+        * Returns the polar angle of the momentum vector in radians.
+        */
+       Double_t Polar() const { return fMomentum.Theta(); }
+
+       /**
+        * Returns the azimuthal angle of the transverse momentum in radians.
+        */
+       Double_t Phi() const { return fMomentum.Phi(); }
+
+       /**
+        * Returns the chi squared of the track fit, indicating the quality of
+        * the fit.
+        */
+       Float_t Chi2() const { return fChi2; }
+
+       /**
+        * Returns the trigger record corresponding to this track.
+        * If NULL is returned then no trigger record was found.
+        */
+       const AliHLTMUONTriggerRecord* TriggerRecord() const { return fTrigRec; }
+
+       /**
+        * Returns tje hit found on the specified tracking chamber.
+        * If NULL is returned then no hit was found or set.
+        * @param chamber  Specifies the chamber for which to return the hit.
+        *                 Valid values are in the range [7..10].
+        */
+       const AliHLTMUONRecHit* Hit(Int_t chamber) const;
+       
+       /**
+        * Prints the details of the track.
+        * @param option  A case sensitive string that can contain one of the
+        *     following strings:
+        *       "compact" - Prints just the momentum, sign and ID of the track
+        *                   in a terse format.
+        *       "detail" - Prints also the hit information.
+        *       "all" - Prints all known information about this track.
+        *     If the string contains an empty option or NULL then the default is
+        *     to print compactly.
+        */
+       virtual void Print(Option_t* option = NULL) const;
+       
+       // Methods inherited from TObject
+       virtual Bool_t IsSortable() const { return kTRUE; }
+       Int_t Compare(const TObject* obj) const;
+
+       // Implement comparison operators.
+       bool operator == (const AliHLTMUONMansoTrack& track) const;
+
+       bool operator != (const AliHLTMUONMansoTrack& track) const
+       {
+               return not this->operator == (track);
+       }
+
+private:
+
+       // Do not allow copying of this class.
+       AliHLTMUONMansoTrack(const AliHLTMUONMansoTrack& track);
+       AliHLTMUONMansoTrack& operator = (const AliHLTMUONMansoTrack& track);
+       
+       Int_t fId; // Track ID number which is unique for a particular event.
+       Int_t fSign;  // The sign of the particle.
+       TVector3 fMomentum; // Momentum vector of the particle in GeV/c.
+       Float_t fChi2; // Chi squared of fit.
+       const AliHLTMUONTriggerRecord* fTrigRec;  // Corresponding trigger record.
+       const AliHLTMUONRecHit* fHit[4];   // Particle hits on tracking chambers 7 to 10.
+       
+       // The following is debugging information and may not be filled if the
+       // dHLT components were not set to produce this information.
+       
+       // Parameters used in momentum estimation:
+       Float_t fZmiddle; // Particle momentum X component in GeV/c.
+       Float_t fQBL;     // The integrated magnetic field times charge in (T.m) tesla metres.
+
+       ClassDef(AliHLTMUONMansoTrack, 1); // Manso track object containing data converted from a dHLT internal track structure.
+};
+
+#endif // ALIHLTMUONMANSOTRACK_H
diff --git a/HLT/MUON/AliHLTMUONRecHit.cxx b/HLT/MUON/AliHLTMUONRecHit.cxx
new file mode 100644 (file)
index 0000000..ba787c9
--- /dev/null
@@ -0,0 +1,258 @@
+/**************************************************************************
+ * This file is property of and copyright by the ALICE HLT Project        * 
+ * All rights reserved.                                                   *
+ *                                                                        *
+ * Primary Authors:                                                       *
+ *   Artur Szostak <artursz@iafrica.com>                                  *
+ *                                                                        *
+ * 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.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/**
+ * @file   AliHLTMUONRecHit.cxx
+ * @author Artur Szostak <artursz@iafrica.com>
+ * @date   
+ * @brief  Implementation of the AliHLTMUONRecHit class.
+ */
+
+#include "AliHLTMUONRecHit.h"
+#include "AliLog.h"
+#include "mapping/AliMpDEManager.h"
+#include <cstring>
+#include <iostream>
+#include <iomanip>
+using namespace std;
+
+ClassImp(AliHLTMUONRecHit);
+ClassImp(AliHLTMUONRecHit::Channel);
+
+
+std::ostream& operator << (std::ostream& stream, const AliHLTMUONRecHit& hit)
+{
+// Stream operator for std::ostream classes.
+
+       stream << "(" << hit.X() << ", " << hit.Y() << ", " << hit.Z() << ")";
+       return stream;
+}
+
+
+void AliHLTMUONRecHit::SetDebugInfo(
+               Int_t detElemId, Int_t clusterId, UInt_t nChExp, Int_t sourceDDL
+       )
+{
+// Sets the debugging information.
+
+       fSourceDDL = sourceDDL;
+       fDetElemId = detElemId;
+       fClusterId = clusterId;
+       fNchExp = nChExp;
+}
+       
+
+Int_t AliHLTMUONRecHit::Chamber(bool warn) const
+{
+// Returns the chamber ID for this hit.
+
+       if (fSourceDDL != -1)
+       {
+               if (fSourceDDL < 1 or fSourceDDL > 20)
+               {
+                       return ((fSourceDDL-1) / 2) + 1;
+               }
+               else if (warn)
+               {
+                       AliError(Form("The DDL source number: %d is out of range."
+                               " Valid values are [1..20]", fSourceDDL
+                       ));
+               }
+       }
+       if (fDetElemId != -1) return AliMpDEManager::GetChamberId(fDetElemId, warn);
+       
+       if (warn)
+       {
+               AliWarning("Neither the DDL source nor the detector element ID was not set,"
+                       " so we do not know on which chamber this hit was reconstructed."
+               );
+       }
+       return -1;
+}
+
+
+void AliHLTMUONRecHit::AddChannel(
+               Short_t manu, Short_t channel, Short_t signal,
+               UInt_t rawDataWord
+       )
+{
+// Adds a new channel to the channels list forming this hit's cluster.
+
+       Int_t index = fChannels.GetEntriesFast();
+       new (fChannels[index]) Channel(manu, channel, signal, rawDataWord);
+}
+
+
+void AliHLTMUONRecHit::Print(Option_t* option) const
+{
+// Prints the coordinates of this hit to standard output (screen).
+
+       if (    option == NULL or strcmp(option, "") == 0 or
+               strcmp(option, "compact") == 0
+          )
+       {
+               cout << *this << endl;
+       }
+       else if (strcmp(option, "detail") == 0)
+       {
+               cout << "(x = " << X() << " cm, y = " << Y()
+                       << " cm, z = " << Z()
+                       << " cm); source DDL = " << fSourceDDL
+                       << "; DetElemID = " << fDetElemId
+                       << "; cluster ID = " << fClusterId
+                       << "; expected #ch = " << fNchExp << endl;
+       }
+       else if (strcmp(option, "all") == 0)
+       {
+               cout << "(x = " << X() << " cm, y = " << Y()
+                       << " cm, z = " << Z()
+                       << " cm); source DDL = " << fSourceDDL
+                       << "; DetElemID = " << fDetElemId
+                       << "; cluster ID = " << fClusterId
+                       << "; expected #ch = " << fNchExp << endl;
+               if (fChannels.GetEntriesFast() == 0)
+               {
+                       cout << "No channels found for this hit." << endl;
+               }
+               else
+               {
+                       streamsize w = cout.width();
+                       ios::fmtflags f = cout.flags();
+                       cout << setw(12) << "MANU"
+                               << setw(12) << "Channel"
+                               << setw(12) << "Signal"
+                               << setw(15) << "Raw data word" << endl;
+                       cout << showbase;
+                       for (Int_t i = 0; i < fChannels.GetEntriesFast(); i++)
+                       {
+                               const AliHLTMUONRecHit::Channel* c =
+                                       static_cast<const AliHLTMUONRecHit::Channel*>(fChannels[i]);
+                               cout << dec << setw(12) << c->Manu()
+                                       << setw(12) << c->Address()
+                                       << setw(12) << c->Signal()
+                                       << "     " << hex << setw(10) << internal;
+                               ios::char_type fc = cout.fill('0');
+                               cout << c->RawDataWord() << right << endl;
+                               cout.fill(fc);
+                       }
+                       cout.width(w); // reset the field width to previous value.
+                       cout.flags(f); // reset the flags to previous values.
+               }
+       }
+       else
+       {
+               AliError("Unknown option specified. Can only be one of 'compact',"
+                       " 'detail' or 'all'."
+               );
+       }
+}
+
+
+Int_t AliHLTMUONRecHit::Compare(const TObject* obj) const
+{
+// We compare this object with 'obj' first by X, then Y, then Z.
+
+       if (obj->IsA() == AliHLTMUONRecHit::Class())
+       {
+               const AliHLTMUONRecHit* h = static_cast<const AliHLTMUONRecHit*>(obj);
+               if (X() < h->X()) return -1;
+               if (X() > h->X()) return 1;
+               if (Y() < h->Y()) return -1;
+               if (Y() > h->Y()) return 1;
+               if (Z() < h->Z()) return -1;
+               if (Z() > h->Z()) return 1;
+               return 0;
+       }
+       else
+       {
+               AliError(Form("Do not know how to compare %s to %s.",
+                       this->ClassName(),
+                       obj->ClassName()
+               ));
+               return -999;
+       }
+}
+
+
+std::ostream& operator << (std::ostream& stream, const AliHLTMUONRecHit::Channel& c)
+{
+// Stream operator for std::ostream classes.
+
+       stream << "Channel: " << c.fManu << " , " << c.fAddress
+               << "; ADC: " << c.fSignal;
+       return stream;
+}
+
+
+void AliHLTMUONRecHit::Channel::Print(Option_t* option) const
+{
+// Prints the details of this channel to standard output (screen).
+
+       if (    option == NULL or strcmp(option, "") == 0 or
+               strcmp(option, "compact") == 0
+          )
+       {
+               cout << *this << endl;
+       }
+       else if (strcmp(option, "detail") == 0)
+       {
+               streamsize w = cout.width();
+               ios::fmtflags f = cout.flags();
+               cout << "MANU = " << fManu << ", Channel address = " << fAddress
+                       << ", Signal = " << fSignal
+                       << "; Raw data word = " << hex << setw(10) << internal;
+               ios::char_type fc = cout.fill('0');
+               cout << fRawDataWord << endl;
+               cout.fill(fc); // reset fill character
+               cout.width(w); // reset the field width to previous value.
+               cout.flags(f); // reset the flags to previous values.
+       }
+       else
+       {
+               AliError("Unknown option specified. Can only be one of"
+                       " 'compact' or 'detail'."
+               );
+       }
+}
+
+
+Int_t AliHLTMUONRecHit::Channel::Compare(const TObject* obj) const
+{
+// We compare this object with 'obj' first by MANU number, then by MANU channel
+// address, then ADC signal.
+
+       if (obj->IsA() == Channel::Class())
+       {
+               const Channel* c = static_cast<const Channel*>(obj);
+               if (fManu < c->Manu()) return -1;
+               if (fManu > c->Manu()) return 1;
+               if (fAddress < c->Address()) return -1;
+               if (fAddress > c->Address()) return 1;
+               if (fSignal < c->Signal()) return -1;
+               if (fSignal > c->Signal()) return 1;
+               return 0;
+       }
+       else
+       {
+               AliError(Form("Do not know how to compare %s to %s.",
+                       this->ClassName(),
+                       obj->ClassName()
+               ));
+               return -999;
+       }
+}
diff --git a/HLT/MUON/AliHLTMUONRecHit.h b/HLT/MUON/AliHLTMUONRecHit.h
new file mode 100644 (file)
index 0000000..c613e2c
--- /dev/null
@@ -0,0 +1,283 @@
+#ifndef ALIHLTMUONRECHIT_H
+#define ALIHLTMUONRECHIT_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                               */
+
+/* $Id$ */
+
+/**
+ * @file   AliHLTMUONRecHit.h
+ * @author Artur Szostak <artursz@iafrica.com>
+ * @date   
+ * @brief  Declaration of a reconstructed hit ROOT object to store 3D hit
+ *         coordinates translated from dHLT raw data.
+ */
+
+#include "TObject.h"
+#include "TClonesArray.h"
+#include "TVector3.h"
+#include <ostream>
+
+/**
+ * A 3D hit object used to store hits reconstructed on the tracking chambers by
+ * the dHLT. These objects store information translated into ROOT format from
+ * dHLT raw data. Reconstructed hit values of (0, 0, 0) indicate an invalid or
+ * nil hit.
+ */
+class AliHLTMUONRecHit : public TObject
+{
+       /**
+        * Stream operator for usage with std::ostream classes.
+        * Allows usage such as:
+        *   AliHLTMUONRecHit h; std::cout << h;
+        */
+       friend std::ostream& operator << (std::ostream& stream, const AliHLTMUONRecHit& hit);
+
+public:
+
+       /**
+        * The Channel class stores extra debugging information about the channels
+        * and raw data words that were considered during reconstruction of a hit
+        * by the dHLT hit reconstructor component.
+        */
+       class Channel : public TObject
+       {
+               /**
+                * Stream operator for usage with std::ostream classes.
+                */
+               friend std::ostream& operator << (std::ostream& stream, const Channel& c);
+       
+       public:
+               
+               Channel(
+                               Short_t manu = -1,
+                               Short_t channel = -1,
+                               Short_t signal = -1,
+                               UInt_t rawDataWord = 0
+                       ) :
+                       TObject(),
+                       fManu(manu), fAddress(channel), fSignal(signal),
+                       fRawDataWord(rawDataWord)
+               {}
+               
+               virtual ~Channel() {}
+               
+               /**
+                * Returns the MANU address.
+                */
+               Short_t Manu() const { return fManu; }
+               
+               /**
+                * Returns the channel address of the MANU.
+                */
+               Short_t Address() const { return fAddress; }
+               
+               /**
+                * Returns the ADC signal measured on the channel.
+                */
+               Short_t Signal() const { return fSignal; }
+               
+               /**
+                * Returns the raw data word as found in the tracking DDL payload.
+                */
+               UInt_t RawDataWord() const { return fRawDataWord; }
+               
+               virtual void Print(Option_t* option = NULL) const;
+       
+               // Methods inherited from TObject
+               virtual Bool_t IsSortable() const { return kTRUE; }
+               Int_t Compare(const TObject* obj) const;
+
+               // Implement comparison operators.
+               bool operator == (const Channel& c) const
+               {
+                       return fManu == c.fManu and fAddress == c.fAddress 
+                               and fSignal == c.fSignal
+                               and fRawDataWord == c.fRawDataWord;
+               }
+
+               bool operator != (const Channel& hit) const
+               {
+                       return not this->operator == (hit);
+               }
+       
+       private:
+       
+               Short_t fManu;       // The MANU address on the electronics.
+               Short_t fAddress;    // The channel address on the electronics.
+               Short_t fSignal;     // ADC value of signal.
+               UInt_t fRawDataWord; // The raw data word as found in the DDL stream.
+               
+               ClassDef(AliHLTMUONRecHit::Channel, 1); // A MANU channel forming part of a cluster that was considered during hit reconstruction in dHLT.
+       };
+
+       /**
+        * Construct a new AliHLTMUONRecHit object with coordinate (x, y, z).
+        * @param x           X coordinate of hit
+        * @param y           Y coordinate of hit
+        * @param z           Z coordinate of hit
+        * @param sourceDDL   The DDL from which this hit originates.
+        * @param detectorId  The ID number for the AliRoot detector element on
+        *                    which this hit resides.
+        * @param clusterId   The cluster ID number assigned to the hit's cluster.
+        * @param nChExp      The expected number of channels that form the cluster.
+        */
+       AliHLTMUONRecHit(
+                       Float_t x = 0,
+                       Float_t y = 0,
+                       Float_t z = 0,
+                       Int_t sourceDDL = -1,
+                       Int_t detElemId = -1,
+                       Int_t clusterId = -1,
+                       Int_t nChExp = 0
+               ) :
+               fCoordinate(x, y, z), fSourceDDL(sourceDDL),
+               fDetElemId(detElemId), fClusterId(clusterId), fNchExp(nChExp),
+               fChannels("AliHLTMUONRecHit::Channel", 6)
+       {}
+       
+       virtual ~AliHLTMUONRecHit() {}
+
+       /**
+        * Returns the 3D hit coordinate.
+        */
+       const TVector3& Coordinate() const { return fCoordinate; }
+
+       /**
+        * Returns the X coordinate of the reconstructed hit in centimetres.
+        */
+       Double_t X() const { return fCoordinate.X(); }
+
+       /**
+        * Returns the Y coordinate of the reconstructed hit in centimetres.
+        */
+       Double_t Y() const { return fCoordinate.Y(); }
+
+       /**
+        * Returns the Z coordinate of the reconstructed hit in centimetres.
+        */
+       Double_t Z() const { return fCoordinate.Z(); }
+       
+       /**
+        * Returns the source DDL from which this hit originates.
+        * -1 is returned if this was not set.
+        */
+       Int_t SourceDDL() const { return fSourceDDL; }
+       
+       /**
+        * Returns the detector element ID on which this reconstructed hit resides.
+        * -1 is returned if this was not set.
+        */
+       Int_t DetElemId() const { return fDetElemId; }
+       
+       /**
+        * Returns the chamber number of this hit in the range [1..14].
+        * If -1 is returned then the chamber number is not known because the
+        * extra debugging information such as detector element ID was not set.
+        * @param warn  Indicates if any warning should be printed in case of problems.
+        */
+       Int_t Chamber(bool warn = true) const;
+       
+       /**
+        * Returns the ID number given to the hit's cluster.
+        */
+       Int_t ClusterId() const { return fClusterId; }
+       
+       /**
+        * Returns the expected number of channels that are to be added to this hit.
+        * If the number of calls to AddChannel does not correspond to this value
+        * then we lost some debugging information along the way.
+        */
+       UInt_t ExpectedNchannels() const { return fNchExp; }
+       
+       /**
+        * Sets the debugging information for this hit.
+        * @param detElemId  The detector element ID.
+        * @param clusterId  Cluster ID of the hit's cluster.
+        * @param nChExp     Number of expected channels forming the cluster.
+        * @param sourceDDL  The source DDL of this hit.
+        */
+       void SetDebugInfo(
+                       Int_t detElemId, Int_t clusterId, UInt_t nChExp,
+                       Int_t sourceDDL = -1
+               );
+       
+       /**
+        * Sets the hit coordinate.
+        */
+       void SetHit(Float_t x, Float_t y, Float_t z)
+       {
+               fCoordinate.SetXYZ(x, y, z);
+       }
+       
+       /**
+        * Returns the number of channels associated with this hit.
+        */
+       Int_t Nchannels() const { return fChannels.GetEntriesFast(); }
+       
+       /**
+        * Returns the i'th channel associated with this hit.
+        * @param i  Should be a number in the range [0..n), where n = Nchannels().
+        */
+       const Channel* GetChannel(Int_t i) const
+       {
+               return static_cast<const Channel*>(fChannels[i]);
+       }
+       
+       /**
+        * Adds a new channel to this hit if it is on a tracking chamber.
+        * @param manu    The MANU number
+        * @param channel The MANU channel address.
+        * @param signal  The ADC signal value measured on the channel.
+        * @param rawDataWord This is the raw data word as read from the DDL.
+        */
+       void AddChannel(
+                       Short_t manu, Short_t channel, Short_t signal,
+                       UInt_t rawDataWord
+               );
+
+       /**
+        * Prints the details of the reconstructed hit.
+        * @param option  A case sensitive string that can contain one of the
+        *     following strings:
+        *       "compact" - Prints just the coordinates of the hit in a terse format.
+        *       "detail" - Prints the coordinates and detector element ID.
+        *       "all" - Prints all known information about this hit including
+        *               channel information forming the cluster that was reconstructed.
+        *     If the string contains an empty option or NULL then the default is
+        *     to print compactly.
+        */
+       virtual void Print(Option_t* option = NULL) const;
+       
+       // Methods inherited from TObject
+       virtual Bool_t IsSortable() const { return kTRUE; }
+       Int_t Compare(const TObject* obj) const;
+
+       // Implement comparison operators.
+       bool operator == (const AliHLTMUONRecHit& hit) const
+       {
+               return X() == hit.X() and Y() == hit.Y() and Z() == hit.Z();
+       }
+
+       bool operator != (const AliHLTMUONRecHit& hit) const
+       {
+               return not this->operator == (hit);
+       }
+
+private:
+
+       TVector3 fCoordinate; // The 3D coordinate of the hit in AliRoot global coordinates (cm).
+       
+       // The following is debugging information and may not be filled if the
+       // dHLT components were not set to produce this information.
+       Int_t fSourceDDL;  // The DDL from which this hit originates.
+       Int_t fDetElemId;  // Detector element ID number.
+       Int_t fClusterId;  // The cluster ID number used to relate all the channels to each other.
+       UInt_t fNchExp;    // The number of channels that were supposed to be found.
+       TClonesArray fChannels; // The channels forming part of the cluster from which this hit was reconstructed.
+
+       ClassDef(AliHLTMUONRecHit, 1); // A reconstructed hit translated from dHLT raw data into ROOT format.
+};
+
+#endif // ALIHLTMUONRECHIT_H
diff --git a/HLT/MUON/AliHLTMUONTriggerRecord.cxx b/HLT/MUON/AliHLTMUONTriggerRecord.cxx
new file mode 100644 (file)
index 0000000..f6a20ec
--- /dev/null
@@ -0,0 +1,308 @@
+/**************************************************************************
+ * This file is property of and copyright by the ALICE HLT Project        * 
+ * All rights reserved.                                                   *
+ *                                                                        *
+ * Primary Authors:                                                       *
+ *   Artur Szostak <artursz@iafrica.com>                                  *
+ *                                                                        *
+ * 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.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+/**
+ * @file   AliHLTMUONTriggerRecord.cxx
+ * @author Artur Szostak <artursz@iafrica.com>
+ * @date   
+ * @brief  Implementation of the AliHLTMUONTriggerRecord class.
+ */
+
+#include "AliHLTMUONTriggerRecord.h"
+#include "AliLog.h"
+#include "mapping/AliMpDEManager.h"
+#include <cstring>
+#include <iostream>
+#include <iomanip>
+using namespace std;
+
+ClassImp(AliHLTMUONTriggerRecord);
+
+
+std::ostream& operator << (
+               std::ostream& stream,
+               const AliHLTMUONTriggerRecord& trigrec
+       )
+{
+// Stream operator.
+
+       stream  << "ID: " << trigrec.fId
+               << "; sign: " << trigrec.fSign
+               << "; p = (" << trigrec.Px()
+               << ", " << trigrec.Py()
+               << ", " << trigrec.Pz()
+               << ")";
+       return stream;
+}
+
+
+AliHLTMUONTriggerRecord::AliHLTMUONTriggerRecord(
+               Int_t id, Int_t sign,
+               Float_t px, Float_t py, Float_t pz,
+               Int_t sourceDDL, Float_t zf, Float_t qbl
+       ) :
+       fId(id), fSign(sign), fMomentum(px, py, pz), fSourceDDL(sourceDDL),
+       fZmiddle(zf), fQBL(qbl)
+{
+       if (sign < -1 or 1 < sign)
+       {
+               AliError(Form("Trying to set the sign to %d. This is outside the"
+                       " valid range of [-1..1]", sign
+               ));
+               fSign = 0;
+       }
+
+       // Fill the debugging information to invalid values by default.
+       for (int i = 0; i < 4; i++)
+       {
+               fDetElemId[i] = -1;
+               fPatternX[i] = -1;
+               fPatternY[i] = -1;
+       }
+}
+
+
+const TVector3& AliHLTMUONTriggerRecord::Hit(Int_t chamber) const
+{
+// Returns the hit on the specified chamber.
+
+       if (11 <= chamber and chamber <= 14) return fHit[chamber - 11];
+       
+       AliError(Form(
+               "Chamber number %d is not in the valid range [11..14].",
+               int(chamber)
+       ));
+       return fHit[0];
+}
+
+
+Int_t AliHLTMUONTriggerRecord::DetElemId(Int_t chamber) const
+{
+// Returns the detector element ID for the specified chamber associated
+// to the hit on that chamber.
+
+       if (11 <= chamber and chamber <= 14) return fDetElemId[chamber - 11];
+       
+       AliError(Form(
+               "Chamber number %d is not in the valid range [11..14].",
+               int(chamber)
+       ));
+       return fDetElemId[0];
+}
+
+
+Int_t AliHLTMUONTriggerRecord::PatternX(Int_t chamber) const
+{
+// Returns the raw data X pattern of the hit on the specified chamber.
+
+       if (11 <= chamber and chamber <= 14) return fPatternX[chamber - 11];
+       
+       AliError(Form(
+               "Chamber number %d is not in the valid range [11..14].",
+               int(chamber)
+       ));
+       return fPatternX[0];
+}
+
+
+Int_t AliHLTMUONTriggerRecord::PatternY(Int_t chamber) const
+{
+// Returns the raw data Y pattern of the hit on the specified chamber.
+
+       if (11 <= chamber and chamber <= 14) return fPatternY[chamber - 11];
+       
+       AliError(Form(
+               "Chamber number %d is not in the valid range [11..14].",
+               int(chamber)
+       ));
+       return fPatternY[0];
+}
+
+
+void AliHLTMUONTriggerRecord::SetHit(Int_t chamber, Float_t x, Float_t y, Float_t z)
+{
+// Fills the hit coordinate on the specified chamber.
+
+       if (11 <= chamber and chamber <= 14)
+       {
+               fHit[chamber - 11].SetXYZ(x, y, z);
+       }
+       else
+       {
+               AliError(Form(
+                       "Chamber number %d is not in the valid range [11..14].",
+                       int(chamber)
+               ));
+       }
+}
+
+
+void AliHLTMUONTriggerRecord::SetHitDebugInfo(
+               Int_t chamber,
+               Int_t detElemId, UShort_t patternX, UShort_t patternY
+       )
+{
+// Fills the debugging information corresponding to the hit on the specified chamber.
+
+       if (11 <= chamber and chamber <= 14)
+       {
+               fDetElemId[chamber - 11] = detElemId;
+               fPatternX[chamber - 11] = patternX;
+               fPatternY[chamber - 11] = patternY;
+       }
+       else
+       {
+               AliError(Form(
+                       "Chamber number %d is not in the valid range [11..14].",
+                       int(chamber)
+               ));
+       }
+}
+
+
+void AliHLTMUONTriggerRecord::Print(Option_t* option) const
+{
+// Prints the trigger record to standard output (screen).
+
+       if (    option == NULL or strcmp(option, "") == 0 or
+               strcmp(option, "compact") == 0
+          )
+       {
+               cout << *this << endl;
+       }
+       else if (strcmp(option, "detail") == 0)
+       {
+               cout << "Trigger record ID = " << fId << "; sign = ";
+               if (fSign != 0)
+                       cout << fSign;
+               else
+                       cout << "unknown";
+               cout << "; momentum: (px = " << Px()
+                       << " GeV/c, py = " << Py()
+                       << " GeV/c, pz = " << Pz()
+                       << " GeV/c)" << endl;
+               cout << "Used Zmiddle = " << fZmiddle << " cm and QBL = "
+                       << fQBL << " T.m for the momentum calculation." << endl;
+       }
+       else if (strcmp(option, "all") == 0)
+       {
+               cout << "Trigger record ID = " << fId << "; sign = ";
+               if (fSign != 0)
+                       cout << fSign;
+               else
+                       cout << "unknown";
+               cout << "; momentum: (px = " << Px()
+                       << " GeV/c, py = " << Py()
+                       << " GeV/c, pz = " << Pz()
+                       << " GeV/c)" << endl;
+               cout << "Used Zmiddle = " << fZmiddle << " cm and QBL = "
+                       << fQBL << " T.m for the momentum calculation." << endl;
+               
+               streamsize w = cout.width();
+               ios::fmtflags f = cout.flags();
+               cout << setw(9) << "Chamber" << setw(0) << "  Hit:"
+                       << setw(8) << "X (cm)"
+                       << setw(12) << "Y (cm)"
+                       << setw(12) << "Z (cm)"
+                       << setw(12) << "DetElemID"
+                       << setw(18) << "X bit pattern"
+                       << setw(18) << "Y bit pattern" << endl;
+               for (int i = 0; i < 4; i++)
+               {
+                       cout << setw(9) << i+11
+                               << setw(14) << fHit[i].X()
+                               << setw(12) << fHit[i].Y()
+                               << setw(12) << fHit[i].Z()
+                               << setw(12) << fDetElemId[i];
+                       if (fPatternX[i] != -1)
+                       {
+                               // Print the X pattern as a bit pattern.
+                               cout << "  ";
+                               for (Int_t j = 15; j >= 0; j--)
+                                       cout << (((fPatternX[i] & (1 << j)) > 0) ? "1" : "0");
+                       }
+                       else
+                       {
+                               cout << "  ----------------";
+                       }
+                       if (fPatternY[i] != -1)
+                       {
+                               // Print the Y pattern as a bit pattern.
+                               cout << "  ";
+                               for (Int_t j = 15; j >= 0; j--)
+                                       cout << (((fPatternY[i] & (1 << j)) > 0) ? "1" : "0");
+                       }
+                       else
+                       {
+                               cout << "  ----------------";
+                       }
+                       cout << endl;
+               }
+               cout.width(w); // reset the field width to previous value.
+               cout.flags(f); // reset the flags to previous values.
+       }
+       else
+       {
+               AliError("Unknown option specified. Can only be one of 'compact',"
+                       " 'detail' or 'all'."
+               );
+       }
+}
+
+
+Int_t AliHLTMUONTriggerRecord::Compare(const TObject* obj) const
+{
+// We compare this object with 'obj' first by trigger record ID, then
+// by sign and finally by momentum.
+
+       if (obj->IsA() == AliHLTMUONTriggerRecord::Class())
+       {
+               const AliHLTMUONTriggerRecord* tr =
+                       static_cast<const AliHLTMUONTriggerRecord*>(obj);
+               if (fId < tr->fId) return -1;
+               if (fId > tr->fId) return 1;
+               if (fSign < tr->fSign) return -1;
+               if (fSign > tr->fSign) return 1;
+               if (Px() < tr->Px()) return -1;
+               if (Px() > tr->Px()) return 1;
+               if (Py() < tr->Py()) return -1;
+               if (Py() > tr->Py()) return 1;
+               if (Pz() < tr->Pz()) return -1;
+               if (Pz() > tr->Pz()) return 1;
+               return 0;
+       }
+       else
+       {
+               AliError(Form("Do not know how to compare %s to %s.",
+                       this->ClassName(),
+                       obj->ClassName()
+               ));
+               return -999;
+       }
+}
+
+
+bool AliHLTMUONTriggerRecord::operator == (const AliHLTMUONTriggerRecord& trigrec) const
+{
+// Compares the trigger record 'trigrec' to this one.
+
+       return  fId == trigrec.fId and fSign == trigrec.fSign
+               and fMomentum == trigrec.fMomentum
+               and fHit[0] == trigrec.fHit[0] and fHit[1] == trigrec.fHit[1]
+               and fHit[2] == trigrec.fHit[2] and fHit[3] == trigrec.fHit[3];
+}
diff --git a/HLT/MUON/AliHLTMUONTriggerRecord.h b/HLT/MUON/AliHLTMUONTriggerRecord.h
new file mode 100644 (file)
index 0000000..b1ea7b8
--- /dev/null
@@ -0,0 +1,256 @@
+#ifndef ALIHLTMUONTRIGGERRECORD_H
+#define ALIHLTMUONTRIGGERRECORD_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                               */
+
+/* $Id$ */
+
+/**
+ * @file   AliHLTMUONTriggerRecord.h
+ * @author Artur Szostak <artursz@iafrica.com>
+ * @date   
+ * @brief  Declaration of the trigger record structure containing data
+ *         corresponding to the L0 trigger local board output.
+ */
+
+#include "TObject.h"
+#include "TVector3.h"
+#include <ostream>
+
+/**
+ * Trigger record class containing information about a dimuon L0 trigger
+ * local board decision.
+ */
+class AliHLTMUONTriggerRecord : public TObject
+{
+       /**
+        * Stream operator for usage with std::ostream classes.
+        * Allows usage such as:
+        *   AliHLTMUONTriggerRecord tr; std::cout << tr;
+        */
+       friend std::ostream& operator << (
+                       std::ostream& stream,
+                       const AliHLTMUONTriggerRecord& trigrec
+               );
+
+public:
+
+       /**
+        * Constructor for creating a new trigger record.
+        * @param id    The trigger record ID number unique for an event.
+        * @param sign  The particle's sign. Must be -1, 1 or 0 if the sign is unknown.
+        * @param px    X component of the particle's momentum.
+        * @param py    Y component of the particle's momentum.
+        * @param pz    Z component of the particle's momentum.
+        * @param sourceDDL  The DDL from which this trigger record originates.
+        * @param zf    The Z coordinate of the middle of the magnetic field assumed
+        *              during momentum calculation.
+        * @param qbl   The integrated magnetic field strength assumed during momentum
+        *              calculation.
+        */
+       AliHLTMUONTriggerRecord(
+                       Int_t id = -1,
+                       Int_t sign = 0,
+                       Float_t px = 0,
+                       Float_t py = 0,
+                       Float_t pz = 0,
+                       Int_t sourceDDL = -1,
+                       Float_t zf = 0,
+                       Float_t qbl = 0
+               );
+               
+       virtual ~AliHLTMUONTriggerRecord() {}
+
+       /**
+        * Returns the trigger record ID number, which is unique for an event.
+        */
+       Int_t Id() const { return fId; }
+
+       /**
+        * Returns the sign of the particle: -1, 1 or 0 if the sign is unknown.
+        */
+       Int_t Sign() const { return fSign; }
+
+       /**
+        * Returns the momentum vector with components in GeV/c.
+        */
+       const TVector3& Momentum() const { return fMomentum; }
+
+       /**
+        * Returns the X component of the particle's momentum in GeV/c.
+        */
+       Double_t Px() const { return fMomentum.Px(); }
+
+       /**
+        * Returns the Y component of the particle's momentum in GeV/c.
+        */
+       Double_t Py() const { return fMomentum.Py(); }
+
+       /**
+        * Returns the Z component of the particle's momentum in GeV/c.
+        */
+       Double_t Pz() const { return fMomentum.Pz(); }
+
+       /**
+        * Returns the momentum magnitude of the particle in GeV/c.
+        */
+       Double_t P() const { return fMomentum.Mag(); }
+
+       /**
+        * Returns the transverse momentum of the particle in GeV/c.
+        */
+       Double_t Pt() const { return fMomentum.Pt(); }
+
+       /**
+        * Returns the polar angle of the momentum vector in radians.
+        */
+       Double_t Polar() const { return fMomentum.Theta(); }
+
+       /**
+        * Returns the azimuthal angle of the transverse momentum in radians.
+        */
+       Double_t Phi() const { return fMomentum.Phi(); }
+
+       /**
+        * Returns the hit coordinate on the specified chamber in the AliRoot
+        * coordinate system.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       const TVector3& Hit(Int_t chamber) const;
+
+       /**
+        * Returns the X coordinate of the reconstructed hit in centimetres.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       Double_t X(Int_t chamber) const { return Hit(chamber).X(); }
+
+       /**
+        * Returns the Y coordinate of the reconstructed hit in centimetres.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       Double_t Y(Int_t chamber) const { return Hit(chamber).Y(); }
+
+       /**
+        * Returns the Z coordinate of the reconstructed hit in centimetres.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       Double_t Z(Int_t chamber) const { return Hit(chamber).Z(); }
+       
+       /**
+        * Returns the source DDL from which this trigger record originates.
+        * -1 is returned if this was not set.
+        */
+       Int_t SourceDDL() const { return fSourceDDL; }
+       
+       /**
+        * Returns the detector element ID number for the hit on the specified
+        * chamber. -1 is returned if this information was not set.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       Int_t DetElemId(Int_t chamber) const;
+       
+       /**
+        * Returns the 16 bit X pattern from the local board.
+        * -1 is returned if this information was not set.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       Int_t PatternX(Int_t chamber) const;
+       
+       /**
+        * Returns the 16 bit Y pattern from the local board.
+        * -1 is returned if this information was not set.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        */
+       Int_t PatternY(Int_t chamber) const;
+       
+       /**
+        * Returns the Z coordinate in the middle of the magnetic field used to
+        * calculate the momentum.
+        */
+       Float_t Zmiddle() const { return fZmiddle; }
+       
+       /**
+        * Returns the integrated magnetic field strength times charge used in
+        * the calculation of the momentum. Value returned in (T.m) tesla metres.
+        */
+       Float_t QBL() const { return fQBL; }
+       
+       /**
+        * Sets the hit coordinate (in AliRoot global coordinates) on the
+        * given chamber.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        * @param x  The X coordinate of the hit in centimetres.
+        * @param y  The Y coordinate of the hit in centimetres.
+        * @param z  The Z coordinate of the hit in centimetres.
+        */
+       void SetHit(Int_t chamber, Float_t x, Float_t y, Float_t z);
+       
+       /**
+        * Sets the debugging information for the hit on the specified chamber.
+        * @param chamber  The chamber for which to fetch the hit. Valid values
+        *                 are in the range [11..14].
+        * @param detElemId  The detector element ID.
+        * @param patterX    The X bit pattern from the local board.
+        * @param patterY    The Y bit pattern from the local board.
+        */
+       void SetHitDebugInfo(
+                       Int_t chamber,
+                       Int_t detElemId, UShort_t patternX, UShort_t patternY
+               );
+       
+       /**
+        * Prints the details of the trigger record.
+        * @param option  A case sensitive string that can contain one of the
+        *     following strings:
+        *       "compact" - Prints just the momentum, sign and ID of the trigger
+        *                   record in a terse format.
+        *       "detail" - Prints also the hit information.
+        *       "all" - Prints all known information about this trigger record.
+        *     If the string contains an empty option or NULL then the default is
+        *     to print compactly.
+        */
+       virtual void Print(Option_t* option = NULL) const;
+       
+       // Methods inherited from TObject
+       virtual Bool_t IsSortable() const { return kTRUE; }
+       Int_t Compare(const TObject* obj) const;
+
+       // Implement comparison operators.
+       bool operator == (const AliHLTMUONTriggerRecord& trigrec) const;
+
+       bool operator != (const AliHLTMUONTriggerRecord& trigrec) const
+       {
+               return not this->operator == (trigrec);
+       }
+
+private:
+
+       Int_t fId; // Each trigger record should have an ID number unique for a given event.
+       Int_t fSign;  // The sign of the particle: -1 or 1. 0 indicates unknown value.
+       TVector3 fMomentum; // Momentum vector of the particle in GeV/c.
+       TVector3 fHit[4];   // hit coordinates on trigger chambers 11 to 14.
+       
+       // The following is debugging information and may not be filled if the
+       // dHLT components were not set to produce this information.
+       Int_t fSourceDDL;  // The DDL from which this trigger record originates.
+       Int_t fDetElemId[4]; // The detector element ID for the hit on each chamber 11 to 14.
+       Int_t fPatternX[4];  // The X pattern from the local board structure for chambers 11 to 14. -1 if invalid.
+       Int_t fPatternY[4];  // The Y pattern from the local board structure for chambers 11 to 14. -1 if invalid.
+       
+       // Parameters used in momentum estimation:
+       Float_t fZmiddle; // Particle momentum X component in GeV/c.
+       Float_t fQBL;     // The integrated magnetic field times charge in (T.m) tesla metres.
+               
+       ClassDef(AliHLTMUONTriggerRecord, 1);  // Trigger record object translated from dHLT internal raw data.
+};
+
+#endif // ALIHLTMUONTRIGGERRECORD_H