/* $Id$ */
MakeRaw()
{
// Create DDL files manually by firing each crystal.
// The DDL files are stored into directory raw0
// Yuri Kharlov. 15 February 2006
const Int_t kAdcThreshold = 1; // Lower ADC threshold to write to raw data
Int_t prevDDL = -1;
// Create a shaper pulse object
AliPHOSPulseGenerator pulse;
Int_t *adcValuesLow = new Int_t[pulse.GetRawFormatTimeBins()];
Int_t *adcValuesHigh= new Int_t[pulse.GetRawFormatTimeBins()];
const Int_t maxDDL = 20;
AliAltroBuffer *buffer[maxDDL];
AliAltroMapping *mapping[maxDDL];
// loop over digits
Float_t energy = 2.;
Float_t time = 15.6e-09;
Int_t module = 1;
for (Int_t iX=0; iX<64; iX++) {
for (Int_t iZ=0; iZ<56; iZ++) {
Int_t iRCU = -111;
if ( 0<=iX&&iX<32 && 0<=iZ&&iZ<28) iRCU=0;
else if( 0<=iX&&iX<32 && 28<=iZ&&iZ<56) iRCU=1;
else if(32<=iX&&iX<64 && 0<=iZ&&iZ<28) iRCU=2;
else if(32<=iX&&iX<64 && 28<=iZ&&iZ<56) iRCU=3;
Int_t iDDL = 4 * (module - 1) + iRCU;
// new DDL
if (iDDL != prevDDL) {
if (buffer[iDDL] == 0) {
// open new file and write dummy header
TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
TString path = gSystem->Getenv("ALICE_ROOT");
path += "/PHOS/mapping/RCU";
path += iRCU;
path += ".data";
// printf("DDL %d, mapping %s\n",iDDL,path.Data());
mapping[iDDL] = new AliCaloAltroMapping(path.Data());
buffer[iDDL] = new AliAltroBuffer(fileName.Data(),mapping[iDDL]);
buffer[iDDL]->WriteDataHeader(kTRUE, kFALSE); //Dummy;
}
prevDDL = iDDL;
}
// if a signal is out of time range, write only trailer
if (time > pulse.GetRawFormatTimeMax()*0.5 ) {
AliInfo("Signal is out of time range.\n");
buffer[iDDL]->FillBuffer(0);
buffer[iDDL]->FillBuffer(pulse.GetRawFormatTimeBins() ); // time bin
buffer[iDDL]->FillBuffer(3); // bunch length
buffer[iDDL]->WriteTrailer(3, iZ, iX, 0); // trailer
}
pulse.SetAmplitude(energy);
pulse.SetTZero(time);
pulse.MakeSamples();
pulse.GetSamples(adcValuesHigh, adcValuesLow) ;
// printf("digit E=%.4f GeV, t=%g s, (mod,iZ,iX)=(%d,%d,%d)\n",
// energy,time,module-1,iZ,iX);
buffer[iDDL]->WriteChannel(iZ, iX, 0,
pulse.GetRawFormatTimeBins(),
adcValuesLow , kAdcThreshold);
buffer[iDDL]->WriteChannel(iZ, iX, 1,
pulse.GetRawFormatTimeBins(),
adcValuesHigh, kAdcThreshold);
}
}
// write real header and close last file
for (Int_t iDDL=0; iDDL<maxDDL; iDDL++) {
if (buffer[iDDL]) {
buffer[iDDL]->Flush();
buffer[iDDL]->WriteDataHeader(kFALSE, kFALSE);
delete buffer[iDDL];
if (mapping[iDDL]) delete mapping[iDDL];
}
}
// move DDL files to directory raw0
gSystem->Exec("mkdir -p raw0; mv *.ddl raw0");
}
//-----------------------------------------------------------------------------
PlotRawDDL()
{
// Macro to read raw data from the DDL files
// and fill histogram with fired channels.
// Yuri Kharlov. 19 October 2006
AliRawReaderFile* rf = new AliRawReaderFile(".");
AliCaloRawStream in(rf,"PHOS");
in.SetOldRCUFormat(kFALSE); // Set to kTRUE for beam test 2006 only
Int_t iBin = 0;
Int_t iEvent=0;
TFile *file = new TFile("PlotRawDDL.root","recreate");
TH2F *hXY = new TH2F("hXY","X,Y of raw data",64,0.,64.,56,0.,56.);
TH2F *hXYmodule[5];
for (Int_t iMod=0; iMod<5; iMod++) {
TString name="hXY";
TString title="X,Y of raw data in module ";
hXYmodule[iMod] = new TH2F(name+iMod,title+iMod,64,0.,64.,56,0.,56.);
}
// Loop over events
while (rf->NextEvent()) {
Int_t runNum = rf->GetRunNumber();
cout << "Run "<<runNum<<", event "<<iEvent<<" of type "
<< rf->GetType() << endl;
// Loop over channels within this event
while ( in.Next() ) {
if (in.IsNewHWAddress()) {
hXY->Fill((Double_t)in.GetRow(),(Double_t)in.GetColumn());
hXYmodule[in.GetModule()]->Fill((Double_t)in.GetRow(),(Double_t)in.GetColumn());
}
}
iEvent++;
}
file->Write();
file->Close();
}