diff --git a/raw.cc b/raw.cc
index 847ac306a058a8943d14336da95f4dd515f4aec1..070142dae1ad61a7a939bf009e85aa223083c04e 100644
--- a/raw.cc
+++ b/raw.cc
@@ -50,7 +50,7 @@ using namespace std;
 // action flags. Should be improved with a class
 int ical=0, itim=0, isol=0, iall=0, imon=0, force=0, ivalid=0;
 int izip=0, iscl=0, isclg=0, itrg=0, irte=0, iflx=0, ineg[3]= {0,0,0};
-int isat=0, iqtr=0; 
+int isat=0, iqtr=0, imuo=0, imup=1; 
 
 // OLD SCALER ANALYSIS
 // levels should be given above baseline or threshold (-lt modifier).
@@ -113,10 +113,14 @@ int Base[CHANNELS][ADCMAX];
 int Charge[CHANNELS][CHRGMAX];
 int ECharge[CHANNELS][CHRGMAX];
 int Time[CHANNELS][MAXTIMEINVECTOR];
-
 int Peak_minute[CHANNELS][ADCMAX];
 int Charge_minute[CHANNELS][CHRGMAX];
 
+// new muon optimization search filter
+int MCharge[CHANNELS][CHRGMAX];
+int MPeak[CHANNELS][ADCMAX];
+int ppeak[CHANNELS], pcharge[CHANNELS];
+
 void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
 	if (((Data->second)%36)==0)
 		cerr << "Done " << ((Data->second)%3600)/36 << "%\r";
@@ -141,6 +145,9 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
 		scl_flux[j] = 0;
 	int scl_idx = 0;
 	int scl_peak = 0;
+	
+	for (int j=0; j<CHANNELS; j++)
+		ppeak[j] = pcharge[j] = 0;
 
 	// processing pulses
 	for (int i=0; i<NbPulses; i++) {
@@ -166,7 +173,7 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
 		if (itrg && trg_drop)
 			continue;
 
-		// impose an additional trigger using values for bin #3
+		// impose an additional trigger using values for bin #4
 		int qtr_drop = 0;
 		if (iqtr) 
 			for (int j=0; j<CHANNELS; j++)
@@ -189,8 +196,40 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
 				Peak[j][peaktmp]++;
 				Charge[j][chargetmp]++;
 			}
+			if (imuo) {
+				if (icaltrg) {
+					if (Pulse[i].IsTriggered(j)) {
+						if (imup) {
+							if (peaktmp >= ppeak[j] ) {
+								MPeak[j][peaktmp]++;
+								MCharge[j][chargetmp]++;
+							}
+						} else {
+							if (chargetmp >= pcharge[j] ) {
+								MPeak[j][peaktmp]++;
+								MCharge[j][chargetmp]++;
+							}
+						}
+					}
+				}
+				else {
+					if (imup) {
+						if (peaktmp >= ppeak[j]) {
+							MPeak[j][peaktmp]++;
+							MCharge[j][chargetmp]++;
+						}
+					} else {
+						if (chargetmp >= pcharge[j]) {
+							MPeak[j][peaktmp]++;
+							MCharge[j][chargetmp]++;
+						}
+					}
+				}
+			}
+
 			Base[j][Pulse[i].GetBase(j)]++;
 			scl_flux[j]++;
+			
 			if (iscl) {
 				scl_idx = (int)(Pulse[i].clockcount / SCL_CLOCK);
 				scl_peak = peaktmp;
@@ -202,7 +241,9 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
 					}
 				}
 			}
