00001
00002
00003
00004
00006 #include "StStrangeMuDstMaker.h"
00007 #include "TFile.h"
00008 #include "TChain.h"
00009 #include "THack.h"
00010 #include "StTree.h"
00011 #include "StEvent/StEvent.h"
00012 #include "StEvent.h"
00013 #include "StStrangeEvMuDst.hh"
00014 #include "StStrangeCuts.hh"
00015 #include "StMcEventTypes.hh"
00016 #include "StParticleDefinition.hh"
00017 #include "StMessMgr.h"
00018 #include "StuJitterBug.hh"
00019
00020
00021 #define MAXFILESIZE 1900000000
00022
00023 #define EachDoT(proc) \
00024 for (Int_t i=1; i<strDstT; i++) { \
00025 if (doT[i]) proc; }
00026
00027 #define EachController(proc) EachDoT( if( cont[i]) cont[i]->proc );
00028
00029
00030 static const char* defFileName = "evMuDst.root";
00031 static const char* defName = "StrangeMuDst";
00032 static const char* altName = "MuDst";
00033 static const char* defTitle = "Strangeness Micro-DST";
00034 static const char* trNames[3] = {defName,altName,0};
00035
00036 Int_t thisRun,thisEvent,lastRun,lastEvent,readEventNumber;
00037 TFile* lastFile;
00038
00039 ClassImp(StStrangeMuDstMaker)
00040
00041 StStrangeMuDstMaker::StStrangeMuDstMaker(const char *name) : StMaker(name) {
00042
00043 muDst = 0;
00044 tree = 0;
00045 chain = 0;
00046 evClonesArray = 0;
00047 evMcArray = 0;
00048 cutsArray = 0;
00049 dstMaker = 0;
00050 cuts = new StStrangeCuts();
00051 SetNumber(-2);
00052 outFileNum = 1;
00053 doT0JitterAbort = kFALSE;
00054
00055
00056
00057 for (Int_t i=0; i<strDstT; i++) {
00058 doT[i] = kFALSE;
00059 cont[i] = 0;
00060 bsize[i] = 0;
00061 }
00062
00063 strcpy(file,defFileName);
00064 fileBlind = kFALSE;
00065
00066 doMc = kFALSE;
00067 SetMode(StrangeNoFile);
00068 abortEvent = kFALSE;
00069
00070 bsize[evT] = 64000;
00071
00072 thisRun = -1;
00073 thisEvent = -1;
00074 lastRun = -1;
00075 lastEvent = -1;
00076 lastFile = 0;
00077 }
00078
00079 StStrangeMuDstMaker::~StStrangeMuDstMaker() {
00080
00081 if (!dstMaker) {
00082 delete evClonesArray; evClonesArray = 0;
00083 if (evMcArray) { delete evMcArray; evMcArray = 0; }
00084 }
00085 delete cutsArray; cutsArray = 0;
00086 delete cuts; cuts = 0;
00087 for (int i=0;i<strDstT;i++) {delete cont[i]; cont[i]=0;}
00088
00089 }
00090
00091 Int_t StStrangeMuDstMaker::Init() {
00092
00093 abortEvent = kFALSE;
00094 firstEvent = kTRUE;
00095 if (Debug()) gMessMgr->Debug() << "In StStrangeMuDstMaker::Init() ... "
00096 << GetName() << endm;
00097 if ((GetMode() == StrangeWrite) && (OpenFile() == kStErr)) return kStEOF;
00098 if (!dstMaker) {
00099 evClonesArray = new TClonesArray("StStrangeEvMuDst",1);
00100 if (doMc) evMcArray = new TClonesArray("StStrangeEvMuDst",1);
00101 }
00102 cutsArray = new TClonesArray("TCut",0);
00103 StStrangeControllerBase::currentMaker = this;
00104 {
00105 EachDoT(cont[i] = StStrangeControllerBase::Instantiate(i));
00106
00107
00108 }
00109
00110 v0 = cont[v0T];
00111 xi = cont[xiT];
00112 kink = cont[kinkT];
00113
00114 if (GetMode() == StrangeNoKeep) {
00115 {EachDoT( cont[i]->SetBufferSize(32000) );}
00116 } else {
00117 {EachDoT( if (bsize[i]) cont[i]->SetBufferSize(bsize[i]) );}
00118 }
00119
00120 if (GetMode() == StrangeRead) {
00121 InitReadDst();
00122 if (dstMaker) {
00123 gMessMgr->Error() << "StStrangeMuDstMaker: cannot read a dst and create "
00124 << "a dst with one maker.\n"
00125 << " Will read only." << endm;
00126 dstMaker = 0;
00127 }
00128 } else {
00129 InitCreateDst();
00130 }
00131
00132 return StMaker::Init();
00133 }
00134
00135 void StStrangeMuDstMaker::InitReadDst() {
00136
00137 if (!((tree) && (muDst))) {
00138 gMessMgr->Error(
00139 "StStrangeMuDstMaker: no appropriate tree in input file(s)!");
00140 return;
00141 }
00142
00143
00144
00145
00146 if (strcmp(tree->GetBranch("Event")->GetFileName(),"")) {
00147 TObjArray* listOfBranches = tree->GetListOfBranches();
00148 for (int i=0; i<listOfBranches->GetEntriesFast(); i++)
00149 ((TBranch*) listOfBranches->At(i))->SetFile(muDst);
00150 }
00151
00152 tree->SetBranchStatus("*",0);
00153 tree->SetBranchStatus("Event.*",1);
00154 tree->SetBranchAddress("Event",&evClonesArray);
00155 if (doMc) {
00156 tree->SetBranchStatus("McEvent.*",1);
00157 tree->SetBranchAddress("McEvent",&evMcArray);
00158 }
00159 EachController(InitReadDst());
00160
00161 if (tree->GetBranch("StrangeCuts")) {
00162 tree->SetBranchStatus("StrangeCuts.*",1);
00163 tree->SetBranchAddress("StrangeCuts",&cutsArray);
00164 } else {
00165 TOrdCollection* ordCuts = (TOrdCollection*) muDst->Get("StrangeCuts");
00166 if (ordCuts) {
00167 cuts->Reset(ordCuts);
00168 } else {
00169 gMessMgr->Warning("StStrangeMuDstMaker: no StrangeCuts");
00170 cuts->UnknownCuts();
00171 }
00172 }
00173
00174 if( Debug() ) {
00175 TObjArray *listOfBranches = tree->GetListOfBranches();
00176 for( Int_t i=0; i<tree->GetNbranches(); i++) {
00177 const char* n = ((TBranch*) listOfBranches->At(i))->GetName();
00178 gMessMgr->Debug() << "Branch " << n << " Status = " << tree->GetBranchStatus(n) << endm;
00179 }
00180 }
00181 }
00182
00183 void StStrangeMuDstMaker::InitCreateDst() {
00184
00185 tree = new TTree(defName,defTitle);
00186 tree->SetDirectory(muDst);
00187 EachController(InitCreateDst());
00188
00189 Int_t split = 99;
00190 TBranch* branch = tree->Branch("StrangeCuts",&cutsArray,bsize[evT],split);
00191 if (!dstMaker) {
00192 branch = tree->Branch("Event",&evClonesArray,bsize[evT],split);
00193 if (doMc) {
00194 branch = tree->Branch("McEvent",&evMcArray,bsize[evT],split);
00195 }
00196 }
00197
00198 if (firstEvent) cuts->Init();
00199 }
00200
00201 void StStrangeMuDstMaker::InitCreateSubDst() {
00202
00203 Int_t split=2;
00204 evClonesArray = dstMaker->GetEvClonesArray();
00205 TBranch* branch = tree->Branch("Event",&evClonesArray,bsize[evT],split);
00206 if (doMc) {
00207 evMcArray = dstMaker->GetEvMcArray();
00208 branch = tree->Branch("McEvent",&evMcArray,bsize[evT],split);
00209 }
00210 EachController(InitCreateSubDst());
00211 }
00212
00213 Int_t StStrangeMuDstMaker::Make() {
00214
00215 if (Debug()) gMessMgr->Debug() << "In StStrangeMuDstMaker::Make() ... "
00216 << GetName() << endm;
00217
00218 if (GetMode() == StrangeRead) {
00219 return MakeReadDst();
00220 } else if (!dstMaker) {
00221 return MakeCreateDst();
00222
00223
00224
00225
00226
00227 } else if (!evClonesArray) {
00228 InitCreateSubDst();
00229 }
00230 return kStOK;
00231 }
00232
00233 Int_t StStrangeMuDstMaker::MakeReadDst() {
00234
00235 if (!((tree) && (muDst))) return kStEOF;
00236 Int_t makerEventNumber = GetNumber();
00237 if (makerEventNumber == -2) {
00238 readEventNumber = 0;
00239 SetNumber(-1);
00240 } else if (makerEventNumber == -1) {
00241 readEventNumber++;
00242 } else {
00243 readEventNumber = makerEventNumber;
00244 }
00245
00246
00247 if (tree->GetEvent(readEventNumber) <= 0) return kStEOF;
00248
00249 TFile* thisFile = chain->GetFile();
00250 if (thisFile != lastFile) {
00251 gMessMgr->Info() << "StStrangeMuDstMaker: Now reading from event file:\n "
00252 << thisFile->GetName() << endm;
00253 lastFile = thisFile;
00254 }
00255
00256
00257
00258 Bool_t badEvent = kTRUE;
00259 if (GetEvent()) {
00260 thisRun = GetEvent()->run();
00261 thisEvent = GetEvent()->event();
00262 badEvent = (thisRun == lastRun) && (thisEvent == lastEvent);
00263 }
00264 if (badEvent) {
00265 if (makerEventNumber < 0 ) {
00266
00267
00268 return MakeReadDst();
00269 } else {
00270
00271
00272 gMessMgr->Warning() <<
00273 "StStrangeMuDstMaker: event on file has bad event info\n" <<
00274 " and should be skipped!" << endm;
00275 GetEvent()->Clear();
00276 EachController(Clear());
00277 return kStOK;
00278
00279 }
00280 } else {
00281 lastRun = thisRun;
00282 lastEvent = thisEvent;
00283 }
00284
00285 if (cutsArray->GetEntriesFast()) cuts->Reset(cutsArray);
00286
00287 EachController(MakeReadDst());
00288
00289 return kStOK;
00290 }
00291
00292 Int_t StStrangeMuDstMaker::MakeCreateDst() {
00293
00294 if (abortEvent) return kStOK;
00295
00296
00297 if (firstEvent) {
00298 Int_t iSize = cuts->GetSize();
00299 cuts->Fill(strTypeNames[v0T], GetDataSet("ev0par2"));
00300 cuts->Fill(strTypeNames[xiT], GetDataSet("exipar"));
00301 cuts->Fill(strTypeNames[kinkT], GetDataSet("tkf_tkfpar"));
00302 Int_t fSize = cuts->GetSize();
00303 if (!(fSize-iSize)) {
00304 gMessMgr->Warning("StStrangeMuDstMaker: no cut parameters found.");
00305 cuts->UnknownCuts();
00306 }
00307 firstEvent = kFALSE;
00308 }
00309
00310
00311 StEvent* event = (StEvent*) GetInputDS("StEvent");
00312 if (!event) return kStOK;
00313
00314 new((*evClonesArray)[0]) StStrangeEvMuDst(*event);
00315 cuts->UpdateArray(cutsArray);
00316
00317 if (doT0JitterAbort && t0JitterAbort(event)) {
00318 gMessMgr->Warning("StStrangeMuDstMaker: T0 jitter; skipping event.");
00319 return kStWarn;
00320 }
00321
00322 EachController(MakeCreateDst(*event));
00323 if (doMc) MakeCreateMcDst();
00324
00325 CheckFile();
00326 tree->Fill();
00327
00328 return kStOK;
00329 }
00330
00331 Int_t StStrangeMuDstMaker::MakeCreateMcDst() {
00332
00333 gMessMgr->Info("StStrangeMuDstMaker::MakeCreateMcDst(): running...");
00334
00335 StMcEvent* mcEvent = (StMcEvent*) GetDataSet("StMcEvent");
00336 if (!mcEvent) {
00337 gMessMgr->Error() << "StStrangeMuDstMaker: no StMcEvent! \n"
00338 << " mc branch and assoc branch will not be filled. " << endm;
00339 return 0;
00340 }
00341 new((*evMcArray)[0]) StStrangeEvMuDst(*mcEvent);
00342 if (!GetMaker("StAssociationMaker")) {
00343 gMessMgr->Warning() << "StStrangeMuDstMaker: no associated info! \n"
00344 << " assoc branch will not be filled. " << endm;
00345 }
00346
00347
00348 StSPtrVecMcVertex& mcVertices = mcEvent->vertices();
00349 for (StMcVertexIterator mcVertexIt = mcVertices.begin();
00350 mcVertexIt != mcVertices.end(); mcVertexIt++) {
00351 const StMcTrack* parent = (*mcVertexIt)->parent();
00352 if (parent) switch (parent->geantId()) {
00353
00354
00355 case (23) :
00356 case (31) :
00357 case (24) :
00358 case (32) :
00359 if (doT[xiT]) cont[xiT]->MakeCreateMcDst(*mcVertexIt);
00360 break;
00361
00362
00363 case (10) :
00364 case (16) :
00365 case (18) :
00366 case (26) :
00367
00368 if (doT[v0T] && !(doT[xiT])) cont[v0T]->MakeCreateMcDst(*mcVertexIt);
00369 break;
00370
00371
00372 case ( 5) :
00373 case ( 6) :
00374 case ( 8) :
00375 case ( 9) :
00376 case (11) :
00377 case (12) :
00378
00379 if (doT[kinkT]) cont[kinkT]->MakeCreateMcDst(*mcVertexIt);
00380 break;
00381
00382 default : {}
00383 }
00384 }
00385
00386
00387
00388 if (doT[xiT] && doT[v0T]) {
00389 for (StMcVertexIterator mcVertexIt = mcVertices.begin();
00390 mcVertexIt != mcVertices.end(); mcVertexIt++) {
00391 Bool_t notFromXi = kTRUE;
00392 const StMcTrack* parent = (*mcVertexIt)->parent();
00393 if (parent) switch (parent->geantId()) {
00394 case (18) :
00395 case (26) :
00396 {
00397 const StMcTrack* parent2 = parent->parent();
00398 if (parent2) switch (parent2->geantId()) {
00399 case (23) :
00400 case (31) :
00401 case (24) :
00402 case (32) :
00403 notFromXi = kFALSE;
00404 default : {}
00405 }
00406 }
00407 case (10) :
00408 case (16) :
00409 if (notFromXi) cont[v0T]->MakeCreateMcDst(*mcVertexIt);
00410 default : {}
00411 }
00412 }
00413 }
00414 EachController(PrintNumMc());
00415
00416 return kStOK;
00417 }
00418
00419 Int_t StStrangeMuDstMaker::MakeCreateSubDst() {
00420
00421 if (abortEvent) return kStOK;
00422
00423 EachController(MakeCreateSubDst());
00424 CheckFile();
00425 cuts->Reset(dstMaker->Cuts());
00426 cuts->UpdateArray(cutsArray);
00427 tree->Fill();
00428
00429 return kStOK;
00430 }
00431
00432 void StStrangeMuDstMaker::Clear(Option_t *option) {
00433
00434 if (Debug()) gMessMgr->Debug() << "In StStrangeMuDstMaker::Clear() ... "
00435 << GetName() << endm;
00436
00437 for (Int_t i=0; i<subMakers.GetEntries(); i++) {
00438 StStrangeMuDstMaker* subMaker = (StStrangeMuDstMaker*) (subMakers[i]);
00439 subMaker->ClearForReal(option);
00440 }
00441 if (!dstMaker) {
00442 ClearForReal(option);
00443 }
00444 }
00445
00446 void StStrangeMuDstMaker::ClearForReal(Option_t *option) {
00447
00448 if (Debug()) gMessMgr->Debug() <<
00449 "In StStrangeMuDstMaker::ClearForReal() ... " << GetName() << endm;
00450
00451 if (tree) {
00452 if (dstMaker) {
00453 MakeCreateSubDst();
00454 } else {
00455 if (evClonesArray) THack::ClearClonesArray(evClonesArray);
00456 if (evMcArray) THack::ClearClonesArray(evMcArray);
00457 }
00458 THack::ClearClonesArray(cutsArray);
00459
00460 EachController(Clear());
00461 if (GetMode() == StrangeNoKeep) tree->Reset();
00462 }
00463
00464 abortEvent = kFALSE;
00465 StMaker::Clear(option);
00466 }
00467
00468 Int_t StStrangeMuDstMaker::Finish() {
00469
00470 if (Debug()) gMessMgr->Debug() << "In StStrangeMuDstMaker::Finish() ... "
00471 << GetName() << endm;
00472 if (GetMode() == StrangeWrite) CloseFile();
00473
00474 EachController(Finish());
00475
00476 return kStOK;
00477 }
00478
00479 void StStrangeMuDstMaker::SetWrite(const char* eFile) {
00480 SetMode(StrangeWrite);
00481 SetFile(eFile);
00482 }
00483
00484 void StStrangeMuDstMaker::SetRead(const char* eFile, const char* treeName) {
00485 SetMode(StrangeRead);
00486 if (!eFile) eFile = defFileName;
00487
00488
00489 if (!muDst) {
00490 if (!treeName) treeName = altName;
00491 else fileBlind = kTRUE;
00492
00493 if (!tree) tree = (TTree*) (chain = new TChain(treeName,defTitle));
00494 else SetTreeName(treeName);
00495 }
00496
00497
00498 Int_t nEntries = (Int_t) chain->GetEntriesFast();
00499 if (fileBlind) chain->Add(eFile);
00500 else chain->Add(eFile,0);
00501
00502 cuts->ForceUpdateArray();
00503
00504
00505 if (muDst) return;
00506
00507
00508
00509 if (fileBlind) { muDst = chain->GetFile(); return; }
00510
00511
00512
00513 Int_t nEnt = (Int_t) chain->GetEntries();
00514 if (nEnt == TChain::kBigNumber) {
00515 gMessMgr->Error("StStrangeMuDstMaker::SetRead(): bad file! Giving up.");
00516 return;
00517 }
00518
00519 Int_t trial=0;
00520 while (nEnt==nEntries) {
00521 if (trNames[trial]==0) { SetTreeName(treeName); return; }
00522
00523 if (strcmp(treeName,trNames[trial])) {
00524 SetTreeName(trNames[trial]);
00525 chain->Add(eFile,0);
00526 nEnt = (Int_t) chain->GetEntries();
00527 }
00528 trial++;
00529 }
00530
00531 muDst = chain->GetFile();
00532 }
00533
00534 void StStrangeMuDstMaker::SetRead(StFile* eFiles, const char* treeName) {
00535 SetMode(StrangeRead);
00536 while (!(eFiles->GetNextBundle()))
00537 SetRead(eFiles->GetFileName(0),treeName);
00538 }
00539
00540 void StStrangeMuDstMaker::SetNoKeep() {
00541 SetMode(StrangeNoKeep);
00542 }
00543
00544 void StStrangeMuDstMaker::SetFile(const char* eFile) {
00545 if (eFile) strcpy(file,eFile);
00546 }
00547
00548 void StStrangeMuDstMaker::SetTreeName(const char* treeName) {
00549 if ((treeName) && (strcmp(treeName,tree->GetName()))) {
00550 tree->SetName(treeName);
00551 TObjArray* chainElems = chain->GetListOfFiles();
00552 for (Int_t i=0; i<chainElems->GetEntriesFast(); i++)
00553 ((TNamed*) (chainElems->At(i)))->SetName(treeName);
00554 }
00555 }
00556
00557 Int_t StStrangeMuDstMaker::OpenFile() {
00558 if( ! (muDst = new TFile(file,"RECREATE")) ) {
00559 gMessMgr->Error() << "StStrangeMuDstMaker: Error opening event file:\n "
00560 << file << endm;
00561 return kStErr;
00562 }
00563
00564 gMessMgr->Info() << "StStrangeMuDstMaker: Opened file for writing:\n"
00565 << file << endm;
00566 cuts->ForceUpdateArray();
00567 return kStOk;
00568 }
00569
00570 Int_t StStrangeMuDstMaker::CloseFile() {
00571 if (muDst) {
00572 muDst->Write();
00573 muDst->cd();
00574 muDst->Close();
00575 tree = 0;
00576 }
00577 return kStOk;
00578 }
00579
00580 void StStrangeMuDstMaker::CheckFile() {
00581 if (muDst) {
00582 if (muDst->GetBytesWritten() > MAXFILESIZE) {
00583 gMessMgr->Warning() << "StStrangeMuDstMaker: File size limit "
00584 << MAXFILESIZE << " exceeded!\n"
00585 << " Closing file " << file << endm;
00586 CloseFile();
00587 char buf_[10];
00588 sprintf(buf_,"_%d",(++outFileNum));
00589 TString fixer = file;
00590 if (outFileNum>2) {
00591 TString suffix = strrchr(file,'.');
00592 size_t last_ = fixer.Last('_');
00593 size_t len_ = fixer.Length() - last_;
00594 fixer.Remove(last_,len_).Append(buf_).Append(suffix);
00595 } else {
00596 size_t lastdot = fixer.Last('.');
00597 fixer.Insert(lastdot,buf_);
00598 }
00599 strcpy(file,fixer.Data());
00600 OpenFile();
00601 InitCreateDst();
00602 if (dstMaker) InitCreateSubDst();
00603 }
00604 }
00605 }
00606
00607 void StStrangeMuDstMaker::SelectEvent() {
00608 EachController(Select(-1));
00609 }
00610
00611 void StStrangeMuDstMaker::UnselectEvent() {
00612 EachController(Unselect(-1));
00613 }
00614
00615 void StStrangeMuDstMaker::SubDst(StStrangeMuDstMaker* maker) {
00616 dstMaker = maker;
00617 if (!(maker->subMakers.FindObject((TObject*) this)))
00618 maker->subMakers.Add(this);
00619 }
00620
00621 void StStrangeMuDstMaker::SetCorrectionFile(char* fname) {
00622 StStrangeEvMuDst::SetCorrectionFile(fname);
00623 }
00624
00625 void StStrangeMuDstMaker::SetFractionFile(char* fname) {
00626 StStrangeEvMuDst::SetFractionFile(fname);
00627 }
00628
00629 char* StStrangeMuDstMaker::GetFile() {
00630 if (chain) {
00631 TFile* fptr = chain->GetFile();
00632 if (fptr) return const_cast<char*> (fptr->GetName());
00633 }
00634 return file;
00635 }
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777