00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "TGo4AnalysisStepManager.h"
00017
00018 #include <iostream.h>
00019
00020 #include "Go4Analysis/TGo4AnalysisStepException.h"
00021 #include "Go4StatusAnalysis/TGo4AnalysisStatus.h"
00022 #include "Go4Analysis/TGo4AnalysisImp.h"
00023 #include "Go4Event/TGo4EventErrorException.h"
00024 #include "Go4Event/TGo4EventTimeoutException.h"
00025 #include "Go4Event/TGo4CompositeEvent.h"
00026 #include "Go4EventServer/TGo4BackStore.h"
00027
00028
00029 TGo4AnalysisStepManager::TGo4AnalysisStepManager()
00030 : TNamed("Go4StepManager","The Go4 Analysis Step Manager"),
00031 fiFirstStepIndex(0), fiLastStepIndex(0), fiCurrentStepIndex(0),
00032 fbStepCheckingMode(kTRUE),
00033 fxCurrentStep(0),fxOutputEvent(0)
00034 {
00035 fxStepList=new TObjArray;
00036 fxStepMutex=new TMutex(kTRUE);
00037 fxStepIterator = fxStepList->MakeIterator();
00038
00039 }
00040
00041 TGo4AnalysisStepManager::TGo4AnalysisStepManager(const Text_t* name)
00042 :TNamed(name,"The Go4 Analysis Step Manager"),
00043 fiFirstStepIndex(0), fiLastStepIndex(0), fiCurrentStepIndex(0),
00044 fbStepCheckingMode(kTRUE),
00045 fxCurrentStep(0),fxOutputEvent(0)
00046 {
00047 fxStepList=new TObjArray;
00048 fxStepMutex=new TMutex(kTRUE);
00049 fxStepIterator = fxStepList->MakeIterator();
00050
00051 }
00052
00053 TGo4AnalysisStepManager::~TGo4AnalysisStepManager()
00054 {
00055 delete fxStepMutex;
00056 delete fxStepIterator;
00057 delete fxStepList;
00058 }
00059
00060
00061
00062 void TGo4AnalysisStepManager::CloseAnalysis()
00063 {
00064 TRACE((14,"TGo4AnalysisStepManager::CloseAnalysis()",__LINE__, __FILE__));
00065
00066 TGo4Analysis::Instance()->Message(0,"Analysis Step Manager -- Closing Analysis Steps...");
00067 TGo4AnalysisStep* step=0;
00068 {
00069
00070 fxStepIterator->Reset();
00071 while((step= dynamic_cast<TGo4AnalysisStep*>( fxStepIterator->Next() ) ) !=0)
00072 {
00073 step->Close();
00074 }
00075 }
00076 TGo4Analysis::Instance()->Message(-1,"Analysis Step Manager -- Analysis Steps were closed.");
00077 }
00078
00079 Bool_t TGo4AnalysisStepManager::InitEventClasses()
00080 {
00081 TRACE((14,"TGo4AnalysisStepManager::InitEventClasses()",__LINE__, __FILE__));
00082
00083 Bool_t rev=kTRUE;
00084 Bool_t firststepfound=kFALSE;
00085 Bool_t laststepfound=kFALSE;
00086 TGo4Analysis::Instance()->Message(0,"Analysis StepManager -- Initializing EventClasses...");
00087 TGo4AnalysisStep* step=0;
00088 {
00089
00090 fxStepIterator->Reset();
00091 fiCurrentStepIndex=0;
00092
00093 while((step= dynamic_cast<TGo4AnalysisStep*>( fxStepIterator->Next() ) ) !=0)
00094 {
00095 step->InitEventClasses();
00096
00097
00098 if(firststepfound)
00099 {
00100 if((IsStepChecking() && step->IsProcessEnabled())
00101 || !IsStepChecking())
00102 {
00103 fiLastStepIndex=fiCurrentStepIndex;
00104 laststepfound=kTRUE;
00105 }
00106 }
00107
00108
00109 if(!firststepfound)
00110 {
00111 if((IsStepChecking() && step->IsProcessEnabled())
00112 || !IsStepChecking())
00113 {
00114 fiFirstStepIndex=fiCurrentStepIndex;
00115 firststepfound=kTRUE;
00116 }
00117 }
00118 fiCurrentStepIndex++;
00119 }
00120 if(!laststepfound) fiLastStepIndex=fiFirstStepIndex;
00121
00122 if(IsStepChecking())
00123 {
00124
00125 fxStepIterator->Reset();
00126 fiCurrentStepIndex=0;
00127 while((step= dynamic_cast<TGo4AnalysisStep*>( fxStepIterator->Next() ) ) !=0)
00128 {
00129
00130 if(! step->IsMatchingPrevious() )
00131 {
00132 rev=kFALSE;
00133 TGo4Analysis::Instance()->Message(3,"!!! AnalysisStepManager -- ERROR: step %s is not matching previous !!!",
00134 step->GetName() );
00135 break;
00136 }
00137 else
00138 {
00139 rev=kTRUE;
00140 }
00141 }
00142 }
00143 }
00144 TGo4Analysis::Instance()->Message(-1,"AnalysisStepManager -- Initializing EventClasses done.");
00145 return rev;
00146 }
00147 Bool_t TGo4AnalysisStepManager::SetFirstStep(const Text_t* name)
00148 {
00149 TRACE((12,"TGo4AnalysisStepManager::SetFirstStep(const Text_t*)",__LINE__, __FILE__));
00150
00151 Bool_t result=kFALSE;
00152 if(name==0)
00153 {
00154
00155 fiFirstStepIndex=0;
00156 TGo4Analysis::Instance()->Message(0,"Analysis: Setting first step to beginning of steplist");
00157 result=kTRUE;
00158 }
00159 else
00160 {
00161 TObject* obj=fxStepList->FindObject(name);
00162 if(obj==0)
00163 {
00164 result=kFALSE;
00165 TGo4Analysis::Instance()->Message(3,"!!! Analysis: SetFirstStep ERROR - no such step %s",
00166 name);
00167 }
00168 else
00169 {
00170 Int_t ix=fxStepList->IndexOf(obj);
00171 if(ix <= fiLastStepIndex)
00172 {
00173 fiFirstStepIndex=ix;
00174 TGo4Analysis::Instance()->Message(0,"Analysis: Setting first step to %s",
00175 name);
00176 }
00177 else
00178 {
00179 fiFirstStepIndex=fiLastStepIndex;
00180 TGo4Analysis::Instance()->Message(0,"Analysis: Range WARNING - Setting first step to last step");
00181 }
00182
00183 result=kTRUE;
00184 }
00185
00186 }
00187 return result;
00188 }
00189 Bool_t TGo4AnalysisStepManager::SetLastStep(const Text_t* name)
00190 {
00191 TRACE((12,"TGo4AnalysisStepManager::SetLastStep(Text_t*)",__LINE__, __FILE__));
00192
00193 Bool_t result=kTRUE;
00194 if(name==0)
00195 {
00196
00197 fiLastStepIndex=fxStepList->GetLast() ;
00198 if(fiLastStepIndex<0)
00199 fiLastStepIndex=0;
00200 TGo4Analysis::Instance()->Message(0,"Analysis: Setting last step to end of steplist");
00201
00202 result=kTRUE;
00203 }
00204 else
00205 {
00206 TObject* obj=fxStepList->FindObject(name);
00207 if(obj==0)
00208 {
00209 result=kFALSE;
00210 TGo4Analysis::Instance()->Message(3,"!!! Analysis: SetLastStep ERROR - no such step %s",
00211 name);
00212
00213 }
00214 else
00215 {
00216 Int_t ix=fxStepList->IndexOf(obj);
00217 if(ix >= fiFirstStepIndex)
00218 {
00219 fiLastStepIndex=ix;
00220 TGo4Analysis::Instance()->Message(0,"Analysis: Setting last step to %s",
00221 name);
00222 }
00223 else
00224 {
00225 fiLastStepIndex=fiFirstStepIndex;
00226 TGo4Analysis::Instance()->Message(0," Analysis: Range WARNING - Setting last step to first step");
00227
00228 }
00229
00230
00231 result=kTRUE;
00232 }
00233
00234
00235 }
00236 return result;
00237 }
00238 Bool_t TGo4AnalysisStepManager::SetStepStorage(const Text_t* name, Bool_t on)
00239 {
00240 TRACE((12,"TGo4AnalysisStepManager::SetStepStorage(Text_t*,Bool_t)",__LINE__, __FILE__));
00241 Bool_t result=kFALSE;
00242 TGo4AnalysisStep* step=GetAnalysisStep(name);
00243 if(step)
00244 {
00245 step->SetStoreEnabled(on);
00246 result=kTRUE;
00247 }
00248 else
00249 {
00250 result=kFALSE;
00251 }
00252
00253 return result;
00254
00255 }
00256 Bool_t TGo4AnalysisStepManager::NewStepStore(const Text_t * name, TGo4EventStoreParameter* par)
00257 {
00258 TRACE((12,"TGo4AnalysisStepManager::NewStepStore(Text_t *, TGo4EventStoreParameter*)",__LINE__, __FILE__));
00259 Bool_t result=kFALSE;
00260 TGo4AnalysisStep* step=0;
00261 if(name==0)
00262 {
00263
00264 step=dynamic_cast<TGo4AnalysisStep*> (fxStepList->At(fiLastStepIndex));
00265 }
00266 else
00267 {
00268
00269 step=GetAnalysisStep(name);
00270 }
00271 if(step)
00272 {
00273
00274 step->NewEventStore(par);
00275 result=kTRUE;
00276 }
00277 else
00278 {
00279 result=kFALSE;
00280 }
00281
00282 return result;
00283
00284 }
00285 Bool_t TGo4AnalysisStepManager::NewStepSource(const Text_t * name, TGo4EventSourceParameter * par)
00286 {
00287 TRACE((12,"TGo4AnalysisStepManager::NewStepSource(const Text_t *, TGo4EventSourceParameter *)",__LINE__, __FILE__));
00288 Bool_t result=kFALSE;
00289 TGo4AnalysisStep* step=0;
00290 if(name==0)
00291 {
00292
00293 step=dynamic_cast<TGo4AnalysisStep*> (fxStepList->At(fiFirstStepIndex));
00294
00295 }
00296 else
00297 {
00298
00299 step=GetAnalysisStep(name);
00300
00301 }
00302 if(step)
00303 {
00304
00305 step->NewEventSource(par);
00306 result=kTRUE;
00307
00308 }
00309 else
00310 {
00311 result=kFALSE;
00312
00313 }
00314 return result;
00315 }
00316
00317 Bool_t TGo4AnalysisStepManager::NewStepProcessor(const Text_t * name, TGo4EventProcessorParameter * par)
00318 {
00319 TRACE((12,"TGo4AnalysisStepManager::NewStepProcessor(const Text_t *, TGo4EventProcessorParameter *)",__LINE__, __FILE__));
00320 Bool_t result=kFALSE;
00321 TGo4AnalysisStep* step=GetAnalysisStep(name);
00322 if(step)
00323 {
00324
00325 step->NewEventProcessor(par);
00326 result=kTRUE;
00327 }
00328 else
00329 {
00330 result=kFALSE;
00331 }
00332 return result;
00333 }
00334
00335
00336 Int_t TGo4AnalysisStepManager::Store(const Text_t * name, TGo4Parameter* par)
00337 {
00338 TGo4AnalysisStep* step=GetAnalysisStep(name);
00339 if(step)
00340 return(step->Store(par));
00341 else
00342 return 1;
00343 }
00344
00345 Int_t TGo4AnalysisStepManager::Store(const Text_t * name, TGo4Condition* con)
00346 {
00347 TGo4AnalysisStep* step=GetAnalysisStep(name);
00348 if(step)
00349 return(step->Store(con));
00350 else
00351 return 1;
00352 }
00353
00354 Int_t TGo4AnalysisStepManager::Store(const Text_t * name, TGo4Fitter* fit)
00355 {
00356 TGo4AnalysisStep* step=GetAnalysisStep(name);
00357 if(step)
00358 return(step->Store(fit));
00359 else
00360 return 1;
00361 }
00362
00363 Int_t TGo4AnalysisStepManager::Store(const Text_t * name, TFolder* folder)
00364 {
00365 TGo4AnalysisStep* step=GetAnalysisStep(name);
00366 if(step)
00367 return(step->Store(folder));
00368 else
00369 return 1;
00370 }
00371
00372
00373
00374
00375
00376 TGo4EventElement* TGo4AnalysisStepManager::GetInputEvent(const char* stepname)
00377 {
00378 TRACE((11,"TGo4AnalysisStepManager::GetInputEvent(Int_t)",__LINE__, __FILE__));
00379 TGo4EventElement* rev=0;
00380 TGo4AnalysisStep* step=GetAnalysisStep(stepname);
00381 if(step)
00382 {
00383 TGo4EventProcessor* pro=step->GetEventProcessor();
00384 if(pro)
00385 rev=pro->GetInputEvent();
00386 }
00387 else
00388 {
00389 rev=0;
00390 }
00391 return rev;
00392 }
00393 TGo4EventElement* TGo4AnalysisStepManager::GetInputEvent(Int_t stepindex)
00394 {
00395 TRACE((11,"TGo4AnalysisStepManager::GetInputEvent(Int_t)",__LINE__, __FILE__));
00396 TGo4EventElement* rev=0;
00397 TGo4AnalysisStep* step=0;
00398 step= dynamic_cast<TGo4AnalysisStep*> (fxStepList->At(stepindex) );
00399 if(step)
00400 {
00401 TGo4EventProcessor* pro=step->GetEventProcessor();
00402 if(pro)
00403 rev=pro->GetInputEvent();
00404
00405 }
00406 else
00407 {
00408 rev=0;
00409 }
00410 return rev;
00411 }
00412
00413 TGo4EventElement* TGo4AnalysisStepManager::GetOutputEvent(const char* stepname)
00414 {
00415 TRACE((11,"TGo4AnalysisStepManager::GetOutputEvent(const char*)",__LINE__, __FILE__));
00416 TGo4EventElement* rev=0;
00417 TGo4AnalysisStep* step=GetAnalysisStep(stepname);
00418 if(step)
00419 {
00420 rev=step->GetOutputEvent();
00421 }
00422 else
00423 {
00424 rev=0;
00425 }
00426 return rev;
00427 }
00428 TGo4EventElement* TGo4AnalysisStepManager::GetOutputEvent(Int_t stepindex)
00429 {
00430 TRACE((11,"TGo4AnalysisStepManager::GetOutputEvent(Int_t)",__LINE__, __FILE__));
00431 TGo4EventElement* rev=0;
00432 TGo4AnalysisStep* step=0;
00433 step= dynamic_cast<TGo4AnalysisStep*> ( fxStepList->At(stepindex) );
00434 if(step)
00435 {
00436 rev=step->GetOutputEvent();
00437 }
00438 else
00439 {
00440 rev=0;
00441 }
00442 return rev;
00443 }
00444
00445 Bool_t TGo4AnalysisStepManager::AddAnalysisStep(TGo4AnalysisStep* next)
00446 {
00447 TRACE((14,"TGo4AnalysisStepManager::AddAnalysisStep(TGo4AnalysisStep*)",__LINE__, __FILE__));
00448
00449 Bool_t rev=kFALSE;
00450 if(next)
00451 {
00452
00453 if(fxStepList->FindObject(next)==0)
00454
00455 {
00456
00457 TRACE((12,"TGo4AnalysisStepManager::AddAnalysisStep -- Adding new analysis step",__LINE__, __FILE__));
00458 fxStepList->AddLast(next);
00459
00460 Int_t ix=fxStepList->IndexOf(next);
00461 if(ix>0)
00462 {
00463 TGo4AnalysisStep* previous= dynamic_cast<TGo4AnalysisStep*> ( fxStepList->At(ix-1) );
00464 next->SetPreviousStep(previous);
00465 }
00466 else
00467 {
00468 next->SetPreviousStep(0);
00469 }
00470 fiLastStepIndex=ix;
00471 rev=kTRUE;
00472 TGo4Analysis::Instance()->Message(-1,"Analysis: Added analysis step %s",
00473 next->GetName());
00474 }
00475 else
00476 {
00477
00478 TRACE((12,"TGo4AnalysisStepManager::AddAnalysisStep -- Analysis step was already there",__LINE__, __FILE__));
00479 rev=kFALSE;
00480 TGo4Analysis::Instance()->Message(-1,"Analysis: WARNING - analysis step %s was already in steplist",
00481 next->GetName() );
00482 }
00483 }
00484 else
00485 {
00486 TRACE((12,"TGo4AnalysisStepManager::AddAnalysisStep -- Zero Analysis step pointer",__LINE__, __FILE__));
00487 rev=kFALSE;
00488 TGo4Analysis::Instance()->Message(-1,"Analysis: WARNING - did not add zero analysis step pointer to steplist");
00489 }
00490 return rev;
00491 }
00492
00493 TGo4AnalysisStep * TGo4AnalysisStepManager::GetAnalysisStep(const char* name)
00494 {
00495 TRACE((11,"TGo4AnalysisStepManager::GetAnalysisStep(Text_t *)",__LINE__, __FILE__));
00496 TGo4AnalysisStep* step=0;
00497 {
00498
00499 step = dynamic_cast<TGo4AnalysisStep*>( fxStepList->FindObject(name) );
00500 }
00501 return step;
00502 }
00503
00504 Int_t TGo4AnalysisStepManager::ProcessAnalysisSteps()
00505 {
00506 TRACE((11,"TGo4AnalysisStepManager::ProcessAnalysisSteps()",__LINE__, __FILE__));
00507
00508 Int_t rev=0;
00509 fxCurrentStep=0;
00510 fiCurrentStepIndex=0;
00511 Bool_t isfirststep=kTRUE;
00512 SetOutputEvent(0);
00513 {
00514
00515 for(fiCurrentStepIndex=fiFirstStepIndex; fiCurrentStepIndex<=fiLastStepIndex;fiCurrentStepIndex++)
00516 {
00517 fxCurrentStep=dynamic_cast<TGo4AnalysisStep*>(fxStepList->UncheckedAt(fiCurrentStepIndex));
00518 if(fxCurrentStep==0) break;
00519 if(IsStepChecking() && isfirststep )
00520 {
00521
00522 isfirststep=kFALSE;
00523 if(fxCurrentStep->IsSourceImplemented())
00524 {
00525 fxCurrentStep->SetSourceEnabled();
00526 }
00527 else
00528 {
00529 fxCurrentStep->SetStatusMessage("!!! No Event Source for first analysis step !!!");
00530 throw TGo4AnalysisStepException(fxCurrentStep);
00531 }
00532 } else { }
00533 fxCurrentStep->Process();
00534 }
00535 }
00536
00537 if(TGo4MainTree::Exists()) TGo4MainTree::Instance()->Update();
00538 return rev;
00539 }
00540
00541
00542 void TGo4AnalysisStepManager::UpdateStatus(TGo4AnalysisStatus* state)
00543 {
00544 TRACE((11,"TGo4AnalysisStepManager::UpdateStatus(TGo4AnalysisStatus*)",__LINE__, __FILE__));
00545 if(state!=0)
00546 {
00547 state->SetFirstStepIndex(fiFirstStepIndex);
00548 state->SetLastStepIndex(fiLastStepIndex);
00549 state->SetStepChecking(fbStepCheckingMode);
00550 {
00551
00552 fxCurrentStep=0;
00553 fxStepIterator->Reset();
00554 while((fxCurrentStep= dynamic_cast<TGo4AnalysisStep*>( fxStepIterator->Next() ) ) !=0)
00555 {
00556 TGo4AnalysisStepStatus* stepstate= fxCurrentStep->CreateStatus();
00557 state->AddStepStatus(stepstate);
00558 }
00559 }
00560 }
00561 else
00562 {
00563
00564 }
00565
00566 }
00567
00568 void TGo4AnalysisStepManager::SetStatus(TGo4AnalysisStatus * state)
00569 {
00570 TRACE((11,"TGo4AnalysisStepManager::SetStatus(TGo4AnalysisStatus*)",__LINE__, __FILE__));
00571 if(state!=0)
00572 {
00573 fiFirstStepIndex=state->GetFirstStepIndex();
00574 fiLastStepIndex=state->GetLastStepIndex();
00575 fbStepCheckingMode=state->IsStepChecking();
00576
00577
00578
00579 {
00580
00581 fxCurrentStep=0;
00582 fxStepIterator->Reset();
00583 while((fxCurrentStep= dynamic_cast<TGo4AnalysisStep*>( fxStepIterator->Next() ) ) !=0)
00584 {
00585 const Text_t* name= fxCurrentStep->GetName();
00586 TGo4AnalysisStepStatus* stepstate= state->GetStepStatus(name);
00587 fxCurrentStep->SetStatus(stepstate);
00588
00589 }
00590 }
00591 }
00592 else
00593 {
00594
00595 }
00596 }
00597
00598 void TGo4AnalysisStepManager::AutoSave()
00599 {
00600 TRACE((12,"TGo4AnalysisStepManager::AutoSave()",__LINE__, __FILE__));
00601
00602
00603 TGo4Analysis::Instance()->Message(0,"Analysis Step Manager -- AutoSaving....");
00604 TGo4AnalysisStep* step=0;
00605 {
00606
00607 fxStepIterator->Reset();
00608 while((step= dynamic_cast<TGo4AnalysisStep*>( fxStepIterator->Next() ) ) !=0)
00609 {
00610 step->StoreCalibration();
00611 }
00612 }
00613
00614
00615 if(TGo4MainTree::Exists())
00616 {
00617 TGo4MainTree::Instance()->Write();
00618 } else { }
00619 }
00620
00621
00622
00623
00624
00625