Update master to aliroot
[u/mrichter/AliRoot.git] / HLT / MUON / AliHLTMUONMansoTracksBlockStruct.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 // $Id$
17
18 ///
19 /// @file   AliHLTMUONMansoTracksBlockStruct.cxx
20 /// @author Artur Szostak <artursz@iafrica.com>
21 /// @date   21 May 2007
22 /// @brief  Implementation of useful stream and comparison operators.
23 ///
24 /// The Manso tracks data block is an internal dimuon HLT data block structure
25 /// generated by the Manso algorithm.
26 ///
27
28 #include "AliHLTMUONMansoTracksBlockStruct.h"
29 #include "AliHLTMUONUtils.h"
30 #include <cassert>
31
32
33 std::ostream& operator << (
34                 std::ostream& stream, const AliHLTMUONMansoTrackStruct& track
35         )
36 {
37         std::ios::fmtflags oldflags = stream.flags();
38         stream  << "{fId = " << track.fFlags
39                 << ", fTrigRec = " << track.fTrigRec
40                 << ", fFlags = " << std::showbase << std::hex
41                 << track.fFlags << std::dec
42                 << ", fPx = " << track.fPx
43                 << ", fPy = " << track.fPy
44                 << ", fPz = " << track.fPz
45                 << ", fChi2 = " << track.fChi2
46                 << ", fHit[0] = " << track.fHit[0]
47                 << ", fHit[1] = " << track.fHit[1]
48                 << ", fHit[2] = " << track.fHit[2]
49                 << ", fHit[3] = " << track.fHit[3]
50                 << "}";
51         stream.flags(oldflags);
52         return stream;
53 }
54
55
56 std::ostream& operator << (
57                 std::ostream& stream,
58                 const AliHLTMUONMansoTracksBlockStruct& block
59         )
60 {
61         assert( AliHLTMUONUtils::IntegrityOk(block) );
62
63         const AliHLTMUONMansoTrackStruct* track =
64                 reinterpret_cast<const AliHLTMUONMansoTrackStruct*>(&block + 1);
65         stream  << "{fHeader = " << block.fHeader << ", fTrack[] = [";
66         if (block.fHeader.fNrecords > 0) stream << track[0];
67         for (AliHLTUInt32_t i = 1; i < block.fHeader.fNrecords; i++)
68                 stream << ", " << track[i];
69         stream << "]}";
70         return stream;
71 }
72
73
74 bool operator == (
75                 const AliHLTMUONMansoTracksBlockStruct& a,
76                 const AliHLTMUONMansoTracksBlockStruct& b
77         )
78 {
79         assert( AliHLTMUONUtils::IntegrityOk(a) );
80         assert( AliHLTMUONUtils::IntegrityOk(b) );
81
82         const AliHLTMUONMansoTrackStruct* trackA =
83                 reinterpret_cast<const AliHLTMUONMansoTrackStruct*>(&a + 1);
84         const AliHLTMUONMansoTrackStruct* trackB =
85                 reinterpret_cast<const AliHLTMUONMansoTrackStruct*>(&b + 1);
86         
87         // First check if the blocks have the same header. If they do then check
88         // if every track is the same. In either case if we find a difference
89         // return false.
90         if (a.fHeader != b.fHeader) return false;
91         for (AliHLTUInt32_t i = 0; i < a.fHeader.fNrecords; i++)
92                 if (trackA[i] != trackB[i]) return false;
93         return true;
94 }