00001 #include "StChain.h"
00002 #include "StIOMaker/StIOMaker.h"
00003 #include "StEventMaker/StEventMaker.h"
00004 #include "StStrangeMuDstMaker/StStrangeMuDstMaker.h"
00005 #include "StStrangeMuDstMaker/StV0MuDst.hh"
00006 #include "StStrangeMuDstMaker/StXiMuDst.hh"
00007 #include "StStrangeMuDstMaker/StKinkMuDst.hh"
00008 #include "StStrangeMuDstMaker/StStrangeCuts.hh"
00009 #include "StStrangeMuDstMaker/StStrangeEvMuDst.hh"
00010 #include "StStrangeMuDstPlayer.h"
00011 #include "StMessMgr.h"
00012 #include "StMcEventMaker/StMcEventMaker.h"
00013 #include "StAssociationMaker/StAssociationMaker.h"
00014 #include "StHbtMaker/StRandyTopMapMaker.h"
00015
00016 ClassImp(StrangeMuDstPlayer)
00017
00018 char empty = '\0';
00019 char slash = '/';
00020 void ParseFileName(Char_t *output, Char_t **file, Char_t **dir) {
00021 if ((*file = strrchr(output,slash))) {
00022 (*file)++;
00023 *dir = new char[strlen(output)+5];
00024 strncpy(*dir,output,(strlen(output)-strlen(*file)));
00025 } else {
00026 *file = output;
00027 *dir = ∅
00028 }
00029 }
00030
00031 StrangeMuDstPlayer::StrangeMuDstPlayer() {
00032 doFileSplit = kTRUE;
00033 doMC = kFALSE;
00034 doT0Abort = kTRUE;
00035 doTopMapFix = kFALSE;
00036 doReadDST = kFALSE;
00037 doV0 = kTRUE;
00038 doXi = kTRUE;
00039 doKink = kTRUE;
00040
00041 evPrimTracks = 0;
00042 evPrimVertexZ = 100.;
00043 v0DecayLength = 2.0;
00044 v0DcaDaughtersToPrimVertex = 0.7;
00045 v0DcaToPrimVertex = 0.8;
00046 v0DcaDaughters = 0.75;
00047 v0NumTpcHits = 15;
00048 xiDecayLength = 0.;
00049 xiDcaDaughters = 0.7;
00050 xiDcaV0Daughters = 0.7;
00051 xiDcaToPrimVertex = 0.7;
00052 xiDcaV0ToPrimVertex = 0.;
00053 xiDcaBachelorToPrimVertex = 0.;
00054 }
00055
00056 void StrangeMuDstPlayer::Make(Int_t NEvents, StFile* input, Char_t* output) {
00057
00058 StStrangeMuDstMaker *muDstMakers[3];
00059 StStrangeMuDstMaker *v0MuDstMaker, *xiMuDstMaker, *kinkMuDstMaker;
00060 StIOMaker *IOMaker;
00061 StEventMaker *eventMaker;
00062 StMcEventMaker *mcEventReader;
00063 StAssociationMaker *associator;
00064 StRandyTopMapMaker *topoMapFixer;
00065 Char_t *file, *dir, *outfile[3], line[80];
00066 TString prefix[3];
00067 Int_t mNDstMakers = 0;
00068
00069
00070 StChain chain("myChain");
00071
00072
00073 IOMaker = new StIOMaker("IO","r",input,"bfcTree");
00074
00075 IOMaker->SetBranch("*",0,"0");
00076 IOMaker->SetBranch("runcoBranch",0,"r");
00077 if( doReadDST ) {
00078 IOMaker->SetBranch("dstBranch",0,"r");
00079 eventMaker = new StEventMaker("events","title");
00080 } else
00081 IOMaker->SetBranch("eventBranch",0,"r");
00082
00083 if( doMC ) {
00084 IOMaker->SetBranch("geantBranch",0,"r");
00085 mcEventReader = new StMcEventMaker;
00086 associator = new StAssociationMaker;
00087 }
00088
00089 if( doTopMapFix )
00090 topoMapFixer = new StRandyTopMapMaker();
00091
00092 if( doFileSplit ) {
00093 if( doV0 ) {
00094 v0MuDstMaker = new StStrangeMuDstMaker("v0MuDstMaker");
00095 v0MuDstMaker->DoV0();
00096 muDstMakers[mNDstMakers] = v0MuDstMaker;
00097 prefix[mNDstMakers] = "v0_";
00098 mNDstMakers++;
00099 }
00100 if( doXi ) {
00101 xiMuDstMaker = new StStrangeMuDstMaker("xiMuDstMaker");
00102 xiMuDstMaker->DoXi();
00103 muDstMakers[mNDstMakers] = xiMuDstMaker;
00104 prefix[mNDstMakers] = "xi_";
00105 mNDstMakers++;
00106 }
00107 if( doKink ) {
00108 kinkMuDstMaker = new StStrangeMuDstMaker("kinkMuDstMaker");
00109 kinkMuDstMaker->DoKink();
00110 muDstMakers[mNDstMakers] = kinkMuDstMaker;
00111 prefix[mNDstMakers] = "kink_";
00112 mNDstMakers++;
00113 }
00114 ParseFileName(output, &file, &dir);
00115 for(Int_t i=0; i<mNDstMakers; i++) {
00116
00117 outfile[i] = new char[strlen(output)+5];
00118 strcpy(outfile[i],dir);
00119 strcat(outfile[i],prefix[i].Data());
00120 strcat(outfile[i],file);
00121 muDstMakers[i]->SetWrite(outfile[i]);
00122 if( doT0Abort )
00123 muDstMakers[i]->DoT0JitterAbort();
00124 if( doMC )
00125 muDstMakers[i]->DoMc();
00126 }
00127 } else {
00128 mNDstMakers = 1;
00129 muDstMakers[0] = new StStrangeMuDstMaker("muDstMaker");
00130 if( doV0 ) muDstMakers[0]->DoV0();
00131 if( doXi ) muDstMakers[0]->DoXi();
00132 if( doKink ) muDstMakers[0]->DoKink();
00133 muDstMakers[0]->SetWrite(output);
00134 if( doT0Abort )
00135 muDstMakers[0]->DoT0JitterAbort();
00136 if( doMC )
00137 muDstMakers[0]->DoMc();
00138 }
00139
00140
00141 Int_t istatus = chain.Init();
00142 if( istatus ) { chain.FatalErr(istatus,"on init"); return; }
00143
00144
00145 for( Int_t i=0; i<NEvents; i++ ) {
00146 switch (istatus = chain.Make()) {
00147 case 0: break;
00148 case 2: { gMessMgr->Info("Last event from input."); break; }
00149 case 3: { gMessMgr->Error() << "Event " << i << " had error " <<
00150 istatus << ". Continuing."; gMessMgr->Print(); break; }
00151 default: { gMessMgr->Warning() << "Event " << i << " returned status " <<
00152 istatus << ". Continuing."; gMessMgr->Print(); }
00153 }
00154
00155 if( istatus == 2 ) break;
00156
00157 if( i != NEvents) chain.Clear();
00158 sprintf(line,"*** Finished processing event %d",i);
00159 gMessMgr->Info(line);
00160 }
00161
00162
00163 if( NEvents >= 1 ) {
00164 chain.Finish();
00165 }
00166 }
00167
00168 void StrangeMuDstPlayer::Filter(Int_t NEvents, StFile* input, Char_t* output) {
00169
00170 StStrangeMuDstMaker *oldMuDstMaker=0;
00171 StStrangeMuDstMaker *newMuDstMakers[3];
00172 StStrangeMuDstMaker *v0MuDstMaker=0;
00173 StStrangeMuDstMaker *xiMuDstMaker=0;
00174 StStrangeMuDstMaker *kinkMuDstMaker=0;
00175 Char_t *file, *dir, *outfile[3], line[80];
00176 TString prefix[3];
00177 Int_t mNDstMakers = 0;
00178
00179
00180 StChain chain("myChain");
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 if( doFileSplit ) {
00191 if( doV0 ) {
00192 v0MuDstMaker = new StStrangeMuDstMaker("v0MuDstMaker");
00193 v0MuDstMaker->DoV0();
00194 newMuDstMakers[mNDstMakers] = v0MuDstMaker;
00195 prefix[mNDstMakers] = "v0_";
00196 mNDstMakers++;
00197 }
00198 if( doXi ) {
00199 xiMuDstMaker = new StStrangeMuDstMaker("xiMuDstMaker");
00200 xiMuDstMaker->DoXi();
00201 newMuDstMakers[mNDstMakers] = xiMuDstMaker;
00202 prefix[mNDstMakers] = "xi_";
00203 mNDstMakers++;
00204 }
00205 if( doKink ) {
00206 kinkMuDstMaker = new StStrangeMuDstMaker("kinkMuDstMaker");
00207 kinkMuDstMaker->DoKink();
00208 newMuDstMakers[mNDstMakers] = kinkMuDstMaker;
00209 prefix[mNDstMakers] = "kink_";
00210 mNDstMakers++;
00211 }
00212 ParseFileName(output, &file, &dir);
00213 for(Int_t i=0; i<mNDstMakers; i++) {
00214
00215 outfile[i] = new char[strlen(output)+5];
00216 strcpy(outfile[i],dir);
00217 strcat(outfile[i],prefix[i].Data());
00218 strcat(outfile[i],file);
00219 newMuDstMakers[i]->SetWrite(outfile[i]);
00220 if( doT0Abort )
00221 newMuDstMakers[i]->DoT0JitterAbort();
00222 if( doMC )
00223 newMuDstMakers[i]->DoMc();
00224 }
00225 } else {
00226 mNDstMakers = 1;
00227 newMuDstMakers[0] = new StStrangeMuDstMaker("newMuDstMaker");
00228 if( doV0 ) newMuDstMakers[0]->DoV0();
00229 if( doXi ) newMuDstMakers[0]->DoXi();
00230 if( doKink ) newMuDstMakers[0]->DoKink();
00231 newMuDstMakers[0]->SetWrite(output);
00232 if( doT0Abort )
00233 newMuDstMakers[0]->DoT0JitterAbort();
00234 if( doMC )
00235 newMuDstMakers[0]->DoMc();
00236
00237 v0MuDstMaker = newMuDstMakers[0];
00238 xiMuDstMaker = newMuDstMakers[0];
00239 kinkMuDstMaker = newMuDstMakers[0];
00240 }
00241
00242 oldMuDstMaker = new StStrangeMuDstMaker("oldMuDstMaker");
00243 oldMuDstMaker->SetRead(input);
00244
00245 {for( Int_t i=0; i<mNDstMakers; i++ )
00246 newMuDstMakers[i]->SubDst(oldMuDstMaker);}
00247
00248
00249 char buff[80];
00250
00251 {for( Int_t i=0; i<mNDstMakers; i++ ) {
00252 sprintf(buff,"< +/- %f",evPrimVertexZ);
00253 newMuDstMakers[i]->Cuts().Add("evPrimVertexZ",buff);
00254 sprintf(buff,"> %d",evPrimTracks);
00255 newMuDstMakers[i]->Cuts().Add("evPrimTracks",buff);
00256 }}
00257
00258 if( doV0 ) {
00259 sprintf(buff,"> %f",v0DecayLength);
00260 v0MuDstMaker->Cuts().Add("v0DecayLength",buff);
00261 sprintf(buff,"> %f",v0DcaDaughtersToPrimVertex);
00262 v0MuDstMaker->Cuts().Add("dcaPosToPrimVertex || dcaNegToPrimVertex",buff);
00263 sprintf(buff,"< %f",v0DcaToPrimVertex);
00264 v0MuDstMaker->Cuts().Add("v0DcaToPrimVertex",buff);
00265 sprintf(buff,"< %f",v0DcaDaughters);
00266 v0MuDstMaker->Cuts().Add("v0DcaDaughters",buff);
00267 sprintf(buff,"> %f",v0NumTpcHits);
00268 v0MuDstMaker->Cuts().Add("v0NumTpcHits",buff);
00269 }
00270 if( doXi ) {
00271 sprintf(buff,"> %f",xiDecayLength);
00272 xiMuDstMaker->Cuts().Add("xiDecayLength",buff);
00273 sprintf(buff,"< %f",xiDcaDaughters);
00274 xiMuDstMaker->Cuts().Add("xiDcaDaughters",buff);
00275 sprintf(buff,"< %f",xiDcaV0Daughters);
00276 xiMuDstMaker->Cuts().Add("xiDcaV0Daughters",buff);
00277 sprintf(buff,"< %f",xiDcaToPrimVertex);
00278 xiMuDstMaker->Cuts().Add("xiDcaToPrimVertex",buff);
00279 sprintf(buff,"> %f",xiDcaV0ToPrimVertex);
00280 xiMuDstMaker->Cuts().Add("xiDcaV0ToPrimVertex",buff);
00281 sprintf(buff,"> %f",xiDcaBachelorToPrimVertex);
00282 xiMuDstMaker->Cuts().Add("xiDcaBachelorToPrimVertex",buff);
00283 }
00284
00285 gMessMgr->Info() << "evPrimVertexZ < " << evPrimVertexZ << endm;
00286 gMessMgr->Info() << "evPrimTracks > " << evPrimTracks << endm;
00287 gMessMgr->Info() << "v0DecayLength > " << v0DecayLength << endm;
00288 gMessMgr->Info() << "v0DcaToPrimVertex < " << v0DcaToPrimVertex << endm;
00289 gMessMgr->Info() << "v0DcaDaughtersToPrimVertex > " <<
00290 v0DcaDaughtersToPrimVertex << endm;
00291 gMessMgr->Info() << "v0DcaDaughters < " << v0DcaDaughters << endm;
00292 gMessMgr->Info() << "v0NumTpcHits > " << v0NumTpcHits << endm;
00293 gMessMgr->Info() << "xiDecayLength > " << xiDecayLength << endm;
00294 gMessMgr->Info() << "xiDcaDaughters < " << xiDcaDaughters << endm;
00295 gMessMgr->Info() << "xiDcaV0Daughters < " << xiDcaV0Daughters << endm;
00296 gMessMgr->Info() << "xiDcaToPrimVertex < " << xiDcaToPrimVertex << endm;
00297 gMessMgr->Info() << "xiDcaV0ToPrimVertex > " << xiDcaV0ToPrimVertex << endm;
00298 gMessMgr->Info() << "xiDcaBachelorToPrimVertex > " <<
00299 xiDcaBachelorToPrimVertex << endm;
00300
00301
00302 Int_t istatus = chain.Init();
00303 if( istatus ) { chain.FatalErr(istatus,"on init"); return; }
00304
00305
00306 for( Int_t i=0; i<NEvents; i++ ) {
00307 switch (istatus = chain.Make(i)) {
00308 case 0: break;
00309 case 2: { gMessMgr->Info("Last event from input."); break; }
00310 case 3: { gMessMgr->Error() << "Event " << i << " had error " <<
00311 istatus << ". Ending."; gMessMgr->Print(); break; }
00312 default: { gMessMgr->Warning() << "Event " << i << " returned status " <<
00313 istatus << ". Ending."; gMessMgr->Print(); }
00314 }
00315
00316 if( istatus ) break;
00317
00318 Float_t primZ = oldMuDstMaker->GetEvent()->primaryVertexZ();
00319 unsigned int primaryTracks = oldMuDstMaker->GetEvent()->primaryTracks();
00320
00321 if (TMath::Abs(primZ)<evPrimVertexZ && primaryTracks>evPrimTracks) {
00322 if( doV0 )
00323
00324 for( Int_t j=0; j<oldMuDstMaker->GetNV0(); j++ ) {
00325 StV0MuDst *v0j = oldMuDstMaker->GetV0(j);
00326 if( v0j->decayLengthV0() > v0DecayLength &&
00327 v0j->dcaV0ToPrimVertex() < v0DcaToPrimVertex &&
00328 ((v0j->dcaPosToPrimVertex() > v0DcaDaughtersToPrimVertex) ||
00329 (v0j->dcaNegToPrimVertex() > v0DcaDaughtersToPrimVertex)) &&
00330 v0j->dcaV0Daughters() < v0DcaDaughters &&
00331 v0j->topologyMapPos().numberOfHits(kTpcId) > v0NumTpcHits &&
00332 v0j->topologyMapNeg().numberOfHits(kTpcId) > v0NumTpcHits )
00333 v0MuDstMaker->SelectV0(j);
00334 }
00335 if( doXi )
00336
00337 for( Int_t j=0; j<oldMuDstMaker->GetNXi(); j++ ) {
00338 StXiMuDst *xij = oldMuDstMaker->GetXi(j);
00339 if( xij->decayLengthXi() > xiDecayLength &&
00340 xij->dcaXiDaughters() < xiDcaDaughters &&
00341 xij->dcaV0Daughters() < xiDcaV0Daughters &&
00342 xij->dcaXiToPrimVertex() < xiDcaToPrimVertex &&
00343 xij->dcaV0ToPrimVertex() > xiDcaV0ToPrimVertex &&
00344 xij->dcaBachelorToPrimVertex() > xiDcaBachelorToPrimVertex )
00345 xiMuDstMaker->SelectXi(j);
00346 }
00347 if( doKink )
00348
00349 for( Int_t j=0; j<oldMuDstMaker->GetNKink(); j++ ) {
00350 kinkMuDstMaker->SelectKink(j);
00351 }
00352 } else {
00353 {for( Int_t j=0; j<mNDstMakers; j++ )
00354 newMuDstMakers[j]->AbortEvent();}
00355 }
00356
00357 if( i != NEvents) chain.Clear();
00358 sprintf(line,"*** Finished processing event %d",i);
00359 gMessMgr->Info(line);
00360 }
00361
00362
00363 if( NEvents >= 1 ) {
00364 chain.Finish();
00365 }
00366 }
00367
00368 void StrangeMuDstPlayer::Play(Int_t NEvents, StFile* input, Char_t* output) {
00369
00370 StStrangeMuDstMaker *oldMuDstMaker=0;
00371 StStrangeMuDstMaker *newMuDstMakers[3];
00372 StStrangeMuDstMaker *v0MuDstMaker=0;
00373 StStrangeMuDstMaker *xiMuDstMaker=0;
00374 StStrangeMuDstMaker *kinkMuDstMaker=0;
00375 StIOMaker *IOMaker;
00376 StEventMaker *eventMaker;
00377 StMcEventMaker *mcEventReader;
00378 StAssociationMaker *associator;
00379 StRandyTopMapMaker *topoMapFixer;
00380 Char_t *file, *dir, *outfile[3], line[80];
00381 TString prefix[3];
00382 Int_t mNDstMakers = 0;
00383
00384
00385 StChain chain("myChain");
00386
00387
00388 IOMaker = new StIOMaker("IO","r",input,"bfcTree");
00389
00390 IOMaker->SetBranch("*",0,"0");
00391 IOMaker->SetBranch("runcoBranch",0,"r");
00392 if( doReadDST ) {
00393 IOMaker->SetBranch("dstBranch",0,"r");
00394 eventMaker = new StEventMaker("events","title");
00395 } else
00396 IOMaker->SetBranch("eventBranch",0,"r");
00397
00398 if( doMC ) {
00399 IOMaker->SetBranch("geantBranch",0,"r");
00400 mcEventReader = new StMcEventMaker;
00401 associator = new StAssociationMaker;
00402 }
00403
00404 if( doTopMapFix )
00405 topoMapFixer = new StRandyTopMapMaker();
00406
00407
00408
00409
00410
00411
00412
00413 if( doFileSplit ) {
00414 if( doV0 ) {
00415 v0MuDstMaker = new StStrangeMuDstMaker("v0MuDstMaker");
00416 v0MuDstMaker->DoV0();
00417 newMuDstMakers[mNDstMakers] = v0MuDstMaker;
00418 prefix[mNDstMakers] = "v0_";
00419 mNDstMakers++;
00420 }
00421 if( doXi ) {
00422 xiMuDstMaker = new StStrangeMuDstMaker("xiMuDstMaker");
00423 xiMuDstMaker->DoXi();
00424 newMuDstMakers[mNDstMakers] = xiMuDstMaker;
00425 prefix[mNDstMakers] = "xi_";
00426 mNDstMakers++;
00427 }
00428 if( doKink ) {
00429 kinkMuDstMaker = new StStrangeMuDstMaker("kinkMuDstMaker");
00430 kinkMuDstMaker->DoKink();
00431 newMuDstMakers[mNDstMakers] = kinkMuDstMaker;
00432 prefix[mNDstMakers] = "kink_";
00433 mNDstMakers++;
00434 }
00435 ParseFileName(output, &file, &dir);
00436 for(Int_t i=0; i<mNDstMakers; i++) {
00437
00438 outfile[i] = new char[strlen(output)+5];
00439 strcpy(outfile[i],dir);
00440 strcat(outfile[i],prefix[i].Data());
00441 strcat(outfile[i],file);
00442 newMuDstMakers[i]->SetWrite(outfile[i]);
00443 if( doT0Abort )
00444 newMuDstMakers[i]->DoT0JitterAbort();
00445 if( doMC )
00446 newMuDstMakers[i]->DoMc();
00447 }
00448 } else {
00449 mNDstMakers = 1;
00450 newMuDstMakers[0] = new StStrangeMuDstMaker("newMuDstMaker");
00451 if( doV0 ) newMuDstMakers[0]->DoV0();
00452 if( doXi ) newMuDstMakers[0]->DoXi();
00453 if( doKink ) newMuDstMakers[0]->DoKink();
00454 newMuDstMakers[0]->SetWrite(output);
00455 if( doT0Abort )
00456 newMuDstMakers[0]->DoT0JitterAbort();
00457 if( doMC )
00458 newMuDstMakers[0]->DoMc();
00459
00460 v0MuDstMaker = newMuDstMakers[0];
00461 xiMuDstMaker = newMuDstMakers[0];
00462 kinkMuDstMaker = newMuDstMakers[0];
00463 }
00464
00465 oldMuDstMaker = new StStrangeMuDstMaker("oldMuDstMaker");
00466 oldMuDstMaker->SetNoKeep();
00467 if( doT0Abort )
00468 oldMuDstMaker->DoT0JitterAbort();
00469
00470 {for( Int_t i=0; i<mNDstMakers; i++ )
00471 newMuDstMakers[i]->SubDst(oldMuDstMaker);}
00472
00473
00474 char buff[80];
00475
00476 {for( Int_t i=0; i<mNDstMakers; i++ ) {
00477 sprintf(buff,"< +/- %f",evPrimVertexZ);
00478 newMuDstMakers[i]->Cuts().Add("evPrimVertexZ",buff);
00479 sprintf(buff,"> %d",evPrimTracks);
00480 newMuDstMakers[i]->Cuts().Add("evPrimTracks",buff);
00481 }}
00482
00483 if( doV0 ) {
00484 sprintf(buff,"> %f",v0DecayLength);
00485 v0MuDstMaker->Cuts().Add("v0DecayLength",buff);
00486 sprintf(buff,"> %f",v0DcaDaughtersToPrimVertex);
00487 v0MuDstMaker->Cuts().Add("dcaPosToPrimVertex || dcaNegToPrimVertex",buff);
00488 sprintf(buff,"< %f",v0DcaToPrimVertex);
00489 v0MuDstMaker->Cuts().Add("v0DcaToPrimVertex",buff);
00490 sprintf(buff,"< %f",v0DcaDaughters);
00491 v0MuDstMaker->Cuts().Add("v0DcaDaughters",buff);
00492 sprintf(buff,"> %f",v0NumTpcHits);
00493 v0MuDstMaker->Cuts().Add("v0NumTpcHits",buff);
00494 }
00495 if( doXi ) {
00496 sprintf(buff,"> %f",xiDecayLength);
00497 xiMuDstMaker->Cuts().Add("xiDecayLength",buff);
00498 sprintf(buff,"< %f",xiDcaDaughters);
00499 xiMuDstMaker->Cuts().Add("xiDcaDaughters",buff);
00500 sprintf(buff,"< %f",xiDcaV0Daughters);
00501 xiMuDstMaker->Cuts().Add("xiDcaV0Daughters",buff);
00502 sprintf(buff,"< %f",xiDcaToPrimVertex);
00503 xiMuDstMaker->Cuts().Add("xiDcaToPrimVertex",buff);
00504 sprintf(buff,"> %f",xiDcaV0ToPrimVertex);
00505 xiMuDstMaker->Cuts().Add("xiDcaV0ToPrimVertex",buff);
00506 sprintf(buff,"> %f",xiDcaBachelorToPrimVertex);
00507 xiMuDstMaker->Cuts().Add("xiDcaBachelorToPrimVertex",buff);
00508 }
00509
00510 gMessMgr->Info() << "evPrimVertexZ < " << evPrimVertexZ << endm;
00511 gMessMgr->Info() << "evPrimTracks > " << evPrimTracks << endm;
00512 gMessMgr->Info() << "v0DecayLength > " << v0DecayLength << endm;
00513 gMessMgr->Info() << "v0DcaToPrimVertex < " << v0DcaToPrimVertex << endm;
00514 gMessMgr->Info() << "v0DcaDaughtersToPrimVertex > " <<
00515 v0DcaDaughtersToPrimVertex << endm;
00516 gMessMgr->Info() << "v0DcaDaughters < " << v0DcaDaughters << endm;
00517 gMessMgr->Info() << "v0NumTpcHits > " << v0NumTpcHits << endm;
00518 gMessMgr->Info() << "xiDecayLength > " << xiDecayLength << endm;
00519 gMessMgr->Info() << "xiDcaDaughters < " << xiDcaDaughters << endm;
00520 gMessMgr->Info() << "xiDcaV0Daughters < " << xiDcaV0Daughters << endm;
00521 gMessMgr->Info() << "xiDcaToPrimVertex < " << xiDcaToPrimVertex << endm;
00522 gMessMgr->Info() << "xiDcaV0ToPrimVertex > " << xiDcaV0ToPrimVertex << endm;
00523 gMessMgr->Info() << "xiDcaBachelorToPrimVertex > " <<
00524 xiDcaBachelorToPrimVertex << endm;
00525
00526
00527 Int_t istatus = chain.Init();
00528 if( istatus ) { chain.FatalErr(istatus,"on init"); return; }
00529
00530
00531 for( Int_t i=0; i<NEvents; i++ ) {
00532 switch (istatus = chain.Make()) {
00533 case 0: break;
00534 case 2: { gMessMgr->Info("Last event from input."); break; }
00535 case 3: { gMessMgr->Error() << "Event " << i << " had error " <<
00536 istatus << ". Continuing."; gMessMgr->Print(); break; }
00537 default: { gMessMgr->Warning() << "Event " << i << " returned status " <<
00538 istatus << ". Continuing."; gMessMgr->Print(); }
00539 }
00540
00541 if( istatus == 2 ) break;
00542
00543 Float_t primZ = oldMuDstMaker->GetEvent()->primaryVertexZ();
00544 unsigned int primaryTracks = oldMuDstMaker->GetEvent()->primaryTracks();
00545
00546 if (TMath::Abs(primZ)<evPrimVertexZ && primaryTracks>evPrimTracks) {
00547 if( doV0 )
00548
00549 for( Int_t j=0; j<oldMuDstMaker->GetNV0(); j++ ) {
00550 StV0MuDst *v0j = oldMuDstMaker->GetV0(j);
00551 if( v0j->decayLengthV0() > v0DecayLength &&
00552 v0j->dcaV0ToPrimVertex() < v0DcaToPrimVertex &&
00553 ((v0j->dcaPosToPrimVertex() > v0DcaDaughtersToPrimVertex) ||
00554 (v0j->dcaNegToPrimVertex() > v0DcaDaughtersToPrimVertex)) &&
00555 v0j->dcaV0Daughters() < v0DcaDaughters &&
00556 v0j->topologyMapPos().numberOfHits(kTpcId) > v0NumTpcHits &&
00557 v0j->topologyMapNeg().numberOfHits(kTpcId) > v0NumTpcHits )
00558 v0MuDstMaker->SelectV0(j);
00559 }
00560 if( doXi )
00561
00562 for( Int_t j=0; j<oldMuDstMaker->GetNXi(); j++ ) {
00563 StXiMuDst *xij = oldMuDstMaker->GetXi(j);
00564 if( xij->decayLengthXi() > xiDecayLength &&
00565 xij->dcaXiDaughters() < xiDcaDaughters &&
00566 xij->dcaV0Daughters() < xiDcaV0Daughters &&
00567 xij->dcaXiToPrimVertex() < xiDcaToPrimVertex &&
00568 xij->dcaV0ToPrimVertex() > xiDcaV0ToPrimVertex &&
00569 xij->dcaBachelorToPrimVertex() > xiDcaBachelorToPrimVertex )
00570 xiMuDstMaker->SelectXi(j);
00571 }
00572 if( doKink )
00573
00574 for( Int_t j=0; j<oldMuDstMaker->GetNKink(); j++ ) {
00575 kinkMuDstMaker->SelectKink(j);
00576 }
00577 } else {
00578 {for( Int_t j=0; j<mNDstMakers; j++ )
00579 newMuDstMakers[j]->AbortEvent();}
00580 }
00581
00582 if( i != NEvents) chain.Clear();
00583 sprintf(line,"*** Finished processing event %d",i);
00584 gMessMgr->Info(line);
00585 }
00586
00587
00588 if( NEvents >= 1 ) {
00589 chain.Finish();
00590 }
00591 }
00592
00593 void StrangeMuDstPlayer::Copy(Int_t NEvents, StFile* input, Char_t* output) {
00594
00595 StStrangeMuDstMaker *oldMuDstMaker=0;
00596 StStrangeMuDstMaker *newMuDstMakers[3];
00597 StStrangeMuDstMaker *v0MuDstMaker=0;
00598 StStrangeMuDstMaker *xiMuDstMaker=0;
00599 StStrangeMuDstMaker *kinkMuDstMaker=0;
00600 Char_t *file, *dir, *outfile[3], line[80];
00601 TString prefix[3];
00602 Int_t mNDstMakers = 0;
00603
00604
00605 StChain chain("myChain");
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615 if( doFileSplit ) {
00616 if( doV0 ) {
00617 v0MuDstMaker = new StStrangeMuDstMaker("v0MuDstMaker");
00618 v0MuDstMaker->DoV0();
00619 newMuDstMakers[mNDstMakers] = v0MuDstMaker;
00620 prefix[mNDstMakers] = "v0_";
00621 mNDstMakers++;
00622 }
00623 if( doXi ) {
00624 xiMuDstMaker = new StStrangeMuDstMaker("xiMuDstMaker");
00625 xiMuDstMaker->DoXi();
00626 newMuDstMakers[mNDstMakers] = xiMuDstMaker;
00627 prefix[mNDstMakers] = "xi_";
00628 mNDstMakers++;
00629 }
00630 if( doKink ) {
00631 kinkMuDstMaker = new StStrangeMuDstMaker("kinkMuDstMaker");
00632 kinkMuDstMaker->DoKink();
00633 newMuDstMakers[mNDstMakers] = kinkMuDstMaker;
00634 prefix[mNDstMakers] = "kink_";
00635 mNDstMakers++;
00636 }
00637 ParseFileName(output, &file, &dir);
00638 for(Int_t i=0; i<mNDstMakers; i++) {
00639
00640 outfile[i] = new char[strlen(output)+5];
00641 strcpy(outfile[i],dir);
00642 strcat(outfile[i],prefix[i].Data());
00643 strcat(outfile[i],file);
00644 newMuDstMakers[i]->SetWrite(outfile[i]);
00645 if( doT0Abort )
00646 newMuDstMakers[i]->DoT0JitterAbort();
00647 if( doMC )
00648 newMuDstMakers[i]->DoMc();
00649 }
00650 } else {
00651 mNDstMakers = 1;
00652 newMuDstMakers[0] = new StStrangeMuDstMaker("newMuDstMaker");
00653 if( doV0 ) newMuDstMakers[0]->DoV0();
00654 if( doXi ) newMuDstMakers[0]->DoXi();
00655 if( doKink ) newMuDstMakers[0]->DoKink();
00656 newMuDstMakers[0]->SetWrite(output);
00657 if( doT0Abort )
00658 newMuDstMakers[0]->DoT0JitterAbort();
00659 if( doMC )
00660 newMuDstMakers[0]->DoMc();
00661
00662 v0MuDstMaker = newMuDstMakers[0];
00663 xiMuDstMaker = newMuDstMakers[0];
00664 kinkMuDstMaker = newMuDstMakers[0];
00665 }
00666
00667 oldMuDstMaker = new StStrangeMuDstMaker("oldMuDstMaker");
00668 oldMuDstMaker->SetRead(input);
00669
00670 {for( Int_t i=0; i<mNDstMakers; i++ )
00671 newMuDstMakers[i]->SubDst(oldMuDstMaker);}
00672
00673
00674 Int_t istatus = chain.Init();
00675 if( istatus ) { chain.FatalErr(istatus,"on init"); return; }
00676
00677
00678 for( Int_t i=0; i<NEvents; i++ ) {
00679 switch (istatus = chain.Make(i)) {
00680 case 0: break;
00681 case 2: { gMessMgr->Info("Last event from input."); break; }
00682 case 3: { gMessMgr->Error() << "Event " << i << " had error " <<
00683 istatus << ". Ending."; gMessMgr->Print(); break; }
00684 default: { gMessMgr->Warning() << "Event " << i << " returned status " <<
00685 istatus << ". Ending."; gMessMgr->Print(); }
00686 }
00687
00688 if( istatus ) break;
00689
00690 if( doV0 )
00691
00692 for( Int_t j=0; j<oldMuDstMaker->GetNV0(); j++ )
00693 v0MuDstMaker->SelectV0(j);
00694 if( doXi )
00695
00696 for( Int_t j=0; j<oldMuDstMaker->GetNXi(); j++ )
00697 xiMuDstMaker->SelectXi(j);
00698 if( doKink )
00699
00700 for( Int_t j=0; j<oldMuDstMaker->GetNKink(); j++ )
00701 kinkMuDstMaker->SelectKink(j);
00702
00703 if( i != NEvents) chain.Clear();
00704 sprintf(line,"*** Finished processing event %d",i);
00705 gMessMgr->Info(line);
00706 }
00707
00708
00709 if( NEvents >= 1 ) {
00710 chain.Finish();
00711 }
00712 }
00713