00001
00002
00003
00004
00005
00006 #include "StMuDstFilterMaker.h"
00007
00008 #include "StMuDSTMaker/COMMON/StMuTypes.hh"
00009
00010
00011 #include "StEvent/StEventTypes.h"
00012
00013 #include "THack.h"
00014 #include "TFile.h"
00015 #include "TTree.h"
00016 #include "TBranch.h"
00017 #include "TChain.h"
00018
00019 #include <vector>
00020 #include <algorithm>
00021
00022 #define __COMPRESSION__ 9
00023 #define __BUFFER__ 65536
00024 #define __SPLIT__ 99
00025 #define __AUTOSAVE__ 1000000
00026
00027
00028
00029 StMuDstFilterMaker::StMuDstFilterMaker(const char* name) : StMaker(name), mMuDstMaker(0), mFile(0), mTTree(0), mFilterGlobals(1), mDoBemc(1), mDoEemc(1) {
00030 DEBUGMESSAGE2("");
00031
00032 createArrays();
00033 }
00034
00039 void StMuDstFilterMaker::open(const Char_t *fname) {
00040 mFile = new TFile(fname,"RECREATE","StMuDst");
00041 if (mFile->IsZombie() ) throw StMuExceptionNullPointer("no file openend",__PRETTYF__);
00042 mFile->SetCompressionLevel(__COMPRESSION__);
00043
00044
00045 DEBUGMESSAGE2("now create trees and branches");
00046
00047 TBranch* branch;
00048 mTTree = new TTree("MuDst", "StMuDst",__SPLIT__);
00049 if (!mTTree) throw StMuExceptionNullPointer("can not create tree",__PRETTYF__);
00050 #if ROOT_VERSION_CODE < ROOT_VERSION(5,26,0)
00051 Long64_t MAXLONG=100000000000LL;
00052 LOG_INFO << "Tree size MAX will be " << (float) MAXLONG/1000/1000/1000 << " GB " << endm;
00053
00054 mTTree->SetMaxTreeSize(MAXLONG);
00055 #endif
00056
00057 DEBUGMESSAGE2("arrays");
00058 for ( int i=0; i<__NARRAYS__; i++) {
00059 DEBUGVALUE2(i);
00060 branch = mTTree->Branch(StMuArrays::arrayNames[i],&mArrays[i], __BUFFER__, __SPLIT__);
00061 }
00062 #ifndef __NO_STRANGE_MUDST__
00063
00064 DEBUGMESSAGE2("strange arrays");
00065 for ( int i=0; i<__NSTRANGEARRAYS__; i++) {
00066 DEBUGVALUE2(i);
00067 branch = mTTree->Branch(StMuArrays::strangeArrayNames[i],&mStrangeArrays[i], __BUFFER__, __SPLIT__);
00068 }
00069 #endif
00070
00071 DEBUGMESSAGE2("emc arrays");
00072 for ( int i=0; i<__NEMCARRAYS__; i++) {
00073 DEBUGVALUE2(i);
00074 branch = mTTree->Branch(StMuArrays::emcArrayNames[i],&mEmcArrays[i], __BUFFER__, __SPLIT__);
00075 }
00076 }
00077
00081 void StMuDstFilterMaker::close(){
00082 if (mFile) {
00083 mFile->Write();
00084 mFile->Close();
00085 }
00086 mFile = 0;
00087 mTTree = 0;
00088 }
00089
00090
00091 StMuDstFilterMaker::~StMuDstFilterMaker() {
00092
00093 }
00094
00095
00096
00097 int StMuDstFilterMaker::Make(){
00098 DEBUGMESSAGE1("");
00099 if ( !mMuDstMaker ) return 0;
00100
00101 if (mFile==0 || mCurFileName != mMuDstMaker->chain()->GetFile()->GetName()) {
00102 string outName;
00103 if (mOutDirName.size())
00104 outName=mOutDirName+'/';
00105 if (mOutFileName.size()) {
00106 outName+=mOutFileName;
00107 }
00108 else {
00109 close();
00110 const Char_t *inName = mMuDstMaker->chain()->GetFile()->GetName();
00111 const Char_t *baseName = strrchr(inName,'/');
00112 if (!baseName)
00113 baseName=inName;
00114 else
00115 baseName++;
00116 outName+=baseName;
00117 }
00118 if (mFile==0) {
00119 cout << "Opening output file " << outName << endl;
00120 open(outName.c_str());
00121 }
00122 mCurFileName = mMuDstMaker->chain()->GetFile()->GetName();
00123 }
00124 StMuDst* muDst = mMuDstMaker->muDst();
00125 if ( !muDst ) return 0;
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 clear();
00141 if ( filter(muDst)==false ) return 0;
00142
00143
00144
00145
00146
00147
00148 if ( filter( muDst->event() ) == 0 ) return 0;
00149
00150 DEBUGMESSAGE("Event accepted");
00151 addType( mArrays[muEvent], *(muDst->event()) );
00152
00153
00154 if (muDst->primaryVertex()) {
00155 addType( mArrays[muPrimaryVertex], *(muDst->primaryVertex()) );
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 TArrayI globals_stored(muDst->globalTracks()->GetEntries());
00167 int numberOfTracks = 0;
00168 numberOfTracks = muDst->primaryTracks()->GetEntries();
00169 for ( int i=0; i<numberOfTracks; i++) {
00170 StMuTrack* track = muDst->primaryTracks(i);
00171 if ( filter( track )==true ) {
00172 Int_t global_idx=track->index2Global();
00173 if (global_idx >= 0 && globals_stored[global_idx]==0) {
00174
00175 Int_t nw_global_idx = addType( mArrays[muGlobal], *muDst->globalTracks(global_idx) );
00176 track->setIndex2Global(nw_global_idx);
00177 globals_stored[global_idx] = 1;
00178 }
00179 addType( mArrays[muPrimary], *track );
00180 }
00181 }
00182
00183 numberOfTracks = muDst->globalTracks()->GetEntries();
00184 for ( int i=0; i<numberOfTracks; i++) {
00185 StMuTrack* track = muDst->globalTracks(i);
00186 if (mFilterGlobals && globals_stored[i] == 0) {
00187 if (filter(track)) {
00188 addType( mArrays[muGlobal], *track);
00189 }
00190 }
00191 }
00192
00193
00194 StMuEmcCollection* emc = muDst->muEmcCollection();
00195 if ( filter(emc) ) {
00196
00197
00198 StMuEmcTowerData *typeOfTowerData=0;
00199 StMuEmcHit *typeOfEmcHit=0;
00200 if (mDoBemc || mDoEemc) {
00201 addType( muDst->emcArray(muEmcTow), mEmcArrays[muEmcTow], typeOfTowerData );
00202 if (mEmcArrays[muEmcTow]->GetEntries()) {
00203 if (!mDoBemc)
00204 ((StMuEmcTowerData*) mEmcArrays[muEmcTow]->UncheckedAt(0))->clearBemc();
00205 if (!mDoEemc)
00206 ((StMuEmcTowerData*) mEmcArrays[muEmcTow]->UncheckedAt(0))->clearEemc();
00207 }
00208 }
00209 if (mDoBemc) {
00210 addType( muDst->emcArray(muEmcPrs), mEmcArrays[muEmcPrs], typeOfEmcHit );
00211 addType( muDst->emcArray(muEmcSmde), mEmcArrays[muEmcSmde], typeOfEmcHit );
00212 addType( muDst->emcArray(muEmcSmdp), mEmcArrays[muEmcSmdp], typeOfEmcHit );
00213 }
00214 if (mDoEemc) {
00215 addType( muDst->emcArray(muEEmcPrs), mEmcArrays[muEEmcPrs], typeOfEmcHit );
00216 addType( muDst->emcArray(muEEmcSmdu), mEmcArrays[muEEmcSmdu], typeOfEmcHit );
00217 addType( muDst->emcArray(muEEmcSmdv), mEmcArrays[muEEmcSmdv], typeOfEmcHit );
00218 }
00219 }
00220
00221
00222 if ( mArrays[muPrimary]->GetEntries()>0) {
00223 mTTree->Fill(); THack::IsTreeWritable(mTTree);
00224 }
00225 return 0;
00226 }
00227
00228 template <class T>
00229 int StMuDstFilterMaker::addType(TClonesArray* tcaTo , T t) {
00230 int counter =-1;
00231 if (tcaTo) {
00232 counter = tcaTo->GetEntries();
00233 new((*tcaTo)[counter]) T( t );
00234 }
00235 return counter;
00236 }
00237
00238 template <class T>
00239 int StMuDstFilterMaker::addType(TClonesArray* tcaFrom, TClonesArray* tcaTo ,T *t) {
00240 if (tcaFrom && tcaTo) {
00241 int n = tcaFrom->GetEntries();
00242 int counter = tcaTo->GetEntries();
00243 for (int i=0; i<n;i++) {
00244 new((*tcaTo)[counter++]) T( *(T*)(void*)tcaFrom->UncheckedAt(i) );
00245 }
00246 }
00247 return 0;
00248 }
00249
00250 int StMuDstFilterMaker::Finish() {
00251 close();
00252 return 0;
00253 }
00254
00258 void StMuDstFilterMaker::clear(){
00259 DEBUGMESSAGE2("");
00260
00261 clearArrays();
00262 }
00263
00268 void StMuDstFilterMaker::createArrays() {
00270 int dummy;
00271 for ( int i=0; i<__NARRAYS__; i++) {
00272 mArrays[i] = 0;
00273 DEBUGVALUE2(mArrays[i]);
00274 mArrays[i]= mMuDstMaker->clonesArray(mArrays[i],StMuArrays::arrayTypes[i],StMuArrays::arraySizes[i],dummy);
00275 DEBUGVALUE2(mArrays[i]);
00276 }
00277 #ifndef __NO_STRANGE_MUDST__
00279 for ( int i=0; i<__NSTRANGEARRAYS__; i++) {
00280 mStrangeArrays[i] = 0;
00281 mStrangeArrays[i]= mMuDstMaker->clonesArray(mStrangeArrays[i],StMuArrays::strangeArrayTypes[i],StMuArrays::strangeArraySizes[i],dummy);
00282 }
00283 #endif
00285 for ( int i=0; i<__NEMCARRAYS__; i++) {
00286 mEmcArrays[i] = 0;
00287 mEmcArrays[i]= mMuDstMaker->clonesArray(mEmcArrays[i],StMuArrays::emcArrayTypes[i],StMuArrays::emcArraySizes[i],dummy);
00288 }
00289 }
00290
00291 void StMuDstFilterMaker::clearArrays()
00292 {
00294 for ( int i=0; i<__NARRAYS__; i++) {
00295 mArrays[i]->Clear();
00296 }
00297 #ifndef __NO_STRANGE_MUDST__
00299 for ( int i=0; i<__NSTRANGEARRAYS__; i++) {
00300 mStrangeArrays[i]->Clear();
00301 }
00302 #endif
00304 for ( int i=0; i<__NEMCARRAYS__; i++) {
00305 mEmcArrays[i]->Clear();
00306 }
00307 }
00308
00309
00310
00311
00312
00313
00314
00316 bool StMuDstFilterMaker::filter(StMuTrack* track) {
00317 return ( track->p().mag()>1. ) && ( fabs(track->eta())<1.0 );
00318 }
00319
00320
00321 ClassImp(StMuDstFilterMaker)
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395