#include <TSystem.h>
#include <TVirtualMC.h>
#include <TVirtualMCApplication.h>
+#include <TDatime.h>
#include "AliAlignObj.h"
#include "AliCDBEntry.h"
#include "AliCDBManager.h"
+#include "AliGRPManager.h"
#include "AliCDBStorage.h"
#include "AliCTPRawData.h"
#include "AliCentralTrigger.h"
fLoadAlObjsListOfDets("ALL"),
fMakeSDigits("ALL"),
fMakeDigits("ALL"),
- fMakeTrigger(""),
+ fTriggerConfig(""),
fMakeDigitsFromHits(""),
fWriteRawData(""),
fRawDataFileName(""),
fSetRunNumberFromDataCalled(kFALSE),
fEmbeddingFlag(kFALSE),
fLego(NULL),
+ fKey(0),
+ fUseVertexFromCDB(0),
+ fUseMagFieldFromGRP(0),
+ fGRPWriteLocation(Form("local://%s", gSystem->pwd())),
fQADetectors("ALL"),
fQATasks("ALL"),
fRunQA(kTRUE),
fEventSpecie(AliRecoParam::kDefault),
fWriteQAExpertData(kTRUE),
+ fGeometryFile(),
fRunHLT("default"),
fpHLT(NULL),
fWriteGRPEntry(kTRUE)
// Set CDB lock: from now on it is forbidden to reset the run number
// or the default storage or to activate any further storage!
- AliCDBManager::Instance()->SetLock(1);
+ ULong_t key = AliCDBManager::Instance()->SetLock(1);
+ if (key) fKey = key;
}
//_____________________________________________________________________________
}
// Export ideal geometry
- if(!gAlice->IsRootGeometry()) AliGeomManager::GetGeometry()->Export("geometry.root");
+ if(!IsGeometryFromFile()) AliGeomManager::GetGeometry()->Export("geometry.root");
// Load alignment data from CDB and apply to geometry through AliGeomManager
if(fLoadAlignFromCDB){
if (!AliGeomManager::GetGeometry()) {
// Initialize the geometry manager
AliGeomManager::LoadGeometry("geometry.root");
- AliSysInfo::AddStamp("GetGeometry");
-
-
+ AliSysInfo::AddStamp("GetGeometry");
// // Check that the consistency of symbolic names for the activated subdetectors
// // in the geometry loaded by AliGeomManager
// AliRunLoader* runLoader = LoadRun("READ");
// digits -> trigger
- if (!RunTrigger(fMakeTrigger,fMakeDigits)) {
+ if (!RunTrigger(fTriggerConfig,fMakeDigits)) {
if (fStopOnError) return kFALSE;
}
AliPDG::AddParticlesToPdgDataBase();
- gAlice->GetMCApp()->Init();
-
gMC->SetMagField(TGeoGlobalMagField::Instance()->GetField());
+ gAlice->GetMCApp()->Init();
+
//Must be here because some MCs (G4) adds detectors here and not in Config.C
gAlice->InitLoaders();
TString trconfiguration = config;
if (trconfiguration.IsNull()) {
- if (strcmp(gAlice->GetTriggerDescriptor(),"")) {
- trconfiguration = gAlice->GetTriggerDescriptor();
+ if(!fTriggerConfig.IsNull()) {
+ trconfiguration = fTriggerConfig;
}
else
AliWarning("No trigger descriptor is specified. Loading the one that is in the CDB.");
//
// Initialize ALICE Simulation run
//
-
gAlice->Announce();
+ //
+ // If requested set the mag. field from the GRP entry.
+ // After this the field is loccked and cannot be changed by Config.C
+ if (fUseMagFieldFromGRP) {
+ AliGRPManager grpM;
+ grpM.ReadGRPEntry();
+ grpM.SetMagField();
+ AliInfo("Field is locked now. It cannot be changed in Config.C");
+ }
+//
+// Execute Config.C
gROOT->LoadMacro(fConfigFileName.Data());
gInterpreter->ProcessLine(gAlice->GetConfigFunction());
AliSysInfo::AddStamp("RunSimulation_Config");
+//
+// If requested obtain the vertex position and vertex sigma_z from the CDB
+// This overwrites the settings from the Config.C
+ if (fUseVertexFromCDB) {
+ Double_t vtxPos[3] = {0., 0., 0.};
+ Double_t vtxSig[3] = {0., 0., 0.};
+ AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
+ if (entry) {
+ AliESDVertex* vertex = dynamic_cast<AliESDVertex*> (entry->GetObject());
+ if (vertex) {
+ if(vertex->GetXRes()>2.8) { // > pipe radius --> it's a dummy object, don't use it
+ entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
+ if (entry) vertex = dynamic_cast<AliESDVertex*> (entry->GetObject());
+ }
+ }
+ if (vertex) {
+ vertex->GetXYZ(vtxPos);
+ vertex->GetSigmaXYZ(vtxSig);
+ AliInfo("Overwriting Config.C vertex settings !");
+ AliInfo(Form("Vertex position from OCDB entry: x = %13.3f, y = %13.3f, z = %13.3f (sigma = %13.3f)\n",
+ vtxPos[0], vtxPos[1], vtxPos[2], vtxSig[2]));
+
+ AliGenerator *gen = gAlice->GetMCApp()->Generator();
+ gen->SetOrigin(vtxPos[0], vtxPos[1], vtxPos[2]); // vertex position
+ gen->SetSigmaZ(vtxSig[2]);
+ }
+ }
+ }
+
if(AliCDBManager::Instance()->GetRun() >= 0) {
AliRunLoader::Instance()->SetRunNumber(AliCDBManager::Instance()->GetRun());
AliRunLoader::Instance()->SetNumberOfEventsPerRun(fNEvents);
}
AliRunLoader::Instance()->CdGAFile();
-
- AliPDG::AddParticlesToPdgDataBase();
+
- gAlice->GetMCApp()->Init();
- AliSysInfo::AddStamp("RunSimulation_InitMCApp");
+ AliPDG::AddParticlesToPdgDataBase();
gMC->SetMagField(TGeoGlobalMagField::Instance()->GetField());
AliSysInfo::AddStamp("RunSimulation_GetField");
+ gAlice->GetMCApp()->Init();
+ AliSysInfo::AddStamp("RunSimulation_InitMCApp");
+
//Must be here because some MCs (G4) adds detectors here and not in Config.C
gAlice->InitLoaders();
AliRunLoader::Instance()->MakeTree("E");
AliSysInfo::AddStamp("RunSimulation_InitLoaders");
//___________________________________________________________________________________________
- // Get the trigger descriptor string
- // Either from AliSimulation or from
- // gAlice
- if (fMakeTrigger.IsNull()) {
- if (strcmp(gAlice->GetTriggerDescriptor(),""))
- fMakeTrigger = gAlice->GetTriggerDescriptor();
- }
- else
- gAlice->SetTriggerDescriptor(fMakeTrigger.Data());
AliSysInfo::AddStamp("RunSimulation_TriggerDescriptor");
// Set run number in CDBManager
loaderName += "Loader";
AliLoader* loader = runLoader->GetLoader(loaderName);
if (!loader) {
- AliError(Form("RunSimulation", "no loader for %s found\n"
- "Number of events per file not set for %s %s",
+ AliError(Form("RunSimulation no loader for %s found\n Number of events per file not set for %s %s",
detName, typeName, detName));
continue;
}
if (runLoader) for (Int_t iEvent = 0;
iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
char command[256];
- sprintf(command, "rm -r raw%d", iEvent);
+ snprintf(command, 256, "rm -r raw%d", iEvent);
gSystem->Exec(command);
}
+ delete runLoader;
}
if (rootOutput) {
runLoader->GetEvent(iEvent);
TString baseDir = gSystem->WorkingDirectory();
char dirName[256];
- sprintf(dirName, "raw%d", iEvent);
+ snprintf(dirName, 256, "raw%d", iEvent);
gSystem->MakeDirectory(dirName);
if (!gSystem->ChangeDirectory(dirName)) {
AliError(Form("couldn't change to directory %s", dirName));
char command[256];
// Note the option -s. It is used in order to avoid
// the generation of SOR/EOR events.
- sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d",
+ snprintf(command, 256, "dateStream -c -s -D -o %s -# %d -C -run %d",
dateFileName, runLoader->GetNumberOfEvents(),runLoader->GetHeader()->GetRun());
FILE* pipe = gSystem->OpenPipe(command, "w");
ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
char rawFileName[256];
- sprintf(rawFileName, "raw%d/%s",
+ snprintf(rawFileName, 256, "raw%d/%s",
iEvent, AliDAQ::DdlFileName(iDet,iDDL));
// check existence and size of raw data file
AliInfo(Form("converting selected by trigger cluster raw data DDL files to DATE file %s", selDateFileName));
- sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d",
+ snprintf(command, 256, "dateStream -c -s -D -o %s -# %d -C -run %d",
selDateFileName,selEvents,runLoader->GetHeader()->GetRun());
FILE* pipe2 = gSystem->OpenPipe(command, "w");
ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
char rawFileName[256];
- sprintf(rawFileName, "raw%d/%s",
+ snprintf(rawFileName, 256, "raw%d/%s",
iEvent, AliDAQ::DdlFileName(iDet,iDDL));
// check existence and size of raw data file
}
//_____________________________________________________________________________
-Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName)
+Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName, Int_t N)
{
//
// Steering routine to convert raw data in directory rawDirectory/ to fake SDigits.
AliPDG::AddParticlesToPdgDataBase();
- gAlice->GetMCApp()->Init();
-
gMC->SetMagField(TGeoGlobalMagField::Instance()->GetField());
+ gAlice->GetMCApp()->Init();
+
//Must be here because some MCs (G4) adds detectors here and not in Config.C
gAlice->InitLoaders();
AliRunLoader::Instance()->MakeTree("E");
AliRunLoader::Instance()->LoadKinematics("RECREATE");
AliRunLoader::Instance()->LoadTrackRefs("RECREATE");
AliRunLoader::Instance()->LoadHits("all","RECREATE");
+
//
// Save stuff at the beginning of the file to avoid file corruption
AliRunLoader::Instance()->CdGAFile();
AliRunLoader* runLoader = AliRunLoader::Instance();
//
// Open esd file if available
- TFile* esdFile = TFile::Open(esdFileName);
+ TFile* esdFile = 0;
TTree* treeESD = 0;
- AliESDEvent* esd = new AliESDEvent();
- esdFile->GetObject("esdTree", treeESD);
- if (treeESD) esd->ReadFromTree(treeESD);
+ AliESDEvent* esd = 0;
+ if (esdFileName && (strlen(esdFileName)>0)) {
+ esdFile = TFile::Open(esdFileName);
+ if (esdFile) {
+ esd = new AliESDEvent();
+ esdFile->GetObject("esdTree", treeESD);
+ if (treeESD) esd->ReadFromTree(treeESD);
+ }
+ }
//
// Create the RawReader
} else if (!fileName.IsNull()) {
rawReader = new AliRawReaderDate(fileName);
}
+ if (!rawReader) return (kFALSE);
+
// if (!fEquipIdMap.IsNull() && fRawReader)
// fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
//
//
// Get Header
AliHeader* header = runLoader->GetHeader();
- //
- TString detStr = fMakeSDigits;
// Event loop
Int_t nev = 0;
while(kTRUE) {
if (!(rawReader->NextEvent())) break;
+ runLoader->SetEventNumber(nev);
+ runLoader->GetHeader()->Reset(rawReader->GetRunNumber(),
+ nev, nev);
+ runLoader->GetEvent(nev);
+ AliInfo(Form("We are at event %d",nev));
//
// Detector loop
+ TString detStr = fMakeSDigits;
for (iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
AliModule* det = (AliModule*) detArray->At(iDet);
if (!det || !det->IsActive()) continue;
if (IsSelected(det->GetName(), detStr)) {
- AliInfo(Form("Calling Raw2SDigits for %s\n", det->GetName()));
+ AliInfo(Form("Calling Raw2SDigits for %s", det->GetName()));
det->Raw2SDigits(rawReader);
rawReader->Reset();
}
} // detectors
-
+
//
// If ESD information available obtain reconstructed vertex and store in header.
mcHeader->SetPrimaryVertex(mcV);
header->Reset(0,nev);
header->SetGenEventHeader(mcHeader);
- printf("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]);
+ AliInfo(Form("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]));
}
- nev++;
//
// Finish the event
runLoader->TreeE()->Fill();
- runLoader->SetNextEvent();
+ AliInfo(Form("Finished event %d",nev));
+ nev++;
+ if (N>0&&nev>=N)
+ break;
} // events
delete rawReader;
{
// run the QA on summable hits, digits or digits
- if(!gAlice) return kFALSE;
+ //if(!gAlice) return kFALSE;
AliQAManager::QAManager()->SetRunLoader(AliRunLoader::Instance()) ;
TString detectorsw("") ;
grpObj->SetRunType("PHYSICS");
grpObj->SetTimeStart(0);
- grpObj->SetTimeEnd(9999);
+ TDatime curtime;
+ grpObj->SetTimeStart(0);
+ grpObj->SetTimeEnd(curtime.Convert());
+ grpObj->SetBeamEnergyIsSqrtSHalfGeV(); // new format of GRP: store sqrt(s)/2 in GeV
const AliGenerator *gen = gAlice->GetMCApp()->Generator();
+ Int_t a = 0;
+ Int_t z = 0;
+
if (gen) {
- grpObj->SetBeamEnergy(gen->GetEnergyCMS()/0.120);
TString projectile;
- Int_t a,z;
gen->GetProjectile(projectile,a,z);
TString target;
gen->GetTarget(target,a,z);
beamType.ReplaceAll(" ","");
if (!beamType.CompareTo("-")) {
grpObj->SetBeamType("UNKNOWN");
+ grpObj->SetBeamEnergy(gen->GetEnergyCMS()/2);
}
else {
grpObj->SetBeamType(beamType);
+ if (z != 0) {
+ grpObj->SetBeamEnergy(gen->GetEnergyCMS()/2 * a / z);
+ } else {
+ grpObj->SetBeamEnergy(gen->GetEnergyCMS()/2 );
+ }
// Heavy ion run, the event specie is set to kHighMult
fEventSpecie = AliRecoParam::kHighMult;
if ((strcmp(beamType,"p-p") == 0) ||
}
}
// CTP
- if (!fMakeTrigger.IsNull() || strcmp(gAlice->GetTriggerDescriptor(),""))
+ if (!fTriggerConfig.IsNull())
detectorPattern |= (1 << AliDAQ::DetectorID("TRG"));
// HLT
grpObj->SetDetectorMask((Int_t)detectorPattern);
grpObj->SetLHCPeriod("LHC08c");
grpObj->SetLHCState("STABLE_BEAMS");
- grpObj->SetLHCLuminosity(0,(AliGRPObject::Stats)0);
- grpObj->SetBeamIntensity(0,(AliGRPObject::Stats)0);
//
AliMagF *field = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
Float_t solenoidField = field ? TMath::Abs(field->SolenoidField()) : 0;
grpObj->SetDipoleCurrent(currentDip,(AliGRPObject::Stats)0);
grpObj->SetL3Polarity(factorSol>0 ? 0:1);
grpObj->SetDipolePolarity(factorDip>0 ? 0:1);
- grpObj->SetUniformBMap(field->IsUniform()); // for special MC with k5kGUniform map
+ if (field) grpObj->SetUniformBMap(field->IsUniform()); // for special MC with k5kGUniform map
grpObj->SetPolarityConventionLHC(); // LHC convention +/+ current -> -/- field main components
//
grpObj->SetCavernTemperature(0,(AliGRPObject::Stats)0);
// Now store the entry in OCDB
AliCDBManager* man = AliCDBManager::Instance();
+
+ man->SetLock(0, fKey);
+
+ AliCDBStorage* sto = man->GetStorage(fGRPWriteLocation.Data());
+
AliCDBId id("GRP/GRP/Data", man->GetRun(), man->GetRun(), 1, 1);
AliCDBMetaData *metadata= new AliCDBMetaData();
metadata->SetResponsible("alice-off@cern.ch");
metadata->SetComment("Automatically produced GRP entry for Monte Carlo");
- man->Put(grpObj,id,metadata);
+ sto->Put(grpObj,id,metadata);
+ man->SetLock(1, fKey);
}