-		}
+			ppeak[j] = peaktmp;
+			pcharge[j] = chargetmp;
+		} // close for loop
 
 		if (iall || itim) {			
 			// for both cases we need to calculate time difference between consecutive pulses...
@@ -397,6 +438,8 @@ void Usage(char *prog, int verbose=0)
 	cout << "\t-v <chn> \tchecks if channel (1-3) is working (bits and baseline)" << endl;
 	cout << "\t-N <mask>\tindicate what channels have negative undershoots" << endl;
 	cout << "\t         \tUse channel mask 1-7." << endl;
+	cout << "\t-w <1/2> \tenable muon search optimization filter. If 2, compare using charge" << endl;
+	cout << "\t         \tinstead of peak (default value: " << imup << ")." << endl;
 	cout << "\t-u <tr i>\tImpose an offline trigger level for each channel" << endl;
 	cout << "\t         \t(Default value: " << trg_default << " ADC)" << endl;
 	cout << "\t-q <tr i>\tImpose an offline trigger level on 4th bin for each channel" << endl;
@@ -494,6 +537,15 @@ int main (int argc, char *argv[])
 			case 'r':
 				iraw=1;
 				break;
+			case 'w':
+				imuo=1;
+				imup=1;
+				if (atof(argv[i+1])) { // false if not selector value was given
+					i++;
+					if (atof(argv[i]) == 2) // use charge
+						imup = 0;
+				}
+				break;
 			case 'a':
 				iall=1;
 				break;
@@ -651,9 +703,9 @@ int main (int argc, char *argv[])
 
 	for (int i=0; i<CHANNELS; i++) {
 		for (int j=0; j<ADCMAX; j++)
-			Peak[i][j]=Peak_minute[i][j]=Base[i][j]=0;
+			MPeak[i][j]=Peak[i][j]=Peak_minute[i][j]=Base[i][j]=0;
 		for (int j=0; j<CHRGMAX; j++)
-			ECharge[i][j]=Charge[i][j]=Charge_minute[i][j]=0;
+			MCharge[i][j]=ECharge[i][j]=Charge[i][j]=Charge_minute[i][j]=0;
 		for (int j=0; j<MAXTIMEINVECTOR; j++)
 			Time[i][j]=0;
 	}
@@ -746,6 +798,11 @@ int main (int argc, char *argv[])
 		cal << "# # L1 level file (processed raw data, use at your own risk or contact lago@lagoproject.org)" << endl;
 		cal << "# # This is a file containing the charge and peak calibration histograms" << endl;
 		cal << "# # Format is ch1 ch2 ch3 pk1 pk2 pk3" << endl;
+		if (imuo && imup)
+			cal << "# # Muon search optimization was enabled (filtered by peak). There are six additional columns with ch1m ch2m ch3m pk1m pk2m pk3m using this filter" << endl;
+		if (imuo && !imup)
+			cal << "# # Muon search optimization was enabled (filtered by charge). There are six additional columns with ch1m ch2m ch3m pk1m pk2m pk3m using this filter" << endl;
+
 		if (itrg)
 			cal << "# # An offline trigger of " << trg_level[0] << " " << trg_level[1] << " " << trg_level[2] << " ADC above baseline has been used for each channel respectively." << endl;
 		if (iqtr)
@@ -884,14 +941,24 @@ int main (int argc, char *argv[])
 
 	// Filling calibration histograms
 	for (int j=0; j<CHRGMAX; j++) {
-		for (int i=0; i<CHANNELS; i++)  {
+		for (int i=0; i<CHANNELS; i++)
 			cal << Charge[i][j] << " ";
-		}
-		if (j<ADCMAX) for (int i=0; i<CHANNELS; i++)
+		if (j<ADCMAX)
+			for (int i=0; i<CHANNELS; i++)
 				cal << Peak[i][j] << " ";
+		else 
+			if (imuo)
+				cal << "0 0 0 "; // placeholders
+
+		if (imuo) 
+			for (int i=0; i<CHANNELS; i++)
+				cal << MCharge[i][j] << " ";
+		if (imuo)
+			if (j<ADCMAX)
+				for (int i=0; i<CHANNELS; i++)
+					cal << MPeak[i][j] << " ";
 		cal << endl;
 	}
-
 	//
 	// Channel validation code
 	//