00001
00002
00003
00004 #include "TROOT.h"
00005 #include "TPRegexp.h"
00006 #include "TString.h"
00007 #include "TObjString.h"
00008 #include "TSystem.h"
00009 #include "TInterpreter.h"
00010 #include "TClassTable.h"
00011 #include "StMemStat.h"
00012 #include "StBFChain.h"
00013 #include "StBFChainOpt.h"
00014 #include "St_db_Maker/St_db_Maker.h"
00015 #include "StTreeMaker/StTreeMaker.h"
00016 #include "StIOMaker/StIOMaker.h"
00017 #include "StChallenger/StChallenger.h"
00018 #include "StDbUtilities/StMagUtilities.h"
00019 #include "StMessMgr.h"
00020 #include "StEnumerations.h"
00021 #include "TTree.h"
00022 #define STAR_LOGGER 1
00023
00024
00025 #if 0
00026
00027 #define STR_OBSOLETE "WARNING *** Option is OBSOLETE ***"
00028
00029
00030
00031
00032
00033
00034
00035
00036 #endif
00037
00038
00039 #define BFC_DBREGEXP "(dbv|sdt)(\\d+)(_)(.*)(_)(.*)"
00040
00041
00042
00043 #define __KEEP_TPCDAQ_FCF__
00044 TableImpl(Bfc);
00045 ClassImp(StBFChain);
00046
00047
00048
00059 void StBFChain::Setup(Int_t mode) {
00060 static const Char_t *path = "./StRoot/StBFChain:$STAR/StRoot/StBFChain";
00061 TString chain("BFC.C");
00062 Char_t *file = gSystem->Which(path,chain,kReadPermission);
00063 #ifdef STAR_LOGGER
00064 if (! file) { LOG_FATAL << Form("StBFChain::Setup\tFile %s has not been found in path %s",chain.Data(),path) << endm; }
00065 else { LOG_WARN << Form("StBFChain::Setup\tFile %s has been found as %s",chain.Data(),file) << endm; }
00066 #else
00067
00068 if (! file) Fatal("StBFChain::Setup","File %s has not been found in path %s",chain.Data(),path);
00069 else Warning("StBFChain::Setup","File %s has been found as %s",chain.Data(),file);
00070 #endif
00071 TString cmd(".L ");
00072 cmd += file;
00073 gInterpreter->ProcessLine(cmd);
00074 fchainOpt = (St_Bfc *) gInterpreter->Calc("CreateTable()");
00075 cmd = ".U ";
00076 cmd += file;
00077 gInterpreter->ProcessLine(cmd);
00078 assert(fchainOpt);
00079 fNoChainOptions = fchainOpt->GetNRows();
00080 fBFC = fchainOpt->GetTable();
00081
00082 const DbAlias_t *DbAlias = GetDbAliases();
00083 for (Int_t i = 0; DbAlias[i].tag; i++) {
00084 for (Int_t r = 0; r < 2; r++) {
00085 TString dbTag("");
00086 if (r) dbTag += "r";
00087 dbTag += DbAlias[i].tag;
00088 if (! kOpt(dbTag,kFALSE)) {
00089 Bfc_st row = {"","","","db,detDb","","","",kFALSE};
00090 memcpy (&row.Key, dbTag.Data(), dbTag.Length());
00091 fchainOpt->AddAt(&row);
00092 fNoChainOptions = fchainOpt->GetNRows();
00093 fBFC = fchainOpt->GetTable();
00094 }
00095 }
00096 }
00097 FDate = FTime = 0;
00098 FDateS = FTimeS = 0;
00099
00100 Gproperty = ".gopt.";
00101 Gvalue = "";
00102 Gpattern = "*";
00103
00104
00105 }
00106
00108 StBFChain::~StBFChain(){
00109 Finish();
00110 }
00111
00113 Int_t StBFChain::Load()
00114 {
00115 static const Char_t *prefix[3] = {"lib_","lib",""};
00116 Int_t status = kStOk;
00117 Int_t i, iok;
00118 TString lib(gSystem->GetLibraries(0,"D"));
00119 TObjArray LoadedLibs;
00120 ParseString(lib,LoadedLibs);
00121 TIter next(&LoadedLibs);
00122 TObjString *LoadedLib;
00123 while ((LoadedLib = (TObjString *) next())){
00124 TString Base(gSystem->BaseName(LoadedLib->GetName()));
00125 Base.ReplaceAll(".so","");
00126 Base.ReplaceAll(".sl","");
00127 if (Base.BeginsWith("lib_")) Base.ReplaceAll("lib_","");
00128 if (Base.BeginsWith("lib")) Base.ReplaceAll("lib","");
00129 LoadedLib->SetString(Base);
00130 }
00131 for (i = 1; i< fNoChainOptions; i++) {
00132 if (fBFC[i].Flag) {
00133 if (strlen(fBFC[i].Libs) > 0) {
00134 TObjArray Libs;
00135 ParseString(fBFC[i].Libs,Libs);
00136 TIter nextL(&Libs);
00137 TObjString *libe = 0;
00138 Char_t *path = 0;
00139 while ((libe = (TObjString *) nextL())) {
00140 TString libN(libe->GetString());
00141 if (libN.BeginsWith("lib_")) libN.ReplaceAll("lib_","");
00142 if (libN.BeginsWith("lib")) libN.ReplaceAll("lib","");
00143
00144 TString libL("");
00145 for (Int_t j = 0; j < 3; j++) {
00146 libL = prefix[j]; libL += libN;
00147
00148 if ((path = gSystem->DynamicPathName(libL,kTRUE))) break;
00149 }
00150 iok = -1;
00151 if (path) {
00152 TIter next(&LoadedLibs);
00153 TObjString *LoadedLib;
00154 while ((LoadedLib = (TObjString *) next())){
00155 TString Base(LoadedLib->GetName());
00156
00157 if (Base == libN) {iok = 1; break;}
00158 }
00159 if (iok > 0) continue;
00160
00161
00162
00163
00164
00165 iok = gSystem->Load(libL);
00166 if (iok < 0) {
00167
00168 LOG_QA << "problem with loading of " << libL.Data() << endm;
00169 LOG_QA << fBFC[i].Key << " is switched off \t!!!!" << endm;
00170
00171 fBFC[i].Flag = kFALSE;
00172 status = kStErr;
00173 assert(iok >= 0);
00174 break;
00175 } else {
00176 if (Debug() > 1) { TString ts("load "); ts += libL; StMemStat::PrintMem(ts.Data());}
00177
00178 LOG_QA << "Library " << Form("%-20s\t(%s)\tis loaded",libL.Data(),path) << endm;
00179
00180 LoadedLibs.Add(new TObjString(libN));
00181 }
00182 } else {
00183 if ( ! index(fBFC[i].Libs,',') || Debug() > 1 ) {
00184 LOG_WARN << "No path for Key=" << fBFC[i].Key << "-> Searched for [" << libL
00185 << "] from Libs=" << fBFC[i].Libs << " (will proceed)" << endm;
00186 }
00187 }
00188 }
00189 Libs.Delete();
00190 }
00191 }
00192 }
00193 LoadedLibs.Delete();
00194 return status;
00195 }
00196
00197
00199
00210 Int_t StBFChain::Instantiate()
00211 {
00212 Int_t status = kStOk;
00213 Int_t i;
00214 if (! fNoChainOptions) return status;
00215 Long64_t maxsize = kMaxLong64;
00216 TTree::SetMaxTreeSize(maxsize);
00217 for (i = 1; i< fNoChainOptions; i++) {
00218 if (! fBFC[i].Flag) continue;
00219 TString maker(fBFC[i].Maker);
00220 if (maker == "") continue;
00221 TString Key(fBFC[i].Key);
00222 TString name(fBFC[i].Name);
00223 Key.ToLower();
00224 StMaker *myChain = 0;
00225 StMaker *mk = 0;
00226
00227 if (maker == "St_db_Maker" || maker == "StTpcDbMaker" ||
00228 maker == "StSvtDbMaker" || maker == "StSsdDbMaker" ||
00229 maker == "StDetectorDbMaker" ||
00230 maker == "StMagFMaker" ||
00231 maker == "StEEmcDbMaker" ||
00232 maker == "St_geant_Maker" ||
00233 maker == "StVMCMaker") {
00234 mk = GetTopChain()->GetMakerInheritsFrom(maker);
00235 if (mk) {
00236 if (maker == "St_geant_Maker" || maker == "StVMCMaker") {
00237 LOG_INFO << "StBFChain::Instantiate ignore request for instantiation of " << maker
00238 << "(\"" << fBFC[i].Name << "\") because chain alreary has one." << endm;
00239 continue;
00240 }
00241 if (name == "" || name == mk->GetName()) {
00242 LOG_INFO << "StBFChain::Instantiate ignore request for instantiation of " << maker
00243 << "(\"" << fBFC[i].Name << "\") because chain alreary has one"
00244 << " but accumulate options" << endm;
00245
00246 }
00247 }
00248 }
00249 if (strlen(fBFC[i].Chain) > 0) myChain = GetMaker(fBFC[i].Chain);
00250 if (maker == "St_db_Maker"){
00251 if (Key.CompareTo("db",TString::kIgnoreCase) == 0) {
00252 St_db_Maker* dbMk = (St_db_Maker *) mk;
00253 if (! dbMk) {
00254 TString MySQLDb("MySQL:StarDb");
00255 TString MainCintDb("$STAR/StarDb");
00256 TString MyCintDb("$PWD/StarDb");
00257 if (GetOption("NoMySQLDb")) {MySQLDb = "";}
00258
00259
00260 if (GetOption("NoLocalCintDb")) {MyCintDb = "";}
00261 if (GetOption("NoStarCintDb") ) {MainCintDb = "";}
00262 if (GetOption("NoCintDb") ) {MainCintDb = ""; MyCintDb = "";}
00263
00264 TString Dirs[3];
00265 Int_t j;
00266 for (j = 0; j < 3; j++) Dirs[j] = "";
00267 j = 0;
00268 if (MySQLDb != "") {Dirs[j] = MySQLDb; j++;}
00269 if (MainCintDb != "") {Dirs[j] = MainCintDb; j++;}
00270 if (MyCintDb != "") {Dirs[j] = MyCintDb; j++;}
00271 dbMk = new St_db_Maker(fBFC[i].Name,Dirs[0],Dirs[1],Dirs[2]);
00272 if (!dbMk) goto Error;
00273 strcpy (fBFC[i].Name, (Char_t *) dbMk->GetName());
00274 mk = dbMk;
00275 if (GetOption("Simu") && ! GetOption("NoSimuDb")) dbMk->SetFlavor("sim+ofl");
00276 else dbMk->SetFlavor("ofl");
00277 }
00278 if (GetOption("dbSnapshot")) dbMk->SetAttr("dbSnapshot","dbSnapshot.root",dbMk->GetName());
00279 SetDbOptions(dbMk);
00280 }
00281 goto Add2Chain;
00282 }
00283 if (!mk && maker == "StIOMaker" && fSetFiles) {
00284 StIOMaker *inpMk=0;
00285 if (GetOption("InTree")) {
00286 Char_t line[80] = "bfcTree";
00287 Int_t k = kOpt("InTree");
00288 sscanf(fBFC[k].Comment,"%s",line);
00289 inpMk = new StIOMaker("inputStream","r",fSetFiles,line);
00290 }
00291 else inpMk = new StIOMaker("inputStream","r",fSetFiles);
00292 mk = inpMk;
00293 if (mk) {
00294 strcpy (fBFC[i].Name,(Char_t *) mk->GetName());
00295 SetInput("StDAQReader",".make/inputStream/.make/inputStream_DAQ/.const/StDAQReader");
00296 if (GetOption("ReadAll")) {
00297
00298 const Char_t *allBranches[] = {
00299 "emc_rawBranch","eventBranch","ftpc_rawBranch",
00300 "geantBranch","globalBranch","McEventBranch","svt_hitsBranch","svt_tracksBranch",
00301 "tpc_hitsBranch","trgBranch",0};
00302 for (Int_t i = 0; allBranches[i]; i++) inpMk->SetBranch(allBranches[i],0,"r");
00303 }
00304 if (GetOption("adcOnly")) mk->SetAttr("adcOnly",1); ;
00305 goto Add2Chain;
00306 }
00307 goto Error;
00308 }
00309 if (!mk && maker == "StTreeMaker" && fFileOut != "") {
00310 StTreeMaker *treeMk = 0;
00311 if (GetOption("OutTree")) {
00312 Char_t line[80] = "bfcTree";
00313 Int_t k = kOpt("OutTree");
00314 sscanf(fBFC[k].Comment,"%s",line);
00315 treeMk = new StTreeMaker("outputStream",fFileOut.Data(),line);
00316 }
00317 else treeMk = new StTreeMaker("outputStream",fFileOut.Data());
00318 mk = treeMk;
00319 if (mk) {
00320 strcpy (fBFC[i].Name,(Char_t *) treeMk->GetName());
00321 treeMk->SetIOMode("w");
00322 SetTreeOptions();
00323 goto Add2Chain;
00324 }
00325 }
00326
00327
00328 if (! mk) {
00329 if (strlen(fBFC[i].Name) > 0) mk = New(fBFC[i].Maker,fBFC[i].Name);
00330 else mk = New(fBFC[i].Maker);
00331 if (! mk) {
00332 LOG_FATAL << Form("StBFChain::Instantiate() problem with instatiation %s",fBFC[i].Maker) << endm;
00333 assert(mk);
00334 }
00335 }
00336 strcpy (fBFC[i].Name,(Char_t *) mk->GetName());
00337
00338 if (maker == "StDAQMaker") {
00339 if (GetOption("adcOnly")) mk->SetAttr("adcOnly",1); ;
00340 }
00341
00342 if (maker == "St_geant_Maker") {
00343 Int_t NwGeant = 10;
00344 if (!GetOption("fzin") && !GetOption("ntin") &&
00345 !GetOption("gstar")) NwGeant = 5;
00346 if (GetOption("big")) NwGeant = 20;
00347 if (GetOption("bigbig")) NwGeant = 40;
00348 ProcessLine(Form("((St_geant_Maker *) %p)->SetNwGEANT(%i);",mk,NwGeant));
00349 if (GetOption("Higz")) ProcessLine(Form("((St_geant_Maker *) %p)->SetIwtype(1);",mk));
00350 if (GetOption("paw")) ProcessLine(Form("((St_geant_Maker *) %p)->SetNwPAW(2);",mk));
00351 if (GetOption("fzin") || GetOption("ntin") || GetOption("gstar") || GetOption("PrepEmbed") || GetOption("mtin")) {
00352 mk->SetActive(kTRUE);
00353 if (GetOption("PrepEmbed")) mk->SetMode(10*(mk->GetMode()/10)+1);
00354 }
00355 else mk->SetActive(kFALSE);
00356 if (! mk) goto Error;
00357 SetGeantOptions(mk);
00358 }
00359
00360
00361
00362
00363
00364
00365 if (maker == "StVMCMaker") {
00366 if (GetOption("VMCPassive")) {
00367 mk->SetAttr("VMCPassive",kTRUE);
00368 }
00369 else {
00370 if (GetOption("phys_off")) mk->SetAttr("phys_off",kTRUE);
00371 if (GetOption("hadr_off")) mk->SetAttr("hadr_off",kTRUE);
00372 if (fInFile != "") {
00373 if (ProcessLine(Form("((StVMCMaker *) %p)->SetInputFile(\"%s\")",mk,fInFile.Data())))
00374 goto Error;
00375 }
00376 }
00377 if (GetOption("Embedding")) mk->SetAttr("Embedding",kTRUE);
00378 }
00379
00380 if (maker == "StiMaker" || maker == "StiVMCMaker" || maker == "StvMaker") {
00381 if ( maker == "StvMaker" && GetOption("StvCA")) {
00382
00383 mk->SetAttr("seedFinders","CA,Default","Stv");
00384 }
00385 if (GetOption("NoSvtIT")) mk->SetAttr("useSvt" ,kFALSE);
00386 else
00387 if (GetOption("SvtIT")){
00388 mk->SetAttr("useSvt" ,kTRUE);
00389 mk->SetAttr("activeSvt" ,kTRUE);
00390 }
00391 if (GetOption("NoSsdIT")) mk->SetAttr("useSsd" ,kFALSE);
00392 else
00393 if (GetOption("SsdIT")){
00394 mk->SetAttr("useSsd" ,kTRUE);
00395 mk->SetAttr("activeSsd" ,kTRUE);
00396 }
00397 if (GetOption("PixelIT")){
00398 mk->SetAttr("usePixel" ,kTRUE);
00399 mk->SetAttr("activePixel",kTRUE);
00400 }
00401 if (GetOption("IstIT")){
00402 mk->SetAttr("useIst" ,kTRUE);
00403 mk->SetAttr("activeIst",kTRUE);
00404 }
00405
00406 if (GetOption("HpdIT")){
00407 mk->SetAttr("useHpd" ,kTRUE);
00408 mk->SetAttr("activeHpd",kTRUE);
00409 }
00410 if (GetOption("BTofIT")){
00411 mk->SetAttr("useBTof" ,kTRUE);
00412 mk->SetAttr("activeBTof",kTRUE);
00413 }
00414
00415 if (GetOption("StiPulls") ||
00416 GetOption("StvPulls")) mk->SetAttr("makePulls" ,kTRUE);
00417 if (GetOption("skip1row")) mk->SetAttr("skip1row" ,kTRUE);
00418 if (GetOption("EastOff")) mk->SetAttr("EastOff" ,kTRUE);
00419 if (GetOption("WestOff")) mk->SetAttr("WestOff" ,kTRUE);
00420 if (GetOption("laserIT")) mk->SetAttr("laserIT" ,kTRUE);
00421 if (GetOption("Alignment")) mk->SetAttr("Alignment" ,kTRUE);
00422 mk->PrintAttr();
00423 }
00424
00425 if (maker=="StGenericVertexMaker") {
00426
00427 if (GetOption("Sti") || GetOption("StiCA") ||
00428 GetOption("Stv") ||
00429 GetOption("StiVMC" ) ) mk->SetAttr("ITTF" , kTRUE);
00430 if (GetOption("VFMinuit" ) ) mk->SetAttr("VFMinuit" , kTRUE);
00431 if (GetOption("VFppLMV" ) ) mk->SetAttr("VFppLMV" , kTRUE);
00432 if (GetOption("VFppLMV5" ) ) mk->SetAttr("VFppLMV5" , kTRUE);
00433 if (GetOption("VFPPV" ) ) mk->SetAttr("VFPPV" , kTRUE);
00434 if (GetOption("VFPPVnoCTB" ) ) mk->SetAttr("VFPPVnoCTB" , kTRUE);
00435 if (GetOption("VFFV" ) ) mk->SetAttr("VFFV" , kTRUE);
00436 if (GetOption("VFMCE" ) ) mk->SetAttr("VFMCE" , kTRUE);
00437 if (GetOption("VFMinuit2" ) ) mk->SetAttr("VFMinuit2" , kTRUE);
00438 if (GetOption("VFMinuit3" ) ) mk->SetAttr("VFMinuit3" , kTRUE);
00439 if (GetOption("beamLine" ) ) mk->SetAttr("BeamLine" , kTRUE);
00440 if (GetOption("CtbMatchVtx") ) mk->SetAttr("CTB" , kTRUE);
00441 if (GetOption("min2trkVtx" ) ) mk->SetAttr("minTracks" , 2);
00442 if (GetOption("VtxSeedCalG") ) mk->SetAttr("calibBeamline", kTRUE);
00443 if (GetOption("usePct4Vtx" ) ) mk->SetAttr("PCT" , kTRUE);
00444 if (GetOption("useBTOF4Vtx") ) mk->SetAttr("BTOF" , kTRUE);
00445 mk->PrintAttr();
00446 }
00447 if (maker=="StKFVertexMaker") {
00448 if (GetOption("beamLine" ) ) mk->SetAttr("BeamLine" , kTRUE);
00449 }
00450 if (maker=="StAssociationMaker") {
00451
00452 LOG_QA << "StBFChain::Instantiate Setting the Parameters for the Association Maker" << endm;
00453
00454 TString cmd("");
00455 if (GetOption("ITTF") || GetOption("StiVMC") || GetOption("useInTracker"))
00456 cmd = Form ("((StAssociationMaker *) %p)->useInTracker();",mk);
00457 cmd += "StMcParameterDB* parameterDB = StMcParameterDB::instance();";
00458
00459 #if 0
00460 cmd += "parameterDB->setXCutTpc(.5);";
00461 cmd += "parameterDB->setYCutTpc(.5);";
00462 cmd += "parameterDB->setZCutTpc(.5);";
00463 #endif
00464 cmd += "parameterDB->setReqCommonHitsTpc(3);";
00465
00466 #if 0
00467 cmd += "parameterDB->setRCutFtpc(.3);";
00468 cmd += "parameterDB->setPhiCutFtpc(5*(3.1415927/180.0));";
00469 #endif
00470 cmd += "parameterDB->setReqCommonHitsFtpc(3);";
00471
00472 #if 0
00473 cmd += "parameterDB->setXCutSvt(.08);";
00474 cmd += "parameterDB->setYCutSvt(.08);";
00475 cmd += "parameterDB->setZCutSvt(.08);";
00476 #endif
00477 cmd += "parameterDB->setReqCommonHitsSvt(1);";
00478 if (GetOption("IdTruth")) cmd += Form("((StAssociationMaker *) %p)->useIdAssoc();",mk);
00479 ProcessLine(cmd);
00480 }
00481 if (maker == "StMiniMcMaker" && GetOption("IdTruth") && ! GetOption("OldMiniMc")) {
00482 mk->SetMode(1);
00483 gMessMgr->QAInfo() << "StBFChain::Instantiate create simplified MiniMcTree in " << maker << endm;
00484 }
00485
00486
00487
00488 if (GetOption("ppOpt") ) {
00489 if (maker == "StTrsMaker")
00490 mk->SetMode(1);
00491 }
00492
00493 if (maker == "StStrangeMuDstMaker" && GetOption("CMuDST")&& GetOption("StrngMuDST") ) {
00494 TString cmd(Form("StStrangeMuDstMaker *pSMMk = (StStrangeMuDstMaker*) %p;",mk));
00495 cmd += "pSMMk->DoV0();";
00496 cmd += "pSMMk->DoXi();";
00497 cmd += "pSMMk->DoKink();";
00498 cmd += "pSMMk->SetNoKeep();";
00499 ProcessLine(cmd);
00500 }
00501
00502
00503
00504 if ( maker == "StEmcRawMaker" && GetOption("BEmcDebug"))
00505 mk->SetMode(1);
00506
00507
00508 if ( maker == "StEmcRawMaker" && GetOption("BEmcChkStat"))
00509 mk->SetAttr("BEmcCheckStatus",kTRUE);
00510
00511
00512
00513
00514
00515 if (maker == "StMuDstMaker" && GetOption("ezTree") ){
00516 TString cmd(Form("StMuDstMaker *pMuMk = (StMuDstMaker *) %p;",mk));
00517 if ( ! GetOption("CMuDST")) cmd += "pMuMk->SetStatus(\"*\",0);";
00518 cmd += "pMuMk->SetStatus(\"EztAll\",1);";
00519 ProcessLine(cmd);
00520 }
00521
00522 if (maker == "StLaserEventMaker"){
00523
00524 }
00525 if (maker == "StDetectorDbMaker") {
00526 if ( GetOption("DbRichSca") ) mk->SetMode(1);
00527 }
00528 if (maker == "StTpcRSMaker") {
00529 if (! GetOption("TrsToF")) {
00530 Int_t mode = mk->GetMode();
00531 mode |= (1 << 10);
00532 mk->SetMode(mode);
00533 }
00534 }
00535 if (maker == "StTrsMaker") {
00536 Int_t mode = 0;
00537 if (GetOption("TrsPileUp")) mode += 1;
00538 if (GetOption("TrsToF")) mode += 2;
00539 if (mode) mk->SetMode(mode);
00540 }
00541 #ifdef __KEEP_TPCDAQ_FCF__
00542 if (maker == "St_tpcdaq_Maker") {
00543 Int_t DMode=0;
00544 TString cmd(Form("St_tpcdaq_Maker *tcpdaqMk = (St_tpcdaq_Maker *) %p;",mk));
00545
00546
00547 Int_t mode = 0;
00548 if (GetOption("Trs") || GetOption("Embedding") || GetOption("TpcRS"))
00549 mode = 1;
00550 else if (GetOption("Simu")) mode = 2;
00551 if (mode) mk->SetMode(mode);
00552
00553 if ( GetOption("onlcl") ) DMode = DMode | 0x2;
00554 if ( GetOption("onlraw") ) DMode = DMode | 0x1;
00555
00556 if (DMode != 0)
00557 cmd += Form("tcpdaqMk->SetDAQFlag(%i);",DMode);
00558
00559
00560
00561
00562
00563 Int_t Correction = 0;
00564 Int_t SequenceMerging = 0;
00565 if ( GetOption("fcf") ){
00566 if ( GetOption("Trs") ) Correction = 0x5;
00567 else Correction = 0x0;
00568 } else {
00569 SequenceMerging = 1;
00570 Correction = 0x7;
00571 }
00572 cmd += Form("tcpdaqMk->SetCorrection(%d);",Correction);
00573 cmd += Form("tcpdaqMk->SetSequenceMerging(%d);",SequenceMerging);
00574 LOG_QA << "StBFChain::Instantiate maker==" << maker.Data()
00575 << Form(" SetDAQFlag(%d) SetMode(%d) SetCorrection(%d) SetSequenceMerging(%d)",
00576 DMode,mk->GetMode(),Correction,SequenceMerging) << endm;
00577 ProcessLine(cmd);
00578 }
00579 #endif
00580 #if 0
00581 if (maker == "StTpcRTSHitMaker") {
00582 if (GetOption("Trs") || GetOption("Embedding")) mk->SetMode(2);
00583 }
00584 #endif
00585 #ifdef __KEEP_TPCDAQ_FCF__
00586 if (maker == "StRTSClientFCFMaker"){
00587 Int_t DMode=0;
00588
00589 if ( GetOption("onlcl") && ! GetOption("onlraw") ) DMode = DMode | 0x2;
00590
00591 if ( GetOption("onlraw")&& ! GetOption("onlcl") ) DMode = DMode | 0x1;
00592 if ( GetOption("Simu") || GetOption("Embedding")) DMode = DMode | 0x4;
00593 if (DMode) mk->SetMode(DMode);
00594 }
00595 if (maker == "StTpcT0Maker"){
00596 Int_t mask = 0;
00597 if ( GetOption("fcf") ) mask = mask | 0x1;
00598 LOG_QA << "StBFChain::Instantiate For " << maker.Data();
00599 LOG_QA << " => mask = " << mask << endm;
00600 mk->SetMode(mask);
00601 }
00602 #endif
00603
00604 if (maker == "StTofrMatchMaker"){
00605 mk->SetMode(0);
00606 }
00607
00608 if (maker == "StSpaceChargeEbyEMaker") {
00609 if ( GetOption("SpcChgCal") ||
00610 GetOption("SpcChgCalG")) mk->SetMode(2);
00611 if ( GetOption("SCScalerCal") ) mk->SetMode(4);
00612 }
00613 if (maker == "StEventQAMaker" && GetOption("QAalltrigs"))
00614 ProcessLine(Form("((StEventQAMaker *) %p)->AllTriggers();",mk));
00615
00616 if(maker=="StV0FinderMaker" && Key=="v0svt"){
00617 TString cmd(Form("StV0FinderMaker *V0mk=(StV0FinderMaker*) %p;",mk));
00618 cmd += "V0mk->SetLanguageUsage(0);";
00619 cmd += "V0mk->SetSVTUsage(1);";
00620 cmd += "V0mk->SetV0LanguageUsage(3);";
00621 ProcessLine(cmd);
00622 }
00623 if(maker=="StXiFinderMaker" && Key=="xisvt"){
00624 TString cmd(Form("StXiFinderMaker *Ximk=(StXiFinderMaker*) %p;",mk));
00625 cmd += "Ximk->SetLanguageUsage(0);";
00626 cmd += "Ximk->SetSVTUsage(1);";
00627 cmd += "Ximk->SetV0LanguageUsage(3);";
00628 cmd += "Ximk->SetXiLanguageUsage(5);";
00629 ProcessLine(cmd);
00630 }
00631 if (maker == "StTpcDbMaker"){
00632 if (GetOption("Simu") && ! GetOption("NoSimuDb")) mk->SetAttr("Simu",kTRUE);
00633 if ( GetOption("useLDV") ) mk->SetAttr("useLDV",kTRUE) ;
00634 if ( GetOption("useCDV") ) mk->SetAttr("useCDV",kTRUE) ;
00635 if ( GetOption("useNewLDV") ) mk->SetAttr("useNewLDV",kTRUE);
00636 if (GetOption("ExB")){
00637 mk->SetAttr("ExB", kTRUE);
00638 if ( GetOption("EB1") ) mk->SetAttr("EB1", kTRUE);
00639 else if ( GetOption("EB2") ) mk->SetAttr("EB2", kTRUE);
00640 else {
00641
00642
00643 if(GetOption("RY1H") ||
00644 GetOption("RY2000") ||
00645 GetOption("RY2001") ||
00646 GetOption("RY2001N") ||
00647 GetOption("RY2003") ||
00648 GetOption("RY2003X")) mk->SetAttr("OldRuns", kTRUE);
00649 }
00650
00651
00652
00653
00654
00655 if( GetOption("OBmap") ) mk->SetAttr("OBmap" , kTRUE);
00656 if( GetOption("OPr13") ) mk->SetAttr("OPr13" , kTRUE);
00657 if( GetOption("OTwist") ) mk->SetAttr("OTwist" , kTRUE);
00658 if( GetOption("OClock") ) mk->SetAttr("OClock" , kTRUE);
00659 if( GetOption("OCentm") ) mk->SetAttr("OCentm" , kTRUE);
00660 if( GetOption("OECap") ) mk->SetAttr("OECap" , kTRUE);
00661 if( GetOption("OIFC") ) mk->SetAttr("OIFC" , kTRUE);
00662 if( GetOption("OSpaceZ") ) mk->SetAttr("OSpaceZ" , kTRUE);
00663 if( GetOption("OSpaceZ2") ) mk->SetAttr("OSpaceZ2" , kTRUE);
00664 if( GetOption("OShortR") ) mk->SetAttr("OShortR" , kTRUE);
00665 if( GetOption("OBMap2d") ) mk->SetAttr("OBMap2d" , kTRUE);
00666 if( GetOption("OGridLeak") ) mk->SetAttr("OGridLeak" , kTRUE);
00667 if( GetOption("OGridLeak3D")) mk->SetAttr("OGridLeak3D", kTRUE);
00668 if( GetOption("OGGVoltErr") ) mk->SetAttr("OGGVoltErr" , kTRUE);
00669 if( GetOption("OSectorAlign"))mk->SetAttr("OSectorAlign",kTRUE);
00670 }
00671 mk->PrintAttr();
00672 }
00673 if ((maker == "StdEdxY2Maker" || maker == "StTpcHitMover") &&
00674 GetOption("EmbeddingShortCut")) {
00675 mk->SetAttr("EmbeddingShortCut", kTRUE);
00676 mk->PrintAttr();
00677 }
00678 if (maker == "StSvtDbMaker" || maker == "StSsdDbMaker"){
00679 mk->SetMode(0);
00680
00681 if (GetOption("Simu") && ! GetOption("NoSimuDb")) mk->SetMode(1);
00682 }
00683
00684
00685 if ((maker == "StFtpcClusterMaker" ||
00686 maker == "StFtpcTrackMaker" ) &&
00687 GetOption("fdbg")) mk->SetMode(mk->GetMode()+2);
00688 if ( ( maker == "StFtpcClusterMaker" ||
00689 maker == "StFtpcTrackMaker" ) &&
00690 GetOption("flaser")) mk->SetMode(mk->GetMode()+1);
00691
00692 if ((maker == "StFtpcClusterMaker" ||
00693 maker == "StFtpcTrackMaker" ) &&
00694 GetOption("fgain")) mk->SetMode(mk->GetMode()+4);
00695
00696
00697
00698
00699 if ( maker == "StPmdReadMaker" &&
00700 GetOption("pmdRaw")) mk->SetAttr("pmdRaw",kTRUE);
00701
00702
00703
00704
00705 if (maker == "StHitFilterMaker") {
00706 if (GetOption("SvtHitFilt")){
00707
00708 LOG_QA << "SVT hit filter is ON" << endm;
00709 TString cmd(Form("StHitFilterMaker *Filtmk=(StHitFilterMaker*) %p;",mk));
00710 cmd += "Filtmk->setPtLowerCut(-99.);";
00711 cmd += "Filtmk->setPtUpperCut(-99.);";
00712 cmd += "Filtmk->setAbsEtaCut(-99);";
00713 cmd += "Filtmk->setAbsZVertCut(30);";
00714 ProcessLine(cmd);
00715 } else {
00716 LOG_QA << "Default hit filtering is ON" << endm;
00717 }
00718 Int_t mode = 0;
00719 if (GetOption("KeepTpcHit")) mode |= (1 << kTpcId);
00720 if (GetOption("KeepSvtHit")) mode |= (1 << kSvtId);
00721 mk->SetMode(mode);
00722 }
00723 if (maker == "StMiniMcMaker" && fFileOut != "") {
00724 ProcessLine(Form("((StMiniMcMaker *) %p)->setFileName(\"%s\");", mk, fFileOut.Data()));
00725 }
00726 if (maker == "StMcAnalysisMaker") {
00727 Int_t mode = 0;
00728 if (GetOption("McAnaTpc")) mode += 0x1;
00729 if (GetOption("McAnaSvt")) mode += 0x2;
00730 if (GetOption("McAnaSsd")) mode += 0x4;
00731 if (mode)
00732 ProcessLine(Form("((StMaker *) %p)->SetMode(%i);", mk, mode));
00733 }
00734 if (maker == "StBTofCalibMaker" && GetOption("UseProjectedVertex")) mk->SetAttr("UseProjectedVertex",kTRUE);
00735 Add2Chain:
00736 if (! mk) continue;
00737 if (name == "") strcpy (fBFC[i].Name,(Char_t *) mk->GetName());
00738 if (myChain) myChain->AddMaker(mk);
00739 continue;
00740 Error:
00741 status = kStErr;
00742 LOG_QA << " ======================================" << endm;
00743 LOG_QA << " problem with Instantiation of " << fBFC[i].Maker << endm;
00744 LOG_QA << " ======================================" << endm;
00745 }
00746
00747 PrintInfo();
00748
00749
00750 #if 0
00751 if (GetOption("MakeDoc")) MakeDoc();
00752 #endif
00753 if (GetOption("Debug")) SetDEBUG(1);
00754 if (GetOption("Debug1")) SetDEBUG(1);
00755 if (GetOption("Debug2")) SetDEBUG(2);
00756 if (GetOption("nohistos")) SetAttr(".histos",0,"*");
00757 else SetAttr(".histos",1,"*");
00758 if (GetOption("NoRepeat")) gMessMgr->IgnoreRepeats();
00759
00760 if (GetOption("svt1hit")) SetAttr("minPrecHits",1,"Sti");
00761 if (GetOption("svt1hit")) SetAttr("minPrecHits",1,"StiCA");
00762 if (GetOption("svt1hit")) SetAttr("minPrecHits",1,"Stv");
00763 if (GetOption("svt1hit")) SetAttr("minPrecHits",1,"StiVMC");
00764
00765 gMessMgr->QAInfo() << "+++ Setting attribute " << Gproperty.Data() << " = " << Gvalue.Data() << endm;
00766 SetAttr(Gproperty.Data(),Gvalue.Data(),Gpattern.Data());
00767
00768 return status;
00769 }
00770
00771 Int_t StBFChain::Init() {
00772
00773 SetChainOpt(new StBFChainOpt(this));
00774
00775 if (fNoChainOptions) {
00776
00777 if (GetOption("Simu")) {
00778 StEvtHddr *fEvtHddr = (StEvtHddr*)GetDataSet("EvtHddr");
00779 if (!fEvtHddr) {
00780 fEvtHddr = new StEvtHddr(m_ConstSet);
00781 SetOutput(fEvtHddr);
00782 }
00783 if (fEvtHddr->GetRunNumber() < 0 || fEvtHddr->GetRunNumber() >= 1000000) {
00784 fEvtHddr->SetRunNumber(1);
00785 }
00786 }
00787 }
00788 if (fNoChainOptions) {
00789 if (GetOption("NoOutput") || GetOption("EvOutOnly")) {
00790 SetAttr(".call","SetActive(0)","MuDst");
00791 if (! GetOption("EvOutOnly")) {
00792 SetAttr(".call","SetActive(0)","outputStream");
00793 }
00794 SetAttr(".call","SetActive(0)","kink2");
00795 SetAttr(".call","SetActive(0)","StTagsMaker::");
00796 SetAttr(".call","SetActive(0)","StStrangeMuDstMaker::");
00797 }
00798 #if 1
00799
00800
00801 if (GetOption("Sti") || GetOption("StiCA") ||
00802 GetOption("Stv") ||
00803 GetOption("StiVMC") ||GetOption("VMC") ||
00804 GetOption("VMCPassive")) {
00805 const DbAlias_t *DbAlias = GetDbAliases();
00806 for (Int_t i = 0; DbAlias[i].tag; i++) {
00807 TString dbTag("r");
00808 dbTag += DbAlias[i].tag;
00809 if (GetOption(dbTag)) {
00810 TString path("./StarDb/AgiGeometry:$STAR/StarDb/AgiGeometry");
00811 if (GetOption("AgML")) {
00812 path = "./StarDb/AgMLGeometry:$STAR/StarDb/AgMLGeometry";
00813 }
00814 if (GetOption("VmcGeo")) {
00815 path = "./StarDb/VmcGeo:$STAR/StarDb/VmcGeo";
00816 }
00817 TString geom("Geometry.");
00818 geom += DbAlias[i].geometry;
00819 geom += ".C";
00820 Char_t *file = gSystem->Which(path.Data(),geom,kReadPermission);
00821 if (file) {
00822 LOG_INFO << "StBFChain::Init force load of " << file << endm;
00823 TString command = ".L "; command += file;
00824 gInterpreter->ProcessLine(command);
00825 gInterpreter->Calc("CreateTable()");
00826 command.ReplaceAll(".L ",".U ");
00827 gInterpreter->ProcessLine(command);
00828 } else {
00829 LOG_INFO << "StBFChain::Init file for geometry tag " << geom << " has not been found in path" << path << endm;
00830 }
00831 break;
00832 }
00833 }
00834 }
00835 #endif
00836 }
00837 Int_t iok = StChain::Init();
00838 return iok;
00839 }
00840
00842 Int_t StBFChain::Finish()
00843 {
00844 if (!fBFC) return kStOK;
00845 int ians = StMaker::Finish();
00846 SafeDelete(fchainOpt);
00847 fBFC = 0;
00848 TFile *tf = GetTFile();
00849 if (tf) {tf->Write(); tf->Flush(); tf->Close(); delete tf; SetTFile(0);}
00850
00851 return ians;
00852 }
00853
00854
00855
00856 Int_t StBFChain::AddAB (const Char_t *mkname,const StMaker *maker,const Int_t Opt) {
00857 if (! maker || strlen(mkname) == 0) return kStErr;
00858 StMaker *parent = maker->GetParentMaker();
00859 if (parent) {
00860 TList *list = parent->GetMakeList();
00861 list->Remove((StMaker *)maker);
00862 }
00863 StMaker *mk = GetMaker(mkname); if (!mk) return kStErr;
00864 parent = mk->GetParentMaker(); if (!parent) return kStErr;
00865 TList *list = parent->GetMakeList(); if (!list) return kStErr;
00866 if (Opt > 0) list->AddAfter (mk,(StMaker*)maker);
00867 else list->AddBefore(mk,(StMaker*)maker);
00868 return kStOk;
00869 }
00870
00871
00872 Int_t StBFChain::ParseString (const TString &tChain, TObjArray &Opt, Bool_t Sort) {
00873 Opt.Clear();
00874 TObjArray *obj = tChain.Tokenize("[^ ;,]+");
00875 Int_t nParsed = obj->GetEntries();
00876 Int_t k, N = 0;
00877 if (GetChain() && GetChain()->Debug() > 2) {
00878 gMessMgr->QAInfo() << "ParseString " << tChain.Data() << endm;
00879 for (k = 0; k < nParsed; k++) {
00880 if (obj->At(k)) {
00881 gMessMgr->QAInfo() << k << "\t" << ((TObjString *) obj->At(k))->GetName() << endm;
00882 }
00883 }
00884 }
00885 for (k = 0; k < nParsed; k++) {if (obj->At(k)) {if (k != N) obj->AddAt(obj->At(k),N); N++;}}
00886 nParsed = N;
00887
00888 StBFChain *chain = (StBFChain *) StMaker::GetChain();
00889 if (chain && Sort) {
00890 TArrayI idT(nParsed); Int_t *idx = idT.GetArray();
00891 TArrayI kdT(nParsed); Int_t *kdx = kdT.GetArray();
00892 for (k = 0; k < nParsed; k++) {
00893 TString string = ((TObjString *) obj->At(k))->GetString();
00894 kdx[k] = TMath::Abs(chain->kOpt(string,kFALSE));
00895 }
00896 TMath::Sort(nParsed,kdx,idx,0);
00897 TString sChain;
00898 for (k = 0; k < nParsed; k++) {
00899 Opt.AddAtAndExpand(obj->At(idx[k]),k);
00900 if (k == 0) sChain = ((TObjString *)Opt[k])->GetString();
00901 else {sChain += ","; sChain += ((TObjString *)Opt[k])->GetString();}
00902 }
00903 if (N > 1 && chain->Debug() > 2) {
00904 gMessMgr->QAInfo() << "Requested chain is :\t" << tChain.Data() << endm;
00905 gMessMgr->QAInfo() << "Sorted chain is :\t" << sChain.Data() << endm;
00906 }
00907 } else for (k = 0; k < nParsed; k++) Opt.AddAtAndExpand(obj->At(k),k);
00908 obj->SetOwner(kFALSE);
00909 delete obj;
00910 return nParsed;
00911 }
00912
00913
00915 Int_t StBFChain::kOpt (const Char_t *tag, Bool_t Check) const {
00916 TString Tag(tag);
00917 Int_t kO = kOpt(&Tag, Check);
00918 return kO;
00919 }
00920
00922
00928 Int_t StBFChain::kOpt (const TString *tag, Bool_t Check) const {
00929 TString Tag = *tag;
00930 Tag.ToLower();
00931 TString opt, nopt;
00932 for (Int_t i = 1; i< fNoChainOptions; i++) {
00933 opt = TString(fBFC[i].Key);
00934 opt.ToLower();
00935 nopt = TString("-");
00936 nopt += opt;
00937 if (Tag == opt) {return i;}
00938 else {if (Tag == nopt) {return -i;}}
00939 opt = fBFC[i].Maker;
00940 nopt = "-";
00941 nopt += opt;
00942 if (Tag == opt) {return i;}
00943 else {if (Tag == nopt) {return -i;}}
00944 }
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956 if (Tag.BeginsWith("dbv") || Tag.BeginsWith("sdt")) {
00957 Check = kTRUE;
00958
00959 if (Tag.Length() == 11 || Tag.Length() == 18) return 0;
00960
00961
00962
00963 Tag.ToLower();
00964 if ( TPRegexp(BFC_DBREGEXP).Match(Tag) == 7) return 0;
00965 }
00966
00967
00968 if ( Tag.BeginsWith("gopt") && Tag.Length() == 13 ) return 0;
00969
00970 if (Check) {
00971 gMessMgr->Error() << "Option " << Tag.Data() << " has not been recognized" << endm;
00972 abort();
00973 }
00974 return 0;
00975 }
00976
00977 void StBFChain::SetOptions(const Char_t *options, const Char_t *chain) {
00978 TString tChain(options);
00979 TObjArray Opts;
00980 Int_t nParsed = ParseString(tChain,Opts,kTRUE);
00981 for (Int_t l = 0; l < nParsed; l++) {
00982 TString Tag = ((TObjString *)Opts[l])->GetString();
00983 Int_t kgo;
00984 Int_t in = Tag.Index("=");
00985 if (in > 0) {
00986 TString subTag(Tag.Data(),in);
00987 subTag.ToLower();
00988 kgo = kOpt(subTag.Data());
00989 if (kgo > 0) {
00990 memset(fBFC[kgo].Comment,0,sizeof(fBFC[kgo].Comment));
00991 TString Comment(Tag.Data()+in+1,Tag.Capacity()-in-1);
00992 strcpy (fBFC[kgo].Comment, Comment.Data());
00993 gMessMgr->QAInfo() << Form(" Set %s = %s", fBFC[kgo].Key,fBFC[kgo].Comment) << endm;
00994 }
00995 } else {
00996 Tag.ToLower();
00997
00998 kgo = kOpt(Tag.Data(),kFALSE);
00999 if (kgo != 0) {
01000 SetOption(kgo,chain);
01001 if (kgo > 0) {
01002 TString Comment(fBFC[kgo].Comment);
01003 TString Opts(fBFC[kgo].Opts);
01004 if (Tag.BeginsWith("Test.",TString::kIgnoreCase) && ! Comment.BeginsWith("/star/") &&
01005 Opts.BeginsWith("test_",TString::kIgnoreCase)) {
01006 SetOptions(Opts,Tag);
01007 } else {
01008 if ((Tag.BeginsWith("Test.",TString::kIgnoreCase) ||
01009 Tag.BeginsWith("test_",TString::kIgnoreCase) ||
01010 Tag.BeginsWith("eval_",TString::kIgnoreCase)) && Comment.BeginsWith("/star/") ) {
01011 fkChain = kgo;
01012 gMessMgr->QAInfo() << "Default Test chain set " << fBFC[fkChain].Key << " with input " << fBFC[fkChain].Comment << endm;
01013 }
01014 }
01015 }
01016 } else {
01017
01018
01019
01020
01021
01022
01023
01024
01025 if (Tag.BeginsWith("dbv")) {
01026 if (Tag.Length() == 11) (void) sscanf(Tag.Data(),"dbv%8d",&FDate);
01027 if (Tag.Length() == 18) (void) sscanf(Tag.Data(),"dbv%8d.%6d",&FDate,&FTime);
01028 if (Tag.Length() == 11 || Tag.Length() == 18) {
01029 gMessMgr->QAInfo() << Tag.Data() << " ... but still will be considered as a dynamic timestamp (Max DB EntryTime) "
01030 << FDate << "." << FTime << endm;
01031 } else {
01032
01033
01034 TObjArray *subStrL = TPRegexp(BFC_DBREGEXP).MatchS(Tag);
01035 BFCTimeStamp TS;
01036 TString realm;
01037
01038 TS.Type = 1;
01039 TS.Date = (((TObjString *) subStrL->At(2))->GetString()).Atoi();
01040 TS.Time = 0;
01041 TS.Detector = ((TObjString *) subStrL->At(4))->GetString();
01042 TS.Realm = ((TObjString *) subStrL->At(6))->GetString();
01043
01044 if ( TS.Realm.IsNull() ){ realm = "*";}
01045 else { realm = TS.Realm;}
01046
01047 GTSOptions.push_back(TS);
01048
01049 LOG_WARN << "Override timestamp for detector requested\n\t"
01050 << "Detector " << TS.Detector << "\n\t"
01051 << "Realm " << realm << "\n\t"
01052 << "Date " << TS.Date << "\n\t"
01053 << "Time " << TS.Time << endm;
01054
01055 }
01056
01057 } else if (Tag.BeginsWith("sdt")) {
01058 if (Tag.Length() == 11) (void) sscanf(Tag.Data(),"sdt%8d",&FDateS);
01059 if (Tag.Length() == 18) (void) sscanf(Tag.Data(),"sdt%8d.%6d",&FDateS,&FTimeS);
01060 if (Tag.Length() == 11 || Tag.Length() == 18) {
01061 gMessMgr->QAInfo() << Tag.Data() << " ... but still will be considered as a dynamic timestamp (Event Time) "
01062 << FDateS << "." << FTimeS << endm;
01063
01064
01065
01066 }
01067
01068 } else if ( Tag.BeginsWith("gopt") && Tag.Length() == 13){
01069 char GOptName[3],GOptValue[6];
01070
01071
01072
01073 (void) sscanf(Tag.Data(),"gopt%3s%6s",GOptName,GOptValue);
01074
01075
01076 Gproperty += GOptName;
01077
01078
01079
01080
01081
01082
01083
01084 Gvalue = GOptValue;
01085
01086 gMessMgr->QAInfo() << Tag.Data() << " ... this will set an general attribute "
01087 << Gproperty.Data() << " with value " << GOptValue << " to "
01088 << Gpattern.Data() << endm;
01089
01090
01091
01092
01093
01094 } else {
01095 kgo = kOpt(Tag.Data(),kFALSE);
01096 if (kgo != 0){
01097 SetOption(kgo,chain);
01098 } else {
01099
01100 static const Char_t *path = ".:.$STAR_HOST_SYS/lib::.$STAR_HOST_SYS/LIB:$STAR/.$STAR_HOST_SYS/lib:$STAR/.$STAR_HOST_SYS/LIB";
01101 TString File = Tag; File += ".so";
01102 Char_t *file = gSystem->Which(path,File.Data(),kReadPermission);
01103 if (file) {
01104 TString Maker("");
01105 Bfc_st row = {"","","","","","","",kTRUE};
01106 memcpy (&row.Key, Tag.Data(), Tag.Length());
01107 if (Tag.Contains("Maker")) memcpy (&row.Maker, Tag.Data(), Tag.Length());
01108 memcpy (&row.Libs, Tag.Data(), Tag.Length());
01109 fchainOpt->AddAt(&row);
01110 fNoChainOptions = fchainOpt->GetNRows();
01111 fBFC = fchainOpt->GetTable();
01112 }
01113 kgo = kOpt(Tag.Data(),kFALSE);
01114 if (kgo != 0) {
01115 SetOption(kgo,chain);
01116 } else {
01117 gMessMgr->QAInfo() << " Invalid Option " << Tag.Data() << ". !! ABORT !! " << endm;
01118 abort();
01119 return;
01120 }
01121 }
01122 }
01123 }
01124 }
01125 }
01126 Opts.Delete();
01127 }
01128
01130 void StBFChain::SetOption(const Int_t k, const Char_t *chain) {
01131 if (k > 0) {
01132 assert(k<fNoChainOptions);
01133 Int_t n = strlen(fBFC[k].Opts);
01134 if (n > 0) SetOptions(fBFC[k].Opts,fBFC[k].Key);
01135 if (!fBFC[k].Flag) {
01136 fBFC[k].Flag = kTRUE;
01137 gMessMgr->QAInfo() << Form(" Switch On %20s by %s", fBFC[k].Key, chain) << endm;
01138 }
01139 } else {
01140 assert(-k<fNoChainOptions);
01141 if (k < 0 && fBFC[-k].Flag) {
01142 fBFC[-k].Flag = kFALSE;
01143 gMessMgr->QAInfo() << Form(" Switch Off %20s by %s", fBFC[-k].Key, chain) << endm;
01144 }
01145 }
01146 }
01147
01148
01150 Bool_t StBFChain::GetOption(const Int_t k) const
01151 {
01152 return (k>0 && k <fNoChainOptions) ? fBFC[k].Flag : kFALSE;
01153 }
01154
01156
01175 Char_t *StBFChain::GetOptionString(const Char_t *Opt)
01176 {
01177 int o = kOpt(Opt);
01178 if(!o) return NULL;
01179 else if(!GetOption(o)) return NULL;
01180 else return(fBFC[o].Comment);
01181 }
01182
01183
01184
01186
01213 void StBFChain::SetFlags(const Char_t *Chain)
01214 {
01215 TString tChain(Chain);
01216 Int_t mode = 1;
01217 Setup(mode);
01218 Int_t k=0;
01219 if (tChain == "" || tChain.CompareTo("ittf",TString::kIgnoreCase) == 0) {
01220 gMessMgr->QAInfo() << "\tPossible Chain Options are:" << endm;
01221 for (k=0;k<fNoChainOptions;k++)
01222 gMessMgr->QAInfo()
01223 << Form(" %3d: %-30s:%-12s:%-12s:%s:%s:%s:%s"
01224 ,k,fBFC[k].Key,fBFC[k].Name,fBFC[k].Chain,fBFC[k].Opts,fBFC[k].Maker,fBFC[k].Libs,fBFC[k].Comment)
01225 << endm;
01226
01227 return;
01228 }
01229 TString STAR_VERSION("$STAR_VERSION");
01230 gSystem->ExpandPathName(STAR_VERSION);
01231 gMessMgr->QAInfo() << "==============================================" << endm;
01232 gMessMgr->QAInfo() << "============= You are in " << STAR_VERSION.Data() << " ===============" << endm;
01233 gMessMgr->QAInfo() << "Requested chain " << GetName() << " is :\t" << tChain.Data() << endm;
01234 SetOptions(tChain,"Chain");
01235 if (!GetOption("NoDefault")) {
01236
01237 if (gClassTable->GetID("TGiant3") >= 0) {
01238 SetOption("-VMC","Default,TGiant3");
01239 SetOption("-VMCPassive","Default,TGiant3");
01240 SetOption("-VMCAppl","Default,TGiant3");
01241 SetOption("-RootVMC","Default,TGiant3");
01242 #if 1
01243 if (!( GetOption("fzin") || GetOption("ntin") || GetOption("gstar") || GetOption("PrepEmbed"))) {
01244 SetOption("geant","Default,-fzin,-ntin,-gstar,TGiant3");
01245 SetOption("MagF","Default,-fzin,-ntin,-gstar,TGiant3");
01246 }
01247 #endif
01248 } else {
01249 if (GetOption("fzin")) {
01250 gMessMgr->Error() << "Option fzin cannot be used in root.exe. Use root4star" << endm;
01251 abort();
01252 }
01253 if (GetOption("ntin")) {
01254 gMessMgr->Error() << "Option ntin cannot be used in root.exe. Use root4star" << endm;
01255 abort();
01256 }
01257 if (! (GetOption("Stv"))) {
01258 if (GetOption("gstar")) {
01259 SetOption("VMC","Default,-TGiant3,gstar");
01260 SetOption("-gstar","Default,-TGiant3");
01261 }
01262 }
01263 SetOption("-geant","Default,-TGiant3");
01264 SetOption("-geantL","Default,-TGiant3");
01265 SetOption("-geometry","Default,-TGiant3");
01266 SetOption("-geomNoField","Default,-TGiant3");
01267 if (! (GetOption("Stv"))) {
01268 if (! (GetOption("VMC") || GetOption("VMCPassive"))) {
01269 SetOption("VMCPassive","Default,-TGiant3");
01270 }
01271 SetOption("pgf77","Default,-TGiant3");
01272 SetOption("mysql","Default,-TGiant3");
01273 SetOption("minicern","Default,-TGiant3");
01274 }
01275 }
01276 if (GetOption("ITTF") && ! (GetOption("Sti") || GetOption("StiCA") || GetOption("Stv") || GetOption("StiVMC"))) {
01277 TString STAR_LEVEL(gSystem->Getenv("STAR_LEVEL"));
01278 if (STAR_LEVEL == ".DEV2") SetOption("StiCA","Default,ITTF");
01279 else SetOption("Sti" ,"Default,ITTF");
01280 }
01281 if (GetOption("Stv")) {
01282 SetOption("-TpcIT","Default,Stv");
01283 SetOption("-SvtIT","Default,Stv");
01284 SetOption("-SsdIT","Default,Stv");
01285 SetOption("-HpdIT","Default,Stv");
01286 SetOption("-BTofIT","Default,Stv");
01287 SetOption("-PixelIT","Default,Stv");
01288 SetOption("-IstIT","Default,Stv");
01289 }
01290
01291 }
01292 if (!GetOption("Eval") && GetOption("AllEvent")) SetOption("Eval","-Eval,AllEvent");
01293
01294 St_Bfc *Bfc = new St_Bfc("BFChain",fNoChainOptions);
01295 AddRunco(Bfc);
01296 for (k = 1; k<fNoChainOptions;k++) {
01297 if (GetOption(k)) {
01298 gMessMgr->QAInfo() << Form("================== %4d %15s\tis ON \t: %s",
01299 k, (char *) fBFC[k].Key, (char *) fBFC[k].Comment) << endm;
01300 Bfc->AddAt(&fBFC[k]);
01301 }
01302 }
01303
01304 }
01305
01306 void StBFChain::Set_IO_Files (const Char_t *infile, const Char_t *outfile){
01307 TString gc("");
01308 if (infile) {
01309 if (strlen(infile) > 2) {
01310 gc = TString(infile,3);
01311 gc.ToLower();
01312 }
01313 if (gc == "gc:") {SetGC(infile+3); goto SetOut;}
01314 }
01315 SetInputFile(infile);
01316 SetOut:
01317 if (! GetOption("NoOutput")) SetOutputFile(outfile);
01318 }
01319
01320 void StBFChain::SetGC (const Char_t *queue){
01321 TString Queue(queue);
01322 gMessMgr->QAInfo() << "Requested GC queue is :\t" << Queue.Data() << endm;
01323 TObjArray Opts;
01324 ParseString(Queue,Opts);
01325 TIter next(&Opts);
01326 TObjString *Opt;
01327 static TString ARGV[40];
01328 Int_t Argc = -1;
01329 while ((Opt = (TObjString *) next())) {
01330 TString string = Opt->GetString();
01331 const Char_t *argv = string.Data();
01332 if (argv[0] == '-') {
01333 switch (argv[1]) {
01334 case 'o':
01335 case 'i':
01336 case 'c':
01337 case 'q':
01338 case 's':
01339 case 'n':
01340 case 'm':
01341 case 't':
01342 case '-':
01343 ARGV[++Argc] = string.Data();
01344 Argc++;
01345 break;
01346 default :
01347 gMessMgr->QAInfo() << "Unrecognized option :\t" << string << endm;
01348 break;
01349 }
01350 }
01351 else if (Argc > 0) {ARGV[Argc] += " "; ARGV[Argc] += string;}
01352 }
01353 Opts.Delete();
01354 fSetFiles = (StFileI *)StChallenger::Challenge();
01355 fSetFiles->SetDebug();
01356 Argc++;
01357 Char_t **Argv = new Char_t* [Argc];
01358 for (int i=0;i<Argc;i++) {Argv[i] = (Char_t *) ARGV[i].Data();}
01359 fSetFiles->Init(Argc,(const Char_t **) Argv);
01360 }
01361
01362 void StBFChain::SetInputFile (const Char_t *infile){
01363
01364 if (infile) fInFile = infile;
01365 if (fInFile != "") {
01366 fInFile.ReplaceAll("\n",";");
01367 gMessMgr->QAInfo() << "Input file name = " << fInFile.Data() << endm;
01368 } else {
01369 if (fkChain >= 0) {
01370 fInFile = fBFC[fkChain].Comment;
01371 fInFile.ReplaceAll("\n",";");
01372 gMessMgr->QAInfo() << "Default Input file name = " << fInFile.Data() << " for chain : " << fBFC[fkChain].Key << endm;
01373 }
01374 }
01375 if (fInFile == "") {SetOption("-in","No Input File"); SetOption("-InTree","NoInput File"); return;}
01376 if (!GetOption("fzin") && !GetOption("ntin")) {
01377 fSetFiles= new StFile();
01378 TObjArray Files;
01379 ParseString(fInFile,Files);
01380 TIter next(&Files);
01381 TObjString *File;
01382 while ((File = (TObjString *) next())) {
01383 TString string = File->GetString();
01384 if (!string.Contains("*") && ! string.BeginsWith("@") &&
01385 gSystem->AccessPathName(string.Data())) {
01386 gMessMgr->Error() << "StBFChain::SetInputFile *** NO FILE: " << string.Data() << ", exit!" << endm;
01387 gSystem->Exit(1);
01388 }
01389 else fSetFiles->AddFile(File->String().Data());
01390 }
01391 Files.Delete();
01392 }
01393 }
01394
01396 void StBFChain::SetOutputFile (const Char_t *outfile){
01397 if ( GetOption("NoOutput")) return;
01398 if (outfile) fFileOut = outfile;
01399 else {
01400 if (GetOption("gstar")) fFileOut = "gtrack.root";
01401 if (GetOption("VMC")) fFileOut = "VMC.root";
01402 if (fInFile != "") {
01403 if (GetOption("fzin") || GetOption("ntin")) {
01404 TObjArray words;
01405 ParseString(fInFile,words);
01406 TIter nextL(&words);
01407 TObjString *word = 0;
01408 while ((word = (TObjString *) nextL())) {
01409 if (word->GetString().Contains(".fz") ||
01410 word->GetString().Contains(".nt")) {
01411 fFileOut = gSystem->BaseName(word->GetName());
01412 break;
01413 }
01414 }
01415 }
01416 else fFileOut = gSystem->BaseName(fInFile.Data());
01417 if ( fFileOut != "") {
01418 fFileOut.ReplaceAll("*","");
01419 fFileOut.ReplaceAll("@","");
01420 fFileOut.ReplaceAll("..",".");
01421 fFileOut.ReplaceAll(".daq","");
01422 fFileOut.ReplaceAll(".fzd","");
01423 fFileOut.ReplaceAll(".fz","");
01424 fFileOut.ReplaceAll(".nt","");
01425 fFileOut.ReplaceAll(".root","");
01426 fFileOut.ReplaceAll(".list","");
01427 fFileOut.ReplaceAll(".lis","");
01428 fFileOut.Strip();
01429 fFileOut.Append(".root");
01430 }
01431 }
01432 }
01433 if (fFileOut != "") gMessMgr->QAInfo() << "Output root file name " << fFileOut.Data() << endm;
01434 else SetOption("NoOutput","No Output File");
01435 if (!GetTFile()) {
01436
01437
01438
01439
01440
01441
01442 if ( ( GetOption("tags") || GetOption("lana") ) && (fFileOut != "") ){
01443 TString TagsName = fFileOut;
01444 if( GetOption("lana") ){
01445 TagsName.ReplaceAll(".root",".laser.root");
01446 } else {
01447 TagsName.ReplaceAll(".root",".tags.root");
01448 }
01449 SetTFile(new TFile(TagsName.Data(),"RECREATE"));
01450 }
01451 }
01452
01453 }
01454
01455
01456
01457
01459
01465 void StBFChain::SetGeantOptions(StMaker *geantMk){
01466 if (geantMk && geantMk->InheritsFrom("St_geant_Maker")) {
01467 SetInput("geant",".make/geant/.data");
01468 TString GeomVersion("");
01469 if (!GetOption("fzin") || GetOption("ForceGeometry")) {
01470 GeomVersion = "y2004x";
01471 const DbAlias_t *DbAlias = GetDbAliases();
01472 Int_t found = 0;
01473 for (Int_t i = 0; DbAlias[i].tag; i++) {
01474 TString r("r");
01475 r += DbAlias[i].tag;
01476 if ( !GetOption(DbAlias[i].tag,kFALSE) && !GetOption(r,kFALSE)) continue;
01477 GeomVersion = DbAlias[i].geometry;
01478 found = i;
01479 break;
01480 }
01481 if (! found) gMessMgr->QAInfo() << "StBFChain::SetGeantOptions() Chain has not found geometry tag. Use " << GeomVersion << endm;
01482 TString GeometryOpt("detp geometry ");
01483 GeometryOpt += GeomVersion;
01484 if (GetOption("phys_off")) GeometryOpt += " phys_off=1";
01485 if (GetOption("hadr_off")) GeometryOpt += " hadr_off=1";
01486 ProcessLine(Form("((St_geant_Maker *) %p)->LoadGeometry(\"%s\");",geantMk,GeometryOpt.Data()));
01487 }
01488 if ((GetOption("fzin") || GetOption("ntin") || GetOption("mtin")) && fInFile != "")
01489 ProcessLine(Form("((St_geant_Maker *) %p)->SetInputFile(\"%s\")",geantMk,fInFile.Data()));
01490 }
01491 }
01492
01494
01506 void StBFChain::SetDbOptions(StMaker *mk){
01507 if (! mk ) return;
01508 if (GetOption("AgML") ) mk->SetAlias("VmcGeometry","db/.const/StarDb/AgMLGeometry");
01509 else if (GetOption("VmcGeo")) mk->SetAlias("VmcGeometry","db/.const/StarDb/VmcGeo");
01510 else mk->SetAlias("VmcGeometry","db/.const/StarDb/AgiGeometry");
01511 Int_t i;
01512 Int_t Idate=0,Itime=0;
01513
01514
01515 for (i = 1; i < fNoChainOptions; i++) {
01516 if (fBFC[i].Flag && !strncmp(fBFC[i].Key ,"DbV",3)){
01517
01518
01519
01520 gMessMgr->QAInfo() << "StBFChain::SetDbOptions Found time-stamp " << fBFC[i].Key << " [" << fBFC[i].Comment << "]" << endm;
01521 (void) sscanf(fBFC[i].Comment,"%d/%d",&Idate,&Itime);
01522 }
01523 }
01524
01525
01526
01527 if( ! Idate && FDate){
01528 gMessMgr->QAInfo() << "StBFChain::SetDbOptions Switching to user chosen dynamic time-stamp (MaxEntry) "
01529 << FDate << " " << FTime << endm;
01530 gMessMgr->QAInfo() << "Chain may crash if time-stamp is not validated by db interface" << endm;
01531
01532 Idate = FDate;
01533 Itime = FTime;
01534 }
01535
01536 St_db_Maker *db = (St_db_Maker *) mk;
01537
01538 if (FDateS){
01539 gMessMgr->QAInfo() << "StBFChain::SetDbOptions Switching to user chosen dynamic time-stamp (Start)"
01540 << FDateS << " " << FTimeS << endm;
01541 gMessMgr->QAInfo() << "Chain may crash if time-stamp is not validated by db interface" << endm;
01542
01543 db->SetDateTime(FDateS,FTimeS);
01544 } else {
01545 if (! GetOption("mtin")) {
01546 const DbAlias_t *DbAlias = GetDbAliases();
01547 Int_t found = 0;
01548 for (Int_t i = 0; DbAlias[i].tag; i++) {
01549 if (GetOption(DbAlias[i].tag,kFALSE)) {
01550 db->SetDateTime(DbAlias[i].tag);
01551 found = i;
01552 break;
01553 }
01554 }
01555 if (! found) {gMessMgr->QAInfo() << "StBFChain::SetDbOptions() Chain has not set a time-stamp" << endm;}
01556
01557 gMessMgr->QAInfo() << db->GetName()
01558 << " Maker set time = "
01559 << db->GetDateTime().GetDate() << "."
01560 << db->GetDateTime().GetTime() << endm;
01561 if (GetOption("SIMU") && m_EvtHddr) {
01562 gMessMgr->QAInfo() << GetName() << " Chain set time from " << db->GetName() << endm;
01563 m_EvtHddr->SetDateTime(db->GetDateTime());
01564 }
01565 }
01566 }
01567
01568
01569 if (Idate) {
01570 db->SetMaxEntryTime(Idate,Itime);
01571 gMessMgr->Info() << "\tSet DataBase max entry time " << Idate << "/" << Itime
01572 << " for St_db_Maker(\"" << db->GetName() <<"\")" << endm;
01573 }
01574
01575
01576
01577
01578 TString realm;
01579 for (unsigned int i = 0; i < GTSOptions.size() ; i++){
01580 if ( (GTSOptions[i].Realm).IsNull() ){ realm = "*";}
01581 else { realm = GTSOptions[i].Realm;}
01582
01583
01584
01585
01586 if ( GTSOptions[i].Type == 1){
01587 db->AddMaxEntryTimeOverride(GTSOptions[i].Date,0,
01588 (char *) realm.Data(),
01589 (char *) GTSOptions[i].Detector.Data());
01590
01591 LOG_INFO << "Recovering override stamp " << i << " :: "
01592 << GTSOptions[i].Detector << ", " << realm << ", "
01593 << GTSOptions[i].Date << ", " << GTSOptions[i].Time << endm;
01594 } else {
01595 LOG_WARN << "Found override type " << GTSOptions[i].Type << " no treated yet"
01596 << GTSOptions[i].Detector << ", " << realm << ", "
01597 << GTSOptions[i].Date << ", " << GTSOptions[i].Time << endm;
01598 }
01599 }
01600
01601
01602
01603
01604 if (!GetOption("fzin")) {
01605 struct Field_t {
01606 const Char_t *name;
01607 Float_t scale;
01608 };
01609 Field_t FieldOptions[5] = {
01610 {"FullMagFNegative", -1.0},
01611 {"FullMagFPositive", 1.0},
01612 {"HalfMagFNegative", -0.5},
01613 {"HalfMagFPositive", 0.5},
01614 {"ZeroMagF", 0.0}
01615 };
01616 Int_t k = -1;
01617 if (GetOption("FieldON")) {
01618 if (GetOption("ReverseField")) k = 0;
01619 else k = 1;
01620 } else if (GetOption("HalfField")) {
01621 if (GetOption("ReverseField")) k = 2;
01622 else k = 3;
01623 } else if (GetOption("FieldOff")) k = 4;
01624 if (k >= 0) {
01625 SetFlavor(FieldOptions[k].name, "MagFactor");
01626 gMessMgr->QAInfo() << "StBFChain::SetDbOptions SetFlavor(\"" << FieldOptions[k].name
01627 << "\",\"MagFactor\")" << endm;
01628 if ( gClassTable->GetID("StarMagField") >= 0 && gClassTable->GetID("StMagFMaker") < 0) {
01629 TString cmd =
01630 Form("if (!StarMagField::Instance()) new StarMagField( 2, %f, kTRUE);",
01631 FieldOptions[k].scale);
01632 ProcessLine(cmd);
01633 }
01634 }
01635 }
01636 if (this == GetTopChain()) {
01637
01638 if (! GetOption("TpcDb") ) {mk->SetAttr("blacklist", "tpc"); gMessMgr->QAInfo() << "blacklist tpc" << endm;}
01639 if (! GetOption("SvtDb")||!GetOption("SvtCalDb")) {mk->SetAttr("blacklist", "svt"); gMessMgr->QAInfo() << "blacklist svt" << endm;}
01640 if (! GetOption("SsdDb")||!GetOption("SsdCalDb")) {mk->SetAttr("blacklist", "ssd"); gMessMgr->QAInfo() << "blacklist ssd" << endm;}
01641 if (! GetOption("EemcDb") ) {mk->SetAttr("blacklist", "eemc"); gMessMgr->QAInfo() << "blacklist eemc"<< endm;}
01642 if (! GetOption("FmsDb") ) {mk->SetAttr("blacklist", "fms"); gMessMgr->QAInfo() << "blacklist fms" << endm;}
01643 }
01644 }
01645
01647 void StBFChain::SetTreeOptions()
01648 {
01649
01650 StTreeMaker *treeMk = (StTreeMaker *) GetMaker("outputStream");
01651 if (!treeMk) return;
01652 if (GetOption("EvOut")){
01653 gMessMgr->QAInfo() << "Will Write StEvent out, treeMk->GetFile() = " << treeMk->GetFile() << endm;
01654 treeMk->IntoBranch("eventBranch","StEvent");
01655 if (GetOption("EvOutOnly")) return;
01656 }
01657 if (! GetOption("nohistos")) treeMk->SetBranch("histBranch");
01658 if (! GetOption("norunco")) treeMk->SetBranch("runcoBranch");
01659 if (GetOption("McEvent") && GetOption("McEvOut")){
01660 gMessMgr->QAInfo() << "Will Write StMcEvent out, treeMk->GetFile() = " << treeMk->GetFile() << endm;
01661 treeMk->IntoBranch("McEventBranch","StMcEvent");
01662 }
01663 if (GetOption("GeantOut")) treeMk->IntoBranch("geantBranch","geant");
01664 if (GetOption("AllEvent")) {
01665 if (GetOption("fzin") || GetOption("ntin") || GetOption("gstar") || GetOption("VMC") || GetOption("PrepEmbed") ) {
01666 treeMk->IntoBranch("geantBranch","geant");
01667 treeMk->IntoBranch("geantBranch","geant/.data/particle");
01668 treeMk->IntoBranch("geantBranch","geant/.data/g2t_rch_hit");
01669 }
01670 }
01671 }
01672
01673 Long_t StBFChain::ProcessLine(const char *line) {
01674 if (! line || !strlen(line)) return -1;
01675 if (Debug()) gMessMgr->QAInfo() << "ProcessLine " << line << endm;
01676 TInterpreter::EErrorCode error = TInterpreter::kNoError;
01677 Long_t res = gInterpreter->ProcessLine(line, &error);
01678 if (error != TInterpreter::kNoError) {
01679 gMessMgr->Error() << "StBFChain::ProcessLine command:" << line << " has failed. Quit job." << endm;
01680 gSystem->Exit(1);
01681 }
01682 return res;
01683 }
01684
01685 TString StBFChain::GetGeometry() const
01686 {
01687 int n = fchainOpt->GetNRows();
01688 for (int i=0;i<n;i++) {
01689 if (!fchainOpt->GetTable()[i].Flag) continue;
01690 TString k(fchainOpt->GetTable()[i].Key);
01691 k.ToLower();
01692 if (k[0]!='y') continue;
01693 if (k[1]!='2') continue;
01694 if (k[2] <'0' || k[2]>'9') continue;
01695 if (k[3] <'0' || k[3]>'9') continue;
01696 if (k[4] <'0' || k[4]>'9') continue;
01697 return k;
01698 }
01699 return TString("");
01700 }
01701