/* History of cvs commits:
*
* $Log$
+ * Revision 1.114 2007/08/07 14:12:03 kharlov
+ * Quality assurance added (Yves Schutz)
+ *
+ * Revision 1.113 2007/07/18 16:29:54 policheh
+ * Raw Sdigits energy converted to GeV.
+ *
+ * Revision 1.112 2007/02/25 22:59:13 policheh
+ * Digits2Raw(): ALTRO buffer and mapping created per each DDL.
+ *
+ * Revision 1.111 2007/02/18 15:21:47 kharlov
+ * Corrections for memory leak in Digits2Raw due to AliAltroMapping
+ *
+ * Revision 1.110 2007/02/13 10:52:08 policheh
+ * Raw2SDigits() implemented
+ *
* Revision 1.109 2007/02/05 10:43:25 hristov
* Changes for correct initialization of Geant4 (Mihaela)
*
*
* Revision 1.105 2007/01/12 21:44:29 kharlov
* Simulate and reconstruct two gains simulaneouslsy
- *
- * Revision 1.104 2006/11/23 13:40:44 hristov
- * Common class for raw data reading and ALTRO mappiing for PHOS and EMCAL (Gustavo, Cvetan)
- *
- * Revision 1.103 2006/11/14 17:11:15 hristov
- * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
- *
- * Revision 1.102 2006/10/27 17:14:27 kharlov
- * Introduce AliDebug and AliLog (B.Polichtchouk)
- *
- * Revision 1.101 2006/10/13 06:47:29 kharlov
- * Simulation of RAW data applies real mapping (B.Polichtchouk)
- *
- * Revision 1.100 2006/08/11 12:36:26 cvetan
- * Update of the PHOS code needed in order to read and reconstruct the beam test raw data (i.e. without an existing galice.root)
- *
- * Revision 1.99 2006/06/28 11:36:09 cvetan
- * New detector numbering scheme (common for DAQ/HLT/Offline). All the subdetectors shall use the AliDAQ class for the sim and rec of the raw data. The AliDAQ and raw reader classes now provide all the necessary interfaces to write and select the detector specific raw-data payload. Look into the AliDAQ.h and AliRawReader.h for more details.
- *
- * Revision 1.98 2006/05/11 11:30:48 cvetan
- * Major changes in AliAltroBuffer. Now it can be used only for writing of raw data. All the corresponding read method are removed. It is based now on AliFstream in order to avoid endianess problems. The altro raw data is written always with little endian
- *
- * Revision 1.97 2006/04/22 10:30:17 hristov
- * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
- *
- * Revision 1.96 2006/04/07 08:41:59 hristov
- * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
- *
- * Revision 1.95 2006/03/14 19:40:41 kharlov
- * Remove De-digitizing of raw data and digitizing the raw data fit
- *
- * Revision 1.94 2006/03/07 18:56:25 kharlov
- * CDB is passed via environment variable
- *
- * Revision 1.93 2005/11/22 08:45:11 kharlov
- * Calibration is read from CDB if any (Boris Polichtchouk)
- *
- * Revision 1.92 2005/11/03 13:09:19 hristov
- * Removing meaningless const declarations (linuxicc)
- *
- * Revision 1.91 2005/07/27 15:08:53 kharlov
- * Mixture ArCO2 is corrected
- *
- * Revision 1.90 2005/06/17 07:39:07 hristov
- * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
- *
- * Revision 1.89 2005/05/28 12:10:07 schutz
- * Copy constructor is corrected (by T.P.)
- *
*/
//_________________________________________________________________________
#include "AliDAQ.h"
#include "AliPHOSRawDecoder.h"
#include "AliPHOSRawDigiProducer.h"
+#include "AliPHOSQualAssChecker.h"
ClassImp(AliPHOS)
Float_t aG10[4] = { 12., 1., 16., 28.} ;
Float_t zG10[4] = { 6., 1., 8., 14.} ;
Float_t wG10[4] = { .259, .288, .248, .205} ;
- Float_t dG10 = 1.7 ;
+ Float_t dG10 = 1.7 ;
+
AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
wArCO[1] = (1-arContent)*1;
wArCO[2] = (1-arContent)*2;
Float_t dArCO = arContent*dAr + (1-arContent)*dCO ;
- AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ;
+ AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ;
+
// --- Stainless steel (let it be pure iron) ---
AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
const Float_t kThreshold = 0.001; // skip digits below 1 MeV
const Int_t kAdcThreshold = 1; // Lower ADC threshold to write to raw data
- AliAltroBuffer* buffer = NULL;
Int_t prevDDL = -1;
// Create a shaper pulse object
AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
-
+
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];
+
+ for(Int_t jDDL=0; jDDL<maxDDL; jDDL++) {
+ buffer[jDDL]=0;
+ mapping[jDDL]=0;
+ }
//!!!!for debug!!!
Int_t modMax=-111;
// new DDL
if (iDDL != prevDDL) {
- // write real header and close previous file
- if (buffer) {
- buffer->Flush();
- buffer->WriteDataHeader(kFALSE, kFALSE);
- delete buffer;
+ 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";
+
+ mapping[iDDL] = new AliCaloAltroMapping(path.Data());
+ buffer[iDDL] = new AliAltroBuffer(fileName.Data(),mapping[iDDL]);
+ buffer[iDDL]->WriteDataHeader(kTRUE, kFALSE); //Dummy;
}
-
- // 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";
-
- AliAltroMapping* mapping = new AliCaloAltroMapping(path.Data());
- buffer = new AliAltroBuffer(fileName.Data(),mapping);
- buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy;
-
prevDDL = iDDL;
}
// if a signal is out of time range, write only trailer
if (digit->GetTimeR() > pulse->GetRawFormatTimeMax()*0.5 ) {
AliInfo("Signal is out of time range.\n");
- buffer->FillBuffer(0);
- buffer->FillBuffer(pulse->GetRawFormatTimeBins() ); // time bin
- buffer->FillBuffer(3); // bunch length
- buffer->WriteTrailer(3, relId[3]-1, relId[2]-1, 0); // trailer
+ buffer[iDDL]->FillBuffer(0);
+ buffer[iDDL]->FillBuffer(pulse->GetRawFormatTimeBins() ); // time bin
+ buffer[iDDL]->FillBuffer(3); // bunch length
+ buffer[iDDL]->WriteTrailer(3, relId[3]-1, relId[2]-1, 0); // trailer
// calculate the time response function
} else {
pulse->SetTZero(digit->GetTimeR());
pulse->MakeSamples();
pulse->GetSamples(adcValuesHigh, adcValuesLow) ;
- buffer->WriteChannel(relId[3]-1, relId[2]-1, 0,
+ buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 0,
pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
- buffer->WriteChannel(relId[3]-1, relId[2]-1, 1,
+ buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 1,
pulse->GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
}
}
// write real header and close last file
- if (buffer) {
- buffer->Flush();
- buffer->WriteDataHeader(kFALSE, kFALSE);
- delete buffer;
+ 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];
+ }
}
AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n",
AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
phosDigitizer.SetEventRange(0, -1) ; // do all the events
+
phosDigitizer.ExecuteTask("all") ;
}
+
//____________________________________________________________________________
AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
{
pr.MakeDigits(sdigits,&dc);
Int_t bufferSize = 32000 ;
- TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize);
+ // TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize);
+ tree->Branch("PHOS",&sdigits,bufferSize);
tree->Fill();
fLoader->WriteSDigits("OVERWRITE");