ROOT logo
#include "hshowerhittrackmatcher.h"

#include "hruntimedb.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hshowerdetector.h"
#include "hcategory.h"
#include "hmatrixcatiter.h"
#include "hlocation.h"
#include "hshowerhit.h"
#include "hshowertrack.h"
#include "hshowerhitsim.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "showerdef.h"

#include <map>
#include <vector>
#include <iostream>

using  namespace std;

ClassImp(HShowerHitTrackMatcher)

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////
//HShowerHitTrackMatcher
//
// HShowerHitTrackMatcher reconstructor searches 
// data describing the same pad in HShowerHit and HShowerTrack categories
// and join its to one object. 
// Results are stored in HShowerHitSim category
//
// The Shower task is split into several tasks as shown
// in the flow diagram below.
//
//   ----------------------
//  |     HShowerUnpacker  |                                                                              //
//  |   (embedding mode)   | \                                                                            //
//  |                      |  \      ------------------                                                   //
//   ----------------------   |     |  HGeantShower    |                                                  //
//                            |      ------------------\                                                  //
//                            |                         \                                                 //
//                            |      ------------------  \------------->  ----------------------          //
//                            |     |  HGeantWire      |   <------------ |  HShowerHitDigitizer |         //
//                            |      ------------------\                  ----------------------          //
//                            |                         \                                                 //
//                 -------------     ------------------  \------------->  -----------------------         //
//             -- | HShowerRaw  |   |  HShowerRawMatr  |   <------------ |  HShowerPadDigitizer  |        //
//            |    -------------     ------------------\                 |( creates track objects|        //
//            |                                         \                |  for real tracks in   |        //
//   ----------------------          ------------------  \               |  embedding mode too)  |        //
//  |   HShowerCalibrater  |        |  HShowerTrack    |  \<------------  -----------------------         //
//  |   (embedding mode)   |         ------------------\   \                                              //
//   ----------------------                             \   \             -----------------------         //
//            |                      ------------------  \   ----------> |   HShowerCopy         |        //
//             -------------------> |  HShowerCal      |  \<------------ |(add charge of real hit|        //
//                                   ------------------\   \             | in embedding too )    |        //
//                                                      \   \             -----------------------         //
//                                   ------------------  ----\--------->  -----------------------         //
//                                  |  HShowerHitHdr   |   <--\--------- |  HShowerHitFinder     |        //
//                                   ------------------        \          -----------------------         //
//                                   ------------------         \        |                                //
//                                  |  HShowerPID      |   <-----\-------|                                //
//                                   ------------------           \      |                                //
//                                   ------------------            \     |                                //
//                                  |  HShowerHitSim   |   <--------\----|                                //
//                                   ------------------ <            \                                    //
//                                                       \            \                                   //
//                                                        \-------------> ------------------------        //
//                                                                       | HShowerHitTrackMatcher |       //
//                                                                        ------------------------        //
//
//
//  In the case of TRACK EMBEDDING of simulated tracks into
//  experimental data the real data are written by the HShowerUnpacker into
//  HShowerRaw category. The real hits are taken into
//  account by the digitizer (adding of charges). The embedding mode is recognized
    //  automatically by analyzing the
    //  gHades->getEmbeddingMode() flag.
    //            Mode ==0 means no embedding
    //                 ==1 realistic embedding (first real or sim hit makes the game)
    //                 ==2 keep GEANT tracks   (as 1, but GEANT track numbers will always
    //                     win against real data. besides the tracknumber the output will
    //                     be the same as in 1)
    //
    //
    //////////////////////////////////////////////////////////////////////

    HShowerHitTrackMatcher::HShowerHitTrackMatcher(const Text_t *name,const Text_t *title) :
HReconstructor(name,title)
{
    fHitIter   = NULL;
    fTrackIter = NULL;
    m_zeroLoc.set(0);
}

HShowerHitTrackMatcher::HShowerHitTrackMatcher()
{
    fHitIter   = NULL;
    fTrackIter = NULL;
    m_zeroLoc.set(0);
}


HShowerHitTrackMatcher::~HShowerHitTrackMatcher(void) {
    if (fHitIter)   delete fHitIter;
    if (fTrackIter) delete fTrackIter;
}

Bool_t HShowerHitTrackMatcher::init() {
    // creates an iterator which loops over all local maxima
    // and an iterator which loops over all track number information


    m_pTrackCat = gHades->getCurrentEvent()->getCategory(catShowerTrack);
    if (m_pTrackCat) {
	fTrackIter = (HIterator*)m_pTrackCat->MakeIterator();
    }

    m_pHitCat = gHades->getCurrentEvent()->getCategory(catShowerHit);
    if (m_pHitCat) {
	fHitIter = (HIterator*)m_pHitCat->MakeIterator();
    }

    return kTRUE;
}

Bool_t HShowerHitTrackMatcher::finalize(void) {
    return kTRUE;
}

Int_t HShowerHitTrackMatcher::execute()
{
    // searching all pairs in HShowerHit and HShowerTrack, which
    // have the same address. All tracks belonging to the same
    // address are added to the list of tracks stored in HShowerHitSim

    if(fTrackIter == 0 || fHitIter == 0 ) return 0; // nothing to do

    //---------------------------------------------------------------
    // Fill a vector of track numbers belonging to the same pad
    map<Int_t, vector<Int_t> > trackMap;
    HShowerTrack* pTrack;
    fTrackIter->Reset();
    while((pTrack = (HShowerTrack *) fTrackIter->Next()))
    {
	Int_t addTr   = pTrack->getAddress();
	Int_t trackNr = pTrack->getTrack();
	map<Int_t,vector<Int_t> >::iterator pos = trackMap.find(addTr);
	if( pos == trackMap.end() ) {  // address not yet registered
	    vector<Int_t> v;
	    v.push_back(trackNr);
	    trackMap.insert( make_pair( addTr, v ) );
	} else {                       // add track to the list of the pad
	    (pos->second).push_back(trackNr);
	}
    }
    //---------------------------------------------------------------


    //---------------------------------------------------------------
    // fill list of track numbers to HShowerHitSim
    HShowerHitSim*  pHit;
    fHitIter  ->Reset();
    while((pHit = (HShowerHitSim*)fHitIter->Next()))
    {   //loop over hits
	Int_t addTr = pHit->getAddress();
	map<Int_t,vector<Int_t> >::iterator pos = trackMap.find(addTr);
	if( pos != trackMap.end() ) {  // address found
	    vector<Int_t>& list = pos->second;
	    for( UInt_t i = 0; i < list.size(); i ++ ) {
		pHit->setTrack(list[i]);
	    }
	} else { // should not happen
	    Error("execute()","Corresponding pad address of the HShowerTrack list not found in HShowerHitSim!");
	}
    }
    //---------------------------------------------------------------

    return 0;
}



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