+ MUONLoader->UnloadSDigits();
+
+}
+
+void MUONoccupancy(Int_t event2Check=0, Bool_t perDetEle =kFALSE, char * filename="galice.root") {
+ // Creating Run Loader and openning file containing Hits
+ AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
+ if (RunLoader ==0x0) {
+ printf(">>> Error : Error Opening %s file \n",filename);
+ return;
+ }
+ // Loading MUON subsystem
+ AliLoader * MUONLoader = RunLoader->GetLoader("MUONLoader");
+ MUONLoader->LoadDigits("READ");
+ // Creating MUON data container
+ AliMUONData muondata(MUONLoader,"MUON","MUON");
+
+ Int_t ievent, nevents;
+ nevents = RunLoader->GetNumberOfEvents();
+ AliMUONDigit * mDigit =0x0;
+ const AliMpVSegmentation * segbend = 0x0;
+ const AliMpVSegmentation * segnonbend = 0x0;
+ AliMpIntPair pad(0,0);
+
+ Int_t dEoccupancy_bending[14][26];
+ Int_t dEoccupancy_nonbending[14][26];
+ Int_t cHoccupancy_bending[14];
+ Int_t cHoccupancy_nonbending[14];
+ Int_t totaloccupancy_bending =0;
+ Int_t totaloccupancy_nonbending =0;
+
+ Int_t dEchannels_bending[14][26];
+ Int_t dEchannels_nonbending[14][26];
+ Int_t cHchannels_bending[14];
+ Int_t cHchannels_nonbending[14];
+ Int_t totalchannels_bending =0;
+ Int_t totalchannels_nonbending =0;
+
+ Int_t ichamber, nchambers,idetele, detele, ix, iy;
+ nchambers = AliMUONConstants::NCh(); ;
+
+ for (ichamber=0; ichamber<nchambers; ichamber++) {
+ cHchannels_bending[ichamber]=0;
+ cHchannels_nonbending[ichamber]=0;
+ for (idetele=0; idetele<26; idetele++) {
+ detele= 100*(ichamber +1)+idetele;
+ dEchannels_bending[ichamber][idetele]=0;
+ dEchannels_nonbending[ichamber][idetele]=0;
+ dEoccupancy_bending[ichamber][idetele]=0;
+ dEoccupancy_nonbending[ichamber][idetele]=0;
+ if ( AliMpDEManager::IsValidDetElemId(detele) ) {
+ segbend = AliMpSegmentation::Instance()
+ ->GetMpSegmentation(detele, AliMp::kCath0);
+ segnonbend = AliMpSegmentation::Instance()
+ ->GetMpSegmentation(detele, AliMp::kCath1);
+ if (AliMpDEManager::GetPlaneType(detele, AliMp::kCath0) != AliMp::kBendingPlane ) {
+ const AliMpVSegmentation* tmp = segbend;
+ segbend = segnonbend;
+ segnonbend = tmp;
+ }
+
+ for(ix=0; ix<=segbend->MaxPadIndexX(); ix++) {
+ for(iy=0; iy<=segbend->MaxPadIndexY(); iy++) {
+ pad.SetFirst(ix);
+ pad.SetSecond(iy);
+ if( segbend->HasPad(pad) ) {
+ dEchannels_bending[ichamber][idetele]++;
+ cHchannels_bending[ichamber]++;
+ totalchannels_bending++;
+ }
+ }
+ }
+ for(ix=0; ix<=segnonbend->MaxPadIndexX(); ix++) {
+ for(iy=0; iy<=segnonbend->MaxPadIndexY(); iy++) {
+ pad.SetFirst(ix);
+ pad.SetSecond(iy);
+ if(segnonbend->HasPad(pad)) {
+ dEchannels_nonbending[ichamber][idetele]++;
+ cHchannels_nonbending[ichamber]++;
+ totalchannels_nonbending++;
+ }
+ }
+ }
+ if (perDetEle) printf(">>> Detection element %4d has %5d channels in bending and %5d channels in nonbending \n",
+ detele, dEchannels_bending[ichamber][idetele], dEchannels_nonbending[ichamber][idetele] );
+ }
+ }
+ printf(">>> Chamber %2d has %6d channels in bending and %6d channels in nonbending \n",
+ ichamber+1, cHchannels_bending[ichamber], cHchannels_nonbending[ichamber]);
+ }
+ printf(">>Spectrometer has %7d channels in bending and %7d channels in nonbending \n",
+ totalchannels_bending, totalchannels_nonbending);
+
+ ievent=event2Check;
+ printf(">>> Event %d \n",ievent);
+ RunLoader->GetEvent(ievent);
+
+ // Addressing
+ muondata.SetTreeAddress("D");
+ muondata.GetDigits();
+ // Loop on chambers
+ for( ichamber=0; ichamber<nchambers; ichamber++) {
+ cHoccupancy_bending[ichamber] = 0;
+ cHoccupancy_nonbending[ichamber]= 0;
+ Int_t idigit, ndigits;
+ ndigits = (Int_t) muondata.Digits(ichamber)->GetEntriesFast();
+ for(idigit=0; idigit<ndigits; idigit++) {
+ mDigit = static_cast<AliMUONDigit*>(muondata.Digits(ichamber)->At(idigit));
+ Int_t detele = mDigit->DetElemId();
+ Int_t idetele = detele-(ichamber+1)*100;
+ if ( mDigit->Cathode() == 0 ) {
+
+ cHoccupancy_bending[ichamber]++;
+ dEoccupancy_bending[ichamber][idetele]++;
+ totaloccupancy_bending++;
+ }
+ else {
+ cHoccupancy_nonbending[ichamber]++;
+ dEoccupancy_nonbending[ichamber][idetele]++;
+ totaloccupancy_nonbending++;
+ }
+ } // end digit loop
+
+ printf(">>> Chamber %2d nChannels Bending %5d nChannels NonBending %5d \n",
+ ichamber+1,
+ cHoccupancy_bending[ichamber],
+ cHoccupancy_nonbending[ichamber]);
+ printf(">>> Chamber %2d Occupancy Bending %5.2f %% Occupancy NonBending %5.2f %% \n",
+ ichamber+1,
+ 100.*((Float_t) cHoccupancy_bending[ichamber])/((Float_t) cHchannels_bending[ichamber]),
+ 100.*((Float_t) cHoccupancy_nonbending[ichamber])/((Float_t) cHchannels_bending[ichamber]) );
+
+
+ for(Int_t idetele=0; idetele<26; idetele++) {
+ Int_t detele = idetele + 100*(ichamber+1);
+ if ( AliMpDEManager::IsValidDetElemId(detele) ) {
+ if (perDetEle) {
+ printf(">>> DetEle %4d nChannels Bending %5d nChannels NonBending %5d \n",
+ idetele+100*(ichamber+1),
+ dEoccupancy_bending[ichamber][idetele],
+ dEoccupancy_nonbending[ichamber][idetele]);
+ printf(">>> DetEle %4d Occupancy Bending %5.2f %% Occupancy NonBending %5.2f %% \n",
+ idetele+100*(ichamber+1),
+ 100.*((Float_t) dEoccupancy_bending[ichamber][idetele])/((Float_t) dEchannels_bending[ichamber][idetele]),
+ 100.*((Float_t) dEoccupancy_nonbending[ichamber][idetele])/((Float_t) dEchannels_bending[ichamber][idetele]));
+ }
+ }
+ }
+ } // end chamber loop
+ printf(">>> Muon Spectrometer Occupancy Bending %5.2f %% Occupancy NonBending %5.2f %% \n",
+ 100.*((Float_t) totaloccupancy_bending)/((Float_t) totalchannels_bending),
+ 100.*((Float_t) totaloccupancy_nonbending)/((Float_t) totalchannels_nonbending) );
+ muondata.ResetDigits();
+ // } // end cathode loop