X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=RICH%2FAliRICHDigitizer.cxx;h=0129130f9cc8a4ba13cdede0b065486ebb771525;hb=665c0a68db3f5878e2c818fe346b3b452f659d16;hp=8d009dba1fd53951643ec58f46360ef56de1770c;hpb=88cb7938ca21d4a80991d4e7aa564008c29340f7;p=u%2Fmrichter%2FAliRoot.git diff --git a/RICH/AliRICHDigitizer.cxx b/RICH/AliRICHDigitizer.cxx index 8d009dba1fd..0129130f9cc 100644 --- a/RICH/AliRICHDigitizer.cxx +++ b/RICH/AliRICHDigitizer.cxx @@ -13,373 +13,70 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* $Id$ */ - -//Piotr.Skowronski@cern.ch : -//Corrections applied in order to compile (only) with new I/O and folder structure -//To be implemented correctly by responsible - -#include - -#include -#include -#include -#include -#include - -#include "AliRunLoader.h" -#include "AliLoader.h" - #include "AliRICHDigitizer.h" -#include "AliRICHChamber.h" -#include "AliHitMap.h" -#include "AliRICHHitMapA1.h" #include "AliRICH.h" -#include "AliRICHHit.h" -#include "AliRICHSDigit.h" -#include "AliRICHDigit.h" -#include "AliRICHTransientDigit.h" -#include "AliRun.h" -#include "AliPDG.h" +#include +#include #include "AliRunDigitizer.h" +#include +#include -ClassImp(AliRICHDigitizer) - -//___________________________________________ - AliRICHDigitizer::AliRICHDigitizer() -{ -// Default constructor - don't use it - fHits = 0; - fSDigits = 0; - fHitMap = 0; - fTDList = 0; -} -//////////////////////////////////////////////////////////////////////// -AliRICHDigitizer::AliRICHDigitizer(AliRunDigitizer* manager) - :AliDigitizer(manager) -{ -// ctor which should be used - fHits = 0; - fSDigits = 0; - fHitMap = 0; - fTDList = 0; - fDebug = 0; - if (GetDebug()>2) - cerr<<"AliRICHDigitizer::AliRICHDigitizer" - <<"(AliRunDigitizer* manager) was processed"<Delete(); - delete fHits; - } - if (fSDigits) { - fSDigits->Delete(); - delete fSDigits; +//This methode is responsible for merging sdigits to a list of digits +//Disintegration leeds to the fact that one hit affected several neighbouring pads, which means that the same pad might be +//affected by few hits. + AliDebug(1,Form("Start with %i input(s) for event %i",fManager->GetNinputs(),fManager->GetOutputEventNr())); +//First we read all sdigits from all inputs + AliRunLoader *pInRunLoader=0;//in and out Run loaders + AliLoader *pInRichLoader=0;//in and out RICH loaders + TClonesArray tmpCA("AliRICHDigit");//tmp storage for sdigits sum up from all input files + Int_t total=0; + for(Int_t inFileN=0;inFileNGetNinputs();inFileN++){//files loop + pInRunLoader = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inFileN)); //get run loader from current input + pInRichLoader = pInRunLoader->GetLoader("RICHLoader"); if(pInRichLoader==0) continue; //no RICH in this input, check the next input + if (!pInRunLoader->GetAliRun()) pInRunLoader->LoadgAlice(); + AliRICH* pInRich=(AliRICH*)pInRunLoader->GetAliRun()->GetDetector("RICH"); //take RICH from current input + pInRichLoader->LoadSDigits(); pInRichLoader->TreeS()->GetEntry(0); //take list of RICH sdigits from current input + AliDebug(1,Form("input %i has %i sdigits",inFileN,pInRich->SDigs()->GetEntries())); + for(Int_t i=0;iSDigs()->GetEntries();i++){//collect sdigits from current input to tmpCA + new(tmpCA[total++]) AliRICHDigit(*(AliRICHDigit*)pInRich->SDigs()->At(i)); + ((AliRICHDigit*)tmpCA[total-1])->AddTidOffset(fManager->GetMask(inFileN));//apply TID shift since all inputs count tracks independently starting from 0 } - for (Int_t i=0; iDelete(); - delete fTDList; - } -} - -//------------------------------------------------------------------------ -Bool_t AliRICHDigitizer::Exists(const AliRICHSDigit *padhit) -{ - return (fHitMap[fNch]->TestHit(padhit->PadX(),padhit->PadY())); -} - -//------------------------------------------------------------------------ -void AliRICHDigitizer::Update(AliRICHSDigit *padhit) -{ - AliRICHTransientDigit *pdigit = - static_cast( - fHitMap[fNch]->GetHit(padhit->PadX(),padhit->PadY())); - - // update charge - // - Int_t iqpad = Int_t(padhit->QPad()); // charge per pad - pdigit->AddSignal(iqpad); - pdigit->AddPhysicsSignal(iqpad); - - // update list of tracks - // - Int_t track, charge; - track = fTrack+fMask; - if (fSignal) { - charge = iqpad; - } else { - charge = kBgTag; - } - pdigit->UpdateTrackList(track,charge); -} - -//------------------------------------------------------------------------ -void AliRICHDigitizer::CreateNew(AliRICHSDigit *padhit) -{ - fTDList->AddAtAndExpand( - new AliRICHTransientDigit(fNch,fDigits),fCounter); - fHitMap[fNch]->SetHit(padhit->PadX(),padhit->PadY(),fCounter); - - AliRICHTransientDigit* pdigit = - static_cast(fTDList->Last()); - // list of tracks - Int_t track, charge; - if (fSignal) { - track = fTrack; - charge = padhit->QPad(); - } else { - track = kBgTag; - charge = kBgTag; - } - pdigit->AddToTrackList(track,charge); - fCounter++; -} - - -//////////////////////////////////////////////////////////////////////// -Bool_t AliRICHDigitizer::Init() -{ -// Initialisation - fHits = new TClonesArray("AliRICHHit",1000); - fSDigits = new TClonesArray("AliRICHSDigit",1000); - return kTRUE; -} - -//////////////////////////////////////////////////////////////////////// -//void AliRICHDigitizer::Digitise(Int_t nev, Int_t flag) -void AliRICHDigitizer::Exec(Option_t* option) -{ - TString optionString = option; - if (optionString.Data() == "deb") { - cout<<"AliMUONDigitizer::Exec: called with option deb "<GetOutputFolderName()); - outgime = outRL->GetLoader("RICHLoader"); - - fTDList = new TObjArray; + pInRichLoader->UnloadSDigits(); pInRich->SDigReset(); //close current input and reset + }//files loop - - AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH"); + tmpCA.Sort(); //at this point we have a list of all sdigits from all inputs, now sort them according to fPad field - if (outgime->TreeD() == 0x0) outgime->MakeTree("D"); + AliRunLoader *pOutRunLoader = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName()); //open output stream (only 1 possible) + AliLoader *pOutRichLoader = pOutRunLoader->GetLoader("RICHLoader"); //take output RICH loader + AliRICH *pOutRich = (AliRICH*)pOutRunLoader->GetAliRun()->GetDetector("RICH"); //take output RICH + pOutRichLoader->MakeTree("D"); pOutRich->MakeBranch("D"); //create TreeD in output stream - pRICH->MakeBranchInTreeD(outgime->TreeD()); - fHitMap= new AliHitMap* [kNCH]; - - for (Int_t i =0; iChamber(i)); - segmentation=iChamber->GetSegmentationModel(1); - fHitMap[i] = new AliRICHHitMapA1(segmentation, fTDList); - } - -// Loop over files to digitize - fSignal = kTRUE; - fCounter = 0; - for (Int_t inputFile=0; inputFileGetNinputs(); inputFile++) - { - inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile)); - ingime = inRL->GetLoader("RICHLoader"); - -// Connect RICH branches - - if (inputFile > 0 ) fSignal = kFALSE; - TBranch *branchHits = 0; - TBranch *branchSDigits = 0; - - ingime->LoadHits("READ"); - TTree *treeH = ingime->TreeH(); - if (GetDebug()>2) { - cerr<<" inputFile "<GetBranch("RICH"); - if (branchHits) - { - fHits->Clear(); - branchHits->SetAddress(&fHits); - } - else - Error("Exec","branch RICH was not found"); - } - if (GetDebug()>2) cerr<<" branchHits = "<GetBranch("RICHSDigits"); - if (branchSDigits) - branchSDigits->SetAddress(&fSDigits); - else - Error("exec","branch RICHSDigits was not found"); - } - if (GetDebug()>2) cerr<<" branchSDigits = "<GetEntries(); - for (fTrack=0; fTrackClear(); - fSDigits->Clear(); - branchHits->GetEntry(fTrack); - branchSDigits->GetEntry(fTrack); - - - // - // Loop over hits - for(Int_t i = 0; i < fHits->GetEntriesFast(); ++i) { - AliRICHHit* mHit = static_cast(fHits->At(i)); - fNch = mHit->Chamber()-1; // chamber number - if (fNch >= kNCH) { - cerr<<"AliRICHDigitizer: chamber nr. fNch out of range: "<Chamber(fNch)); - - // - // Loop over pad hits - for (AliRICHSDigit* mPad= - (AliRICHSDigit*)pRICH->FirstPad(mHit,fSDigits); - mPad; - mPad=(AliRICHSDigit*)pRICH->NextPad(fSDigits)) - { - Int_t iqpad = mPad->QPad(); // charge per pad - fDigits[0]=mPad->PadX(); - fDigits[1]=mPad->PadY(); - fDigits[2]=iqpad; - fDigits[3]=iqpad; - fDigits[4]=mPad->HitNumber(); - - - - // build the list of fired pads and update the info - if (Exists(mPad)) { - Update(mPad); - } else { - CreateNew(mPad); - } - } //end loop over clusters - } // hit loop - } // track loop - } // end file loop - if (GetDebug()>2) cerr<<"END OF FILE LOOP"<GetEntriesFast(); - - for (Int_t nent=0;nentAt(nent); - if (transDigit==0) continue; - Int_t ich=transDigit->GetChamber(); - Int_t q=transDigit->Signal(); - iChamber=&(pRICH->Chamber(ich)); - AliRICHResponse * response=iChamber->GetResponseModel(); - Int_t adcmax= (Int_t) response->MaxAdc(); - - - // add white noise and do zero-suppression and signal truncation (new electronics,old electronics gaus 1.2,0.2) - //printf("Treshold: %d\n",iChamber->fTresh->GetHitIndex(transDigit->PadX(),transDigit->PadY())); - -// tmp change -// Int_t pedestal = iChamber->fTresh->GetHitIndex(transDigit->PadX(),transDigit->PadY()); - Int_t pedestal = 0; - - - //printf("Pedestal:%d\n",pedestal); - //Int_t pedestal=0; - Float_t treshold = (pedestal + 4*2.2); - - Float_t meanNoise = gRandom->Gaus(2.2, 0.3); - Float_t noise = gRandom->Gaus(0, meanNoise); - q+=(Int_t)(noise + pedestal); - //q+=(Int_t)(noise); - // magic number to be parametrised !!! - if ( q <= treshold) - { - q = q - pedestal; - continue; - } - q = q - pedestal; - if ( q >= adcmax) q=adcmax; - fDigits[0]=transDigit->PadX(); - fDigits[1]=transDigit->PadY(); - fDigits[2]=q; - fDigits[3]=transDigit->Physics(); - fDigits[4]=transDigit->Hit(); - - Int_t nptracks = transDigit->GetNTracks(); - - // this was changed to accomodate the real number of tracks - if (nptracks > kMAXTRACKSPERRICHDIGIT) { - printf("Attention - tracks > 10 %d\n",nptracks); - nptracks=kMAXTRACKSPERRICHDIGIT; - } - if (nptracks > 2) { - printf("Attention - tracks > 2 %d \n",nptracks); - } - for (Int_t tr=0;trGetTrack(tr); - charges[tr]=transDigit->GetCharge(tr); - //printf("%f \n",charges[tr]); - } //end loop over list of tracks for one pad - if (nptracks < kMAXTRACKSPERRICHDIGIT ) { - for (Int_t t=nptracks; tPadAbs()==iId){//still the same pad + iNdigsPerPad++; dQdc+=pSdig->Qdc(); iCfm+=pSdig->Cfm();//sum up charge and cfm + if(pSdig->Cfm()==1) aTids[0] = pSdig->GetTrack(0); // force the first tid to be mip's tid if it exists in the current pad + if(iNdigsPerPad<=3) aTids[iNdigsPerPad-1]=pSdig->GetTrack(0); + else AliDebug(1,Form("More then 3 sdigits in (%d,%d,%f,%f) with Q= %f",pSdig->Chamber(),-1,pSdig->Pad()(0),pSdig->Pad()(1),pSdig->Qdc())); + }else{//new pad, add the pevious one + if(iId!=-1 && AliRICHParam::IsOverTh(iChamber,pad,dQdc)) pOutRich->DigAdd(iChamber,pad,(Int_t)dQdc,iCfm,aTids); //add newly created dig + iChamber=pSdig->Chamber(); pad=pSdig->Pad(); iCfm=pSdig->Cfm(); dQdc=pSdig->Qdc(); iId=pSdig->PadAbs(); //init all values by current sdig + iNdigsPerPad=1; aTids[0]=pSdig->GetTrack(0); aTids[1]=aTids[2]=-1; } - } - //write file - //if (ich==2) - //fprintf(points,"%4d, %4d, %4d\n",digits[0],digits[1],digits[2]); - - // fill digits - pRICH->AddDigits(ich,tracks,charges,fDigits); - } - outgime->TreeD()->Fill(); - - //pRICH->ResetDigits(); - fTDList->Delete(); // or fTDList->Clear(); ??? - for(Int_t ii=0;iiDigitsAddress(k); - Int_t ndigit=richDigits->GetEntriesFast(); - printf ("Chamber %d digits %d \n",k,ndigit); - } - pRICH->ResetDigits(); /// ??? should it be here??? + }//sdigits loop (sorted) + if(tmpCA.GetEntries() && AliRICHParam::IsOverTh(iChamber,pad,dQdc)) pOutRich->DigAdd(iChamber,pad,(Int_t)dQdc,iCfm,aTids);//add the last dig - outgime->WriteDigits("OVERWRITE"); - - delete [] fHitMap; - delete fTDList; - - if (fHits) fHits->Delete(); - if (fSDigits) fSDigits->Delete(); - -} + pOutRichLoader->TreeD()->Fill(); //fill the output tree with the list of digits + pOutRichLoader->WriteDigits("OVERWRITE"); //serialize them to file + + tmpCA.Clear(); //remove all tmp sdigits + pOutRichLoader->UnloadDigits(); pOutRich->DigReset(); +}//Exec()