1 |
/** @file |
/** @file |
2 |
* $Author: kusanagi $ |
* $Author: kusanagi $ |
3 |
* $Date: 2004/07/29 16:18:54 $ |
* $Date: 2004/08/19 15:24:10 $ |
4 |
* $Revision: 1.4 $ |
* $Revision: 1.5 $ |
5 |
* |
* |
6 |
* Implementation of the PamelaRun class. |
* Implementation of the PamelaRun class. |
7 |
*/ |
*/ |
11 |
#include <list> |
#include <list> |
12 |
#include <exception> |
#include <exception> |
13 |
#include <string> |
#include <string> |
14 |
|
#include <log4cxx/logger.h> |
|
#include <log4cpp/Category.hh> |
|
15 |
|
|
16 |
#include <TFile.h> //Substituted by Maurizio 05 Feb 2004 |
#include <TFile.h> //Substituted by Maurizio 05 Feb 2004 |
17 |
#include <TTree.h> //Substituted by Maurizio 05 Feb 2004 |
#include <TTree.h> //Substituted by Maurizio 05 Feb 2004 |
25 |
#include "Algorithm.h" |
#include "Algorithm.h" |
26 |
#include "AlgorithmInfo.h" |
#include "AlgorithmInfo.h" |
27 |
#include "Exception.h" |
#include "Exception.h" |
28 |
|
#include <sys/stat.h> |
29 |
|
|
30 |
extern "C" { |
extern "C" { |
|
#include "DirectoryStructure.h" |
|
31 |
#include <dirent.h> |
#include <dirent.h> |
32 |
|
#include "DirectoryStructure.h" |
33 |
} |
} |
34 |
|
|
35 |
using namespace pamela; |
using namespace pamela; |
36 |
|
|
37 |
static log4cpp::Category& cat = log4cpp::Category::getInstance("pamela.PamelaRun"); |
static log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(_T("pamela.PamelaRun")); |
38 |
|
static std::stringstream oss; |
39 |
|
|
40 |
/** |
/** |
41 |
* Get the run name according to a certain run number. |
* Get the run name according to a certain run number. |
46 |
std::ostringstream t_Stream; |
std::ostringstream t_Stream; |
47 |
t_Stream << std::setw( 4 ) << std::setfill( '0' ) << run; |
t_Stream << std::setw( 4 ) << std::setfill( '0' ) << run; |
48 |
return "Run" + t_Stream.str(); |
return "Run" + t_Stream.str(); |
|
//return std::string("aa"); |
|
49 |
} |
} |
50 |
|
|
51 |
/** |
/** |
115 |
PamelaRun::PamelaRun(std::string fileName, std::string path): |
PamelaRun::PamelaRun(std::string fileName, std::string path): |
116 |
Path(path), |
Path(path), |
117 |
RunNumber(1){ //veirificare se è possibilie eliminare questa variabile |
RunNumber(1){ //veirificare se è possibilie eliminare questa variabile |
118 |
|
logger->debug(_T("Constructor")); |
119 |
Run = RunExists(fileName); |
Run = RunExists(fileName); |
120 |
info = RunInfo(this); |
info = RunInfo(this); |
|
cat << log4cpp::Priority::DEBUG |
|
|
<< "Constructor" |
|
|
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
|
121 |
} |
} |
122 |
|
|
123 |
/** |
/** |
194 |
std::list<std::string> files; |
std::list<std::string> files; |
195 |
DIR *dir = opendir(path.c_str()); |
DIR *dir = opendir(path.c_str()); |
196 |
if (dir == 0) { |
if (dir == 0) { |
197 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
198 |
<< "Could not open " << path |
oss << "Could not open " << path; |
199 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
200 |
throw Exception("Could not open " + path); |
throw Exception("Could not open " + path); |
201 |
} |
} |
202 |
|
|
217 |
if (stat(nextfilename.c_str(), &buf) == 0) { |
if (stat(nextfilename.c_str(), &buf) == 0) { |
218 |
filename.insert(filename.size()-5, "*"); |
filename.insert(filename.size()-5, "*"); |
219 |
} |
} |
220 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
221 |
<< "Using " << filename |
oss << "Using " << filename; |
222 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
223 |
files.push_back(filename); |
files.push_back(filename); |
224 |
} |
} |
225 |
} |
} |
257 |
} |
} |
258 |
TFile* File = new TFile(BaseFileName.c_str(), "read"); |
TFile* File = new TFile(BaseFileName.c_str(), "read"); |
259 |
if (!File->IsOpen()) { |
if (!File->IsOpen()) { |
260 |
cat << log4cpp::Priority::WARN |
oss.flush(); |
261 |
<< "Could not open file " << BaseFileName << " for reading." |
oss << "Could not open file " << BaseFileName << " for reading."; |
262 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->warn(oss.str().c_str()); |
263 |
return; |
return; |
264 |
} |
} |
265 |
TList* list = File->GetListOfKeys(); |
TList* list = File->GetListOfKeys(); |
270 |
TChain* FriendChain = new TChain(TreeName.c_str()); |
TChain* FriendChain = new TChain(TreeName.c_str()); |
271 |
FriendChain->Add(FileName.c_str()); |
FriendChain->Add(FileName.c_str()); |
272 |
tree->AddFriend(FriendChain, TreeName.c_str()); |
tree->AddFriend(FriendChain, TreeName.c_str()); |
273 |
std::ostringstream t_Stream; |
oss.flush(); |
274 |
t_Stream << "Adding chain " << TreeName << " with " |
oss << "Adding chain " << TreeName << " with " |
275 |
<< FriendChain->GetEntries() << " entries as Friend"; |
<< FriendChain->GetEntries() << " entries as Friend"; |
276 |
cat.debug(t_Stream.str()); |
logger->warn(oss.str().c_str()); |
277 |
} |
} |
278 |
} |
} |
279 |
File->Close(); |
File->Close(); |
283 |
std::string TreeName = k->GetName(); |
std::string TreeName = k->GetName(); |
284 |
TTree* FriendTree = (TTree *)File->Get(TreeName.c_str()); |
TTree* FriendTree = (TTree *)File->Get(TreeName.c_str()); |
285 |
tree->AddFriend(FriendTree, TreeName.c_str()); |
tree->AddFriend(FriendTree, TreeName.c_str()); |
286 |
std::ostringstream t_Stream; |
oss.flush(); |
287 |
t_Stream << "Adding tree " << TreeName << " with " |
oss << "Adding tree " << TreeName << " with " |
288 |
<< FriendTree->GetEntries() << " entries as Friend"; |
<< FriendTree->GetEntries() << " entries as Friend"; |
289 |
cat.debug(t_Stream.str()); |
logger->debug(oss.str().c_str()); |
290 |
} |
} |
291 |
} |
} |
292 |
} |
} |
299 |
* @return The root trees with the friends. |
* @return The root trees with the friends. |
300 |
*/ |
*/ |
301 |
TTree* PamelaRun::ReadTTree(const PacketType* type) { |
TTree* PamelaRun::ReadTTree(const PacketType* type) { |
302 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
303 |
<< "Getting root files of " << type->GetName() |
oss << "Getting root files of " << type->GetName(); |
304 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
305 |
RootTreeMap::iterator t = TTreeMap.find(type); |
RootTreeMap::iterator t = TTreeMap.find(type); |
306 |
if (t != TTreeMap.end()) { |
if (t != TTreeMap.end()) { |
307 |
return t->second; |
return t->second; |
308 |
} else { |
} else { |
309 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
310 |
<< "Reading root files of " << type->GetName() |
oss << "Reading root files of " << type->GetName(); |
311 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
312 |
EventHeader header(type); |
EventHeader header(type); |
313 |
std::string HeaderFileName = GetFileName(&header); |
std::string HeaderFileName = GetFileName(&header); |
314 |
TChain* HeaderTree = ReadHeaderTree(type); |
TChain* HeaderTree = ReadHeaderTree(type); |
346 |
branch->SetAddress(subpacket); |
branch->SetAddress(subpacket); |
347 |
SubPacketAddresses.insert(SubPacketMap::value_type(FullName, packet)); |
SubPacketAddresses.insert(SubPacketMap::value_type(FullName, packet)); |
348 |
} else { |
} else { |
349 |
cat << log4cpp::Priority::ERROR |
oss.flush(); |
350 |
<< "Could not find data for " << packet->GetPacketType()->GetName() << "/" << name |
oss << "Could not find data for " << packet->GetPacketType()->GetName() << "/" << name ; |
351 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->error(oss.str().c_str()); |
352 |
} |
} |
353 |
} |
} |
354 |
} |
} |
404 |
CreateDirectoryStructure(FileName.c_str()); |
CreateDirectoryStructure(FileName.c_str()); |
405 |
TFile* File = new TFile(FileName.c_str(), "create"); |
TFile* File = new TFile(FileName.c_str(), "create"); |
406 |
if (!File->IsOpen()) { |
if (!File->IsOpen()) { |
407 |
cat << log4cpp::Priority::ERROR |
oss.flush(); |
408 |
<< "Could not open file " << FileName |
oss << "Could not open file " << FileName ; |
409 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->error(oss.str().c_str()); |
410 |
throw Exception("Could not open file " + FileName); |
throw Exception("Could not open file " + FileName); |
411 |
} |
} |
412 |
std::string TreeName = GetTreeName(packet); |
std::string TreeName = GetTreeName(packet); |
416 |
AlgorithmInfo ai(algo); |
AlgorithmInfo ai(algo); |
417 |
ai.Write(); |
ai.Write(); |
418 |
info.Write(); |
info.Write(); |
419 |
cat << log4cpp::Priority::INFO |
oss.flush(); |
420 |
<< "Creating file " << FileName << " with Tree " << TreeName |
oss << "Creating file " << FileName << " with Tree " << TreeName; |
421 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->info(oss.str().c_str()); |
422 |
return tree; |
return tree; |
423 |
} |
} |
424 |
|
|
436 |
void PamelaRun::WriteSubPacket(Algorithm *algo, void* subpacket, |
void PamelaRun::WriteSubPacket(Algorithm *algo, void* subpacket, |
437 |
const TClass *c, std::string name) { |
const TClass *c, std::string name) { |
438 |
SubPacket *packet = *(SubPacket **)subpacket; |
SubPacket *packet = *(SubPacket **)subpacket; |
439 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
440 |
<< "Register: " << name << " for " << algo->GetAlgorithmName() << " (writing)" |
oss << "Register: " << name << " for " << algo->GetAlgorithmName() << " (writing)"; |
441 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
442 |
TTree* HeaderTree = ReadTTree(packet->GetPacketType()); |
TTree* HeaderTree = ReadTTree(packet->GetPacketType()); |
443 |
TTree* tree = CreateTTree(algo, packet, name); |
TTree* tree = CreateTTree(algo, packet, name); |
444 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
445 |
<< "Branch: " << name << " Class: " << c->GetName() |
oss << "Branch: " << name << " Class: " << c->GetName(); |
446 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
447 |
tree->Branch(name.c_str(), c->GetName(), subpacket); |
tree->Branch(name.c_str(), c->GetName(), subpacket); |
448 |
HeaderTree->AddFriend(tree, tree->GetName()); |
HeaderTree->AddFriend(tree, tree->GetName()); |
449 |
|
|
475 |
*/ |
*/ |
476 |
void PamelaRun::WriteHeader(Algorithm* algo, EventHeader** subpacket, |
void PamelaRun::WriteHeader(Algorithm* algo, EventHeader** subpacket, |
477 |
const PacketType* type) { |
const PacketType* type) { |
478 |
cat << log4cpp::Priority::DEBUG |
oss.flush(); |
479 |
<< "Creating header tree for " << type->GetName() |
oss << "Creating header tree for " << type->GetName(); |
480 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->debug(oss.str().c_str()); |
481 |
EventHeader header(type); |
EventHeader header(type); |
482 |
std::string FileName = GetFileName(&header, GetDefaultBranchName(&header)); |
std::string FileName = GetFileName(&header, GetDefaultBranchName(&header)); |
483 |
std::string EventType = (&header)->GetPacketType()->GetName(); |
std::string EventType = (&header)->GetPacketType()->GetName(); |
484 |
CreateDirectoryStructure(FileName.c_str()); |
CreateDirectoryStructure(FileName.c_str()); |
485 |
TFile* File = new TFile(FileName.c_str(), "create"); |
TFile* File = new TFile(FileName.c_str(), "create"); |
486 |
if (!File->IsOpen()) { |
if (!File->IsOpen()) { |
487 |
cat << log4cpp::Priority::ERROR |
oss.flush(); |
488 |
<< "Could not open file " << FileName |
oss << "Could not open file " << FileName ; |
489 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->error(oss.str().c_str()); |
490 |
throw Exception("Could not open file " + FileName); |
throw Exception("Could not open file " + FileName); |
491 |
} |
} |
492 |
//std::string TreeName = GetTreeName(packet); |
//std::string TreeName = GetTreeName(packet); |
496 |
AlgorithmInfo ai(algo); |
AlgorithmInfo ai(algo); |
497 |
ai.Write(); |
ai.Write(); |
498 |
info.Write(); |
info.Write(); |
499 |
cat << log4cpp::Priority::INFO |
oss.flush(); |
500 |
<< "Creating file " << FileName << " with Tree Pscu" |
oss << "Creating file " << FileName << " with Tree Pscu"; |
501 |
<< "\n " << log4cpp::CategoryStream::ENDLINE; |
logger->info(oss.str().c_str()); |
502 |
tree->Branch(GetDefaultBranchName(&header).c_str(), |
tree->Branch(GetDefaultBranchName(&header).c_str(), |
503 |
(*subpacket)->Class()->GetName(), subpacket); |
(*subpacket)->Class()->GetName(), subpacket); |
504 |
TTreeMap.insert(RootTreeMap::value_type(type, tree)); |
TTreeMap.insert(RootTreeMap::value_type(type, tree)); |
533 |
WriteHeader(algo, subpacket, PacketType::InitTrailer); |
WriteHeader(algo, subpacket, PacketType::InitTrailer); |
534 |
WriteHeader(algo, subpacket, PacketType::EventTrk); |
WriteHeader(algo, subpacket, PacketType::EventTrk); |
535 |
WriteHeader(algo, subpacket, PacketType::TestTrk); |
WriteHeader(algo, subpacket, PacketType::TestTrk); |
536 |
|
WriteHeader(algo, subpacket, PacketType::TestTof); |
537 |
WriteHeader(algo, subpacket, PacketType::Log); |
WriteHeader(algo, subpacket, PacketType::Log); |
538 |
WriteHeader(algo, subpacket, PacketType::VarDump); |
WriteHeader(algo, subpacket, PacketType::VarDump); |
539 |
WriteHeader(algo, subpacket, PacketType::ArrDump); |
WriteHeader(algo, subpacket, PacketType::ArrDump); |
546 |
WriteHeader(algo, subpacket, PacketType::TrkInit); |
WriteHeader(algo, subpacket, PacketType::TrkInit); |
547 |
WriteHeader(algo, subpacket, PacketType::TofInit); |
WriteHeader(algo, subpacket, PacketType::TofInit); |
548 |
WriteHeader(algo, subpacket, PacketType::TrgInit); |
WriteHeader(algo, subpacket, PacketType::TrgInit); |
549 |
|
WriteHeader(algo, subpacket, PacketType::CalAlarm); |
550 |
|
WriteHeader(algo, subpacket, PacketType::AcAlarm); |
551 |
|
WriteHeader(algo, subpacket, PacketType::TrkAlarm); |
552 |
|
WriteHeader(algo, subpacket, PacketType::TrgAlarm); |
553 |
|
WriteHeader(algo, subpacket, PacketType::TofAlarm); |
554 |
} |
} |
555 |
|
|
556 |
/** |
/** |
586 |
} |
} |
587 |
} |
} |
588 |
|
|
589 |
|
|