00001 #include "StGammaTreeReader.h"
00002
00003 #include "TString.h"
00004 #include <algorithm>
00005
00006 ClassImp(StGammaTreeReader);
00007
00008 struct ID {
00009 int run;
00010 int evt;
00011 };
00012
00013
00014
00015 StGammaTreeReader::StGammaTreeReader(const Char_t *name,const Char_t *bname):StMaker(name)
00016 {
00017 mChain=new TChain(name,"gamma");
00018 mBranchName=bname;
00019 index=0;
00020 mNumberOfFiles=0;
00021 mIndexed=0;
00022 mFirst=false;
00023 }
00024
00025
00026 Int_t StGammaTreeReader::Init()
00027 {
00028 mEvent=new StGammaEvent();
00029 mChain-> SetBranchAddress(mBranchName,&mEvent);
00030 return StMaker::Init();
00031 }
00032
00033
00034 Int_t StGammaTreeReader::Make()
00035 {
00036
00037 Int_t stat= getEvent(index++);
00038 if ( !stat ) return kStEOF;
00039 return kStOK;
00040 }
00041
00042
00043 Int_t StGammaTreeReader::getEvent(Long64_t i)
00044 {
00045 if ( mFirst ) treeDetails();
00046 Int_t stat=mChain->GetEntry(i);
00047 return stat;
00048 }
00049
00050 Int_t StGammaTreeReader::getEvent(Int_t run, Int_t myevent)
00051 {
00052 if ( !mIndexed ) buildIndex();
00053 Long64_t mykey = key(run,myevent);
00054 Long64_t entry = mIndex[ mykey ];
00055 if ( !entry ) {
00056 mEvent->Clear();
00057 assert(myevent);
00058 return 0;
00059 }
00060 return getEvent( entry - 1 );
00061 }
00062
00063 void StGammaTreeReader::treeDetails()
00064 {
00065 mFirst=false;
00066 std::cout << GetCVS() << std::endl;
00067 std::cout << mChain->GetTitle() << std::endl;
00068 }
00069
00070
00071 void StGammaTreeReader::Clear(Option_t *opts)
00072 {
00073 }
00074
00075
00076 void StGammaTreeReader::chainFile( const Char_t *file, const Char_t *matches )
00077 {
00078
00079 TString fname=file;
00080 if ( fname.Contains(matches) )
00081 {
00082 std::cout << Form("[%02i] add %s",mNumberOfFiles++,file ) << std::endl;
00083 mChain->Add(fname);
00084 }
00085
00086 }
00087
00088
00089 void StGammaTreeReader::buildIndex()
00090 {
00091
00092 TStopwatch timer;
00093 timer.Start();
00094
00095
00096 Long64_t N = getNumberOfEvents();
00097 std::cout << GetName() << "::Indexing " << N << " entries" << std::endl;
00098
00099 for ( Long64_t i=0;i<N;i++ )
00100 {
00101 if ( !getEvent(i) ) continue;
00102 Int_t run = mEvent->runNumber();
00103 Int_t event = mEvent->eventNumber();
00104 Long64_t mykey = key(run,event);
00105 mIndex[ mykey ] = i + 1;
00106 if ( i < 10 ) {
00107 std::cout << Form("[%i] RUN: %i EVENT: %i KEY: ",(Int_t)i,run,event) << mykey << " INDEX: " << i << std::endl;
00108 }
00109
00110 }
00111 mIndexed=1;
00112
00113 timer.Stop();
00114
00115 std::cout << "[Time to build index for "<<N<<" events -- ";
00116 std::cout << Form("real: %.2f s cpu: %.2f s]",timer.RealTime(),timer.CpuTime()) << std::endl;
00117
00118 }
00119
00120
00121 void StGammaTreeReader::Test()
00122 {
00123
00124 static Int_t ngood=0;
00125
00126 Long64_t N = getNumberOfEvents();
00127
00128 std::vector<ID> ids;
00129 for ( Long64_t i=0;i<N;i++ )
00130 {
00131 ID myid ;
00132 if ( !getEvent(i) ) continue;
00133 myid.run = mEvent->runNumber();
00134 myid.evt = mEvent->eventNumber();
00135 ids.push_back(myid);
00136
00137 }
00138
00139
00140 std::random_shuffle( ids.begin(), ids.end() );
00141
00142 std::cout << Form("Verifying indexing scheme for %g events",(double)N)
00143 << std::endl;
00144
00145 for ( Long64_t i=0;i<N;i++ )
00146 {
00147
00148 if (!getEvent( ids[i].run, ids[i].evt ))continue;
00149
00150
00151 Bool_t state=true;
00152 if ( mEvent->runNumber() != ids[i].run ||
00153 mEvent->eventNumber() != ids[i].evt ) {
00154 mEvent->Print();
00155 state=false;
00156 }
00157 else
00158 ngood++;
00159
00160 if ( !state )
00161 std::cout << Form("run=%i event=%i state=%s",ids[i].run,ids[i].evt,"bad")
00162 << std::endl;
00163
00164
00165 assert( mEvent->runNumber() == ids[i].run );
00166 assert( mEvent->eventNumber() == ids[i].evt );
00167
00168 }
00169 std::cout << Form("Verified %g of %g events were properly indexed",(double)ngood,(double)N) << std::endl;
00170
00171 }
00172
00173 Long64_t StGammaTreeReader::key( Int_t run, Int_t event )
00174 {
00175
00176 Long64_t mykey=0;
00177 mykey = (Long64_t)run;
00178
00179 mykey *= (Long64_t)1.0E10;
00180 mykey += event;
00181
00182
00183 return mykey;
00184
00185 }