X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ZDC%2FAliZDC.cxx;h=220a0bc54ced55cd721cde935e2713f346f89a4e;hb=2e096a1e149a43d5ebe00c0a3717a1b2801186e6;hp=010935f4adc101ca8ceaf5be89ede6ab0bed094e;hpb=ce1f03daf219eafa677b71b026085add31388cf5;p=u%2Fmrichter%2FAliRoot.git diff --git a/ZDC/AliZDC.cxx b/ZDC/AliZDC.cxx index 010935f4adc..220a0bc54ce 100644 --- a/ZDC/AliZDC.cxx +++ b/ZDC/AliZDC.cxx @@ -30,6 +30,7 @@ #include #include #include +#include // --- AliRoot header files #include "AliDetector.h" @@ -47,7 +48,8 @@ #include "AliZDCDigitizer.h" #include "AliZDCRawStream.h" #include "AliZDCPedestals.h" -#include "AliZDCCalib.h" +#include "AliZDCEnCalib.h" +#include "AliZDCTowerCalib.h" #include "AliFstream.h" @@ -58,8 +60,10 @@ AliZDC::AliZDC() : AliDetector(), fNoShower(0), fPedCalib(0), - fCalibData(0), - fZDCCalibFName("") + fEnCalibData(0), + fTowCalibData(0), + fZDCCalibFName(""), + fSpectatorTracked(1) { // // Default constructor for the Zero Degree Calorimeter base class @@ -78,8 +82,10 @@ AliZDC::AliZDC(const char *name, const char *title) : AliDetector(name,title), fNoShower (0), fPedCalib(0), - fCalibData(0), - fZDCCalibFName("") + fEnCalibData(0), + fTowCalibData(0), + fZDCCalibFName(""), + fSpectatorTracked(1) { // // Standard constructor for the Zero Degree Calorimeter base class @@ -108,8 +114,9 @@ AliZDC::~AliZDC() // fIshunt = 0; - delete fPedCalib; - delete fCalibData; + if(fPedCalib) delete fPedCalib; + if(fEnCalibData) delete fEnCalibData; + if(fEnCalibData) delete fEnCalibData; } @@ -118,8 +125,10 @@ AliZDC::AliZDC(const AliZDC& ZDC) : AliDetector("ZDC","ZDC"), fNoShower(ZDC.fNoShower), fPedCalib(ZDC.fPedCalib), -fCalibData(ZDC.fCalibData), -fZDCCalibFName(ZDC.fZDCCalibFName) +fEnCalibData(ZDC.fEnCalibData), +fTowCalibData(ZDC.fTowCalibData), +fZDCCalibFName(ZDC.fZDCCalibFName), +fSpectatorTracked(ZDC.fSpectatorTracked) { // copy constructor } @@ -131,7 +140,8 @@ AliZDC& AliZDC::operator=(const AliZDC& ZDC) if(this!=&ZDC){ fNoShower = ZDC.fNoShower; fPedCalib = ZDC.fPedCalib; - fCalibData = ZDC.fCalibData; + fEnCalibData = ZDC.fEnCalibData; + fTowCalibData = ZDC.fTowCalibData; fZDCCalibFName = ZDC.fZDCCalibFName; } return *this; } @@ -143,7 +153,7 @@ void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits) // Add a ZDC hit to the hit list. static Float_t trackTime=0., primKinEn=0., xImpact=0., yImpact=0., sFlag=0.; - static Int_t pcPDGcode; + static Int_t pcPDGcode, motPDGcode; AliZDCHit *newquad, *curprimquad; newquad = new AliZDCHit(fIshunt, track, vol, hits); @@ -151,20 +161,23 @@ void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits) if(fNhits==0){ // First hit -> setting flag for primary or secondary particle - Int_t primary = gAlice->GetMCApp()->GetPrimary(track); + TParticle * p = gAlice->GetMCApp()->Particle(track); + Int_t imo = p->GetFirstMother(); // - if(track != primary){ + if(track != imo){ newquad->SetSFlag(1); // SECONDARY particle entering the ZDC } - else if(track == primary){ + else if(track == imo){ newquad->SetSFlag(0); // PRIMARY particle entering the ZDC - } - sFlag = newquad->GetSFlag(); - primKinEn = newquad->GetPrimKinEn(); - xImpact = newquad->GetXImpact(); - yImpact = newquad->GetYImpact(); - pcPDGcode = newquad->GetPDGCode(); - trackTime = newquad->GetTrackTOF(); + } + // + sFlag = newquad->GetSFlag(); + primKinEn = newquad->GetPrimKinEn(); + xImpact = newquad->GetXImpact(); + yImpact = newquad->GetYImpact(); + pcPDGcode = newquad->GetPDGCode(); + motPDGcode = newquad->GetMotherPDGCode(); + trackTime = newquad->GetTrackTOF(); } else{ newquad->SetPrimKinEn(primKinEn); @@ -172,6 +185,7 @@ void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits) newquad->SetYImpact(yImpact); newquad->SetSFlag(sFlag); newquad->SetPDGCode(pcPDGcode); + newquad->SetMotherPDGCode(motPDGcode); newquad->SetTrackTOF(trackTime); } @@ -258,7 +272,7 @@ void AliZDC::Hits2SDigits() // Event loop for(Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { Float_t pmZNC[5], pmZPC[5], pmZNA[5], pmZPA[5], pmZEM1=0., pmZEM2=0.; - for(Int_t i=0; i<4; i++) pmZNC[i] = pmZPC[i] = pmZNA[i] = pmZPA[i] = 0; + for(Int_t i=0; i<5; i++) pmZNC[i] = pmZPC[i] = pmZNA[i] = pmZPA[i] = 0; runLoader->GetEvent(iEvent); TTree* treeH = fLoader->TreeH(); @@ -266,7 +280,7 @@ void AliZDC::Hits2SDigits() ResetHits(); // Tracks loop - Int_t sector[2]; Float_t trackTime; + Int_t sector[2]; Float_t trackTime = 0.; for(Int_t itrack = 0; itrack < ntracks; itrack++) { treeH->GetEntry(itrack); for(AliZDCHit* zdcHit = (AliZDCHit*)FirstHit(-1); zdcHit; @@ -281,6 +295,8 @@ void AliZDC::Hits2SDigits() Float_t lightQ = zdcHit->GetLightPMQ(); Float_t lightC = zdcHit->GetLightPMC(); trackTime = zdcHit->GetTrackTOF(); + // Signals from ZEM are delayed to arrive in time with ZDC signals + if(sector[0] == 3) trackTime += 320; // Ch. debug //printf("\t det %d vol %d trackTOF %f lightQ %1.0f lightC %1.0f\n", // sector[0], sector[1], trackTime, lightQ, lightC); @@ -398,8 +414,10 @@ void AliZDC::Hits2SDigits() AliDigitizer* AliZDC::CreateDigitizer(AliRunDigitizer* manager) const { // Create the digitizer for ZDC - - return new AliZDCDigitizer(manager); + AliZDCDigitizer *zdcDigitizer = new AliZDCDigitizer(manager); + if(fSpectatorTracked==0) zdcDigitizer->SetSpectators2Track(); + //printf("\n**************************ZDC digitizer created with Spectators2Track = %d\n\n", fSpectatorTracked); + return zdcDigitizer; } //_____________________________________________________________________________ @@ -415,13 +433,18 @@ void AliZDC::Digits2Raw() // 12 channels x 2 gain chains read from 3rd ADC module (o.o.t.) // 12 channels x 2 gain chains read from 4rth ADC module (o.o.t.) // - const int knADCData1=24, knADCData2=24; // In principle the 2 numbers can be different! + const int knADCData1=12, knADCData2=12; + const int knADCData3=12, knADCData4=12; + // UInt_t lADCHeader1; UInt_t lADCHeader2; - UInt_t lADCData1[knADCData1]; - UInt_t lADCData2[knADCData2]; - UInt_t lADCData3[knADCData1]; - UInt_t lADCData4[knADCData2]; + UInt_t lADCHeader3; + UInt_t lADCHeader4; + // + UInt_t lADCData1[2*knADCData1]; + UInt_t lADCData2[2*knADCData2]; + UInt_t lADCData3[2*knADCData3]; + UInt_t lADCData4[2*knADCData4]; // UInt_t lADCEndBlock; @@ -434,43 +457,57 @@ void AliZDC::Digits2Raw() treeD->SetBranchAddress("ZDC", &pdigit); //printf("\t AliZDC::Digits2Raw -> TreeD has %d entries\n",(Int_t) treeD->GetEntries()); - // Fill data array - // ADC header - UInt_t lADCHeaderGEO = 0; + // Reading channel map + //printf("\n\t Reading ADC mapping from OCDB\n"); + AliZDCChMap * chMap = GetChMap(); + const int nCh = knADCData1+knADCData2+knADCData3+knADCData4; + Int_t mapADC[nCh][4]; + for(Int_t i=0; iGetADCModule(i); + mapADC[i][1] = chMap->GetADCChannel(i); + mapADC[i][2] = chMap->GetDetector(i); + mapADC[i][3] = chMap->GetSector(i); + // Ch. debug + //printf(" mapADC[%d] = (%d %d %d %d)\n", i, + // mapADC[i][0],mapADC[i][1],mapADC[i][2],mapADC[i][3]); + } + + // *** Fill data array + // ** ADC header + UInt_t lADCHeaderGEO1 = 0; + UInt_t lADCHeaderGEO2 = 1; + UInt_t lADCHeaderGEO3 = 2; + UInt_t lADCHeaderGEO4 = 3; UInt_t lADCHeaderCRATE = 0; UInt_t lADCHeaderCNT1 = knADCData1; UInt_t lADCHeaderCNT2 = knADCData2; + UInt_t lADCHeaderCNT3 = knADCData3; + UInt_t lADCHeaderCNT4 = knADCData4; - lADCHeader1 = lADCHeaderGEO << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 | + lADCHeader1 = lADCHeaderGEO1 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 | lADCHeaderCNT1 << 8 ; - lADCHeader2 = lADCHeaderGEO << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 | + lADCHeader2 = lADCHeaderGEO2 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 | lADCHeaderCNT2 << 8 ; + lADCHeader3 = lADCHeaderGEO3 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 | + lADCHeaderCNT3 << 8 ; + lADCHeader4 = lADCHeaderGEO4 << 27 | 0x1 << 25 | lADCHeaderCRATE << 16 | + lADCHeaderCNT4 << 8 ; - // ADC data word - UInt_t lADCDataGEO = lADCHeaderGEO; + // ** ADC data word + UInt_t lADCDataGEO = 0; // - UInt_t lADCDataValue1[knADCData1]; - UInt_t lADCDataValue2[knADCData2]; - UInt_t lADCDataValue3[knADCData1]; - UInt_t lADCDataValue4[knADCData2]; + UInt_t lADCDataValue1[2*knADCData1]; + UInt_t lADCDataValue2[2*knADCData2]; + UInt_t lADCDataValue3[2*knADCData3]; + UInt_t lADCDataValue4[2*knADCData4]; // - UInt_t lADCDataOvFlw1[knADCData1]; - UInt_t lADCDataOvFlw2[knADCData2]; - UInt_t lADCDataOvFlw3[knADCData1]; - UInt_t lADCDataOvFlw4[knADCData2]; + UInt_t lADCDataOvFlwHG = 0; + UInt_t lADCDataOvFlwLG = 0; // - for(Int_t i=0; iGetEntry(iDigit); if(!pdigit) continue; //digit.Print(""); - + // *** ADC data - Int_t index=0; - if(digit.GetSector(1)!=5){ // ZDC signal channels - // *** ADC1 (ZN1, ZP1, ZEM1,2) or ADC3 (ZN1, ZP1, ZEM1,2 o.o.t.) - if(digit.GetSector(0)==1 || digit.GetSector(0)==2 || digit.GetSector(0)==3){ - if(digit.GetSector(0)==1 || digit.GetSector(0)==2){ - index = (digit.GetSector(0)-1) + 4*digit.GetSector(1); // ZN1 or ZP1 - lADCDataChannel = 8*(digit.GetSector(0)-1) + digit.GetSector(1); - } - else if(digit.GetSector(0)==3){ // ZEM 1,2 - index = 20 + (digit.GetSector(1)-1); - lADCDataChannel = 5 + 8*(digit.GetSector(1)-1); - } - // - /*printf("\t AliZDC::Digits2Raw -> idig%d det %d quad %d index %d, ADCch %d ADCVal[%d, %d]\n", - iDigit,digit.GetSector(0),digit.GetSector(1),index,lADCDataChannel, - digit.GetADCValue(0),digit.GetADCValue(1));// Ch. debug - */ - // - if(iDigit 2047) lADCDataOvFlw1[index] = 1; - lADCDataValue1[index+2] = digit.GetADCValue(1); // Low gain ADC ch. - if(lADCDataValue1[index+2] > 2047) lADCDataOvFlw1[index+2] = 1; - - lADCData1[index] = lADCDataGEO << 27 | 0x1 << 24 | lADCDataChannel << 17 | - lADCDataOvFlw1[index] << 12 | (lADCDataValue1[index] & 0xfff); - lADCData1[index+2] = lADCDataGEO << 27 | 0x1 << 24 | lADCDataChannel << 17 | 0x1 << 16 | - lADCDataOvFlw1[index+2] << 12 | (lADCDataValue1[index+2] & 0xfff); - } - else{ // *** Out-of-time signals - lADCDataValue3[index] = digit.GetADCValue(0); // High gain ADC ch. - if(lADCDataValue3[index] > 2047) lADCDataOvFlw3[index] = 1; - lADCDataValue3[index+2] = digit.GetADCValue(1); // Low gain ADC ch. - if(lADCDataValue3[index+2] > 2047) lADCDataOvFlw3[index+2] = 1; - - lADCData3[index] = lADCDataGEO << 27 | lADCDataChannel << 17 | - lADCDataOvFlw3[index] << 12 | (lADCDataValue3[index] & 0xfff); - lADCData3[index+2] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | - lADCDataOvFlw3[index+2] << 12 | (lADCDataValue3[index+2] & 0xfff); - } + // Scan of the map to assign the correct ADC module-channel + for(Int_t k=0; k idig%d det %d quad %d index %d, ADCch %d ADCVal[%d, %d]\n", - iDigit,digit.GetSector(0),digit.GetSector(1),index,lADCDataChannel, - digit.GetADCValue(0),digit.GetADCValue(1));// Ch. debug - */ - // - if(iDigit 2047) lADCDataOvFlw2[index] = 1; - lADCDataValue2[index+2] = digit.GetADCValue(1); - if(lADCDataValue2[index+2] > 2047) lADCDataOvFlw2[index+2] = 1; - // - lADCData2[index] = lADCDataGEO << 27 | lADCDataChannel << 17 | - lADCDataOvFlw2[index] << 12 | (lADCDataValue2[index] & 0xfff); - lADCData2[index+2] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | - lADCDataOvFlw2[index+2] << 12 | (lADCDataValue2[index+2] & 0xfff); - } - else{ // *** Out-of-time signals - lADCDataValue4[index] = digit.GetADCValue(0); - if(lADCDataValue4[index] > 2047) lADCDataOvFlw4[index] = 1; - lADCDataValue4[index+2] = digit.GetADCValue(1); - if(lADCDataValue4[index+2] > 2047) lADCDataOvFlw4[index+2] = 1; - // - lADCData4[index] = lADCDataGEO << 27 | lADCDataChannel << 17 | - lADCDataOvFlw4[index] << 12 | (lADCDataValue4[index] & 0xfff); - lADCData4[index+2] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | - lADCDataOvFlw4[index+2] << 12 | (lADCDataValue4[index+2] & 0xfff); - } + else{ + if(digit.GetSector(0)==mapADC[k][2] && digit.GetSector(1)==mapADC[k][3]){ + lADCDataGEO = (UInt_t) mapADC[k][0]; + lADCDataChannel = (UInt_t) mapADC[k][1]; + if(k>knADCData1+knADCData2) break; + } } } - // *** ADC2 (Reference PTMs) or ADC4 (Reference PTMs o.o.t.) - else if(digit.GetSector(1)==5){ - index = 20 + (digit.GetSector(0)-1)/3; - lADCDataChannel = 5 + 8*(digit.GetSector(0)-1)/3; - // - /*printf("\t AliZDC::Digits2Raw -> idig%d det %d quad %d index %d, ADCch %d ADCVal[%d, %d]\n", - iDigit,digit.GetSector(0),digit.GetSector(1),index,lADCDataChannel, - digit.GetADCValue(0),digit.GetADCValue(1));// Ch. debug - */ - // - if(iDigit 2047) lADCDataOvFlw2[index] = 1; - lADCDataValue2[index+2] = digit.GetADCValue(1); - if(lADCDataValue2[index+2] > 2047) lADCDataOvFlw2[index+2] = 1; - // - lADCData2[index] = lADCDataGEO << 27 | lADCDataChannel << 17 | - lADCDataOvFlw2[index] << 12 | (lADCDataValue2[index] & 0xfff); - lADCData2[index+2] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | - lADCDataOvFlw2[index+2] << 12 | (lADCDataValue2[index+2] & 0xfff); - } - else{ // *** Out-of-time signals - lADCDataValue4[index] = digit.GetADCValue(0); - if(lADCDataValue4[index] > 2047) lADCDataOvFlw4[index] = 1; - lADCDataValue4[index+2] = digit.GetADCValue(1); - if(lADCDataValue4[index+2] > 2047) lADCDataOvFlw4[index+2] = 1; - // - lADCData4[index] = lADCDataGEO << 27 | lADCDataChannel << 17 | - lADCDataOvFlw4[index] << 12 | (lADCDataValue4[index] & 0xfff); - lADCData4[index+2] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | - lADCDataOvFlw4[index+2] << 12 | (lADCDataValue4[index+2] & 0xfff); - } - + // Ch. debug + //printf(" det %d sec %d -> lADCDataGEO %d lADCDataChannel %d\n", + // digit.GetSector(0),digit.GetSector(1),lADCDataGEO,lADCDataChannel); + + if(lADCDataGEO==0){ + Int_t indHG = iDigit; + Int_t indLG = indHG+knADCData1; + // High gain ADC ch. + if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; + lADCDataValue1[indHG] = digit.GetADCValue(0); + lADCData1[indHG] = lADCDataGEO << 27 | lADCDataChannel << 17 | + lADCDataOvFlwHG << 12 | (lADCDataValue1[indHG] & 0xfff); + // Low gain ADC ch. + if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; + lADCDataValue1[indLG] = digit.GetADCValue(1); + lADCData1[indLG] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | + lADCDataOvFlwLG << 12 | (lADCDataValue1[indLG] & 0xfff); + // Ch. debug + //printf(" lADCDataGEO %d lADCDataValue1[%d] = %d lADCDataValue1[%d] = %d\n", + // lADCDataGEO,iDigit,lADCDataValue1[indLG],indLG,lADCDataValue1[indLG]); } - if((index<0) || (index>23)) { - Error("Digits2Raw", "sector[0] = %d, sector[1] = %d", - digit.GetSector(0), digit.GetSector(1)); - continue; + else if(lADCDataGEO==1){ + Int_t indHG = iDigit-knADCData1; + Int_t indLG = indHG+knADCData2; + // High gain ADC ch. + if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; + lADCDataValue2[indHG] = digit.GetADCValue(0); + lADCData2[indHG] = lADCDataGEO << 27 | lADCDataChannel << 17 | + lADCDataOvFlwHG << 12 | (lADCDataValue2[indHG] & 0xfff); + // Low gain ADC ch. + if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; + lADCDataValue2[indLG] = digit.GetADCValue(1); + lADCData2[indLG] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | + lADCDataOvFlwLG << 12 | (lADCDataValue2[indLG] & 0xfff); + //Ch. debug + //printf(" lADCDataGEO %d lADCDataValue2[%d] = %d lADCDataValue2[%d] = %d\n", + // lADCDataGEO,indHG,lADCDataValue2[indHG],indLG,lADCDataValue2[indLG]); } - - + else if(lADCDataGEO==2){ + Int_t indHG = iDigit-knADCData1-knADCData2; + Int_t indLG = indHG+knADCData3; + // High gain ADC ch. + if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; + lADCDataValue3[indHG] = digit.GetADCValue(0); + lADCData3[indHG] = lADCDataGEO << 27 | lADCDataChannel << 17 | + lADCDataOvFlwHG << 12 | (lADCDataValue3[indHG] & 0xfff); + // Low gain ADC ch. + if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; + lADCDataValue3[indLG] = digit.GetADCValue(1); + lADCData3[indLG] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | + lADCDataOvFlwLG << 12 | (lADCDataValue3[indLG] & 0xfff); + //Ch. debug + //printf(" lADCDataGEO %d lADCDataValue3[%d] = %d lADCDataValue3[%d] = %d\n", + // lADCDataGEO,indHG,lADCDataValue3[indHG],indLG,lADCDataValue3[indLG]); + } + else if(lADCDataGEO==3){ + Int_t indHG = iDigit-knADCData1-knADCData2-knADCData3; + Int_t indLG = indHG+knADCData4; + // High gain ADC ch. + if(digit.GetADCValue(0) > 2047) lADCDataOvFlwHG = 1; + lADCDataValue4[indHG] = digit.GetADCValue(0); + lADCData4[indHG] = lADCDataGEO << 27 | lADCDataChannel << 17 | + lADCDataOvFlwHG << 12 | (lADCDataValue4[indHG] & 0xfff); + // Low gain ADC ch. + if(digit.GetADCValue(1) > 2047) lADCDataOvFlwLG = 1; + lADCDataValue4[indLG] = digit.GetADCValue(1); + lADCData4[indLG] = lADCDataGEO << 27 | lADCDataChannel << 17 | 0x1 << 16 | + lADCDataOvFlwLG << 12 | (lADCDataValue4[indLG] & 0xfff); + // Ch. debug + //printf(" lADCDataGEO %d lADCDataValue4[%d] = %d lADCDataValue4[%d] = %d\n", + // lADCDataGEO,indHG,lADCDataValue4[indHG],indLG,lADCDataValue4[indLG]); + } + } // - /* - for(Int_t i=0;iGetEventNrInRun(); + UInt_t lADCEndBlockGEO = 0; + // Event counter in ADC EOB -> getting no. of events in run from AliRunLoader + // get run loader + AliRunLoader* runLoader = fLoader->GetRunLoader(); + UInt_t lADCEndBlockEvCount = runLoader->GetEventNumber(); // lADCEndBlock = lADCEndBlockGEO << 27 | 0x1 << 26 | lADCEndBlockEvCount; //printf("\t AliZDC::Digits2Raw -> ADCEndBlock = %d\n",lADCEndBlock); - // open the output file char fileName[30]; strcpy(fileName,AliDAQ::DdlFileName("ZDC",0)); @@ -625,30 +636,32 @@ void AliZDC::Digits2Raw() header.fSize = sizeof(header) + sizeof(lADCHeader1) + sizeof(lADCData1) + sizeof(lADCEndBlock) + sizeof(lADCHeader2) + sizeof(lADCData2) + sizeof(lADCEndBlock) + - sizeof(lADCHeader1) + sizeof(lADCData3) + sizeof(lADCEndBlock) + - sizeof(lADCHeader2) + sizeof(lADCData4) + sizeof(lADCEndBlock); + sizeof(lADCHeader3) + sizeof(lADCData3) + sizeof(lADCEndBlock) + + sizeof(lADCHeader4) + sizeof(lADCData4) + sizeof(lADCEndBlock); // /*printf("sizeof header = %d, ADCHeader1 = %d, ADCData1 = %d, ADCEndBlock = %d\n", sizeof(header),sizeof(lADCHeader1),sizeof(lADCData1),sizeof(lADCEndBlock)); printf("sizeof header = %d, ADCHeader2 = %d, ADCData2 = %d, ADCEndBlock = %d\n", sizeof(header),sizeof(lADCHeader2),sizeof(lADCData2),sizeof(lADCEndBlock)); - */ - // + printf("sizeof header = %d, ADCHeader3 = %d, ADCData3 = %d, ADCEndBlock = %d\n", + sizeof(header),sizeof(lADCHeader1),sizeof(lADCData1),sizeof(lADCEndBlock)); + printf("sizeof header = %d, ADCHeader4 = %d, ADCData4 = %d, ADCEndBlock = %d\n", + sizeof(header),sizeof(lADCHeader2),sizeof(lADCData2),sizeof(lADCEndBlock));*/ + header.SetAttribute(0); // valid data file->WriteBuffer((char*)(&header), sizeof(header)); - // write the raw data and close the file - file->WriteBuffer((char*) &lADCHeader1, sizeof (lADCHeader1)); - file->WriteBuffer((char*)(lADCData1), sizeof(lADCData1)); + file->WriteBuffer((char*) &lADCHeader1, sizeof (lADCHeader1)); + file->WriteBuffer((char*) &lADCData1, sizeof(lADCData1)); file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock)); - file->WriteBuffer((char*) &lADCHeader2, sizeof (lADCHeader2)); - file->WriteBuffer((char*)(lADCData2), sizeof(lADCData2)); + file->WriteBuffer((char*) &lADCHeader2, sizeof (lADCHeader2)); + file->WriteBuffer((char*) (lADCData2), sizeof(lADCData2)); file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock)); - file->WriteBuffer((char*) &lADCHeader1, sizeof (lADCHeader1)); - file->WriteBuffer((char*)(lADCData3), sizeof(lADCData3)); + file->WriteBuffer((char*) &lADCHeader3, sizeof (lADCHeader3)); + file->WriteBuffer((char*) (lADCData3), sizeof(lADCData3)); file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock)); - file->WriteBuffer((char*) &lADCHeader2, sizeof (lADCHeader2)); - file->WriteBuffer((char*)(lADCData4), sizeof(lADCData4)); + file->WriteBuffer((char*) &lADCHeader4, sizeof (lADCHeader4)); + file->WriteBuffer((char*) (lADCData4), sizeof(lADCData4)); file->WriteBuffer((char*) &lADCEndBlock, sizeof(lADCEndBlock)); delete file; @@ -660,59 +673,54 @@ void AliZDC::Digits2Raw() Bool_t AliZDC::Raw2SDigits(AliRawReader* rawReader) { // Convert ZDC raw data to Sdigits - - AliLoader* loader = (AliRunLoader::GetRunLoader())->GetLoader("ZDCLoader"); + const int kNch = 48; + AliLoader* loader = (AliRunLoader::Instance())->GetLoader("ZDCLoader"); if(!loader) { AliError("no ZDC loader found"); return kFALSE; } -// // Event loop - Int_t iEvent = 0; - while(rawReader->NextEvent()){ - (AliRunLoader::GetRunLoader())->GetEvent(iEvent++); - // Create the output digit tree - TTree* treeS = loader->TreeS(); - if(!treeS){ - loader->MakeTree("S"); - treeS = loader->TreeS(); - } - // - AliZDCSDigit sdigit; - AliZDCSDigit* psdigit = &sdigit; - const Int_t kBufferSize = 4000; - treeS->Branch("ZDC", "AliZDCSDigit", &psdigit, kBufferSize); - // - AliZDCRawStream rawStream(rawReader); - Int_t sector[2], resADC, rawADC, corrADC, nPheVal; - Int_t jcount = 0; - while(rawStream.Next()){ - if(rawStream.IsADCDataWord()){ - //For the moment only in-time SDigits are foreseen (1st 48 raw values) - if(jcount < 48){ - for(Int_t j=0; j<2; j++) sector[j] = rawStream.GetSector(j); - rawADC = rawStream.GetADCValue(); - resADC = rawStream.GetADCGain(); - //printf("\t RAw2SDigits raw%d -> RawADC[%d, %d, %d] read\n", - // jcount, sector[0], sector[1], rawADC); - // - corrADC = rawADC - Pedestal(sector[0], sector[1], resADC); - if(corrADC<0) corrADC=0; - nPheVal = ADCch2Phe(sector[0], sector[1], corrADC, resADC); - // - //printf("\t \t -> SDigit[%d, %d, %d] created\n", - // sector[0], sector[1], nPheVal); - // - new(psdigit) AliZDCSDigit(sector, (Float_t) nPheVal, 0.); - treeS->Fill(); - jcount++; - } - }//IsADCDataWord - }//rawStream.Next - // write the output tree - fLoader->WriteSDigits("OVERWRITE"); - fLoader->UnloadSDigits(); - }//Event loop + // Create the output digit tree + TTree* treeS = loader->TreeS(); + if(!treeS){ + loader->MakeTree("S"); + treeS = loader->TreeS(); + } + // + AliZDCSDigit sdigit; + AliZDCSDigit* psdigit = &sdigit; + const Int_t kBufferSize = 4000; + treeS->Branch("ZDC", "AliZDCSDigit", &psdigit, kBufferSize); + // + AliZDCRawStream rawStream(rawReader); + Int_t sector[2], resADC, rawADC, corrADC, nPheVal; + Int_t jcount = 0; + while(rawStream.Next()){ + if(rawStream.IsADCDataWord()){ + //For the moment only in-time SDigits are foreseen (1st 48 raw values) + if(jcount < kNch){ + for(Int_t j=0; j<2; j++) sector[j] = rawStream.GetSector(j); + rawADC = rawStream.GetADCValue(); + resADC = rawStream.GetADCGain(); + //printf("\t RAw2SDigits raw%d -> RawADC[%d, %d, %d] read\n", + // jcount, sector[0], sector[1], rawADC); + // + corrADC = rawADC - Pedestal(sector[0], sector[1], resADC); + if(corrADC<0) corrADC=0; + nPheVal = ADCch2Phe(sector[0], sector[1], corrADC, resADC); + // + //printf("\t \t -> SDigit[%d, %d, %d] created\n", + // sector[0], sector[1], nPheVal); + // + new(psdigit) AliZDCSDigit(sector, (Float_t) nPheVal, 0.); + treeS->Fill(); + jcount++; + } + }//IsADCDataWord + }//rawStream.Next + // write the output tree + fLoader->WriteSDigits("OVERWRITE"); + fLoader->UnloadSDigits(); return kTRUE; } @@ -773,7 +781,7 @@ Int_t AliZDC::ADCch2Phe(Int_t Det, Int_t Quad, Int_t ADCVal, Int_t Res) const resADC[0] = 0.0000008; // ADC Resolution high gain: 200 fC/adcCh resADC[1] = 0.0000064; // ADC Resolution low gain: 25 fC/adcCh // - Int_t nPhe = (Int_t) (ADCVal * pmGain[Det-1][Quad] * resADC[Res]); + Int_t nPhe = (Int_t) (ADCVal / (pmGain[Det-1][Quad] * resADC[Res])); // //printf("\t AliZDC::ADCch2Phe -> det(%d, %d) - ADC %d phe %d\n",Det,Quad,ADCVal,nPhe); @@ -789,3 +797,18 @@ void AliZDC::SetTreeAddress(){ AliDetector::SetTreeAddress(); } + +//_____________________________________________________________________________ +AliZDCChMap* AliZDC::GetChMap() const +{ + + // Getting calibration object for ZDC + + AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/ChMap"); + if(!entry) AliFatal("No calibration data loaded!"); + + AliZDCChMap *calibdata = dynamic_cast (entry->GetObject()); + if(!calibdata) AliFatal("Wrong calibration object in calibration file!"); + + return calibdata; +}