//////////////////////////////////// // KRATTA Task merger // for the Asy-Eos experiment // TKratMerger DEFINITION // Mar 2013 // revison 03/2013 // E.d.F ver 1.0 // sebastian.kupny@uj.edu.pl // Changes: //////////////////////////////////// #include "TKratMerger.h" using std::cout; using std::endl; //______________________________________________________________________ TKratMerger::TKratMerger ( ) : FairTask() { } //______________________________________________________________________ TKratMerger::TKratMerger (const char* name, TString runlist, TString pathToDst, Int_t iVerbose ) : FairTask(name, iVerbose), //fDstFilesMap(0), // ??? fRunlist(""), fPathToKrattaDstFiles(""), fInputDstFile(0), fFileMainTree(0), fFileMainTreeName(""), fNEventsInTree(0), fEntryIndex(0), fMBSTS(0), fRootMBSTSCopy(0), fMbsInfo(0), fMbsInfoClone(0), fASYEventFromFile(0), fASYEventFromFileName(""), fASYEventFromFileCopy(0), fASYEventFromFileCopyName(""), fMbsRunNo(0), fMbsEventNo(0), fMbsTimeStamp(0), fKrattaDstRunNo(0), fKrattaDstEventNo(0), fKrattaDstTimeStamp(0), fPrintCamacAndDstTimeStamps(0), fSaveOutputToTree(kFALSE), fEventsCounterLcau(0), fEventsCounterKratta(0) { fFileMainTreeName = "cbmsim"; fASYEventFromFileName = "KRATTA_EVENT_PARAM_CLONE"; fASYEventFromFileCopyName = "KRATTA_ASYEVENT_CLONE"; fMbstsContInName = "MBSTSCLONE"; fMbsinfoContInName = "MBSINFO"; fRunlist = TString ( runlist ); fPathToKrattaDstFiles = TString ( pathToDst ); } //______________________________________________________________________ TKratMerger::~TKratMerger() { } //______________________________________________________________________ void TKratMerger::SetParContainers() { // Get run and runtime database FairRunAna* run = FairRunAna::Instance(); if ( ! run ) Fatal("SetParContainers", "No analysis run"); FairRuntimeDb* rtdb = run->GetRuntimeDb(); if ( ! rtdb ) Fatal("SetParContainers", "No runtime database"); } //______________________________________________________________________ InitStatus TKratMerger::Init() { //fLogger->Info(MESSAGE_ORIGIN," TKratMerger::Init()------------------Start "); //Farroot version: v-13.05 cout << "TKratMerger::Init()------------------Start " << endl; /// Configure Fairroot instances FairRootManager* ioman = FairRootManager::Instance(); if ( ! ioman ) Fatal("Init", "No FairRootManager"); /// Prepare input data if ( fVerbose > 1 ){ cout << "[TKratMerger::Init():] Runlist=" << fRunlist << endl; cout << "[TKratMerger::Init():] PathToKrattaDstFiles=" << fPathToKrattaDstFiles << endl; } LoadDstFilesFromRunlist(); ///Get access to fairroot data source fRootMBSTSCopy = (TClonesArray*) ioman->GetObject( fMbstsContInName ); fMBSTS = (TRootTS*)fRootMBSTSCopy; fMbsInfoClone = (TClonesArray*) ioman->GetObject( fMbsinfoContInName ); fMbsInfo = (TMbsInfo*)fMbsInfoClone; /// Check input data containers: if ( fRootMBSTSCopy==NULL ){ cout << "[TKratMerger::Init:] Error: Couldn't find necessary input "; cout << "data container with name: " << fMbstsContInName << " (of class TRootTS)."; cout << " It will breaks the analysis." << endl; getchar(); } if ( fMbsInfoClone==NULL ){ cout << "[TKratMerger::Init:] Error: Couldn't find necessary input "; cout << "data container with name: " << fMbsinfoContInName << " (of class TMbsInfo)."; cout << " It will breaks the analysis." << endl; getchar(); } ///Set fairroot output data container: fASYEventFromFile = new ASYEvent(); fASYEventFromFileCopy = new TClonesArray("ASYEventFromFile"); fASYEventFromFileCopy = (TClonesArray*) fASYEventFromFile; ioman->Register( fASYEventFromFileCopyName.Data(), "Kratta ASYEvent Copy", fASYEventFromFileCopy, fSaveOutputToTree); // fLogger->Info(MESSAGE_ORIGIN," TKratMerger::Init()------------------End "); //Farroot version: v-13.05 cout << "TKratMerger::Init()------------------End " << endl; return kSUCCESS; } //______________________________________________________________________ void TKratMerger::PrintTimeStamps() const { if ( fPrintCamacAndDstTimeStamps != 2){ cout << "[TKratMerger:] "; cout << "CAMAC:\t["; cout << " RUN=" << fMbsRunNo; cout << ". EVT=" << fMbsEventNo; cout << ". TS MI=" << fMbsTimeStamp; cout << ". TS RT=" << (unsigned long int) fMBSTS->TSM*65535+fMBSTS->TSS; cout << "]\t"; cout << "KRATTA.DST:\t["; cout << " RUN=" << fASYEventFromFile->run; cout << ". EVT=" << fASYEventFromFile->evt; cout << ". TS=" << fASYEventFromFile->tms; cout << ". fEntryIndex=" << fEntryIndex; cout << "]" << endl; }else{ cout << "[TKratMerger:] " << endl; cout << "CAMAC:\t\t["; cout << " RUN=" << fMbsRunNo; cout << ". EVT=" << fMbsEventNo; cout << ". TS MI=" << fMbsTimeStamp; cout << ". TS RT=" << (unsigned long int) fMBSTS->TSM*65535+fMBSTS->TSS; cout << "]\t"; cout << endl; cout << "KRATTA.DST:\t["; cout << " RUN=" << fASYEventFromFile->run; cout << ". EVT=" << fASYEventFromFile->evt; cout << ". TS =" << fASYEventFromFile->tms; cout << ". fEntryIndex=" << fEntryIndex; cout << "]" << endl; } } //______________________________________________________________________ void TKratMerger::Exec(Option_t* opt) { fMbsRunNo = fMbsInfo->GetRunNumber(); fMbsEventNo = fMbsInfo->GetCamacEventNumber(); ///fMbsTimeStamp = fMbsInfo->GetTimeStamp(); ///SEEMS TO BE NOT FILLED fMbsTimeStamp = fMBSTS->TSM*65535+fMBSTS->TSS; fEventsCounterLcau++; if (fKrattaDstRunNo != fMbsRunNo ) /// THIS IS CALLED ONLY WHEN NEW RUN NUMBER HAS CHANGED { if ( fVerbose > 1 ) cout << "[TKratMerger::Exec():] Run number has changed: before= " << fKrattaDstRunNo << " now: " << fMbsRunNo << " - Loading new file " << endl; LoadFileWithRunNumber( fMbsRunNo ); fKrattaDstRunNo = fMbsRunNo; /// TO AVOID SITUATION THAT IF THERE IS NO DST THIS WILL BE CALLED AFTER EVERY EVENT if ( fVerbose > 2 ){ PrintTimeStamps(); } if ( fFileMainTree ){ fFileMainTree-> GetEntry( 0 ); fKrattaDstRunNo = fASYEventFromFile->run; fKrattaDstEventNo = fASYEventFromFile->evt; fKrattaDstTimeStamp = fASYEventFromFile->tms; fASYEventFromFileCopy->Clear(); } return; /// SKIP THIS EVENT ONE BECAUSE OF SOME STRENGTH BEHAVIOUR } if ( fFileMainTree ){ if ( fEntryIndex < fNEventsInTree ){ /// CHECK IF EVENTS ARE THE NOT THE SAME (THEN SYNCHRONISATION IS NEEDED) if ( fMbsEventNo != fKrattaDstEventNo //|| fMbsTimeStamp != fKrattaDstTimeStamp ) { ///SYNCRHONISATION NEEDED if ( fMbsEventNo > fKrattaDstEventNo //&& fMbsTimeStamp > fKrattaDstTimeStamp ) { //cout << "SYNCRHONIZATION NEEDED - COND 1" << endl; if ( fVerbose > 7 ) cout << "[TKratMerger::Exec] Synchronization - Cond. 1" << endl; int skipedKrattaEvents = 0; do{ fFileMainTree-> GetEntry( fEntryIndex ); fKrattaDstRunNo = fASYEventFromFile->run; fKrattaDstEventNo = fASYEventFromFile->evt; fKrattaDstTimeStamp = fASYEventFromFile->tms; skipedKrattaEvents++; fEntryIndex++; fEventsCounterKratta++; }while ( fMbsEventNo > fKrattaDstEventNo && //fMbsTimeStamp > fKrattaDstTimeStamp && fEntryIndex < fNEventsInTree - 1); if ( fVerbose > 2 && skipedKrattaEvents > 2 ){ cout << "[TKratMerger::Exec] Warning: Jumped over skipedKrattaEvents=" << skipedKrattaEvents << " events " << endl; } } else{ //cout << "SYNCRHONIZATION NEEDED - COND 2" << endl; if ( fVerbose > 7 ) cout << "[TKratMerger::Exec] Synchronization - Cond. 2" << endl; } } /// TEST THE SYNCHRHONIZATION if ( fMbsRunNo == fASYEventFromFile->run && fMbsEventNo == fASYEventFromFile->evt && fMbsTimeStamp == fASYEventFromFile->tms ) { if ( fVerbose > 6 ) cout << "[TKratMerger::Exec] (LMD:KRATTA DST) Synchronization test: PASSED " << endl; // Events have the same number and timestamp //cout << "Same " << endl; //cout << *fASYEventFromFile << endl; //fKrattaDstRunNo = fASYEventFromFile->run; //fKrattaDstEventNo = fASYEventFromFile->evt; //fKrattaDstTimeStamp = fASYEventFromFile->tms; }else { ///CLEAR THE fASYEventFromFile structure if possible or use another one /// Eventually use fFileMainTree-> GetEntry( fEntryIndex ); or not use if ( fVerbose > 6 ) cout << "[TKratMerger::Exec] (LMD:KRATTA DST) Synchronization test: FAILED " << endl; if ( fVerbose > 2 ){ cout << "[TKratMerger::Exec] Warning: Events not same:" << endl; PrintTimeStamps(); if ( fVerbose > 9 ){ cout << "Press any key to continue... " << flush; getchar(); } } // //cout << *fASYEventFromFile << endl; } /// NOTE: If no one of the above warnings apear /// then here events must be synchronized. if ( fPrintCamacAndDstTimeStamps > 0 ) { PrintTimeStamps(); } }else{ /// when in KRATTA DST (root file) is less events than is in LMD (why?) if ( fVerbose > 2 ) { cout << "[TKratMerger::Exec] Warning: There is no more KRATTA param events - "; cout << "no event " << fMbsRunNo << ":" << fMbsEventNo << endl; } fASYEventFromFileCopy->Clear(); } }else { /// when there is no proper KRATTA DST (root file) (why?) if ( fVerbose > 2 ){ cout << "[TKratMerger::Exec] Warning: The pointer fFileMainTree is not initialized"; cout << " - no proper KRATTA DST (root file) corresponds to run " << fMbsRunNo; cout << endl; } fASYEventFromFileCopy->Clear(); } } //______________________________________________________________________ Long64_t TKratMerger::LoadDstFilesFromRunlist( void ) { if(fRunlist.Length() == 0 ){ cout << "[TKratMerger::LoadDstFilesFromRunlist():] Error: File name with list of run not set or it is an empty string."<> rDeclaratedNFiles; Long64_t nNumberOfEventsInOneFile = 0; for( Int_t i = 0; i < rDeclaratedNFiles; i++) { fileMainTree = 0; nNumberOfEventsInOneFile = 0; inputFileWithRunList >> inputLmdFileName; if( inputLmdFileName.Length() > 0) { if ( CheckIfFileExist( inputLmdFileName.Data() )){ inputDstFileName = Form( "%s/%s", fPathToKrattaDstFiles.Data(), GetDstFileNameFromFileName( inputLmdFileName ).Data() ); runNumber = GetRunNumberFromFileName( inputLmdFileName ); if ( fVerbose > 2 ){ cout << "[TKratMerger::LoadDstFilesFromRunlist():] Info: GetDstFileNameFromFileName(): " << inputDstFileName << endl; cout << "[TKratMerger::LoadDstFilesFromRunlist():] Info: GetRunNumberFromFileName(): " << runNumber << endl; } ///NOTE: If something is wrong one can remove bad file from the list. inputDstFile = new TFile( inputDstFileName ); if ( inputDstFile->IsOpen() ){ fileMainTree = (TTree*) inputDstFile->Get( fFileMainTreeName.Data() ); if ( fileMainTree ){ nNumberOfEventsInOneFile = fileMainTree->GetEntries(); ///fListOfInputFiles.push_back( inputDstFileName ); fDstFilesMap[runNumber] = inputDstFileName; rRealNFiles++; numberOfEventsInAllFiles+=nNumberOfEventsInOneFile; if ( fVerbose > 1 ){ cout << "[TKratMerger::LoadDstFilesFromRunlist():] " << inputDstFileName << " with " << nNumberOfEventsInOneFile; cout << " entry/ies added to the list - [OK]" << endl; } }else{ if ( fVerbose > 1 ){ cout << "[TKratMerger::LoadDstFilesFromRunlist():] Warning: in file " << inputDstFileName; cout << " the tree " << fFileMainTreeName.Data() << " not found [BAD]" << endl; } } }else{ if ( fVerbose > 1 ) cout << "[TKratMerger::LoadDstFilesFromRunlist():] Warning: " << inputDstFileName << " couldn't open in root [BAD]" << endl; } inputDstFile-> Close(); delete inputDstFile; }else{ if ( fVerbose > 1 ) cout << "[TKratMerger::LoadDstFilesFromRunlist():] Warning: " << inputDstFileName << " not found [BAD]" << endl; } } } }else{ if ( fVerbose > 1 ) cout << "[TKratMerger::LoadDstFilesFromRunlist():] Error: could not open the file: " << fRunlist << endl; } inputFileWithRunList.close(); if ( rDeclaratedNFiles != rRealNFiles ){ if ( fVerbose > 1 ){ cout << "[TKratMerger::LoadDstFilesFromRunlist():] Warning: " << fRunlist << " contains only " << rRealNFiles; cout << " correct files what is less than " << rDeclaratedNFiles << " as you want! Changed " << endl; } rDeclaratedNFiles = rRealNFiles; } if ( fVerbose > 2 ){ cout << "[TKratMerger::LoadDstFilesFromRunlist():] Files from run list " << fRunlist << " able to analyse:" << endl; PrintLoadedDstFiles(); } if ( fVerbose > 1 ) cout << "[TKratMerger::LoadDstFilesFromRunlist():] Total number of events: " << numberOfEventsInAllFiles << endl; return numberOfEventsInAllFiles; } //______________________________________________________________________ void TKratMerger::PrintLoadedDstFiles() { std::map::iterator it; if ( fDstFilesMap.size() > 0 ){ cout << "[TKratMerger::PrintLoadedDstFiles():] Loaded DST files:" << endl; for ( it=fDstFilesMap.begin(); it!=fDstFilesMap.end(); ++it) std::cout << it->first << " <=> " << it->second << endl; }else{ cout << "[TKratMerger::PrintLoadedDstFiles():] No files were loaded:" << endl; } if ( fVerbose > 2 ){ cout << "[TKratMerger::PrintLoadedDstFiles():] fDstFilesMap.end()->second = " << fDstFilesMap.end()->second << endl; } } //______________________________________________________________________ TString TKratMerger::GetDstFileNameFromFileName( TString A_string ) { TString filename = ""; if ( A_string == NULL ){ return filename; ///Throw exception or print warning } if ( A_string.Length() == 0 ){ return filename; ///Throw exception or print warning } string stlString( A_string.Data() ); string fileExtension = ".lmd"; unsigned PositionOfTheFileExtensionInFileName = stlString.find( fileExtension ); unsigned PositionOfTheFile = stlString.find_last_of("/"); string strFileNameWithoutExtension = stlString.substr( PositionOfTheFile + 1, PositionOfTheFileExtensionInFileName - (PositionOfTheFile + 1)); filename = Form ("%s_kratta.root", strFileNameWithoutExtension.c_str() ); return filename; } //______________________________________________________________________ Int_t TKratMerger::GetRunNumberFromFileName( TString A_string ) { /// This function extract the run number from the file name. /// The file name pattern is like the follow: /PATH/PREFIX_XXXX.lmd /// And we want extract the XXXX number int runNumber = 0; if ( A_string == NULL){ return runNumber; ///Throw exception or print warning } if ( A_string.Length() == 0){ return runNumber; ///Throw exception or print warning } string stlString( A_string.Data() ); string fileExtension = ".lmd"; int PositionOfTheFileExtensionInFileName = stlString.find( fileExtension ); if (PositionOfTheFileExtensionInFileName < 4 ){ return runNumber; } /// (pos -4, 4) because the run number should consist four digits. string strRunNumber = stlString.substr(PositionOfTheFileExtensionInFileName - 4, 4 ); if (strRunNumber != NULL ) { runNumber = atoi( strRunNumber.c_str() ); if ( fVerbose > 2 ){ cout << "[TKratMerger::GetRunNumberFromFileName:] Extracted from file name " << A_string << " the run number: " << runNumber << endl; } }else{ /// cout << " Warning: Couldn't extract run number from the file name" << endl; /// Throw exception or print warning } return runNumber; } //______________________________________________________________________ Int_t TKratMerger::LoadFileWithRunNumber( Int_t RunNo ) { ///Close the old one Int_t eventsInTree = 0; if ( fVerbose > 2 ){ cout << "[TKratMerger::LoadFileWithRunNumber:] Needed file for run number: " << RunNo << endl; } if ( fInputDstFile ){ if ( fInputDstFile -> IsOpen() ){ fInputDstFile-> Close(); delete fInputDstFile; fInputDstFile = 0; /// necessary fFileMainTree = 0; /// necessary } } ///Open next file to analyse TString dstFileName = ""; fEntryIndex = 0; dstFileName = fDstFilesMap.find( RunNo )->second ; if ( fVerbose > 2 ){ cout << "[TKratMerger::LoadFileWithRunNumber:] DstFilesMap.find( " << RunNo << " )->second == " << fDstFilesMap.find( RunNo )->second << endl; cout << "[TKratMerger::LoadFileWithRunNumber:] DstFileName = " << dstFileName << endl; } if ( dstFileName.Length() > 0 && dstFileName.CompareTo( fDstFilesMap.end()->second ) != 0 ){ fInputDstFile = new TFile( dstFileName.Data() ); fFileMainTree = (TTree*) fInputDstFile->Get( fFileMainTreeName.Data() ); fFileMainTree -> SetBranchAddress( fASYEventFromFileName.Data() , &fASYEventFromFile); eventsInTree = fFileMainTree->GetEntries(); fNEventsInTree = eventsInTree; if ( fVerbose > 0 ) cout << "[TKratMerger::LoadFileWithRunNumber:] File " << dstFileName << " opened with " << eventsInTree << " entries." << endl; }else{ if ( fVerbose > 0 ) cout << "[TKratMerger::LoadFileWithRunNumber:] Unable to find KRATTA DST file for run " << RunNo << ". No KRATTA data will be stored for this run." << endl; fASYEventFromFileCopy->Clear(); /// ON CAN CLEAR HERE THE CLONES ARRAY WHICH IS SAVED TO OUTPUT } /// Just for debugging: if (fVerbose > 1){ cout << "[TKratMerger::Finish:] " << fKrattaDstRunNo << " fEventsCounterLcau=" << fEventsCounterLcau; cout << " fEventsCounterKratta=" << fEventsCounterKratta; cout << " Difference=" << TMath::Abs(fEventsCounterKratta-fEventsCounterLcau); cout << endl; } fEventsCounterLcau = 0; fEventsCounterKratta = 0; /// return eventsInTree; } //______________________________________________________________________ bool TKratMerger::CheckIfFileExist(const char *filename) { bool result = false; ifstream ifile(filename); if (ifile) { result = true; } ifile.close(); return result; } //______________________________________________________________________ void TKratMerger::Reset() { } //______________________________________________________________________ void TKratMerger::Finish(){ } ClassImp( TKratMerger )